Sign inSign up

syscc/openlistsync

By syscc

•Updated 2 months ago

Image
1

10K+

syscc/openlistsync repository overview

logo

OpenlistSync是一个适用于OpenList的自动化同步工具 Sync for OpenList


本程序修改自开源项目 TaoSync⁠ V0.4.0。

在原有的项目基础上主要改动,新增通过 MoviePilot⁠ 入库通知自动同步下载的影视文件到 OpenList⁠;并刷新,利用 OpenList⁠ 的 Strm 驱动自动更新 Strm 文件自动入库。

如果好用,请 Star!非常感谢! GitHub⁠ DockerHub⁠

Webhook 与自动同步使用方法点击展开截图

由于更新频繁,截图仅供参考,以实际为准

⁠MoviePilot需要用到的插件
  1. 聚合消息通知 用来发消息给 OpenlistSync
  2. 外部消息转发 用来通知 OpenlistSync 的消息至 MoviePilot 可选
  3. 关于 Openlist 的驱动配置我建议吧所有网盘用别名聚合到一起,只要支持302的网盘均可以,然后 Strm 驱动配置到别名路径即可,保存Strm本地路径 记得开启选择本地媒体strm路径内
⁠聚合消息通知设置

聚合消息通知设置

  1. 当前使用通知渠道选 HTTP请求
  2. HTTP请求 请求方法 POST 请求URL http://ip:8023/webhook
  3. 请求头
{
  "Content-Type": "application/json"
}
  1. 请求参数
{
  "title": "${title}",
  "text": "${text}",
  "apikey": "如果配置了WEBHOOK_APIKEY则需要此字段"
}
  1. 消息类型 选择 整理入库
⁠外部消息转发设置

外部消息转发设置

  1. 启用插件
  2. 开启通知
  3. 消息类型 其他
⁠OpenlistSync通知配置

通知配置

  1. 方式选 自定义
  2. 请求地址 http://moviepilot_ip:port/api/v1/plugin/MsgNotify/send_json?apikey=api_token
  3. 请求方法 POST
  4. 请求提类型 application/json
  5. 标题参数名 title
  6. 是否需要内容 需要
  7. 内容参数名 text
⁠演示自动同步到网盘并自动入库

任务自动同步中

任务自动同步结束

任务通知流程

⁠须知

重要 使用本工具前你必须了解并且会使用 OpenList⁠;本工具没有集成 OpenList,你需要额外启动 OpenList

警告!不要在外网暴露本系统,否则后果自负! 本系统已经做了一定的安全方面的工作,但仍不能保证绝对安全。如确实需要,请务必使用强密码,并使用SSL

⁠用途举例

⁠1. 同步备份

把本地文件备份到多个网盘或FTP之类的存储,或者在多个网盘之间同步文件等;

可以定时扫描指定目录下文件差异,让目标目录与源目录相同(全同步模式);或仅新增存在于源目录,却不存在于目标目录的文件(仅新增模式)

⁠2. 定时下载

可以设置一次性任务(cron方式设置年月日时分秒,将在指定时间执行一次),可在闲时自动从特定网盘下载文件到本地

