#!/bin/bash #============================================================================== # Универсальный скрипт для обработки медиафайлов с TUI-интерфейсом #============================================================================== # --- Подключение модулей --- # Убедимся, что скрипты-модули находятся в том же каталоге SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) source "$SCRIPT_DIR/core_ui.sh" source "$SCRIPT_DIR/core_logic.sh" source "$SCRIPT_DIR/core_actions.sh" # --- Конфигурация по умолчанию (можно менять) --- # Эти пути будут предлагаться по умолчанию в диалогах выбора DEFAULT_ROOT_PATH="/var/www/nextcloud/data/grayhook/files/" DEFAULT_TORRENTS_DIR="${DEFAULT_ROOT_PATH}/Torrents" DEFAULT_ARCHIVE_DIR="${DEFAULT_ROOT_PATH}/Archive/Anime" # --- Переменные состояния (будут меняться через интерфейс) --- VIDEO_SRC_DIR="" AUDIO_SRC_DIR="" OUTPUT_BASE_DIR="" OUTPUT_SERIES_NAME="" SEASON_NUMBER="01" # Паттерны для поиска файлов (можно использовать find-совместимые wildcards) VIDEO_FILE_PATTERN="*.mkv" AUDIO_FILE_PATTERN="*.mka" # Регулярное выражение для извлечения номера серии из ИМЕНИ ВИДЕОФАЙЛА # Использует синтаксис ERE (sed -E). Группа захвата (в скобках) должна поймать номер. EPISODE_NUMBER_REGEX='.* ([0-9]{2}) .*' # Шаблон для имени выходного файла. Заполнители будут заменены. # {SERIES_NAME} - Имя сериала # {SEASON} - Номер сезона (с ведущим нулём) # {EPISODE} - Номер эпизода (с ведущим нулём, извлечённый regex'ом) OUTPUT_FILENAME_TEMPLATE="{SERIES_NAME} s{SEASON}e{EPISODE}.mkv" # --- Главный цикл программы --- main() { while true; do # Формируем пункты меню с текущими значениями menu_items=( "V" "Видео каталог : ${VIDEO_SRC_DIR:-_не задан_}" "A" "Аудио каталог : ${AUDIO_SRC_DIR:-_не задан_}" "O" "Выходной каталог : ${OUTPUT_BASE_DIR:-_не задан_}" "N" "Имя для Plex : ${OUTPUT_SERIES_NAME:-_не задано_}" "S" "Номер сезона : $SEASON_NUMBER" "" "--- Шаблоны и Regex ---" "P" "Шаблон видеофайлов : $VIDEO_FILE_PATTERN" "U" "Шаблон аудиофайлов : $AUDIO_FILE_PATTERN" "R" "Regex номера серии : $EPISODE_NUMBER_REGEX" "T" "Шаблон имени вывода : $OUTPUT_FILENAME_TEMPLATE" "" "--- Действия ---" "VIEW" "Предпросмотр сопоставления файлов" "RUN" "ЗАПУСТИТЬ обработку" ) choice=$(ui_main_menu "${menu_items[@]}") # Выход из скрипта по кнопке Cancel или Esc if [[ -z "$choice" ]]; then clear echo "Выход." break fi case "$choice" in 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") ;; O) OUTPUT_BASE_DIR=$(ui_get_directory "Выберите БАЗОВЫЙ каталог для результата" "$OUTPUT_BASE_DIR" "$DEFAULT_ARCHIVE_DIR") ;; N) OUTPUT_SERIES_NAME=$(ui_get_input "Введите имя сериала для Plex" "$OUTPUT_SERIES_NAME") ;; S) SEASON_NUMBER=$(ui_get_input "Введите номер сезона (например, 01, 02)" "$SEASON_NUMBER") ;; P) VIDEO_FILE_PATTERN=$(ui_get_input "Введите шаблон для поиска видео (*.mkv, *ep*.mkv)" "$VIDEO_FILE_PATTERN") ;; U) AUDIO_FILE_PATTERN=$(ui_get_input "Введите шаблон для поиска аудио (*.mka, *.ac3)" "$AUDIO_FILE_PATTERN") ;; R) EPISODE_NUMBER_REGEX=$(ui_get_input "Введите ERE-regex для номера серии" "$EPISODE_NUMBER_REGEX") ;; T) OUTPUT_FILENAME_TEMPLATE=$(ui_get_input "Введите шаблон имени выходного файла" "$OUTPUT_FILENAME_TEMPLATE") ;; VIEW) # Вызываем предпросмотр logic_show_preview ;; RUN) # Вызываем меню выбора действия и запускаем обработку run_processing ;; esac done } # --- Точка входа --- # Проверка наличия dialog if ! command -v dialog &> /dev/null; then echo "Команда 'dialog' не найдена. Пожалуйста, установите ее." echo "sudo apt-get install dialog (Debian/Ubuntu)" exit 1 fi main