Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bf11c57ac8 | |||
| 97f8b72251 |
+53
-3
@@ -35,7 +35,31 @@ run_processing() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local confirmation_text="Вы уверены, что хотите выполнить '${CURRENT_ACTION}' для ${#FILE_TRIPLETS[@]} файлов?\n\n"
|
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"
|
confirmation_text+="Результаты будут сохранены в:\n$OUTPUT_BASE_DIR"
|
||||||
if ! ui_confirm "Финальное подтверждение" "$confirmation_text"; then
|
if ! ui_confirm "Финальное подтверждение" "$confirmation_text"; then
|
||||||
ui_show_message "Отмена" "Операция отменена пользователем."
|
ui_show_message "Отмена" "Операция отменена пользователем."
|
||||||
@@ -52,6 +76,8 @@ run_processing() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Шаг 2: Выполнение с прогресс-баром (без изменений)
|
# Шаг 2: Выполнение с прогресс-баром (без изменений)
|
||||||
|
local conflict_file
|
||||||
|
conflict_file=$(mktemp)
|
||||||
{
|
{
|
||||||
local total_files=${#FILE_TRIPLETS[@]}
|
local total_files=${#FILE_TRIPLETS[@]}
|
||||||
local current_file_num=0
|
local current_file_num=0
|
||||||
@@ -61,6 +87,19 @@ run_processing() {
|
|||||||
local progress_before=$(( ((current_file_num - 1) * 100) / total_files ))
|
local progress_before=$(( ((current_file_num - 1) * 100) / total_files ))
|
||||||
|
|
||||||
echo "$progress_before"
|
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"
|
echo -e "XXX\n($current_file_num/$total_files) Обработка:\n$(basename "$video")\nXXX"
|
||||||
|
|
||||||
case "$CURRENT_ACTION" in
|
case "$CURRENT_ACTION" in
|
||||||
@@ -78,10 +117,18 @@ run_processing() {
|
|||||||
|
|
||||||
} | dialog "${DIALOG_OPTS[@]}" --title "Выполнение..." --gauge "Подготовка..." 10 70 0
|
} | 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: Показываем отчет о проделанной работе
|
# Шаг 3: Показываем отчет о проделанной работе
|
||||||
local action_text
|
local action_text
|
||||||
local total_processed=${#FILE_TRIPLETS[@]}
|
|
||||||
|
|
||||||
case "$CURRENT_ACTION" in
|
case "$CURRENT_ACTION" in
|
||||||
"MERGE")
|
"MERGE")
|
||||||
@@ -93,7 +140,10 @@ run_processing() {
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
local report_message="Статус: $action_text\n\n"
|
local report_message="Статус: $action_text\n\n"
|
||||||
report_message+="Обработано файлов: $total_processed\n"
|
report_message+="Обработано файлов: $pending_count\n"
|
||||||
|
if [ "$skip_count" -gt 0 ]; then
|
||||||
|
report_message+="Пропущено (уже есть): $skip_count\n"
|
||||||
|
fi
|
||||||
report_message+="Результаты сохранены в:\n$OUTPUT_BASE_DIR"
|
report_message+="Результаты сохранены в:\n$OUTPUT_BASE_DIR"
|
||||||
|
|
||||||
ui_show_message "Отчёт о выполнении" "$report_message"
|
ui_show_message "Отчёт о выполнении" "$report_message"
|
||||||
|
|||||||
+78
-8
@@ -71,6 +71,58 @@ logic_prepare_file_lists() {
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
logic_check_output_paths || return 1
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Уже готовый результат: обычный файл или симлинк (в том числе битый).
|
||||||
|
# Каталог сюда не входит: это не серия, а ошибка пути.
|
||||||
|
output_file_exists() {
|
||||||
|
local path="$1"
|
||||||
|
[[ -f "$path" || -L "$path" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Одинаковые имена и путь-каталог ломают пропуск: вторая серия увидела бы
|
||||||
|
# файл, созданный первой, и отчёт засчитал бы её как уже готовую.
|
||||||
|
logic_check_output_paths() {
|
||||||
|
local -A seen=()
|
||||||
|
local triplet video audio output
|
||||||
|
local -a dir_errors=()
|
||||||
|
local -a dup_errors=()
|
||||||
|
|
||||||
|
for triplet in "${FILE_TRIPLETS[@]}"; do
|
||||||
|
IFS=$'\t' read -r video audio output <<< "$triplet"
|
||||||
|
if [[ -d "$output" && ! -L "$output" ]]; then
|
||||||
|
dir_errors+=("$(basename "$video") → $output")
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [[ -n ${seen["$output"]+x} ]]; then
|
||||||
|
dup_errors+=("$(basename "${seen[$output]}") и $(basename "$video") → $(basename "$output")")
|
||||||
|
else
|
||||||
|
seen["$output"]="$video"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ${#dir_errors[@]} -gt 0 ]; then
|
||||||
|
local text="Путь вывода указывает на каталог, а не на файл:\n\n"
|
||||||
|
local line
|
||||||
|
for line in "${dir_errors[@]}"; do
|
||||||
|
text+="$line\n"
|
||||||
|
done
|
||||||
|
ui_show_message "Ошибка" "$text"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${#dup_errors[@]} -gt 0 ]; then
|
||||||
|
local text="Несколько серий получают одно и то же имя:\n\n"
|
||||||
|
local line
|
||||||
|
for line in "${dup_errors[@]}"; do
|
||||||
|
text+="$line\n"
|
||||||
|
done
|
||||||
|
ui_show_message "Ошибка" "$text"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,22 +157,40 @@ logic_show_preview() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local preview_text="РЕЖИМ: $CURRENT_ACTION\nБудут обработаны следующие файлы (${#FILE_TRIPLETS[@]} шт.):\n\n"
|
local body=""
|
||||||
local count=1
|
local count=1
|
||||||
|
local skip_count=0
|
||||||
for triplet in "${FILE_TRIPLETS[@]}"; do
|
for triplet in "${FILE_TRIPLETS[@]}"; do
|
||||||
IFS=$'\t' read -r video audio output <<< "$triplet"
|
IFS=$'\t' read -r video audio output <<< "$triplet"
|
||||||
preview_text+="$(printf "%02d" $count). \n"
|
body+="$(printf "%02d" $count). \n"
|
||||||
|
|
||||||
|
local exists=false
|
||||||
|
if output_file_exists "$output"; then
|
||||||
|
exists=true
|
||||||
|
skip_count=$((skip_count + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$CURRENT_ACTION" == "MERGE" ]; then
|
if [ "$CURRENT_ACTION" == "MERGE" ]; then
|
||||||
preview_text+=" \ZbВИДЕО:\Zn $(basename "$video")\n"
|
body+=" \ZbВИДЕО:\Zn $(basename "$video")\n"
|
||||||
preview_text+=" \ZbАУДИО:\Zn $(basename "$audio")\n"
|
body+=" \ZbАУДИО:\Zn $(basename "$audio")\n"
|
||||||
preview_text+=" \Zb-> ВЫВОД:\Zn $(basename "$output")\n\n"
|
body+=" \Zb-> ВЫВОД:\Zn $(basename "$output")\n"
|
||||||
else # SYMLINK
|
else # SYMLINK
|
||||||
preview_text+=" \ZbИСТОЧНИК:\Zn $(basename "$video")\n"
|
body+=" \ZbИСТОЧНИК:\Zn $(basename "$video")\n"
|
||||||
preview_text+=" \Zb-> ССЫЛКА:\Zn $(basename "$output")\n\n"
|
body+=" \Zb-> ССЫЛКА:\Zn $(basename "$output")\n"
|
||||||
fi
|
fi
|
||||||
((count++))
|
|
||||||
|
if $exists; then
|
||||||
|
body+=" \Z3ПРОПУСК:\Zn операция пропущена — файл уже есть\n\n"
|
||||||
|
else
|
||||||
|
body+="\n"
|
||||||
|
fi
|
||||||
|
count=$((count + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
|
local pending=$((${#FILE_TRIPLETS[@]} - skip_count))
|
||||||
|
local preview_text="РЕЖИМ: $CURRENT_ACTION\n"
|
||||||
|
preview_text+="К обработке: $pending, пропуск (уже есть): $skip_count\n\n"
|
||||||
|
preview_text+="$body"
|
||||||
|
|
||||||
ui_show_message "Предпросмотр" "$preview_text"
|
ui_show_message "Предпросмотр" "$preview_text"
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-1
@@ -118,7 +118,13 @@ main() {
|
|||||||
case "$choice" in
|
case "$choice" in
|
||||||
V) VIDEO_SRC_DIR=$(ui_get_directory "Выберите каталог с видеофайлами" "$VIDEO_SRC_DIR" "$DEFAULT_TORRENTS_DIR") ;;
|
V) VIDEO_SRC_DIR=$(ui_get_directory "Выберите каталог с видеофайлами" "$VIDEO_SRC_DIR" "$DEFAULT_TORRENTS_DIR") ;;
|
||||||
A) AUDIO_SRC_DIR=$(ui_get_directory "Выберите каталог с аудиофайлами" "$AUDIO_SRC_DIR" "$VIDEO_SRC_DIR") ;;
|
A) AUDIO_SRC_DIR=$(ui_get_directory "Выберите каталог с аудиофайлами" "$AUDIO_SRC_DIR" "$VIDEO_SRC_DIR") ;;
|
||||||
O) OUTPUT_BASE_DIR=$(ui_get_directory "Выберите БАЗОВЫЙ каталог для результата" "$OUTPUT_BASE_DIR" "$DEFAULT_ARCHIVE_DIR") ;;
|
O)
|
||||||
|
OUTPUT_BASE_DIR=$(ui_get_directory "Выберите БАЗОВЫЙ каталог для результата" "$OUTPUT_BASE_DIR" "$DEFAULT_ARCHIVE_DIR")
|
||||||
|
OUTPUT_BASE_DIR="${OUTPUT_BASE_DIR%/}"
|
||||||
|
if [[ -z "$OUTPUT_SERIES_NAME" && -n "$OUTPUT_BASE_DIR" ]]; then
|
||||||
|
OUTPUT_SERIES_NAME=$(basename -- "$OUTPUT_BASE_DIR")
|
||||||
|
fi
|
||||||
|
;;
|
||||||
N) OUTPUT_SERIES_NAME=$(ui_get_input "Введите имя сериала для Plex" "$OUTPUT_SERIES_NAME") ;;
|
N) OUTPUT_SERIES_NAME=$(ui_get_input "Введите имя сериала для Plex" "$OUTPUT_SERIES_NAME") ;;
|
||||||
S) SEASON_NUMBER=$(ui_get_input "Введите номер сезона (например, 01, 02)" "$SEASON_NUMBER") ;;
|
S) SEASON_NUMBER=$(ui_get_input "Введите номер сезона (например, 01, 02)" "$SEASON_NUMBER") ;;
|
||||||
P) VIDEO_FILE_PATTERN=$(ui_get_input "Введите шаблон для поиска видео (*.mkv, *ep*.mkv)" "$VIDEO_FILE_PATTERN") ;;
|
P) VIDEO_FILE_PATTERN=$(ui_get_input "Введите шаблон для поиска видео (*.mkv, *ep*.mkv)" "$VIDEO_FILE_PATTERN") ;;
|
||||||
|
|||||||
Reference in New Issue
Block a user