Spaces:
Running
Running
SilverElixir commited on
Commit ·
b5c0bbb
1
Parent(s): de2ce9c
TikTok music: sound-author handle stripped, performer is sound author, artist suffix trimmed
Browse files- lumen_tiktok_flow.py +13 -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 |
-
# в исполнителях —
|
| 81 |
-
performer_name =
|
| 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 |
-
|
|
|
|
|
|
|
| 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
|