我試圖弄清楚如何將其編寫為“標準”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 所需的編碼設定檔。所以更好的方法是查看優化版本並單獨替換。遺失原始檔案可能是比節省儲存空間更大的問題。如果您的目標是因為成本而節省空間,請不要忘記,重新轉碼如此多的影片會增加電費,並且隨著時間的推移,儲存會變得越來越便宜。
最後大多數重新轉碼意味著品質下降和它的找到正確的轉碼選項並不是一件容易的事滿足您對品質和檔案大小的需求。