
=== 2026-05-07 15:44:34 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/_input.json -o /srv/music-files-platform-next/pipeline/batch-20260507-153328-576939 -cg 2 -cs 2 --skip-feishu --profile __runtime_batch-20260507-153328-576939 --step1-only ===
[profile] ✅ Loaded profile '__runtime_batch-20260507-153328-576939' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-153328-576939.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')

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

[15:44:35] 🏥 Health check...
[15:44:37] ✅ qishui: OK
[15:44:37] ✅ netease: OK
[15:44:37] ✅ qq: OK

[15:44:37] 🔍 [01_恐龙抗狼_20260507] Step 0: Fetching...
[15:44:37] 🔍 [02_我姓石_20260507] Step 0: Fetching...
[15:44:37] 🔍 [03_爱如火_20260507] Step 0: Fetching...
[15:44:37] 🔍 [04_是妈妈是女儿_20260507] Step 0: Fetching...
[15:44:37] 🔍 [05_一笑江湖 (DJ版)_20260507] Step 0: Fetching...
[15:44:38] ✅ [qishui] Direct ID fetch: '爱如火' id=7268581801738799105
[15:44:38] ✅ [03_爱如火_20260507] Step 0: qishui | 1834c lyrics
[15:44:38] ⬇️  [03_爱如火_20260507] Step 0.5: Download from qishui...
[15:44:39] ✅ [qishui] Direct ID fetch: '是妈妈是女儿' id=7191830963159042050
[15:44:39] ✅ [04_是妈妈是女儿_20260507] Step 0: qishui | 690c lyrics
[15:44:39] ⬇️  [04_是妈妈是女儿_20260507] Step 0.5: Download from qishui...
[15:44:40] ✅ [02_我姓石_20260507] Step 0: netease | 302c lyrics
[15:44:40] ⬇️  [02_我姓石_20260507] Step 0.5: Download from netease...
[15:44:40] ✅ [01_恐龙抗狼_20260507] Step 0: netease | 36c lyrics
[15:44:40] ⬇️  [01_恐龙抗狼_20260507] Step 0.5: Download from netease...
[15:44:42] ✅ [05_一笑江湖 (DJ版)_20260507] Step 0: netease | 441c lyrics
[15:44:42] ⬇️  [05_一笑江湖 (DJ版)_20260507] Step 0.5: Download from netease...
[15:44:43] ⚠️  [04_是妈妈是女儿_20260507] Step 0.5: Only 30.0s preview (expected 375s)
[15:44:43] 🔒 [04_是妈妈是女儿_20260507] Step 0.5: source_id locked, skipping cross-platform fallback
[15:44:43] ❌ [04_是妈妈是女儿_20260507] Step 0.5: All platforms returned preview (30.0s), skipping song
[15:44:43] ⚠️  [03_爱如火_20260507] Step 0.5: Only 60.0s preview (expected 234s)
[15:44:43] 🔒 [03_爱如火_20260507] Step 0.5: source_id locked, skipping cross-platform fallback
[15:44:43] ❌ [03_爱如火_20260507] Step 0.5: All platforms returned preview (60.0s), skipping song
[15:44:44] ✅ [01_恐龙抗狼_20260507] Step 0.5: 977838 bytes | 50.7s
[15:44:44] 🔬 [01_恐龙抗狼_20260507] Step 0.75: Audio features...
[15:44:46] ✅ [02_我姓石_20260507] Step 0.5: 3048037 bytes | 147.6s
[15:44:46] 🔬 [02_我姓石_20260507] Step 0.75: Audio features...
[15:44:52] ✅ [05_一笑江湖 (DJ版)_20260507] Step 0.5: 4530999 bytes | 243.5s
[15:44:52] 🔬 [05_一笑江湖 (DJ版)_20260507] Step 0.75: Audio features...
[15:44:59] ✅ [01_恐龙抗狼_20260507] Step 0.75: BPM=132.0 Key=D# major (15.3s)
[15:44:59] 🧠 [01_恐龙抗狼_20260507] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-05-07T07:44:59.327Z", "trace_id": "batch-20260507-153328-576939", "song_key": "01_恐龙抗狼_20260507", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/01_恐龙抗狼_20260507/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')
[15:45:13] ✅ [02_我姓石_20260507] Step 0.75: BPM=129.76 Key=E major (27.5s)
[15:45:13] 🧠 [02_我姓石_20260507] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-05-07T07:45:13.856Z", "trace_id": "batch-20260507-153328-576939", "song_key": "02_我姓石_20260507", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/02_我姓石_20260507/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')
  ⚠️ 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...
