mirror of
https://github.com/flibusta-apps/telegram_files_server.git
synced 2025-12-06 04:25:38 +01:00
Change download logic to just opening file
Co-authored-by: Kurbanov Bulat <kurbanovbul@gmail.com>
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -2217,6 +2217,7 @@ dependencies = [
|
||||
"libc",
|
||||
"mio",
|
||||
"num_cpus",
|
||||
"parking_lot",
|
||||
"pin-project-lite",
|
||||
"signal-hook-registry",
|
||||
"socket2",
|
||||
|
||||
@@ -15,7 +15,7 @@ tracing-subscriber = { version = "0.3.18", features = ["env-filter"]}
|
||||
tower-http = { version = "0.5.2", features = ["trace"] }
|
||||
sentry-tracing = "0.32.3"
|
||||
|
||||
tokio = "1.37.0"
|
||||
tokio = { version = "1.37.0", features = [ "full" ] }
|
||||
tokio-util = { version = "0.7.11", features = [ "full" ] }
|
||||
axum-prometheus = "0.6.1"
|
||||
|
||||
|
||||
@@ -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?)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user