
=== 2026-06-01 14:16:53 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/_input.json -o /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8 -cg 2 -cs 2 --skip-feishu --profile __runtime_batch-20260601-141653-6e03e8 --target-language zh --step1-only ===
[profile] ✅ Loaded profile '__runtime_batch-20260601-141653-6e03e8' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260601-141653-6e03e8.yaml
[   INFO   ] MusicExtractorSVM: no classifier models were configured by default
[   INFO   ] On connection Flux::flux → IIR::signal:
[   INFO   ] BUFFER SIZE MISMATCH: max=0 - asked for read size 4096
[   INFO   ] resizing buffer to 36040/4505
[   INFO   ] FrameCutter: dropping incomplete frame
[   INFO   ] On connection Flux::flux → IIR::signal:
[   INFO   ] BUFFER SIZE MISMATCH: max=0 - asked for read size 4096
[   INFO   ] resizing buffer to 36040/4505
[   INFO   ] FrameCutter: dropping incomplete frame
/usr/local/lib/python3.13/dist-packages/scipy/cluster/hierarchy.py:810: ClusterWarning: The symmetric non-negative hollow observation matrix looks suspiciously like an uncondensed distance matrix
  return linkage(y, method='ward', metric='euclidean')
/usr/local/lib/python3.13/dist-packages/scipy/cluster/hierarchy.py:810: ClusterWarning: The symmetric non-negative hollow observation matrix looks suspiciously like an uncondensed distance matrix
  return linkage(y, method='ward', metric='euclidean')

======================================================================
music-pipeline3000 v2 | 5 songs
======================================================================
Gemini concurrency: 2 | Suno concurrency: 2
Output: /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8
Skip Suno: False | Step1 only: True | Version: v4
======================================================================

[14:16:55] 🏥 Health check...
[14:16:56] ✅ qishui: OK
[14:16:56] ✅ netease: OK
[14:16:56] ✅ qq: OK

[14:16:56] 🔍 [01_Take Me Home, Country Roads_20260601] Step 0: Fetching...
[14:16:56] 🔍 [02_Jolene_20260601] Step 0: Fetching...
[14:16:56] 🔍 [03_Ring of Fire_20260601] Step 0: Fetching...
[14:16:56] 🔍 [04_The Gambler_20260601] Step 0: Fetching...
[14:16:56] 🔍 [05_Friends in Low Places_20260601] Step 0: Fetching...
[14:17:13] ✅ [02_Jolene_20260601] Step 0: qq | 1189c lyrics
[14:17:13] ⬇️  [02_Jolene_20260601] Step 0.5: Download from qq...
[14:17:14] ✅ [01_Take Me Home, Country Roads_20260601] Step 0: qq | 1215c lyrics
[14:17:14] ⬇️  [01_Take Me Home, Country Roads_20260601] Step 0.5: Download from qq...
[14:17:18] ✅ [03_Ring of Fire_20260601] Step 0: qq | 991c lyrics
[14:17:18] ⬇️  [03_Ring of Fire_20260601] Step 0.5: Download from qq...
[14:17:22] ✅ [02_Jolene_20260601] Step 0.5: 3791542 bytes | 162.3s
[14:17:22] 🔬 [02_Jolene_20260601] Step 0.75: Audio features...
[14:17:30] ✅ [04_The Gambler_20260601] Step 0: qq | 2168c lyrics
[14:17:30] ⬇️  [04_The Gambler_20260601] Step 0.5: Download from qq...
[14:17:30] ✅ [03_Ring of Fire_20260601] Step 0.5: 4033311 bytes | 155.7s
[14:17:30] 🔬 [03_Ring of Fire_20260601] Step 0.75: Audio features...
[14:17:36] ✅ [05_Friends in Low Places_20260601] Step 0: qq | 1744c lyrics
[14:17:36] ⬇️  [05_Friends in Low Places_20260601] Step 0.5: Download from qq...
[14:17:42] ✅ [04_The Gambler_20260601] Step 0.5: 5250564 bytes | 214.9s
[14:17:42] 🔬 [04_The Gambler_20260601] Step 0.75: Audio features...
[14:17:42] ✅ [05_Friends in Low Places_20260601] Step 0.5: 2621175 bytes | 265.2s
[14:17:42] 🔬 [05_Friends in Low Places_20260601] Step 0.75: Audio features...
[14:17:48] ✅ [01_Take Me Home, Country Roads_20260601] Step 0.5: 4743766 bytes | 192.1s
[14:17:48] 🔬 [01_Take Me Home, Country Roads_20260601] Step 0.75: Audio features...
[14:17:53] ✅ [02_Jolene_20260601] Step 0.75: BPM=110.24 Key=C# major (31.2s)
[14:17:53] 🧠 [02_Jolene_20260601] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-06-01T06:17:53.360Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "02_Jolene_20260601", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/02_Jolene_20260601/song_pgc.mp3", "has_features": true}}
[14:17:53] 🌐 Step 1: target_language=zh (injecting override directive)
[14:17:54] ✅ [03_Ring of Fire_20260601] Step 0.75: BPM=104.82 Key=G major (23.3s)
[14:17:54] 🧠 [03_Ring of Fire_20260601] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-06-01T06:17:54.106Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "03_Ring of Fire_20260601", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/03_Ring of Fire_20260601/song_pgc.mp3", "has_features": true}}
[   INFO   ] On connection Flux::flux → IIR::signal:
[   INFO   ] BUFFER SIZE MISMATCH: max=0 - asked for read size 4096
[   INFO   ] resizing buffer to 36040/4505
[   INFO   ] FrameCutter: dropping incomplete frame
[   INFO   ] On connection Flux::flux → IIR::signal:
[   INFO   ] BUFFER SIZE MISMATCH: max=0 - asked for read size 4096
[   INFO   ] resizing buffer to 36040/4505
/usr/local/lib/python3.13/dist-packages/scipy/cluster/hierarchy.py:810: ClusterWarning: The symmetric non-negative hollow observation matrix looks suspiciously like an uncondensed distance matrix
  return linkage(y, method='ward', metric='euclidean')
