
=== 2026-05-07 15:48:01 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/_input.json -o /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d -cg 2 -cs 2 --skip-feishu --profile __runtime_batch-20260507-154153-94511d --step1-only ===
[profile] ✅ Loaded profile '__runtime_batch-20260507-154153-94511d' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-154153-94511d.yaml
[step075] cache hit: song_pgc.mp3 → 98f1349bcaac

======================================================================
music-pipeline3000 v2 | 5 songs
======================================================================
Gemini concurrency: 2 | Suno concurrency: 2
Output: /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d
Skip Suno: False | Step1 only: True | Version: v4
======================================================================

[15:48:02] 🏥 Health check...
[15:48:05] ✅ qishui: OK
[15:48:05] ✅ netease: OK
[15:48:05] ✅ qq: OK

[15:48:05] 🔍 [01_恐龙抗狼_20260507] Step 0: Fetching...
[15:48:05] 🔍 [02_我姓石_20260507] Step 0: Fetching...
[15:48:05] 🔍 [03_爱如火_20260507] Step 0: Fetching...
[15:48:05] 🔍 [04_是妈妈是女儿_20260507] Step 0: Fetching...
[15:48:05] 🔍 [05_一笑江湖 (DJ版)_20260507] Step 0: Fetching...
[15:48:07] ✅ [qishui] Direct ID fetch: '爱如火' id=7268581801738799105
[15:48:07] ✅ [03_爱如火_20260507] Step 0: qishui | 1834c lyrics
[15:48:07] ⬇️  [03_爱如火_20260507] Step 0.5: Download from qishui...
[15:48:08] ✅ [qishui] Direct ID fetch: '是妈妈是女儿' id=7191830963159042050
[15:48:08] ✅ [04_是妈妈是女儿_20260507] Step 0: qishui | 690c lyrics
[15:48:08] ⬇️  [04_是妈妈是女儿_20260507] Step 0.5: Download from qishui...
[15:48:08] ⚠️  [netease] '恐龙抗狼' too short (50s < 120s), likely a cover/clip, skipping
[15:48:08] 🔄 [01_恐龙抗狼_20260507] Step 0: retry 1/2 in 5s...
[15:48:08] ✅ [02_我姓石_20260507] Step 0: netease | 302c lyrics
[15:48:08] ⬇️  [02_我姓石_20260507] Step 0.5: Download from netease...
[15:48:10] ✅ [05_一笑江湖 (DJ版)_20260507] Step 0: netease | 441c lyrics
[15:48:10] ⬇️  [05_一笑江湖 (DJ版)_20260507] Step 0.5: Download from netease...
[15:48:11] ✅ [02_我姓石_20260507] Step 0.5: 3048037 bytes | 147.6s
[15:48:11] 🔬 [02_我姓石_20260507] Step 0.75: Audio features...
[15:48:11] ✅ [02_我姓石_20260507] Step 0.75: BPM=129.76 Key=E major (27.5s)
[15:48:11] 🧠 [02_我姓石_20260507] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-05-07T07:48:11.723Z", "trace_id": "batch-20260507-154153-94511d", "song_key": "02_我姓石_20260507", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/02_我姓石_20260507/song_pgc.mp3", "has_features": true}}
[step1] cache hit: song_pgc.mp3 → b07855119068 (saving 1 Gemini call)
{"__trace__": true, "ts": "2026-05-07T07:48:11.750Z", "trace_id": "batch-20260507-154153-94511d", "song_key": "02_我姓石_20260507", "step": "step1", "type": "api_call", "provider": "gemini", "model": "gemini-2.5-pro", "duration_sec": 61.8, "cost_usd": null, "status": "success"}
{"__trace__": true, "ts": "2026-05-07T07:48:11.750Z", "trace_id": "batch-20260507-154153-94511d", "song_key": "02_我姓石_20260507", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 0.027}
[step075] cache hit: song_pgc.mp3 → 21a4ce118d1a
[15:48:11] ⚠️  [02_我姓石_20260507] Step 1.5: prompt 1094c > 1000c, compressing...
  📏 [02_我姓石_20260507] prompt 1094c → 980c (smart truncate)
