最近在研究流媒体服务器,想实现无论是在客厅还是卧室、无论是躺着还是坐着都可以快乐追番,首先微软自带的windows media player很好用,基本上电视都支持dlna,同一局域网就可以远程播放多媒体文件,而平板、手机上都是有相关app支持dlna的,我个人实验下来还不错的移动端app如下:
iOS: infuse
Android: BubbleUPnP + MXplayer
再者大多播放器也支持smb协议,可以用电脑来共享文件。也就是说,只要有一台24h运行、设置好相关服务的电脑,就可以满足我的需求。
但全天开着电脑,很不环保,完全可以用树莓派来替代。(今天实战了一下,播放1080P视频非常流畅,包括拖动进度条、切换视频等)
有网友很好奇,怎么弄?成本是多少?那我就把搭建材料、过程都分享出来。
材料
1T移动硬盘:¥399 (京东西数自营店价格。可以买一块2T的机械硬盘+硬盘盒,价格和这差不多)
树莓派4b: ¥579 (淘宝某店4G主板基础套餐价格,带TF卡、读卡器、micro-HDMI线等配件)
P.S.后面了解到一些入门的nas好像也就不到一千块,如果你不想折腾其实完全可以直接买一个真正的nas。
以上两个东西是我很早之前就买了,一直在吃灰,今天才拿出来废物利用使用。价格也是现查的,之前买的时候貌似比这还便宜吧。。。
所以只要有一个硬盘(支持usb3.0),有一块树莓派4b的板子(我的是4G内存,你也可以用性能更好的8G),就可以开始制作了。
其他需要的一些东东:
-
一台电脑(我只有windows,后面都用windows举例)
-
一个路由器(电脑、树莓派都接入该路由器的wifi)
-
TF卡,不用太大,16G就可以了,拿来做树莓派系统绰绰有余
-
读卡器
-
键盘、鼠标、micro-HDMI线 、显示器(接树莓派,做输入输出)
装系统
树莓派官网下载地址:
选择自己电脑对应的系统版本下载就好了,我这里下载的是windows版的Raspberry Pi Imager。
拿出TF卡,使用读卡器插到电脑上,如下图,依次选择树莓派64位系统(注意,不要选Lite,Lite不带图形界面),TF卡,点击“烧录”按钮。
烧录完成后,拔出读卡器,将TF卡插到树莓派主板上,通电等待启动即可。
因为烧录的图形化界面的系统,这里最好给树莓派接上显示器、鼠标、键盘,根据显示,依次设置用户名、密码、wifi等。
网上关于树莓派怎么安装,有很多教程,有不清楚的可以直接问搜索引擎。
远程
能正常进入系统后,可以按照如下所示将vnc、ssh服务都打开
vnc 支持远程图形界面访问
ssh 支持远程命令行访问
这意味着,之后将无需显示器、鼠标、键盘这些设备,也能通过其他电脑对树莓派进行控制。
当然前提是路由器分配给树莓派的内网ip要可知(最好固定下来),可通过命令行输入ip a
进行查询。
网上关于vnc、ssh的教程有很多,这里不展开说了。
安装samba
smb是一个比较通用的资源共享协议,windows天然支持,树莓派则需要安装samba:
# 更新apt
sudo apt-get update
# 安装vim
sudo apt-get install vim
# 安装samba
sudo apt-get install samba
此时可以接入硬盘,树莓派会自动挂载在/media/pi
下面,我这里路径为/media/pi/Elements
对samba进行配置
sudo vim /etc/samba/smb.conf
在文件的末尾追加如下内容,将整个media目录进行共享:
[myshare]
path = /media
writeable=Yes
create mask=0777
directory mask=0777
public=yes
browseable=yes
设置smb用户密码:
sudo smbpasswd -a pi
# pi为用户名,之后按照提示,依次设定密码
重启服务:
sudo systemctl restart smbd
重启完成后,便可远程访问硬盘上的资源。
以windows举例,只需在“映射网络驱动器”中输入\\${树莓派ip}\myshare
,然后使用上面设置的smb用户密码登入即可:
安装minidlna
我家电视是不支持smb的(可能支持,只是我不会用),为了能直接播放硬盘上的视频,还需要给树莓派安装minidlna:
sudo apt-get install minidlna
在移动硬盘上建立视频文件夹,该文件夹后续用来存放视频:
mkdir -p /media/pi/Elements/nas/video
修改minidlna配置:
sudo vim /etc/minidlna.conf
主要是media_dir
这一行, 将视频目录指向刚创建的文件夹:
media_dir=V,/media/pi/Elements/nas/video
重启minidlna服务
sudo service minidlna start
可以往/media/pi/Elements/nas/video
目录拷一个mp4文件上去,用电视测试一下,一般是可以正常播放了的。
安装下载器
对于下载器,我没怎么研究,目前只用过windows上的qbittorrent
,感觉还不错,给树莓派也装了一个:
sudo apt-get install qbittorrent
长这样(文件丢失是因为我暴力移动了下载文件的位置):
后续打算利用树莓派进行BT下载,下载目录为/media/pi/Elements/nas/video/new/
。
也许有其他命令行的下载器,比qbittorrent更好用,后面再研究研究。
至此,就算折腾完毕了。
个人定制
因为我找新番的论坛,最外层页面只有磁力链接的特征码,我设想的使用方式是:
-
用PC上论坛收集特征码,将特征码写到共享盘上某个文本文件上
-
远程VNC树莓派,运行脚本,自动拼接磁力链接,并拷贝到剪切板
-
打开qbittorrent,新建(会自动读取剪切板的内容),开始下载
-
下载完后,根据某定义的规则,将视频分目录进行归档存放
于是我规划了一下文件目录:
# 创建下载辅助目录
mkdir -p /media/pi/Elements/nas/qbit
cd /media/pi/Elements/nas/qbit
# 创建特征码收集文件
touch hash.txt
# 创建视频分类规则文件
touch dir.json
# 创建脚本文件夹,内存放有文件qbit_tool.py
mkdir -p /tools
touch /tools/qbit_tool.py
vim /tools/qbit_tool.py # 将后面的脚本内容拷贝进该文件即可
特征码文件长这样:
分类规则文件是个json文件,由n对k-v组成,key是视频分类的目录,value是一组可能出现在视频文件名中的字符串(有的字幕组会用罗马拼音,有的字幕组直接使用汉字),这个文件具体内容需要自己进行维护,如下:
{
“不死少女杀人笑剧”: [
“Undead Girl Murder Farce”
],
“无职转生S2”: [
“Mushoku Tensei II”
],
“夫妻交欢”: [
“Fuufu Koukan”
]
}
python脚本内容如下:
#!/usr/bin/env python
import json
import os
import shutil
import sys
import pandas.io.clipboard as cb
MAGNET_PREFIX = “magnet:?xt=urn:btih:”
# 特征码文件
HASH_FILE = “/media/pi/Elements/nas/qbit/hash.txt”
# 完整磁力链接生成位置
RESULT_FILE = “/media/pi/Elements/nas/qbit/result/result.txt”
# 文件名与目录规则映射文件
JSON_FILE = “/media/pi/Elements/nas/qbit/dir.json”
# 下载目录
NEW_VIDEO_PATH = “/media/pi/Elements/nas/video/new”
# 定义换行符
LF = “\n”
CRLF = “\r\n”
# 将新下载的视频按照规则归档到指定文件夹
def archive_new_video(new_path, json_file):
home_path = os.path.split(new_path)[0]
# 列出父目录下所有文件
videos = os.listdir(new_path)
with open(json_file, encoding=”utf-8″) as f:
dir_relation = json.load(f)
for video in videos:
for k, v in dir_relation.items():
for name in v:
if name in video:
target_dir = os.path.join(home_path, k)
if not os.path.exists(target_dir):
os.makedirs(target_dir)
target_path = os.path.join(target_dir, video)
ori_path = os.path.join(new_path, video)
shutil.move(ori_path, target_path)
print(“move [%s] –> [%s]” % (ori_path, target_path))
# 删除文件
def del_path(path):
if os.path.exists(path):
print(“now remove last result file: ” + path)
os.remove(path)
# 生成结果文件
def write_txt_result(result, result_path):
path_list = os.path.split(result_path)
parent_path = path_list[0]
if not os.path.exists(parent_path):
os.makedirs(parent_path)
with open(result_path, ‘a’, encoding=’utf-8′) as f:
f.write(result)
# 拼接完整的磁力链接
def gen_full_magnet(ori_path, result_path, prefix):
# 清理上次产生的结果文件
# del_path(result_path)
# 读取文件
with open(ori_path, ‘r’) as f:
# 先把所有内容以行为单位读取到内存里
lines = f.readlines()
# 初始化结果文本
result = “”
# 循环每一行字符串
for line in lines:
# 对该行字符串做替换,并与结果进行拼接
result = result + prefix + line
# 循环完毕加一个换行符,便于多文件的结果显示
# result = result + LF
# 将结果写到文件中
# write_txt_result(result, result_path)
#复制到剪切板
cb.copy(result)
# 打印结果
print(result)
# 脚本入口
if __name__ == ‘__main__’:
arg = sys.argv[1]
if arg == “link”:
gen_full_magnet(HASH_FILE, RESULT_FILE, MAGNET_PREFIX)
elif arg == “archive”:
archive_new_video(NEW_VIDEO_PATH, JSON_FILE)
else:
print(“input error.”)
input(“press any button.”)
实际使用时,需要先安装一个依赖包:
pip install pandas
设置别名
alias qbit=”python /media/pi/Elements/nas/qbit/tools/qbit_tool.py”
生成磁力链接
qbit link
下载完成后进行归档
qbit archive