[14:17:54] 🌐 Step 1: target_language=zh (injecting override directive)
[14:18:28] ✅ [04_The Gambler_20260601] Step 0.75: BPM=172.27 Key=D# minor (34.8s)
[14:18:28] 🧠 [04_The Gambler_20260601] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-06-01T06:18:28.155Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "04_The Gambler_20260601", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/04_The Gambler_20260601/song_pgc.mp3", "has_features": true}}
[   INFO   ] On connection Flux::flux → IIR::signal:
[   INFO   ] BUFFER SIZE MISMATCH: max=0 - asked for read size 4096
[   INFO   ] resizing buffer to 36040/4505
[   INFO   ] FrameCutter: dropping incomplete frame
/usr/local/lib/python3.13/dist-packages/scipy/cluster/hierarchy.py:810: ClusterWarning: The symmetric non-negative hollow observation matrix looks suspiciously like an uncondensed distance matrix
  return linkage(y, method='ward', metric='euclidean')
[14:18:28] 🌐 Step 1: target_language=zh (injecting override directive)
[14:18:42] ✅ [05_Friends in Low Places_20260601] Step 0.75: BPM=108.63 Key=E major (47.9s)
[14:18:42] 🧠 [05_Friends in Low Places_20260601] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-06-01T06:18:42.081Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "05_Friends in Low Places_20260601", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/05_Friends in Low Places_20260601/song_pgc.mp3", "has_features": true}}
/usr/local/lib/python3.13/dist-packages/scipy/cluster/hierarchy.py:810: ClusterWarning: The symmetric non-negative hollow observation matrix looks suspiciously like an uncondensed distance matrix
  return linkage(y, method='ward', metric='euclidean')
[14:18:42] 🌐 Step 1: target_language=zh (injecting override directive)
  ⚠️ Gemini official 503 on key #1/5, will retry...
  🔄 Retry 1/4 in 3s...
