
=== 2026-04-19 11:51:32 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/_input.json -o /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228 -cg 2 -cs 2 --skip-feishu --profile __runtime_batch-20260419-115132-6d7228 --step1-only ===
[profile] ✅ Loaded profile '__runtime_batch-20260419-115132-6d7228' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260419-115132-6d7228.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 | 3 songs
======================================================================
Gemini concurrency: 2 | Suno concurrency: 2
Output: /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228
Skip Suno: False | Step1 only: True | Version: v4
======================================================================

[11:51:33] 🏥 Health check...
[11:51:35] ✅ qishui: OK
[11:51:35] ✅ netease: OK
[11:51:35] ✅ qq: OK

[11:51:35] 🔍 [01_places to be_20260419] Step 0: Fetching...
[11:51:35] 🔍 [02_adore u_20260419] Step 0: Fetching...
[11:51:35] 🔍 [03_Victory Lap_20260419] Step 0: Fetching...
[11:51:39] ✅ [02_adore u_20260419] Step 0: netease | 4161c
[11:51:39] ⬇️  [02_adore u_20260419] Step 0.5: Download from netease...
[11:51:39] ✅ [01_places to be_20260419] Step 0: netease | 2725c
[11:51:39] ⬇️  [01_places to be_20260419] Step 0.5: Download from netease...
[11:51:44] ✅ [02_adore u_20260419] Step 0.5: 4605184 bytes | 220.7s
[11:51:44] 🔬 [02_adore u_20260419] Step 0.75: Audio features...
[11:51:44] ✅ [01_places to be_20260419] Step 0.5: 5245572 bytes | 226.7s
[11:51:44] 🔬 [01_places to be_20260419] Step 0.75: Audio features...
[11:51:45] 🔄 [03_Victory Lap_20260419] Step 0: retry 1/2 in 5s...
[11:51:59] ⚠️  [qq] Exact source_id '000WA5yN17yRML' not found for 'Victory Lap'
[11:51:59] 🔄 [03_Victory Lap_20260419] Step 0: retry 2/2 in 10s...
[11:52:10] ⚠️  [qq] Exact source_id '000WA5yN17yRML' not found for 'Victory Lap'
[11:52:10] ❌ [03_Victory Lap_20260419] Step 0: No audio URL
[11:52:26] ✅ [01_places to be_20260419] Step 0.75: BPM=87.08 Key=D minor (42.0s)
[11:52:26] 🧠 [01_places to be_20260419] Step 1: Gemini (queuing)...
[11:52:30] ✅ [02_adore u_20260419] Step 0.75: BPM=123.97 Key=C major (46.0s)
[11:52:30] 🧠 [02_adore u_20260419] Step 1: Gemini (queuing)...
  📊 Gemini official: 40s | prompt_tokens=11542 completion=1587
[11:53:10] ⚠️  [02_adore u_20260419] Step 1.5: prompt 1132c > 1000c, compressing...
  📏 [02_adore u_20260419] prompt 1132c → 778c (smart truncate)
[11:53:10] ✅ [02_adore u_20260419] Step 1.5: prompt compressed 1132c → 778c
[11:53:10] ✅ [02_adore u_20260419] Step 1: 40.0s | prompt=778c | prompt_ok=True lyrics_ok=True
  📊 Gemini official: 45s | prompt_tokens=11241 completion=1770
[11:53:11] ⚠️  [01_places to be_20260419] Step 1.5: prompt 1234c > 1000c, compressing...
  📏 [01_places to be_20260419] prompt 1234c → 918c (smart truncate)
[11:53:11] ✅ [01_places to be_20260419] Step 1.5: prompt compressed 1234c → 918c
[11:53:11] ✅ [01_places to be_20260419] Step 1: 45.1s | prompt=918c | prompt_ok=True lyrics_ok=True

======================================================================
SUMMARY | 96s (1.6min)
======================================================================
✅ Done: 2 | ⏳ Awaiting Step 2: 0 | ❌ Failed: 1
[MasterDB] ✅ 批次 batch-20260419-115132-6d7228 → +0 新增, ~0 更新 | 总计 470 首
[exit 0]

