main
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3from pathlib import Path
4
5from loguru import logger
6from pyrogram.client import Client
7from pyrogram.types import Message
8
9from config import MAX_FILE_BYTES, PREFIX, PROXY
10from messages.parser import parse_msg
11from messages.progress import modify_progress
12from messages.sender import send2tg
13from messages.utils import equal_prefix, get_reply_to, startswith_prefix
14from multimedia import is_valid_video_or_audio, validate_img
15from networking import download_file
16from publish import publish_telegraph
17from utils import convert_md, find_url, guess_mime, readable_size, to_int
18
19HELP = f"""
20⏬**下载文件**
21使用说明:
22`{PREFIX.WGET}` + URL 下载文件
23文件大小不能超过Telegram的限制: {round(MAX_FILE_BYTES / 1024 / 1024)}MB
24"""
25AUDIO_FORMAT = [".aac", ".aiff", ".flac", ".m4a", ".mp3", ".oga", ".ogg", ".opus", ".pcm", ".wav"]
26VIDEO_FORMAT = [".3gp", ".avi", ".flv", ".m2ts", ".m4v", ".mkv", ".mov", ".mp4", ".mpeg", ".mpg", ".mts", ".ogg", ".ogv", ".rmvb", ".webm", ".wmv"]
27
28
29async def download_url_in_message(client: Client, message: Message, extra_prefix: str = "", **kwargs):
30 """Download the url from the message."""
31 info = parse_msg(message)
32 if not startswith_prefix(info["text"], prefix=[PREFIX.WGET, extra_prefix]):
33 return
34 # send docs if message == "/wget", without reply
35 if equal_prefix(message.text, prefix=[PREFIX.WGET]) and not message.reply_to_message:
36 await send2tg(client, message, texts=HELP, **kwargs)
37 return
38 # reply a message with /wget
39 if message.reply_to_message:
40 message = message.reply_to_message
41 info = parse_msg(message, silent=True) # parse again
42
43 target_chat = kwargs["target_chat"] if kwargs.get("target_chat") else message.chat.id
44 target_chat = to_int(target_chat)
45 reply_msg_id = kwargs.get("reply_msg_id", 0)
46 reply_parameters = get_reply_to(message.id, reply_msg_id)
47
48 if not (url := find_url(info["text"])):
49 await message.reply_text("❌未找到URL")
50 return
51 caption = f"🔗[原始链接]({url})"
52 msg = f"⏬开始下载:\n{url}"
53 if kwargs.get("show_progress") and "progress" not in kwargs:
54 res = await send2tg(client, message, texts=msg, **kwargs)
55 kwargs["progress"] = res[0]
56 else:
57 await modify_progress(text=msg, force_update=True, **kwargs)
58 success = False
59 path = Path("non-exist")
60 try:
61 path = await download_file(url, proxy=PROXY.DOWNLOAD, stream=True, **kwargs)
62 path = Path(path)
63 suffix = path.suffix
64 mime = guess_mime(path)
65 logger.debug(f"File MIME: {mime}")
66 if not (mime.startswith("text") or suffix in AUDIO_FORMAT + VIDEO_FORMAT):
67 suffix = "." + mime.split("/")[-1]
68 if path.suffix != suffix:
69 path.rename(path.with_suffix(suffix))
70 path = path.with_suffix(suffix)
71 if img := validate_img(path, delete=False):
72 await modify_progress(text=f"🏞图片下载成功: {readable_size(path=img)}", force_update=True, **kwargs)
73 success = await send2tg(client, message, target_chat, reply_msg_id, texts=caption, media=[{"photo": img}])
74 elif path.suffix in AUDIO_FORMAT:
75 await modify_progress(text=f"🎧音频下载成功: {readable_size(path=path)}", force_update=True, **kwargs)
76 success = await client.send_audio(target_chat, path.as_posix(), caption=caption, reply_parameters=reply_parameters)
77 elif await is_valid_video_or_audio(path, delete=False):
78 await modify_progress(text=f"🎬视频下载成功: {readable_size(path=path)}", force_update=True, **kwargs)
79 success = await send2tg(client, message, target_chat, reply_msg_id, texts=caption, media=[{"video": path}])
80 elif path.stat().st_size < MAX_FILE_BYTES:
81 await modify_progress(text=f"💾文件下载成功: {readable_size(path=path)}", force_update=True, **kwargs)
82 if suffix == ".html":
83 markdown = convert_md(path)
84 markdown_path = path.with_suffix(".md")
85 markdown_path.write_text(markdown)
86 if telegraph_url := await publish_telegraph(title="全文内容", texts=markdown, author=info["full_name"], url=url):
87 caption += f"\n⚡️[即时预览]({telegraph_url})"
88 success = await client.send_document(target_chat, path.as_posix(), caption=caption, reply_parameters=reply_parameters)
89 else:
90 await modify_progress(text=f"❌文件大小: {readable_size(path=path)} 超出限制\nTelegram只允许上传小于{round(MAX_FILE_BYTES / 1024 / 1024)}MB的文件", force_update=True, **kwargs)
91 except Exception as e:
92 logger.error(e)
93 await modify_progress(text=f"❌下载失败: {url}", force_update=True, **kwargs)
94
95 if success:
96 await modify_progress(del_status=True, **kwargs)
97 Path(path).unlink(missing_ok=True)