SilverElixir commited on
Commit
b5c0bbb
·
1 Parent(s): de2ce9c

TikTok music: sound-author handle stripped, performer is sound author, artist suffix trimmed

Browse files
Files changed (2) hide show
  1. lumen_tiktok_flow.py +13 -2
  2. tests/test_bot_tiktok.py +28 -1
lumen_tiktok_flow.py CHANGED
@@ -64,6 +64,12 @@ async def _send_tiktok_music(session, media_data: dict, message: Message, author
64
  residual_title = re.sub(re.escape(author_nick), "", residual_title, flags=re.IGNORECASE).strip(" \t-–—:")
65
  if author_uniq_clean:
66
  residual_title = re.sub(re.escape(author_uniq_clean), "", residual_title, flags=re.IGNORECASE).strip(" \t-–—:")
 
 
 
 
 
 
67
  is_original_sound = mentions_generic_phrase and not residual_title
68
  # language_code получателя — в диагн. лог: при жалобе "подпись не на моём языке" иначе не проверить, что пришло от Telegram.
69
  sender_language_code = message.from_user.language_code if message.from_user else None
@@ -77,13 +83,18 @@ async def _send_tiktok_music(session, media_data: dict, message: Message, author
77
  )
78
 
79
  if is_original_sound:
80
- # в исполнителях — юзернейм без @. Безымянный звук подменяем переводом на язык ОТПРАВИТЕЛЯ ссылки (raw зависит от языка автора видео, связи TikTok не даёт).
81
- performer_name = author_uniq_clean if author_uniq_clean else raw_music_author
82
  cleaned_title = _original_sound_label(sender_language_code, bot._chat_lang(message.chat.id))
83
  else:
84
  # Именованный трек или "оригинальный" с названием — реальное название важнее подписи; очищенный остаток — если был префикс.
85
  cleaned_title = residual_title if (mentions_generic_phrase and residual_title) else raw_music_title
86
  performer_name = raw_music_author
 
 
 
 
 
87
  # TikWM иногда привозит поля перевёрнутыми (прод 22.09.2026: в title лежал юзернейм
88
  # автора видео, в author — название трека; по той же ссылке в другой раз — наоборот).
89
  # Чиним очевидный случай: название без единого пробела совпало с хендлом автора видео,
 
64
  residual_title = re.sub(re.escape(author_nick), "", residual_title, flags=re.IGNORECASE).strip(" \t-–—:")
65
  if author_uniq_clean:
66
  residual_title = re.sub(re.escape(author_uniq_clean), "", residual_title, flags=re.IGNORECASE).strip(" \t-–—:")
67
+ # Хендл АВТОРА ЗВУКА тоже вырезаем (прод 22.09.2026, [tiktok-music][diag]:
68
+ # raw 'original sound - account2525101295' — TikTok подставляет хендл автора звука
69
+ # в заголовок ДЕЙСТВИТЕЛЬНО безымянного звука; иначе остаток считался "настоящим
70
+ # названием" и в ТГ уезжало title=performer=хендл вместо локализованной подписи.
71
+ if raw_music_author:
72
+ residual_title = re.sub(re.escape(raw_music_author), "", residual_title, flags=re.IGNORECASE).strip(" \t-–—:")
73
  is_original_sound = mentions_generic_phrase and not residual_title
74
  # language_code получателя — в диагн. лог: при жалобе "подпись не на моём языке" иначе не проверить, что пришло от Telegram.
75
  sender_language_code = message.from_user.language_code if message.from_user else None
 
83
  )
84
 
85
  if is_original_sound:
86
+ # в исполнителях — автор ЗВУКА (не видео: звук переиспользуют чужие посты).
87
+ performer_name = raw_music_author or author_uniq_clean
88
  cleaned_title = _original_sound_label(sender_language_code, bot._chat_lang(message.chat.id))
89
  else:
90
  # Именованный трек или "оригинальный" с названием — реальное название важнее подписи; очищенный остаток — если был префикс.
91
  cleaned_title = residual_title if (mentions_generic_phrase and residual_title) else raw_music_title
