ytdl-sub 2025.11.9__tar.gz → 2025.11.18__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/PKG-INFO +2 -2
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/pyproject.toml +1 -1
- ytdl_sub-2025.11.18/src/ytdl_sub/__init__.py +1 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/preset_options.py +16 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/subscriptions/subscription_download.py +3 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/file_handler.py +19 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py +20 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub.egg-info/PKG-INFO +2 -2
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub.egg-info/requires.txt +1 -1
- ytdl_sub-2025.11.9/src/ytdl_sub/__init__.py +0 -1
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/LICENSE +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/README.md +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/setup.cfg +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/cli/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/cli/entrypoint.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/cli/output_summary.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/cli/output_transaction_log.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/cli/parsers/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/cli/parsers/cli_to_sub.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/cli/parsers/dl.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/cli/parsers/main.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/config_file.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/config_validator.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/defaults.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/overrides.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/plugin/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/plugin/plugin.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/plugin/plugin_mapping.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/plugin/plugin_operation.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/plugin/preset_plugins.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/preset.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/validators/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/validators/options.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/validators/variable_validation.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/downloaders/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/downloaders/info_json/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/downloaders/info_json/info_json_downloader.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/downloaders/source_plugin.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/downloaders/url/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/downloaders/url/downloader.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/downloaders/url/validators.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/downloaders/ytdl_options_builder.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/downloaders/ytdlp.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/base_entry.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/entry.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/entry_parent.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/script/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/script/custom_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/script/function_scripts.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/script/variable_definitions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/script/variable_types.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/variables/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/variables/override_variables.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/main.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/audio_extract.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/chapters.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/date_range.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/embed_thumbnail.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/file_convert.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/filter_exclude.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/filter_include.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/format.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/internal/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/internal/view.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/match_filters.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/music_tags.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/nfo_tags.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/output_directory_nfo_tags.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/split_by_chapters.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/square_thumbnail.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/static_nfo_tags.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/subtitles.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/throttle_protection.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/video_tags.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/download_deletion_options.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/filter_duration.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/filter_keywords.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/media_quality.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/players.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/throttle_protection.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/url.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/url_bilateral.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/url_categorized.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/internal/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/internal/view.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music/albums_from_chapters.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music/albums_from_playlists.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music/singles.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music/soundcloud.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music_videos/music_video_base.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music_videos/music_video_extras.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_collection.yaml +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/array_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/boolean_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/conditional_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/date_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/error_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/json_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/map_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/numeric_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/print_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/regex_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/string_functions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/parser.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/script.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/script_output.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/types/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/types/array.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/types/function.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/types/map.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/types/resolvable.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/types/syntax_tree.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/types/variable.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/types/variable_dependency.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/utils/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/utils/exception_formatters.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/utils/exceptions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/utils/name_validation.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/utils/type_checking.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/subscriptions/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/subscriptions/base_subscription.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/subscriptions/subscription.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/subscriptions/subscription_validators.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/subscriptions/subscription_ytdl_options.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/thread/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/thread/log_entries_downloaded_listener.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/chapters.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/datetime.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/exceptions.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/ffmpeg.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/file_lock.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/file_path.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/logger.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/retry.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/script.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/scriptable.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/subtitles.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/system.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/thumbnail.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/xml.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/utils/yaml.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/audo_codec_validator.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/file_path_validators.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/nfo_validators.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/regex_validator.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/source_variable_validator.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/strict_dict_validator.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/string_datetime.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/string_formatter_validators.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/string_select_validator.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/validators.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/ytdl_additions/__init__.py +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub.egg-info/SOURCES.txt +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub.egg-info/dependency_links.txt +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub.egg-info/entry_points.txt +0 -0
- {ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ytdl-sub
|
|
3
|
-
Version: 2025.11.
|
|
3
|
+
Version: 2025.11.18
|
|
4
4
|
Summary: Automate downloading metadata generation with YoutubeDL
|
|
5
5
|
Author: Jesse Bannon
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -689,7 +689,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
689
689
|
Requires-Python: >=3.10
|
|
690
690
|
Description-Content-Type: text/markdown
|
|
691
691
|
License-File: LICENSE
|
|
692
|
-
Requires-Dist: yt-dlp[default]==2025.
|
|
692
|
+
Requires-Dist: yt-dlp[default]==2025.11.12
|
|
693
693
|
Requires-Dist: colorama~=0.4
|
|
694
694
|
Requires-Dist: mergedeep~=1.3
|
|
695
695
|
Requires-Dist: mediafile~=0.12
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__pypi_version__ = "2025.11.18";__local_version__ = "2025.11.18+63753c5"
|
|
@@ -107,6 +107,7 @@ class OutputOptions(OptionsDictValidator):
|
|
|
107
107
|
"keep_max_files",
|
|
108
108
|
"download_archive_standardized_date",
|
|
109
109
|
"keep_files_date_eval",
|
|
110
|
+
"preserve_mtime",
|
|
110
111
|
}
|
|
111
112
|
|
|
112
113
|
@classmethod
|
|
@@ -170,6 +171,10 @@ class OutputOptions(OptionsDictValidator):
|
|
|
170
171
|
default=f"{{{v.upload_date_standardized.variable_name}}}",
|
|
171
172
|
)
|
|
172
173
|
|
|
174
|
+
self._preserve_mtime = self._validate_key_if_present(
|
|
175
|
+
key="preserve_mtime", validator=BoolValidator, default=False
|
|
176
|
+
)
|
|
177
|
+
|
|
173
178
|
if (
|
|
174
179
|
self._keep_files_before or self._keep_files_after or self._keep_max_files
|
|
175
180
|
) and not self.maintain_download_archive:
|
|
@@ -309,6 +314,17 @@ class OutputOptions(OptionsDictValidator):
|
|
|
309
314
|
"""
|
|
310
315
|
return self._keep_max_files
|
|
311
316
|
|
|
317
|
+
@property
|
|
318
|
+
def preserve_mtime(self) -> bool:
|
|
319
|
+
"""
|
|
320
|
+
:expected type: Optional[Boolean]
|
|
321
|
+
:description:
|
|
322
|
+
Preserve the video's original upload time as the file modification time.
|
|
323
|
+
When True, sets the file's mtime to match the video's upload_date from
|
|
324
|
+
yt-dlp metadata. Defaults to False.
|
|
325
|
+
"""
|
|
326
|
+
return self._preserve_mtime.value
|
|
327
|
+
|
|
312
328
|
def added_variables(self, unresolved_variables: Set[str]) -> Dict[PluginOperation, Set[str]]:
|
|
313
329
|
return {
|
|
314
330
|
# PluginOperation.MODIFY_ENTRY_METADATA: {
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/subscriptions/subscription_download.py
RENAMED
|
@@ -73,6 +73,7 @@ class SubscriptionDownload(BaseSubscription, ABC):
|
|
|
73
73
|
file_metadata=entry_metadata,
|
|
74
74
|
output_file_name=output_file_name,
|
|
75
75
|
entry=entry,
|
|
76
|
+
preserve_mtime=self.output_options.preserve_mtime,
|
|
76
77
|
)
|
|
77
78
|
|
|
78
79
|
# Always pretend to include the thumbnail in a dry-run
|
|
@@ -87,6 +88,7 @@ class SubscriptionDownload(BaseSubscription, ABC):
|
|
|
87
88
|
output_file_name=output_thumbnail_name,
|
|
88
89
|
entry=entry,
|
|
89
90
|
copy_file=True,
|
|
91
|
+
preserve_mtime=self.output_options.preserve_mtime,
|
|
90
92
|
)
|
|
91
93
|
elif not entry.is_thumbnail_downloaded():
|
|
92
94
|
logger.warning(
|
|
@@ -106,6 +108,7 @@ class SubscriptionDownload(BaseSubscription, ABC):
|
|
|
106
108
|
file_name=entry.get_download_info_json_name(),
|
|
107
109
|
output_file_name=output_info_json_name,
|
|
108
110
|
entry=entry,
|
|
111
|
+
preserve_mtime=self.output_options.preserve_mtime,
|
|
109
112
|
)
|
|
110
113
|
|
|
111
114
|
def _delete_working_directory(self, is_error: bool = False) -> None:
|
|
@@ -430,6 +430,25 @@ class FileHandler:
|
|
|
430
430
|
if os.path.isfile(file_path):
|
|
431
431
|
os.remove(file_path)
|
|
432
432
|
|
|
433
|
+
@classmethod
|
|
434
|
+
def set_mtime(cls, file_path: Union[str, Path], mtime: float):
|
|
435
|
+
"""
|
|
436
|
+
Set the modification time of a file
|
|
437
|
+
|
|
438
|
+
Parameters
|
|
439
|
+
----------
|
|
440
|
+
file_path
|
|
441
|
+
Path to the file to modify
|
|
442
|
+
mtime
|
|
443
|
+
Modification time as a Unix timestamp
|
|
444
|
+
"""
|
|
445
|
+
try:
|
|
446
|
+
# Set both access time and modification time
|
|
447
|
+
os.utime(file_path, (mtime, mtime))
|
|
448
|
+
except OSError:
|
|
449
|
+
# If file operation fails, silently continue
|
|
450
|
+
pass
|
|
451
|
+
|
|
433
452
|
def move_file_to_output_directory(
|
|
434
453
|
self,
|
|
435
454
|
file_name: str,
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import json
|
|
3
3
|
import os.path
|
|
4
|
+
import time
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
from datetime import datetime
|
|
6
7
|
from pathlib import Path
|
|
@@ -642,6 +643,7 @@ class EnhancedDownloadArchive:
|
|
|
642
643
|
output_file_name: Optional[str] = None,
|
|
643
644
|
entry: Optional[Entry] = None,
|
|
644
645
|
copy_file: bool = False,
|
|
646
|
+
preserve_mtime: bool = False,
|
|
645
647
|
):
|
|
646
648
|
"""
|
|
647
649
|
Saves a file from the working directory to the output directory and record it in the
|
|
@@ -660,6 +662,8 @@ class EnhancedDownloadArchive:
|
|
|
660
662
|
Optional. Entry that this file belongs to
|
|
661
663
|
copy_file
|
|
662
664
|
Optional. If True, copy the file. Move otherwise
|
|
665
|
+
preserve_mtime
|
|
666
|
+
Optional. If True and entry has upload_date, set file mtime to upload date
|
|
663
667
|
"""
|
|
664
668
|
if output_file_name is None:
|
|
665
669
|
output_file_name = file_name
|
|
@@ -674,6 +678,22 @@ class EnhancedDownloadArchive:
|
|
|
674
678
|
copy_file=copy_file,
|
|
675
679
|
)
|
|
676
680
|
|
|
681
|
+
# Set mtime if preserve_mtime is enabled and we have an entry with upload_date
|
|
682
|
+
if preserve_mtime and entry and not self._file_handler.dry_run:
|
|
683
|
+
upload_date = entry.get(v.ytdl_sub_keep_files_date_eval, str)
|
|
684
|
+
if upload_date:
|
|
685
|
+
try:
|
|
686
|
+
# Convert YYYY-mm-dd to timestamp
|
|
687
|
+
upload_datetime = datetime.strptime(upload_date, "%Y-%m-%d")
|
|
688
|
+
upload_timestamp = time.mktime(upload_datetime.timetuple())
|
|
689
|
+
|
|
690
|
+
# Set mtime on the output file
|
|
691
|
+
output_file_path = Path(self._file_handler.output_directory) / output_file_name
|
|
692
|
+
FileHandler.set_mtime(output_file_path, upload_timestamp)
|
|
693
|
+
except (ValueError, OSError):
|
|
694
|
+
# If date parsing or file operation fails, silently continue
|
|
695
|
+
pass
|
|
696
|
+
|
|
677
697
|
# Determine if it's the entry file by seeing if the file_name to move matches the entry
|
|
678
698
|
# download file name
|
|
679
699
|
is_entry_file = entry and entry.get_download_file_name() == file_name
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ytdl-sub
|
|
3
|
-
Version: 2025.11.
|
|
3
|
+
Version: 2025.11.18
|
|
4
4
|
Summary: Automate downloading metadata generation with YoutubeDL
|
|
5
5
|
Author: Jesse Bannon
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -689,7 +689,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
689
689
|
Requires-Python: >=3.10
|
|
690
690
|
Description-Content-Type: text/markdown
|
|
691
691
|
License-File: LICENSE
|
|
692
|
-
Requires-Dist: yt-dlp[default]==2025.
|
|
692
|
+
Requires-Dist: yt-dlp[default]==2025.11.12
|
|
693
693
|
Requires-Dist: colorama~=0.4
|
|
694
694
|
Requires-Dist: mergedeep~=1.3
|
|
695
695
|
Requires-Dist: mediafile~=0.12
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__pypi_version__ = "2025.11.09";__local_version__ = "2025.11.09+a74c79d"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/config/validators/variable_validation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/script/variable_definitions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/entries/variables/override_variables.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/plugins/output_directory_nfo_tags.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/media_quality.yaml
RENAMED
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/players.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/helpers/url_bilateral.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/internal/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music/soundcloud.yaml
RENAMED
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py
RENAMED
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml
RENAMED
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/boolean_functions.py
RENAMED
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/conditional_functions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/numeric_functions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/functions/string_functions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/script/utils/exception_formatters.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/subscriptions/subscription_validators.py
RENAMED
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/subscriptions/subscription_ytdl_options.py
RENAMED
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/thread/log_entries_downloaded_listener.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/source_variable_validator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/string_formatter_validators.py
RENAMED
|
File without changes
|
{ytdl_sub-2025.11.9 → ytdl_sub-2025.11.18}/src/ytdl_sub/validators/string_select_validator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|