Change download logic to just opening file

Co-authored-by: Kurbanov Bulat <kurbanovbul@gmail.com>
This commit is contained in:
Шатунов Антон
2024-05-07 02:13:17 +03:00
parent dbd4b547c6
commit e18d9555a6
4 changed files with 20 additions and 30 deletions

View File

@@ -1,17 +1,13 @@
use std::pin::Pin;
use std::error::Error;
use axum::body::Bytes;
use futures::TryStreamExt;
use once_cell::sync::Lazy;
use serde::Serialize;
use teloxide::{
net::Download,
requests::Requester,
types::{ChatId, InputFile, MessageId, Recipient},
Bot,
};
use tokio::io::AsyncRead;
use tokio_util::compat::FuturesAsyncReadCompatExt;
use tokio::fs::File;
use tracing::log;
use moka::future::Cache;
@@ -111,27 +107,13 @@ pub async fn download_file(chat_id: i64, message_id: i32) -> Option<BotDownloade
log::info!("File path: {}", path);
return Some(BotDownloader::new(bot, path));
return Some(BotDownloader(path));
}
pub struct BotDownloader {
bot: Bot,
file_path: String,
}
pub struct BotDownloader(String);
impl BotDownloader {
pub fn new(bot: Bot, file_path: String) -> Self {
Self { bot, file_path }
}
pub fn get_async_read(self) -> Pin<Box<dyn AsyncRead + Send>> {
let stream = self.bot.download_file_stream(&self.file_path);
Box::pin(
stream
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))
.into_async_read()
.compat(),
)
pub async fn get_file(self) -> Result<File, Box<dyn Error>> {
Ok(File::open(self.0).await?)
}
}

View File

@@ -12,6 +12,7 @@ use axum_typed_multipart::{TryFromMultipart, TypedMultipart};
use tokio_util::io::ReaderStream;
use tower_http::trace::{self, TraceLayer};
use tracing::Level;
use tracing::log;
use crate::config::CONFIG;
@@ -89,14 +90,20 @@ async fn upload(data: TypedMultipart<UploadFileRequest>) -> impl IntoResponse {
}
async fn download(Path((chat_id, message_id)): Path<(i64, i32)>) -> impl IntoResponse {
let downloader = download_file(chat_id, message_id).await;
let data = match downloader {
Some(v) => v.get_async_read(),
let downloader = match download_file(chat_id, message_id).await {
Some(v) => v,
None => return StatusCode::BAD_REQUEST.into_response()
};
let reader = ReaderStream::new(data);
let file = match downloader.get_file().await {
Ok(v) => v,
Err(err) => {
log::error!("{}", err);
return StatusCode::BAD_REQUEST.into_response()
}
} ;
let reader = ReaderStream::new(file);
axum::body::Body::from_stream(reader).into_response()
}