对下载的影视文件,通过 硬链
或 软链
在另一个文件夹中改名和重组目录、以便 Emby/Plex 这样的应用程序便于刮削识别。本脚本:
影视名称
,年份
,季
,集
,以及 制作组
--add-year-dir
在媒体名称目录之上,加一层年份目录即对于 siteid 和刮削完成后的包含Emby/Plex括号的文件夹,都会进入对所有文件进行处理
--make-nfo
在媒体目录内生成 .nfo 文件tmdb=tv-123456
或 tmdb=m-123456
信息,则会进入目录以此信息对文件进行刮削tp.py
设置输出目标和格式--sep-area
所有地区分目录,不可与语言 --lang
同时使用--genre
支持按类型分目录,以逗号分隔,使用--tmdb-lang
所设的语言相关的类型词汇;如果媒体包含列出的类型,则在Movie/TV目录下单独成分目录,未在列的在 other 目录;如果同时进行了语言或地区分目录,类型目录与语言和地区同级目录,即类型中未在列的才分语言和地区;main(argv, exportObject)
,参见11节说明--tmdbid
,用m-12345
或movie-12345
及 t-54321
或tv-54321
这样的形式,指定资源的TMDb信息--tmdb-origin-name
, 对于电影,生成 刮削名 (年份) - 原文件名
这样的文件名,对于Emby可以实现以原文件名作为版本名。[imdb=tt123456]
或以 tt123456
结尾的目录--make-plex-match
Create a .plexmatch file at the top level of a series--imdbid
在 -s
模式下指定媒体的 IMDb id--after-copy-script
执行外部脚本时,会传入3个参数:生成的媒体路径,原媒体文件(夹)名,tmdbid[imdbid=xxx]
或[tmdbid=xxx]
,则直接使用这样的id去TMDb中搜索资源信息--after-copy-script
在完成硬链后,执行一外部脚本,以便实现Plex刮削-e, --keep-ext
, 可使用参数 all
--make-log
在目标目录中建立一个log文件,以便追溯原文件名--symbolink
support symbol link--lang
dispatch to different folders base on TMDb language--tmdb-api-key
Support TMDb search 本程序需要在
python3
运行环境,以命令行方式运行
pip3 install torcp
Python 3
python3 -m ensurepip
如果你仍然习惯源码调用的方式,安装代码,仍然使用:
git clone https://github.com/ccf-2012/torcp.git
这里添加了一个小的入口程序tp.py
,你可以这样调用:
python tp.py -h
后面例子中的torcp
都可以替换成 python tp.py
这样的调用方式。
这样的方式,全程操作是以同一用户同一env,可能会减少出错机会。
完整的命令参数,可以通过这样查看:
torcp -h
或使用源码安装的话,打 python tp.py -h
python3 tp.py -h
usage: tp.py [-h] -d HD_PATH [-e KEEP_EXT] [-l LANG] [--genre GENRE] [--other-dir OTHER_DIR] [--sep-area] [--sep-area5] [--sep-area7] [--tmdb-api-key TMDB_API_KEY] [--tmdb-lang TMDB_LANG] [--tv-folder-name TV_FOLDER_NAME] [--movie-folder-name MOVIE_FOLDER_NAME] [--tv] [--movie] [--dryrun] [--single] [--extract-bdmv] [--full-bdmv] [--origin-name] [--tmdb-origin-name] [--sleep SLEEP] [--move-run] [--make-log] [--symbolink] [--cache] [--emby-bracket] [--plex-bracket] [--make-plex-match] [--make-nfo] [--after-copy-script AFTER_COPY_SCRIPT] [--imdbid IMDBID] [--tmdbid TMDBID] [--extitle EXTITLE] [--site-str SITE_STR] [--add-year-dir] [--genre-with-area GENRE_WITH_AREA] MEDIA_DIR
torcp: a script hardlink media files and directories in Emby-happy naming and structs.
positional arguments: MEDIA_DIR The directory contains TVs and Movies to be copied.
options: -h, --help show this help message and exit -d HD_PATH, --hd_path HD_PATH the dest path to create Hard Link. -e KEEP_EXT, --keep-ext KEEP_EXT keep files with these extention('srt,ass'). -l LANG, --lang LANG seperate dir by language('cn,en'). --genre GENRE seperate dir by genre('anime,document'). --other-dir OTHER_DIR for any dir Other than Movie/TV. --sep-area seperate dir by all production area. --sep-area5 seperate 5 dirs(cn,hktw,jp,kr,useu,other) by production area. --sep-area7 seperate 7 dirs(us,cn,hk,tw,jp,kr,occident,other) by production area. --tmdb-api-key TMDB_API_KEY Search API for the tmdb id, and gen dirname as Name (year){tmdbid=xxx} --tmdb-lang TMDB_LANG specify the TMDb language --tv-folder-name TV_FOLDER_NAME specify the name of TV directory, default TV. --movie-folder-name MOVIE_FOLDER_NAME specify the name of Movie directory, default Movie. --tv specify the src directory is TV. --movie specify the src directory is Movie. --dryrun print message instead of real copy. --single, -s parse and copy one single folder. --extract-bdmv extract largest file in BDMV dir. --full-bdmv copy full BDMV dir and iso files. --origin-name keep origin file name. --tmdb-origin-name filename emby bracket - origin file name. --sleep SLEEP sleep x seconds after operation. --move-run WARN: REAL MOVE...with NO REGRET. --make-log Make a log file. --symbolink symbolink instead of hard link --cache cache searched dir entries --emby-bracket ex: Alone (2020) [tmdbid=509635] --plex-bracket ex: Alone (2020) {tmdb-509635} --make-plex-match Create a .plexmatch file at the top level of a series --make-nfo Create a .nfo file in the media dir --after-copy-script AFTER_COPY_SCRIPT call this script with destination folder path after link/move --imdbid IMDBID specify the IMDb id, -s single mode only --tmdbid TMDBID specify the TMDb id, -s single mode only --extitle EXTITLE specify the extra title to search --site-str SITE_STR site-id(ex. hds-12345) folder name, set site strs like ('chd,hds,ade,ttg'). --add-year-dir Add a year dir above the media folder --genre-with-area GENRE_WITH_AREA specify genres with area subdir, seperated with comma
## 5 基本使用
* 将一个目录中所有影视文件和目录,硬链到另一个目录,其间会按目录名/文件名猜测分类,并挑出 `.mkv` 和 `.mp4`:
```sh
torcp /home/ccf2012/Downloads/ -d /home/ccf2012/emby/
电影和剧集的处理,是不一样的,如果你确认一个目录是电影或剧集,可以使用--movie
和 --tv
指定:
torcp /home/ccf2012/Downloads/RSSMovie/ -d /home/ccf2012/emby/ --movie
如果想单独处理单个目录,可使用 -s
指定,例如:
torcp /home/ccf2012/Downloads/权力的游戏.第1-8季.Game.Of.Thrones.S01-S08.1080p.Blu-Ray.AC3.x265.10bit-Yumi -d /home/ccf2012/emby/ -s --tv
--tmdb-api-key
TMDb 查询--tmdb-lang
参数,默认是 zh-CN
链
或 移
到目标目录下 TMDbNotFound
目录中torcp /home/test/ -d /home/test/result3/ --tmdb-api-key='your TMDb api key'
--move-run
的例子
torcp /home/test/ -d /home/test/result2/ --tmdb-api-key='your TMDb api key' --plex-bracket --move-run --dryrun
--tmdb-lang
设置TMDb刮削的语言--tmdb-lang en-US
搜索 「The.Dripping.Sauce.S01.2020.1080p.KKTV.WEB-DL.x264.AAC-ADWeb」会生成目录为 「The Dripping Sauce (2020)」--tmdb-lang zh-CN
搜索则生成目录为 「大酱园 (2022)」--lang
按语言分类--lang
后面以逗号分隔写所需要分出来的语言,其它的归到 others
cn
,日语为 ja
,韩语为 ko
--lang all
则所有语言都被分类torcp /home/test/ -d /home/test/result3/ --tmdb-api-key='your TMDb api key' --lang cn,ja,ko
--move-run
直接改名和移动-d
指定要搬移的目标位置,请自己把握不跨区 --sleep
参数,可以每次操作搬移一个文件后暂停 SLEEP
秒,此参数仅在 --move-run
时有效--dry-run
确认后才执行torcp /home/test/ -d /home/test/result5/ --move-run --dryrun
--extract-bdmv
和 --full-bdmv
,BDMV的处理BDMV
目录和 .iso
文件时,将会跳过。
torcp /volume1/video/emby/test -d /volume1/video/emby/testdir
--extract-bdmv
参数,可能最适合 Emby 或 Kodi 的用家,它将会从 BDMV
目录中挑出最大的几个 .m2ts
文件硬链出来,对于 movie/tv 都行。见下面的例子
with
iso
files copy to sepereate dirtorcp /volume1/video/emby/test -d /volume1/video/emby/testdir --extract-bdmv
--full-bdmv
参数。使用这个参数会将整个 BDMV 文件夹和 .iso
文件都硬链出来,对于使用碟机播放的用家,就会有用。
torcp /volume1/video/emby/test -d /volume1/video/emby/testdir --full-bdmv
--extract-bdmv
的例子torcp /share/CACHEDEV1_DATA/Video/QB/TV -d /share/CACHEDEV1_DATA/Video/emby/ --extract-bdmv
[/share/CACHEDEV1_DATA/Video/QB/TV/Civilisations.S01.COMPLETE.BLURAY-VEXHD] # tree . -h -A -P *.m2ts
.
├── [4.0K] CIVILISATIONS_D1
│ └── [4.0K] BDMV
│ ├── [4.0K] BACKUP
│ │ ├── [4.0K] CLIPINF
│ │ └── [4.0K] PLAYLIST
│ ├── [4.0K] CLIPINF
│ ├── [4.0K] META
│ │ └── [4.0K] DL
│ ├── [4.0K] PLAYLIST
│ └── [4.0K] STREAM
│ ├── [ 14G] 00002.m2ts
│ ├── [ 14G] 00003.m2ts
│ ├── [ 14G] 00004.m2ts
│ ├── [1.1M] 00005.m2ts
│ ├── [ 12M] 00006.m2ts
│ ├── [ 94M] 00007.m2ts
│ ├── [ 94M] 00008.m2ts
│ ├── [1.9M] 00009.m2ts
│ ├── [1.5M] 00010.m2ts
│ └── [126K] 00011.m2ts
├── [4.0K] CIVILISATIONS_D2
│ └── [4.0K] BDMV
│ ├── [4.0K] BACKUP
│ │ ├── [4.0K] CLIPINF
│ │ └── [4.0K] PLAYLIST
│ ├── [4.0K] CLIPINF
│ ├── [4.0K] META
│ │ └── [4.0K] DL
│ ├── [4.0K] PLAYLIST
│ └── [4.0K] STREAM
│ ├── [ 14G] 00002.m2ts
│ ├── [ 14G] 00003.m2ts
│ ├── [ 14G] 00004.m2ts
│ ├── [1.1M] 00005.m2ts
│ ├── [ 12M] 00006.m2ts
│ ├── [ 94M] 00007.m2ts
│ ├── [ 94M] 00008.m2ts
│ ├── [1.9M] 00009.m2ts
│ ├── [1.5M] 00010.m2ts
│ └── [126K] 00011.m2ts
└── [4.0K] CIVILISATIONS_D3
└── [4.0K] BDMV
├── [4.0K] BACKUP
│ ├── [4.0K] CLIPINF
│ └── [4.0K] PLAYLIST
├── [4.0K] CLIPINF
├── [4.0K] META
│ └── [4.0K] DL
├── [4.0K] PLAYLIST
└── [4.0K] STREAM
├── [ 14G] 00002.m2ts
├── [ 14G] 00003.m2ts
├── [ 14G] 00004.m2ts
├── [1.1M] 00005.m2ts
├── [ 12M] 00006.m2ts
├── [ 94M] 00007.m2ts
├── [ 94M] 00008.m2ts
├── [1.9M] 00009.m2ts
├── [1.5M] 00010.m2ts
└── [126K] 00011.m2ts
* 执行后:
[/share/CACHEDEV1_DATA/Video/emby/BDMV_TV/Civilisations] # tree . -h -A . ├── [4.0K] CIVILISATIONS_D1 │ ├── [ 14G] CIVILISATIONS_D1\ -\ 00002.m2ts │ ├── [ 14G] CIVILISATIONS_D1\ -\ 00003.m2ts │ └── [ 14G] CIVILISATIONS_D1\ -\ 00004.m2ts ├── [4.0K] CIVILISATIONS_D2 │ ├── [ 14G] CIVILISATIONS_D2\ -\ 00002.m2ts │ ├── [ 14G] CIVILISATIONS_D2\ -\ 00003.m2ts │ └── [ 14G] CIVILISATIONS_D2\ -\ 00004.m2ts └── [4.0K] CIVILISATIONS_D3 ├── [ 14G] CIVILISATIONS_D3\ -\ 00002.m2ts ├── [ 14G] CIVILISATIONS_D3\ -\ 00003.m2ts └── [ 14G] CIVILISATIONS_D3\ -\ 00004.m2ts
----
## 9 媒体文件名生成方案
### 9.1 `--origin-name` 与 `--tmdb-origin-name`
* 对于IMDb搜索到的媒体资源,目录结构将按Emby/Plex所约定的规范进行组织,目录内的文件名,有3种可能的方式:
1. 默认的:刮削名 (年份) - 分辨率_组名.mkv
2. `--origin-name`:TV直接使用 原文件名, Movie:刮削名 (年份) - 原文件名
3. `--tmdb-origin-name`:刮削名 (年份) - 原文件名
### 9.2 `--emby-bracket`, --plex-bracket`
* 可以使用 `--emby-bracket` 选项在 「刮削名 (年份)」之后加上如「[tmdbid=509635]」这样的emby bracket,以便Emby在刮削时直接辨认使用;
* 对于plex,可以使用 `--plex-bracket` 生成如 「{tmdb-509635}」这样的后缀;
* 这两个选项在使用 `--tmdb-origin-name` 时也是生效的
* 比如:
```sh
python3 tp.py ../test -d ../test/result --tmdb-api-key 'your TMDb api key' --tmdb-origin-name --emby-bracket
.
├── A.Good.Day.to.Die.Hard.2013.1080p.BluRay.x265.10bit.3Audio.MNHD-FRDS
│ ├── A.Good.Day.to.Die.Hard.Extended.Version.2013.1080p.BluRay.x265.10bit.3Audio.MNHD-FRDS.mkv
│ ├── A.Good.Day.to.Die.Hard.Theatrical.Version.2013.1080p.BluRay.x265.10bit.3Audio.MNHD-FRDS.mkv
│ └── Bonus
└── result
└── Movie
└── 虎胆龙威5 (2013) [tmdbid=47964]
├── 虎胆龙威5 (2013) [tmdbid=47964] - A.Good.Day.to.Die.Hard.Extended.Version.2013.1080p.BluRay.x265.10bit.3Audio.MNHD-FRDS.mkv
└── 虎胆龙威5 (2013) [tmdbid=47964] - A.Good.Day.to.Die.Hard.Theatrical.Version.2013.1080p.BluRay.x265.10bit.3Audio.MNHD-FRDS.mkv
* 而如果不使用 `--tmdb-origin-name `
```sh
python3 tp.py ../test -d ../test/result --tmdb-api-key 'your TMDb api key' --emby-bracket
.
├── A.Good.Day.to.Die.Hard.2013.1080p.BluRay.x265.10bit.3Audio.MNHD-FRDS
│ ├── A.Good.Day.to.Die.Hard.Extended.Version.2013.1080p.BluRay.x265.10bit.3Audio.MNHD-FRDS.mkv
│ ├── A.Good.Day.to.Die.Hard.Theatrical.Version.2013.1080p.BluRay.x265.10bit.3Audio.MNHD-FRDS.mkv
│ └── Bonus
└── result
└── Movie
└── 虎胆龙威5 (2013) [tmdbid=47964]
└── 虎胆龙威5 (2013) [tmdbid=47964] - 1080p_FRDS.mkv
其中后一个版本会因文件已存在而跳过
下载资源时多建一层父目录,包含IMDb信息: 即用户可以在rss站时,添加种子时就建一个以 站点-id-IMDb
为名的目录,作为下载资源的父目录,则torcp将以此IMDb id作为信息,对下层目录作为资源进行刮削。(by boomPa), 如:
audies_movie-1234-tt123456\
Some.Movie.2022.1080p.BluRay.x264.DTS-ADE\
Some.Movie.2022.1080p.BluRay.x264.DTS-ADE.mkv
站点-id-IMDb
目录可能没有IMDb,对于 站点关键字-id
结构的目录torcp也会视为资源的父目录,即多进一层进行解析,其中 站点关键字
可由 --site-str
指定,如指定了 --site-str audies_movie
则碰到 audies_movie-1234
目录,则会进入内层目录对其中的文件夹或文件进行刮削。
另外,如果资源文件夹的名字,本身带有 [imdb=tt123456]
或 [tmdb=123456]
结尾,也会被用于直接指定媒体
--imdbid
参数指定 IMDb id--imdbid
参数传给torcp。--move-run
操作后,原目录将会剩留大量 空的,或仅包含 .jpg
, .nfo
这类小文件的目录.mkv
, .mp4
, .ts
, .iso
之外,使用与 torcp.py
相同的 --keep-ext
来表示那些已经 不再包含这些扩展名文件 的目录,将被删除--dryrun
先看下将会发生什么torcp-clean /home/test/ -e srt,ass --dryrun
torcp 入口定义为:
torcp.main(argv=None, exportObject=None)
exportObject.onOneItemTorcped(targetDir, curMediaName, tmdbIdStr, tmdbCat)
进行处理。一个目录可能会多次输出。示例
from torcp import torcp
class TorcpExportObj: def onOneItemTorcped(self, targetDir, mediaName, tmdbIdStr, tmdbCat): print(targetDir, mediaName, tmdbIdStr, tmdbCat)
if name == 'main': argv = ["~/torccf/test", "-d", "~/torccf/result", "--tmdb-api-key", "your_tmdb_api_key", "--emby-bracket", "--extract-bdmv", "--tmdb-origin-name"] eo = TorcpExportObj() o = Torcp() o.main(argv, eo)
## 13 类型,语言,地区分目录
* 地区 `--sep-area` 与 语言 `--lang` 只选其一,`--lang` 优先(有lang了就不看area)
* 如果地区没有取到,则会取语言代码;语言是小写,地区是大写;
* 类型 `--genre` 独立在 地区/语言之外,如果指定了类型,只有没指定的部分会分 地区/地区
* `--genre` 可设的类型值与 `--tmdb-lang` 所设语言相关,对于电影,中文有:
动作 冒险 动画 喜剧 犯罪 纪录 剧情 家庭 奇幻 历史 恐怖 音乐 悬疑 爱情 科幻 电视电影 惊悚 战争 西部
英文有:
Action Adventure Animation Comedy Crime Documentary Drama Family Fantasy History Horror Music Mystery Romance Science Fiction TV Movie Thriller War Western
* 对于电视,中文有:
动作冒险 动画 喜剧 犯罪 纪录 剧情 家庭 儿童 悬疑 新闻 真人秀 Sci-Fi & Fantasy 肥皂剧 脱口秀 War & Politics 西部
英文有:
Action & Adventure Animation Comedy Crime Documentary Drama Family Kids Mystery News Reality Sci-Fi & Fantasy Soap Talk War & Politics
---
## Acknowledgement
* [@leishi1313](https://github.com/leishi1313)
* @Aruba @ozz
* @NishinoKana @Esc @Hangsijing @Inu