It's version 0.5.1 I fix dowmp3
This commit is contained in:
@@ -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"):
|
||||||
audio = ID3(mp3_path)
|
try:
|
||||||
|
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
|
||||||
|
|||||||
@@ -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):
|
||||||
unlink(thumb_filename)
|
try:
|
||||||
|
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
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user