Skip premium episode if account has no premium subscription

This commit is contained in:
bytedream 2024-04-14 21:18:13 +02:00
parent d7dac2acd4
commit cdad7fc000
4 changed files with 69 additions and 8 deletions

View file

@ -286,8 +286,13 @@ impl Execute for Archive {
for (i, (media_collection, url_filter)) in parsed_urls.into_iter().enumerate() { for (i, (media_collection, url_filter)) in parsed_urls.into_iter().enumerate() {
let progress_handler = progress!("Fetching series details"); let progress_handler = progress!("Fetching series details");
let single_format_collection = let single_format_collection = ArchiveFilter::new(
ArchiveFilter::new(url_filter, self.clone(), !self.yes, self.skip_specials) url_filter,
self.clone(),
!self.yes,
self.skip_specials,
ctx.crunchy.premium().await,
)
.visit(media_collection) .visit(media_collection)
.await?; .await?;

View file

@ -7,6 +7,7 @@ use anyhow::Result;
use crunchyroll_rs::{Concert, Episode, Locale, Movie, MovieListing, MusicVideo, Season, Series}; use crunchyroll_rs::{Concert, Episode, Locale, Movie, MovieListing, MusicVideo, Season, Series};
use log::{info, warn}; use log::{info, warn};
use std::collections::{BTreeMap, HashMap}; use std::collections::{BTreeMap, HashMap};
use std::ops::Not;
enum Visited { enum Visited {
Series, Series,
@ -21,6 +22,7 @@ pub(crate) struct ArchiveFilter {
skip_special: bool, skip_special: bool,
season_episodes: HashMap<String, Vec<Episode>>, season_episodes: HashMap<String, Vec<Episode>>,
season_subtitles_missing: Vec<u32>, season_subtitles_missing: Vec<u32>,
seasons_with_premium: Option<Vec<u32>>,
season_sorting: Vec<String>, season_sorting: Vec<String>,
visited: Visited, visited: Visited,
} }
@ -31,6 +33,7 @@ impl ArchiveFilter {
archive: Archive, archive: Archive,
interactive_input: bool, interactive_input: bool,
skip_special: bool, skip_special: bool,
is_premium: bool,
) -> Self { ) -> Self {
Self { Self {
url_filter, url_filter,
@ -39,6 +42,7 @@ impl ArchiveFilter {
skip_special, skip_special,
season_episodes: HashMap::new(), season_episodes: HashMap::new(),
season_subtitles_missing: vec![], season_subtitles_missing: vec![],
seasons_with_premium: is_premium.not().then_some(vec![]),
season_sorting: vec![], season_sorting: vec![],
visited: Visited::None, visited: Visited::None,
} }
@ -310,6 +314,29 @@ impl Filter for ArchiveFilter {
episodes.push((episode.clone(), episode.subtitle_locales.clone())) episodes.push((episode.clone(), episode.subtitle_locales.clone()))
} }
if self.seasons_with_premium.is_some() {
let episode_len_before = episodes.len();
episodes.retain(|(e, _)| !e.is_premium_only);
if episode_len_before < episodes.len()
&& !self
.seasons_with_premium
.as_ref()
.unwrap()
.contains(&episode.season_number)
{
warn!(
"Skipping premium episodes in season {}",
episode.season_number
);
self.seasons_with_premium
.as_mut()
.unwrap()
.push(episode.season_number)
}
return Ok(None);
}
let mut relative_episode_number = None; let mut relative_episode_number = None;
let mut relative_sequence_number = None; let mut relative_sequence_number = None;
// get the relative episode number. only done if the output string has the pattern to include // get the relative episode number. only done if the output string has the pattern to include

View file

@ -246,8 +246,13 @@ impl Execute for Download {
for (i, (media_collection, url_filter)) in parsed_urls.into_iter().enumerate() { for (i, (media_collection, url_filter)) in parsed_urls.into_iter().enumerate() {
let progress_handler = progress!("Fetching series details"); let progress_handler = progress!("Fetching series details");
let single_format_collection = let single_format_collection = DownloadFilter::new(
DownloadFilter::new(url_filter, self.clone(), !self.yes, self.skip_specials) url_filter,
self.clone(),
!self.yes,
self.skip_specials,
ctx.crunchy.premium().await,
)
.visit(media_collection) .visit(media_collection)
.await?; .await?;

View file

@ -7,6 +7,7 @@ use anyhow::{bail, Result};
use crunchyroll_rs::{Concert, Episode, Movie, MovieListing, MusicVideo, Season, Series}; use crunchyroll_rs::{Concert, Episode, Movie, MovieListing, MusicVideo, Season, Series};
use log::{error, info, warn}; use log::{error, info, warn};
use std::collections::HashMap; use std::collections::HashMap;
use std::ops::Not;
pub(crate) struct DownloadFilter { pub(crate) struct DownloadFilter {
url_filter: UrlFilter, url_filter: UrlFilter,
@ -15,6 +16,7 @@ pub(crate) struct DownloadFilter {
skip_special: bool, skip_special: bool,
season_episodes: HashMap<u32, Vec<Episode>>, season_episodes: HashMap<u32, Vec<Episode>>,
season_subtitles_missing: Vec<u32>, season_subtitles_missing: Vec<u32>,
seasons_with_premium: Option<Vec<u32>>,
season_visited: bool, season_visited: bool,
} }
@ -24,6 +26,7 @@ impl DownloadFilter {
download: Download, download: Download,
interactive_input: bool, interactive_input: bool,
skip_special: bool, skip_special: bool,
is_premium: bool,
) -> Self { ) -> Self {
Self { Self {
url_filter, url_filter,
@ -32,6 +35,7 @@ impl DownloadFilter {
skip_special, skip_special,
season_episodes: HashMap::new(), season_episodes: HashMap::new(),
season_subtitles_missing: vec![], season_subtitles_missing: vec![],
seasons_with_premium: is_premium.not().then_some(vec![]),
season_visited: false, season_visited: false,
} }
} }
@ -201,6 +205,26 @@ impl Filter for DownloadFilter {
} }
} }
if self.seasons_with_premium.is_some() && episode.is_premium_only {
if !self
.seasons_with_premium
.as_ref()
.unwrap()
.contains(&episode.season_number)
{
warn!(
"Skipping premium episodes in season {}",
episode.season_number
);
self.seasons_with_premium
.as_mut()
.unwrap()
.push(episode.season_number)
}
return Ok(None);
}
let mut relative_episode_number = None; let mut relative_episode_number = None;
let mut relative_sequence_number = None; let mut relative_sequence_number = None;
// get the relative episode number. only done if the output string has the pattern to include // get the relative episode number. only done if the output string has the pattern to include