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.

127 lines
5.6 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
#==============================================================================
# Модуль основной логики: поиск файлов, сопоставление, генерация имён
#==============================================================================
declare -a FILE_TRIPLETS
# Функция стала "умной" и проверяет CURRENT_ACTION
logic_prepare_file_lists() {
FILE_TRIPLETS=()
local common_params_ok=true
if [[ -z "$VIDEO_SRC_DIR" || -z "$OUTPUT_BASE_DIR" || -z "$OUTPUT_SERIES_NAME" ]]; then
common_params_ok=false
fi
local video_list_raw
if $common_params_ok; then
mapfile -d '' video_list_raw < <(find "$VIDEO_SRC_DIR" -maxdepth 1 -name "$VIDEO_FILE_PATTERN" -print0 | sort -z)
fi
# РЕЖИМ: СКЛЕЙКА
if [ "$CURRENT_ACTION" == "MERGE" ]; then
if ! $common_params_ok || [[ -z "$AUDIO_SRC_DIR" ]]; then
ui_show_message "Ошибка" "Для склейки должны быть заданы все каталоги (видео, аудио, вывод) и имя сериала."
return 1
fi
if [ ${#video_list_raw[@]} -eq 0 ]; then
ui_show_message "Ошибка" "Видеофайлы по шаблону '$VIDEO_FILE_PATTERN' не найдены."
return 1
fi
local audio_list_raw
mapfile -d '' audio_list_raw < <(find "$AUDIO_SRC_DIR" -name "$AUDIO_FILE_PATTERN" -print0 | sort -z)
if [ ${#audio_list_raw[@]} -eq 0 ]; then
ui_show_message "Ошибка" "Аудиофайлы по шаблону '$AUDIO_FILE_PATTERN' не найдены."
return 1
fi
if [ ${#video_list_raw[@]} -ne ${#audio_list_raw[@]} ]; then
ui_show_message "Ошибка" "Количество видео (${#video_list_raw[@]}) и аудио (${#audio_list_raw[@]}) не совпадает."
return 1
fi
for i in "${!video_list_raw[@]}"; do
local video_file="${video_list_raw[$i]}"
local audio_file="${audio_list_raw[$i]}"
local output_path
output_path=$(logic_generate_output_name "$video_file") || return 1
FILE_TRIPLETS+=("$video_file"$'\t'"$audio_file"$'\t'"$output_path")
done
# РЕЖИМ: СИМЛИНКИ
elif [ "$CURRENT_ACTION" == "SYMLINK" ]; then
if ! $common_params_ok; then
ui_show_message "Ошибка" "Для симлинков должны быть заданы каталог видео, каталог вывода и имя сериала."
return 1
fi
if [ ${#video_list_raw[@]} -eq 0 ]; then
ui_show_message "Ошибка" "Видеофайлы по шаблону '$VIDEO_FILE_PATTERN' не найдены."
return 1
fi
for video_file in "${video_list_raw[@]}"; do
local output_path
output_path=$(logic_generate_output_name "$video_file") || return 1
# --- ИСПРАВЛЕНИЕ ЗДЕСЬ: ИСПОЛЬЗУЕМ ЯВНЫЙ ЗАПОЛНИТЕЛЬ ---
# Это гарантирует, что `read` всегда увидит три поля.
local placeholder="__SYMLINK_AUDIO_PLACEHOLDER__"
FILE_TRIPLETS+=("$video_file"$'\t'"$placeholder"$'\t'"$output_path")
done
fi
return 0
}
# Вспомогательная функция для генерации имени, чтобы не дублировать код
logic_generate_output_name() {
local video_file="$1"
local video_basename
video_basename=$(basename "$video_file")
if [[ "$video_basename" =~ $EPISODE_NUMBER_REGEX ]]; then
local episode_num
episode_num=$(printf "%02d" "$((10#${BASH_REMATCH[1]}))")
local output_name="$OUTPUT_FILENAME_TEMPLATE"
output_name="${output_name/\{SERIES_NAME\}/$OUTPUT_SERIES_NAME}"
output_name="${output_name/\{SEASON\}/$SEASON_NUMBER}"
output_name="${output_name/\{EPISODE\}/$episode_num}"
echo "${OUTPUT_BASE_DIR}/${output_name}"
return 0
else
ui_show_message "Ошибка Regex" "Не удалось извлечь номер эпизода из файла:\n$video_basename\n\nС помощью регулярного выражения:\n$EPISODE_NUMBER_REGEX"
return 1
fi
}
# Предпросмотр теперь будет работать правильно
logic_show_preview() {
if ! logic_prepare_file_lists; then return 1; fi
if [ ${#FILE_TRIPLETS[@]} -eq 0 ]; then
ui_show_message "Предпросмотр" "Нет файлов для обработки по текущим настройкам."
return
fi
local preview_text="РЕЖИМ: $CURRENT_ACTION\nБудут обработаны следующие файлы (${#FILE_TRIPLETS[@]} шт.):\n\n"
local count=1
for triplet in "${FILE_TRIPLETS[@]}"; do
IFS=$'\t' read -r video audio output <<< "$triplet"
preview_text+="$(printf "%02d" $count). \n"
if [ "$CURRENT_ACTION" == "MERGE" ]; then
preview_text+=" \ZbВИДЕО:\Zn $(basename "$video")\n"
preview_text+=" \ZbАУДИО:\Zn $(basename "$audio")\n"
preview_text+=" \Zb-> ВЫВОД:\Zn $(basename "$output")\n\n"
else # SYMLINK
preview_text+=" \ZbИСТОЧНИК:\Zn $(basename "$video")\n"
preview_text+=" \Zb-> ССЫЛКА:\Zn $(basename "$output")\n\n"
fi
((count++))
done
ui_show_message "Предпросмотр" "$preview_text"
}