@@ -18,9 +18,10 @@ use teloxide::{
1818 prelude:: * ,
1919 types:: {
2020 InlineQuery , InlineQueryResult , InlineQueryResultArticle , InlineQueryResultPhoto ,
21- InlineQueryResultVideo , InputMessageContent , InputMessageContentText ,
21+ InputMessageContent , InputMessageContentText , InputFile , InputMedia , InputMediaVideo
2222 } ,
2323} ;
24+ use url:: Url ;
2425
2526static URL_REGEX : Lazy < Regex > =
2627 Lazy :: new ( || Regex :: new ( r"^(https?)://[^\s/$.?#].[^\s]*$" ) . unwrap ( ) ) ;
@@ -48,18 +49,18 @@ fn build_results_from_media(
4849 user_id : u64 ,
4950) -> Vec < InlineQueryResult > {
5051 match media {
51- DownloadResult :: Video ( video_url ) => {
52- if let Ok ( url ) = video_url . parse ( ) {
52+ DownloadResult :: Video { url , .. } => {
53+ if let Ok ( _url ) = url . parse :: < Url > ( ) {
5354 let url_kb = make_single_url_keyboard ( original_url) ;
54-
55- let result = InlineQueryResultVideo :: new (
55+ let result = InlineQueryResultArticle :: new (
5656 format ! ( "cobalt_video:{}" , url_hash) ,
57- url ,
58- "video/mp4" . parse ( ) . unwrap ( ) ,
59- "https://i.imgur.com/D0A9Gxh.png" . parse ( ) . unwrap ( ) , /* preview */
60- "Скачать видео" . to_string ( ) ,
57+ "Скачать видео" ,
58+ InputMessageContent :: Text ( InputMessageContentText :: new (
59+ "Нажмите, чтобы отправить видео" ,
60+ ) ) ,
6161 )
6262 . reply_markup ( url_kb) ;
63+
6364 vec ! [ result. into( ) ]
6465 } else {
6566 vec ! [
@@ -164,3 +165,48 @@ pub async fn handle_cobalt_inline(
164165 bot. answer_inline_query ( q. id , results) . cache_time ( 0 ) . await ?;
165166 Ok ( ( ) )
166167}
168+
169+ pub async fn handle_inline_video (
170+ bot : Bot ,
171+ chosen : ChosenInlineResult ,
172+ config : Arc < Config > ,
173+ ) -> Result < ( ) , MyError > {
174+ let Some ( inline_message_id) = chosen. inline_message_id else {
175+ return Ok ( ( ) ) ;
176+ } ;
177+
178+ let Some ( url_hash) = chosen. result_id . strip_prefix ( "cobalt_video:" ) else {
179+ return Ok ( ( ) ) ;
180+ } ;
181+
182+ bot. edit_message_text_inline ( & inline_message_id, "⏳ Загружаю видео..." )
183+ . await ?;
184+
185+ let redis = config. get_redis_client ( ) ;
186+ let cache_key = format ! ( "cobalt_cache:{}" , url_hash) ;
187+
188+ match redis. get :: < DownloadResult > ( & cache_key) . await ? {
189+ Some ( DownloadResult :: Video { url, original_url } ) => {
190+ let media = InputMedia :: Video ( InputMediaVideo :: new ( InputFile :: url ( url. parse ( ) ?) ) ) ;
191+ let url_kb = make_single_url_keyboard ( & original_url) ;
192+
193+ if let Err ( _e) = bot
194+ . edit_message_media_inline ( & inline_message_id, media)
195+ . reply_markup ( url_kb)
196+ . await
197+ {
198+ bot. edit_message_text_inline (
199+ inline_message_id,
200+ "❌ Ошибка: не удалось отправить видео." ,
201+ )
202+ . await ?;
203+ }
204+ }
205+ _ => {
206+ bot. edit_message_text_inline ( inline_message_id, "❌ Ошибка: видео не найдено в кэше." )
207+ . await ?;
208+ }
209+ }
210+
211+ Ok ( ( ) )
212+ }
0 commit comments