ytdl-sub 2025.12.31.post2__tar.gz → 2025.12.31.post4__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.post2 → ytdl_sub-2025.12.31.post4}/PKG-INFO +1 -1
  2. ytdl_sub-2025.12.31.post4/src/ytdl_sub/__init__.py +1 -0
  3. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/numeric_functions.py +17 -0
  4. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/script.py +16 -0
  5. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/types/resolvable.py +8 -0
  6. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/types/variable_dependency.py +14 -3
  7. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub.egg-info/PKG-INFO +1 -1
  8. ytdl_sub-2025.12.31.post2/src/ytdl_sub/__init__.py +0 -1
  9. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/LICENSE +0 -0
  10. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/README.md +0 -0
  11. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/pyproject.toml +0 -0
  12. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/setup.cfg +0 -0
  13. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/cli/__init__.py +0 -0
  14. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/cli/entrypoint.py +0 -0
  15. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/cli/output_summary.py +0 -0
  16. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/cli/output_transaction_log.py +0 -0
  17. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/cli/parsers/__init__.py +0 -0
  18. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/cli/parsers/cli_to_sub.py +0 -0
  19. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/cli/parsers/dl.py +0 -0
  20. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/cli/parsers/main.py +0 -0
  21. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/__init__.py +0 -0
  22. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/config_file.py +0 -0
  23. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/config_validator.py +0 -0
  24. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/defaults.py +0 -0
  25. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/overrides.py +0 -0
  26. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/plugin/__init__.py +0 -0
  27. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/plugin/plugin.py +0 -0
  28. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/plugin/plugin_mapping.py +0 -0
  29. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/plugin/plugin_operation.py +0 -0
  30. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/plugin/preset_plugins.py +0 -0
  31. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/preset.py +0 -0
  32. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/preset_options.py +0 -0
  33. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/validators/__init__.py +0 -0
  34. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/validators/options.py +0 -0
  35. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/config/validators/variable_validation.py +0 -0
  36. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/downloaders/__init__.py +0 -0
  37. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/downloaders/info_json/__init__.py +0 -0
  38. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/downloaders/info_json/info_json_downloader.py +0 -0
  39. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/downloaders/source_plugin.py +0 -0
  40. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/downloaders/url/__init__.py +0 -0
  41. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/downloaders/url/downloader.py +0 -0
  42. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/downloaders/url/validators.py +0 -0
  43. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/downloaders/ytdl_options_builder.py +0 -0
  44. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/downloaders/ytdlp.py +0 -0
  45. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/__init__.py +0 -0
  46. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/base_entry.py +0 -0
  47. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/entry.py +0 -0
  48. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/entry_parent.py +0 -0
  49. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/script/__init__.py +0 -0
  50. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/script/custom_functions.py +0 -0
  51. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/script/function_scripts.py +0 -0
  52. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/script/variable_definitions.py +0 -0
  53. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/script/variable_types.py +0 -0
  54. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/variables/__init__.py +0 -0
  55. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/entries/variables/override_variables.py +0 -0
  56. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/main.py +0 -0
  57. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/__init__.py +0 -0
  58. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/audio_extract.py +0 -0
  59. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/chapters.py +0 -0
  60. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/date_range.py +0 -0
  61. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/embed_thumbnail.py +0 -0
  62. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/file_convert.py +0 -0
  63. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/filter_exclude.py +0 -0
  64. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/filter_include.py +0 -0
  65. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/format.py +0 -0
  66. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/internal/__init__.py +0 -0
  67. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/internal/view.py +0 -0
  68. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/match_filters.py +0 -0
  69. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/music_tags.py +0 -0
  70. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/nfo_tags.py +0 -0
  71. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/output_directory_nfo_tags.py +0 -0
  72. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/split_by_chapters.py +0 -0
  73. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/square_thumbnail.py +0 -0
  74. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/static_nfo_tags.py +0 -0
  75. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/subtitles.py +0 -0
  76. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/throttle_protection.py +0 -0
  77. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/plugins/video_tags.py +0 -0
  78. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/__init__.py +0 -0
  79. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/helpers/__init__.py +0 -0
  80. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/helpers/download_deletion_options.yaml +0 -0
  81. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/helpers/filter_duration.yaml +0 -0
  82. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/helpers/filter_keywords.yaml +0 -0
  83. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/helpers/media_quality.yaml +0 -0
  84. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/helpers/players.yaml +0 -0
  85. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/helpers/throttle_protection.yaml +0 -0
  86. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/helpers/url.yaml +0 -0
  87. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/helpers/url_bilateral.yaml +0 -0
  88. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/helpers/url_categorized.yaml +0 -0
  89. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/internal/__init__.py +0 -0
  90. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/internal/view.yaml +0 -0
  91. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/music/__init__.py +0 -0
  92. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/music/albums_from_chapters.yaml +0 -0
  93. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/music/albums_from_playlists.yaml +0 -0
  94. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/music/singles.yaml +0 -0
  95. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/music/soundcloud.yaml +0 -0
  96. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py +0 -0
  97. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/music_videos/music_video_base.yaml +0 -0
  98. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/music_videos/music_video_extras.yaml +0 -0
  99. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml +0 -0
  100. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py +0 -0
  101. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml +0 -0
  102. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml +0 -0
  103. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml +0 -0
  104. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_collection.yaml +0 -0
  105. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/__init__.py +0 -0
  106. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/__init__.py +0 -0
  107. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/array_functions.py +0 -0
  108. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/boolean_functions.py +0 -0
  109. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/conditional_functions.py +0 -0
  110. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/date_functions.py +0 -0
  111. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/error_functions.py +0 -0
  112. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/json_functions.py +0 -0
  113. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/map_functions.py +0 -0
  114. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/print_functions.py +0 -0
  115. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/regex_functions.py +0 -0
  116. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/functions/string_functions.py +0 -0
  117. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/parser.py +0 -0
  118. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/script_output.py +0 -0
  119. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/types/__init__.py +0 -0
  120. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/types/array.py +0 -0
  121. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/types/function.py +0 -0
  122. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/types/map.py +0 -0
  123. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/types/syntax_tree.py +0 -0
  124. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/types/variable.py +0 -0
  125. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/utils/__init__.py +0 -0
  126. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/utils/exception_formatters.py +0 -0
  127. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/utils/exceptions.py +0 -0
  128. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/utils/name_validation.py +0 -0
  129. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/script/utils/type_checking.py +0 -0
  130. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/subscriptions/__init__.py +0 -0
  131. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/subscriptions/base_subscription.py +0 -0
  132. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/subscriptions/subscription.py +0 -0
  133. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/subscriptions/subscription_download.py +0 -0
  134. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/subscriptions/subscription_validators.py +0 -0
  135. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/subscriptions/subscription_ytdl_options.py +0 -0
  136. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/thread/__init__.py +0 -0
  137. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/thread/log_entries_downloaded_listener.py +0 -0
  138. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/__init__.py +0 -0
  139. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/chapters.py +0 -0
  140. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/datetime.py +0 -0
  141. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/exceptions.py +0 -0
  142. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/ffmpeg.py +0 -0
  143. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/file_handler.py +0 -0
  144. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/file_lock.py +0 -0
  145. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/file_path.py +0 -0
  146. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/logger.py +0 -0
  147. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/retry.py +0 -0
  148. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/script.py +0 -0
  149. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/scriptable.py +0 -0
  150. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/subtitles.py +0 -0
  151. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/system.py +0 -0
  152. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/thumbnail.py +0 -0
  153. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/xml.py +0 -0
  154. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/utils/yaml.py +0 -0
  155. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/__init__.py +0 -0
  156. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/audo_codec_validator.py +0 -0
  157. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/file_path_validators.py +0 -0
  158. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/nfo_validators.py +0 -0
  159. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/regex_validator.py +0 -0
  160. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/source_variable_validator.py +0 -0
  161. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/strict_dict_validator.py +0 -0
  162. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/string_datetime.py +0 -0
  163. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/string_formatter_validators.py +0 -0
  164. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/string_select_validator.py +0 -0
  165. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/validators/validators.py +0 -0
  166. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/ytdl_additions/__init__.py +0 -0
  167. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py +0 -0
  168. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub.egg-info/SOURCES.txt +0 -0
  169. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub.egg-info/dependency_links.txt +0 -0
  170. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub.egg-info/entry_points.txt +0 -0
  171. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/src/ytdl_sub.egg-info/requires.txt +0 -0
  172. {ytdl_sub-2025.12.31.post2 → ytdl_sub-2025.12.31.post4}/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.post2
