ytdl-sub 2025.12.31.post1__tar.gz → 2025.12.31.post3__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.12.31.post1 → ytdl_sub-2025.12.31.post3}/PKG-INFO +1 -1
  2. ytdl_sub-2025.12.31.post3/src/ytdl_sub/__init__.py +1 -0
  3. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/script.py +24 -0
  4. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/types/resolvable.py +8 -0
  5. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/types/variable_dependency.py +28 -12
  6. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/string_formatter_validators.py +5 -0
  7. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub.egg-info/PKG-INFO +1 -1
  8. ytdl_sub-2025.12.31.post1/src/ytdl_sub/__init__.py +0 -1
  9. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/LICENSE +0 -0
  10. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/README.md +0 -0
  11. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/pyproject.toml +0 -0
  12. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/setup.cfg +0 -0
  13. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/cli/__init__.py +0 -0
  14. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/cli/entrypoint.py +0 -0
  15. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/cli/output_summary.py +0 -0
  16. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/cli/output_transaction_log.py +0 -0
  17. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/cli/parsers/__init__.py +0 -0
  18. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/cli/parsers/cli_to_sub.py +0 -0
  19. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/cli/parsers/dl.py +0 -0
  20. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/cli/parsers/main.py +0 -0
  21. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/__init__.py +0 -0
  22. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/config_file.py +0 -0
  23. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/config_validator.py +0 -0
  24. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/defaults.py +0 -0
  25. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/overrides.py +0 -0
  26. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/plugin/__init__.py +0 -0
  27. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/plugin/plugin.py +0 -0
  28. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/plugin/plugin_mapping.py +0 -0
  29. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/plugin/plugin_operation.py +0 -0
  30. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/plugin/preset_plugins.py +0 -0
  31. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/preset.py +0 -0
  32. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/preset_options.py +0 -0
  33. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/validators/__init__.py +0 -0
  34. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/validators/options.py +0 -0
  35. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/config/validators/variable_validation.py +0 -0
  36. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/downloaders/__init__.py +0 -0
  37. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/downloaders/info_json/__init__.py +0 -0
  38. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/downloaders/info_json/info_json_downloader.py +0 -0
  39. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/downloaders/source_plugin.py +0 -0
  40. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/downloaders/url/__init__.py +0 -0
  41. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/downloaders/url/downloader.py +0 -0
  42. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/downloaders/url/validators.py +0 -0
  43. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/downloaders/ytdl_options_builder.py +0 -0
  44. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/downloaders/ytdlp.py +0 -0
  45. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/__init__.py +0 -0
  46. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/base_entry.py +0 -0
  47. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/entry.py +0 -0
  48. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/entry_parent.py +0 -0
  49. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/script/__init__.py +0 -0
  50. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/script/custom_functions.py +0 -0
  51. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/script/function_scripts.py +0 -0
  52. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/script/variable_definitions.py +0 -0
  53. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/script/variable_types.py +0 -0
  54. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/variables/__init__.py +0 -0
  55. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/entries/variables/override_variables.py +0 -0
  56. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/main.py +0 -0
  57. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/__init__.py +0 -0
  58. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/audio_extract.py +0 -0
  59. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/chapters.py +0 -0
  60. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/date_range.py +0 -0
  61. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/embed_thumbnail.py +0 -0
  62. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/file_convert.py +0 -0
  63. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/filter_exclude.py +0 -0
  64. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/filter_include.py +0 -0
  65. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/format.py +0 -0
  66. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/internal/__init__.py +0 -0
  67. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/internal/view.py +0 -0
  68. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/match_filters.py +0 -0
  69. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/music_tags.py +0 -0
  70. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/nfo_tags.py +0 -0
  71. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/output_directory_nfo_tags.py +0 -0
  72. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/split_by_chapters.py +0 -0
  73. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/square_thumbnail.py +0 -0
  74. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/static_nfo_tags.py +0 -0
  75. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/subtitles.py +0 -0
  76. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/throttle_protection.py +0 -0
  77. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/plugins/video_tags.py +0 -0
  78. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/__init__.py +0 -0
  79. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/helpers/__init__.py +0 -0
  80. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/helpers/download_deletion_options.yaml +0 -0
  81. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/helpers/filter_duration.yaml +0 -0
  82. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/helpers/filter_keywords.yaml +0 -0
  83. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/helpers/media_quality.yaml +0 -0
  84. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/helpers/players.yaml +0 -0
  85. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/helpers/throttle_protection.yaml +0 -0
  86. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/helpers/url.yaml +0 -0
  87. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/helpers/url_bilateral.yaml +0 -0
  88. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/helpers/url_categorized.yaml +0 -0
  89. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/internal/__init__.py +0 -0
  90. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/internal/view.yaml +0 -0
  91. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/music/__init__.py +0 -0
  92. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/music/albums_from_chapters.yaml +0 -0
  93. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/music/albums_from_playlists.yaml +0 -0
  94. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/music/singles.yaml +0 -0
  95. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/music/soundcloud.yaml +0 -0
  96. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py +0 -0
  97. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/music_videos/music_video_base.yaml +0 -0
  98. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/music_videos/music_video_extras.yaml +0 -0
  99. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml +0 -0
  100. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py +0 -0
  101. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml +0 -0
  102. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml +0 -0
  103. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml +0 -0
  104. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_collection.yaml +0 -0
  105. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/__init__.py +0 -0
  106. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/__init__.py +0 -0
  107. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/array_functions.py +0 -0
  108. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/boolean_functions.py +0 -0
  109. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/conditional_functions.py +0 -0
  110. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/date_functions.py +0 -0
  111. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/error_functions.py +0 -0
  112. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/json_functions.py +0 -0
  113. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/map_functions.py +0 -0
  114. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/numeric_functions.py +0 -0
  115. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/print_functions.py +0 -0
  116. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/regex_functions.py +0 -0
  117. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/functions/string_functions.py +0 -0
  118. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/parser.py +0 -0
  119. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/script_output.py +0 -0
  120. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/types/__init__.py +0 -0
  121. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/types/array.py +0 -0
  122. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/types/function.py +0 -0
  123. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/types/map.py +0 -0
  124. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/types/syntax_tree.py +0 -0
  125. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/types/variable.py +0 -0
  126. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/utils/__init__.py +0 -0
  127. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/utils/exception_formatters.py +0 -0
  128. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/utils/exceptions.py +0 -0
  129. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/utils/name_validation.py +0 -0
  130. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/script/utils/type_checking.py +0 -0
  131. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/subscriptions/__init__.py +0 -0
  132. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/subscriptions/base_subscription.py +0 -0
  133. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/subscriptions/subscription.py +0 -0
  134. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/subscriptions/subscription_download.py +0 -0
  135. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/subscriptions/subscription_validators.py +0 -0
  136. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/subscriptions/subscription_ytdl_options.py +0 -0
  137. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/thread/__init__.py +0 -0
  138. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/thread/log_entries_downloaded_listener.py +0 -0
  139. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/__init__.py +0 -0
  140. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/chapters.py +0 -0
  141. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/datetime.py +0 -0
  142. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/exceptions.py +0 -0
  143. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/ffmpeg.py +0 -0
  144. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/file_handler.py +0 -0
  145. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/file_lock.py +0 -0
  146. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/file_path.py +0 -0
  147. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/logger.py +0 -0
  148. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/retry.py +0 -0
  149. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/script.py +0 -0
  150. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/scriptable.py +0 -0
  151. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/subtitles.py +0 -0
  152. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/system.py +0 -0
  153. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/thumbnail.py +0 -0
  154. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/xml.py +0 -0
  155. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/utils/yaml.py +0 -0
  156. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/__init__.py +0 -0
  157. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/audo_codec_validator.py +0 -0
  158. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/file_path_validators.py +0 -0
  159. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/nfo_validators.py +0 -0
  160. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/regex_validator.py +0 -0
  161. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/source_variable_validator.py +0 -0
  162. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/strict_dict_validator.py +0 -0
  163. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/string_datetime.py +0 -0
  164. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/string_select_validator.py +0 -0
  165. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/validators/validators.py +0 -0
  166. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/ytdl_additions/__init__.py +0 -0
  167. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py +0 -0
  168. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub.egg-info/SOURCES.txt +0 -0
  169. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub.egg-info/dependency_links.txt +0 -0
  170. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub.egg-info/entry_points.txt +0 -0
  171. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/src/ytdl_sub.egg-info/requires.txt +0 -0
  172. {ytdl_sub-2025.12.31.post1 → ytdl_sub-2025.12.31.post3}/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.12.31.post1
