97f8b72251
Повторный запуск после докачки сезона не должен заново склеивать старые файлы. VIEW помечает такие серии как пропущенные. Co-authored-by: Cursor <cursoragent@cursor.com>
153 lines
6.0 KiB
Bash
153 lines
6.0 KiB
Bash
#!/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
|
|
}
|