92
  performer_name = raw_music_author
93
+ # "Название - Автор" в одном поле: автор едет отдельно в performer, из названия хвостом (иначе дублируется дважды).
94
+ if raw_music_author:
95
+ _stripped = re.sub(r"\s+[–—-]\s+" + re.escape(raw_music_author) + r"\s*$", "", cleaned_title, flags=re.IGNORECASE).strip()
96
+ if _stripped:
97
+ cleaned_title = _stripped
98
  # TikWM иногда привозит поля перевёрнутыми (прод 22.09.2026: в title лежал юзернейм
99
  # автора видео, в author — название трека; по той же ссылке в другой раз — наоборот).
100
  # Чиним очевидный случай: название без единого пробела совпало с хендлом автора видео,
tests/test_bot_tiktok.py CHANGED
@@ -379,7 +379,9 @@ def test_send_tiktok_music_truly_generic_original_sound_uses_localized_label():
379
  }
380
  title, artist = _run_send_tiktok_music(media_data, language_code="ru")
381
  assert title == "Оригинальный звук"
382
- assert artist == "videoposter"
 
 
383
 
384
 
385
  def test_send_tiktok_music_generic_original_sound_with_only_video_author_suffix():
@@ -1202,6 +1204,31 @@ def test_send_tiktok_music_keeps_one_word_track_title():
1202
  assert sent.get("performer") == "Imagine Dragons"
1203
 
1204
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1205
  def test_send_tiktok_music_retries_without_thumbnail_on_failure():
1206
  # Жирная обложка роняет send_audio целиком — повторяем без неё, трек важнее картинки.
1207
  import lumen_tiktok_flow
 
379
  }
380
  title, artist = _run_send_tiktok_music(media_data, language_code="ru")
381
  assert title == "Оригинальный звук"
382
+ # Исполнитель — автор ЗВУКА из music_info (прод 22.09.2026: звук переиспользуют чужие
383
+ # посты, автор видео тут ни при чём).
384
+ assert artist == "SomeArtist"
385
 
386
 
387
  def test_send_tiktok_music_generic_original_sound_with_only_video_author_suffix():
 
1204
  assert sent.get("performer") == "Imagine Dragons"
1205
 
1206
 
1207
+ def test_send_tiktok_music_truly_unnamed_sound_gets_localized_label():
1208
+ # Прод 22.09.2026 ([tiktok-music][diag]): raw 'original sound - account2525101295' при
1209
+ # author 'account2525101295' — хендл автора звука в заголовке БЕЗЫМЯННОГО звука, а не
1210
+ # название. Раньше остаток считался названием и в ТГ уезжало title=performer=хендл.
1211
+ sent = _run_music_capturing_audio({
1212
+ "music": "https://tikwm.com/song.mp3",
1213
+ "music_info": {"title": "original sound - account2525101295", "author": "account2525101295"},
1214
+ "author": {"nickname": "VideoPoster", "unique_id": "videoposter"},
1215
+ })
1216
+ assert sent.get("title") == "Оригинальный звук"
1217
+ assert sent.get("performer") == "account2525101295"
1218
+
1219
+
1220
+ def test_send_tiktok_music_named_track_keeping_artist_in_title():
1221
+ # Именованный трек, где автор упомянут в заголовке, — остаётся названием, хендл автора
1222
+ # вырезается только как довесок, а не целиком.
1223
+ sent = _run_music_capturing_audio({
1224
+ "music": "https://tikwm.com/song.mp3",
1225
+ "music_info": {"title": "Night Call - Kavinsky", "author": "Kavinsky"},
1226
+ "author": {"nickname": "VideoPoster", "unique_id": "videoposter"},
1227
+ })
1228
+ assert sent.get("title") == "Night Call"
1229
+ assert sent.get("performer") == "Kavinsky"
1230
+
1231
+
1232
  def test_send_tiktok_music_retries_without_thumbnail_on_failure():
1233
  # Жирная обложка роняет send_audio целиком — повторяем без неё, трек важнее картинки.
1234
  import lumen_tiktok_flow