=== 2026-04-19 11:53:12 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/orchestrate_phase2.py /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228 --profile grammy --resume-mode each --skip-feishu ===
[phase2] batch=batch-20260419-115132-6d7228 pending=2 groups=1
[phase2] group 1/1 -> 01_places to be_20260419, 02_adore u_20260419
[profile] ✅ Loaded profile 'grammy' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/grammy.yaml
[phase2] 🌐 01_places to be_20260419: target_language=auto
[profile] ✅ Loaded profile 'grammy' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/grammy.yaml
[phase2] 🌐 02_adore u_20260419: 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-20260419-115132-6d7228/_manifest.json --resume /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228 --profile grammy --skip-feishu

=== 2026-04-19 11:56:42 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/pipeline.py /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/_input.json -o /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228 -cg 2 -cs 2 --skip-feishu --profile __runtime_batch-20260419-115132-6d7228 --resume /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228 ===
[profile] ✅ Loaded profile '__runtime_batch-20260419-115132-6d7228' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/__runtime_batch-20260419-115132-6d7228.yaml
[11:53:13] 🌐 [01_places to be_20260419] Step 2: target_language=auto → lang_mode=EN
[11:53:13] 🤖 [01_places to be_20260419] Step 2 API: 29334 chars ≈ 7333 tokens → claude-sonnet-4-6
[11:53:13] 🌐 [02_adore u_20260419] Step 2: target_language=auto → lang_mode=EN
[11:53:13] 🤖 [02_adore u_20260419] Step 2 API: 28756 chars ≈ 7189 tokens → claude-sonnet-4-6
[11:53:45] ⚠️  [02_adore u_20260419] Step 2 API: originality 49% < 85% | 4 copied phrases
          ❗ "; motif repeats twice, then resolves downwards on the final phrase.)" ~ "; motif repeats twice, then resolves downwards on the final phrase.)" (100%)
          ❗ "over the root C chord for a full beat on "dancer", creating a bright, yearning tension before resolving down.)" ~ "over the root C chord for a full beat on "dancer", creating a bright, yearning tension before resolving down.)" (100%)
          ❗ "; motif repeats twice, then resolves downwards on the final phrase.)" ~ "; motif repeats twice, then resolves downwards on the final phrase.)" (100%)
          ❗ "over the root C chord for a full beat on "dancer", creating a bright, yearning tension before resolving down.)" ~ "over the root C chord for a full beat on "dancer", creating a bright, yearning tension before resolving down.)" (100%)
[11:53:45] 🔄 [02_adore u_20260419] Step 2 API: originality retry 1/3...
[11:54:06] ⚠️  [01_places to be_20260419] Step 2 API: originality 48% < 85% | 7 copied phrases
          ❗ "for an extended duration, creating a moment of sincere, emotional release before resolving downwards just before the chorus hits.)" ~ "for an extended duration, creating a moment of sincere, emotional release before resolving downwards just before the chorus hits.)" (100%)
          ❗ "You got that" ~ "You got that" (100%)
          ❗ "You got that" ~ "You got that" (100%)
          ❗ "I don't know, there's something about that charge" ~ "I don't know there's something about that song" (91%)
          ❗ "Sheesh, you know you carry that" ~ "Sheesh, you know you got that" (87%)