[15:45:25] ✅ [05_一笑江湖 (DJ版)_20260507] Step 0.75: BPM=85.92 Key=A# minor (26.5s)
[15:45:25] 🧠 [05_一笑江湖 (DJ版)_20260507] Step 1: Gemini (queuing)...
{"__trace__": true, "ts": "2026-05-07T07:45:25.883Z", "trace_id": "batch-20260507-153328-576939", "song_key": "05_一笑江湖 (DJ版)_20260507", "step": "step1", "type": "step_start", "inputs": {"audio": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/05_一笑江湖 (DJ版)_20260507/song_pgc.mp3", "has_features": true}}
  📊 Gemini official: 42s | prompt_tokens=4746 completion=1076
{"__trace__": true, "ts": "2026-05-07T07:46:09.920Z", "trace_id": "batch-20260507-153328-576939", "song_key": "01_恐龙抗狼_20260507", "step": "step1", "type": "api_call", "provider": "gemini", "model": "gemini-2.5-pro", "duration_sec": 42.0, "cost_usd": null, "status": "success"}
{"__trace__": true, "ts": "2026-05-07T07:46:09.920Z", "trace_id": "batch-20260507-153328-576939", "song_key": "01_恐龙抗狼_20260507", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 70.593}
[15:46:09] ⚠️  [01_恐龙抗狼_20260507] Step 1.5: prompt 1061c > 1000c, compressing...
  📏 [01_恐龙抗狼_20260507] prompt 1061c → 989c (smart truncate)
[15:46:09] ✅ [01_恐龙抗狼_20260507] Step 1.5: prompt compressed 1061c → 989c
[15:46:09] ✅ [01_恐龙抗狼_20260507] Step 1: 42.0s | prompt=989c | prompt_ok=True lyrics_ok=True
  ⚠️ Gemini official 503 on key #1/5, will retry...
  🔄 Retry 1/4 in 3s...
  📊 Gemini official: 62s | prompt_tokens=8081 completion=1444
{"__trace__": true, "ts": "2026-05-07T07:46:27.764Z", "trace_id": "batch-20260507-153328-576939", "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:46:27.764Z", "trace_id": "batch-20260507-153328-576939", "song_key": "02_我姓石_20260507", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 73.908}
[15:46:27] ⚠️  [02_我姓石_20260507] Step 1.5: prompt 1094c > 1000c, compressing...
  📏 [02_我姓石_20260507] prompt 1094c → 980c (smart truncate)
[15:46:27] ✅ [02_我姓石_20260507] Step 1.5: prompt compressed 1094c → 980c
[15:46:27] ✅ [02_我姓石_20260507] Step 1: 61.8s | prompt=980c | prompt_ok=True lyrics_ok=True
  ⚠️ 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: 55s | prompt_tokens=11289 completion=1407
{"__trace__": true, "ts": "2026-05-07T07:47:34.703Z", "trace_id": "batch-20260507-153328-576939", "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:47:34.703Z", "trace_id": "batch-20260507-153328-576939", "song_key": "05_一笑江湖 (DJ版)_20260507", "step": "step1", "type": "step_end", "status": "success", "duration_sec": 128.82}
[15:47:34] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 1.5: prompt 1381c > 1000c, compressing...
  📏 [05_一笑江湖 (DJ版)_20260507] prompt 1381c → 889c (smart truncate)
[15:47:34] ✅ [05_一笑江湖 (DJ版)_20260507] Step 1.5: prompt compressed 1381c → 889c
[15:47:34] ✅ [05_一笑江湖 (DJ版)_20260507] Step 1: 55.0s | prompt=889c | prompt_ok=True lyrics_ok=True

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

=== 2026-05-07 15:47:35 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/orchestrate_phase2.py /srv/music-files-platform-next/pipeline/batch-20260507-153328-576939 --profile __runtime_batch-20260507-153328-576939 --resume-mode each --skip-feishu ===
[phase2] batch=batch-20260507-153328-576939 pending=3 groups=1
[phase2] group 1/1 -> 01_恐龙抗狼_20260507, 02_我姓石_20260507, 05_一笑江湖 (DJ版)_20260507
[profile] ✅ Loaded profile '__runtime_batch-20260507-153328-576939' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-153328-576939.yaml
[phase2] 🌐 01_恐龙抗狼_20260507: target_language=auto
[profile] ✅ Loaded profile '__runtime_batch-20260507-153328-576939' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-153328-576939.yaml
[phase2] 🌐 02_我姓石_20260507: target_language=auto
[profile] ✅ Loaded profile '__runtime_batch-20260507-153328-576939' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-153328-576939.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-153328-576939/_manifest.json --resume /srv/music-files-platform-next/pipeline/batch-20260507-153328-576939 --profile __runtime_batch-20260507-153328-576939 --skip-feishu

=== 2026-05-07 15:52:36 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/_input.json -o /srv/music-files-platform-next/pipeline/batch-20260507-153328-576939 -cg 2 -cs 2 --skip-feishu --profile __runtime_batch-20260507-153328-576939 --resume /srv/music-files-platform-next/pipeline/batch-20260507-153328-576939 ===
[profile] ✅ Loaded profile '__runtime_batch-20260507-153328-576939' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-153328-576939.yaml
[step075] cache hit: song_pgc.mp3 → b3a339735358
[step075] cache hit: song_pgc.mp3 → 65673e877098

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

[15:52:37] 🏥 Health check...
[15:52:39] ✅ qishui: OK
[15:52:39] ✅ netease: OK
[15:52:39] ✅ qq: OK

[15:52:39] ⏭️  [01_恐龙抗狼_20260507] Already complete, skipping
[15:52:39] 🔬 [03_爱如火_20260507] Step 0.75: Audio features...
[15:52:39] ✅ [03_爱如火_20260507] Step 0.75: BPM=172.27 Key=E minor (12.1s)
[15:52:39] 🔬 [04_是妈妈是女儿_20260507] Step 0.75: Audio features...
[15:52:39] ✅ [04_是妈妈是女儿_20260507] Step 0.75: BPM=136.64 Key=A# major (10.1s)
  📝 [02_我姓石_20260507] lyrics stripped: 3400c → 3393c
[15:52:39] 🎵 [02_我姓石_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...
[15:52:39] 🎨 [02_我姓石_20260507] Step 4: SeeDream cover (parallel)...
  📝 [05_一笑江湖 (DJ版)_20260507] lyrics stripped: 3182c → 3175c
[15:52:39] 🎵 [05_一笑江湖 (DJ版)_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...
[15:52:39] 🎨 [05_一笑江湖 (DJ版)_20260507] Step 4: SeeDream cover (parallel)...
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 365, in run_song
    lyrics = (song_dir / "lyrics.txt").read_text()
  File "/usr/lib/python3.13/pathlib/_local.py", line 548, in read_text
    return PathBase.read_text(self, encoding, errors, newline)
           ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/pathlib/_abc.py", line 632, in read_text
    with self.open(mode='r', 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-153328-576939/03_爱如火_20260507/lyrics.txt'
[exit 1]

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

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

[15:52:41] 🏥 Health check...
[15:52:42] ✅ qishui: OK
[15:52:42] ✅ netease: OK
[15:52:42] ✅ qq: OK

[15:52:42] ⏭️  [01_恐龙抗狼_20260507] Already complete, skipping
  📝 [02_我姓石_20260507] lyrics stripped: 3400c → 3393c
[15:52:42] 🎵 [02_我姓石_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...
[15:52:42] 🎨 [02_我姓石_20260507] Step 4: SeeDream cover (parallel)...
  📝 [05_一笑江湖 (DJ版)_20260507] lyrics stripped: 3182c → 3175c
[15:52:42] 🎵 [05_一笑江湖 (DJ版)_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...
[15:52:42] 🎨 [05_一笑江湖 (DJ版)_20260507] Step 4: SeeDream cover (parallel)...
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 365, in run_song
    lyrics = (song_dir / "lyrics.txt").read_text()
  File "/usr/lib/python3.13/pathlib/_local.py", line 548, in read_text
    return PathBase.read_text(self, encoding, errors, newline)
           ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/pathlib/_abc.py", line 632, in read_text
    with self.open(mode='r', 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-153328-576939/03_爱如火_20260507/lyrics.txt'
[exit 1]

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

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

[15:52:44] 🏥 Health check...
[15:52:45] ✅ qishui: OK
[15:52:45] ✅ netease: OK
[15:52:45] ✅ qq: OK

[15:52:45] ⏭️  [01_恐龙抗狼_20260507] Already complete, skipping
  📝 [02_我姓石_20260507] lyrics stripped: 3400c → 3393c
[15:52:45] 🎵 [02_我姓石_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...
[15:52:46] 🎨 [02_我姓石_20260507] Step 4: SeeDream cover (parallel)...
  📝 [05_一笑江湖 (DJ版)_20260507] lyrics stripped: 3182c → 3175c
[15:52:46] 🎵 [05_一笑江湖 (DJ版)_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...
[15:52:46] 🎨 [05_一笑江湖 (DJ版)_20260507] Step 4: SeeDream cover (parallel)...
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 365, in run_song
    lyrics = (song_dir / "lyrics.txt").read_text()
  File "/usr/lib/python3.13/pathlib/_local.py", line 548, in read_text
    return PathBase.read_text(self, encoding, errors, newline)
           ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/pathlib/_abc.py", line 632, in read_text
    with self.open(mode='r', 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-153328-576939/03_爱如火_20260507/lyrics.txt'
[exit 1]
[15:47:35] 🌐 [01_恐龙抗狼_20260507] Step 2: target_language=auto → lang_mode=AUTO
[15:47:35] 🤖 [01_恐龙抗狼_20260507] Step 2 API: 13289 chars ≈ 3322 tokens → claude-sonnet-4-6
[15:47:35] 🌐 [02_我姓石_20260507] Step 2: target_language=auto → lang_mode=AUTO
[15:47:35] 🤖 [02_我姓石_20260507] Step 2 API: 14187 chars ≈ 3546 tokens → claude-sonnet-4-6
[15:47:35] 🌐 [05_一笑江湖 (DJ版)_20260507] Step 2: target_language=auto → lang_mode=AUTO
[15:47:35] 🤖 [05_一笑江湖 (DJ版)_20260507] Step 2 API: 13883 chars ≈ 3470 tokens → claude-sonnet-4-6
[15:47:56] ✅ [01_恐龙抗狼_20260507] Step 2 API: 《蹦个痛快再说》 | 21.0s | in=10004 out=1890 | ~$0.058
[15:48:06] ⚠️  [02_我姓石_20260507] Step 2 API: originality 77% < 85% | 0 copied phrases
[15:48:06] 🔄 [02_我姓石_20260507] Step 2 API: originality retry 1/3...
[15:48:06] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 2 API: originality 77% < 85% | 0 copied phrases
[15:48:06] 🔄 [05_一笑江湖 (DJ版)_20260507] Step 2 API: originality retry 1/3...
[15:48:31] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 2 API retry 1: originality 79%
[15:48:31] 🔄 [05_一笑江湖 (DJ版)_20260507] Step 2 API: originality retry 2/3...
[15:48:39] ⚠️  [02_我姓石_20260507] Step 2 API retry 1: originality 78%
[15:48:39] 🔄 [02_我姓石_20260507] Step 2 API: originality retry 2/3...
[15:49:04] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 2 API retry 2: originality 80%
[15:49:04] 🔄 [05_一笑江湖 (DJ版)_20260507] Step 2 API: originality retry 3/3...
[15:49:17] ⚠️  [02_我姓石_20260507] Step 2 API originality retry 2 failed: Expecting value: line 1 column 1 (char 0)
[15:49:17] ⚠️  [02_我姓石_20260507] Step 2 API: best originality 78% after 3 retries
[15:49:17] ✅ [02_我姓石_20260507] Step 2 API: 《没人能拦我》 | 63.2s | in=23502 out=4708 | ~$0.141
[15:49:38] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 2 API originality retry 3 failed: Expecting value: line 1 column 1 (char 0)
[15:49:38] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 2 API: best originality 80% after 3 retries
[15:49:38] ✅ [05_一笑江湖 (DJ版)_20260507] Step 2 API: 《凭什么先放手的不是我》 | 88.7s | in=38310 out=6291 | ~$0.209
{"timestamp": "2026-05-07T15:47:35.628481+08:00", "batch_dir": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939", "profile": "__runtime_batch-20260507-153328-576939", "concurrency": 3, "resume_mode": "each", "pending_song_count": 3, "groups": [{"group_index": 1, "songs": ["/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/01_恐龙抗狼_20260507", "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/02_我姓石_20260507", "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/05_一笑江湖 (DJ版)_20260507"], "success_count": 3, "failed_count": 0, "results": [{"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/01_恐龙抗狼_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/01_恐龙抗狼_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-153328-576939/01_恐龙抗狼_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/01_恐龙抗狼_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-153328-576939/02_我姓石_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/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-153328-576939/02_我姓石_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/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-153328-576939/05_一笑江湖 (DJ版)_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/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-153328-576939/05_一笑江湖 (DJ版)_20260507", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260507-153328-576939/05_一笑江湖 (DJ版)_20260507/step2_json_b.json", "agent_summary": "API direct: 凭什么先放手的不是我", "returncode": 0, "stderr": "", "attempt": 1}]}]}], "resume": {"status": "success", "returncode": 0, "stdout_tail": "  [03_爱如火_20260507] Step 0.5: Only 60.0s preview (expected 234s)\n[15:49:43] 🔒 [03_爱如火_20260507] Step 0.5: source_id locked, skipping cross-platform fallback\n[15:49:43] ❌ [03_爱如火_20260507] Step 0.5: All platforms returned preview (60.0s), skipping song\n[15:49:43] ⬇️  [04_是妈妈是女儿_20260507] Step 0.5: Download from qishui...\n[15:49:43] ⚠️  [04_是妈妈是女儿_20260507] Step 0.5: Only 30.0s preview (expected 375s)\n[15:49:43] 🔒 [04_是妈妈是女儿_20260507] Step 0.5: source_id locked, skipping cross-platform fallback\n[15:49:43] ❌ [04_是妈妈是女儿_20260507] Step 0.5: All platforms returned preview (30.0s), skipping song\n  📝 [01_恐龙抗狼_20260507] lyrics stripped: 2533c → 2527c\n[15:49:43] 🎵 [01_恐龙抗狼_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...\n[15:49:43] 🎨 [01_恐龙抗狼_20260507] Step 4: SeeDream cover (parallel)...\n  📝 [02_我姓石_20260507] lyrics stripped: 3400c → 3393c\n[15:49:43] 🎵 [02_我姓石_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...\n[15:49:43] 🎨 [02_我姓石_20260507] Step 4: SeeDream cover (parallel)...\n  📝 [05_一笑江湖 (DJ版)_20260507] lyrics stripped: 3182c → 3175c\n[15:49:43] 🎵 [05_一笑江湖 (DJ版)_20260507] Step 3: Suno generation (weirdness=50, style_influence=50)...\n[15:49:43] 🎨 [05_一笑江湖 (DJ版)_20260507] Step 4: SeeDream cover (parallel)...\n  ✅ submitted: ['7a292973', '0b44fda7']\n  ✅ submitted: ['9a01da30', 'a351cb8e']\n  🎵 7a292973... → submitted\n  🎵 0b44fda7... → submitted\n  🎵 9a01da30... → submitted\n  🎵 a351cb8e... → submitted\n  ✅ submitted: ['02e47dc7', '95f04aab']\n  🎵 02e47dc7... → submitted\n  🎵 95f04aab... → submitted\n  🎵 9a01da30... → queued\n  🎵 a351cb8e... → queued\n  🎵 7a292973... → queued\n  🎵 0b44fda7... → queued\n  🎵 02e47dc7... → queued\n  🎵 95f04aab... → queued\n  🎵 9a01da30... → streaming\n  🎵 a351cb8e... → streaming\n  🎵 7a292973... → streaming\n  🎵 0b44fda7... → streaming\n  🎵 02e47dc7... → streaming\n  🎵 95f04aab... → streaming\n  ⚠️  poll http_429, retry...\n  ⚠️  poll http_429, retry...\n  ⚠️  poll http_429, retry...\n  ⚠️  poll http_429, retry...\n  🎵 0b44fda7... → complete\n  🎵 7a292973... → complete\n[15:51:55]    🎧 [01_恐龙抗狼_20260507] Song 1: https://cdn1.suno.ai/7a292973-1725-4576-ac91-db997219ef81.mp3\n[15:51:55]    🎧 [01_恐龙抗狼_20260507] Song 2: https://cdn1.suno.ai/0b44fda7-02e5-4cb3-8521-fc668c866fca.mp3\n[15:51:55] 🎛️ [01_恐龙抗狼_20260507] Step 3.5: 混音...\n[15:52:12]    🎚️ [01_恐龙抗狼_20260507] Song 1: edm | 低66/中29/高5%\n  🎵 9a01da30... → complete\n[15:52:23]    🎚️ [01_恐龙抗狼_20260507] Song 2: edm | 低71/中24/高4%\n[15:52:23] ✅ [01_恐龙抗狼_20260507] Step 3.5: 27.4s | 2 songs mixed\n[15:52:23] ⚠️  [01_恐龙抗狼_20260507] Step 4: http_403 (non-fatal)\n  🎵 95f04aab... → complete\n  🎵 a351cb8e... → complete\n[15:52:54]    🎧 [02_我姓石_20260507] Song 1: https://cdn1.suno.ai/9a01da30-5423-4937-9bf6-9a601694ad31.mp3\n[15:52:54]    🎧 [02_我姓石_20260507] Song 2: https://cdn1.suno.ai/a351cb8e-beb2-4cfe-b3b5-187af26cf10a.mp3\n[15:52:54] 🎛️ [02_我姓石_20260507] Step 3.5: 混音...\n[15:53:10]    🎚️ [02_我姓石_20260507] Song 1: edm | 低79/中16/高5%\n  🎵 02e47dc7... → complete\n[15:53:10]    🎧 [05_一笑江湖 (DJ版)_20260507] Song 1: https://cdn1.suno.ai/02e47dc7-3870-4c0d-9b53-1138beaac1c9.mp3\n[15:53:10]    🎧 [05_一笑江湖 (DJ版)_20260507] Song 2: https://cdn1.suno.ai/95f04aab-11fc-4b19-b595-00b23e67cef3.mp3\n[15:53:10] 🎛️ [05_一笑江湖 (DJ版)_20260507] Step 3.5: 混音...\n[15:53:26]    🎚️ [02_我姓石_20260507] Song 2: edm | 低64/中31/高5%\n[15:53:26] ✅ [02_我姓石_20260507] Step 3.5: 31.2s | 2 songs mixed\n[15:53:26] ⚠️  [02_我姓石_20260507] Step 4: http_403 (non-fatal)\n[15:53:41]    🎚️ [05_一笑江湖 (DJ版)_20260507] Song 1: pop | 低46/中49/高5%\n[15:53:58]    🎚️ [05_一笑江湖 (DJ版)_20260507] Song 2: pop | 低48/中45/高7%\n[15:53:58] ✅ [05_一笑江湖 (DJ版)_20260507] Step 3.5: 47.9s | 2 songs mixed\n[15:53:58] ⚠️  [05_一笑江湖 (DJ版)_20260507] Step 4: http_403 (non-fatal)\n\n======================================================================\nSUMMARY | 255s (4.2min)\n======================================================================\n✅ Done: 3 | ⏳ Awaiting Step 2: 0 | ❌ Failed: 2\n[MasterDB] ✅ 批次 batch-20260507-153328-576939 → +3 新增, ~0 更新 | 总计 651 首\n", "stderr_tail": "[profile] ✅ Loaded profile '__runtime_batch-20260507-153328-576939' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260507-153328-576939.yaml\n[step05] cache hit: ede9586ce964 → song_pgc.mp3\n[step05] cache hit: 443331c38a53 → song_pgc.mp3\n", "summary": {"timestamp": "2026-05-07T15:53:58.254336+08:00", "wall_clock": 254.9, "total": 5, "success": 3, "awaiting_step2": 0, "failed": 2}}, "status": "success"}
[exit 0]

=== 2026-05-07 15:53:59 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-153328-576939 ===
[Feishu] ✅ Exported 3 songs to: https://ccnu62373cgc.feishu.cn/sheets/A809sluxihoxegtzDFscA1nznGf
[Feishu] 📐 Expanded master sheet from 589 to 692 rows
[Feishu] ✅ Appended 3 new songs to master sheet (rows 590-592)
[MasterDB] ✅ 批次 batch-20260507-153328-576939 → +3 新增, ~0 更新 | 总计 592 首
[Feishu IM] ✅ Text sent: 📊 本批次结果表格：https://ccnu62373cgc.feishu.cn/sheets/A809sluxihox
[15:54:07] 📨 Step 5: Sending files to Feishu IM...
[Feishu IM] ✅ [蹦个痛快再说] topic head sent (message_id=om_x100b50f01f33e084b374a9084468c10)
[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_x100b50f01c259cbcb2bfb3af33c7c31)
[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_x100b50f01d201084b4bd3c9742fdc38)
[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-153328-576939
[Feishu] ✅ Archived to GDrive: /mnt/gdrive/music-pipeline/batch-20260507-153328-576939
[Feishu] 📦 Local files kept at: /srv/music-files-platform-next/pipeline/batch-20260507-153328-576939

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