It's version 0.5.1 I fix dowmp3

This commit is contained in:
Niken
2025-11-11 21:35:16 +03:00
parent 6d421249ee
commit e1837400ef
3 changed files with 45 additions and 22 deletions
@@ -20,8 +20,6 @@ async def get_video_info(url: str) -> dict:
"yt-dlp", "yt-dlp",
"--dump-json", "--dump-json",
"--no-playlist", "--no-playlist",
"--cookies",
"/addons/download_mp3_to_youtube/cookies.txt",
url, url,
stdout=asyncio.subprocess.PIPE, stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE,
@@ -29,9 +27,14 @@ async def get_video_info(url: str) -> dict:
stdout, stderr = await process.communicate() stdout, stderr = await process.communicate()
if process.returncode == 0: if process.returncode == 0:
return json.loads(stdout.decode()) info = json.loads(stdout.decode())
logger.info(f"Информация получена: {info.get('title', 'Unknown')}")
return info
else:
stderr_msg = stderr.decode()
logger.error(f"yt-dlp ошибка: {stderr_msg}")
except Exception as e: except Exception as e:
logger.warning(f"Не удалось получить информацию о видео: {e}") logger.error(f"Не удалось получить информацию о видео: {e}", exc_info=True)
return None return None
@@ -57,18 +60,30 @@ async def download_thumbnail(
def apply_metadata(mp3_path: str, metadata: dict): def apply_metadata(mp3_path: str, metadata: dict):
"""Прописывает ID3-теги и обложку в MP3""" """Прописывает ID3-теги и обложку в MP3"""
try: try:
# Сначала удаляем старые теги ID3 если есть
try:
ID3(mp3_path).delete()
except:
pass
# Добавляем текстовые теги
try: try:
audio = EasyID3(mp3_path) audio = EasyID3(mp3_path)
except error: except error:
audio = EasyID3() audio = EasyID3()
audio.save(mp3_path)
audio["title"] = metadata.get("title", "Unknown Title") audio["title"] = metadata.get("title", "Unknown Title")
audio["artist"] = metadata.get("performer", "Unknown Artist") audio["artist"] = metadata.get("performer", "Unknown Artist")
audio.save(mp3_path) audio.save(mp3_path, v2_version=4)
logger.info(f"Текстовые теги добавлены: {audio['title']} - {audio['artist']}")
# Добавляем обложку отдельно
if metadata.get("thumbnail_data"): if metadata.get("thumbnail_data"):
try:
audio = ID3(mp3_path) audio = ID3(mp3_path)
except error:
audio = ID3()
audio.add( audio.add(
APIC( APIC(
encoding=3, encoding=3,
@@ -78,10 +93,12 @@ def apply_metadata(mp3_path: str, metadata: dict):
data=metadata["thumbnail_data"], data=metadata["thumbnail_data"],
) )
) )
audio.save(mp3_path) audio.save(mp3_path, v2_version=4)
logger.info("Обложка добавлена в MP3") logger.info(f"Обложка добавлена в MP3 ({len(metadata['thumbnail_data'])} байт)")
else:
logger.warning("Данные обложки не найдены в метаданных")
except Exception as e: except Exception as e:
logger.warning(f"Не удалось прописать метаданные: {e}") logger.error(f"Не удалось прописать метаданные: {e}", exc_info=True)
async def download_mp3_isolated(url: str) -> tuple[str, dict]: async def download_mp3_isolated(url: str) -> tuple[str, dict]:
@@ -108,15 +125,15 @@ async def download_mp3_isolated(url: str) -> tuple[str, dict]:
if thumbnails: if thumbnails:
thumbnail_url = thumbnails[-1].get("url") thumbnail_url = thumbnails[-1].get("url")
duration = video_info.get("duration", 0) duration = video_info.get("duration", 0)
logger.info(f"Получена информация о видео: {title}") logger.info(f"Получена информация о видео: title={title}, uploader={uploader}, thumbnail={thumbnail_url is not None}")
else:
logger.warning("video_info = None, используются значения по умолчанию")
process = await asyncio.create_subprocess_exec( process = await asyncio.create_subprocess_exec(
"yt-dlp", "yt-dlp",
"-x", "-x",
"--audio-format", "--audio-format",
"mp3", "mp3",
"--cookies",
"/addons/download_mp3_to_youtube/cookies.txt",
"--audio-quality", "--audio-quality",
"320K", "320K",
"--no-playlist", "--no-playlist",
@@ -173,4 +190,5 @@ async def download_mp3_isolated(url: str) -> tuple[str, dict]:
except asyncio.TimeoutError: except asyncio.TimeoutError:
raise Exception("Таймаут загрузки (5 минут)") raise Exception("Таймаут загрузки (5 минут)")
except Exception as e: except Exception as e:
logger.error(f"Ошибка при скачивании: {e}", exc_info=True)
raise e raise e
+8 -3
View File
@@ -49,6 +49,7 @@ def register_handlers(dp: Dispatcher, state: BotState, bot: Bot):
} }
# Добавляем обложку если есть # Добавляем обложку если есть
thumb_filename = None
if metadata["thumbnail_data"]: if metadata["thumbnail_data"]:
try: try:
# Создаем временный файл для обложки # Создаем временный файл для обложки
@@ -60,17 +61,21 @@ def register_handlers(dp: Dispatcher, state: BotState, bot: Bot):
# Используем FSInputFile для обложки # Используем FSInputFile для обложки
send_params["thumbnail"] = types.FSInputFile(thumb_filename) send_params["thumbnail"] = types.FSInputFile(thumb_filename)
logger.info("Обложка добавлена к сообщению") logger.info(f"Обложка подготовлена: {thumb_filename} ({len(metadata['thumbnail_data'])} байт)")
except Exception as e: except Exception as e:
logger.warning(f"Не удалось добавить обложку: {e}") logger.error(f"Не удалось добавить обложку: {e}", exc_info=True)
# Отправляем аудио # Отправляем аудио
await message.answer_audio(**send_params) await message.answer_audio(**send_params)
# Удаляем временный файл обложки если создавали # Удаляем временный файл обложки если создавали
if "thumb_filename" in locals() and path.exists(thumb_filename): if thumb_filename and path.exists(thumb_filename):
try:
unlink(thumb_filename) unlink(thumb_filename)
logger.info("Временный файл обложки удален")
except OSError as e:
logger.warning(f"Не удалось удалить файл обложки: {e}")
await status_msg.delete() await status_msg.delete()
logger.info(f"Аудио отправлено пользователю {message.from_user.id}") logger.info(f"Аудио отправлено пользователю {message.from_user.id}")
+5 -5
View File
@@ -6,11 +6,11 @@ if __name__ == "__main__":
cursor = db.cursor() cursor = db.cursor()
# cursor.execute("""CREATE TABLE message ( cursor.execute("""CREATE TABLE message (
# chat_id integer, chat_id integer,
# message_id integer message_id integer
# )""") )""")
# db.commit() db.commit()
cursor.execute("SELECT * FROM message") cursor.execute("SELECT * FROM message")
print(cursor.fetchone()) print(cursor.fetchone())