由于bt、pt站的部分剧集名称和tmdb数据、流媒体平台数据存在差异,导致了 MoviePilots 无法订阅、搜索与识别剧集,需要配置自定义识别词进行“季度替换+集数偏移”。博主将简单讲一讲MoviePilot 的自定义识别词配置方法。
一、官方支持的配置格式
屏蔽词
被替换词 => 替换词
前定位词 <> 后定位词 >> 集偏移量(EP)
被替换词 => 替换词 && 前定位词 <> 后定位词 >> 集偏移量(EP)
其中替换词支持格式:{[tmdbid/doubanid=xxx;type=movie/tv;s=xxx;e=xxx]} 直接指定TMDBID/豆瓣ID识别,其中s、e为季数和集数(可选)
注意:
- 自定义识别词支持正则替换规则
- 自定义识别词有先后顺序,前面的优先级更高;
- 关于部分剧集名识别错误,可以使用tmdb别名作为替换词
二、常用正则替换字符
字 符 | 描 述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo 能匹配 "z" 以及 "zoo"。 等价于 {0,} |
+ | 匹配前面的子表达式一次或多次。例如,zo+ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 "do" 、 "does"、 "doxy" 中的 "do" 和 "does"。? 等价于 {0,1} |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用 。要匹配这些字符,请使用 ( 和 )。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 \ |。 |
[] | 表示选择之一,比如[123],可选择1、2或3,等价于[1-3] |
\d | 匹配任意一个阿拉伯数字(0 到 9)。等价于 [0-9] |
[\s\S] | 匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。 |
\b | 正则表达式规定的一个特殊代码(好吧,某些人叫它元字符),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。比如\b08\b不匹配2008中的08,因为2008中的08只是2008这个独立单词的一部分,\b只匹配一个完整的单词整体,不匹配其局部。 |
\g<1> | 在正则表达式替换中,\g<1> 用于引用第一个捕获组中的内容。具体来说,\g<1> 会引用第一个捕获组中匹配的内容。比如(2023)\s(2160p),在使用这个正则表达式并替换为 "\g<2> \g<1>" 时,结果会是 "2160p 2023"。 |
三、举例分析
正向后行断言
(?<=Swallowed.Star.S04.*?)2023 => 2020
字符串 | 描述 |
---|---|
?<= | 表示这是一个正向后行断言,用于匹配"2023"前面跟着的内容"Swallowed.Star.S04.*?" |
Swallowed.Star.S04 | 匹配以"Swallowed.Star.S04"开头的字符串。注意,此处的.匹配除换行符 \n 之外的任何单字符,即"Swallowed Star S04"也匹配。 |
.*? | 匹配任意数量的任意字符,此处“?”表示非贪婪模式。这意味着它会尽可能少地匹配字符,直到满足后面的条件。 |
2023 | 匹配字符串中的"2023"部分,表示需要在前面的内容后面跟着"2023"。 |
=> 2020 | 将匹配到Swallowed.Star.S04时的2023替换为2020 |
综合起来,这个正则表达式会匹配以"Swallowed.Star.S04"或"Swallowed Star S04"开头,并在后面的任意位置跟着"2023"的字符串;该自定义识别词表示将上面匹配到的"2023"修改为2020,实现年份的替换。
正向先行断言
aa.S01(?=.*E(1[3-9]|[2-9][0-9]).*) => aa S03
字符串 | 描述 |
---|---|
?=: | 表示这是一个正向先行断言,用于匹配aa.S01后面跟着的内容"E(1[3-9]|[2-9][0-9])"。 |
.* | 匹配任意数量的任意字符 |
E | 字符E |
(1[3-9]|[2-9][0-9]) | 13-99的所有字符 |
=> aa S03 | 将匹配到“E13-E99”时的aa.S01替换为aa.S03 |
综合起来,这个正则表达式会匹配以"aa.S01"开头,后面跟着一个以"E"开头的数字(范围在13到99之间)的字符串;该自定义识别词表示将“aa”剧集的第一季的13集-99集,识别为第三季的剧集。
正则替换搭配官方配置
IMMORTALITY.S01(?=.*E(2[5-9]|[3-9][0-9]).*XX-Web) => IMMORTALITY S03 && S03 <> 2022 >> EP-24
将含有“XX-web”的诛仙【IMMORTALITY】剧集,S01E25-S01E99识别为S01E01-S01E75。MoviePilot识别时可达到“季度替换+集数偏移”的效果。
&& 表示并且,前面条件满足才能进行后面操作;<> 前后为定位词;>> 后跟集数偏移量,EP+数字 或者 EP-数字。
个人常用自定义识别词
# 将4k、4K修改为2160p
(?<=\[|\s)4[k|K](?=\]|\s) => 2160p
# 将hevc重命名为H265
(HEVC|hevc) => H265
# 年份与分辨率交换顺序,便于集数偏移
2020[\.|\s]2160p => 2160p 2020
2022[\.|\s]2160p => 2160p 2022
2023[\.|\s]2160p => 2160p 2023
2024[\.|\s]2160p => 2160p 2024
# 匹配202x的所有年份(来自评论区Julock)
(202\d)[\.|\s]2160p => 2160p \g<1>
# 百炼成神 (2022)
Apotheosis.S02 => Apotheosis S01 && Apotheosis.S01 <> 2160p >> EP+52
# 永生
IMMORTALITY.S02(?=.*E(1[3-9]|2[0-8]).*ADWeb) => IMMORTALITY S03 && S03 <> 2160p >> EP-12
IMMORTALITY.S01(?=.*E(2[5-9]|3[0-9]|40).*) => IMMORTALITY S03 && S03 <> 2160p >> EP-24
IMMORTALITY.S01(?=.*E(4[1-9]|5[0-6]).*) => IMMORTALITY S04 && S04 <> 2160p >> EP-40
# 师兄啊师兄 (2023)
My.Senior.Brother.is.Too.Steady.S02 => My Senior Brother is Too Steady S01 && S01 <> 2160p >> EP+13
# 吞噬星空 (2020)
Swallowed.Star.S04 => Swallowed Star S01 && S01 <> 2160p >> EP+85
# 沧元图第二季
The.+Demon.+Hunter.+S01(?=.*E(3[1-9]|4[0-9]|5[0-6]).*) => The Demon Hunter S02 && S02 <> 2160p >> EP-30
The.+Demon.+Hunter.+S02(?=.*E(3[1-9]|4[0-9]|5[0-6]).*) <> 2160p >> EP-30
可以尝试分析一下上面的自定义识别词,这些识别词基本上能够满足“季度替换+集数偏移”的要求,可以随心所欲识别自己心爱的剧集为特定季度的特定集。文章如有错误或者有不明白的地方,可以在评论区留言交流沟通。
四、其它
订阅tmdb上不存在的季
首先需要明确,moviepilot支持识别tmdb上存在词条的不存在季,举例百炼成神,在tmdb上能够搜索到这个剧集名,但是只有第一季,若是下载第二季的视频命名正确,以S02EXX这种格式命名,mp也能够正常识别为第二季并且整理入库,后续emby也能识别与展示。
但mp不支持订阅tmdb上不存在的季,要么使用自定义识别词将多季统一识别为第一季,但是这样emby就不分季度了,个人不习惯。如果希望保留分季,怎么办呢?
可以使用qbittorrent rss订阅【mp的rss下载也行】,关键词识别自动下载。比如百炼成神第二季,无法订阅。qbittorrent,rss下载器,下载规则,选中”使用正则表达式“:
- 观察站点种子命名,“必须包含”处填写:
Apotheosis\s2023\sS02E([0-4][0-9]|5[0-2])\s2160p\sWEB-DL\sHEVC
- 为了mp能够整理文件,“添加标签”处填写:
MOVIEPILOT
当然,对于pt站只有第一季的剧集,可以qbittorrent rss 使用正则规则指定下载特定剧集,再搭配mp的自定义识别词将第一季识别为其它季。
还有一种思路,默认mp订阅时只识别种子标题、但不识别种子内部视频文件名。
因此可以利用pt、bt站对于种子的标题名和其内部视频文件名称的差异,分别使用不同的替换词规则【或让针对标题的替换词规不适用于视频文件名,种子标题被识别为第一季用于订阅,视频文件名则继续使用原名称实现非第一季整理】,达到“用第一季订阅+非第一季整理入库”。
此方法可能存在问题,对于多剧集种子只下载部分剧集时,mp可能需要识别种子内部视频文件名称,此时内部视频文件无法识别为第一季,无法订阅下载。修改自定义识别词,只识别与下载单集种子文件,这种情况就可避免。Nice!!!
批量修改剧集的季度和集数的脚本
☛查看脚本内容,点我
#!/bin/bash
# 初始化变量
season=""
episode_adjust=0
location=""
temp_dir="./temp_file" # 创建临时目录
# 创建临时目录
echo "创建临时目录:./temp_file"
mkdir -p "$temp_dir"
# 判断临时目录是否为空
if ! [ -z "$(ls -A "$temp_dir")" ]; then
echo "临时目录 $temp_dir 非空,请清空该目录后再运行脚本"
exit 1
fi
# 清理临时目录的函数
cleanup() {
if [ -z "$(ls -A "$temp_dir")" ]; then
echo "临时目录 $temp_dir 为空,删除该目录"
rm -rf "$temp_dir"
else
echo "临时目录 $temp_dir 非空,保留该目录,请注意查看该目录下文件"
fi
}
# 捕获退出信号,确保临时目录被清理
trap cleanup EXIT
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case "$1" in
-help)
echo "------------------------------------------------------------"
echo "处理文件:当前目录下集数和季度在范围内的所有文件(不含子目录)。"
echo "季数改变:季数改变时,文件将被移动到新的文件夹。"
echo "集数调整:根据 -change 参数调整集数。"
echo ""
echo "-season:指定新的季度数(如 02 表示第二季)"
echo "-change:指定增减集数的数值(如 +3 或 -2)"
echo "-location:从 S01E11-E55 中提取开始和结束集数。"
echo "------------------------------------------------------------"
exit 1
;;
-season)
season="$2"
shift 2
;;
-change)
episode_adjust="$2"
shift 2
;;
-location)
location="$2"
shift 2
;;
*)
echo "未知选项: $1"
exit 1
;;
esac
done
# 检查是否指定了季度数
if [ -z "$season" ]; then
echo "请使用 -season 指定季度数。"
exit 1
fi
# 检查季数的格式
if ! [[ "$season" =~ ^[0-9]{2}$ ]]; then
echo "季度数必须为两位数字(例如02表示第二季)。"
exit 1
fi
# 检查 -change 参数是否为有效整数
if ! [[ "$episode_adjust" =~ ^[-+][0-9]+$ ]]; then
echo "-change 参数必须为增减集数的数值(如 +3 或 -2)。"
exit 1
fi
# 检查是否指定了location范围
if [ -z "$location" ]; then
echo "请使用 -location 指定处理的范围,如 'S01E11-E55'。"
exit 1
fi
# 解析 location 参数,提取开始和结束集数
if [[ "$location" =~ ^(S[0-9]{2}E)([0-9]{2,3})-E([0-9]{2,3})$ ]]; then
location_season="${BASH_REMATCH[1]}"
start_episode="${BASH_REMATCH[2]}"
end_episode="${BASH_REMATCH[3]}"
else
echo "location 参数格式不正确。应为 'S01E11-E55'。"
exit 1
fi
# 处理当前目录下的文件
for file in ./*; do
# 匹配文件名格式 aaaa.SXXEXX 或 aaaa.SXXEXXX
if [[ "$file" =~ ^(.*)(S[0-9]{2}E)([0-9]{2,3})(.*)$ ]]; then
original_season="${BASH_REMATCH[2]}" # 原始季数
episode_number="${BASH_REMATCH[3]}" # 原始集数
# 只处理指定范围内的集数
if ((10#$episode_number >= 10#$start_episode && 10#$episode_number <= 10#$end_episode)); then
if [[ "$location_season" != "$original_season" ]]; then
echo "跳过无效集数: $(basename "$file")"
continue
fi
# 调整集数
new_episode_number=$((10#$episode_number + episode_adjust))
# 检查调整后的集数是否有效
if (( new_episode_number <= 0 )); then
echo "跳过无效集数: $(basename "$file")"
continue
fi
# 生成新的文件名
new_file="${BASH_REMATCH[1]}S${season}E$(printf "%02d" $new_episode_number)${BASH_REMATCH[4]}"
# 如果季数改变,将文件移动到临时目录中的新文件夹
if [[ "$original_season" != "S${season}E" ]]; then
new_folder="$temp_dir/Season_${season}"
mkdir -p "$new_folder"
mv "$file" "$new_folder/$new_file"
echo "重命名并移动到临时目录: $(basename "$file") -> $new_folder/$new_file"
else
# 如果季数没有改变,只将文件移动到临时目录
mv "$file" "$temp_dir/$new_file"
echo "重命名并移动到临时目录: $(basename "$file") -> $temp_dir/$new_file"
fi
else
echo "跳过不在范围内的文件: $(basename "$file")"
fi
fi
done
# 将临时目录中的文件移动到最终目标位置
for folder in "$temp_dir"/*; do
if [ -d "$folder" ]; then
destination="./$(basename "$folder")"
mkdir -p "$destination"
mv "$folder"/* "$destination"
echo "文件已移动到: $destination"
if [ -z "$(ls -A "$folder")" ]; then
rm -rf "$folder"
fi
else
mv "$folder" .
echo "文件已移动到当前目录: $(basename "$folder")"
fi
done
-help: 不跟参数,打印脚本帮助信息
-season:指定新的季度数(如 02 表示第二季)
-change:指定增减集数的数值(如 +3 或 -2)
-location:从 S01E11-E55 中提取开始和结束集数,处理单集则填S01E11-E11。
处理文件:当前目录下集数和季度在范围内的所有文件(不含子目录)。
季数改变:季数改变时,文件将被移动到新的文件夹。
集数调整:根据 -change 参数调整集数。
cd到处理的文件夹下,执行命令
./rnash.sh -season 02 -change +3 -location S01E11-E55
☛运行脚本效果,点我
root@debian:~# touch aaa.S03E20.KK.MP4 aaa.S03E21.KK.MP4 aaa.S03E22.KK.MP4
root@debian:~# bash /home/shh/rnane-s01-s02.sh -location S03E00-E555 -season 04 -change -2
创建临时目录:./temp_file
重命名并移动到临时目录: aaa.S03E20.KK.MP4 -> ./temp_file/Season_04/./aaa.S04E18.KK.MP4
重命名并移动到临时目录: aaa.S03E21.KK.MP4 -> ./temp_file/Season_04/./aaa.S04E19.KK.MP4
重命名并移动到临时目录: aaa.S03E22.KK.MP4 -> ./temp_file/Season_04/./aaa.S04E20.KK.MP4
文件已移动到: ./Season_04
临时目录 ./temp_file 为空,删除该目录
root@debian:~# cd Season_04
root@debian:~/Season_04# ls
aaa.S04E18.KK.MP4 aaa.S04E19.KK.MP4 aaa.S04E20.KK.MP4
root@debian:~/Season_04# bash /home/shh/rnane-s01-s02.sh -location S04E00-E555 -season 04 -change +100
创建临时目录:./temp_file
重命名并移动到临时目录: aaa.S04E18.KK.MP4 -> ./temp_file/./aaa.S04E118.KK.MP4
重命名并移动到临时目录: aaa.S04E19.KK.MP4 -> ./temp_file/./aaa.S04E119.KK.MP4
重命名并移动到临时目录: aaa.S04E20.KK.MP4 -> ./temp_file/./aaa.S04E120.KK.MP4
文件已移动到当前目录: aaa.S04E118.KK.MP4
文件已移动到当前目录: aaa.S04E119.KK.MP4
文件已移动到当前目录: aaa.S04E120.KK.MP4
临时目录 ./temp_file 为空,删除该目录
root@debian:~/Season_04# ls
aaa.S04E118.KK.MP4 aaa.S04E119.KK.MP4 aaa.S04E120.KK.MP4
pt站生成两个rss链接区别
你可以在RSS阅读器(如Google Reader)使用以下URL:xxx
你可以在支持RSS订阅功能的BT客户端(如uTorrent)使用以下URL:xxx
前者适合阅读,即只能获取种子信息,但不能获取带key的下载链接,即无法执行下载操作;
后者用于订阅下载种子,不仅能获取种子信息,还能获取带key的下载链接,可执行下载操作。
Comments | 1 条评论
博主 Julock
大佬,年份和分辨率交换,可以这么写:
这样可以匹配202x的所有年份