3
+ Version: 2025.12.31.post4
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.post4";__local_version__ = "2025.12.31+c46de04"
@@ -1,5 +1,7 @@
1
1
  import math
2
+ from typing import Optional
2
3
 
4
+ from ytdl_sub.script.types.array import Array
3
5
  from ytdl_sub.script.types.resolvable import AnyArgument
4
6
  from ytdl_sub.script.types.resolvable import Float
5
7
  from ytdl_sub.script.types.resolvable import Integer
@@ -96,3 +98,18 @@ class NumericFunctions:
96
98
  Returns min of all values.
97
99
  """
98
100
  return _to_numeric(min(val.value for val in values))
101
+
102
+ @staticmethod
103
+ def range(
104
+ end: Integer, start: Optional[Integer] = None, step: Optional[Integer] = None
105
+ ) -> Array:
106
+ """
107
+ :description:
108
+ Returns the desired range of Integers in the form of an Array.
109
+ """
110
+ if start is None:
111
+ start = Integer(0)
112
+ if step is None:
113
+ step = Integer(1)
114
+
115
+ return Array(value=[Integer(idx) for idx in range(start.value, end.value, step.value)])
@@ -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(
@@ -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):
@@ -160,9 +160,20 @@ class VariableDependency(ABC):
160
160
  raise UNREACHABLE
161
161
 
162
162
  @final
163
- def _custom_function_dependencies(
163
+ def custom_function_dependencies(
164
164
  self, custom_function_definitions: Dict[str, "VariableDependency"]
165
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
+ """
166
177
  custom_functions = self.custom_functions
