mirror of
https://github.com/DrizzleTime/Foxel.git
synced 2026-09-05 23:57:19 +08:00
feat(TelegramAdapter): improve file handling and metadata extraction for messages
This commit is contained in:
@@ -74,33 +74,32 @@ class TelegramAdapter:
|
|||||||
for message in messages:
|
for message in messages:
|
||||||
if not message:
|
if not message:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
media = message.document or message.video or message.photo
|
media = message.document or message.video or message.photo
|
||||||
if not media:
|
if not media:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
filename = None
|
file_meta = message.file
|
||||||
size = 0
|
if not file_meta:
|
||||||
|
continue
|
||||||
if message.photo:
|
|
||||||
photo_size = message.photo.sizes[-1]
|
|
||||||
size = photo_size.size if hasattr(photo_size, 'size') else 0
|
|
||||||
filename = f"photo_{message.id}.jpg"
|
|
||||||
|
|
||||||
elif message.document or message.video:
|
filename = file_meta.name
|
||||||
size = media.size
|
|
||||||
if hasattr(media, 'attributes'):
|
|
||||||
for attr in media.attributes:
|
|
||||||
if hasattr(attr, 'file_name') and attr.file_name:
|
|
||||||
filename = attr.file_name
|
|
||||||
break
|
|
||||||
|
|
||||||
if not filename:
|
if not filename:
|
||||||
if message.text and '.' in message.text and len(message.text) < 256 and '\n' not in message.text:
|
if message.text and '.' in message.text and len(message.text) < 256 and '\n' not in message.text:
|
||||||
filename = message.text
|
filename = message.text
|
||||||
|
else:
|
||||||
if not filename:
|
filename = f"unknown_{message.id}"
|
||||||
filename = f"unknown_{message.id}"
|
|
||||||
|
size = file_meta.size
|
||||||
|
if size is None:
|
||||||
|
# 兼容缺失 size 的情况
|
||||||
|
if hasattr(media, "size") and media.size is not None:
|
||||||
|
size = media.size
|
||||||
|
elif message.photo and getattr(message.photo, "sizes", None):
|
||||||
|
photo_size = message.photo.sizes[-1]
|
||||||
|
size = getattr(photo_size, "size", 0) or 0
|
||||||
|
else:
|
||||||
|
size = 0
|
||||||
|
|
||||||
entries.append({
|
entries.append({
|
||||||
"name": f"{message.id}_{filename}",
|
"name": f"{message.id}_{filename}",
|
||||||
@@ -246,13 +245,27 @@ class TelegramAdapter:
|
|||||||
if not message or not media:
|
if not message or not media:
|
||||||
raise FileNotFoundError(f"在频道 {self.chat_id} 中未找到消息ID为 {message_id} 的文件")
|
raise FileNotFoundError(f"在频道 {self.chat_id} 中未找到消息ID为 {message_id} 的文件")
|
||||||
|
|
||||||
if message.photo:
|
file_meta = message.file
|
||||||
photo_size = media.sizes[-1]
|
file_size = file_meta.size if file_meta and file_meta.size is not None else None
|
||||||
file_size = photo_size.size if hasattr(photo_size, 'size') else 0
|
if file_size is None:
|
||||||
mime_type = "image/jpeg"
|
if hasattr(media, "size") and media.size is not None:
|
||||||
else:
|
file_size = media.size
|
||||||
file_size = media.size
|
elif message.photo and getattr(message.photo, "sizes", None):
|
||||||
mime_type = media.mime_type or "application/octet-stream"
|
photo_size = message.photo.sizes[-1]
|
||||||
|
file_size = getattr(photo_size, "size", 0) or 0
|
||||||
|
else:
|
||||||
|
file_size = 0
|
||||||
|
|
||||||
|
mime_type = None
|
||||||
|
if file_meta and getattr(file_meta, "mime_type", None):
|
||||||
|
mime_type = file_meta.mime_type
|
||||||
|
if not mime_type:
|
||||||
|
if hasattr(media, "mime_type") and media.mime_type:
|
||||||
|
mime_type = media.mime_type
|
||||||
|
elif message.photo:
|
||||||
|
mime_type = "image/jpeg"
|
||||||
|
else:
|
||||||
|
mime_type = "application/octet-stream"
|
||||||
|
|
||||||
start = 0
|
start = 0
|
||||||
end = file_size - 1
|
end = file_size - 1
|
||||||
@@ -321,11 +334,16 @@ class TelegramAdapter:
|
|||||||
if not message or not media:
|
if not message or not media:
|
||||||
raise FileNotFoundError(f"在频道 {self.chat_id} 中未找到消息ID为 {message_id} 的文件")
|
raise FileNotFoundError(f"在频道 {self.chat_id} 中未找到消息ID为 {message_id} 的文件")
|
||||||
|
|
||||||
if message.photo:
|
file_meta = message.file
|
||||||
photo_size = media.sizes[-1]
|
size = file_meta.size if file_meta and file_meta.size is not None else None
|
||||||
size = photo_size.size if hasattr(photo_size, 'size') else 0
|
if size is None:
|
||||||
else:
|
if hasattr(media, "size") and media.size is not None:
|
||||||
size = media.size
|
size = media.size
|
||||||
|
elif message.photo and getattr(message.photo, "sizes", None):
|
||||||
|
photo_size = message.photo.sizes[-1]
|
||||||
|
size = getattr(photo_size, "size", 0) or 0
|
||||||
|
else:
|
||||||
|
size = 0
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"name": rel,
|
"name": rel,
|
||||||
@@ -339,4 +357,4 @@ class TelegramAdapter:
|
|||||||
await client.disconnect()
|
await client.disconnect()
|
||||||
|
|
||||||
def ADAPTER_FACTORY(rec: StorageAdapter) -> TelegramAdapter:
|
def ADAPTER_FACTORY(rec: StorageAdapter) -> TelegramAdapter:
|
||||||
return TelegramAdapter(rec)
|
return TelegramAdapter(rec)
|
||||||
|
|||||||
Reference in New Issue
Block a user