├── 1.png ├── 2.png ├── 3.png ├── README.md └── main.py /1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtxt19931207/emby-alist/HEAD/1.png -------------------------------------------------------------------------------- /2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtxt19931207/emby-alist/HEAD/2.png -------------------------------------------------------------------------------- /3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtxt19931207/emby-alist/HEAD/3.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # emby-alist 2 | emby挂载alist媒体库 3 | 4 | 5 | 一、前提 6 | 配置好的Alist服务端和Emby服务端 7 | Emby的strm文件应用参考:https://emby.media/support/articles/Strm-Files.html 8 | 9 | 10 | 二、总体思路 11 | 我们需要获取Alist服务器上指定目录下的视频文件名称、路径、播放链接,然后在Emby媒体库路径下生成相同的路径、文件名(后缀改为strm,内容为播放链接)的文本文件,同时也可以把字幕文件一起复制过来。效果如下图: 12 | ![image](https://github.com/xtxt19931207/emby-alist/blob/main/1.png) 13 | Alist文件 14 | ![image](https://github.com/xtxt19931207/emby-alist/blob/main/2.png) 15 | 本地文件(Emby媒体库) 16 | 17 | 18 | 三、优势和效果 19 | 这种方案最大的优势就是节省本地空间,而且比之前挂载的方法稳定,因为读取的就是本地文件,不会存在反复扫描的情况,设备重启后也不用担心掉盘或者需要重启Emby才能识别媒体库。 20 | 两千多个视频文件,空间占用只有几百KB: 21 | ![image](https://github.com/xtxt19931207/emby-alist/blob/main/3.png) 22 | 23 | 24 | 四、后续 25 | 这种方法虽然简便,但是每次更新都需要在电脑上点下程序,后续的的想法是能做一个OpenWrt下的程序,或者打包成Docker镜像运行,有想法的朋友也可以帮忙做一下。 26 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from webdav3.client import Client 2 | import os,time,requests 3 | 4 | def list_files(webdav_url, username, password): 5 | # 创建WebDAV客户端 6 | options = { 7 | 'webdav_hostname': webdav_url, 8 | 'webdav_login': username, 9 | 'webdav_password': password 10 | } 11 | 12 | 13 | client = Client(options) 14 | mulu=[] 15 | wenjian=[] 16 | q=1 17 | while q<15: 18 | try: 19 | # 获取WebDAV服务器上的文件列表 20 | files = client.list() 21 | except: 22 | q+=1 23 | print('连接失败,1秒后重试...') 24 | time.sleep(1) 25 | else: 26 | if q>1: 27 | print('重连成功...') 28 | break 29 | 30 | for file in files[1:]: 31 | if file[-1]=='/': 32 | mulu.append(file) 33 | else: 34 | wenjian.append(file) 35 | return mulu,wenjian 36 | 37 | 38 | # 输入WebDAV地址、用户名和密码 39 | webdav_url = 'yourdomain:port/dav/guest/阿里云盘alist/电影/'#alist webdav 地址 40 | save_mulu='Z:/OpenWrt/mnt/mmcblk2p4/TV/电影/'#输出路径 41 | username = 'yourusername'#用户名 42 | password = 'yourpassword'#密码 43 | 44 | # 调用函数获取文件列表并保存到本地 45 | 46 | l_0=list_files(webdav_url, username, password)[0] 47 | l_1=list_files(webdav_url, username, password)[1] 48 | 49 | url_1=[webdav_url] 50 | url_2=[] 51 | url_3=[] 52 | wenjian_1=[webdav_url + str(k) for k in l_1] 53 | wenjian_2=[] 54 | wenjian_3=[] 55 | if l_0 !=[]: 56 | for u in l_0: 57 | url_2.append(webdav_url+u) 58 | wenjian_2+=[webdav_url+u+str(i) for i in list_files(webdav_url+u, username, password)[1]] 59 | for x in url_2: 60 | l_x=list_files(x, username, password)[0] 61 | if l_x !=[]: 62 | for y in l_x: 63 | url_3.append(x+y) 64 | wenjian_3+=[x+y+str(j) for j in list_files(x+y, username, password)[1]] 65 | url=url_1+url_2+url_3 66 | wenjian_all=wenjian_1+wenjian_2+wenjian_3 67 | #print(url) 68 | # for a in url: 69 | # os.makedirs(os.path.dirname(a.replace(webdav_url,'')),exist_ok=True) 70 | 71 | for b in wenjian_all: 72 | if b[-3:].upper() in ['MP4','MKV','FLV','AVI']: 73 | if not os.path.exists(save_mulu+b.replace(webdav_url,'')[:-3]+'strm' ): 74 | print('正在处理:'+b.replace(webdav_url,'')) 75 | try: 76 | os.makedirs(os.path.dirname(save_mulu+b.replace(webdav_url,'')[:-3]+'strm'),exist_ok=True) 77 | with open(save_mulu+b.replace(webdav_url,'')[:-3]+'strm',"w",encoding='utf-8') as f: 78 | f.write(b.replace('/dav','/d')) 79 | except: 80 | try: 81 | os.makedirs(os.path.dirname(save_mulu+b.replace(webdav_url,'').replace(':','.')[:-3]+'strm'),exist_ok=True) 82 | with open(save_mulu+b.replace(webdav_url,'').replace(':','.')[:-3]+'strm',"w",encoding='utf-8') as f: 83 | f.write(b.replace('/dav','/d')) 84 | except: 85 | print(b.replace(webdav_url,'')+'处理失败,文件名包含特殊符号,建议重命名!') 86 | elif b[-3:].upper() in ['ASS','SRT','SSA']: 87 | if not os.path.exists(save_mulu+b.replace(webdav_url,'') ): 88 | p=1 89 | while p<10: 90 | try: 91 | print('正在下载:'+save_mulu+b.replace(webdav_url,'')) 92 | r=requests.get(b.replace('/dav','/d')) 93 | os.makedirs(os.path.dirname(save_mulu+b.replace(webdav_url,'')),exist_ok=True) 94 | with open (save_mulu+b.replace(webdav_url,''),'wb')as f: 95 | f.write(r.content) 96 | f.close 97 | #wget.download(b.replace('/dav','/d'),save_mulu+b.replace(webdav_url,'')) 98 | except: 99 | p+=1 100 | print('下载失败,1秒后重试...') 101 | time.sleep(1) 102 | else: 103 | if p>1: 104 | print('重新下载成功!') 105 | break 106 | 107 | print('处理完毕!') 108 | input('按任意键退出...') 109 | --------------------------------------------------------------------------------