97 lines
4.4 KiB
Python
97 lines
4.4 KiB
Python
|
|
import os
|
||
|
|
import gc
|
||
|
|
from batch.utils.settings_check import check_settings
|
||
|
|
from batch.utils.video_processor import process_video
|
||
|
|
from core.utils.config_utils import load_key, update_key
|
||
|
|
import pandas as pd
|
||
|
|
from rich.console import Console
|
||
|
|
from rich.panel import Panel
|
||
|
|
import time
|
||
|
|
import shutil
|
||
|
|
|
||
|
|
console = Console()
|
||
|
|
|
||
|
|
def record_and_update_config(source_language, target_language):
|
||
|
|
original_source_lang = load_key('whisper.language')
|
||
|
|
original_target_lang = load_key('target_language')
|
||
|
|
|
||
|
|
if source_language and not pd.isna(source_language):
|
||
|
|
update_key('whisper.language', source_language)
|
||
|
|
if target_language and not pd.isna(target_language):
|
||
|
|
update_key('target_language', target_language)
|
||
|
|
|
||
|
|
return original_source_lang, original_target_lang
|
||
|
|
|
||
|
|
def process_batch():
|
||
|
|
if not check_settings():
|
||
|
|
raise Exception("Settings check failed")
|
||
|
|
|
||
|
|
df = pd.read_excel('batch/tasks_setting.xlsx')
|
||
|
|
for index, row in df.iterrows():
|
||
|
|
if pd.isna(row['Status']) or 'Error' in str(row['Status']):
|
||
|
|
total_tasks = len(df)
|
||
|
|
video_file = row['Video File']
|
||
|
|
|
||
|
|
if not pd.isna(row['Status']) and 'Error' in str(row['Status']):
|
||
|
|
console.print(Panel(f"Retrying failed task: {video_file}\nTask {index + 1}/{total_tasks}",
|
||
|
|
title="[bold yellow]Retry Task", expand=False))
|
||
|
|
|
||
|
|
# Restore files from batch/output/ERROR to output
|
||
|
|
error_folder = os.path.join('batch', 'output', 'ERROR', os.path.splitext(video_file)[0])
|
||
|
|
|
||
|
|
if os.path.exists(error_folder):
|
||
|
|
# Ensure the output folder exists
|
||
|
|
os.makedirs('output', exist_ok=True)
|
||
|
|
|
||
|
|
# Copy all contents from ERROR folder for the specific video to output
|
||
|
|
for item in os.listdir(error_folder):
|
||
|
|
src_path = os.path.join(error_folder, item)
|
||
|
|
dst_path = os.path.join('output', item)
|
||
|
|
|
||
|
|
if os.path.isdir(src_path):
|
||
|
|
if os.path.exists(dst_path):
|
||
|
|
shutil.rmtree(dst_path)
|
||
|
|
shutil.copytree(src_path, dst_path)
|
||
|
|
else:
|
||
|
|
if os.path.exists(dst_path):
|
||
|
|
os.remove(dst_path)
|
||
|
|
shutil.copy2(src_path, dst_path)
|
||
|
|
|
||
|
|
console.print(f"[green]Restored files from ERROR folder for {video_file}")
|
||
|
|
else:
|
||
|
|
console.print(f"[yellow]Warning: Error folder not found: {error_folder}")
|
||
|
|
else:
|
||
|
|
console.print(Panel(f"Now processing task: {video_file}\nTask {index + 1}/{total_tasks}",
|
||
|
|
title="[bold blue]Current Task", expand=False))
|
||
|
|
|
||
|
|
source_language = row['Source Language']
|
||
|
|
target_language = row['Target Language']
|
||
|
|
|
||
|
|
original_source_lang, original_target_lang = record_and_update_config(source_language, target_language)
|
||
|
|
|
||
|
|
try:
|
||
|
|
dubbing = 0 if pd.isna(row['Dubbing']) else int(row['Dubbing'])
|
||
|
|
is_retry = not pd.isna(row['Status']) and 'Error' in str(row['Status'])
|
||
|
|
status, error_step, error_message = process_video(video_file, dubbing, is_retry)
|
||
|
|
status_msg = "Done" if status else f"Error: {error_step} - {error_message}"
|
||
|
|
except Exception as e:
|
||
|
|
status_msg = f"Error: Unhandled exception - {str(e)}"
|
||
|
|
console.print(f"[bold red]Error processing {video_file}: {status_msg}")
|
||
|
|
finally:
|
||
|
|
update_key('whisper.language', original_source_lang)
|
||
|
|
update_key('target_language', original_target_lang)
|
||
|
|
|
||
|
|
df.at[index, 'Status'] = status_msg
|
||
|
|
df.to_excel('batch/tasks_setting.xlsx', index=False)
|
||
|
|
|
||
|
|
gc.collect()
|
||
|
|
|
||
|
|
time.sleep(1)
|
||
|
|
else:
|
||
|
|
print(f"Skipping task: {row['Video File']} - Status: {row['Status']}")
|
||
|
|
|
||
|
|
console.print(Panel("All tasks processed!\nCheck out in `batch/output`!",
|
||
|
|
title="[bold green]Batch Processing Complete", expand=False))
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
process_batch()
|