用Lunarr打造私人流媒体中心

简介

什么是 Lunarr ?

Lunarr 是一个自托管的媒体服务器,专为电影和电视库设计。它可以帮助用户管理本地、SFTPWebDAV 上的媒体文件,自动匹配 TMDb 元数据,并支持直接播放或实时 HLS 转码。支持 ChromecastAirPlay 远程播放。

主要特点

  • 多源媒体库:支持本地磁盘、SFTPWebDAV 三种媒体源,可以灵活管理不同位置的媒体文件
  • 智能元数据匹配:自动扫描文件并与 TMDb 数据库匹配,提供电影和电视剧的详细信息、海报和推荐
  • 多种播放方式:支持直接播放和实时 HLS 转码,兼容 ChromecastAirPlay 进行远程播放
  • 字幕支持:自动检测侧边 .vtt 字幕文件,支持 FFmpeg 转码和可选硬件加速
  • 设备配对:支持电视和移动设备配对,提供访客分享链接和 API 密钥管理
  • 开源免费:基于 Apache-2.0 协议开源,可免费使用和修改

应用场景

  • 家庭影院:将家庭媒体库集中管理,在电视、手机、平板等多种设备上播放
  • 个人影视库:整理和管理个人收藏的电影和电视剧,自动获取元数据和海报
  • 远程媒体访问:通过 SFTPWebDAV 访问远程服务器上的媒体文件
  • 开发者测试:开发人员可以快速搭建测试环境,测试媒体播放和转码功能

Lunarr 是一个功能齐全的自托管媒体服务器,适合需要管理个人媒体库的用户。

安装

在群晖上以 Docker 方式安装。

在注册表中搜索 sayem314,选择第二个 sayem314/lunarr,版本选择 latest

本文写作时,latest 版本对应为 0.6.0

docker 文件夹中,创建一个新文件夹 lunarr,并在其中建一个子文件夹 data,媒体文件可以使用现有的进行挂载

需要给 /data 目录 EveryOne 读写权限,否则会创建 SQLite 数据库失败

文件夹 装载路径 说明
docker/lunarr/data /data 存放应用数据
/path/to/media /media:ro 媒体文件目录(只读)

端口

本地端口不冲突就行,不确定的话可以用命令查一下

1
2
# 查看端口占用
netstat -tunlp | grep 端口号
本地端口 容器端口
3418 3000

环境

可变
AUTH_SECRET 至少 32 个字符的随机密钥
ORIGIN http://<群晖IP>:3418

环境变量说明

  • AUTH_SECRET 用于应用认证,必须保持稳定;
  • ORIGIN 用于设置应用的公共访问 URL

命令行安装

docker cli 安装

如果你熟悉命令行,可能用 docker cli 更快捷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 新建文件夹 lunarr 和 子目录
mkdir -p /volume1/docker/lunarr/data

# 进入 lunarr 目录
cd /volume1/docker/lunarr

# 修改目录权限
chmod a+rw data

# 一键启动
docker run -d \
--name=lunarr \
--restart=unless-stopped \
-p 3418:3000 \
-v $(pwd)//data:/data \
-v /volumeUSB1/usbshare:/media:ro \
-e AUTH_SECRET=EKKprYZqoEN7WdrwQrojun8VFPrs5jCA \
-e ORIGIN=http://192.168.0.197:3418 \
sayem314/lunarr:latest

docker-compose 安装

也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
lunarr:
image: sayem314/lunarr:latest
container_name: lunarr
restart: unless-stopped
ports:
- "3418:3000"
volumes:
- ./data:/data
- /volumeUSB1/usbshare:/media:ro # 这是老苏的移动硬盘
environment:
AUTH_SECRET: "EKKprYZqoEN7WdrwQrojun8VFPrs5jCA"
ORIGIN: "http://192.168.0.197:3418"

然后通过 SSH 登录到您的群晖,执行下面的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 新建文件夹 lunarr 和 子目录
mkdir -p /volume1/docker/lunarr/data

# 进入 lunarr 目录
cd /volume1/docker/lunarr

# 修改目录权限
chmod a+rw data

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

在浏览器中访问 http://<群晖IP>:3418 即可进入登录界面

第一次要注册账号(第一个注册的用户将成为管理员)

设置 TMDb Key

从右上角进入设置

下拉找到 TMDb metadata

填入 TMDb 的读取访问令牌或 API 密钥;两者并非必需。读取访问令牌是首选。

回到上面,点 test

如果返回的是 fetch failed ,说明连不上 themoviedb.org ,扫描的电影库就不会有封面

但是增加 HTTP_PROXY/HTTPS_PROXY 环境变量是没用的,因为 Node.js 的原生 fetch(undici)默认不支持,这是 Node.js 的设计行为,不是 Lunarr 的问题。只有使用 node-fetchaxios 等库时才会自动读取代理环境变量。所以没办法让 Lunarr 走代理

可能只有路由器透明代理才是唯一可行的方案,所以如果不是这样,设不设 TMDb Key 应该结果都是一样的

添加电影库

添加电影或电视库

Add library 创建电影库

  • Name:是库的名字
  • Type:可以选择 Movies 或者 TV shows
  • Source:可以是 local folder(本地文件夹)SFTPWebDAV
  • Folder path:文件夹路口,这里要选择容器内的路径,也就是我们映射的 /media
  • Scheduled rescan:可以选择定时扫描的时间间隔,如果电影库比较大,可以选时间间隔大一些,如果库比较小,可以间隔短一点,老苏用的是 Hourly,也就是每个小时扫描一次

创建成功后,会在右侧显示

scan 开始扫描

扫描完成后是没有封面的

随便点开一部

虽然没有缩率图,但是不影响播放

注意事项

  1. AUTH_SECRET 必须稳定AUTH_SECRET 在重启之间必须保持稳定,至少 32 个字符
  2. 数据持久化LUNARR_DATA_DIR 存储 SQLite 数据库和 HLS 缓存,请确保存储在持久化存储上
  3. 媒体库权限:本地媒体库可以监控文件变化,远程库使用手动或计划重新扫描
  4. 管理员权限:第一个注册的用户成为管理员,后续注册默认禁用,除非管理员在设置中启用
  5. 安全建议:建议修改默认的 AUTH_SECRET,使用强随机值

参考文档

Lunarr - Self-hosted media streaming server designed as an alternative to Plex
地址:https://github.com/lunarr-app/lunarr-go

sayem314/lunarr - Docker Image
地址:https://hub.docker.com/r/sayem314/lunarr

Lunarr Documentation
地址:https://github.com/lunarr-app/lunarr-go/tree/main/docs