Code restructuring

This commit is contained in:
euzu
2025-02-05 20:01:49 +01:00
parent dc607d5520
commit bbf6d6e014
82 changed files with 616 additions and 507 deletions
+2 -9
View File
@@ -1,10 +1,3 @@
pub mod m3u_parser;
pub mod xtream_parser;
pub mod playlist_processor;
pub mod xmltv_parser;
mod playlist_watch;
mod xtream_processor;
mod affix_processor;
mod xtream_processor_vod;
mod xtream_processor_series;
pub mod hls_parser;
pub(crate) mod parser;
pub(crate) mod processor;
+4
View File
@@ -0,0 +1,4 @@
pub mod m3u;
pub mod xtream;
pub mod xmltv;
pub mod hls;
@@ -5,7 +5,7 @@ use quick_xml::events::Event;
use quick_xml::Reader;
use crate::model::xmltv::{Epg, EPG_ATTRIB_CHANNEL, EPG_ATTRIB_ID, EPG_TAG_TV, EPG_TAG_CHANNEL, EPG_TAG_PROGRAMME, TVGuide, XmlTag};
use crate::utils::compressed_file_reader::CompressedFileReader;
use crate::utils::compression::compressed_file_reader::CompressedFileReader;
impl TVGuide {
pub fn filter(&self, channel_ids: &HashSet<Rc<String>>) -> Option<Epg> {
@@ -4,13 +4,12 @@ use std::rc::Rc;
use serde_json::Value;
use crate::create_m3u_filter_error_result;
use crate::m3u_filter_error::{M3uFilterError, M3uFilterErrorKind};
use crate::m3u_filter_error::{M3uFilterError, M3uFilterErrorKind, create_m3u_filter_error_result};
use crate::model::config::ConfigInput;
use crate::model::playlist::{PlaylistGroup, PlaylistItem, PlaylistItemHeader, PlaylistItemType, XtreamCluster};
use crate::model::xtream::{XtreamCategory, XtreamSeriesInfo, XtreamSeriesInfoEpisode, XtreamStream};
use crate::utils::hash_utils::generate_playlist_uuid;
use crate::utils::xtream_utils::{get_xtream_stream_url_base, ACTION_GET_SERIES_INFO};
use crate::utils::network::xtream::{get_xtream_stream_url_base, ACTION_GET_SERIES_INFO};
fn map_to_xtream_category(categories: &Value) -> Result<Vec<XtreamCategory>, M3uFilterError> {
match serde_json::from_value::<Vec<XtreamCategory>>(categories.to_owned()) {
+2 -2
View File
@@ -4,8 +4,8 @@ use log::{error, info};
use crate::messaging::{MsgKind, send_message};
use crate::model::config::Config;
use crate::model::playlist::PlaylistGroup;
use crate::utils::file_utils;
use crate::utils::file_utils::sanitize_filename;
use crate::utils::file::file_utils;
use crate::utils::file::file_utils::sanitize_filename;
pub fn process_group_watch(cfg: &Config, target_name: &str, pl: &PlaylistGroup) {
let mut new_tree = BTreeSet::new();
@@ -1,6 +1,6 @@
use crate::model::config::{ConfigInput, InputAffix, AFFIX_FIELDS};
use crate::model::config::{ConfigInput, InputAffix, AFFIX_FIELDS, valid_property};
use crate::model::playlist::{FetchedPlaylist, FieldGetAccessor, FieldSetAccessor, PlaylistItem};
use crate::{debug_if_enabled, valid_property};
use crate::utils::{debug_if_enabled};
type AffixProcessor<'a> = Box<dyn Fn(&mut PlaylistItem) + 'a>;
+44
View File
@@ -0,0 +1,44 @@
pub mod playlist;
mod xtream;
mod affix;
mod xtream_vod;
mod xtream_series;
#[macro_export]
macro_rules! handle_error {
($stmt:expr, $map_err:expr) => {
if let Err(err) = $stmt {
$map_err(err);
}
};
}
use handle_error;
#[macro_export]
macro_rules! handle_error_and_return {
($stmt:expr, $map_err:expr) => {
if let Err(err) = $stmt {
$map_err(err);
return Default::default();
}
};
}
use handle_error_and_return;
#[macro_export]
macro_rules! create_resolve_options_function_for_xtream_target {
($cluster:ident) => {
paste::paste! {
fn [<get_resolve_ $cluster _options>](target: &ConfigTarget, fpl: &FetchedPlaylist) -> (bool, u16) {
let (resolve, resolve_delay) =
target.options.as_ref().map_or((false, 0), |opt| {
(opt.[<xtream_resolve_ $cluster>] && fpl.input.input_type == InputType::Xtream,
opt.[<xtream_resolve_ $cluster _delay>])
});
(resolve, resolve_delay)
}
}
};
}
use create_resolve_options_function_for_xtream_target;
@@ -1,8 +1,10 @@
extern crate unidecode;
use crate::utils::epg_utils;
use crate::utils::m3u_utils;
use crate::utils::xtream_utils;
use crate::Config;
use crate::model::config::ConfigRename;
use crate::utils::network::epg;
use crate::utils::network::m3u;
use crate::utils::network::xtream;
use async_std::sync::Mutex;
use core::cmp::Ordering;
use std::cell::RefCell;
@@ -17,22 +19,22 @@ use log::{debug, error, info, log_enabled, trace, warn, Level};
use std::time::Instant;
use unidecode::unidecode;
use crate::filter::{get_field_value, set_field_value, MockValueProcessor, ValueProvider};
use crate::m3u_filter_error::{M3uFilterError, M3uFilterErrorKind};
use crate::foundation::filter::{get_field_value, set_field_value, MockValueProcessor, ValueProvider};
use crate::m3u_filter_error::{M3uFilterError, M3uFilterErrorKind, get_errors_notify_message, notify_err};
use crate::messaging::{send_message, MsgKind};
use crate::model::config::{ConfigSortChannel, ConfigSortGroup, ConfigTarget, InputType,
ItemField, ProcessTargets, ProcessingOrder, SortOrder::{Asc, Desc}};
use crate::model::mapping::{CounterModifier, Mapping, MappingValueProcessor};
use crate::model::playlist::{FetchedPlaylist, FieldGetAccessor, FieldSetAccessor, PlaylistEntry, PlaylistGroup, PlaylistItem, UUIDType, XtreamCluster};
use crate::model::stats::{InputStats, PlaylistStats, SourceStats, TargetStats};
use crate::processing::affix_processor::apply_affixes;
use crate::processing::processor::affix::apply_affixes;
use crate::processing::playlist_watch::process_group_watch;
use crate::processing::xmltv_parser::flatten_tvguide;
use crate::processing::xtream_processor_series::playlist_resolve_series;
use crate::processing::xtream_processor_vod::playlist_resolve_vod;
use crate::processing::parser::xmltv::flatten_tvguide;
use crate::processing::processor::xtream_series::playlist_resolve_series;
use crate::processing::processor::xtream_vod::playlist_resolve_vod;
use crate::repository::playlist_repository::persist_playlist;
use crate::utils::default_utils::default_as_default;
use crate::{debug_if_enabled, get_errors_notify_message, model::config, notify_err, Config};
use crate::utils::{debug_if_enabled};
fn is_valid(pli: &PlaylistItem, target: &ConfigTarget) -> bool {
let provider = ValueProvider { pli: RefCell::new(pli) };
@@ -140,7 +142,7 @@ fn channel_no_playlist(new_playlist: &[PlaylistGroup]) {
}
}
fn exec_rename(pli: &PlaylistItem, rename: Option<&Vec<config::ConfigRename>>) {
fn exec_rename(pli: &PlaylistItem, rename: Option<&Vec<ConfigRename>>) {
if let Some(renames) = rename {
if !renames.is_empty() {
let result = pli;
@@ -313,11 +315,11 @@ async fn process_source(client: Arc<reqwest::Client>, cfg: Arc<Config>, source_i
if is_input_enabled(enabled_inputs, input.enabled, input.id, &user_targets) {
let start_time = Instant::now();
let (mut playlistgroups, mut error_list) = match input.input_type {
InputType::M3u => m3u_utils::get_m3u_playlist(Arc::clone(&client), &cfg, input, &cfg.working_dir).await,
InputType::Xtream => xtream_utils::get_xtream_playlist(Arc::clone(&client), input, &cfg.working_dir).await,
InputType::M3u => m3u::get_m3u_playlist(Arc::clone(&client), &cfg, input, &cfg.working_dir).await,
InputType::Xtream => xtream::get_xtream_playlist(Arc::clone(&client), input, &cfg.working_dir).await,
};
let (tvguide, mut tvguide_errors) = if error_list.is_empty() {
epg_utils::get_xmltv(Arc::clone(&client), &cfg, input, &cfg.working_dir).await
epg::get_xmltv(Arc::clone(&client), &cfg, input, &cfg.working_dir).await
} else {
(None, vec![])
};
@@ -2,8 +2,7 @@ use crate::m3u_filter_error::{str_to_io_error, to_io_error, M3uFilterError, M3uF
use crate::model::config::{Config, ConfigInput};
use crate::model::playlist::{FetchedPlaylist, PlaylistEntry, PlaylistItem, PlaylistItemType, XtreamCluster};
use crate::repository::storage::get_input_storage_path;
use crate::utils::{xtream_utils};
use crate::{info_err, notify_err};
use crate::m3u_filter_error::{info_err, notify_err};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::fs::File;
@@ -16,49 +15,16 @@ const FILE_VOD_INFO: &str = "xtream_vod_info";
const FILE_SUFFIX_WAL: &str = "wal";
const FILE_SERIES_EPISODE_RECORD: &str = "series_episode_record";
#[macro_export]
macro_rules! handle_error {
($stmt:expr, $map_err:expr) => {
if let Err(err) = $stmt {
$map_err(err);
}
};
}
#[macro_export]
macro_rules! handle_error_and_return {
($stmt:expr, $map_err:expr) => {
if let Err(err) = $stmt {
$map_err(err);
return Default::default();
}
};
}
use crate::repository::bplustree::BPlusTree;
use crate::repository::xtream_repository::xtream_get_record_file_path;
use crate::utils::file_utils::append_or_crate_file;
#[macro_export]
macro_rules! create_resolve_options_function_for_xtream_target {
($cluster:ident) => {
paste::paste! {
fn [<get_resolve_ $cluster _options>](target: &ConfigTarget, fpl: &FetchedPlaylist) -> (bool, u16) {
let (resolve, resolve_delay) =
target.options.as_ref().map_or((false, 0), |opt| {
(opt.[<xtream_resolve_ $cluster>] && fpl.input.input_type == InputType::Xtream,
opt.[<xtream_resolve_ $cluster _delay>])
});
(resolve, resolve_delay)
}
}
};
}
use crate::utils::file::file_utils::append_or_crate_file;
use crate::utils::network::xtream;
pub(in crate::processing) async fn playlist_resolve_download_playlist_item(client: Arc<reqwest::Client>, pli: &PlaylistItem, input: &ConfigInput, errors: &mut Vec<M3uFilterError>, resolve_delay: u16, cluster: XtreamCluster) -> Option<String> {
let mut result = None;
let provider_id = pli.get_provider_id()?;
if let Some(info_url) = xtream_utils::get_xtream_player_api_info_url(input, cluster, provider_id) {
result = match xtream_utils::get_xtream_stream_info_content(client, &info_url, input).await {
if let Some(info_url) = xtream::get_xtream_player_api_info_url(input, cluster, provider_id) {
result = match xtream::get_xtream_stream_info_content(client, &info_url, input).await {
Ok(content) => Some(content),
Err(err) => {
errors.push(info_err!(format!("{err}")));
@@ -1,13 +1,14 @@
use crate::m3u_filter_error::{M3uFilterError, M3uFilterErrorKind};
use crate::model::config::{Config, ConfigTarget, InputType};
use crate::model::playlist::{FetchedPlaylist, PlaylistGroup, PlaylistItem, PlaylistItemType, XtreamCluster};
use crate::processing::playlist_processor::ProcessingPipe;
use crate::processing::xtream_parser::parse_xtream_series_info;
use crate::processing::xtream_processor::{create_resolve_episode_wal_files, create_resolve_info_wal_files, playlist_resolve_download_playlist_item, read_processed_info_ids, should_update_info, write_info_content_to_wal_file};
use crate::processing::processor::playlist::ProcessingPipe;
use crate::processing::parser::xtream::parse_xtream_series_info;
use crate::processing::processor::xtream::{create_resolve_episode_wal_files, create_resolve_info_wal_files, playlist_resolve_download_playlist_item, read_processed_info_ids, should_update_info, write_info_content_to_wal_file};
use crate::repository::storage::get_input_storage_path;
use crate::repository::xtream_repository::{xtream_get_info_file_paths, xtream_update_input_info_file, xtream_update_input_series_episodes_record_from_wal_file, xtream_update_input_series_record_from_wal_file};
use crate::repository::IndexedDocumentReader;
use crate::{create_resolve_options_function_for_xtream_target, handle_error, handle_error_and_return, info_err, notify_err};
use crate::m3u_filter_error::{notify_err, info_err};
use crate::processing::processor::{handle_error, handle_error_and_return, create_resolve_options_function_for_xtream_target};
use std::collections::HashMap;
use std::fs::File;
use std::io::{BufWriter, Write};
@@ -15,7 +16,7 @@ use std::sync::Arc;
use std::time::Instant;
use log::{info, log_enabled, Level};
use crate::model::xtream::{XtreamSeriesEpisode, XtreamSeriesInfoEpisode};
use crate::utils::file_utils::file_writer;
use crate::utils::file::file_utils::file_writer;
const TAG_SERIES_INFO_LAST_MODIFIED: &str = "last_modified";
@@ -1,9 +1,10 @@
use crate::m3u_filter_error::{M3uFilterError, M3uFilterErrorKind};
use crate::model::config::{Config, ConfigTarget, InputType};
use crate::model::playlist::{FetchedPlaylist, PlaylistItem, PlaylistItemType, XtreamCluster};
use crate::processing::xtream_processor::{create_resolve_info_wal_files, playlist_resolve_download_playlist_item, read_processed_info_ids, should_update_info, write_info_content_to_wal_file};
use crate::processing::processor::xtream::{create_resolve_info_wal_files, playlist_resolve_download_playlist_item, read_processed_info_ids, should_update_info, write_info_content_to_wal_file};
use crate::repository::xtream_repository::{xtream_update_input_info_file, xtream_update_input_vod_record_from_wal_file, InputVodInfoRecord};
use crate::{create_resolve_options_function_for_xtream_target, handle_error, handle_error_and_return, notify_err};
use crate::m3u_filter_error::{notify_err};
use crate::processing::processor::{handle_error, handle_error_and_return, create_resolve_options_function_for_xtream_target};
use crate::utils::json_utils::{get_u32_from_serde_value, get_u64_from_serde_value};
use serde_json::{Map, Value};
use std::collections::HashMap;
@@ -12,7 +13,7 @@ use std::io::{BufWriter, Write};
use std::sync::Arc;
use std::time::Instant;
use log::{info, log_enabled, Level};
use crate::utils::file_utils::file_writer;
use crate::utils::file::file_utils::file_writer;
const TAG_VOD_INFO_INFO: &str = "info";
const TAG_VOD_INFO_MOVIE_DATA: &str = "movie_data";