Openlist做中转,利用strm挂载115网盘并接入emby
文章转自:纯小白也能实现的emby+Openlist+strm+302
相关Github项目:
利用 Openlist 作为媒体文件的“索引者”和“指路人”。Openlist 能够接入并管理多种支持302重定向的网盘或对象存储服务。当 Emby 需要播放一个媒体文件时,它实际上是读取一个本地的 .strm
文件。这个 .strm
文件并不包含媒体数据本身,而是包含一个指向 Openlist 的特定路径URL。
当 Emby 访问这个 Openlist URL 时,Openlist 会智能地返回一个302重定向指令,将 Emby 的播放请求直接导向存储在云端网盘上的原始媒体文件地址。这样一来,Emby 便可以直接从源头(即你的网盘)串流播放媒体内容,全程无需文件在本地服务器作实际中转或完整下载。
核心特点与优势拓展
轻量化部署与低资源占用:
- 由于不再需要
cd2
或rclone
进行复杂的挂载操作,服务器端的配置更为简洁,CPU和内存资源的占用也显著降低。 - 避免了因挂载工具不稳定或API限制可能引发的各种问题。
- 由于不再需要
无需本地磁盘空间:
- 媒体文件直接存储于云端,服务器本地仅需存储
.strm
代理文件(体积极小)和 Emby 的元数据。这对于存储空间有限的服务器或NAS设备尤为友好。
- 媒体文件直接存储于云端,服务器本地仅需存储
提升流媒体效率与直接性:
- 通过302重定向,Emby 直接与最终的媒体文件URL进行通信,减少了数据传输的中间环节,理论上可以带来更直接、更快速的流媒体播放体验。
广泛的网盘兼容性:
- “理论上支持302的网盘都能用这个方法”。Openlist 本身支持众多主流和非主流的云存储服务。只要这些服务允许通过API或其他方式获取到文件的直接链接,并且 Openlist 能够配置生成指向这些直链的302重定向,那么这套方案就具备可行性
简化维护:
- 减少了需要维护的组件(如挂载工具),使得整个系统的维护成本和出错几率有所下降。
实现流程概述
- Openlist 配置:这就不说了,一键轻松搞定
- .strm 文件生成:为网盘中的每一个影音文件,在 Emby 的媒体库对应位置创建一个
.strm
文件。该文件的内容即为指向 Openlist 中对应文件路径的URL(例如http://<alist_ip>:<alist_port>/dav/<网盘路径>/<文件名>
或 Openlist 提供的其他直接访问链接格式,最终由 Openlist 处理并302重定向到真实文件链接)。这里我们通过autofilm来实现,因为原作者的仓库的版本对于Openlist最新版好像除了一些bug,然后我翻阅issues找到了解决办法,所以重新制作了一个docker镜像 - Emby 媒体库设置:在 Emby 中添加媒体库,并将媒体库的文件夹路径指向存放
.strm
文件的本地目录。Emby 会扫描这些.strm
文件,并通过文件名刮削获取元数据,将其识别为可播放的媒体。 - Emby 302设置: 这里我们通过同一作者的另一个项目mediawarp实现,由于对于最新版的emby支持不太好,同样翻阅issues重做了镜像
- 播放体验:用户在 Emby 客户端选择播放影片时,Emby 读取
.strm
文件中的 Openlist URL,请求该URL,Openlist 返回302重定向到网盘文件的真实URL,Emby 最终从该真实URL加载并播放视频流。
第一步:创建挂载目录和设置权限
为了确保我们的媒体套件能够正常运行,第一步是创建一些必要的目录,这些目录将用于挂载到 Docker 镜像中
创建目录
我们需要为 Emby 的配置、STRM 文件(电影和剧集)以及 AutoFilm和MwdiaWarp 的配置创建相应的目录。请执行以下命令:
sudo mkdir -p /opt/media_suite/emby/config
sudo mkdir -p /opt/media_suite/strm_files/movies # 存放电影 STRM 文件
sudo mkdir -p /opt/media_suite/strm_files/tvshows # 存放剧集 STRM 文件
sudo mkdir -p /opt/media_suite/autofilm/config # AutoFilm 需要配置文件
sudo mkdir -p /opt/media_suite/mediawarp/config # mediawarp 需要配置文件
接下来,我们需要为这些新创建的目录设置合适的权限,以确保后续运行容器的用户(或其 PUID/PGID)拥有读写这些目录的权限。
# 例如,设置 PUID=1000, PGID=1000 (请根据您的系统用户实际情况调整)
sudo chown -R 1000:1000 /opt/media_suite
root用户可以忽略了
openlist挂载115网盘到目录
115网盘里刮削推荐命名规范
电视剧、动漫、综艺:使用“剧名/季/集”的形式。例如:
-
白砂的水族馆/Season 1/S1E01.mp4
复杂命名
电影:以完整名字开头,后面加上相关信息。如果有同名电影,务必加上发行日期。
- 例如:
The.Irishman.爱尔兰人.2019.1080p.x264.mp4
- 例如:
电视剧:分集文件名以剧名开头,后面跟上季和集的信息。
- 例如:
Shameless.无耻之徒.S01E01.1080p.AMZN.WEB-DL.mkv
- 例如:
花絮、特别篇:季数设为0,指定集数。
- 例如:
Shameless.无耻之徒.S00E01.SneakPeek.1080p.AMZN.mkv
- 例如:
第二步:创建 Docker Compose 配置文件
接下来,我们将创建一个 docker-compose.yml
文件来定义和管理我们的媒体服务,包括 Emby、MediaWarp 和 AutoFilm。通过 Docker Compose,我们可以方便地一次性启动、停止和管理这些相互关联的容器。
重要提示: 以下配置将 Emby、MediaWarp 和 AutoFilm 整合在同一个 docker-compose.yml
文件中,假定它们运行在同一台服务器上。如果你计划将这些服务部署在不同的机器上,你需要为它们分别创建独立的配置文件或调整网络设置。
创建 docker-compose.yml
文件
在之前创建的 /opt/media_suite/
目录下,创建一个名为 docker-compose.yml
的文件,并将以下内容复制进去:
路径:/opt/media_suite/docker-compose.yml
services:
mediawarp:
image: naxbr/mediawarp:latest # 这里是我修改过后的镜像,也可以用没修改的,就在上面原作者的仓库
container_name: mediawarp
restart: unless-stopped
ports:
- "8080:8080" # 将宿主机的 8080 端口映射到 MediaWarp 容器的 8080 端口 (避免和常用端口冲突,可以自己改)
volumes:
- /opt/media_suite/mediawarp/config:/config # MediaWarp 配置文件持久化,挂载目录,根据你前面创建的来
networks:
- media_network # 使用自定义网络确保容器间通信
# (可选) 如果 akimio/mediawarp 支持 PUID/PGID, 建议添加以确保权限一致性
# environment:
# - PUID=1000 # !!! 修改为你宿主机的用户 ID
# - PGID=1000 # !!! 修改为你宿主机的组 ID
# - TZ=Asia/Shanghai # !!! 修改为你的时区
emby:
image: amilys/embyserver:4.9.0.46 # 使用官方 Emby 镜像或者开心版
container_name: emby
restart: unless-stopped
ports:
- "8096:8096" # Emby Web UI (HTTP)
- "8920:8920" # Emby Web UI (HTTPS, 如果启用)
# - "1900:1900/udp" # DLNA 服务发现 (可选)
# - "7359:7359/udp" # Emby 设备发现 (可选)
environment:
- PUID=0 # !!! 警告:使用 root 权限 (PUID=0, PGID=0) 运行容器。请务必修改为你宿主机上用于管理媒体文件的非 root 用户的 ID (通常为 1000)。用 `id -u <username>` 和 `id -g <username>` 命令查看。
- PGID=0 # !!! 警告:同上,修改为对应的组 ID。
- TZ=Asia/Shanghai # !!! 修改为你的时区,例如 "Asia/Shanghai" 或 "America/New_York"
volumes:
- /opt/media_suite/emby/config:/config # Emby 配置文件持久化
# --- 关键:挂载存放 STRM 文件的宿主机目录 ---
- /opt/media_suite/strm_files/movies:/strm_media/movies # 将宿主机的电影 STRM 目录映射到容器内的 /strm_media/movies
- /opt/media_suite/strm_files/tvshows:/strm_media/tvshows # 将宿主机的剧集 STRM 目录映射到容器内的 /strm_media/tvshows
# - /path/to/your/actual_media/movies:/data/movies # (可选) 如果 Emby 也直接管理原始媒体文件,可以挂载实际媒体库
# - /path/to/your/actual_media/tvshows:/data/tvshows # (可选) 同上
# - /path/to/your/transcode/folder:/transcode # (可选) 独立挂载转码目录,可提高性能或管理空间
# (可选) 如果你有 Intel GPU 并想用 QSV 硬解,请取消以下注释并确保驱动已正确安装:
# devices:
# - /dev/dri:/dev/dri
networks:
- media_network
autofilm:
image: naxbr/autofilm:1.3.2 # 这里用的我修改过后的镜像
container_name: autofilm
restart: unless-stopped
environment:
- TZ=Asia/Shanghai # !!! 设置为你的时区
# !!! 关键:确保 AutoFilm 使用与 Emby 相同的 PUID/PGID !!!
# 这确保 AutoFilm 创建的 STRM 文件具有正确的权限,以便 Emby 可以读取它们。
# 如果 akimio/autofilm 镜像支持 PUID/PGID 环境变量,请务必设置。
# 否则,您可能需要调整 AutoFilm 容器内的权限或 strm_files 目录的宿主机权限。
- PUID=0 # !!! 警告:同 Emby 配置,请修改为非 root 用户的 PUID。
- PGID=0 # !!! 警告:同 Emby 配置,请修改为非 root 用户的 PGID。
volumes:
# 挂载配置文件目录
- /opt/media_suite/autofilm/config:/config
# 挂载 STRM 输出目录 (必须与 Emby 挂载的宿主机 STRM 目录 /opt/media_suite/strm_files 对应)
# AutoFilm 将在此处生成 .strm 文件,Emby 将从这里读取它们。
- /opt/media_suite/strm_files:/media # AutoFilm 容器内访问 STRM 文件的路径
# (可选) 挂载日志目录
- /opt/media_suite/autofilm/logs:/logs
networks:
- media_network # 加入同一个网络,以便与 MediaWarp (如果需要) 和 Emby 通信
networks:
media_network:
第三步:配置 MediaWarp
MediaWarp 是一个反向代理和媒体处理工具,它可以与 Emby(或 Jellyfin)配合使用,以实现诸如 STRM 文件重定向、前端美化等功能。现在我们将创建 MediaWarp 的配置文件。
创建 config.yml
文件
在你之前为 MediaWarp 创建的配置目录下,创建一个名为 config.yml
的文件,并将以下内容复制进去:
路径:/opt/media_suite/mediawarp/config/config.yml
# /opt/media_suite/mediawarp/config/config.yml
Port: 8080 # MediaWarp 自身监听的端口 (在 Docker Compose 中已映射到宿主机的 12587 端口)
MediaServer: # 媒体服务器相关设置
Type: Emby # 媒体服务器类型,此处为 Emby (可选:Emby, Jellyfin)
ADDR: http://emby:8096 # 媒体服务器地址。注意:这里使用的是 Docker 网络内部的服务名 "emby" 和其容器端口 "8096"你得都布置在同一台服务器才能这么填。
AUTH: xxxxxxxxxxxxxxx # 媒体服务器的 API Key。!!! 请务必替换为您 Emby 服务器的有效 API Key !!!
Logger: # 日志设定
AccessLogger: # 访问日志设定
Console: True # 是否将访问日志输出到终端中
File: False # 是否将访问日志记录到文件中 (可按需开启)
ServiceLogger: # 服务日志设定
Console: True # 是否将服务日志输出到终端中
File: True # 是否将服务日志记录到文件中 (建议开启,方便排错)
Level: DEBUG # 日志级别,DEBUG 提供最详细信息,适合排错阶段。生产环境可考虑 INFO 或 WARN。
Web: # Web 页面修改相关设置
Enable: True # 是否启用 Web 页面修改功能 (总开关)
Custom: True # 是否加载自定义静态资源 (通常用于加载 JS/CSS 脚本)
Index: False # 是否从 custom 目录读取 index.html 文件 (如果 True,会替换 Emby 的主页,记得填否,我就倒这很久.....)
Head: | # 在 Emby 页面的 <head> 标签内插入自定义 HTML/JS/CSS
<script src="/MediaWarp/custom/emby-front-end-mod/actor-plus.js"></script>
<script src="/MediaWarp/custom/emby-front-end-mod/emby-swiper.js"></script>
<script src="/MediaWarp/custom/emby-front-end-mod/emby-tab.js"></script>
<script src="/MediaWarp/custom/emby-front-end-mod/fanart-show.js"></script>
<script src="/MediaWarp/custom/emby-front-end-mod/playbackRate.js"></script>
# 注意:以上脚本需要自行准备并放置到 MediaWarp 容器内 /app/custom/emby-front-end-mod/ 目录下
# 或者通过 Docker Volume 挂载到 MediaWarp 容器的相应位置。
# 例如,在 docker-compose.yml 中为 mediawarp 服务添加 volumes:
# - /path/to/your/emby-front-end-mod:/app/custom/emby-front-end-mod
Crx: True # 是否启用 CRX 美化相关功能,这个好像不起作用,建议用开心版自带美化,在ext.sh里面填入媒体库id就行了
ActorPlus: True # 过滤没有头像的演员和制作人员 (需要对应 JS 支持)
FanartShow: False # 是否在详情页显示同人图 (Fanart) (需要对应 JS 支持)
ExternalPlayerUrl: True # 是否为 Emby 开启外置播放器链接功能 (例如调用 PotPlayer, VLC 等)
Danmaku: True # 是否启用 Web 端弹幕功能 (需要弹幕源和前端支持)
VideoTogether: True # 是否启用共同观影功能 (需要相应服务或脚本支持)
ClientFilter: # 客户端过滤器 (用于控制哪些客户端的请求会被 MediaWarp 处理)
Enable: False # 当前设置为 False,表示禁用过滤器,所有客户端请求都会经过 MediaWarp
Mode: BlackList # 如果启用,模式可以是 BlackList (黑名单) 或 WhiteList (白名单)
ClientList: # 名单列表 (仅在 Enable: True 时生效)
- Fileball
- Infuse
# 当 Mode 为 BlackList 时,列表中的客户端请求将被忽略 (不通过 MediaWarp 处理)
# 当 Mode 为 WhiteList 时,只有列表中的客户端请求会被处理
HTTPStrm: # HTTP STRM 文件处理相关配置
Enable: True # **关键:必须开启此功能,MediaWarp 才能处理 .strm 文件中的 HTTP 链接**
TransCode: False # **关键:设置为 False。这会强制 Emby 认为 STRM 指向的是直接播放链接,从而避免不必要的转码请求。**
# MediaWarp 会将 STRM 文件内容中的 URL 返回给客户端播放。
PrefixList: # Emby 服务器中 STRM 文件所在的媒体库路径前缀。
# !!! 这些路径必须与 Emby 容器内看到的路径完全一致 !!!
# (即 Docker Compose 文件中为 Emby 服务 volumes 部分挂载的 STRM 目录的容器内路径)
- /strm_media/movies # 处理位于 Emby 容器内 /strm_media/movies/ 目录下的 STRM 文件
- /strm_media/tvshows # 处理位于 Emby 容器内 /strm_media/tvshows/ 目录下的 STRM 文件
# 示例:
# 如果你的 Docker Compose 中 Emby 的 volumes 是:
# - /opt/media_suite/strm_files/movies:/media/strm_movies
# 那么这里的 PrefixList 就应该是:
# - /media/strm_movies
#
# 如果 AutoFilm 生成的 .strm 文件在 Emby 中位于不同的媒体库路径下,也需要在这里添加对应的前缀。
# 例如,如果 AutoFilm 将 STRM 文件输出到宿主机的 `/opt/media_suite/strm_files/anime`
# 并且您在 Emby 中添加了一个媒体库,其文件夹指向容器内的 `/strm_media/anime`
# (通过 volumes: - /opt/media_suite/strm_files/anime:/strm_media/anime)
# 那么这里就需要添加:
# - /strm_media/anime
# --- AlistStrm 模块已禁用 ---
AlistStrm: # Alist STRM 文件处理相关配置 (用于处理指向 Alist 存储的 STRM 文件)
Enable: False # **已设置为 False,表示禁用 AlistStrm 模块。如果您的 STRM 文件内容是普通 HTTP(S) URL,则不需要此模块。**
TransCode: False # (此设置在 Enable: False 时无效)
RawURL: False # (此设置在 Enable: False 时无效)
List: # (此部分在 Enable: False 时无效)
- ADDR: alist地址
Token: alsit的token
PrefixList:
- /strm_media/movies
- /strm_media/tvshows
Subtitle: # 字幕相关设置 (主要针对 Emby)
Enable: True # 是否启用字幕处理功能
SRT2ASS: True # 是否将 SRT 字幕动态转换为 ASS 字幕 (ASS 格式支持更丰富的样式)
ASSStyle: # SRT 转换为 ASS 时使用的默认样式定义
# 格式: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
- "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding"
- "Style: Default,楷体,20,&H03FFFFFF,&H00FFFFFF,&H00000000,&H02000000,-1,0,0,0,100,100,0,0,1,1,0,2,10,10,10,1"
# 可以根据需要修改字体、大小、颜色等样式。
第四步:配置 AutoFilm
AutoFilm 是一个工具,它可以扫描你的 Openlist(或其他支持的源),并根据其中的媒体文件自动生成 .strm
文件。这些 .strm
文件随后可以被 Emby(通过 MediaWarp)识别和播放。
创建 config.yaml
文件
在之前为 AutoFilm 创建的配置目录下,创建一个名为 config.yaml
(或者 config.yml
,两者皆可) 的文件,并将以下内容复制进去:
路径:/opt/media_suite/autofilm/config/config.yaml
Settings:
DEV: False # 是否启用开发者模式,通常保持 False
Alist2StrmList: # 定义从 Alist 生成 STRM 文件的任务列表
# --- 任务 1: 处理电影 ---
- id: Movies_Scan # 任务的唯一标识符,自定义
cron: "0 0 7 * *" # 内部 cron 表达式:每天早上 7:00 执行。因为启动容器的时候不会直接执行strm文件生成,会等到了时间再执行,所以你可以先设置一个短一点的时间,测试是否正常生成
# AutoFilm 将使用其内置的调度器。
url: "http://1.1.1.1:5244" # !!! 关键:替换为您的 Alist 服务地址 !!!
# username: admin # 如果您的 Alist 使用用户名/密码认证,请取消注释并填写
# password: adminadmin # 如果您的 Alist 使用用户名/密码认证,请取消注释并填写
token: "xxxxxxxxxxxxxxxxxxx" # !!! 关键:替换为您的 Alist API Token !!! (如果使用 Token 认证)
source_dir: "/Thunderx/TV" # !!! 关键:您在 Alist 中实际存放电影文件的路径 !!!
target_dir: "/media/movies" # *** 容器内 STRM 文件输出路径 -> /media/movies ***
# 对应宿主机的 /opt/media_suite/strm_files/movies。
flatten_mode: False # 通常为 False 以保留电影文件夹结构。
subtitle: False # 是否尝试从 Alist 下载字幕文件
image: False # 是否尝试从 Alist 下载图片文件
nfo: False # 是否尝试从 Alist 下载 .nfo 元数据文件
mode: "AlistURL" # *** 核心设置:STRM 文件内容将是 Alist 的直接访问 URL (不含 /d/ 路径) ***
# 例如:http://alist_url/path/to/file.mkv (可能需要 Alist 端配置支持直接访问或签名)
# MediaWarp 可能仍需处理这些 URL 以确保播放兼容性。
overwrite: False # 是否覆盖已存在的 .strm 文件。
sync_server: True # 是否同步服务器:如果 Alist 中的源文件被删除,则自动删除对应的 .strm 文件。
# sync_ignore: '\.(nfo|jpg)$' # sync_server 时忽略的文件类型 (正则表达式)
# other_ext: # 定义除了视频文件外,还希望为其创建 .strm 文件的其他文件后缀名
max_workers: 50 # 处理 Alist 目录列表时的最大并发数
max_downloaders: 5 # 下载文件(如字幕、图片,如果开启)时的最大并发数。
wait_time: 0 # 每次扫描任务完成后等待的时间(秒)。
# --- 任务 2: 处理剧集 ---
- id: TVShows_Scan # 任务的唯一标识符,自定义
cron: "0 20 * * *" # 内部 cron 表达式:每天晚上 20:00 执行。
url: "http://1.1.1.1:5244" # !!! 关键:替换为您的 Alist 服务地址 (与电影任务使用相同的 Alist 实例) !!!
# username: admin
# password: adminadmin
token: "xxxxxxxxxxxxxxxxxxx" # !!! 关键:替换为您的 Alist API Token (与电影任务使用相同的 Token) !!!
source_dir: "/tianyi/tvshows" # !!! 关键:您在 Alist 中实际存放剧集文件的路径 !!!
target_dir: "/media/tvshows" # *** 容器内 STRM 文件输出路径 -> /media/tvshows ***
# 对应宿主机的 /opt/media_suite/strm_files/tvshows
flatten_mode: False # 对于剧集,通常设置为 False 以保留季和集的目录结构
subtitle: False
image: False
nfo: False
mode: "AlistURL" # *** 核心设置:模式为 "AlistURL" ***
# 可选项:AlistURL, RawURL, AlistPath
# AlistPath: 如先前解释,是 /d/ API 下载链接。
# AlistURL: 直接的 Alist 资源 URL。
# RawURL: 如果 Alist 挂载的存储支持完全原始的、无需 Alist 中转的直链。
overwrite: False
sync_server: True
# sync_ignore:
# other_ext:
max_workers: 50
max_downloaders: 5
wait_time: 0
logger: # 新增日志配置部分
level: "debug" # 日志级别。 "debug" 提供详细信息,适合排错。可选:"info", "warn", "error"。
file: "/logs/autofilm.log" # 日志文件在容器内的路径。
# 在 Docker Compose 中,我们将宿主机的 /opt/media_suite/autofilm/logs 挂载到了容器的 /logs。
# 因此,日志文件将保存在宿主机的 /opt/media_suite/autofilm/logs/autofilm.log。
# 也可以使用日期格式,例如: "/logs/%Y-%m-%d.log" 来按天分割日志。
# Ani2AlistList: # 如果您不需要 "Ani2Alist" (例如从动漫花园同步到 Alist) 的功能,你需要的话去翻翻原作者的示例配置文件
# - id: 新番追更
# # ... Ani2AlistList 的具体配置 ...
第五步:启动和管理容器
现在所有的配置文件都已准备就绪,我们可以启动 Docker 容器了。
进入工作目录
首先,确保您在包含 docker-compose.yml
文件的目录中。根据我们之前的步骤,这个目录是 /opt/media_suite
。
cd /opt/media_suite
sudo docker compose up -d
最后贴一点我用的多的指令
停止容器 docker compose down
查看autofilm日志 docker compose logs autofilm
查看emby日志 docker exec Emby tail -n 100 /config/logs/embyserver.txt
单独重启autofilm docker compose restart autofilm