116 lines
4.1 KiB
Python
116 lines
4.1 KiB
Python
"""Splitter service that calls the core audio_splitter logic."""
|
|
|
|
import os
|
|
import sys
|
|
import time
|
|
from pathlib import Path
|
|
from types import SimpleNamespace
|
|
from typing import Dict, List, Any
|
|
|
|
from backend.config import settings
|
|
from backend.services.task_manager import task_manager
|
|
from backend.services.file_manager import FileManager
|
|
from backend.models.request import TracklistEntry
|
|
from backend.models.response import TaskStatus
|
|
|
|
# Import central defaults
|
|
from audio_splitter.defaults import (
|
|
DEFAULT_FORMAT,
|
|
DEFAULT_OUTPUT_TEMPLATE,
|
|
DEFAULT_REPLACEMENT_CHAR,
|
|
DEFAULT_BAD_CHARS,
|
|
DEFAULT_ALBUM,
|
|
DEFAULT_COMMENT,
|
|
DEFAULT_NO_COMMENT,
|
|
DEFAULT_COMMENT_STREAM,
|
|
DEFAULT_MERGE_COMMENTS,
|
|
DEFAULT_COMMENT_SEPARATOR,
|
|
DEFAULT_DROP_VIDEO,
|
|
DEFAULT_DROP_SUBS,
|
|
DEFAULT_NUMBER_TRACKS,
|
|
DEFAULT_REPLACE_BAD_CHARS,
|
|
DEFAULT_SKIP_EXISTING,
|
|
DEFAULT_DELETE_ORIGINAL,
|
|
DEFAULT_TRANSCODE_TO,
|
|
)
|
|
|
|
|
|
def run_split_task(task_id: str, tracklist: List[TracklistEntry], options: Dict[str, Any]) -> None:
|
|
try:
|
|
task_manager.update_task_with_progress(task_id, progress=5, message="Initializing...")
|
|
|
|
input_path = FileManager.get_input_path(task_id)
|
|
if not input_path or not input_path.exists():
|
|
raise RuntimeError(f"Input file not found for task {task_id}")
|
|
|
|
output_dir = FileManager.ensure_output_dir(task_id)
|
|
|
|
# Convert tracklist to dicts (CLI format)
|
|
tracks = []
|
|
for entry in tracklist:
|
|
track_dict = {
|
|
"ts": entry.ts,
|
|
"tn": entry.tn or "",
|
|
"an": entry.an or "",
|
|
"al": entry.al or "",
|
|
"date": entry.date or "",
|
|
"ext": entry.ext or ""
|
|
}
|
|
tracks.append(track_dict)
|
|
|
|
# Build args namespace using defaults where options not provided
|
|
args = SimpleNamespace(
|
|
format=options.get("format", DEFAULT_FORMAT),
|
|
transcode_to=options.get("transcode_to", DEFAULT_TRANSCODE_TO),
|
|
drop_video=options.get("drop_video", DEFAULT_DROP_VIDEO),
|
|
drop_subs=options.get("drop_subs", DEFAULT_DROP_SUBS),
|
|
number_tracks=options.get("number_tracks", DEFAULT_NUMBER_TRACKS),
|
|
replace_bad_chars=options.get("replace_bad_chars", DEFAULT_REPLACE_BAD_CHARS),
|
|
replacement_char=options.get("replacement_char", DEFAULT_REPLACEMENT_CHAR),
|
|
bad_chars=options.get("bad_chars", DEFAULT_BAD_CHARS),
|
|
skip_existing=options.get("skip_existing", DEFAULT_SKIP_EXISTING),
|
|
output_template=options.get("output_template", DEFAULT_OUTPUT_TEMPLATE),
|
|
album=options.get("album", DEFAULT_ALBUM),
|
|
comment=options.get("comment", DEFAULT_COMMENT),
|
|
no_comment=options.get("no_comment", DEFAULT_NO_COMMENT),
|
|
comment_stream=options.get("comment_stream", DEFAULT_COMMENT_STREAM),
|
|
merge_comments=options.get("merge_comments", DEFAULT_MERGE_COMMENTS),
|
|
comment_separator=options.get("comment_separator", DEFAULT_COMMENT_SEPARATOR),
|
|
delete_original=DEFAULT_DELETE_ORIGINAL, # never delete in web
|
|
)
|
|
|
|
project_root = Path(__file__).parent.parent.parent.parent
|
|
if str(project_root) not in sys.path:
|
|
sys.path.insert(0, str(project_root))
|
|
|
|
from audio_splitter.core import split_audio
|
|
|
|
task_manager.update_task_with_progress(task_id, progress=10, message="Starting split...")
|
|
|
|
split_audio(str(input_path), str(output_dir), tracks, args)
|
|
|
|
output_files = FileManager.get_output_files(task_id)
|
|
|
|
task_manager.update_task_with_progress(
|
|
task_id,
|
|
progress=100,
|
|
message="Split complete",
|
|
status=TaskStatus.DONE
|
|
)
|
|
|
|
task_manager.update_task(
|
|
task_id,
|
|
tracks=output_files
|
|
)
|
|
|
|
time.sleep(0.5)
|
|
|
|
except Exception as e:
|
|
task_manager.update_task_with_progress(
|
|
task_id,
|
|
progress=0,
|
|
message="Split failed",
|
|
status=TaskStatus.ERROR,
|
|
error=str(e)
|
|
)
|