ytdl-sub 2025.11.18__tar.gz → 2025.11.28__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.
Files changed (172) hide show
  1. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/PKG-INFO +1 -1
  2. ytdl_sub-2025.11.28/src/ytdl_sub/__init__.py +1 -0
  3. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/overrides.py +5 -0
  4. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/parser.py +1 -1
  5. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/script.py +8 -3
  6. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/types/function.py +11 -6
  7. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/types/syntax_tree.py +28 -2
  8. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/types/variable_dependency.py +4 -4
  9. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/string_formatter_validators.py +1 -0
  10. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub.egg-info/PKG-INFO +1 -1
  11. ytdl_sub-2025.11.18/src/ytdl_sub/__init__.py +0 -1
  12. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/LICENSE +0 -0
  13. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/README.md +0 -0
  14. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/pyproject.toml +0 -0
  15. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/setup.cfg +0 -0
  16. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/cli/__init__.py +0 -0
  17. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/cli/entrypoint.py +0 -0
  18. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/cli/output_summary.py +0 -0
  19. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/cli/output_transaction_log.py +0 -0
  20. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/cli/parsers/__init__.py +0 -0
  21. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/cli/parsers/cli_to_sub.py +0 -0
  22. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/cli/parsers/dl.py +0 -0
  23. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/cli/parsers/main.py +0 -0
  24. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/__init__.py +0 -0
  25. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/config_file.py +0 -0
  26. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/config_validator.py +0 -0
  27. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/defaults.py +0 -0
  28. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/plugin/__init__.py +0 -0
  29. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/plugin/plugin.py +0 -0
  30. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/plugin/plugin_mapping.py +0 -0
  31. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/plugin/plugin_operation.py +0 -0
  32. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/plugin/preset_plugins.py +0 -0
  33. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/preset.py +0 -0
  34. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/preset_options.py +0 -0
  35. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/validators/__init__.py +0 -0
  36. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/validators/options.py +0 -0
  37. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/config/validators/variable_validation.py +0 -0
  38. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/downloaders/__init__.py +0 -0
  39. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/downloaders/info_json/__init__.py +0 -0
  40. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/downloaders/info_json/info_json_downloader.py +0 -0
  41. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/downloaders/source_plugin.py +0 -0
  42. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/downloaders/url/__init__.py +0 -0
  43. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/downloaders/url/downloader.py +0 -0
  44. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/downloaders/url/validators.py +0 -0
  45. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/downloaders/ytdl_options_builder.py +0 -0
  46. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/downloaders/ytdlp.py +0 -0
  47. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/__init__.py +0 -0
  48. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/base_entry.py +0 -0
  49. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/entry.py +0 -0
  50. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/entry_parent.py +0 -0
  51. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/script/__init__.py +0 -0
  52. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/script/custom_functions.py +0 -0
  53. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/script/function_scripts.py +0 -0
  54. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/script/variable_definitions.py +0 -0
  55. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/script/variable_types.py +0 -0
  56. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/variables/__init__.py +0 -0
  57. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/entries/variables/override_variables.py +0 -0
  58. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/main.py +0 -0
  59. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/__init__.py +0 -0
  60. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/audio_extract.py +0 -0
  61. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/chapters.py +0 -0
  62. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/date_range.py +0 -0
  63. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/embed_thumbnail.py +0 -0
  64. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/file_convert.py +0 -0
  65. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/filter_exclude.py +0 -0
  66. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/filter_include.py +0 -0
  67. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/format.py +0 -0
  68. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/internal/__init__.py +0 -0
  69. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/internal/view.py +0 -0
  70. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/match_filters.py +0 -0
  71. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/music_tags.py +0 -0
  72. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/nfo_tags.py +0 -0
  73. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/output_directory_nfo_tags.py +0 -0
  74. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/split_by_chapters.py +0 -0
  75. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/square_thumbnail.py +0 -0
  76. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/static_nfo_tags.py +0 -0
  77. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/subtitles.py +0 -0
  78. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/throttle_protection.py +0 -0
  79. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/plugins/video_tags.py +0 -0
  80. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/__init__.py +0 -0
  81. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/helpers/__init__.py +0 -0
  82. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/helpers/download_deletion_options.yaml +0 -0
  83. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/helpers/filter_duration.yaml +0 -0
  84. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/helpers/filter_keywords.yaml +0 -0
  85. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/helpers/media_quality.yaml +0 -0
  86. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/helpers/players.yaml +0 -0
  87. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/helpers/throttle_protection.yaml +0 -0
  88. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/helpers/url.yaml +0 -0
  89. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/helpers/url_bilateral.yaml +0 -0
  90. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/helpers/url_categorized.yaml +0 -0
  91. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/internal/__init__.py +0 -0
  92. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/internal/view.yaml +0 -0
  93. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/music/__init__.py +0 -0
  94. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/music/albums_from_chapters.yaml +0 -0
  95. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/music/albums_from_playlists.yaml +0 -0
  96. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/music/singles.yaml +0 -0
  97. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/music/soundcloud.yaml +0 -0
  98. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py +0 -0
  99. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/music_videos/music_video_base.yaml +0 -0
  100. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/music_videos/music_video_extras.yaml +0 -0
  101. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml +0 -0
  102. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py +0 -0
  103. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml +0 -0
  104. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml +0 -0
  105. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml +0 -0
  106. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_collection.yaml +0 -0
  107. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/__init__.py +0 -0
  108. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/__init__.py +0 -0
  109. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/array_functions.py +0 -0
  110. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/boolean_functions.py +0 -0
  111. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/conditional_functions.py +0 -0
  112. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/date_functions.py +0 -0
  113. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/error_functions.py +0 -0
  114. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/json_functions.py +0 -0
  115. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/map_functions.py +0 -0
  116. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/numeric_functions.py +0 -0
  117. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/print_functions.py +0 -0
  118. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/regex_functions.py +0 -0
  119. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/functions/string_functions.py +0 -0
  120. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/script_output.py +0 -0
  121. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/types/__init__.py +0 -0
  122. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/types/array.py +0 -0
  123. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/types/map.py +0 -0
  124. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/types/resolvable.py +0 -0
  125. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/types/variable.py +0 -0
  126. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/utils/__init__.py +0 -0
  127. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/utils/exception_formatters.py +0 -0
  128. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/utils/exceptions.py +0 -0
  129. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/utils/name_validation.py +0 -0
  130. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/script/utils/type_checking.py +0 -0
  131. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/subscriptions/__init__.py +0 -0
  132. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/subscriptions/base_subscription.py +0 -0
  133. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/subscriptions/subscription.py +0 -0
  134. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/subscriptions/subscription_download.py +0 -0
  135. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/subscriptions/subscription_validators.py +0 -0
  136. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/subscriptions/subscription_ytdl_options.py +0 -0
  137. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/thread/__init__.py +0 -0
  138. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/thread/log_entries_downloaded_listener.py +0 -0
  139. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/__init__.py +0 -0
  140. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/chapters.py +0 -0
  141. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/datetime.py +0 -0
  142. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/exceptions.py +0 -0
  143. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/ffmpeg.py +0 -0
  144. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/file_handler.py +0 -0
  145. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/file_lock.py +0 -0
  146. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/file_path.py +0 -0
  147. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/logger.py +0 -0
  148. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/retry.py +0 -0
  149. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/script.py +0 -0
  150. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/scriptable.py +0 -0
  151. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/subtitles.py +0 -0
  152. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/system.py +0 -0
  153. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/thumbnail.py +0 -0
  154. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/xml.py +0 -0
  155. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/utils/yaml.py +0 -0
  156. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/__init__.py +0 -0
  157. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/audo_codec_validator.py +0 -0
  158. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/file_path_validators.py +0 -0
  159. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/nfo_validators.py +0 -0
  160. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/regex_validator.py +0 -0
  161. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/source_variable_validator.py +0 -0
  162. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/strict_dict_validator.py +0 -0
  163. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/string_datetime.py +0 -0
  164. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/string_select_validator.py +0 -0
  165. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/validators/validators.py +0 -0
  166. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/ytdl_additions/__init__.py +0 -0
  167. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py +0 -0
  168. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub.egg-info/SOURCES.txt +0 -0
  169. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub.egg-info/dependency_links.txt +0 -0
  170. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub.egg-info/entry_points.txt +0 -0
  171. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/src/ytdl_sub.egg-info/requires.txt +0 -0
  172. {ytdl_sub-2025.11.18 → ytdl_sub-2025.11.28}/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.18
