diff --git a/defs/bilibili.py b/defs/bilibili.py
index 25ca5e1..89bc945 100644
--- a/defs/bilibili.py
+++ b/defs/bilibili.py
@@ -6,6 +6,7 @@ import qrcode
import string
from bilibili_api import Credential
+from bilibili_api.audio import Audio
from bilibili_api.video import Video
from bilibili_api.user import User
from pyrogram import ContinuePropagation
@@ -142,6 +143,13 @@ def create_video(cid) -> Optional[Video]:
return v
+def create_audio(aid: str) -> Optional[Audio]:
+ a = None
+ if aid[:2] == "au":
+ a = Audio(auid=int(aid[2:]), credential=credential)
+ return a
+
+
async def video_info_get(cid):
v = create_video(cid)
if not v:
diff --git a/defs/bilibili_download.py b/defs/bilibili_download.py
index ebc82be..c068d8c 100644
--- a/defs/bilibili_download.py
+++ b/defs/bilibili_download.py
@@ -7,6 +7,7 @@ from typing import Tuple, Dict, Union, Optional
import aiofiles
from bilibili_api import HEADERS
+from bilibili_api.audio import Audio
from bilibili_api.video import Video, VideoDownloadURLDataDetecter, VideoQuality
from httpx import AsyncClient, Response
from pyrogram.enums import ParseMode
@@ -216,6 +217,41 @@ async def take_screenshot(info: Dict) -> Optional[BytesIO]:
return None
+async def audio_download(a: Audio, m: Message):
+ try:
+ info = await a.get_info()
+ download_url_data = await a.get_download_url()
+ async with AsyncClient(headers=HEADERS, timeout=60) as client:
+ r = await client.get(download_url_data["cdns"][0])
+ media = BytesIO(r.content)
+ media.name = None
+ media.seek(0)
+ if info.get("cover"):
+ r_ = await client.get(info.get("cover"))
+ thumb = BytesIO(r_.content)
+ thumb.seek(0)
+ else:
+ thumb = None
+ text = f"{info['title']}\n\n{info.get('desc', '')}\n\nhttps://www.bilibili.com/audio/au{a.get_auid()}"
+ if len(text) > 800:
+ text = f"{info['title']}\n\n简介过长,无法显示\n\nhttps://www.bilibili.com/audio/au{a.get_auid()}"
+ await bot.send_audio(
+ chat_id=m.chat.id,
+ audio=media,
+ caption=text,
+ parse_mode=ParseMode.HTML,
+ reply_to_message_id=m.reply_to_message_id,
+ thumb=thumb,
+ duration=info.get("duration"),
+ performer=info.get("author"),
+ )
+ except BilibiliDownloaderError as e:
+ await fail_edit(m, e.MSG)
+ except Exception as e:
+ logger.exception("Downloading audio failed")
+ await fail_edit(m, f"下载/上传失败:{e}")
+
+
async def go_download(v: Video, p_num: int, m: Message):
video_path = cache_dir / f"{v.get_aid()}_{p_num}.mp4"
safe_remove(video_path)
@@ -295,6 +331,8 @@ async def go_upload(v: Video, p_num: int, m: Message):
info = await v.get_info()
video_jpg = await take_screenshot(info)
caption = f"{info['title']}\n\n{info['desc']}\n\nhttps://b23.tv/{v.get_bvid()}"
+ if len(caption) > 800:
+ caption = f"{info['title']}\n\n简介过长,无法显示\n\nhttps://b23.tv/{v.get_bvid()}"
except Exception:
video_jpg = None
caption = f"https://b23.tv/{v.get_bvid()}"
@@ -311,6 +349,7 @@ async def go_upload(v: Video, p_num: int, m: Message):
supports_streaming=True,
progress=go_upload_progress,
progress_args=(m,),
+ reply_to_message_id=m.reply_to_message_id,
)
logger.info(f"Upload {video_path} success")
except BilibiliDownloaderError as e:
diff --git a/modules/bilibili.py b/modules/bilibili.py
index 3a2cbc1..423642c 100644
--- a/modules/bilibili.py
+++ b/modules/bilibili.py
@@ -21,7 +21,7 @@ from scheduler import scheduler
filters.incoming
& filters.text
& filters.regex(r"av(\d{1,12})|BV(1[A-Za-z0-9]{2}4.1.7[A-Za-z0-9]{2})|b23.tv")
- & ~filters.command(["download"])
+ & ~(filters.command(["download"]) & filters.user(bili_auth_user))
)
async def bili_resolve(_: Client, message: Message):
"""
diff --git a/modules/bilibili_download.py b/modules/bilibili_download.py
index 520e004..6a2dc8c 100644
--- a/modules/bilibili_download.py
+++ b/modules/bilibili_download.py
@@ -3,8 +3,8 @@ import re
from pyrogram import filters, Client, ContinuePropagation
from pyrogram.types import Message, CallbackQuery
-from defs.bilibili import b23_extract, create_video
-from defs.bilibili_download import go_download
+from defs.bilibili import b23_extract, create_video, create_audio
+from defs.bilibili_download import go_download, audio_download
from defs.glover import bili_auth_user
from init import bot
@@ -33,6 +33,19 @@ async def bili_download_resolve(_: Client, message: Message):
bot.loop.create_task(go_download(video, p_num, m))
+@bot.on_message(filters.incoming & filters.text & filters.regex(r"audio/au(\d{1,12})"))
+async def bili_audio_download_resolve(_: Client, message: Message):
+ p = re.compile(r"au(\d{1,12})")
+ audio_number = p.search(message.text)
+ if audio_number:
+ audio_number = audio_number[0]
+ else:
+ raise ContinuePropagation
+ audio = create_audio(audio_number)
+ m = await message.reply("开始获取音频数据", quote=True)
+ bot.loop.create_task(audio_download(audio, m))
+
+
@bot.on_callback_query(filters.regex(r"^download_(.*)$"))
async def bili_download_resolve_cb(_: Client, callback_query: CallbackQuery):
if not callback_query.from_user: