mirror of
https://github.com/TheFunny/TelegramTwitterMediaBot.git
synced 2026-10-08 01:42:05 +00:00
refactor(send): model a payload's media as MediaRef, not media + file_id
MediaItemPayload carried one String field with two meanings and a file_id bool beside it to say which, in all three variants; every reader re-checked the flag (input_file had a three-arm pattern just to find the file-id case). MediaRef::Source/FileId says it once, and the readers now match on it — local_media_paths, item_url, input_file and the download path each shrank to the one branch they care about. Fixes a real failure that the flag was hiding: send_animation built its InputFile with input_file_for(media_url), which read a cached file id as a local path and answered "local media file missing" — permanent. So the second request for a single-gif post always failed (the third worked, from the degraded entry). It now uses the payload's own input_file, and a_cached_animation_sends_by_file_id fails without that line. Wire shape: a queued row from before this change no longer parses, and the queue already handles that shape (handle_task dead-letters it as an invalid payload, and dead_letter_notify still names the post and drops the stale cache entry).
This commit is contained in:
@@ -2,16 +2,16 @@
|
||||
//! URL / local path), the per-kind `InputMedia` builders and the media-group
|
||||
//! assembly with its caption rule.
|
||||
|
||||
use super::MediaItemPayload;
|
||||
use super::{MediaItemPayload, MediaRef};
|
||||
use teloxide::types::{
|
||||
InputFile, InputMedia, InputMediaAnimation, InputMediaPhoto, InputMediaVideo, ParseMode,
|
||||
};
|
||||
|
||||
/// The item's media string, whether it is a URL/path or a file id — callers
|
||||
/// that need the distinction match on [`MediaRef`] themselves.
|
||||
pub(super) fn item_url(item: &MediaItemPayload) -> &str {
|
||||
match item {
|
||||
MediaItemPayload::Photo { media, .. }
|
||||
| MediaItemPayload::Video { media, .. }
|
||||
| MediaItemPayload::Animation { media, .. } => media,
|
||||
match item.media_ref() {
|
||||
MediaRef::Source(media) | MediaRef::FileId(media) => media,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,24 +35,10 @@ impl MediaItemPayload {
|
||||
/// The input for a send: a cached file id goes out as `InputFile::file_id`
|
||||
/// (no fetch, no upload), URLs go to Telegram, anything else is a local
|
||||
/// path (transient upload fallback).
|
||||
fn input_file(&self) -> Result<InputFile, String> {
|
||||
match self {
|
||||
MediaItemPayload::Photo {
|
||||
media,
|
||||
file_id: true,
|
||||
..
|
||||
}
|
||||
| MediaItemPayload::Video {
|
||||
media,
|
||||
file_id: true,
|
||||
..
|
||||
}
|
||||
| MediaItemPayload::Animation {
|
||||
media,
|
||||
file_id: true,
|
||||
..
|
||||
} => Ok(InputFile::file_id(media.clone().into())),
|
||||
_ => input_file_for(item_url(self)),
|
||||
pub(super) fn input_file(&self) -> Result<InputFile, String> {
|
||||
match self.media_ref() {
|
||||
MediaRef::FileId(id) => Ok(InputFile::file_id(id.clone().into())),
|
||||
MediaRef::Source(media) => input_file_for(media),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user