#!/bin/bash #============================================================================== # Модуль действий: выполнение mkvmerge, создание симлинков и т.д. #============================================================================== # Функция для склейки видео и аудио # $1: Исходный видеофайл # $2: Исходный аудиофайл # $3: Выходной файл action_merge_mkv() { local video_file="$1" local audio_file="$2" local output_file="$3" echo "---" echo "ИСХОДНОЕ ВИДЕО : $video_file" echo "ИСХОДНОЕ АУДИО : $audio_file" echo "РЕЗУЛЬТАТ : $output_file" # --- ИЗМЕНЕННАЯ КОМАНДА MKVMERGE --- # Порядок изменен для того, чтобы новая аудиодорожка была первой по счету. # # 1. Сначала в команду передается аудиофайл (он становится "файлом 0" для mkvmerge). # 2. Затем передается видеофайл (он становится "файлом 1"). # # 3. Опция --track-order 1:0,0:0 приказывает mkvmerge собрать итоговый файл в таком порядке: # - Сначала взять дорожку 0 из файла 1 (предположительно, это видео). # - Затем взять дорожку 0 из файла 0 (это наша новая звуковая дорожка). # - Все остальные дорожки из видеофайла (оригинальный звук, субтитры) будут добавлены после. # # 4. --language 0:rus устанавливает русский язык для дорожки 0 из файла 0 (нашей новой дорожки). # # В результате итоговый файл будет иметь структуру: [Видео], [Новое Аудио], [Старое Аудио], ... # Plex выберет [Новое Аудио] по умолчанию. mkvmerge \ -o "$output_file" \ --track-order 1:0,0:0 \ --language 0:rus "$audio_file" \ "$video_file" if [ $? -eq 0 ]; then echo "УСПЕХ: Файл создан." else echo "ОШИБКА: mkvmerge завершился с ошибкой." fi echo } # Функция для создания символической ссылки # (Эта функция остается без изменений) action_create_symlink() { local video_file="$1" local output_file="$2" echo "---" echo "ИСТОЧНИК: $video_file" echo "ССЫЛКА : $output_file" ln -s "$video_file" "$output_file" if [ $? -eq 0 ]; then echo "УСПЕХ: Ссылка создана." else echo "ОШИБКА: Не удалось создать ссылку." fi echo } # Главная функция запуска обработки # (Эта функция остается без изменений) run_processing() { if ! logic_prepare_file_lists; then return 1; fi if [ ${#FILE_TRIPLETS[@]} -eq 0 ]; then ui_show_message "Запуск" "Нет файлов для обработки." return fi local confirmation_text="Вы уверены, что хотите выполнить '${CURRENT_ACTION}' для ${#FILE_TRIPLETS[@]} файлов?\n\n" confirmation_text+="Результаты будут сохранены в:\n$OUTPUT_BASE_DIR" if ! ui_confirm "Финальное подтверждение" "$confirmation_text"; then ui_show_message "Отмена" "Операция отменена пользователем." return fi if [ ! -d "$OUTPUT_BASE_DIR" ]; then if ui_confirm "Создание каталога" "Каталог '$OUTPUT_BASE_DIR' не существует. Создать его?"; then mkdir -p "$OUTPUT_BASE_DIR" if [ $? -ne 0 ]; then ui_show_message "Ошибка" "Не удалось создать каталог."; return; fi else ui_show_message "Отмена" "Операция отменена."; return fi fi local total_files=${#FILE_TRIPLETS[@]} local current_file=0 ( for triplet in "${FILE_TRIPLETS[@]}"; do progress=$(( 100 * current_file / total_files )) echo "$progress" local video_for_display IFS=$'\t' read -r video_for_display _ _ <<< "$triplet" echo -e "XXX\n$((current_file + 1)) / $total_files\nОбработка: $(basename "$video_for_display")\nXXX" IFS=$'\t' read -r video audio output <<< "$triplet" case "$CURRENT_ACTION" in "MERGE") action_merge_mkv "$video" "$audio" "$output" ;; "SYMLINK") action_create_symlink "$video" "$output" ;; esac ((current_file++)) done echo "100" echo -e "XXX\nГотово!\nНажмите Enter\nXXX"; sleep 2 ) | dialog "${DIALOG_OPTS[@]}" --title "Выполнение..." --gauge "Подготовка..." 10 70 0 clear }