#!/bin/bash #============================================================================== # Модуль действий: выполнение mkvmerge, создание симлинков и т.д. #============================================================================== # ... (функции action_merge_mkv и action_create_symlink остаются без изменений) action_merge_mkv() { local video_file="$1" local audio_file="$2" local final_output_file="$3" mkvmerge \ -o "$TEMP_MERGE_FILE" \ --track-order 1:0,0:0 \ --language 0:rus "$audio_file" \ "$video_file" \ && \ mv "$TEMP_MERGE_FILE" "$final_output_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 skip_count=0 local pending_count=0 local triplet video audio output # Снимок на момент старта. Файл, появившийся уже в этом запуске, # нельзя считать «и так был» — иначе отчёт завысит число обработанных. local -A ALREADY_PRESENT=() for triplet in "${FILE_TRIPLETS[@]}"; do IFS=$'\t' read -r video audio output <<< "$triplet" if output_file_exists "$output"; then ALREADY_PRESENT["$output"]=1 skip_count=$((skip_count + 1)) else pending_count=$((pending_count + 1)) fi done if [ "$pending_count" -eq 0 ]; then ui_show_message "Запуск" "Все файлы уже есть в каталоге вывода ($skip_count шт.). Обработка не требуется." return fi local confirmation_text="Вы уверены, что хотите выполнить '${CURRENT_ACTION}' для ${pending_count} файлов?\n\n" if [ "$skip_count" -gt 0 ]; then confirmation_text+="Будет пропущено (уже есть): $skip_count\n\n" fi 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: Выполнение с прогресс-баром (без изменений) local conflict_file conflict_file=$(mktemp) { local total_files=${#FILE_TRIPLETS[@]} local current_file_num=0 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" if [[ -n ${ALREADY_PRESENT["$output"]+x} ]]; then echo -e "XXX\n($current_file_num/$total_files) Пропуск (уже есть):\n$(basename "$output")\nXXX" continue fi if output_file_exists "$output"; then printf '%s' "$output" > "$conflict_file" echo -e "XXX\nОшибка: имя занято во время обработки:\n$(basename "$output")\nXXX" sleep 1 exit 0 fi echo -e "XXX\n($current_file_num/$total_files) Обработка:\n$(basename "$video")\nXXX" 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[@]}") echo "100" echo -e "XXX\nГотово!\nНажмите Enter\nXXX" sleep 2 } | dialog "${DIALOG_OPTS[@]}" --title "Выполнение..." --gauge "Подготовка..." 10 70 0 if [[ -s "$conflict_file" ]]; then local conflict_path conflict_path=$(cat "$conflict_file") rm -f "$conflict_file" ui_show_message "Ошибка" "Файл появился во время обработки и не входил в список уже существующих:\n$conflict_path\n\nОбработка остановлена." return 1 fi rm -f "$conflict_file" # --- НОВЫЙ БЛОК: ФИНАЛЬНЫЙ ОТЧЕТ --- # Шаг 3: Показываем отчет о проделанной работе local action_text case "$CURRENT_ACTION" in "MERGE") action_text="Склейка файлов завершена." ;; "SYMLINK") action_text="Создание символических ссылок завершено." ;; esac local report_message="Статус: $action_text\n\n" report_message+="Обработано файлов: $pending_count\n" if [ "$skip_count" -gt 0 ]; then report_message+="Пропущено (уже есть): $skip_count\n" fi report_message+="Результаты сохранены в:\n$OUTPUT_BASE_DIR" ui_show_message "Отчёт о выполнении" "$report_message" clear }