From 82897a8e3608d3e00db31eb86b9a82bc0bf866e6 Mon Sep 17 00:00:00 2001 From: mykola2312 Date: Sat, 30 Mar 2024 04:39:56 +0200 Subject: [PATCH] begin implementing tmp file struct for better file management --- src/bot/bot.rs | 10 ++++++---- src/dl.rs | 1 + src/dl/tmpfile.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/dl/yt_dlp.rs | 1 + 4 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 src/dl/tmpfile.rs diff --git a/src/bot/bot.rs b/src/bot/bot.rs index 93f1d19..511bb98 100644 --- a/src/bot/bot.rs +++ b/src/bot/bot.rs @@ -1,12 +1,14 @@ use anyhow; use rust_i18n::t; -use url::Url; use std::str::{self, FromStr}; use std::time::Duration; use teloxide::dispatching::{dialogue, dialogue::InMemStorage, UpdateHandler}; -use teloxide::types::{InputFile, InputMediaVideo, Me, MessageKind, MessageNewChatMembers, UpdateKind}; +use teloxide::types::{ + InputFile, InputMediaVideo, Me, MessageKind, MessageNewChatMembers, UpdateKind, +}; use teloxide::{prelude::*, update_listeners::Polling, utils::command::BotCommands}; use tracing::{event, Level}; +use url::Url; use super::start::handle_new_chat_member; use super::types::*; @@ -25,8 +27,8 @@ use super::start::{cmd_start, handle_my_chat_member}; pub async fn bot_main(db: DbPool) -> anyhow::Result<()> { event!(Level::INFO, "start"); - let bot = Bot::new(unwrap_env("BOT_TOKEN")) - .set_api_url(Url::from_str(&unwrap_env("BOT_API_URL"))?); + let bot = + Bot::new(unwrap_env("BOT_TOKEN")).set_api_url(Url::from_str(&unwrap_env("BOT_API_URL"))?); let listener = Polling::builder(bot.clone()) .timeout(Duration::from_secs(parse_env("POLLING_TIMEOUT"))) diff --git a/src/dl.rs b/src/dl.rs index 3f82f10..fd1ad5f 100644 --- a/src/dl.rs +++ b/src/dl.rs @@ -9,6 +9,7 @@ use self::yt_dlp::{YtDlp, YtDlpError, YtDlpFormat, YtDlpInfo}; pub mod ffmpeg; mod spawn; +mod tmpfile; pub mod yt_dlp; pub enum DownloadError { diff --git a/src/dl/tmpfile.rs b/src/dl/tmpfile.rs new file mode 100644 index 0000000..38da162 --- /dev/null +++ b/src/dl/tmpfile.rs @@ -0,0 +1,44 @@ +use std::fs; +use tracing::{event, Level}; + +pub enum TmpFileError { + MakePathError +} + +pub struct TmpFile { + pub path: String, +} + +impl TmpFile { + pub fn new(filename: String) -> Result { + let path = std::env::temp_dir() + .join(filename) + .into_os_string() + .into_string() + .map_err(|_| TmpFileError::MakePathError)?; + + Ok(Self { path }) + } + + pub fn exists(&self) -> bool { + match fs::metadata(&self.path) { + Ok(_) => true, + Err(_) => false + } + } + + fn delete_if_exists(&self) { + if self.exists() { + if let Err(e) = fs::remove_file(&self.path) { + event!(Level::ERROR, "{}", e); + } + } + event!(Level::INFO, "deleted {}", self.path); + } +} + +impl Drop for TmpFile { + fn drop(&mut self) { + self.delete_if_exists(); + } +} \ No newline at end of file diff --git a/src/dl/yt_dlp.rs b/src/dl/yt_dlp.rs index f9b12ab..80a7377 100644 --- a/src/dl/yt_dlp.rs +++ b/src/dl/yt_dlp.rs @@ -1,4 +1,5 @@ use super::spawn::{spawn, SpawnError}; +use super::tmpfile::{TmpFile, TmpFileError}; use core::fmt; use ordered_float::OrderedFloat; use serde::Deserialize;