Переместить частично совпадающие файлы, которые уже существуют (транскодер Plex)

Переместить частично совпадающие файлы, которые уже существуют (транскодер Plex)

Я пытаюсь понять, как написать это как «стандартный» 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, я бы сделал что-то вроде следующего:

  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 — лучший способ или есть более быстрый способ? Рассмотрим этот:Копировать файлы в папку назначения можно только в том случае, если они уже существуют, но исходные файлы имеют другое расширение.)

Проверяем, существует ли файл, и пробуем разные комбинации расширений, если нет.

правка: там более 30 ТБ файлов, и 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, поскольку они могут:

  1. Коррумпированный
    введите описание изображения здесь
  2. Вымываются
    введите описание изображения здесь
  3. Без субтитров и/или глав
    введите описание изображения здесь
  4. не деинтерлейсинг
    введите описание изображения здесь
  5. с вшитыми субтитрами на языке, который вам или другому зрителю не нужен (больше)

Это зависит от известных ошибок или, возможно, входные данные не на 100% соответствуют необходимому профилю кодирования программного обеспечения для перекодирования или iGPU. Поэтому лучшим методом будет просмотр оптимизированных версий и замена их по отдельности. Потеря исходного файла может быть большей проблемой, чем экономия места для хранения. Если ваша цель — сэкономить место из-за затрат, не забывайте, что повторное перекодирование такого количества видео увеличивает счет за электроэнергию, а хранение становится все дешевле и дешевле с течением времени.

И наконецбольшинство перекодировок означает потерю качестваИ егонелегкая задача найти правильные параметры перекодировкисоответствующий вашим требованиям по качеству и размеру файла.

Связанный контент