3
+ Version: 2025.11.28
4
4
  Summary: Automate downloading metadata generation with YoutubeDL
5
5
  Author: Jesse Bannon
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -0,0 +1 @@
1
+ __pypi_version__ = "2025.11.28";__local_version__ = "2025.11.28+19f47cd"
@@ -158,10 +158,15 @@ class Overrides(UnstructuredDictFormatterValidator, Scriptable):
158
158
  script = entry.script
159
159
  unresolvable = entry.unresolvable
160
160
 
161
+ # Update the script internally so long as we are not supplying overrides
162
+ # that could alter the script with one-off state
163
+ update = function_overrides is None
164
+
161
165
  try:
162
166
  return script.resolve_once(
163
167
  dict({"tmp_var": formatter.format_string}, **(function_overrides or {})),
164
168
  unresolvable=unresolvable,
169
+ update=update,
165
170
  )["tmp_var"]
166
171
  except ScriptVariableNotResolved as exc:
167
172
  raise StringFormattingException(
@@ -605,7 +605,7 @@ def parse(
605
605
  name=name,
606
606
  custom_function_names=custom_function_names,
607
607
  variable_names=variable_names,
608
- ).ast
608
+ ).ast.maybe_resolvable_casted()
609
609
 
610
610
 
611
611
  # pylint: enable=invalid-name
