diff options
Diffstat (limited to 'src/cache/mod.rs')
-rw-r--r-- | src/cache/mod.rs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/cache/mod.rs b/src/cache/mod.rs new file mode 100644 index 0000000..ef8491a --- /dev/null +++ b/src/cache/mod.rs @@ -0,0 +1,82 @@ +// yt - A fully featured command line YouTube client +// +// Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de> +// SPDX-License-Identifier: GPL-3.0-or-later +// +// This file is part of Yt. +// +// You should have received a copy of the License along with this program. +// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>. + +use anyhow::Result; +use log::info; +use tokio::fs; + +use crate::{ + app::App, + storage::video_database::{ + downloader::set_video_cache_path, getters::get_videos, setters::set_state_change, Video, + VideoStatus, + }, +}; + +async fn invalidate_video(app: &App, video: &Video, hard: bool) -> Result<()> { + info!("Invalidating cache of video: '{}'", video.title); + + if hard { + if let Some(path) = &video.cache_path { + info!("Removing cached video at: '{}'", path.display()); + fs::remove_file(path).await?; + } + } + + set_video_cache_path(app, &video.extractor_hash, None).await?; + + Ok(()) +} + +pub async fn invalidate(app: &App, hard: bool) -> Result<()> { + let all_cached_things = get_videos(app, &[VideoStatus::Cached], None).await?; + + info!("Got videos to invalidate: '{}'", all_cached_things.len()); + + for video in all_cached_things { + invalidate_video(app, &video, hard).await? + } + + Ok(()) +} + +pub async fn maintain(app: &App, all: bool) -> Result<()> { + let domain = if all { + vec![ + VideoStatus::Pick, + // + VideoStatus::Watch, + VideoStatus::Cached, + VideoStatus::Watched, + // + VideoStatus::Drop, + VideoStatus::Dropped, + ] + } else { + vec![VideoStatus::Watch, VideoStatus::Cached] + }; + + let cached_videos = get_videos(app, domain.as_slice(), None).await?; + + for vid in cached_videos { + if let Some(path) = vid.cache_path.as_ref() { + info!("Checking if path ('{}') exists", path.display()); + if !path.exists() { + invalidate_video(app, &vid, false).await?; + } + } + if vid.status_change { + info!("Video '{}' has it's changing bit set. This is probably the result of an unexpectet exit. Clearing it", vid.title); + set_state_change(app, &vid.extractor_hash, false).await?; + } + } + + Ok(()) +} |