# 自建多媒体文件管理系统 **Repository Path**: ltctm/self-host-media-manager ## Basic Information - **Project Name**: 自建多媒体文件管理系统 - **Description**: No description available - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-03-03 - **Last Updated**: 2025-07-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 用途 本程序用于部署在存储有影视数据的服务器(windows或linux均可),根据媒体文件夹的名称,自动整理视频文件并刷新元数据 # 程序目录下新建config.toml ```toml lang = "zh-CN" unsafe_search = false async_coroutines = 8 [mode.common] media_root = ["testmedia/NAS-DISK1/影视", "testmedia/NAS-DISK2/影视"] types_on_disk = [ "MV和歌舞", "综艺和纪录片", "动漫/热血", "动漫/感情", "动漫/悬疑", "动漫/儿童", "动漫/乐队", "动漫/冒险", "电影和电视剧/DC", "电影和电视剧/星球大战", "电影和电视剧/动作", "电影和电视剧/感情", "电影和电视剧/喜剧", "电影和电视剧/战争", "电影和电视剧/漫威", "电影和电视剧/犯罪和律政", "电影和电视剧/科幻和奇幻", ] [mode.ghs] source_root = "testmedia/NAS-DISK2/ghs/hanime" dst_root = "testmedia/NAS-DISK2/影视/hanime" refer_id_csv = "./refer_id.csv" [cacheDB] map_size = "512 MiB" expiration = 6 # ========所有url的最后不能有"/"======== [metaDB.tmdb] baseurl = "https://api.tmdb.org/3" imgurl = "https://image.tmdb.org/t/p/original" # token可选,不推荐写在config中,推荐设置在环境变量TMDB_API_TOKEN token = "your_token" [metaDB.bgmtv] baseurl = "https://api.bgm.tv/v0" # bgmtv的imgurl可以为空字符串(但该项并非可选) # api返回的是完整的链接,程序并不会使用这个变量 imgurl = "https://lain.bgm.tv" # token可选,不推荐写在config中,推荐设置在环境变量BGMTV_API_TOKEN token = "your_token" user_agent = "author/project (https://github.com/author/project/)" ``` 强烈推荐将`TMDB_API_TOKEN`和`BGMTV_API_TOKEN`设置在环境变量。配置环境变量后,config里就不需要再配置。 `unsafe_search=true`可以在按文件夹命名方式搜到多个匹配结果时匹配第一个结果,否则,只有在搜到唯一的匹配结果时,程序才会识别该文件夹 `cacheDB`的实现方式为 **LMDB** ,`expiration`表示N天内进行相同的URL请求则从缓存数据库中获取数据,不再向tmdb等web服务发送请求。 # common模式根据媒体内容文件夹名称获取元数据 运行以下命令以启动 ```bash conda run -n base python -u -m main common #或 conda run -n base python -u -m main ``` ## 媒体内容文件夹命名方式 完全和jellyfin兼容的写法(注意空格的使用) - `{name} ({year}) - [tmdbid-{id}]`,例如 - `结城友奈是勇者 (2014) - [tmdbid-71493]` - `结城友奈是勇者 (2014) - [bgmtvid-109328]`,注意bgmtv要选择动漫的**第1季**的ID - `year`以及`(db_name, id)`的组合都是可选的 本程序可以额外指定语言: - `{name} ({year}) - [tmdbid-{id}.{lang}]`,例如`嘉年華大街 (2019) - [tmdbid-90027.zh-HK]` - bgmtv没有语言选项,目前即使填写也会被忽略,未来可能会考虑接入自动翻译功能 - lang支持`zh-CN`、`zh-HK`、`zh-TW`、`en-US`、`ja-JP` 在没有指定ID的情况下,程序会自行在**TMDB**搜索,如果只找到唯一匹配的条目,程序可以继续自动执行,否则(没有搜到或者多于1个),跳过当前媒体。 注意`name`里尽量不要有空格和`.`,可以用`_-`之一代替,程序在搜索时会把连续的`_- `的组合替换为单个空格。 程序会根据文件夹中是否有至少一个season来判断该文件夹是`tv`还是`movie`。根据jellyfin规范,season文件夹的写法必须完全为`Season {数字}`或者`Specials`(特别篇),不能多任何字,也不能简写为`S1`。 ## 程序匹配目标 所有`{media_root}/{type_on_disk}`中的文件夹都会视为待匹配媒体,在非调试模式下,若待匹配媒体文件夹中有`tvshow.nfo`或者`movie.nfo`则跳过 ## 季中的单元集 要求视频文件的数量**小于或等于**数据库中的条目数,并且视频文件和条目一一对应。若两集联播,如E03-E04联播,则E04可以写成`E04.fill`。若有缺失的集,如用机动战士高达SEED50集版元数据对应48集版文件,则缺失的总集篇E14写为`E14.miss`,E26同理。 ## 单元集自动重命名 在媒体内容文件夹新建`labels_LTCTM.toml`,如果`check_date`符合要求,程序会把文件重命名为vidhub、infuse等要求的标准名称。当文件在网盘中,无法通过nfo文件设置元数据时,这些程序可以自动刮削。 ```toml #字幕的选项:embedded/intrack/outside subtitle = "" [contributor] name = "VCB-Studio" website = "https://vcb-s.com/archives/" [metaDB] # 若希望程序自动重命名,check_date和今天日期的差值必须小于或等于config中的expiration # 如果该作品未完结,或者不想重命名,则check_date为空字符串 check_date = "yyyy-mm-dd" # 完整的元数据网站的网址,便于检查时快速跳转 website = "https://www.themoviedb.org/movie/" # ========下面还可以写各种注释======== # 比如该作品在资源论坛的网盘下载地址 ``` ## 程序输出 在`output`目录下会输出`media_volume.csv`,包括每个电影或剧集的有效视频文件在文件系统中的体积,以及所有文件的总体积(比如动漫的SPs、CDs和Scans,或者电影的评论音轨)。 # ghs模式 首先,在存储有按年份下载的hanime的服务器(可以是linux或windows)上运行,注意把花括号表示的变量换成实际的值,可以不输入`start_year`和`end_year`,表示获取所有条目,也可以只输入`start_year`,表示只获取这一年对应的条目。 ```bash conda run -n base python -m extra.output_list {source_root} {start_year} {end_year} ``` 这样可以得到`manual_data/refer_id_for_manual.csv`,编码为`utf-8 with BOM`。 把它放到普通个人电脑上,可以转换成excel文件(例如xlsx)进行编辑。具体的编辑方式为: - 手工查找每个作品的`bgmtv_ID` - 如果遇到同一部作品一个月内出了多个episode,则需要更改`sort_in_month`(从1开始),如果遇到了特典,则需要设置`SP_index`(从1开始)而不是`sort_in_month` - `key`可以随意修改,只用来搜索和排序,但是`raw_name`不可以修改 - 如果确定`month`和数据库不匹配,可以修改`month`,例如下载的视频文件按照9-30发行算在9月,`month`为`2021-09`,但是数据库中的发行日期为`2021-10-01`,则把`month`修改为`2021-10` - 该excel文件在按照`month`排序后,可以加入新的条目,例如已经存储有2016-2023的条目的表格可以在后面加上2024年的所有条目,旧的不用删除 编辑好的excel文件再导出编码为`utf-8 with BOM`的csv,上传至服务器并命名为`manual_data/refer_id.csv` 运行以下命令以启动: ```bash conda run -n base python -u -m main ghs ``` 程序根据`refer_id.csv`获取元数据,在`dst_root`新建媒体文件夹,然后把视频文件从`source_root`移动至对应的文件夹。 # 调试模式 在程序目录下新建`DEBUG`文件。 ## 调试GHS模式 `extra.output_list`里面的`output_csv_for_manual`比较复杂,需要调试。注意,`extra.output_list`不依赖本程序的其他模块,调试和修改的内容仅局限于本模块。 首先,在服务器上运行: ```bash conda run -n base python -m extra.output_list {source_root} {start_year} {end_year} ``` 以获得`manual_data/video_list.txt`。 然后,把上述文件放在调试终端的相同位置,在调试终端上把`extra.output_list`作为入口调试即可。调试入口为: ```bash conda run -n base python -m extra.output_list ``` # 附录 ## 公开数据库 - [themoviedb](https://themoviedb.org/) 支持 **简体中文/繁体中文/英语/日语** - [IMDB](https://www.imdb.com) 英文社区,支持 **英语** - [bangumi.tv](https://bangumi.tv) 中文社区,支持混合的 **简体中文/繁体中文/日语** ## API - [themoviedb API](https://developer.themoviedb.org/docs/) - [bangumi.tv API](https://bangumi.github.io/api/)不支持选择元数据语言 ## NAS服务的nfo - [jellyfin nfo说明](https://jellyfin.org/docs/general/server/metadata/nfo/) - [kodi nfo格式示例](https://kodi.wiki/view/NFO_files/Templates) ## 视频文件和目录结构命名规则 - [jellyfin官网tv说明](https://jellyfin.org/docs/general/server/media/shows/) - [jellyfin官网movie说明](https://jellyfin.org/docs/general/server/media/movies/)