⁠特性

  • 开源免费,接受任意审查,几乎支持所有常用平台
    • windows-amd64
    • windows-arm64
    • darwin-amd64
    • darwin-arm64
    • linux-amd64
    • linux-arm64
    • linux-386
    • linux-arm-v6
    • linux-arm-v7
    • linux-s390x
    • linux-ppc64le
    • android-arm64-v8a
    • android-armeabi-v7a
  • Github Actions⁠自动打包与发布构建好的可执行程序,过程公开透明,无投毒风险
  • Linux 独立程序提供 amd64、arm64、arm32 的 StaticX 构建;Android 客户端提供运行日志与网页双视图,并允许局域网访问后端
  • 支持Docker,下载即用
  • 前端使用 Vue 3、Vite、Element Plus 与 Pinia,支持亮色/暗色主题、简体中文/English 切换和独立移动端交互;后端响应与任务通知跟随所选语言
  • 一级导航聚焦作业管理、媒体名字刮削、引擎管理和系统设置;全局排除与通知渠道统一在系统设置中维护
  • 干净卸载,不用的时候删掉即可,无任何残留或依赖,不影响系统里其他程序
  • 登录密码不可逆散列保存,支持重置密码,也可在首次创建数据库时通过配置文件或环境变量设置初始管理员密码
  • 核心同步功能可在仅连接 OpenList 的环境运行;媒体刮削、通知等外部集成功能仅在配置并使用时访问 TMDb 或对应通知服务
  • 完善的错误处理,稳定可靠,逻辑自洽;可能出错,但永不崩溃(我猜的)
  • 完善的日志,所有错误都会被记录
  • 引擎管理,可以自由增删改查OpenList/AList
  • 作业管理,可以新增/删除/启用/禁用/编辑/手动执行作业
  • 媒体名字刮削,可以复用已配置的 OpenList 引擎,统一配置默认引擎、TMDb API 服务器、命名模板与改名线程,按 MoviePilot 风格浏览目录、搜索/填写 TMDb ID、预览命名并后台执行媒体目录/文件命名整理;支持根目录最后重命名、强制刷新缓存、任务进度、终止任务、手动执行历史任务、保留重命名日志和任务结果通知
  • 系统设置支持配置通用代理服务器,自动识别 HTTP 或 SOCKS 协议;当前用于后端 TMDb API 请求,不影响 OpenList、同步任务和通知请求
  • 支持排除项规则,可以排除指定目录或文件不同步
  • 支持作业级文件大小过滤,可分别设置最小值和最大值;等于边界的文件仍参与同步
  • 仅新增、全同步、移动三种模式
  • 定时同步支持间隔、cron、手动调用
  • 同步进度、总体进度、同步速度、实时同步文件、预估时间等实时可视化查看
  • 存储可控,合理配置任务记录与日志保留天数,可以控制本程序所占用存储在可控范围内
  • 支持自定义请求、Server酱、钉钉群机器人、企业微信应用消息和 Lark 群机器人通知

⁠媒体名字刮削

媒体名字刮削 菜单用于对 OpenList 中的电影或电视剧目录进行命名整理。它不会新建 OpenList 引擎,而是复用 引擎管理 中已经配置好的 OpenList;刮削相关参数统一在 引擎管理 -> 刮削配置 中维护。

刮削配置包含:

  • 默认打开的 OpenList 引擎;
  • TMDb API Key 或 Bearer Token、API 服务器、语言、成人内容开关和超时时间;
  • 电影/电视剧命名模板、媒体扩展名、自定义词、制作组、自定义标签;
  • 改名线程数、是否允许覆盖、是否刷新目录缓存、重命名日志保留数量。

使用流程:

  1. 在左侧浏览或粘贴 OpenList 路径,选择需要整理的媒体目录;媒体文件直接位于转存目录时,也可以单独选中文件,并继续选择智能识别、电影或电视剧,仅预览和处理该文件,不会扫描同级目录。
  2. 在右侧选择类型、递归、处理数量,可直接填写 TMDb ID;也可以点击 TMDb ID 输入框右侧搜索按钮,按名称搜索电影或电视剧,选中结果后自动回填 TMDb ID。
  3. 点击 预览命名 查看原路径、命名后路径、目录重命名和目标冲突。
  4. 确认无误后点击 应用命名,任务会在后台执行;可在 重命名任务 中查看进度、进入详情、终止任务或手动执行历史任务。

执行逻辑:

  • 文件先改名并移动到季目录,根目录最后再重命名,避免根目录提前变化导致后续文件路径失效。
  • 手动执行历史任务时会强制刷新源/目标根目录及其父目录缓存,减少 OpenList 缓存导致的误判。
  • 使用预览结果执行时不会重复为每个文件再次查询 TMDb,优先按预览计划执行。
  • S00、S01 与 Season 0、Season 1 等目录会识别为季目录;同父级季目录调整会优先重命名目录,并在文件移动后清理空的季目录。
  • OpenList 批量移动超时时会刷新源/目标目录做二次核验,实际已完成的文件会补成功日志。
  • 任务完成、部分失败、失败或中止后,会复用通知配置发送媒体刮削任务结果。

TMDb API 服务器默认为 https://api.themoviedb.org,可选择备用的 https://api.tmdb.org,也可输入自定义 HTTP/HTTPS 地址。如果所在网络需要代理,可在 系统设置 -> 代理服务器 中填写 http://host:port 或 socks://host:port;也支持 user:password 认证以及 :password 形式的仅密码认证。SOCKS5 仅密码认证使用零长度用户名兼容形式,需要代理服务器支持。代理地址保存后默认隐藏认证信息,点击输入框右侧的显示按钮可按需查看完整连接串。代理设置页可使用固定地址 http://www.google.com/generate_204 测试延迟;未填写代理地址时会直接连接,当前代理用于后端 TMDb API 请求。

⁠使用方法

⁠先启动
  • 可执行程序

前往Release⁠下载对应平台的可执行程序,直接执行

