#!/bin/bash #============================================================================== # Модуль действий: выполнение mkvmerge, создание симлинков и т.д. #============================================================================== action_merge_mkv() { local video_file="$1" local audio_file="$2" local output_file="$3" # Мы больше не выводим echo здесь, так как это будет скрыто. # Команда выполняется "молча". Ошибки в stderr все равно будут видны. mkvmerge \ -o "$output_file" \ --track-order 1:0,0:0 \ --language 0:rus "$audio_file" \ "$video_file" } action_create_symlink() { local video_file="$1" local output_file="$2" # Аналогично, выполняем молча. ln -s "$video_file" "$output_file" } # --- ПОЛНОСТЬЮ ПЕРЕРАБОТАННАЯ ФУНКЦИЯ ЗАПУСКА --- run_processing() { # Шаг 1: Готовим список файлов, как и раньше 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 # Шаг 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 }