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.

124 lines
5.2 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, создание симлинков и т.д.
#==============================================================================
# Функция для склейки видео и аудио
# $1: Исходный видеофайл
# $2: Исходный аудиофайл
# $3: Выходной файл
action_merge_mkv() {
local video_file="$1"
local audio_file="$2"
local output_file="$3"
echo "---"
echo "ИСХОДНОЕ ВИДЕО : $video_file"
echo "ИСХОДНОЕ АУДИО : $audio_file"
echo "РЕЗУЛЬТАТ : $output_file"
# --- ИЗМЕНЕННАЯ КОМАНДА MKVMERGE ---
# Порядок изменен для того, чтобы новая аудиодорожка была первой по счету.
#
# 1. Сначала в команду передается аудиофайл (он становится "файлом 0" для mkvmerge).
# 2. Затем передается видеофайл (он становится "файлом 1").
#
# 3. Опция --track-order 1:0,0:0 приказывает mkvmerge собрать итоговый файл в таком порядке:
# - Сначала взять дорожку 0 из файла 1 (предположительно, это видео).
# - Затем взять дорожку 0 из файла 0 (это наша новая звуковая дорожка).
# - Все остальные дорожки из видеофайла (оригинальный звук, субтитры) будут добавлены после.
#
# 4. --language 0:rus устанавливает русский язык для дорожки 0 из файла 0 (нашей новой дорожки).
#
# В результате итоговый файл будет иметь структуру: [Видео], [Новое Аудио], [Старое Аудио], ...
# Plex выберет [Новое Аудио] по умолчанию.
mkvmerge \
-o "$output_file" \
--track-order 1:0,0:0 \
--language 0:rus "$audio_file" \
"$video_file"
if [ $? -eq 0 ]; then
echo "УСПЕХ: Файл создан."
else
echo "ОШИБКА: mkvmerge завершился с ошибкой."
fi
echo
}
# Функция для создания символической ссылки
# (Эта функция остается без изменений)
action_create_symlink() {
local video_file="$1"
local output_file="$2"
echo "---"
echo "ИСТОЧНИК: $video_file"
echo "ССЫЛКА : $output_file"
ln -s "$video_file" "$output_file"
if [ $? -eq 0 ]; then
echo "УСПЕХ: Ссылка создана."
else
echo "ОШИБКА: Не удалось создать ссылку."
fi
echo
}
# Главная функция запуска обработки
# (Эта функция остается без изменений)
run_processing() {
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
local total_files=${#FILE_TRIPLETS[@]}
local current_file=0
(
for triplet in "${FILE_TRIPLETS[@]}"; do
progress=$(( 100 * current_file / total_files ))
echo "$progress"
local video_for_display
IFS=$'\t' read -r video_for_display _ _ <<< "$triplet"
echo -e "XXX\n$((current_file + 1)) / $total_files\nОбработка: $(basename "$video_for_display")\nXXX"
IFS=$'\t' read -r video audio output <<< "$triplet"
case "$CURRENT_ACTION" in
"MERGE")
action_merge_mkv "$video" "$audio" "$output" ;;
"SYMLINK")
action_create_symlink "$video" "$output" ;;
esac
((current_file++))
done
echo "100"
echo -e "XXX\nГотово!\nНажмите Enter\nXXX"; sleep 2
) | dialog "${DIALOG_OPTS[@]}" --title "Выполнение..." --gauge "Подготовка..." 10 70 0
clear
}