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