すでに存在する部分的に一致するファイルを移動する (Plex トランスコーダ)

すでに存在する部分的に一致するファイルを移動する (Plex トランスコーダ)

これを「標準」の bash スクリプト (QNAP で実行) として記述する方法を考えていますが、どこから始めればよいかわかりません。NodeJS で記述することもできます (仕事で常に使用しているため) が、実際に何かあればよいと思います。

私は実際のスクリプトではなく、これを行う方法のヒントを探しています (ただし、それによって妨げられることはありません) ;-)

組み込みの Plex 変換ファイル (互換性などのため) を使用します。そのファイルへの入力は、さまざまなムービー ファイル (拡張子は一般的に .avi、.mp4、または .mkv) を含むフォルダー ツリーであり、その後、わずかに異なるパスで .mp4 ファイルに変換されます。

Plex 出力ファイルを入力ファイルにコピー (移動ではなく、Plex にクリーンアップさせます) したいです。

構造例 - から...

Plex バージョン/モバイル向けに最適化/My Tv Show/S01E01.mp4

...に...

私のテレビ番組 (1990-1995)/シーズン 1/s01e01 私のエピソード名.mkv

ノート:

  • 両方のルート パスは同じです (私の設定では、他の設定ではフォルダーPlex Versions内にフォルダーがある可能性がありますMy TV Show (1990-1995)。このスクリプトは完了すると GitHub にアップロードされます)。

  • テレビ番組名は変更される可能性があります。開始日と終了日 (または-継続中の場合は末尾の日付) を括弧で囲みます。Plex は「公式」名を使用しますが、同じ名前の番組が複数ある場合は開始年が含まれる場合があります。

  • 上記を念頭に置くと、同じ基本名で異なる年を持つ複数の番組がある可能性があります。

  • Season xターゲットのベース名はフォルダー内 (先頭の のないシーズン番号)にあり0、同じプレフィックスが付きます。

  • シーズン 0 の場合は、Specials/フォルダー内にある可能性があります (いつか一貫性を保つようにします)。

  • 元のファイル名が .mp4 の場合、コピーされたターゲット ファイルのファイル名は .m4v である必要があります。

  • 新しいファイルをコピーした後、元のファイルを削除できます (コピー元ファイルとコピー先ファイルは残ります)。

これを NodeJS で実行すると、次のようになります。

  1. テレビ番組フォルダーの並べ替えられたリストを取得します (通常、以前の番組には年がありませんが、後期の番組には年があります)。
  2. 各フォルダーの正規表現で、終了年 ( を に置き換えて開始年のみ/-\d*\)/""含め、大文字と小文字を区別せずに Plex フォルダーと一致させます。一致しない場合は、年なしで試してください。
  3. 一致するものが見つからない場合は、2 に戻って再試行してください。
  4. パターンに一致する Plex バージョン ファイルのリストを取得します/S\d+E\d+\.mp4/(すべてをリッピングしてストリームをフィルターしなかった場合は、字幕が含まれる可能性があります)。
  5. 各ファイルのシーズン番号を取得し、Season x同じプレフィックスのフォルダーを検索します。シーズン 0 の場合は、フォルダーも検索しますSpecials
  6. 一致した名前の拡張子を .mp4 に置き換えます。置き換えが行われない場合は、 .m4v に置き換えます。
  7. Plex ファイルを新しいパス + 名前にコピーします。
  8. 一致したファイルを削除し、5 に戻ります。

名前の変数は、明らかなリンク解除についても同様です。私が助けて欲しいのは、

最初のフォルダを一致させる最善の方法 (1-3 が最善の方法ですか、それとももっと良いショートカットがありますか? これを見てみましょう:ファイルが既に存在する場合のみ、ファイルを宛先フォルダにコピーします。ただし、ソースファイルのファイル拡張子が異なります。

ファイルが存在するかどうかを確認し、存在しない場合は別の拡張子の組み合わせを試します。

編集:30TB以上のファイルがあり、Plexはない元のファイルを置き換えます (2015 年からこれに対するリクエストがオープンになっています)。

答え1

個人的には、プライマリ Plex ライブラリ フォルダー内のファイルを変換するには、FFmpeg を使用することをお勧めします。次のような内容です。

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 に最適化されたバージョンは、次のような場合があるため、自動的に使用しないでください。

  1. 腐敗した
    ここに画像の説明を入力してください
  2. 洗い落とした
    ここに画像の説明を入力してください
  3. 字幕や章なし
    ここに画像の説明を入力してください
  4. インターレース解除されていない
    ここに画像の説明を入力してください
  5. あなたや他の視聴者が(もはや)望んでいない言語の字幕が焼き込まれている

これは既知のバグに依存します。あるいは、入力がトランスコーディング ソフトウェアまたは iGPU の必要なエンコード プロファイルに 100% 適合しない可能性もあります。したがって、最適化されたバージョンを表示して個別に置き換える方がよい方法です。元のファイルを失うことは、ストレージ スペースの節約よりも大きな問題になる可能性があります。コストのためにスペースを節約することが目的である場合は、多数のビデオを再トランスコーディングすると電気代が上昇し、ストレージは時間の経過とともにますます安価になることを忘れないでください。

そして最後に再トランスコードを行うと品質が低下するそしてその正しいトランスコーディングオプションを見つけるのは簡単なことではありません品質とファイル サイズのニーズに適合します。

関連情報