3
+ Version: 2025.12.31.post3
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.12.31.post3";__local_version__ = "2025.12.31+869fc0b"
@@ -66,6 +66,22 @@ class Script:
66
66
  deps=deps + [dep.name],
67
67
  )
68
68
 
69
+ for custom_func in variable_dependency.custom_function_dependencies(
70
+ custom_function_definitions=self._functions
71
+ ):
72
+ for dep in self._functions[custom_func.name].variables:
73
+ self._ensure_no_cycle(
74
+ name=variable_name,
75
+ dep=dep.name,
76
+ deps=deps + [custom_func.definition_name()],
77
+ definitions=self._variables,
78
+ )
79
+ self._traverse_variable_dependencies(
80
+ variable_name=variable_name,
81
+ variable_dependency=self._variables[dep.name],
82
+ deps=deps + [custom_func.definition_name(), dep.name],
83
+ )
84
+
69
85
  def _ensure_no_variable_cycles(self, variables: Dict[str, SyntaxTree]):
70
86
  for variable_name, variable_definition in variables.items():
71
87
  self._traverse_variable_dependencies(
@@ -288,6 +304,14 @@ class Script:
288
304
  unresolvable=unresolvable,
289
305
  )
290
306
 
307
+ for lambda_func in current_var.lambdas:
308
+ if lambda_func.value in self._functions:
309
+ subset_to_resolve |= self._recursive_get_unresolved_output_filter_variables(
310
+ current_var=self._functions[lambda_func.value],
311
+ subset_to_resolve=subset_to_resolve,
312
+ unresolvable=unresolvable,
313
+ )
314
+
291
315
  return subset_to_resolve
