Я пытаюсь понять, как написать это как «стандартный» 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 — лучший способ или есть более быстрый способ? Рассмотрим этот:Копировать файлы в папку назначения можно только в том случае, если они уже существуют, но исходные файлы имеют другое расширение.)
Проверяем, существует ли файл, и пробуем разные комбинации расширений, если нет.
правка: там более 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, поскольку они могут:
- Коррумпированный
- Вымываются
- Без субтитров и/или глав
- не деинтерлейсинг
- с вшитыми субтитрами на языке, который вам или другому зрителю не нужен (больше)
Это зависит от известных ошибок или, возможно, входные данные не на 100% соответствуют необходимому профилю кодирования программного обеспечения для перекодирования или iGPU. Поэтому лучшим методом будет просмотр оптимизированных версий и замена их по отдельности. Потеря исходного файла может быть большей проблемой, чем экономия места для хранения. Если ваша цель — сэкономить место из-за затрат, не забывайте, что повторное перекодирование такого количества видео увеличивает счет за электроэнергию, а хранение становится все дешевле и дешевле с течением времени.
И наконецбольшинство перекодировок означает потерю качестваИ егонелегкая задача найти правильные параметры перекодировкисоответствующий вашим требованиям по качеству и размеру файла.