Spaces:
Running
Running
SilverElixir commited on
Commit ·
de2ce9c
1
Parent(s): 4ec5697
TikTok music: retry send_audio without thumbnail on failure
Browse files- tests/test_bot_tiktok.py +45 -0
tests/test_bot_tiktok.py
CHANGED
|
@@ -1202,6 +1202,51 @@ def test_send_tiktok_music_keeps_one_word_track_title():
|
|
| 1202 |
assert sent.get("performer") == "Imagine Dragons"
|
| 1203 |
|
| 1204 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1205 |
def test_single_video_status_deleted_after_music():
|
| 1206 |
# Статус живёт и во время скачивания музыки тоже — сносится только после неё, а не до.
|
| 1207 |
import lumen_tiktok_flow
|
|
|
|
| 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
|
| 1208 |
+
incoming = _FakeIncomingMessage(999455)
|
| 1209 |
+
incoming.message_id = 1
|
| 1210 |
+
incoming.from_user = SimpleNamespace(language_code="ru")
|
| 1211 |
+
attempts = []
|
| 1212 |
+
|
| 1213 |
+
class _FlakyAudioBot:
|
| 1214 |
+
async def send_audio(self, **kwargs):
|
| 1215 |
+
attempts.append(kwargs)
|
| 1216 |
+
if kwargs.get("thumbnail") is not None:
|
| 1217 |
+
raise RuntimeError("thumbnail too big")
|
| 1218 |
+
return SimpleNamespace()
|
| 1219 |
+
|
| 1220 |
+
async def fake_download(session, url, headers=None):
|
| 1221 |
+
return b"fake-bytes"
|
| 1222 |
+
|
| 1223 |
+
def fake_write_tags(path, title, artist, cover):
|
| 1224 |
+
pass
|
| 1225 |
+
|
| 1226 |
+
media_data = {
|
| 1227 |
+
"music": "https://tikwm.com/song.mp3",
|
| 1228 |
+
"music_info": {"title": "Song", "author": "Auth", "cover": "https://tikwm.com/cover.jpg"},
|
| 1229 |
+
"author": {"nickname": "Nick", "unique_id": "@nick"},
|
| 1230 |
+
}
|
| 1231 |
+
original_download = bot._download_url_bin
|
| 1232 |
+
original_write_tags = bot._write_mp3_tags
|
| 1233 |
+
original_bot = bot.bot
|
| 1234 |
+
bot._download_url_bin = fake_download
|
| 1235 |
+
bot._write_mp3_tags = fake_write_tags
|
| 1236 |
+
bot.bot = _FlakyAudioBot()
|
| 1237 |
+
try:
|
| 1238 |
+
asyncio.run(lumen_tiktok_flow._send_tiktok_music(None, media_data, incoming, "Nick", {}))
|
| 1239 |
+
assert len(attempts) == 2
|
| 1240 |
+
assert attempts[0].get("thumbnail") is not None
|
| 1241 |
+
assert attempts[1].get("thumbnail") is None
|
| 1242 |
+
assert attempts[1].get("title") == "Song"
|
| 1243 |
+
finally:
|
| 1244 |
+
bot._download_url_bin = original_download
|
| 1245 |
+
bot._write_mp3_tags = original_write_tags
|
| 1246 |
+
bot.bot = original_bot
|
| 1247 |
+
bot.chat_state.pop(999455, None)
|
| 1248 |
+
|
| 1249 |
+
|
| 1250 |
def test_single_video_status_deleted_after_music():
|
| 1251 |
# Статус живёт и во время скачивания музыки тоже — сносится только после неё, а не до.
|
| 1252 |
import lumen_tiktok_flow
|