From 2c13e7cc850342b7465bc298080a7eee33290164 Mon Sep 17 00:00:00 2001 From: gahusb Date: Fri, 8 May 2026 22:50:13 +0900 Subject: [PATCH] =?UTF-8?q?fix(music-lab):=20pipeline=20=EC=98=A4=EB=94=94?= =?UTF-8?q?=EC=98=A4=20=EA=B2=BD=EB=A1=9C=20+=20ffmpeg=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EA=B0=80=EC=8B=9C=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - orchestrator._run_video: track.file_path 우선 사용 (audio_url 변환 불필요) - _local_path: /media/music/ → /app/data/ (마운트가 /app/data 직접이라 music 서브디렉토리 없음) - video.py/thumb.py: stderr truncation [-800:]/[-500:] — 진짜 에러 보이게 --- music-lab/app/pipeline/orchestrator.py | 9 ++++++--- music-lab/app/pipeline/thumb.py | 2 +- music-lab/app/pipeline/video.py | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/music-lab/app/pipeline/orchestrator.py b/music-lab/app/pipeline/orchestrator.py index cebe7e2..a842f2c 100644 --- a/music-lab/app/pipeline/orchestrator.py +++ b/music-lab/app/pipeline/orchestrator.py @@ -104,7 +104,7 @@ async def _run_cover(p, track, feedback): async def _run_video(p, track): setup = db.get_youtube_setup() vd = setup["visual_defaults"] - audio_path = _local_path(track.get("audio_url", "")) + audio_path = track.get("file_path") or _local_path(track.get("audio_url", "")) cover_path = _local_path(p["cover_url"]) out = video.generate( pipeline_id=p["id"], audio_path=audio_path, cover_path=cover_path, @@ -162,14 +162,17 @@ async def _run_publish(p, track): def _local_path(media_url: str) -> str: - """ /media/videos/123/cover.jpg → /app/data/videos/123/cover.jpg """ + """ /media/videos/123/cover.jpg → /app/data/videos/123/cover.jpg + /media/music/abc.mp3 → /app/data/abc.mp3 (music mount at /app/data, no subdir) + """ if not media_url: return "" base_media = os.getenv("VIDEO_MEDIA_BASE", "/media/videos") base_data = os.getenv("VIDEO_DATA_DIR", "/app/data/videos") if media_url.startswith(base_media): return media_url.replace(base_media, base_data, 1) - # /media/music/abc.mp3 → /app/data/music/abc.mp3 + if media_url.startswith("/media/music/"): + return media_url.replace("/media/music/", "/app/data/", 1) return media_url.replace("/media/", "/app/data/", 1) diff --git a/music-lab/app/pipeline/thumb.py b/music-lab/app/pipeline/thumb.py index ab99146..19865e0 100644 --- a/music-lab/app/pipeline/thumb.py +++ b/music-lab/app/pipeline/thumb.py @@ -21,7 +21,7 @@ def generate(*, pipeline_id: int, video_path: str, "-ss", "00:00:05", "-vframes", "1", "-q:v", "2", out_path] result = subprocess.run(cmd, capture_output=True, text=True, timeout=THUMB_TIMEOUT_S) if result.returncode != 0: - raise ThumbGenerationError(f"ffmpeg 썸네일 실패: {result.stderr[:300]}") + raise ThumbGenerationError(f"ffmpeg 썸네일 실패: {result.stderr[-500:]}") if overlay_text and track_title: _overlay_title(out_path, track_title) diff --git a/music-lab/app/pipeline/video.py b/music-lab/app/pipeline/video.py index b62baf9..2e66dff 100644 --- a/music-lab/app/pipeline/video.py +++ b/music-lab/app/pipeline/video.py @@ -30,7 +30,7 @@ def generate(*, pipeline_id: int, audio_path: str, cover_path: str, logger.info("ffmpeg 실행: %s", " ".join(cmd)) result = subprocess.run(cmd, capture_output=True, text=True, timeout=VIDEO_TIMEOUT_S) if result.returncode != 0: - raise VideoGenerationError(f"ffmpeg 실패: {result.stderr[:500]}") + raise VideoGenerationError(f"ffmpeg 실패: {result.stderr[-800:]}") return { "url": storage.media_url(pipeline_id, "video.mp4"),