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",
"--dump-json",
"--no-playlist",
"--cookies",
"/addons/download_mp3_to_youtube/cookies.txt",
url,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
@@ -29,9 +27,14 @@ async def get_video_info(url: str) -> dict:
stdout, stderr = await process.communicate()
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:
logger.warning(f"Не удалось получить информацию о видео: {e}")
logger.error(f"Не удалось получить информацию о видео: {e}", exc_info=True)
return None
@@ -57,18 +60,30 @@ async def download_thumbnail(
def apply_metadata(mp3_path: str, metadata: dict):
"""Прописывает ID3-теги и обложку в MP3"""
try:
# Сначала удаляем старые теги ID3 если есть
try:
ID3(mp3_path).delete()
except:
pass
# Добавляем текстовые теги
try:
audio = EasyID3(mp3_path)
except error:
audio = EasyID3()
audio.save(mp3_path)
audio["title"] = metadata.get("title", "Unknown Title")
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"):
audio = ID3(mp3_path)
try:
audio = ID3(mp3_path)
except error:
audio = ID3()
audio.add(
APIC(
encoding=3,
@@ -78,10 +93,12 @@ def apply_metadata(mp3_path: str, metadata: dict):
data=metadata["thumbnail_data"],
)
)
audio.save(mp3_path)
logger.info("Обложка добавлена в MP3")
audio.save(mp3_path, v2_version=4)
logger.info(f"Обложка добавлена в MP3 ({len(metadata['thumbnail_data'])} байт)")
else:
logger.warning("Данные обложки не найдены в метаданных")
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]:
@@ -108,15 +125,15 @@ async def download_mp3_isolated(url: str) -> tuple[str, dict]:
if thumbnails:
thumbnail_url = thumbnails[-1].get("url")
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(
"yt-dlp",
"-x",
"--audio-format",
"mp3",
"--cookies",
"/addons/download_mp3_to_youtube/cookies.txt",
"--audio-quality",
"320K",
"--no-playlist",
@@ -173,4 +190,5 @@ async def download_mp3_isolated(url: str) -> tuple[str, dict]:
except asyncio.TimeoutError:
raise Exception("Таймаут загрузки (5 минут)")
except Exception as e:
logger.error(f"Ошибка при скачивании: {e}", exc_info=True)
raise e
+9 -4
View File
@@ -49,6 +49,7 @@ def register_handlers(dp: Dispatcher, state: BotState, bot: Bot):
}
# Добавляем обложку если есть
thumb_filename = None
if metadata["thumbnail_data"]:
try:
# Создаем временный файл для обложки
@@ -60,17 +61,21 @@ def register_handlers(dp: Dispatcher, state: BotState, bot: Bot):
# Используем FSInputFile для обложки
send_params["thumbnail"] = types.FSInputFile(thumb_filename)
logger.info("Обложка добавлена к сообщению")
logger.info(f"Обложка подготовлена: {thumb_filename} ({len(metadata['thumbnail_data'])} байт)")
except Exception as e:
logger.warning(f"Не удалось добавить обложку: {e}")
logger.error(f"Не удалось добавить обложку: {e}", exc_info=True)
# Отправляем аудио
await message.answer_audio(**send_params)
# Удаляем временный файл обложки если создавали
if "thumb_filename" in locals() and path.exists(thumb_filename):
unlink(thumb_filename)
if thumb_filename and path.exists(thumb_filename):
try:
unlink(thumb_filename)
logger.info("Временный файл обложки удален")
except OSError as e:
logger.warning(f"Не удалось удалить файл обложки: {e}")
await status_msg.delete()
logger.info(f"Аудио отправлено пользователю {message.from_user.id}")