@@ -10,6 +10,7 @@ from ytdl_sub.script.script_output import ScriptOutput
10
10
  from ytdl_sub.script.types.resolvable import BuiltInFunctionType
11
11
  from ytdl_sub.script.types.resolvable import Lambda
12
12
  from ytdl_sub.script.types.resolvable import Resolvable
13
+ from ytdl_sub.script.types.syntax_tree import ResolvedSyntaxTree
13
14
  from ytdl_sub.script.types.syntax_tree import SyntaxTree
14
15
  from ytdl_sub.script.types.variable import FunctionArgument
15
16
  from ytdl_sub.script.types.variable import Variable
@@ -273,7 +274,7 @@ class Script:
273
274
 
274
275
  def _update_internally(self, resolved_variables: Dict[str, Resolvable]) -> None:
275
276
  for variable_name, resolved in resolved_variables.items():
276
- self._variables[variable_name] = SyntaxTree(ast=[resolved])
277
+ self._variables[variable_name] = ResolvedSyntaxTree(ast=[resolved])
277
278
 
278
279
  def _recursive_get_unresolved_output_filter_variables(
279
280
  self, current_var: SyntaxTree, subset_to_resolve: Set[str], unresolvable: Set[Variable]
@@ -398,8 +399,8 @@ class Script:
398
399
 
399
400
  # Otherwise, if it has dependencies that are all resolved, then
400
401
  # resolve the definition
401
- elif not definition.is_subset_of(
402
- variables=resolved.keys(), custom_function_definitions=self._functions
402
+ elif definition.is_subset_of(
403
+ variables=resolved, custom_function_definitions=self._functions
403
404
  ):
404
405
  resolved[variable] = unresolved[variable].resolve(
405
406
  resolved_variables=resolved,
@@ -522,6 +523,7 @@ class Script:
522
523
  variable_definitions: Dict[str, str],
523
524
  resolved: Optional[Dict[str, Resolvable]] = None,
524
525
  unresolvable: Optional[Set[str]] = None,
526
+ update: bool = False,
525
527
  ) -> Dict[str, Resolvable]:
526
528
  """
527
529
  Given a new set of variable definitions, resolve them using the Script, but do not
@@ -536,6 +538,8 @@ class Script:
536
538
  unresolvable
537
539
  Optional. Unresolvable variables that will be ignored in resolution, including all
538
540
  variables with a dependency to them.
541
+ update
542
+ Whether to update the script's state with resolved variables. Defaults to False.
539
543
 
540
544
  Returns
541
545
  -------
@@ -548,6 +552,7 @@ class Script:
548
552
  pre_resolved=resolved,
549
553
  unresolvable=unresolvable,
550
554
  output_filter=set(list(variable_definitions.keys())),
555
+ update=update,
551
556
  ).output
552
557
  finally:
553
558
  for name in variable_definitions.keys():
@@ -1,4 +1,3 @@
1
- import copy
2
1
  import functools
3
2
  from abc import ABC
4
3
  from dataclasses import dataclass
@@ -58,23 +57,29 @@ class CustomFunction(Function, NamedCustomFunction):
58
57
  # Should be validated in the Script
59
58
  raise UNREACHABLE
60
59
 
61
- resolved_variables_with_args = copy.deepcopy(resolved_variables)
60
+ function_args: List[FunctionArgument] = []
62
61
  for i, arg in enumerate(resolved_args):
63
62
  function_arg = FunctionArgument.from_idx(idx=i, custom_function_name=self.name)
64
63
 
65
- if function_arg in resolved_variables_with_args:
64
+ if function_arg in resolved_variables:
66
65
  # function args should always be unique since they are only defined once
67
66
  # in the custom function as %custom_function_name___idx
68
67
  # and returned as a set from each custom function.
69
68
  raise UNREACHABLE
70
69
 
71
- resolved_variables_with_args[function_arg] = arg
70
+ resolved_variables[function_arg] = arg
71
+ function_args.append(function_arg)
72
72
 
73
- return custom_functions[self.name].resolve(
74
- resolved_variables=resolved_variables_with_args,
73
+ out = custom_functions[self.name].resolve(
74
+ resolved_variables=resolved_variables,
75
75
  custom_functions=custom_functions,
76
76
  )
77
77
 
78
+ for function_arg in function_args:
79
+ del resolved_variables[function_arg]
80
+
81
+ return out
82
+
78
83
  # Implies the custom function does not exist. This should have
79
84
  # been checked in the parser with
80
85
  raise UNREACHABLE
@@ -47,6 +47,32 @@ class SyntaxTree(VariableDependency):
47
47
  -------
48
48
  A resolvable if the AST contains a single type that is resolvable. None otherwise.
49
49
  """
50
- if len(self.ast) == 1 and isinstance(self.ast[0], Resolvable):
51
- return self.ast[0]
52
50
  return None
51
+
52
+ def maybe_resolvable_casted(self) -> "SyntaxTree":
53
+ """
54
+ Returns
55
+ -------
56
+ Optimized SyntaxTree if its deemed resolvable
57
+ """
58
+ if len(self.ast) == 1 and isinstance(self.ast[0], Resolvable):
59
+ return ResolvedSyntaxTree(self.ast)
60
+ return self
61
+
62
+
63
+ @dataclass(frozen=True)
64
+ class ResolvedSyntaxTree(SyntaxTree):
65
+ """
66
+ SyntaxTree with optimized helper functions if it's known to be resolved.
67
+ """
68
+
69
+ def resolve(
70
+ self,
71
+ resolved_variables: Dict[Variable, Resolvable],
72
+ custom_functions: Dict[str, VariableDependency],
73
+ ) -> Resolvable:
74
+ return self.ast[0]
75
+
76
+ @property
77
+ def maybe_resolvable(self) -> Optional[Resolvable]:
78
+ return self.ast[0]
@@ -162,7 +162,7 @@ class VariableDependency(ABC):
162
162
  @final
163
163
  def is_subset_of(
164
164
  self,
165
- variables: Iterable[Variable],
165
+ variables: Dict[Variable, Resolvable],
166
166
  custom_function_definitions: Dict[str, "VariableDependency"],
167
167
  ) -> bool:
168
168
  """
@@ -171,12 +171,12 @@ class VariableDependency(ABC):
171
171
  True if it contains all input variables as a dependency. False otherwise.
172
172
  """
173
173
  for custom_function in self.custom_functions:
174
- if custom_function_definitions[custom_function.name].is_subset_of(
174
+ if not custom_function_definitions[custom_function.name].is_subset_of(
175
175
  variables=variables, custom_function_definitions=custom_function_definitions
176
176
  ):
177
- return True
177
+ return False
178
178
 
179
- return not self.variables.issubset(variables)
179
+ return all(var in variables for var in self.variables)
180
180
 
181
181
  @final
182
182
  def contains(
@@ -246,6 +246,7 @@ def _validate_formatter(
246
246
  )
247
247
  },
248
248
  unresolvable=unresolvable,
249
+ update=True,
249
250
  )
250
251
  except RuntimeException as exc:
251
252
  if isinstance(exc, ScriptVariableNotResolved) and is_static_formatter:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ytdl-sub
3
- Version: 2025.11.18
3
+ Version: 2025.11.28
4
4
  Summary: Automate downloading metadata generation with YoutubeDL
5
5
  Author: Jesse Bannon
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -1 +0,0 @@
1
- __pypi_version__ = "2025.11.18";__local_version__ = "2025.11.18+63753c5"
File without changes
File without changes
File without changes