[15:48:11] ✅ [02_我姓石_20260507] Step 1.5: prompt compressed 1094c → 980c
[15:48:11] ✅ [02_我姓石_20260507] Step 1: 61.8s | prompt=980c | prompt_ok=True lyrics_ok=True
[15:48:12] ⚠️  [04_是妈妈是女儿_20260507] Step 0.5: Only 30.0s preview (expected 375s)
[15:48:12] 🔒 [04_是妈妈是女儿_20260507] Step 0.5: source_id locked, skipping cross-platform fallback
[15:48:12] ❌ [04_是妈妈是女儿_20260507] Step 0.5: All platforms returned preview (30.0s), skipping song
[15:48:12] ⚠️  [03_爱如火_20260507] Step 0.5: Only 60.0s preview (expected 234s)
[15:48:12] 🔒 [03_爱如火_20260507] Step 0.5: source_id locked, skipping cross-platform fallback
[15:48:12] ❌ [03_爱如火_20260507] Step 0.5: All platforms returned preview (60.0s), skipping song
[15:48:15] ⚠️  [netease] '恐龙抗狼' too short (50s < 120s), likely a cover/clip, skipping
[15:48:15] 🔄 [01_恐龙抗狼_20260507] Step 0: retry 2/2 in 10s...
[15:48:16] ✅ [05_一笑江湖 (DJ版)_20260507] Step 0.5: 4530999 bytes | 243.5s
[15:48:16] 🔬 [05_一笑江湖 (DJ版)_20260507] Step 0.75: Audio features...
[15:48:16] ✅ [05_一笑江湖 (DJ版)_20260507] Step 0.75: BPM=85.92 Key=A# minor (26.5s)
[15:48:16] 🧠 [05_一笑江湖 (DJ版)_20260507] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-05-07T07:48:16.816Z", "trace_id": "batch-20260507-154153-94511d", "song_key": "05_一笑江湖 (DJ版)_20260507", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/05_一笑江湖 (DJ版)_20260507/song_pgc.mp3", "has_features": true}}
[step1] cache hit: song_pgc.mp3 → 6a2ca26e7a46 (saving 1 Gemini call)
{"__trace__": true, "ts": "2026-05-07T07:48:16.853Z", "trace_id": "batch-20260507-154153-94511d", "song_key": "05_一笑江湖 (DJ版)_20260507", "step": "step1", "type": "api_call", "provider": "gemini", "model": "gemini-2.5-pro", "duration_sec": 55.0, "cost_usd": null, "status": "success"}
{"__trace__": true, "ts": "2026-05-07T07:48:16.853Z", "trace_id": "batch-20260507-154153-94511d", "song_key": "05_一笑江湖 (DJ版)_20260507", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 0.037}
[15:48:16] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 1.5: prompt 1381c > 1000c, compressing...
  📏 [05_一笑江湖 (DJ版)_20260507] prompt 1381c → 889c (smart truncate)
[15:48:16] ✅ [05_一笑江湖 (DJ版)_20260507] Step 1.5: prompt compressed 1381c → 889c
[15:48:16] ✅ [05_一笑江湖 (DJ版)_20260507] Step 1: 55.0s | prompt=889c | prompt_ok=True lyrics_ok=True
[15:48:28] ⚠️  [netease] '恐龙抗狼' too short (50s < 120s), likely a cover/clip, skipping
[15:48:28] ❌ [01_恐龙抗狼_20260507] Step 0: No audio URL

======================================================================
SUMMARY | 23s (0.4min)
======================================================================
✅ Done: 2 | ⏳ Awaiting Step 2: 0 | ❌ Failed: 3
[MasterDB] ✅ 批次 batch-20260507-154153-94511d → +0 新增, ~0 更新 | 总计 647 首
[exit 0]

=== 2026-05-07 15:48:28 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/orchestrate_phase2.py /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d --profile __runtime_batch-20260507-154153-94511d --resume-mode each --skip-feishu ===
[phase2] batch=batch-20260507-154153-94511d pending=2 groups=1
[phase2] group 1/1 -> 02_我姓石_20260507, 05_一笑江湖 (DJ版)_20260507
[profile] ✅ Loaded profile '__runtime_batch-20260507-154153-94511d' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-154153-94511d.yaml
[phase2] 🌐 02_我姓石_20260507: target_language=auto
[profile] ✅ Loaded profile '__runtime_batch-20260507-154153-94511d' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-154153-94511d.yaml
[phase2] 🌐 05_一笑江湖 (DJ版)_20260507: target_language=auto
[phase2] resume -> /usr/bin/python3 /srv/repos/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/_manifest.json --resume /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d --profile __runtime_batch-20260507-154153-94511d --skip-feishu

=== 2026-05-07 15:52:46 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/_input.json -o /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d -cg 2 -cs 2 --skip-feishu --profile __runtime_batch-20260507-154153-94511d --resume /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d ===
[profile] ✅ Loaded profile '__runtime_batch-20260507-154153-94511d' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-154153-94511d.yaml

======================================================================
music-pipeline3000 v2 | 5 songs
======================================================================
Gemini concurrency: 2 | Suno concurrency: 2
Output: /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d
Skip Suno: False | Step1 only: False | Version: v4
======================================================================

[15:52:47] 🏥 Health check...
[15:52:49] ✅ qishui: OK
[15:52:49] ✅ netease: OK
[15:52:49] ✅ qq: OK