167
178
  for lambda_func in self.lambdas:
168
179
  if lambda_func.value in custom_function_definitions:
@@ -185,7 +196,7 @@ class VariableDependency(ABC):
185
196
  True if it contains all input variables as a dependency. False otherwise.
186
197
  """
187
198
  # If there are lambdas, see if they are custom functions. If so, check them
188
- for custom_function in self._custom_function_dependencies(custom_function_definitions):
199
+ for custom_function in self.custom_function_dependencies(custom_function_definitions):
189
200
  if not custom_function_definitions[custom_function.name].is_subset_of(
190
201
  variables=variables, custom_function_definitions=custom_function_definitions
191
202
  ):
@@ -205,7 +216,7 @@ class VariableDependency(ABC):
205
216
  True if it contains any of the input variables. False otherwise.
206
217
  """
207
218
  # If there are lambdas, see if they are custom functions. If so, check them
208
- for custom_function in self._custom_function_dependencies(custom_function_definitions):
219
+ for custom_function in self.custom_function_dependencies(custom_function_definitions):
209
220
  if custom_function_definitions[custom_function.name].contains(
210
221
  variables=variables, custom_function_definitions=custom_function_definitions
211
222
  ):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ytdl-sub
3
- Version: 2025.12.31.post2
3
+ Version: 2025.12.31.post4
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.post2";__local_version__ = "2025.12.31+7ac525f"