diff --git a/gemini/core_actions.sh b/gemini/core_actions.sh index 1a1dee3..daa28f7 100644 --- a/gemini/core_actions.sh +++ b/gemini/core_actions.sh @@ -4,73 +4,30 @@ # Модуль действий: выполнение 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 выберет [Новое Аудио] по умолчанию. + # Мы больше не выводим echo здесь, так как это будет скрыто. + # Команда выполняется "молча". Ошибки в stderr все равно будут видны. 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() { + # Шаг 1: Готовим список файлов, как и раньше if ! logic_prepare_file_lists; then return 1; fi if [ ${#FILE_TRIPLETS[@]} -eq 0 ]; then ui_show_message "Запуск" "Нет файлов для обработки." @@ -93,31 +50,40 @@ run_processing() { 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 + # Шаг 2: Запускаем dialog в конвейере. + # Вся логика теперь находится внутри блока {...} для чистоты. + { + local total_files=${#FILE_TRIPLETS[@]} + local current_file_num=0 + + # Шаг 3: Используем цикл while с read для надежного разбора каждой строки + # Это более надежно, чем итерация по массиву сложных строк + while IFS=$'\t' read -r video audio output; do + # Увеличиваем счетчик В НАЧАЛЕ + ((current_file_num++)) + + # Рассчитываем прогресс ДО начала работы + local progress_before=$(( ((current_file_num - 1) * 100) / total_files )) + + # Обновляем текст и шкалу ПЕРЕД началом работы + echo "$progress_before" + echo -e "XXX\n($current_file_num/$total_files) Обработка:\n$(basename "$video")\nXXX" + + # Шаг 4: Выполняем работу. Вывод полностью скрываем. + case "$CURRENT_ACTION" in + "MERGE") + action_merge_mkv "$video" "$audio" "$output" >/dev/null 2>&1 ;; + "SYMLINK") + action_create_symlink "$video" "$output" >/dev/null 2>&1 ;; + esac + + done < <(printf "%s\n" "${FILE_TRIPLETS[@]}") # Превращаем массив в поток строк для read + + # Шаг 5: Финальное обновление до 100% + echo "100" + echo -e "XXX\nГотово!\nНажмите Enter\nXXX" + sleep 2 + + } | dialog "${DIALOG_OPTS[@]}" --title "Выполнение..." --gauge "Подготовка..." 10 70 0 clear }