[15:52:49] 🔍 [01_恐龙抗狼_20260507] Step 0: Fetching...
[15:52:49] 🧠 [03_爱如火_20260507] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-05-07T07:52:49.390Z", "trace_id": "batch-20260507-154153-94511d", "song_key": "03_爱如火_20260507", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/03_爱如火_20260507/song_pgc.mp3", "has_features": true}}
[15:52:49] 🌐 [04_是妈妈是女儿_20260507] Step 2: target_language=auto → lang_mode=AUTO
[15:52:49] 🤖 [04_是妈妈是女儿_20260507] Step 2 API: 13852 chars ≈ 3463 tokens → claude-sonnet-4-6
  📝 [02_我姓石_20260507] lyrics stripped: 3398c → 3391c
[15:52:49] 🎵 [02_我姓石_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...
[15:52:49] 🎨 [02_我姓石_20260507] Step 4: SeeDream cover (parallel)...
  📝 [05_一笑江湖 (DJ版)_20260507] lyrics stripped: 3205c → 3198c
[15:52:49] 🎵 [05_一笑江湖 (DJ版)_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...
[15:52:49] 🎨 [05_一笑江湖 (DJ版)_20260507] Step 4: SeeDream cover (parallel)...
  ✅ submitted: ['793d1e96', 'a0d8331c']
  🎵 793d1e96... → submitted
  🎵 a0d8331c... → submitted
  ✅ submitted: ['66429f31', '2b538e93']
  🎵 66429f31... → submitted
  🎵 2b538e93... → submitted
[15:52:51] ⚠️  [netease] '恐龙抗狼' too short (50s < 120s), likely a cover/clip, skipping
[15:52:51] 🔄 [01_恐龙抗狼_20260507] Step 0: retry 1/2 in 5s...
  🎵 66429f31... → queued
  🎵 2b538e93... → queued
[15:53:00] ⚠️  [netease] '恐龙抗狼' too short (50s < 120s), likely a cover/clip, skipping
[15:53:00] 🔄 [01_恐龙抗狼_20260507] Step 0: retry 2/2 in 10s...
  🎵 793d1e96... → queued
  🎵 a0d8331c... → queued
  🎵 793d1e96... → streaming
  🎵 2b538e93... → streaming
  🎵 a0d8331c... → streaming
  🎵 66429f31... → streaming
[15:53:12] ⚠️  [netease] '恐龙抗狼' too short (50s < 120s), likely a cover/clip, skipping
[15:53:12] ❌ [01_恐龙抗狼_20260507] Step 0: No audio URL
[15:53:25] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API: originality 77% < 85% | 0 copied phrases
[15:53:25] 🔄 [04_是妈妈是女儿_20260507] Step 2 API: originality retry 1/3...
  📊 Gemini official: 57s | prompt_tokens=5817 completion=1489
{"__trace__": true, "ts": "2026-05-07T07:53:46.547Z", "trace_id": "batch-20260507-154153-94511d", "song_key": "03_爱如火_20260507", "step": "step1", "type": "api_call", "provider": "gemini", "model": "gemini-2.5-pro", "duration_sec": 57.1, "cost_usd": null, "status": "success"}
{"__trace__": true, "ts": "2026-05-07T07:53:46.547Z", "trace_id": "batch-20260507-154153-94511d", "song_key": "03_爱如火_20260507", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 57.157}
[15:53:46] ⚠️  [03_爱如火_20260507] Step 1.5: prompt 1067c > 1000c, compressing...
  📏 [03_爱如火_20260507] prompt 1067c → 876c (smart truncate)
[15:53:46] ✅ [03_爱如火_20260507] Step 1.5: prompt compressed 1067c → 876c
[15:53:46] ✅ [03_爱如火_20260507] Step 1: 57.1s | prompt=876c | prompt_ok=True lyrics_ok=True
[15:53:46] 🌐 [03_爱如火_20260507] Step 2: target_language=auto → lang_mode=EN
[15:53:46] 🤖 [03_爱如火_20260507] Step 2 API: 15094 chars ≈ 3773 tokens → claude-sonnet-4-6
[15:54:04] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API retry 1: originality 76%
[15:54:04] 🔄 [04_是妈妈是女儿_20260507] Step 2 API: originality retry 2/3...
[15:54:20] ⚠️  [03_爱如火_20260507] Step 2 API: originality 72% < 85% | 0 copied phrases
[15:54:20] 🔄 [03_爱如火_20260507] Step 2 API: originality retry 1/3...
[15:54:40] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API retry 2: originality 77%
[15:54:40] 🔄 [04_是妈妈是女儿_20260507] Step 2 API: originality retry 3/3...
[15:55:06] ⚠️  [03_爱如火_20260507] Step 2 API retry 1: originality 71%
[15:55:06] 🔄 [03_爱如火_20260507] Step 2 API: originality retry 2/3...
  🎵 2b538e93... → complete
[15:55:28] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API originality retry 3 failed: Expecting value: line 1 column 1 (char 0)
[15:55:28] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API: best originality 77% after 3 retries
[15:55:38] ⚠️  Step 2 title library fetch failed: 
[15:55:38] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API attempt 1 (169.1s): [Errno 2] No such file or directory: '/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/04_是妈妈是女儿_20260507/step2_json_b.json'
  🎵 793d1e96... → complete
[15:55:56] ⚠️  [03_爱如火_20260507] Step 2 API retry 2: originality 71%
[15:55:56] 🔄 [03_爱如火_20260507] Step 2 API: originality retry 3/3...
  🎵 a0d8331c... → complete
[15:56:14]    🎧 [05_一笑江湖 (DJ版)_20260507] Song 1: https://cdn1.suno.ai/793d1e96-d245-4151-a616-181bd10fc5dd.mp3
[15:56:14]    🎧 [05_一笑江湖 (DJ版)_20260507] Song 2: https://cdn1.suno.ai/a0d8331c-5db1-4511-bcd0-f4bda9301428.mp3
[15:56:14] 🎛️ [05_一笑江湖 (DJ版)_20260507] Step 3.5: 混音...
[15:56:33]    🎚️ [05_一笑江湖 (DJ版)_20260507] Song 1: hip_hop | 低52/中44/高4%
[15:56:49]    🎚️ [05_一笑江湖 (DJ版)_20260507] Song 2: hip_hop | 低51/中46/高3%
[15:56:49] ✅ [05_一笑江湖 (DJ版)_20260507] Step 3.5: 35.7s | 2 songs mixed
[15:56:49] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 4: http_403 (non-fatal)
[15:56:49] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API: originality 79% < 85% | 0 copied phrases
[15:56:49] 🔄 [04_是妈妈是女儿_20260507] Step 2 API: originality retry 1/3...
  🎵 66429f31... → complete
[15:56:50]    🎧 [02_我姓石_20260507] Song 1: https://cdn1.suno.ai/66429f31-ca8f-497b-b3f4-779c8b093fe2.mp3
[15:56:50]    🎧 [02_我姓石_20260507] Song 2: https://cdn1.suno.ai/2b538e93-ebfc-4420-a993-760db326cf6e.mp3
[15:56:50] 🎛️ [02_我姓石_20260507] Step 3.5: 混音...
[15:57:05]    🎚️ [02_我姓石_20260507] Song 1: edm | 低72/中25/高3%
[15:57:17]    🎚️ [02_我姓石_20260507] Song 2: edm | 低59/中36/高5%
[15:57:17] ✅ [02_我姓石_20260507] Step 3.5: 26.9s | 2 songs mixed
[15:57:17] ⚠️  [02_我姓石_20260507] Step 4: http_403 (non-fatal)
[15:57:24] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API retry 1: originality 76%
[15:57:24] 🔄 [04_是妈妈是女儿_20260507] Step 2 API: originality retry 2/3...
[15:58:02] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API retry 2: originality 79%
[15:58:02] 🔄 [04_是妈妈是女儿_20260507] Step 2 API: originality retry 3/3...
[15:58:38] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API originality retry 3 failed: Expecting value: line 1 column 1 (char 0)
[15:58:38] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API: best originality 79% after 3 retries
[15:58:38] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API attempt 2 (174.9s): [Errno 2] No such file or directory: '/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/04_是妈妈是女儿_20260507/step2_json_b.json'
Traceback (most recent call last):
  File "/srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py", line 958, in <module>
    main()
    ~~~~^^
  File "/srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py", line 945, 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 827, in run_pipeline
    results = await asyncio.gather(*tasks)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py", line 467, in run_song
    state.mark_error("step2", s2.get("error", "API call failed"))
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/srv/current/3000music-platform-next/services/music-pipeline/scripts/steps/utils.py", line 199, in mark_error
    self.save()
    ~~~~~~~~~^^
  File "/srv/current/3000music-platform-next/services/music-pipeline/scripts/steps/utils.py", line 184, in save
    self.state_file.write_text(json.dumps(self.state, ensure_ascii=False, indent=2))
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/pathlib/_local.py", line 557, in write_text
    return PathBase.write_text(self, data, encoding, errors, newline)
           ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/pathlib/_abc.py", line 651, in write_text
    with self.open(mode='w', encoding=encoding, errors=errors, newline=newline) as f:
         ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/pathlib/_local.py", line 539, in open
    return io.open(self, mode, buffering, encoding, errors, newline)
           ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/04_是妈妈是女儿_20260507/_state.json'
[exit 1]
[15:48:29] 🌐 [02_我姓石_20260507] Step 2: target_language=auto → lang_mode=AUTO
[15:48:29] 🤖 [02_我姓石_20260507] Step 2 API: 14187 chars ≈ 3546 tokens → claude-sonnet-4-6
[15:48:29] 🌐 [05_一笑江湖 (DJ版)_20260507] Step 2: target_language=auto → lang_mode=AUTO
[15:48:29] 🤖 [05_一笑江湖 (DJ版)_20260507] Step 2 API: 13883 chars ≈ 3470 tokens → claude-sonnet-4-6
[15:49:00] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 2 API: originality 83% < 85% | 0 copied phrases
[15:49:00] 🔄 [05_一笑江湖 (DJ版)_20260507] Step 2 API: originality retry 1/3...
[15:49:01] ⚠️  [02_我姓石_20260507] Step 2 API: originality 77% < 85% | 0 copied phrases
[15:49:01] 🔄 [02_我姓石_20260507] Step 2 API: originality retry 1/3...
[15:49:29] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 2 API retry 1: originality 83%
[15:49:29] 🔄 [05_一笑江湖 (DJ版)_20260507] Step 2 API: originality retry 2/3...
[15:49:34] ⚠️  [02_我姓石_20260507] Step 2 API retry 1: originality 84%
[15:49:34] 🔄 [02_我姓石_20260507] Step 2 API: originality retry 2/3...
[15:50:02] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 2 API retry 2: originality 82%
[15:50:02] 🔄 [05_一笑江湖 (DJ版)_20260507] Step 2 API: originality retry 3/3...
[15:50:05] ✅ [02_我姓石_20260507] Step 2 API retry 2: originality 87% ✓
[15:50:05] ✅ [02_我姓石_20260507] Step 2 API: 《没人能把我按住》 | 95.9s | in=39189 out=6858 | ~$0.220
[15:50:36] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 2 API originality retry 3 failed: Expecting value: line 1 column 1 (char 0)
[15:50:36] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 2 API: best originality 83% after 3 retries
[15:50:36] ✅ [05_一笑江湖 (DJ版)_20260507] Step 2 API: 《凭什么偏偏是你先走》 | 92.7s | in=38513 out=6550 | ~$0.214
{"timestamp": "2026-05-07T15:48:29.149239+08:00", "batch_dir": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d", "profile": "__runtime_batch-20260507-154153-94511d", "concurrency": 3, "resume_mode": "each", "pending_song_count": 2, "groups": [{"group_index": 1, "songs": ["/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/02_我姓石_20260507", "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/05_一笑江湖 (DJ版)_20260507"], "success_count": 2, "failed_count": 0, "results": [{"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/02_我姓石_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/02_我姓石_20260507/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-20260507-154153-94511d/02_我姓石_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/02_我姓石_20260507/step2_json_b.json", "agent_summary": "API direct: 没人能把我按住", "returncode": 0, "stderr": "", "attempt": 1}]}, {"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/05_一笑江湖 (DJ版)_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/05_一笑江湖 (DJ版)_20260507/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-20260507-154153-94511d/05_一笑江湖 (DJ版)_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/05_一笑江湖 (DJ版)_20260507/step2_json_b.json", "agent_summary": "API direct: 凭什么偏偏是你先走", "returncode": 0, "stderr": "", "attempt": 1}]}]}], "resume": {"status": "success", "returncode": 0, "stdout_tail": "儿_20260507\", \"step\": \"step1\", \"type\": \"step_end\", \"status\": \"success\", \"duration_sec\": 54.948}\n[15:51:44] ⚠️  [04_是妈妈是女儿_20260507] Step 1.5: prompt 1171c > 1000c, compressing...\n  📏 [04_是妈妈是女儿_20260507] prompt 1171c → 958c (smart truncate)\n[15:51:44] ✅ [04_是妈妈是女儿_20260507] Step 1.5: prompt compressed 1171c → 958c\n[15:51:44] ✅ [04_是妈妈是女儿_20260507] Step 1: 31.5s | prompt=958c | prompt_ok=True lyrics_ok=True\n[15:51:44] 🌐 [04_是妈妈是女儿_20260507] Step 2: target_language=auto → lang_mode=AUTO\n[15:51:44] 🤖 [04_是妈妈是女儿_20260507] Step 2 API: 13852 chars ≈ 3463 tokens → claude-sonnet-4-6\n[15:52:19] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API: originality 75% < 85% | 0 copied phrases\n[15:52:19] 🔄 [04_是妈妈是女儿_20260507] Step 2 API: originality retry 1/3...\n  🎵 1315ab79... → complete\n[15:52:55] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API retry 1: originality 75%\n[15:52:55] 🔄 [04_是妈妈是女儿_20260507] Step 2 API: originality retry 2/3...\n[15:53:32] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API retry 2: originality 80%\n[15:53:32] 🔄 [04_是妈妈是女儿_20260507] Step 2 API: originality retry 3/3...\n  🎵 1e438ae0... → complete\n  🎵 cbc0390d... → complete\n[15:54:00]    🎧 [02_我姓石_20260507] Song 1: https://cdn1.suno.ai/cbc0390d-96ac-4a8a-893d-034d1b88b676.mp3\n[15:54:00]    🎧 [02_我姓石_20260507] Song 2: https://cdn1.suno.ai/1315ab79-5dc0-4d3f-8a46-0a52e511777a.mp3\n[15:54:00] 🎛️ [02_我姓石_20260507] Step 3.5: 混音...\n[15:54:16]    🎚️ [02_我姓石_20260507] Song 1: edm | 低72/中25/高3%\n[15:54:16] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API originality retry 3 failed: Expecting value: line 1 column 1 (char 0)\n[15:54:16] ⚠️  [04_是妈妈是女儿_20260507] Step 2 API: best originality 80% after 3 retries\n[15:54:16] ✅ [04_是妈妈是女儿_20260507] Step 2 API: 《下一次见面之前》 | 107.9s | in=38774 out=6720 | ~$0.217\n[15:54:16] ✅ [04_是妈妈是女儿_20260507] Step 2.5: originality 80% ✓\n[15:54:16] ✅ [04_是妈妈是女儿_20260507] Step 2: 《下一次见面之前》\n[15:54:16] 📁 [04_是妈妈是女儿_20260507] Renamed → 04_是妈妈是女儿_下一次见面之前_20260507\n  📝 [04_是妈妈是女儿_下一次见面之前_20260507] lyrics stripped: 3105c → 3097c\n[15:54:16] 🎵 [04_是妈妈是女儿_下一次见面之前_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...\n[15:54:16] 🎨 [04_是妈妈是女儿_下一次见面之前_20260507] Step 4: SeeDream cover (parallel)...\n[15:54:29]    🎚️ [02_我姓石_20260507] Song 2: edm | 低59/中36/高5%\n[15:54:29] ✅ [02_我姓石_20260507] Step 3.5: 29.9s | 2 songs mixed\n[15:54:29] ⚠️  [02_我姓石_20260507] Step 4: http_403 (non-fatal)\n  ✅ submitted: ['f81a95d3', 'dfbb0f75']\n  🎵 f81a95d3... → queued\n  🎵 dfbb0f75... → queued\n  🎵 194af74f... → complete\n[15:54:30]    🎧 [05_一笑江湖 (DJ版)_20260507] Song 1: https://cdn1.suno.ai/1e438ae0-40f8-41d7-840c-567d3b26c6a7.mp3\n[15:54:30]    🎧 [05_一笑江湖 (DJ版)_20260507] Song 2: https://cdn1.suno.ai/194af74f-1187-45b6-9c50-79876c789dd9.mp3\n[15:54:30] 🎛️ [05_一笑江湖 (DJ版)_20260507] Step 3.5: 混音...\n[15:54:47]    🎚️ [05_一笑江湖 (DJ版)_20260507] Song 1: hip_hop | 低52/中44/高4%\n  🎵 f81a95d3... → streaming\n  🎵 dfbb0f75... → streaming\n[15:55:05]    🎚️ [05_一笑江湖 (DJ版)_20260507] Song 2: hip_hop | 低51/中46/高3%\n[15:55:05] ✅ [05_一笑江湖 (DJ版)_20260507] Step 3.5: 34.6s | 2 songs mixed\n[15:55:05] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 4: http_403 (non-fatal)\n  🎵 f81a95d3... → complete\n  🎵 dfbb0f75... → complete\n[15:58:14]    🎧 [04_是妈妈是女儿_下一次见面之前_20260507] Song 1: https://cdn1.suno.ai/f81a95d3-51c8-462c-892e-7009bc8ff14a.mp3\n[15:58:14]    🎧 [04_是妈妈是女儿_下一次见面之前_20260507] Song 2: https://cdn1.suno.ai/dfbb0f75-814a-4117-a1a9-a36c4f84f741.mp3\n[15:58:14] 🎛️ [04_是妈妈是女儿_下一次见面之前_20260507] Step 3.5: 混音...\n[15:58:31]    🎚️ [04_是妈妈是女儿_下一次见面之前_20260507] Song 1: hip_hop | 低38/中56/高6%\n[15:58:48]    🎚️ [04_是妈妈是女儿_下一次见面之前_20260507] Song 2: hip_hop | 低36/中58/高5%\n[15:58:48] ✅ [04_是妈妈是女儿_下一次见面之前_20260507] Step 3.5: 33.8s | 2 songs mixed\n[15:58:48] ⚠️  [04_是妈妈是女儿_下一次见面之前_20260507] Step 4: http_403 (non-fatal)\n\n======================================================================\nSUMMARY | 488s (8.1min)\n======================================================================\n✅ Done: 3 | ⏳ Awaiting Step 2: 0 | ❌ Failed: 2\n[MasterDB] ✅ 批次 batch-20260507-154153-94511d → +3 新增, ~0 更新 | 总计 654 首\n", "stderr_tail": "[profile] ✅ Loaded profile '__runtime_batch-20260507-154153-94511d' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-154153-94511d.yaml\n[   INFO   ] MusicExtractorSVM: no classifier models were configured by default\n[   INFO   ] On connection Flux::flux → IIR::signal:\n[   INFO   ] BUFFER SIZE MISMATCH: max=0 - asked for read size 4096\n[   INFO   ] resizing buffer to 36040/4505\n[   INFO   ] On connection Flux::flux → IIR::signal:\n[   INFO   ] BUFFER SIZE MISMATCH: max=0 - asked for read size 4096\n[   INFO   ] resizing buffer to 36040/4505\n/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\n  return linkage(y, method='ward', metric='euclidean')\n/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\n  return linkage(y, method='ward', metric='euclidean')\n", "summary": {"timestamp": "2026-05-07T15:58:48.045369+08:00", "wall_clock": 488.3, "total": 5, "success": 3, "awaiting_step2": 0, "failed": 2}}, "status": "success"}
[exit 0]

=== 2026-05-07 15:58:48 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/orchestrate_phase2.py /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d --profile __runtime_batch-20260507-154153-94511d --resume-mode each --skip-feishu ===
[phase2] batch=batch-20260507-154153-94511d pending=1 groups=1
[phase2] group 1/1 -> 03_爱如火_20260507
[profile] ✅ Loaded profile '__runtime_batch-20260507-154153-94511d' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-154153-94511d.yaml
[phase2] 🌐 03_爱如火_20260507: target_language=auto
[phase2] resume -> /usr/bin/python3 /srv/repos/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/_manifest.json --resume /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d --profile __runtime_batch-20260507-154153-94511d --skip-feishu
[15:58:49] 🌐 [03_爱如火_20260507] Step 2: target_language=auto → lang_mode=EN
[15:58:49] 🤖 [03_爱如火_20260507] Step 2 API: 15094 chars ≈ 3773 tokens → claude-sonnet-4-6
[15:59:24] ⚠️  [03_爱如火_20260507] Step 2 API: originality 71% < 85% | 0 copied phrases
[15:59:24] 🔄 [03_爱如火_20260507] Step 2 API: originality retry 1/3...
[16:00:01] ⚠️  [03_爱如火_20260507] Step 2 API retry 1: originality 76%
[16:00:01] 🔄 [03_爱如火_20260507] Step 2 API: originality retry 2/3...
[16:00:43] ⚠️  [03_爱如火_20260507] Step 2 API retry 2: originality 72%
[16:00:43] 🔄 [03_爱如火_20260507] Step 2 API: originality retry 3/3...
[16:01:24] ⚠️  [03_爱如火_20260507] Step 2 API originality retry 3 failed: Expecting value: line 1 column 1 (char 0)
[16:01:24] ⚠️  [03_爱如火_20260507] Step 2 API: best originality 76% after 3 retries
[16:01:24] ✅ [03_爱如火_20260507] Step 2 API: 《Ghost Signal》 | 113.9s | in=39729 out=7009 | ~$0.224
{"timestamp": "2026-05-07T15:58:49.130380+08:00", "batch_dir": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d", "profile": "__runtime_batch-20260507-154153-94511d", "concurrency": 3, "resume_mode": "each", "pending_song_count": 1, "groups": [{"group_index": 1, "songs": ["/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/03_爱如火_20260507"], "success_count": 1, "failed_count": 0, "results": [{"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/03_爱如火_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/03_爱如火_20260507/step2_json_b.json", "agent_summary": "API direct: Ghost Signal", "returncode": 0, "stderr": "", "attempt": 1, "attempts": [{"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/03_爱如火_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d/03_爱如火_20260507/step2_json_b.json", "agent_summary": "API direct: Ghost Signal", "returncode": 0, "stderr": "", "attempt": 1}]}]}], "resume": {"status": "success", "returncode": 0, "stdout_tail": "\n======================================================================\nmusic-pipeline3000 v2 | 5 songs\n======================================================================\nGemini concurrency: 2 | Suno concurrency: 3\nOutput: /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d\nSkip Suno: False | Step1 only: False | Version: v4\n======================================================================\n\n[16:01:26] 🏥 Health check...\n[16:01:27] ✅ qishui: OK\n[16:01:27] ✅ netease: OK\n[16:01:27] ✅ qq: OK\n\n[16:01:27] 🔍 [01_恐龙抗狼_20260507] Step 0: Fetching...\n[16:01:27] ⏭️  [02_我姓石_20260507] Already complete, skipping\n[16:01:27] ⏭️  [04_是妈妈是女儿_下一次见面之前_20260507] Already complete, skipping\n[16:01:27] ⏭️  [05_一笑江湖 (DJ版)_20260507] Already complete, skipping\n  📝 [03_爱如火_20260507] lyrics stripped: 4124c → 4117c\n[16:01:27] 🎵 [03_爱如火_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...\n[16:01:27] 🎨 [03_爱如火_20260507] Step 4: SeeDream cover (parallel)...\n  ✅ submitted: ['c703637a', '88f19fad']\n  🎵 c703637a... → submitted\n  🎵 88f19fad... → submitted\n[16:01:30] ⚠️  [netease] '恐龙抗狼' too short (50s < 120s), likely a cover/clip, skipping\n[16:01:30] 🔄 [01_恐龙抗狼_20260507] Step 0: retry 1/2 in 5s...\n  🎵 c703637a... → queued\n  🎵 88f19fad... → queued\n[16:01:38] ⚠️  [netease] '恐龙抗狼' too short (50s < 120s), likely a cover/clip, skipping\n[16:01:38] 🔄 [01_恐龙抗狼_20260507] Step 0: retry 2/2 in 10s...\n  🎵 88f19fad... → streaming\n[16:01:50] ⚠️  [netease] '恐龙抗狼' too short (50s < 120s), likely a cover/clip, skipping\n[16:01:50] ❌ [01_恐龙抗狼_20260507] Step 0: No audio URL\n  🎵 c703637a... → streaming\n  🎵 88f19fad... → complete\n  🎵 c703637a... → complete\n[16:04:09]    🎧 [03_爱如火_20260507] Song 1: https://cdn1.suno.ai/c703637a-2e8e-4adc-ab80-148b5cfb6014.mp3\n[16:04:09]    🎧 [03_爱如火_20260507] Song 2: https://cdn1.suno.ai/88f19fad-ac9d-4765-a5e8-4404cdf18dfc.mp3\n[16:04:09] 🎛️ [03_爱如火_20260507] Step 3.5: 混音...\n[16:04:27]    🎚️ [03_爱如火_20260507] Song 1: jazz | 低61/中32/高7%\n[16:04:39]    🎚️ [03_爱如火_20260507] Song 2: rock | 低60/中33/高7%\n[16:04:39] ✅ [03_爱如火_20260507] Step 3.5: 30.0s | 2 songs mixed\n[16:04:39] ⚠️  [03_爱如火_20260507] Step 4: http_403 (non-fatal)\n\n======================================================================\nSUMMARY | 192s (3.2min)\n======================================================================\n✅ Done: 4 | ⏳ Awaiting Step 2: 0 | ❌ Failed: 1\n[MasterDB] ✅ 批次 batch-20260507-154153-94511d → +1 新增, ~3 更新 | 总计 655 首\n", "stderr_tail": "[profile] ✅ Loaded profile '__runtime_batch-20260507-154153-94511d' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-154153-94511d.yaml\n", "summary": {"timestamp": "2026-05-07T16:04:39.740221+08:00", "wall_clock": 192.2, "total": 5, "success": 4, "awaiting_step2": 0, "failed": 1}}, "status": "success"}
[exit 0]

=== 2026-05-07 16:04:40 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/steps/step5_feishu.py /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d ===
[Feishu] ✅ Exported 4 songs to: https://ccnu62373cgc.feishu.cn/sheets/CTkesoxBmhe83VtirxpchqKQnNd
[Feishu] 📐 Expanded master sheet from 592 to 696 rows
[Feishu] ✅ Appended 4 new songs to master sheet (rows 593-596)
[MasterDB] ✅ 批次 batch-20260507-154153-94511d → +4 新增, ~0 更新 | 总计 596 首
[Feishu IM] ✅ Text sent: 📊 本批次结果表格：https://ccnu62373cgc.feishu.cn/sheets/CTkesoxBmhe8
[16:04:50] 📨 Step 5: Sending files to Feishu IM...
[Feishu IM] ✅ [没人能把我按住] topic head sent (message_id=om_x100b50f034e6e8f0b2f3240616b637f)
[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] ✅ [Ghost Signal] topic head sent (message_id=om_x100b50f035eb58b0b3766f7cd08237d)
[Feishu IM] ✅ [Ghost Signal] Ghost Signal_V1_raw.mp3 replied
[Feishu IM] ✅ [Ghost Signal] Ghost Signal_V1_mixed.mp3 replied
[Feishu IM] ✅ [Ghost Signal] Ghost Signal_V2_raw.mp3 replied
[Feishu IM] ✅ [Ghost Signal] Ghost Signal_V2_mixed.mp3 replied
[Feishu IM] ✅ [下一次见面之前] topic head sent (message_id=om_x100b50f032977090b396ae334e33f69)
[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] ✅ [凭什么偏偏是你先走] topic head sent (message_id=om_x100b50f033ae80a0b2f233eda4dbc3b)
[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] ✅ Already on file server: /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d
[Feishu] ✅ Archived to GDrive: /mnt/gdrive/music-pipeline/batch-20260507-154153-94511d
[Feishu] 📦 Local files kept at: /srv/music-files-platform-next/pipeline/batch-20260507-154153-94511d

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