当前位置:首页分享树莓派搭建nas指南

树莓派搭建nas指南

最近在研究流媒体服务器,想实现无论是在客厅还是卧室、无论是躺着还是坐着都可以快乐追番,首先微软自带的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线 、显示器(接树莓派,做输入输出)

 

装系统

树莓派官网下载地址: Raspberry Pi Imager

选择自己电脑对应的系统版本下载就好了,我这里下载的是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更好用,后面再研究研究。

至此,就算折腾完毕了。

 

 

个人定制

因为我找新番的论坛,最外层页面只有磁力链接的特征码,我设想的使用方式是:

  1. 用PC上论坛收集特征码,将特征码写到共享盘上某个文本文件上

  2. 远程VNC树莓派,运行脚本,自动拼接磁力链接,并拷贝到剪切板

  3. 打开qbittorrent,新建(会自动读取剪切板的内容),开始下载

  4. 下载完后,根据某定义的规则,将视频分目录进行归档存放

于是我规划了一下文件目录:

# 创建下载辅助目录
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

 

文章来源于B站,如有侵权,联系删除

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