You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
4.1 KiB
Bash

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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
}