2023-12-02 00:30:47 +08:00
2023-11-23 01:05:28 +08:00
2023-11-25 23:39:58 +08:00

bili-sync

为 NAS 用户编写的 BILIBILI 收藏夹同步工具,可方便导入 EMBY 等媒体库工具浏览。

经常在点进自己的收藏夹时看到一大堆失效视频,简直逼死强迫症。想到自己 NAS 还有多余的 20T 存储空间,于是简单写了一个小工具用来实时把收藏夹内容同步下载到 NAS 上。

骄傲地由 python 驱动!

之前基本没有用过 python 的 asyncio拿这个小工具练练手不是

工作截图

下载视频

EMBY 识别

配置文件

对于配置文件的前五项,请参考凭据获取流程

class Config(DataClassJsonMixin):
    sessdata: str = ""
    bili_jct: str = ""
    buvid3: str = ""
    dedeuserid: str = ""
    ac_time_value: str = ""
    interval: int = 20    # 任务执行的间隔时间
    favorite_ids: list[int] = field(default_factory=list)  # 收藏夹的 id
    path_mapper: dict[int, str] = field(default_factory=dict)  # 收藏夹的 id 到存储目录的映射

程序默认会将配置文件存储于 ${程序路径}/config/config.json,数据库文件存储于 ${程序路径}/data/data.db,如果发现不存在则新建并写入初始配置。

配置文件加载时会校验内容是否为空,对于默认的空配置,校验将会报错,程序将会终止运行。

即:我们可以通过运行一次程序,等程序写入初始配置并提示配置错误终止后编辑 config.json 文件,编辑后即可重新运行。

关于 UP 头像

目前开放全局的环境变量 THUMB_PATH 作为 up 主头像的存储位置。

在下载某条视频时,如果 UP 的头像还不存在,就会将 UP 的头像下载至 THUMB_PATH,同时在视频的 NFO 文件中写入 UP 头像的绝对路径。

但实际测试下来EMBY 似乎无法正常读取 NFO 文件中的本地头像路径,待找到处理办法后再修复。

虽然但是,一个基本的逻辑是,如果期望 bili-sync 在 NFO 中写入的头像绝对路径能够被 EMBY 读取到,那么两个容器中头像的绝对路径必须完全相同。因此虽然头像还没办法正常加载,但为后续考虑,还是推荐将 THUMB_PATH 填写上,并确保该路径在 bili-syncemby 两个容器中指向的是相同的文件夹(也就是把一个文件夹同时挂载到 bili-syncemby 的 THUMB_PATH 下)。

Docker 运行示例

docker compose 文件:

services:
  bili-sync:
    image: amtoaer/bili-sync:latest
    user: 1000:1000  # 此处可以指定以哪个用户的权限运行,不填写的话默认 root推荐填写。
    tty: true  # 加上这一行可以让日志变成彩色
    volumes:
      - /home/amtoaer/Videos/Bilibilis/:/Videos/Bilibilis/  # 视频文件
      - /home/amtoaer/.config/nas/bili-sync/config/:/app/config/  # 配置文件
      - /home/amtoaer/.config/nas/bili-sync/data/:/app/data/  # 数据库
    environment:
      - THUMB_PATH=/Videos/Bilibilis/thumb/  # 将头像放到视频文件的 thumb 文件夹下
    restart: always
    network_mode: bridge
    hostname: bili-sync
    container_name: bili-sync
    logging:
      driver: "json-file"
      options:
        max-size: "30m"

对应的配置文件:

{
    "sessdata": "xxxxxxxxxxxxxxxxxx",
    "bili_jct": "xxxxxxxxxxxxxxxxxx",
    "buvid3": "xxxxxxxxxxxxxxxxxx",
    "dedeuserid": "xxxxxxxxxxxxxxxxxx",
    "ac_time_value": "xxxxxxxxxxxxxxxxxx",
    "interval": 20,
    "favorite_ids": [
        711322958
    ],
    "path_mapper": {
        "711322958": "/Videos/Bilibilis/Bilibili-711322958/"
    }
}

目前的问题

  • 研究一下 NFO看看怎么正常读取本地的演员头像

路线图

  • 凭证认证
  • 视频选优
  • 视频下载
  • 支持并行下载
  • 支持作为 daemon 运行
  • 构建 nfo 和 poster 文件,方便以单集形式导入 emby
  • 支持收藏夹翻页,下载全部历史视频
  • 对接数据库,提前检查,按需下载
  • 提供简单易用的打包(如 docker
Description
由 Rust & Tokio 驱动的哔哩哔哩同步工具
Readme 65 MiB
Languages
Rust 53.3%
Svelte 39%
TypeScript 6.3%
CSS 0.6%
Python 0.3%
Other 0.4%