提示 开机自启、守护进程等可以参考OpenList的方式⁠,把其中的 openlist 改为 openlistsync;注意,本程序不需要 server 参数

  • docker

docker-compose.yaml 示例:

version: "3.8"
services:
  openlistsync:
    image: syscc/openlistsync:latest
    container_name: openlistsync
    restart: always
    network_mode: bridge
    ports:
      - "8023:8023"
    user: "1000:1001"
    environment:
      - WEBHOOK_DELAY=60 # Webhook延迟触发秒数 取决是否需要等MoviePilot刮削完成后同步,如果不需要可以设置为3
      # - WEBHOOK_APIKEY= # Webhook API Key;若设置,则请求必须包含 apikey 字段且值匹配;若留空则不校验
      # - WEBHOOK_OPENLIST_NAME=OpenList # Webhook 自动创建任务时使用的 OpenList 引擎备注名;若未配置或留空,默认使用第一个引擎
      - TVsource=/media/电视剧        # 电视剧源根目录
      - MOVsource=/media/电影        # 电影源根目录
      # DST开头变量适用于临时存放(如追新电视剧),整季完结后可删除并同步至SYNC路径,非必要不需要启用!
      # - DST_TV_TARGETS=/shanct/电视剧 # 优先同步电视剧到此集合;支持 ,;: 分隔
      # - DST_MOV_TARGETS=/shanct/电影  # 优先同步电影到此集合;支持 ,;: 分隔
      # - DST_REFRESH_TV=/media/电视剧,/videos/电视剧 # DST 同步时的刷新集合;支持 ,;: 分隔
      # - DST_REFRESH_MOV=/media/电影,/videos/电影    # DST 同步时的刷新集合;支持 ,;: 分隔
      - SYNC_TV_TARGETS=/115/videos/电视剧,/ODC/tv{max}/电视剧   # 回退电视剧同步集合;{max} → 自动匹配最大数字后缀目录
      - SYNC_MOV_TARGETS=/115/videos/电影,/ODC/mov{max}/电影     # 回退电影同步集合;{max} → 自动匹配最大数字后缀目录
      - SYNC_REFRESH_TV=/115/videos/电视剧,/ODC/tv{max}/电视剧,/videos/电视剧 # SYNC 同步时的刷新集合
      - SYNC_REFRESH_MOV=/115/videos/电影,/ODC/mov{max}/电影,/videos/电影   # SYNC 同步时的刷新集合
      - SECOND=true # 启用二级目录(从 webhook 文本“类别:xxx”解析为二级路径,电视剧与电影均支持)
    volumes:
      - ./data:/app/data
⁠再使用

访问 http://ip:8023

如果你没有修改,默认账号为admin,密码请到日志中查看输出,登录后请立即前往系统设置修改密码

注意 如果没有显示这个日志,可以到同级目录的data/log/sys_xxx.log文件查看,通常在第一行

进入系统后先到引擎管理菜单创建引擎,然后前往作业管理创建同步作业

⁠配置项

点击展开配置项

配置优先级:data/config.ini>环境变量>默认值;前一个存在,则后边都将被忽略。修改配置需重启程序或Docker。

data/config.ini文件示例(如该文件存在,则优先级最高)

[OpenlistSync]
# 初始管理员密码,仅首次创建数据库时生效;RANDOM 或空值表示随机生成
password=RANDOM
# 运行端口号
port=8023
# 登录有效期,单位天
expires=2
# 日志等级:0-DEBUG,1-INFO,2-WARNING,3-ERROR,4-CRITICAL;数值越大,产生的日志越少,推荐1或2
log_level=1
# 控制台日志等级:适用于v0.3.0及之后版本,与上同
console_level=2
# 系统日志保留天数,该天数之前的日志会自动清理,单位天,0表示不自动清理
log_save=7
# 任务记录保留天数,该天数之前的记录会自动清理,单位天,0表示不自动清理
task_save=0
# 任务执行超时时间,单位小时。一定要设置长一点,以免要备份的东西太多
task_timeout=72

上边的文件默认不存在,如需要,您可以手动在程序同级目录的data目录下创建config.ini,并填入上边的内容。注意,文件应使用UTF-8编码