[14:18:52] ✅ [01_Take Me Home, Country Roads_20260601] Step 0.75: BPM=164.21 Key=A major (24.6s)
[14:18:52] 🧠 [01_Take Me Home, Country Roads_20260601] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-06-01T06:18:52.764Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "01_Take Me Home, Country Roads_20260601", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/01_Take Me Home, Country Roads_20260601/song_pgc.mp3", "has_features": true}}
[14:18:52] 🌐 Step 1: target_language=zh (injecting override directive)
  ⚠️ Gemini official 503 on key #2/5, will retry...
  🔄 Retry 2/4 in 3s...
  ⚠️ Gemini official 503 on key #1/5, will retry...
  🔄 Retry 1/4 in 3s...
  ⚠️ Gemini official 503 on key #2/5, will retry...
  🔄 Retry 2/4 in 3s...
  ⚠️ Gemini official 503 on key #3/5, will retry...
  🔄 Retry 3/4 in 3s...
  ⚠️ Gemini official 503 on key #4/5, will retry...
  🔄 Retry 4/4 in 3s...
  ⚠️ Gemini official 503 on key #5/5, will retry...
{"__trace__": true, "ts": "2026-06-01T06:19:30.609Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "03_Ring of Fire_20260601", "step": "step1", "type": "api_call", "provider": "gemini", "model": "gemini-2.5-pro", "duration_sec": 1.8, "cost_usd": null, "status": "http_503"}
{"__trace__": true, "ts": "2026-06-01T06:19:30.610Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "03_Ring of Fire_20260601", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 96.503}
[14:19:30] ❌ [03_Ring of Fire_20260601] Step 1: http_503 (1.8s)
  ⚠️ Gemini official 503 on key #1/5, will retry...
  🔄 Retry 1/4 in 3s...
  ⚠️ Gemini official 503 on key #2/5, will retry...
  🔄 Retry 2/4 in 3s...
  ⚠️ Gemini official 503 on key #3/5, will retry...
  🔄 Retry 3/4 in 3s...
  ⚠️ Gemini official 503 on key #4/5, will retry...
  🔄 Retry 4/4 in 3s...
  📊 Gemini official: 66s | prompt_tokens=8977 completion=1521
{"__trace__": true, "ts": "2026-06-01T06:20:05.419Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "02_Jolene_20260601", "step": "step1", "type": "api_call", "provider": "gemini", "model": "gemini-2.5-pro", "duration_sec": 66.2, "cost_usd": null, "status": "success"}
{"__trace__": true, "ts": "2026-06-01T06:20:05.419Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "02_Jolene_20260601", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 132.058}
[14:20:05] ✅ [02_Jolene_20260601] Step 1: 66.2s | prompt=892c | prompt_ok=True lyrics_ok=True
  ⚠️ Gemini official 503 on key #5/5, will retry...
{"__trace__": true, "ts": "2026-06-01T06:20:15.910Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "04_The Gambler_20260601", "step": "step1", "type": "api_call", "provider": "gemini", "model": "gemini-2.5-pro", "duration_sec": 8.7, "cost_usd": null, "status": "http_503"}
{"__trace__": true, "ts": "2026-06-01T06:20:15.910Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "04_The Gambler_20260601", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 107.755}
[14:20:15] ❌ [04_The Gambler_20260601] Step 1: http_503 (8.7s)
  ⚠️ Gemini official 503 on key #1/5, will retry...
  🔄 Retry 1/4 in 3s...
  ⚠️ Gemini official 503 on key #1/5, will retry...
  🔄 Retry 1/4 in 3s...
  ⚠️ Gemini official 503 on key #2/5, will retry...
  🔄 Retry 2/4 in 3s...
  ⚠️ Gemini official 503 on key #2/5, will retry...
  🔄 Retry 2/4 in 3s...
  ⚠️ Gemini official 503 on key #3/5, will retry...
  🔄 Retry 3/4 in 3s...
  ⚠️ Gemini official 503 on key #3/5, will retry...
  🔄 Retry 3/4 in 3s...
  ⚠️ Gemini official 503 on key #4/5, will retry...
  🔄 Retry 4/4 in 3s...
  ⚠️ Gemini official 503 on key #4/5, will retry...
  🔄 Retry 4/4 in 3s...
  ⚠️ Gemini official 503 on key #5/5, will retry...
{"__trace__": true, "ts": "2026-06-01T06:21:20.479Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "01_Take Me Home, Country Roads_20260601", "step": "step1", "type": "api_call", "provider": "gemini", "model": "gemini-2.5-pro", "duration_sec": 19.1, "cost_usd": null, "status": "http_503"}
{"__trace__": true, "ts": "2026-06-01T06:21:20.479Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "01_Take Me Home, Country Roads_20260601", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 147.716}
[14:21:20] ❌ [01_Take Me Home, Country Roads_20260601] Step 1: http_503 (19.1s)
  ⚠️ Gemini official 503 on key #5/5, will retry...
{"__trace__": true, "ts": "2026-06-01T06:21:20.483Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "05_Friends in Low Places_20260601", "step": "step1", "type": "api_call", "provider": "gemini", "model": "gemini-2.5-pro", "duration_sec": 19.9, "cost_usd": null, "status": "http_503"}
{"__trace__": true, "ts": "2026-06-01T06:21:20.483Z", "trace_id": "batch-20260601-141653-6e03e8", "song_key": "05_Friends in Low Places_20260601", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 158.401}
[14:21:20] ❌ [05_Friends in Low Places_20260601] Step 1: http_503 (19.9s)

======================================================================
SUMMARY | 264s (4.4min)
======================================================================
✅ Done: 1 | ⏳ Awaiting Step 2: 0 | ❌ Failed: 4
[MasterDB] ✅ 批次 batch-20260601-141653-6e03e8 → +0 新增, ~0 更新 | 总计 776 首
[exit 0]

=== 2026-06-01 14:21:21 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/orchestrate_phase2.py /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8 --profile __runtime_batch-20260601-141653-6e03e8 --resume-mode end --skip-feishu --target-language zh ===
[phase2] batch=batch-20260601-141653-6e03e8 pending=1 groups=1
[phase2] group 1/1 -> 02_Jolene_20260601
[profile] ✅ Loaded profile '__runtime_batch-20260601-141653-6e03e8' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260601-141653-6e03e8.yaml
[phase2] 🌐 02_Jolene_20260601: target_language=zh
[phase2] resume -> /usr/bin/python3 /srv/repos/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/_manifest.json --resume /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8 --profile __runtime_batch-20260601-141653-6e03e8 --skip-feishu
[14:21:22] 🌐 [02_Jolene_20260601] Step 2: target_language=zh → lang_mode=ZH | single-turn
[14:21:22] 🤖 [02_Jolene_20260601] Step 2 Turn 2: 16392 chars ≈ 4098 tokens → claude-sonnet-4-6
[14:22:03] ⚠️  [02_Jolene_20260601] Step 2 API: originality 83% < 85% | 3 copied phrases
          ❗ "provides immediate resolution, reinforcing the directness of the plea. Over the V chord , the melody holds the 3rd, creating a strong pull back to the tonic.)" ~ "provides immediate resolution, reinforcing the directness of the plea. Over the V chord , the melody holds the 3rd, creating a strong pull back to the tonic.)" (100%)
          ❗ ", contrasting with the chorus's direct resolution and reflecting a shift in lyrical strategy from begging to explaining.)" ~ ", contrasting with the chorus's direct resolution and reflecting a shift in lyrical strategy from begging to explaining.)" (100%)
          ❗ "provides immediate resolution. Over the V chord , the melody holds the 3rd, creating a strong pull back to the tonic.)" ~ "provides immediate resolution. Over the V chord , the melody holds the 3rd, creating a strong pull back to the tonic.)" (100%)
[14:22:03] 🔄 [02_Jolene_20260601] Step 2 API: originality retry 1/3...
[14:22:47] ⚠️  [02_Jolene_20260601] Step 2 API originality retry 1 failed: Expecting value: line 1 column 1 (char 0)
[14:22:47] ⚠️  [02_Jolene_20260601] Step 2 API: best originality 83% after 3 retries
[14:22:47] ✅ [02_Jolene_20260601] Step 2 API: 《借来的人》 engine=? | 41.8s | in=11089 out=2328 | ~$0.068
{"timestamp": "2026-06-01T14:21:21.854078+08:00", "batch_dir": "/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8", "profile": "__runtime_batch-20260601-141653-6e03e8", "concurrency": 3, "resume_mode": "end", "pending_song_count": 1, "groups": [{"group_index": 1, "songs": ["/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/02_Jolene_20260601"], "success_count": 1, "failed_count": 0, "results": [{"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/02_Jolene_20260601", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/02_Jolene_20260601/step2_json_b.json", "agent_summary": "API direct: 借来的人", "returncode": 0, "stderr": "", "attempt": 1, "attempts": [{"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/02_Jolene_20260601", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/02_Jolene_20260601/step2_json_b.json", "agent_summary": "API direct: 借来的人", "returncode": 0, "stderr": "", "attempt": 1}]}]}], "resume": {"status": "success", "returncode": 0, "stdout_tail": "er_20260601] Step 1: 61.3s | prompt=836c | prompt_ok=True lyrics_ok=True\n[14:25:27] 🌐 [04_The Gambler_20260601] Step 2: target_language=auto → lang_mode=EN | single-turn\n[14:25:27] 🤖 [04_The Gambler_20260601] Step 2 Turn 2: 17507 chars ≈ 4376 tokens → claude-sonnet-4-6\n[14:25:59] ⚠️  [05_Friends in Low Places_20260601] Step 2 API: originality 55% < 85% | 1 copied phrases\n          ❗ \", resolving downwards on \"beer chases\".)\" ~ \", resolving downwards on \"beer chases\".)\" (100%)\n[14:25:59] 🔄 [05_Friends in Low Places_20260601] Step 2 API: originality retry 1/3...\n[14:26:07] ⚠️  [03_Ring of Fire_20260601] Step 2 API originality retry 2 failed: Expecting value: line 1 column 1 (char 0)\n[14:26:07] ⚠️  [03_Ring of Fire_20260601] Step 2 API: best originality 61% after 3 retries\n[14:26:07] ✅ [03_Ring of Fire_20260601] Step 2 API: 《Dust and Ruin》 engine=? | 79.1s | in=24180 out=4186 | ~$0.135\n[14:26:07] ⚠️  [03_Ring of Fire_20260601] Step 2.5: originality 61% < 75% | 0 copied phrases\n[14:26:07] ⏳ [03_Ring of Fire_20260601] Step 2: 原创度不足，等待人审豁免或重试\n[14:26:20] ⚠️  [04_The Gambler_20260601] Step 2 API: originality 55% < 85% | 1 copied phrases\n          ❗ \"and subdominant , creating a sense of travel; the i-iv pattern repeats to establish motion.)\" ~ \"and subdominant , creating a sense of travel; the i-iv pattern repeats to establish motion.)\" (100%)\n[14:26:20] 🔄 [04_The Gambler_20260601] Step 2 API: originality retry 1/3...\n  🎵 fa017645... → complete\n[14:26:36]    🎧 [02_Jolene_20260601] Song 1: https://cdn1.suno.ai/fa017645-0107-4689-b16c-2898189f197b.mp3\n[14:26:36]    🎧 [02_Jolene_20260601] Song 2: https://cdn1.suno.ai/bfac6a85-2466-4017-a4c1-9d251e901957.mp3\n[14:26:36] 🎛️ [02_Jolene_20260601] Step 3.5: 混音...\n[14:26:56]    🎚️ [02_Jolene_20260601] Song 1: pop | 低28/中68/高4%\n[14:26:56] ⚠️  [05_Friends in Low Places_20260601] Step 2 API retry 1: originality 58%\n[14:26:56] 🔄 [05_Friends in Low Places_20260601] Step 2 API: originality retry 2/3...\n[14:27:14]    🎚️ [02_Jolene_20260601] Song 2: pop | 低38/中60/高2%\n[14:27:14] ✅ [02_Jolene_20260601] Step 3.5: 38.0s | 2 songs mixed\n[14:27:14] ⚠️  [02_Jolene_20260601] Step 4: http_403 (non-fatal)\n[14:27:14] ⚠️  [04_The Gambler_20260601] Step 2 API retry 1: originality 56%\n[14:27:14] 🔄 [04_The Gambler_20260601] Step 2 API: originality retry 2/3...\n[14:27:45] ⚠️  [05_Friends in Low Places_20260601] Step 2 API retry 2: originality 59%\n[14:27:45] 🔄 [05_Friends in Low Places_20260601] Step 2 API: originality retry 3/3...\n[14:28:12] ⚠️  [04_The Gambler_20260601] Step 2 API originality retry 2 failed: Expecting value: line 1 column 1 (char 0)\n[14:28:12] ⚠️  [04_The Gambler_20260601] Step 2 API: best originality 56% after 3 retries\n[14:28:12] ✅ [04_The Gambler_20260601] Step 2 API: 《River Don't Beg》 engine=? | 106.8s | in=26018 out=5288 | ~$0.157\n[14:28:13] ⚠️  [04_The Gambler_20260601] Step 2.5: originality 56% < 75% | 1 copied phrases\n          ❗ \"and subdominant , creating a sense of travel; the i-iv pattern repeats to establish motion.)\" ~ \"and subdominant , creating a sense of travel; the i-iv pattern repeats to establish motion.)\" (100%)\n[14:28:13] ⏳ [04_The Gambler_20260601] Step 2: 原创度不足，等待人审豁免或重试\n[14:28:38] ⚠️  [05_Friends in Low Places_20260601] Step 2 API originality retry 3 failed: Expecting value: line 1 column 1 (char 0)\n[14:28:38] ⚠️  [05_Friends in Low Places_20260601] Step 2 API: best originality 59% after 3 retries\n[14:28:38] ✅ [05_Friends in Low Places_20260601] Step 2 API: 《Gravel Never Lies》 engine=? | 150.8s | in=41875 out=7151 | ~$0.233\n[14:28:38] ⚠️  [05_Friends in Low Places_20260601] Step 2.5: originality 59% < 75% | 0 copied phrases\n[14:28:38] ⏳ [05_Friends in Low Places_20260601] Step 2: 原创度不足，等待人审豁免或重试\n\n======================================================================\nSUMMARY | 347s (5.8min)\n======================================================================\n✅ Done: 1 | ⏳ Awaiting Step 2: 0 | ❌ Failed: 0\n[MasterDB] ✅ 批次 batch-20260601-141653-6e03e8 → +1 新增, ~0 更新 | 总计 777 首\n", "stderr_tail": "[profile] ✅ Loaded profile '__runtime_batch-20260601-141653-6e03e8' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260601-141653-6e03e8.yaml\n", "summary": {"timestamp": "2026-06-01T14:28:38.541126+08:00", "wall_clock": 347.2, "total": 5, "success": 1, "awaiting_step2": 0, "failed": 0}}, "status": "success"}
[exit 0]

=== 2026-06-01 14:28:39 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/steps/step5_feishu.py /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8 ===
[Feishu] ✅ Exported 1 songs to: https://ccnu62373cgc.feishu.cn/sheets/GMNXsWSFdhjqcQtszHdcU9nknqe
[Feishu] 📐 Expanded master sheet from 713 to 814 rows
[Feishu] ✅ Appended 1 new songs to master sheet (rows 714-714)
[MasterDB] ✅ 批次 batch-20260601-141653-6e03e8 → +1 新增, ~0 更新 | 总计 714 首
[Feishu IM] ✅ Text sent: 📊 本批次结果表格：https://ccnu62373cgc.feishu.cn/sheets/GMNXsWSFdhjq
[14:28:48] 📨 Step 5: Sending files to Feishu IM...
[Feishu IM] ✅ [Slow Burning Fields] topic head sent (message_id=om_x100b6ee624dd08b0b2159793ba333ff)
[Feishu IM] ⚠️  [Slow Burning Fields] Slow Burning Fields_V1_raw.mp3 not found, skipping
[Feishu IM] ⚠️  [Slow Burning Fields] Slow Burning Fields_V1_mixed.mp3 not found, skipping
[Feishu IM] ⚠️  [Slow Burning Fields] Slow Burning Fields_V2_raw.mp3 not found, skipping
[Feishu IM] ⚠️  [Slow Burning Fields] Slow Burning Fields_V2_mixed.mp3 not found, skipping
[Feishu IM] ✅ [借来的人] topic head sent (message_id=om_x100b6ee624d05c88b3d8734900cb3b0)
[Feishu IM] ✅ [借来的人] 借来的人_V1_raw.mp3 replied
[Feishu IM] ✅ [借来的人] 借来的人_V1_mixed.mp3 replied
[Feishu IM] ✅ [借来的人] 借来的人_V2_raw.mp3 replied
[Feishu IM] ✅ [借来的人] 借来的人_V2_mixed.mp3 replied
[Feishu IM] ✅ [Dust and Ruin] topic head sent (message_id=om_x100b6ee6258110b4b2a67cfd2e92fc5)
[Feishu IM] ⚠️  [Dust and Ruin] Dust and Ruin_V1_raw.mp3 not found, skipping
[Feishu IM] ⚠️  [Dust and Ruin] Dust and Ruin_V1_mixed.mp3 not found, skipping
[Feishu IM] ⚠️  [Dust and Ruin] Dust and Ruin_V2_raw.mp3 not found, skipping
[Feishu IM] ⚠️  [Dust and Ruin] Dust and Ruin_V2_mixed.mp3 not found, skipping
[Feishu IM] ✅ [River Don't Beg] topic head sent (message_id=om_x100b6ee6259a78b0b3015e972e900f0)
[Feishu IM] ⚠️  [River Don't Beg] River Don't Beg_V1_raw.mp3 not found, skipping
[Feishu IM] ⚠️  [River Don't Beg] River Don't Beg_V1_mixed.mp3 not found, skipping
[Feishu IM] ⚠️  [River Don't Beg] River Don't Beg_V2_raw.mp3 not found, skipping
[Feishu IM] ⚠️  [River Don't Beg] River Don't Beg_V2_mixed.mp3 not found, skipping
[Feishu IM] ✅ [Gravel Never Lies] topic head sent (message_id=om_x100b6ee625ae70ecb21df726809df0a)
[Feishu IM] ⚠️  [Gravel Never Lies] Gravel Never Lies_V1_raw.mp3 not found, skipping
[Feishu IM] ⚠️  [Gravel Never Lies] Gravel Never Lies_V1_mixed.mp3 not found, skipping
[Feishu IM] ⚠️  [Gravel Never Lies] Gravel Never Lies_V2_raw.mp3 not found, skipping
[Feishu IM] ⚠️  [Gravel Never Lies] Gravel Never Lies_V2_mixed.mp3 not found, skipping
[Feishu] ✅ Already on file server: /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8
[Feishu] ✅ Archived to GDrive: /mnt/gdrive/music-pipeline/batch-20260601-141653-6e03e8
[Feishu] 📦 Local files kept at: /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8

📊 https://ccnu62373cgc.feishu.cn/sheets/GMNXsWSFdhjqcQtszHdcU9nknqe
[exit 0]

=== 2026-06-01 14:36:50 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/_input.json -o /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8 -cg 2 -cs 2 --skip-feishu --profile __runtime_batch-20260601-141653-6e03e8 --resume /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8 --target-language zh ===
[profile] ✅ Loaded profile '__runtime_batch-20260601-141653-6e03e8' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260601-141653-6e03e8.yaml

======================================================================
music-pipeline3000 v2 | 5 songs
======================================================================
Gemini concurrency: 2 | Suno concurrency: 2
Output: /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8
Skip Suno: False | Step1 only: False | Version: v4
======================================================================

[14:36:51] 🏥 Health check...
[14:36:54] ✅ qishui: OK
[14:36:54] ✅ netease: OK
[14:36:54] ✅ qq: OK

[14:36:54] ⏭️  [02_Jolene_20260601] Already complete, skipping
  📝 [01_Take Me Home, Country Roads_20260601] lyrics stripped: 4995c → 4989c
[14:36:54] 🎵 [01_Take Me Home, Country Roads_20260601] Step 3: Suno generation (weirdness=50, style_influence=50)...
[14:36:54] 🎨 [01_Take Me Home, Country Roads_20260601] Step 4: SeeDream cover (parallel)...
  📝 [03_Ring of Fire_20260601] lyrics stripped: 3862c → 3852c
[14:36:55] 🎵 [03_Ring of Fire_20260601] Step 3: Suno generation (weirdness=50, style_influence=50)...
[14:36:55] 🎨 [03_Ring of Fire_20260601] Step 4: SeeDream cover (parallel)...
  📝 [04_The Gambler_20260601] lyrics stripped: 6016c → 5000c
[14:36:55] 🎵 [04_The Gambler_20260601] Step 3: Suno generation (weirdness=50, style_influence=50)...
[14:36:55] 🎨 [04_The Gambler_20260601] Step 4: SeeDream cover (parallel)...
  📝 [05_Friends in Low Places_20260601] lyrics stripped: 4510c → 4505c
[14:36:55] 🎵 [05_Friends in Low Places_20260601] Step 3: Suno generation (weirdness=50, style_influence=50)...
[14:36:55] 🎨 [05_Friends in Low Places_20260601] Step 4: SeeDream cover (parallel)...
  ✅ submitted: ['f170e5f6', '7f80a5fc']
  🎵 f170e5f6... → submitted
  🎵 7f80a5fc... → submitted
  ✅ submitted: ['d751b2b5', '48ebe8da']
  🎵 d751b2b5... → submitted
  🎵 48ebe8da... → submitted
  🎵 f170e5f6... → queued
  🎵 7f80a5fc... → queued
  🎵 d751b2b5... → queued
  🎵 48ebe8da... → queued
  🎵 f170e5f6... → streaming
  🎵 7f80a5fc... → streaming
  🎵 d751b2b5... → streaming
  🎵 48ebe8da... → streaming
  🎵 d751b2b5... → complete
  🎵 f170e5f6... → complete
  🎵 7f80a5fc... → complete
[14:39:25]    🎧 [03_Ring of Fire_20260601] Song 1: https://cdn1.suno.ai/f170e5f6-9af8-46e0-b2e3-e711ad891abb.mp3
[14:39:25]    🎧 [03_Ring of Fire_20260601] Song 2: https://cdn1.suno.ai/7f80a5fc-5546-49ba-af55-65e52f816e01.mp3
[14:39:25] 🎛️ [03_Ring of Fire_20260601] Step 3.5: 混音...
[14:39:47]    🎚️ [03_Ring of Fire_20260601] Song 1: pop | 低67/中29/高4%
  ✅ submitted: ['e7400a30', 'bb355f0d']
  🎵 48ebe8da... → complete
[14:39:47]    🎧 [01_Take Me Home, Country Roads_20260601] Song 1: https://cdn1.suno.ai/d751b2b5-ea99-48bf-b8dc-98881d29938c.mp3
[14:39:47]    🎧 [01_Take Me Home, Country Roads_20260601] Song 2: https://cdn1.suno.ai/48ebe8da-d396-46f0-9187-f13725e43532.mp3
[14:39:47] 🎛️ [01_Take Me Home, Country Roads_20260601] Step 3.5: 混音...
  🎵 e7400a30... → streaming
  🎵 bb355f0d... → streaming
[14:40:06]    🎚️ [03_Ring of Fire_20260601] Song 2: pop | 低59/中33/高8%
[14:40:06] ✅ [03_Ring of Fire_20260601] Step 3.5: 40.4s | 2 songs mixed
[14:40:23]    🎚️ [01_Take Me Home, Country Roads_20260601] Song 1: edm | 低45/中50/高5%
[14:40:23] ❌ [01_Take Me Home, Country Roads_20260601] Step 3.5: RuntimeError: Session is closed
  ✅ submitted: ['19501bcb', '74189b5c']
  ❌ poll error: Session is closed, retry...
  ❌ poll error: Session is closed, retry...
Traceback (most recent call last):
  File "/srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py", line 1135, in <module>
    main()
    ~~~~^^
  File "/srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py", line 1122, in main
    asyncio.run(run_pipeline(
    ~~~~~~~~~~~^^^^^^^^^^^^^^
        songs, output_dir,
        ^^^^^^^^^^^^^^^^^^
    ...<6 lines>...
        target_language=args.target_language,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ))
    ^^
  File "/usr/lib/python3.13/asyncio/runners.py", line 195, in run
    return runner.run(main)
           ~~~~~~~~~~^^^^^^
  File "/usr/lib/python3.13/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/usr/lib/python3.13/asyncio/base_events.py", line 725, in run_until_complete
    return future.result()
           ~~~~~~~~~~~~~^^
  File "/srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py", line 1004, in run_pipeline
    results = await asyncio.gather(*tasks)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py", line 940, in run_song
    state.mark_step("step4", {"time": s4_result["time"], "image_url": s4_result.get("image_url", cover_url),
                                                                                                 ^^^^^^^^^
UnboundLocalError: cannot access local variable 'cover_url' where it is not associated with a value
[exit 1]

=== 2026-06-01 14:57:05 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8/_input.json -o /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8 -cg 2 -cs 2 --skip-feishu --profile __runtime_batch-20260601-141653-6e03e8 --resume /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8 --target-language zh ===
[profile] ✅ Loaded profile '__runtime_batch-20260601-141653-6e03e8' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260601-141653-6e03e8.yaml

======================================================================
music-pipeline3000 v2 | 5 songs
======================================================================
Gemini concurrency: 2 | Suno concurrency: 2
Output: /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8
Skip Suno: False | Step1 only: False | Version: v4
======================================================================

[14:57:07] 🏥 Health check...
[14:57:09] ✅ qishui: OK
[14:57:09] ✅ netease: OK
[14:57:09] ✅ qq: OK

[14:57:09] ⏭️  [02_Jolene_20260601] Already complete, skipping
  📝 [04_The Gambler_20260601] lyrics stripped: 6016c → 5000c
[14:57:09] 🎵 [04_The Gambler_20260601] Step 3: Suno generation (weirdness=50, style_influence=50)...
  📝 [05_Friends in Low Places_20260601] lyrics stripped: 4510c → 4505c
[14:57:09] 🎵 [05_Friends in Low Places_20260601] Step 3: Suno generation (weirdness=50, style_influence=50)...
[14:57:09] 🔁 [01_Take Me Home, Country Roads_20260601] Resume: recovering Step 3.5 from existing step3_suno.json
[14:57:09] 🎛️ [01_Take Me Home, Country Roads_20260601] Step 3.5: 混音...
[14:57:34]    🎚️ [01_Take Me Home, Country Roads_20260601] Song 1: edm | 低45/中50/高5%
[14:57:54]    🎚️ [01_Take Me Home, Country Roads_20260601] Song 2: edm | 低44/中51/高5%
[14:57:54] ✅ [01_Take Me Home, Country Roads_20260601] Step 3.5: 45.6s | 2 songs mixed
  ✅ submitted: ['08a33cec', 'eb84fb98']
  ✅ submitted: ['f7794735', '98219143']
  🎵 08a33cec... → streaming
  🎵 eb84fb98... → streaming
  🎵 f7794735... → streaming
  🎵 98219143... → streaming
  🎵 eb84fb98... → complete
  🎵 98219143... → complete
  🎵 08a33cec... → complete
[15:01:22]    🎧 [05_Friends in Low Places_20260601] Song 1: https://cdn1.suno.ai/08a33cec-3d13-4c56-a7e1-eececbad6bb8.mp3
[15:01:22]    🎧 [05_Friends in Low Places_20260601] Song 2: https://cdn1.suno.ai/eb84fb98-7e24-4c82-af81-845bd006031b.mp3
[15:01:22] 🎛️ [05_Friends in Low Places_20260601] Step 3.5: 混音...
[15:01:54]    🎚️ [05_Friends in Low Places_20260601] Song 1: rock | 低36/中57/高7%
[15:02:18]    🎚️ [05_Friends in Low Places_20260601] Song 2: pop | 低54/中40/高6%
[15:02:18] ✅ [05_Friends in Low Places_20260601] Step 3.5: 55.6s | 2 songs mixed
  🎵 f7794735... → complete
[15:05:15]    🎧 [04_The Gambler_20260601] Song 1: https://cdn1.suno.ai/f7794735-d89e-418f-972b-e3cffbc7240f.mp3
[15:05:15]    🎧 [04_The Gambler_20260601] Song 2: https://cdn1.suno.ai/98219143-9ad6-4bcc-b8bc-4eb918ec6a8b.mp3
[15:05:15] 🎛️ [04_The Gambler_20260601] Step 3.5: 混音...
[15:05:53]    🎚️ [04_The Gambler_20260601] Song 1: edm | 低57/中38/高5%
[15:06:17]    🎚️ [04_The Gambler_20260601] Song 2: jazz | 低56/中38/高6%
[15:06:17] ✅ [04_The Gambler_20260601] Step 3.5: 62.2s | 2 songs mixed

======================================================================
SUMMARY | 548s (9.1min)
======================================================================
✅ Done: 5 | ⏳ Awaiting Step 2: 0 | ❌ Failed: 0
[MasterDB] ✅ 批次 batch-20260601-141653-6e03e8 → +4 新增, ~1 更新 | 总计 782 首
[exit 0]

=== 2026-06-01 15:06:18 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/steps/step5_feishu.py /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8 ===
[Feishu] ✅ Exported 5 songs to: https://ccnu62373cgc.feishu.cn/sheets/MkSLsAxZxhFxy9txtCUcijHHnSc
[Feishu] ⏭️  Skip duplicate (complete): Jolene (https://fileserver.yuchenhu.com/pipeline/batch-20260601-141653-6e03e8/02_Jolene_20260601/song_pgc.mp3)
[Feishu] 📐 Expanded master sheet from 715 to 819 rows
[Feishu] ✅ Appended 4 new songs to master sheet (rows 716-719)
[MasterDB] ✅ 批次 batch-20260601-141653-6e03e8 → +4 新增, ~0 更新 | 总计 719 首
[Feishu IM] ✅ Text sent: 📊 本批次结果表格：https://ccnu62373cgc.feishu.cn/sheets/MkSLsAxZxhFx
[15:06:36] 📨 Step 5: Sending files to Feishu IM...
[Feishu IM] ✅ [Slow Burning Fields] topic head sent (message_id=om_x100b6ee6b91bcc9cb3dd62974540ff1)
[Feishu IM] ✅ [Slow Burning Fields] cover replied
[Feishu IM] ✅ [Slow Burning Fields] Slow Burning Fields_V1_raw.mp3 replied
[Feishu IM] ✅ [Slow Burning Fields] Slow Burning Fields_V1_mixed.mp3 replied
[Feishu IM] ✅ [Slow Burning Fields] Slow Burning Fields_V2_raw.mp3 replied
[Feishu IM] ✅ [Slow Burning Fields] Slow Burning Fields_V2_mixed.mp3 replied
[Feishu IM] ✅ [借来的人] topic head sent (message_id=om_x100b6ee6b7fb84a0b267cb05a03dad8)
[Feishu IM] ✅ [借来的人] 借来的人_V1_raw.mp3 replied
[Feishu IM] ✅ [借来的人] 借来的人_V1_mixed.mp3 replied
[Feishu IM] ✅ [借来的人] 借来的人_V2_raw.mp3 replied
[Feishu IM] ✅ [借来的人] 借来的人_V2_mixed.mp3 replied
[Feishu IM] ✅ [Dust and Ruin] topic head sent (message_id=om_x100b6ee6b48968a8b325002a3d037eb)
[Feishu IM] ✅ [Dust and Ruin] cover replied
[Feishu IM] ✅ [Dust and Ruin] Dust and Ruin_V1_raw.mp3 replied
[Feishu IM] ✅ [Dust and Ruin] Dust and Ruin_V1_mixed.mp3 replied
[Feishu IM] ✅ [Dust and Ruin] Dust and Ruin_V2_raw.mp3 replied
[Feishu IM] ✅ [Dust and Ruin] Dust and Ruin_V2_mixed.mp3 replied
[Feishu IM] ✅ [River Don't Beg] topic head sent (message_id=om_x100b6ee6b5445994b2ce761faa723e6)
[Feishu IM] ✅ [River Don't Beg] River Don't Beg_V1_raw.mp3 replied
[Feishu IM] ✅ [River Don't Beg] River Don't Beg_V1_mixed.mp3 replied
[Feishu IM] ✅ [River Don't Beg] River Don't Beg_V2_raw.mp3 replied
[Feishu IM] ✅ [River Don't Beg] River Don't Beg_V2_mixed.mp3 replied
[Feishu IM] ✅ [Gravel Never Lies] topic head sent (message_id=om_x100b6ee6b2752080b30c1518d979877)
[Feishu IM] ✅ [Gravel Never Lies] Gravel Never Lies_V1_raw.mp3 replied
[Feishu IM] ✅ [Gravel Never Lies] Gravel Never Lies_V1_mixed.mp3 replied
[Feishu IM] ✅ [Gravel Never Lies] Gravel Never Lies_V2_raw.mp3 replied
[Feishu IM] ✅ [Gravel Never Lies] Gravel Never Lies_V2_mixed.mp3 replied
[Feishu] ✅ Already on file server: /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8
[Feishu] ✅ Archived to GDrive: /mnt/gdrive/music-pipeline/batch-20260601-141653-6e03e8
[Feishu] 📦 Local files kept at: /srv/music-files-platform-next/pipeline/batch-20260601-141653-6e03e8

📊 https://ccnu62373cgc.feishu.cn/sheets/MkSLsAxZxhFxy9txtCUcijHHnSc
[exit 0]
