初始化 telegram-downloader 并接入群晖 CI/CD
部署到群晖 / deploy (push) Failing after 10m45s

This commit is contained in:
yuming
2026-04-22 21:29:03 +08:00
commit cf40343c51
153 changed files with 33376 additions and 0 deletions
+431
View File
@@ -0,0 +1,431 @@
"""send media group"""
import logging
import os
import re
from datetime import datetime
from typing import Callable, List, Union
import pyrogram
from pyrogram import raw, types, utils
from pyrogram.file_id import FileType
log = logging.getLogger(__name__)
# pylint: disable = R0915, R0902, R0912
async def cache_media(
client: pyrogram.Client,
chat_id: Union[int, str],
media_obj: Union[
"types.InputMediaPhoto",
"types.InputMediaVideo",
"types.InputMediaAudio",
"types.InputMediaDocument",
],
progress: Callable = None,
progress_args: tuple = (),
) -> raw.base.InputSingleMedia:
"""
Caches a media.
:param client: The pyrogram.Client instance.
:param chat_id: The ID of the chat.
:param media: The media to be cached.
:return: The cached media.
"""
if isinstance(media_obj, types.InputMediaPhoto):
if isinstance(media_obj.media, str):
if os.path.isfile(media_obj.media):
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedPhoto(
file=await client.save_file(
media_obj.media,
progress=progress,
progress_args=progress_args,
)
),
)
)
media = raw.types.InputMediaPhoto(
id=raw.types.InputPhoto(
id=media.photo.id,
access_hash=media.photo.access_hash,
file_reference=media.photo.file_reference,
)
)
elif re.match("^https?://", media_obj.media):
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaPhotoExternal(url=media_obj.media),
)
)
media = raw.types.InputMediaPhoto(
id=raw.types.InputPhoto(
id=media.photo.id,
access_hash=media.photo.access_hash,
file_reference=media.photo.file_reference,
)
)
else:
media = utils.get_input_media_from_file_id(
media_obj.media, FileType.PHOTO
)
else:
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedPhoto(
file=await client.save_file(
media_obj.media,
progress=progress,
progress_args=progress_args,
)
),
)
)
media = raw.types.InputMediaPhoto(
id=raw.types.InputPhoto(
id=media.photo.id,
access_hash=media.photo.access_hash,
file_reference=media.photo.file_reference,
)
)
elif isinstance(media_obj, types.InputMediaVideo):
if isinstance(media_obj.media, str):
if os.path.isfile(media_obj.media):
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedDocument(
file=await client.save_file(
media_obj.media,
progress=progress,
progress_args=progress_args,
),
thumb=await client.save_file(media_obj.thumb),
mime_type=client.guess_mime_type(media_obj.media)
or "video/mp4",
nosound_video=True,
attributes=[
raw.types.DocumentAttributeVideo(
supports_streaming=media_obj.supports_streaming
or None,
duration=media_obj.duration,
w=media_obj.width,
h=media_obj.height,
),
raw.types.DocumentAttributeFilename(
file_name=os.path.basename(media_obj.media)
),
],
),
)
)
media = raw.types.InputMediaDocument(
id=raw.types.InputDocument(
id=media.document.id,
access_hash=media.document.access_hash,
file_reference=media.document.file_reference,
)
)
elif re.match("^https?://", media_obj.media):
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaDocumentExternal(url=media_obj.media),
)
)
media = raw.types.InputMediaDocument(
id=raw.types.InputDocument(
id=media.document.id,
access_hash=media.document.access_hash,
file_reference=media.document.file_reference,
)
)
else:
media = utils.get_input_media_from_file_id(
media_obj.media, FileType.VIDEO
)
else:
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedDocument(
file=await client.save_file(
media_obj.media,
progress=progress,
progress_args=progress_args,
),
thumb=await client.save_file(media_obj.thumb),
mime_type=client.guess_mime_type(
getattr(media_obj.media, "name", "video.mp4")
)
or "video/mp4",
nosound_video=True,
attributes=[
raw.types.DocumentAttributeVideo(
supports_streaming=media_obj.supports_streaming or None,
duration=media_obj.duration,
w=media_obj.width,
h=media_obj.height,
),
raw.types.DocumentAttributeFilename(
file_name=getattr(media_obj.media, "name", "video.mp4")
),
],
),
)
)
media = raw.types.InputMediaDocument(
id=raw.types.InputDocument(
id=media.document.id,
access_hash=media.document.access_hash,
file_reference=media.document.file_reference,
)
)
elif isinstance(media_obj, types.InputMediaAudio):
if isinstance(media_obj.media, str):
if os.path.isfile(media_obj.media):
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedDocument(
mime_type=client.guess_mime_type(media_obj.media)
or "audio/mpeg",
file=await client.save_file(
media_obj.media,
progress=progress,
progress_args=progress_args,
),
thumb=await client.save_file(media_obj.thumb),
attributes=[
raw.types.DocumentAttributeAudio(
duration=media_obj.duration,
performer=media_obj.performer,
title=media_obj.title,
),
raw.types.DocumentAttributeFilename(
file_name=os.path.basename(media_obj.media)
),
],
),
)
)
media = raw.types.InputMediaDocument(
id=raw.types.InputDocument(
id=media.document.id,
access_hash=media.document.access_hash,
file_reference=media.document.file_reference,
)
)
elif re.match("^https?://", media_obj.media):
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaDocumentExternal(url=media_obj.media),
)
)
media = raw.types.InputMediaDocument(
id=raw.types.InputDocument(
id=media.document.id,
access_hash=media.document.access_hash,
file_reference=media.document.file_reference,
)
)
else:
media = utils.get_input_media_from_file_id(
media_obj.media, FileType.AUDIO
)
else:
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedDocument(
mime_type=client.guess_mime_type(
getattr(media_obj.media, "name", "audio.mp3")
)
or "audio/mpeg",
file=await client.save_file(
media_obj.media,
progress=progress,
progress_args=progress_args,
),
thumb=await client.save_file(media_obj.thumb),
attributes=[
raw.types.DocumentAttributeAudio(
duration=media_obj.duration,
performer=media_obj.performer,
title=media_obj.title,
),
raw.types.DocumentAttributeFilename(
file_name=getattr(media_obj.media, "name", "audio.mp3")
),
],
),
)
)
media = raw.types.InputMediaDocument(
id=raw.types.InputDocument(
id=media.document.id,
access_hash=media.document.access_hash,
file_reference=media.document.file_reference,
)
)
elif isinstance(media_obj, types.InputMediaDocument):
if isinstance(media_obj.media, str):
if os.path.isfile(media_obj.media):
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedDocument(
mime_type=client.guess_mime_type(media_obj.media)
or "application/zip",
file=await client.save_file(
media_obj.media,
progress=progress,
progress_args=progress_args,
),
thumb=await client.save_file(media_obj.thumb),
attributes=[
raw.types.DocumentAttributeFilename(
file_name=os.path.basename(media_obj.media)
)
],
),
)
)
media = raw.types.InputMediaDocument(
id=raw.types.InputDocument(
id=media.document.id,
access_hash=media.document.access_hash,
file_reference=media.document.file_reference,
)
)
elif re.match("^https?://", media_obj.media):
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaDocumentExternal(url=media_obj.media),
)
)
media = raw.types.InputMediaDocument(
id=raw.types.InputDocument(
id=media.document.id,
access_hash=media.document.access_hash,
file_reference=media.document.file_reference,
)
)
else:
media = utils.get_input_media_from_file_id(
media_obj.media, FileType.DOCUMENT
)
else:
media = await client.invoke(
raw.functions.messages.UploadMedia(
peer=await client.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedDocument(
mime_type=client.guess_mime_type(
getattr(media_obj.media, "name", "file.zip")
)
or "application/zip",
file=await client.save_file(
media_obj.media,
progress=progress,
progress_args=progress_args,
),
thumb=await client.save_file(media_obj.thumb),
attributes=[
raw.types.DocumentAttributeFilename(
file_name=getattr(media_obj.media, "name", "file.zip")
)
],
),
)
)
media = raw.types.InputMediaDocument(
id=raw.types.InputDocument(
id=media.document.id,
access_hash=media.document.access_hash,
file_reference=media.document.file_reference,
)
)
else:
raise ValueError(
f"{media_obj.__class__.__name__}"
" is not a supported type for send_media_group"
)
return raw.types.InputSingleMedia(
media=media,
random_id=client.rnd_id(),
**await utils.parse_text_entities(
client, media_obj.caption, media_obj.parse_mode, media_obj.caption_entities
),
)
async def send_media_group_v2(
client: pyrogram.Client,
chat_id: Union[int, str],
multi_media: List[raw.types.InputSingleMedia],
disable_notification: bool = None,
schedule_date: datetime = None,
protect_content: bool = None,
message_thread_id: int = None,
reply_to_message_id: int = None,
business_connection_id: int = None,
):
"""
see pyrogram
"""
r = await client.invoke(
raw.functions.messages.SendMultiMedia(
peer=await client.resolve_peer(chat_id),
multi_media=multi_media,
silent=disable_notification or None,
schedule_date=utils.datetime_to_timestamp(schedule_date),
noforwards=protect_content,
reply_to=utils.get_reply_to(
message_thread_id=message_thread_id,
reply_to_message_id=reply_to_message_id,
),
),
sleep_threshold=60,
business_connection_id=business_connection_id,
)
return await utils.parse_messages(
client,
raw.types.messages.Messages(
messages=[
m.message
for m in filter(
lambda u: isinstance(
u,
(
raw.types.UpdateNewMessage,
raw.types.UpdateNewChannelMessage,
raw.types.UpdateNewScheduledMessage,
),
),
r.updates,
)
],
users=r.users,
chats=r.chats,
),
)