[11:54:06] 🔄 [01_places to be_20260419] Step 2 API: originality retry 1/3...
[11:54:19] ⚠️  [02_adore u_20260419] Step 2 API originality retry 1 failed: Expecting value: line 1 column 1 (char 0)
[11:54:19] ⚠️  [02_adore u_20260419] Step 2 API: best originality 49% after 3 retries
[11:54:19] ✅ [02_adore u_20260419] Step 2 API: 《Softer Side》 | 32.1s | in=15064 out=2329 | ~$0.080
[11:55:03] ⚠️  [01_places to be_20260419] Step 2 API retry 1: originality 56%
[11:55:03] 🔄 [01_places to be_20260419] Step 2 API: originality retry 2/3...
[11:55:59] ⚠️  [01_places to be_20260419] Step 2 API originality retry 2 failed: Expecting value: line 1 column 1 (char 0)
[11:55:59] ⚠️  [01_places to be_20260419] Step 2 API: best originality 56% after 3 retries
[11:55:59] ✅ [01_places to be_20260419] Step 2 API: 《Skin & Static》 | 110.4s | in=33974 out=5151 | ~$0.179
{"timestamp": "2026-04-19T11:53:13.137906+08:00", "batch_dir": "/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228", "profile": "grammy", "concurrency": 3, "resume_mode": "each", "pending_song_count": 2, "groups": [{"group_index": 1, "songs": ["/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/01_places to be_20260419", "/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/02_adore u_20260419"], "success_count": 2, "failed_count": 0, "results": [{"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/01_places to be_20260419", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/01_places to be_20260419/step2_json_b.json", "agent_summary": "API direct: Skin & Static", "returncode": 0, "stderr": "", "attempt": 1, "attempts": [{"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/01_places to be_20260419", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/01_places to be_20260419/step2_json_b.json", "agent_summary": "API direct: Skin & Static", "returncode": 0, "stderr": "", "attempt": 1}]}, {"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/02_adore u_20260419", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/02_adore u_20260419/step2_json_b.json", "agent_summary": "API direct: Softer Side", "returncode": 0, "stderr": "", "attempt": 1, "attempts": [{"status": "success", "song_dir": "/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/02_adore u_20260419", "step2_file": "/srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/02_adore u_20260419/step2_json_b.json", "agent_summary": "API direct: Softer Side", "returncode": 0, "stderr": "", "attempt": 1}]}]}], "resume": {"status": "success", "returncode": 0, "stdout_tail": "\n======================================================================\nmusic-pipeline3000 v2 | 3 songs\n======================================================================\nGemini concurrency: 2 | Suno concurrency: 3\nOutput: /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228\nSkip Suno: False | Step1 only: False | Version: v4\n======================================================================\n\n[11:56:01] 🏥 Health check...\n[11:56:05] ✅ qishui: OK\n[11:56:05] ✅ netease: OK\n[11:56:05] ✅ qq: OK\n\n[11:56:05] 🔍 [03_Victory Lap_20260419] Step 0: Fetching...\n  📝 [01_places to be_20260419] lyrics stripped: 5350c → 5000c\n[11:56:05] 🎵 [01_places to be_20260419] Step 3: Suno generation (weirdness=50, style_influence=50)...\n[11:56:05] 🎨 [01_places to be_20260419] Step 4: SeeDream cover (parallel)...\n  📝 [02_adore u_20260419] lyrics stripped: 4775c → 4768c\n[11:56:05] 🎵 [02_adore u_20260419] Step 3: Suno generation (weirdness=50, style_influence=50)...\n[11:56:05] 🎨 [02_adore u_20260419] Step 4: SeeDream cover (parallel)...\n[11:56:05] ⚠️  [qq] Exact source_id '000WA5yN17yRML' not found for 'Victory Lap'\n[11:56:05] 🔄 [03_Victory Lap_20260419] Step 0: retry 1/2 in 5s...\n  ✅ submitted: ['b5248166', '393f3175']\n  🎵 b5248166... → submitted\n  🎵 393f3175... → submitted\n  ✅ submitted: ['4f435ab8', 'c3c89eeb']\n  🎵 4f435ab8... → submitted\n  🎵 c3c89eeb... → submitted\n[11:56:10] ⚠️  [qq] Exact source_id '000WA5yN17yRML' not found for 'Victory Lap'\n[11:56:10] 🔄 [03_Victory Lap_20260419] Step 0: retry 2/2 in 10s...\n  🎵 b5248166... → queued\n  🎵 393f3175... → queued\n  🎵 4f435ab8... → queued\n  🎵 c3c89eeb... → queued\n[11:56:20] ⚠️  [qq] Exact source_id '000WA5yN17yRML' not found for 'Victory Lap'\n[11:56:20] ❌ [03_Victory Lap_20260419] Step 0: No audio URL\n  🎵 c3c89eeb... → streaming\n  🎵 393f3175... → streaming\n  🎵 4f435ab8... → streaming\n  🎵 b5248166... → streaming\n  🎵 4f435ab8... → complete\n  🎵 393f3175... → complete\n  🎵 b5248166... → complete\n[11:58:28]    🎧 [02_adore u_20260419] Song 1: https://cdn1.suno.ai/b5248166-cfcf-4a58-ae8d-fe00afbe8e41.mp3\n[11:58:28]    🎧 [02_adore u_20260419] Song 2: https://cdn1.suno.ai/393f3175-a25b-4b00-92b9-c206fe40533b.mp3\n[11:58:28] 🎛️ [02_adore u_20260419] Step 3.5: 混音...\n[11:58:51]    🎚️ [02_adore u_20260419] Song 1: edm | 低80/中18/高3%\n  🎵 c3c89eeb... → complete\n[11:58:51]    🎧 [01_places to be_20260419] Song 1: https://cdn1.suno.ai/4f435ab8-ed90-4328-8057-7efb2cac19f3.mp3\n[11:58:51]    🎧 [01_places to be_20260419] Song 2: https://cdn1.suno.ai/c3c89eeb-3611-4119-bcc3-ef67385d40b1.mp3\n[11:58:51] 🎛️ [01_places to be_20260419] Step 3.5: 混音...\n[11:59:10]    🎚️ [02_adore u_20260419] Song 2: pop | 低49/中43/高8%\n[11:59:10] ✅ [02_adore u_20260419] Step 3.5: 42.5s | 2 songs mixed\n[11:59:32]    🎚️ [01_places to be_20260419] Song 1: rock | 低70/中25/高5%\n[11:59:32] ✅ [02_adore u_20260419] Step 4: 17.8s | /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/02_adore u_20260419/cover_seedream.jpg\n[11:59:53]    🎚️ [01_places to be_20260419] Song 2: jazz | 低75/中21/高4%\n[11:59:53] ✅ [01_places to be_20260419] Step 3.5: 61.6s | 2 songs mixed\n[11:59:55] ✅ [01_places to be_20260419] Step 4: 19.0s | /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228/01_places to be_20260419/cover_seedream.jpg\n\n======================================================================\nSUMMARY | 231s (3.8min)\n======================================================================\n✅ Done: 2 | ⏳ Awaiting Step 2: 0 | ❌ Failed: 1\n[MasterDB] ✅ 批次 batch-20260419-115132-6d7228 → +2 新增, ~0 更新 | 总计 474 首\n", "stderr_tail": "[profile] ✅ Loaded profile 'grammy' from /srv/repos/3000music-platform-next/services/music-pipeline/scripts/profiles/grammy.yaml\n", "summary": {"timestamp": "2026-04-19T11:59:55.731773+08:00", "wall_clock": 230.6, "total": 3, "success": 2, "awaiting_step2": 0, "failed": 1}}, "status": "success"}
[exit 0]

=== 2026-04-19 11:59:57 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/steps/step5_feishu.py /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228 ===

======================================================================
music-pipeline3000 v2 | 3 songs
======================================================================
Gemini concurrency: 2 | Suno concurrency: 2
Output: /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228
Skip Suno: False | Step1 only: False | Version: v4
======================================================================

[11:56:43] 🏥 Health check...
[11:56:45] ✅ qishui: OK
[11:56:45] ✅ netease: OK
[11:56:45] ✅ qq: OK

[11:56:45] 🔍 [03_Victory Lap_20260419] Step 0: Fetching...
  📝 [01_places to be_20260419] lyrics stripped: 5350c → 5000c
[11:56:45] 🎵 [01_places to be_20260419] Step 3: Suno generation (weirdness=50, style_influence=50)...
[11:56:45] 🎨 [01_places to be_20260419] Step 4: SeeDream cover (parallel)...
  📝 [02_adore u_20260419] lyrics stripped: 4775c → 4768c
[11:56:45] 🎵 [02_adore u_20260419] Step 3: Suno generation (weirdness=50, style_influence=50)...
[11:56:45] 🎨 [02_adore u_20260419] Step 4: SeeDream cover (parallel)...
[11:56:45] ⚠️  [qq] Exact source_id '000WA5yN17yRML' not found for 'Victory Lap'
[11:56:45] 🔄 [03_Victory Lap_20260419] Step 0: retry 1/2 in 5s...
  ✅ submitted: ['a6823436', 'a7db3925']
  ✅ submitted: ['8c02a27b', '4de3fb0c']
  🎵 a6823436... → submitted
  🎵 a7db3925... → submitted
  🎵 8c02a27b... → submitted
  🎵 4de3fb0c... → submitted
[11:56:50] ⚠️  [qq] Exact source_id '000WA5yN17yRML' not found for 'Victory Lap'
[11:56:50] 🔄 [03_Victory Lap_20260419] Step 0: retry 2/2 in 10s...
  🎵 a6823436... → queued
  🎵 a7db3925... → queued
  🎵 8c02a27b... → queued
  🎵 4de3fb0c... → queued
[11:57:03] ⚠️  [qq] Exact source_id '000WA5yN17yRML' not found for 'Victory Lap'
[11:57:03] ❌ [03_Victory Lap_20260419] Step 0: No audio URL
  🎵 a6823436... → streaming
  🎵 8c02a27b... → streaming
  🎵 4de3fb0c... → streaming
  🎵 a7db3925... → streaming
  🎵 a6823436... → complete
  🎵 a7db3925... → complete
[11:59:02]    🎧 [02_adore u_20260419] Song 1: https://cdn1.suno.ai/a6823436-8f8e-4a7c-857c-d40e93ca7919.mp3
[11:59:02]    🎧 [02_adore u_20260419] Song 2: https://cdn1.suno.ai/a7db3925-d683-4b16-8734-528aefc6476c.mp3
[11:59:02] 🎛️ [02_adore u_20260419] Step 3.5: 混音...
[11:59:24]    🎚️ [02_adore u_20260419] Song 1: edm | 低80/中18/高3%
[11:59:42]    🎚️ [02_adore u_20260419] Song 2: pop | 低49/中43/高8%
[11:59:42] ✅ [02_adore u_20260419] Step 3.5: 39.7s | 2 songs mixed
[11:59:42] ✅ [02_adore u_20260419] Step 4: 15.3s | https://platform.cdn.acedata.cloud/seedream/66074821-b612-439a-87ac-8e20c9963bbc.jpg
  🎵 8c02a27b... → complete
  🎵 4de3fb0c... → complete
[11:59:43]    🎧 [01_places to be_20260419] Song 1: https://cdn1.suno.ai/8c02a27b-9201-4331-90d3-fe12dcd5f620.mp3
[11:59:43]    🎧 [01_places to be_20260419] Song 2: https://cdn1.suno.ai/4de3fb0c-9084-493b-844f-d94218658d06.mp3
[11:59:43] 🎛️ [01_places to be_20260419] Step 3.5: 混音...
[12:00:03]    🎚️ [01_places to be_20260419] Song 1: rock | 低70/中25/高5%
[12:00:23]    🎚️ [01_places to be_20260419] Song 2: jazz | 低75/中21/高4%
[12:00:23] ✅ [01_places to be_20260419] Step 3.5: 39.9s | 2 songs mixed
[12:00:23] ✅ [01_places to be_20260419] Step 4: 16.1s | https://platform.cdn.acedata.cloud/seedream/af26e2ec-7b1e-47a0-882d-dd03f90442a5.jpg

======================================================================
SUMMARY | 218s (3.6min)
======================================================================
✅ Done: 2 | ⏳ Awaiting Step 2: 0 | ❌ Failed: 1
[MasterDB] ✅ 批次 batch-20260419-115132-6d7228 → +0 新增, ~2 更新 | 总计 474 首
[exit 0]

=== 2026-04-19 12:00:24 exec: /usr/bin/python3 /srv/current/3000music-platform-next/services/music-pipeline/scripts/steps/step5_feishu.py /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228 ===
[Feishu] ✅ Exported 2 songs to: https://ccnu62373cgc.feishu.cn/sheets/BI3gs8KbjhyJ7ztHwC1cXfrYnub
[Feishu] 📐 Expanded master sheet from 479 to 581 rows
[Feishu] ✅ Appended 2 new songs to master sheet (rows 480-481)
[MasterDB] ✅ 批次 batch-20260419-115132-6d7228 → +2 新增, ~0 更新 | 总计 481 首
[Feishu IM] ✅ Text sent: 📊 本批次结果表格：https://ccnu62373cgc.feishu.cn/sheets/BI3gs8KbjhyJ
[12:00:04] 📨 Step 5: Sending files to Feishu IM...
[Feishu IM] ✅ [Skin & Static] cover sent
[Feishu IM] ✅ [Skin & Static] Skin & Static_V1_raw.mp3 sent
[Feishu IM] ✅ [Skin & Static] Skin & Static_V1_mixed.mp3 sent
[Feishu IM] ✅ [Skin & Static] Skin & Static_V2_raw.mp3 sent
[Feishu IM] ✅ [Skin & Static] Skin & Static_V2_mixed.mp3 sent
[Feishu IM] ✅ [Softer Side] cover sent
[Feishu IM] ✅ [Softer Side] Softer Side_V1_raw.mp3 sent
[Feishu IM] ✅ [Softer Side] Softer Side_V1_mixed.mp3 sent
[Feishu IM] ✅ [Softer Side] Softer Side_V2_raw.mp3 sent
[Feishu IM] ✅ [Softer Side] Softer Side_V2_mixed.mp3 sent
[Feishu] ✅ Already on file server: /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228
[Feishu] ✅ Archived to GDrive: /mnt/gdrive/music-pipeline/batch-20260419-115132-6d7228
[Feishu] 📦 Local files kept at: /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228

📊 https://ccnu62373cgc.feishu.cn/sheets/BI3gs8KbjhyJ7ztHwC1cXfrYnub
[exit 0]
[Feishu] ✅ Exported 2 songs to: https://ccnu62373cgc.feishu.cn/sheets/SGgZsY8slh13o3tYhl3czMmvn5c
[Feishu] ⏭️  Skip duplicate (complete): places to be (https://fileserver.yuchenhu.com/pipeline/batch-20260419-115132-6d7228/01_places%20to%20be_20260419/song_pgc.mp3)
[Feishu] ⏭️  Skip duplicate (complete): adore u (https://fileserver.yuchenhu.com/pipeline/batch-20260419-115132-6d7228/02_adore%20u_20260419/song_pgc.mp3)
[MasterDB] ✅ 批次 batch-20260419-115132-6d7228 → +0 新增, ~0 更新 | 总计 481 首
[Feishu IM] ✅ Text sent: 📊 本批次结果表格：https://ccnu62373cgc.feishu.cn/sheets/SGgZsY8slh13
[12:00:30] 📨 Step 5: Sending files to Feishu IM...
[Feishu IM] ✅ [Skin & Static] cover sent
[Feishu IM] ✅ [Skin & Static] Skin & Static_V1_raw.mp3 sent
[Feishu IM] ✅ [Skin & Static] Skin & Static_V1_mixed.mp3 sent
[Feishu IM] ✅ [Skin & Static] Skin & Static_V2_raw.mp3 sent
[Feishu IM] ✅ [Skin & Static] Skin & Static_V2_mixed.mp3 sent
[Feishu IM] ✅ [Softer Side] cover sent
[Feishu IM] ✅ [Softer Side] Softer Side_V1_raw.mp3 sent
[Feishu IM] ✅ [Softer Side] Softer Side_V1_mixed.mp3 sent
[Feishu IM] ✅ [Softer Side] Softer Side_V2_raw.mp3 sent
[Feishu IM] ✅ [Softer Side] Softer Side_V2_mixed.mp3 sent
[Feishu] ✅ Already on file server: /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228
[Feishu] ✅ Archived to GDrive: /mnt/gdrive/music-pipeline/batch-20260419-115132-6d7228
[Feishu] 📦 Local files kept at: /srv/music-files-platform-next/pipeline/batch-20260419-115132-6d7228

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