config.iniDocker环境变量描述默认值
passwordOPENLISTSYNC_PASSWORD初始管理员密码,仅首次创建数据库时生效;RANDOM 或空值表示随机生成;兼容 TAO_PASSWORD、TAO_PASSWDRANDOM
portOPENLISTSYNC_PORT运行端口号8023
expiresOPENLISTSYNC_EXPIRES登录有效期,单位天2
log_levelOPENLISTSYNC_LOG_LEVEL日志等级:0-DEBUG,1-INFO,2-WARNING,3-ERROR,4-CRITICAL;数值越大,产生的日志越少,推荐1或21
console_levelOPENLISTSYNC_CONSOLE_LEVEL控制台日志等级:适用于v0.3.0及之后版本;与上同2
log_saveOPENLISTSYNC_LOG_SAVE系统日志保留天数,该天数之前的日志会自动清理,单位天,0表示不自动清理7
task_saveOPENLISTSYNC_TASK_SAVE任务记录保留天数,该天数之前的记录会自动清理,单位天,0表示不自动清理0
task_timeoutOPENLISTSYNC_TASK_TIMEOUT任务执行超时时间,单位小时。一定要设置长一点,以免要备份的东西太多72
-TZ时区Asia/Shanghai

⁠Webhook 与自动同步

  • 端点:POST /webhook
  • 行为:
    • 解析标题中“名称(年份)”并识别类型(是否包含 Sxx/Exx/Exx-Exx → 电视剧)
    • 如果存在同名且启用的作业,默认延迟 30 秒后触发手动执行(可通过 WEBHOOK_DELAY 或请求参数 delay 覆盖;上方 Compose 示例显式设置为 60 秒)
    • 若不存在同名作业:检查源存在后自动创建仅手动作业并立即执行;优先使用 WEBHOOK_OPENLIST_NAME 指定的 OpenList 引擎,未配置时使用第一个引擎
    • 任务完成后根据刷新目标集合自动刷新电影媒体目录,或电视剧媒体目录及其所有季目录,并发送通知
⁠运行时环境变量
变量说明示例
WEBHOOK_DELAYWebhook 延迟触发时间(秒)60
WEBHOOK_APIKEYWebhook API Key,可选。设置后,Webhook 请求必须包含 apikey 字段且值匹配123456
WEBHOOK_OPENLIST_NAMEWebhook 自动创建任务时使用的 OpenList 引擎备注名;若未配置或留空,默认使用第一个引擎OpenList
TVsource电视剧源根/media/电视剧
MOVsource电影源根/media/电影
DST_TV_TARGETS DST_MOV_TARGETS优先同步根集合(原样使用),存在同名目录时仅同步到这里;仅在末尾追加“名称(年份)”;支持 ,;: 分隔例如 /shanct/电视剧 或 /shanct/电影
SYNC_TV_TARGETS电视剧同步目标根集合,用 ,;: 分隔,支持 {max};仅在末尾追加“名称(年份)”例如 /115/videos/电视剧,/ODC/tv{max}/电视剧 或 /115/videos/tv,tv{max}/tv
SYNC_MOV_TARGETS电影同步目标根集合,支持 {max};仅在末尾追加“名称(年份)”例如 /115/videos/电影,/ODC/mov{max}/电影 或 /115/videos/mov,mov{max}/mov
DST_REFRESH_TV DST_REFRESH_MOV当命中 DST_* 同步集合时使用的刷新集合;仅在末尾追加“名称(年份)”;支持 ,;: 分隔例如 /media/电视剧,/videos/电视剧 或 /media/电影,/videos/电影
SYNC_REFRESH_TV当走 SYNC_* 同步集合时使用的刷新集合(仅在末尾追加“名称(年份)”)例如 /115/videos/电视剧,/ODC/tv{max}/电视剧,/videos/电视剧
SYNC_REFRESH_MOV当走 SYNC_* 同步集合时使用的刷新集合(仅在末尾追加“名称(年份)”)例如 /115/videos/电影,/ODC/mov{max}/电影,/videos/电影
SECOND启用二级目录(从 webhook 文本“类别:xxx”解析为二级路径);开启后源与目标都将拼接该二级目录;电视剧与电影均支持true
  • 占位符说明:{max} 占位符(支持任意层级)。语法:前缀{max}(如 tv{max}、disk{max})。系统会自动扫描父目录下(如果未指定父目录则默认为根目录 /)以该前缀开头的所有子目录,并选择数字后缀最大的那个。例如:/ODC/tv{max}/电视剧 会扫描 /ODC 下的 tv*,若有 tv1~tv9,则替换为 /ODC/tv9/电视剧。
  • 源存在判定:TVsource 或 MOVsource 下存在 名称(年份) 目录才会创建作业。

⁠项目目录