292
316
 
293
317
  def _get_unresolved_output_filter(
@@ -193,6 +193,14 @@ class NamedCustomFunction(NamedArgument, ABC):
193
193
  class ParsedCustomFunction(NamedCustomFunction):
194
194
  num_input_args: int
195
195
 
196
+ def definition_name(self) -> str:
197
+ """
198
+ Returns
199
+ -------
200
+ The function definition name, including the %
201
+ """
202
+ return f"%{self.name}"
203
+
196
204
 
197
205
  @dataclass(frozen=True)
198
206
  class FunctionType(NamedArgument, ABC):
@@ -114,7 +114,6 @@ class VariableDependency(ABC):
114
114
  output.add(ParsedCustomFunction(name=arg.name, num_input_args=len(arg.args)))
115
115
  if isinstance(arg, VariableDependency):
116
116
  output.update(arg.custom_functions)
117
- # if isinstance(arg, Lambda)
118
117
 
119
118
  return output
120
119
 
@@ -160,6 +159,31 @@ class VariableDependency(ABC):
160
159
 
161
160
  raise UNREACHABLE
162
161
 
162
+ @final
163
+ def custom_function_dependencies(
164
+ self, custom_function_definitions: Dict[str, "VariableDependency"]
165
+ ) -> Set[ParsedCustomFunction]:
166
+ """
167
+ Parameters
168
+ ----------
169
+ custom_function_definitions
170
+ Definition of all currently existing custom functions. Needed to check whether
171
+ a lambda function's input function is custom or not.
172
+
173
+ Returns
174
+ -------
175
+ All custom function dependencies
176
+ """
177
+ custom_functions = self.custom_functions
178
+ for lambda_func in self.lambdas:
179
+ if lambda_func.value in custom_function_definitions:
180
+ custom_functions.add(
181
+ ParsedCustomFunction(
182
+ name=lambda_func.value, num_input_args=lambda_func.num_input_args()
183
+ )
184
+ )
185
+ return custom_functions
186
+
163
187
  @final
164
188
  def is_subset_of(
165
189
  self,
@@ -171,7 +195,8 @@ class VariableDependency(ABC):
171
195
  -------
172
196
  True if it contains all input variables as a dependency. False otherwise.
173
197
  """
174
- for custom_function in self.custom_functions:
198
+ # If there are lambdas, see if they are custom functions. If so, check them
199
+ for custom_function in self.custom_function_dependencies(custom_function_definitions):
175
200
  if not custom_function_definitions[custom_function.name].is_subset_of(
176
201
  variables=variables, custom_function_definitions=custom_function_definitions
177
202
  ):
@@ -191,16 +216,7 @@ class VariableDependency(ABC):
191
216
  True if it contains any of the input variables. False otherwise.
192
217
  """
193
218
  # If there are lambdas, see if they are custom functions. If so, check them
194
- custom_functions_to_check = self.custom_functions
195
- for lambda_func in self.lambdas:
196
- if lambda_func.value in custom_function_definitions:
197
- custom_functions_to_check.add(
198
- ParsedCustomFunction(
199
- name=lambda_func.value, num_input_args=lambda_func.num_input_args()
200
- )
201
- )
202
-
203
- for custom_function in custom_functions_to_check:
219
+ for custom_function in self.custom_function_dependencies(custom_function_definitions):
204
220
  if custom_function_definitions[custom_function.name].contains(
205
221
  variables=variables, custom_function_definitions=custom_function_definitions
206
222
  ):
@@ -241,6 +241,11 @@ def _validate_formatter(
241
241
  variable_names = {var.name for var in parsed.variables}
242
242
  custom_function_names = {f"%{func.name}" for func in parsed.custom_functions}
243
243
 
244
+ # Add lambda functions to custom function names, if it's custom
245
+ for lambda_func in parsed.lambdas:
246
+ if lambda_func in mock_script.function_names:
247
+ custom_function_names.add(lambda_func.value)
248
+
244
249
  if not variable_names.issubset(mock_script.variable_names):
245
250
  raise StringFormattingVariableNotFoundException(
246
251
  "contains the following variables that do not exist: "
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ytdl-sub
3
- Version: 2025.12.31.post1
3
+ Version: 2025.12.31.post3
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.12.31.post1";__local_version__ = "2025.12.31+d373935"