我试图弄清楚如何将其编写为“标准”bash 脚本(在 QNAP 上运行),但不确定从哪里开始 - 我可以在 NodeJS 中完成(因为我一直在工作中使用它) ,但真的宁愿拥有一些东西。
我正在寻找如何执行此操作的指针,而不是实际的脚本(尽管不要让这阻止您);-)
使用内置的 Plex 转换文件(出于兼容性等目的) - 输入一个包含各种电影文件的文件夹树(扩展名最常见的是 .avi、.mp4 或 .mkv),然后将其转换为 .mp4 文件一条略有不同的道路。
我想将 Plex 输出文件复制(而不是移动 - 我会让 Plex 清理自己的混乱)回输入文件。
示例结构 - 来自...
Plex 版本/针对移动设备进行了优化/我的电视节目/S01E01.mp4
...到...
我的电视节目 (1990-1995)/第 1 季/s01e01 我的剧集名称.mkv
笔记:
两者的根路径是相同的(对于我的设置,其他人可能在文件夹
Plex Versions
内有该文件夹My TV Show (1990-1995)
- 完成后此脚本将在 GitHub 上发布等)。电视节目名称可能会更改。我将开始日期和结束日期(
-
如果正在进行,则将其放在后面)放在括号中。 Plex 将使用“官方”名称,如果有多个同名节目,该名称可能会有一个开始年份。考虑到上述内容,我可能有多个具有相同基本名称但年份不同的节目。
目标基本名称将位于
Season x
文件夹中(不带前导的季号0
)并具有相同的前缀。如果是第 0 季,那么它可能会在
Specials/
文件夹中(我会在某个时候使事情保持一致)。如果原始文件名具有 .mp4 文件名,则复制的目标文件必须具有 .m4v 文件名。
复制新文件后,可以删除原始文件(保留复制源文件和目标文件)。
如果我在 NodeJS 中执行此操作,我会执行如下操作:
- 获取电视节目文件夹的排序列表(早期的节目通常没有年份,而后来的节目则有)。
- 对于每个文件夹,用正则表达式替换结束年份(
/-\d*\)/
以""
仅包含开始年份,并且不区分大小写地匹配 Plex 文件夹。如果不匹配,则尝试不包含年份。 - 如果未找到匹配项,请返回 2 并重试。
- 获取与模式匹配的 Plex 版本文件列表
/S\d+E\d+\.mp4/
(可能包含我刚刚翻录所有内容且未过滤流时的字幕)。 - 对于每个文件,获取季号,然后在
Season x
文件夹中搜索相同的前缀。如果是第 0 季,则还要搜索该Specials
文件夹。 - 将匹配名称上的扩展名替换为 .mp4,如果未进行替换,则将其替换为 .m4v。
- 将 Plex 文件复制到新路径+名称。
- 删除匹配的文件,然后返回5。
现在我可以做的名称变量,对于明显的取消链接也是如此 - 我想要帮助的是 -
使初始文件夹匹配的最佳方法(1-3 是最好的方法,还是有更好的快捷方式?看看这个:仅当文件已存在时才将文件复制到目标文件夹。但源文件具有不同的文件扩展名)
检查文件是否存在,如果不存在则尝试不同的扩展名组合。
编辑:有超过 30tb 的文件,Plex 确实如此不是替换原始文件(自 2015 年以来一直有公开请求)。
答案1
我个人建议使用 FFmpeg 转换主 Plex 库文件夹中的文件。大致如下:
set -s globstar;
for f in ./**/*.{avi,mp4,mkv}; do
ffmpeg -i "$f" -c:a aac -c:v libx264 -preset slow "${f%.*}_b.mp4"
rm "$f"
mv "${f%.*}_b.mp4" "${f%.*}.mp4"
done
您还可以将 Plex 设置为将优化版本存储在原始文件的目录中。
话虽这么说,这段代码可能做你正在寻找的事情,但它完全未经测试:
Plex_Main="/Main/Plex/Dir/"
Optimized="/Optimized/Versions/Dir/"
for DIR in "$Optimized"/*; do
if [[ -d "$DIR" ]]; then
SHOW_MATCHES=("$Plex_Main"/*"$(basename "$DIR")"*/)
# If there is one, and only one, match
if [[ ${#SHOW_MATCHES[@]} -eq 1 ]]; then
# The non-optimized show path
SHOW_PATH="$Plex_Main"/*"$(basename "${DIR[0]}")"*
for f in "$DIR"/*.mp4; do
# Remove file extension
EP_ID="${f%.*}"
EP_MATCHES=("$SHOW_PATH"/*"${EP_ID[0]}"*)
if [[ ${#EP_MATCHES[@]} -eq 1 ]]; then
ORIG_FILE="${EP_MATCHES[0]}"
cp "$f" "$SHOW_PATH/${ORIG_FILE%.*}.mp4"
fi
done
fi
fi
done
答案2
您不应自动使用 Plex 优化版本,因为它们可能是:
这取决于已知的错误,或者输入可能不 100% 适合转码软件或 iGPU 所需的编码配置文件。所以更好的方法是查看优化版本并单独替换。丢失原始文件可能是比节省存储空间更大的问题。如果您的目标是因为成本而节省空间,请不要忘记,重新转码如此多的视频会增加电费,并且随着时间的推移,存储会变得越来越便宜。
最后大多数重新转码意味着质量下降和它的找到正确的转码选项并不是一件容易的事满足您对质量和文件大小的需求。