OpenlistSync/
├── main.py                         # Tornado 后端入口,注册 Web/API/静态资源路由
├── main_android.py                 # Android WebView 主进程入口
├── buildozer.spec                  # Android arm64-v8a/armeabi-v7a 构建配置
├── openlistsync.spec               # PyInstaller 与 StaticX 共用打包配置
├── logo*.png                       # Android 普通与自适应图标资源
├── requirements.txt                # Python 运行依赖
├── Dockerfile                      # 默认 Docker 镜像构建入口
├── docker-compose.yaml             # Docker Compose 示例
├── dockerfiles/                    # 多平台/不同构建方式的 Dockerfile
├── common/                         # 通用配置、数据库连接、日志、语言与工具方法
│   ├── config.py                   # 读取 data/config.ini、环境变量与默认配置
│   ├── httpApp.py                  # 桌面、容器与 Android 共用的 Tornado 路由工厂
│   ├── locales.py                  # YAML 语言包加载、语言识别与回退
│   ├── sqlBase.py                  # SQLite 基础访问封装
│   └── sqlInit.py                  # 数据库初始化与版本迁移
├── locales/                        # 后端简体中文与 English 语言包
├── controller/                     # Tornado API 控制器
│   ├── baseController.py           # 登录态校验与统一响应封装
│   ├── jobController.py            # 作业、任务与引擎接口
│   ├── mediaScrapingController.py  # 媒体名字刮削配置、浏览、预览、执行与任务接口
│   ├── notifyController.py         # 通知配置接口
│   ├── systemController.py         # 用户、语言、系统配置接口
│   └── webhookController.py        # Webhook 入口
├── mapper/                         # SQLite 数据访问层
│   ├── jobMapper.py                # 作业与任务数据
│   ├── mediaScrapingMapper.py      # 媒体名字刮削任务、执行日志与明细数据
│   ├── notifyMapper.py             # 通知配置数据
│   ├── openlistMapper.py           # OpenList 引擎数据
│   ├── systemConfigMapper.py       # 系统配置数据,如全局排除项和代理服务器
│   └── userMapper.py               # 用户数据
├── media_tools/                    # 媒体整理核心工具
│   └── openlist_media_renamer.py   # OpenList 媒体识别、TMDb 查询、命名预览与重命名执行
├── service/                        # 业务逻辑层
│   ├── main.py                     # Android 后台服务与本机日志页入口
│   ├── mediaScraping/              # 媒体名字刮削配置、预览、后台任务、日志与中止逻辑
│   ├── openlist/                   # OpenList API 客户端与引擎管理
│   ├── syncJob/                    # 作业调度、同步执行、任务统计
│   ├── notify/                     # 通知发送
│   ├── system/                     # 启动初始化、日志清理、用户与系统配置
│   └── webhook/                    # Webhook 解析、自动建作业与刷新
├── web/                            # 当前 Vue 3 + Vite 前端源码
│   ├── public/                     # 前端公共静态资源
│   ├── src/
│   │   ├── api/                    # 前端 API 封装
│   │   ├── router/                 # 前端路由
│   │   ├── store/                  # Pinia 状态
│   │   ├── utils/                  # 前端工具与枚举
│   │   └── views/                  # 页面与组件,含作业管理、媒体名字刮削和集中式系统设置等
│   ├── package.json                # 前端依赖与脚本
│   └── vite.config.js              # Vite 开发服务与代理配置
├── tests/                          # 后端迁移、配置、同步过滤与通知测试
├── README/                         # README 引用的截图资源
├── doc/                            # 文档与历史 changelog
└── data/                           # 源码启动脚本与本地运行数据
    ├── start.py                    # 源码模式安装依赖、启动、停止与重启脚本
    ├── openlistsync.db             # SQLite 数据库(本地生成,不提交)
    ├── config.ini                  # 可选运行配置
    ├── secret.key                  # Cookie 签名密钥
    └── log/                        # 运行日志

⁠接口概览

  • GET/POST/PUT/DELETE /svr/openlist 引擎管理(列表、子目录、增删改)
  • GET/POST/PUT/DELETE /svr/job 作业管理(列表、详情、手动执行、启用/禁用、中止、删除)
  • GET/POST/PUT/DELETE /svr/notify 通知配置(列表、增删改、测试)
  • GET/POST /svr/language 后端默认语言读取与修改
  • GET/POST /svr/system/config 系统配置、全局排除项与通用代理服务器
  • GET /svr/system/proxy/reveal 按需读取已保存的完整代理连接串(需要登录,禁止缓存)
  • POST /svr/system/proxy/test 使用固定 Google 204 地址测试代理延

Tag summary

Content type

Image

Digest

sha256:b0e4ab3d8…

Size

18.2 MB

Last updated

2 months ago

docker pull syscc/openlistsync