upload-assistant 4.1__tar.gz → 4.2__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 (594) hide show
  1. {upload_assistant-4.1/upload_assistant.egg-info → upload_assistant-4.2}/PKG-INFO +6 -1
  2. {upload_assistant-4.1 → upload_assistant-4.2}/README.md +5 -0
  3. upload_assistant-4.2/bin/binary_dependencies.py +7 -0
  4. upload_assistant-4.2/bin/binary_dependency_pins/__init__.py +33 -0
  5. upload_assistant-4.2/bin/binary_dependency_pins/bdinfo.py +12 -0
  6. upload_assistant-4.2/bin/binary_dependency_pins/dovi_tool.py +11 -0
  7. upload_assistant-4.2/bin/binary_dependency_pins/ffmpeg.py +7 -0
  8. upload_assistant-4.2/bin/binary_dependency_pins/hdr10plus_tool.py +11 -0
  9. upload_assistant-4.2/bin/binary_dependency_pins/mkbrr.py +13 -0
  10. upload_assistant-4.2/bin/binary_dependency_pins/nyuu.py +10 -0
  11. upload_assistant-4.2/bin/binary_dependency_pins/par2.py +12 -0
  12. upload_assistant-4.2/bin/binary_dependency_pins/pesto.py +8 -0
  13. upload_assistant-4.2/bin/binary_dependency_pins/seven_zip.py +11 -0
  14. upload_assistant-4.2/bin/download_integrity.py +43 -0
  15. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_7z.py +13 -11
  16. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_bdinfo.py +2 -1
  17. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_bdinfo_docker.py +2 -1
  18. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_dynamic_hdr_tools.py +5 -21
  19. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_ffmpeg.py +3 -2
  20. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_mkbrr.py +3 -2
  21. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_nyuu.py +13 -12
  22. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_par2.py +3 -2
  23. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_pesto.py +2 -1
  24. {upload_assistant-4.1 → upload_assistant-4.2}/data/example_config.py +31 -3
  25. {upload_assistant-4.1 → upload_assistant-4.2}/pyproject.toml +1 -1
  26. upload_assistant-4.2/src/api_key_expiry.py +180 -0
  27. {upload_assistant-4.1 → upload_assistant-4.2}/src/args.py +22 -7
  28. {upload_assistant-4.1 → upload_assistant-4.2}/src/bbcode.py +34 -0
  29. {upload_assistant-4.1 → upload_assistant-4.2}/src/book_prep.py +12 -3
  30. {upload_assistant-4.1 → upload_assistant-4.2}/src/clients.py +98 -27
  31. {upload_assistant-4.1 → upload_assistant-4.2}/src/configvalidator.py +21 -1
  32. {upload_assistant-4.1 → upload_assistant-4.2}/src/discparse.py +2 -1
  33. {upload_assistant-4.1 → upload_assistant-4.2}/src/dynamic_hdr_plot.py +1 -1
  34. {upload_assistant-4.1 → upload_assistant-4.2}/src/early_tasks.py +23 -19
  35. {upload_assistant-4.1 → upload_assistant-4.2}/src/external_tools.py +10 -5
  36. {upload_assistant-4.1 → upload_assistant-4.2}/src/get_desc.py +43 -24
  37. {upload_assistant-4.1 → upload_assistant-4.2}/src/get_disc.py +1 -1
  38. {upload_assistant-4.1 → upload_assistant-4.2}/src/getseasonep.py +83 -74
  39. {upload_assistant-4.1 → upload_assistant-4.2}/src/manualpackage.py +4 -3
  40. {upload_assistant-4.1 → upload_assistant-4.2}/src/meta.py +1 -0
  41. {upload_assistant-4.1 → upload_assistant-4.2}/src/music/prep.py +1 -1
  42. {upload_assistant-4.1 → upload_assistant-4.2}/src/prep_helpers.py +7 -4
  43. {upload_assistant-4.1 → upload_assistant-4.2}/src/prompt_sound.py +3 -6
  44. {upload_assistant-4.1 → upload_assistant-4.2}/src/qbitwait.py +9 -2
  45. {upload_assistant-4.1 → upload_assistant-4.2}/src/region.py +255 -20
  46. {upload_assistant-4.1 → upload_assistant-4.2}/src/rehostimages.py +1 -1
  47. upload_assistant-4.2/src/screenshot_overlays.py +120 -0
  48. {upload_assistant-4.1 → upload_assistant-4.2}/src/tags.py +2 -5
  49. {upload_assistant-4.1 → upload_assistant-4.2}/src/takescreens.py +13 -128
  50. {upload_assistant-4.1 → upload_assistant-4.2}/src/torrent_clients/qbittorrent.py +26 -10
  51. {upload_assistant-4.1 → upload_assistant-4.2}/src/torrent_clients/rtorrent.py +1 -8
  52. upload_assistant-4.2/src/torrent_manifest.py +215 -0
  53. upload_assistant-4.2/src/torrent_policy.py +113 -0
  54. upload_assistant-4.2/src/torrent_provision.py +103 -0
  55. {upload_assistant-4.1 → upload_assistant-4.2}/src/torrentcreate.py +57 -62
  56. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackerhandle.py +9 -2
  57. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/AVISTAZ/__init__.py +2 -1
  58. {upload_assistant-4.1/src/trackers → upload_assistant-4.2/src/trackers/GAZELLE}/alpharatio.py +3 -2
  59. {upload_assistant-4.1/src/trackers → upload_assistant-4.2/src/trackers/GAZELLE}/anthelion.py +38 -48
  60. {upload_assistant-4.1/src/trackers → upload_assistant-4.2/src/trackers/GAZELLE}/brasiltracker.py +1 -1
  61. {upload_assistant-4.1/src/trackers → upload_assistant-4.2/src/trackers/GAZELLE}/greatposterwall.py +22 -10
  62. {upload_assistant-4.1/src/trackers → upload_assistant-4.2/src/trackers/GAZELLE}/nebulance.py +1 -1
  63. {upload_assistant-4.1/src/trackers → upload_assistant-4.2/src/trackers/GAZELLE}/orpheus.py +3 -1
  64. {upload_assistant-4.1/src/trackers → upload_assistant-4.2/src/trackers/GAZELLE}/passthepopcorn.py +28 -29
  65. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/lajidui.py +1 -1
  66. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/lemonhd.py +1 -1
  67. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/longpt.py +6 -7
  68. {upload_assistant-4.1/src/trackers → upload_assistant-4.2/src/trackers/NEXUSPHP}/pterclub.py +71 -18
  69. {upload_assistant-4.1/src/trackers → upload_assistant-4.2/src/trackers/NEXUSPHP}/ptskit.py +18 -27
  70. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/ptzone.py +2 -2
  71. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/xingyungept.py +1 -1
  72. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/__init__.py +14 -3
  73. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/aither.py +2 -1
  74. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/darkpeers.py +3 -2
  75. upload_assistant-4.2/src/trackers/UNIT3D/dreadvault.py +181 -0
  76. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/hawkeuno.py +26 -7
  77. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/infinityhd.py +130 -1
  78. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/lst.py +2 -1
  79. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/oldtoonsworld.py +2 -1
  80. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/onlyencodes.py +7 -2
  81. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/rockethd.py +2 -4
  82. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/ulcx.py +5 -3
  83. upload_assistant-4.2/src/trackers/USENET/nzbnest.py +169 -0
  84. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/broadcasthenet.py +15 -0
  85. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/common.py +22 -5
  86. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/digitalcore.py +8 -2
  87. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/hdbits.py +7 -23
  88. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/hdspace.py +2 -1
  89. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/hdtorrents.py +2 -1
  90. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/iptorrents.py +7 -6
  91. upload_assistant-4.2/src/trackers/naming.py +49 -0
  92. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/speedapp.py +4 -2
  93. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/torrentleech.py +2 -1
  94. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackersetup.py +44 -10
  95. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackerstatus.py +21 -18
  96. {upload_assistant-4.1 → upload_assistant-4.2}/src/tvdb.py +41 -4
  97. {upload_assistant-4.1 → upload_assistant-4.2}/src/usenetcreate.py +17 -6
  98. upload_assistant-4.2/src/version.py +5 -0
  99. {upload_assistant-4.1 → upload_assistant-4.2}/src/vs.py +27 -11
  100. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_anthelion.py +46 -2
  101. upload_assistant-4.2/tests/test_api_key_expiry.py +253 -0
  102. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_audiobook_series_titles.py +11 -0
  103. upload_assistant-4.2/tests/test_bbcode.py +154 -0
  104. upload_assistant-4.2/tests/test_binary_dependency_updater.py +245 -0
  105. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_bjshare.py +1 -1
  106. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_bjshare_book_titles.py +1 -1
  107. upload_assistant-4.2/tests/test_brasiltracker.py +15 -0
  108. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_broadcasthenet.py +17 -0
  109. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_clients_tracker_comments.py +1 -1
  110. upload_assistant-4.2/tests/test_config_generator_autofill.py +46 -0
  111. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_darkpeers.py +0 -6
  112. upload_assistant-4.2/tests/test_digitalcore.py +25 -0
  113. upload_assistant-4.2/tests/test_dreadvault.py +562 -0
  114. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_dynamic_hdr_plot.py +6 -3
  115. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_early_tasks.py +72 -0
  116. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_example_config_structure.py +16 -0
  117. upload_assistant-4.2/tests/test_execution_preview.py +215 -0
  118. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_external_tools.py +16 -0
  119. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_game_description.py +28 -1
  120. upload_assistant-4.2/tests/test_greatposterwall_image_host.py +160 -0
  121. upload_assistant-4.2/tests/test_hawkeuno.py +105 -0
  122. upload_assistant-4.2/tests/test_hdbits_pieces.py +202 -0
  123. upload_assistant-4.2/tests/test_hdbits_result_links.py +72 -0
  124. upload_assistant-4.2/tests/test_incomplete_tracker_names.py +118 -0
  125. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_manual_category.py +15 -2
  126. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_music_architecture.py +37 -2
  127. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_nfo_service.py +2 -1
  128. upload_assistant-4.2/tests/test_nzbnest.py +148 -0
  129. upload_assistant-4.2/tests/test_onlyencodes.py +100 -0
  130. upload_assistant-4.2/tests/test_passthepopcorn.py +33 -0
  131. upload_assistant-4.2/tests/test_pterclub.py +103 -0
  132. upload_assistant-4.2/tests/test_qbittorrent_scheme.py +49 -0
  133. upload_assistant-4.2/tests/test_region_service.py +98 -0
  134. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_rehostimages.py +38 -0
  135. upload_assistant-4.2/tests/test_screenshot_overlays.py +304 -0
  136. upload_assistant-4.2/tests/test_season_pack_completeness.py +261 -0
  137. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_tags.py +9 -0
  138. upload_assistant-4.2/tests/test_torrent_manifest.py +205 -0
  139. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_torrent_reuse.py +105 -4
  140. upload_assistant-4.2/tests/test_trackerstatus_douban.py +60 -0
  141. upload_assistant-4.2/tests/test_tvdb_season_episodes.py +111 -0
  142. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_ulcx_rules.py +7 -1
  143. upload_assistant-4.2/tests/test_usenet_pesto.py +70 -0
  144. upload_assistant-4.2/tests/test_webui_screenshot_overlays.py +86 -0
  145. upload_assistant-4.2/tests/test_webui_subprocess_ui.py +127 -0
  146. upload_assistant-4.2/tests/test_webui_tracker_default_overrides.py +98 -0
  147. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_webui_trackers.py +13 -0
  148. {upload_assistant-4.1 → upload_assistant-4.2}/upload.py +19 -13
  149. {upload_assistant-4.1 → upload_assistant-4.2/upload_assistant.egg-info}/PKG-INFO +6 -1
  150. {upload_assistant-4.1 → upload_assistant-4.2}/upload_assistant.egg-info/SOURCES.txt +52 -10
  151. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/server.py +393 -12
  152. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/css/theme.css +273 -0
  153. upload_assistant-4.2/web_ui/static/img/providers/audible.svg +1 -0
  154. upload_assistant-4.2/web_ui/static/img/trackers/curupira.png +0 -0
  155. upload_assistant-4.2/web_ui/static/img/trackers/nzbnest.png +0 -0
  156. upload_assistant-4.2/web_ui/static/img/webui-icons/pepper.svg +4 -0
  157. upload_assistant-4.2/web_ui/static/js/api_key_status.js +267 -0
  158. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/js/app.js +204 -329
  159. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/js/config_app.js +978 -328
  160. upload_assistant-4.2/web_ui/static/js/config_release_group_inheritance.js +76 -0
  161. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/js/package-lock.json +31 -25
  162. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/templates/config.html +2 -0
  163. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/templates/index.html +1 -0
  164. upload_assistant-4.1/bin/download_integrity.py +0 -58
  165. upload_assistant-4.1/src/trackers/UNIT3D/dreadvault.py +0 -86
  166. upload_assistant-4.1/src/version.py +0 -5
  167. upload_assistant-4.1/tests/test_bbcode.py +0 -25
  168. upload_assistant-4.1/tests/test_digitalcore.py +0 -8
  169. upload_assistant-4.1/tests/test_dreadvault.py +0 -108
  170. upload_assistant-4.1/tests/test_execution_preview.py +0 -89
  171. upload_assistant-4.1/tests/test_greatposterwall_image_host.py +0 -76
  172. upload_assistant-4.1/tests/test_hawkeuno.py +0 -37
  173. upload_assistant-4.1/tests/test_passthepopcorn.py +0 -9
  174. upload_assistant-4.1/tests/test_region_service.py +0 -43
  175. upload_assistant-4.1/tests/test_webui_subprocess_ui.py +0 -51
  176. upload_assistant-4.1/web_ui/static/img/trackers/curupira.png +0 -0
  177. {upload_assistant-4.1 → upload_assistant-4.2}/LICENSE +0 -0
  178. {upload_assistant-4.1 → upload_assistant-4.2}/bin/__init__.py +0 -0
  179. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_dvd_mediainfo.py +0 -0
  180. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_ffmpeg_docker.py +0 -0
  181. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_mediainfo.py +0 -0
  182. {upload_assistant-4.1 → upload_assistant-4.2}/bin/get_playlist.py +0 -0
  183. {upload_assistant-4.1 → upload_assistant-4.2}/config-generator.py +0 -0
  184. {upload_assistant-4.1 → upload_assistant-4.2}/data/__init__.py +0 -0
  185. {upload_assistant-4.1 → upload_assistant-4.2}/data/tags.json +0 -0
  186. {upload_assistant-4.1 → upload_assistant-4.2}/data/templates/summary-mediainfo.csv +0 -0
  187. {upload_assistant-4.1 → upload_assistant-4.2}/data/templates/user-args-template.json +0 -0
  188. {upload_assistant-4.1 → upload_assistant-4.2}/setup.cfg +0 -0
  189. {upload_assistant-4.1 → upload_assistant-4.2}/setup.py +0 -0
  190. {upload_assistant-4.1 → upload_assistant-4.2}/src/__init__.py +0 -0
  191. {upload_assistant-4.1 → upload_assistant-4.2}/src/add_comparison.py +0 -0
  192. {upload_assistant-4.1 → upload_assistant-4.2}/src/app_paths.py +0 -0
  193. {upload_assistant-4.1 → upload_assistant-4.2}/src/apply_overrides.py +0 -0
  194. {upload_assistant-4.1 → upload_assistant-4.2}/src/artwork.py +0 -0
  195. {upload_assistant-4.1 → upload_assistant-4.2}/src/audible.py +0 -0
  196. {upload_assistant-4.1 → upload_assistant-4.2}/src/audio.py +0 -0
  197. {upload_assistant-4.1 → upload_assistant-4.2}/src/audio_classifier.py +0 -0
  198. {upload_assistant-4.1 → upload_assistant-4.2}/src/audio_spectrogram.py +0 -0
  199. {upload_assistant-4.1 → upload_assistant-4.2}/src/bdinfo_comparator.py +0 -0
  200. {upload_assistant-4.1 → upload_assistant-4.2}/src/binaries.py +0 -0
  201. {upload_assistant-4.1 → upload_assistant-4.2}/src/bluray_com.py +0 -0
  202. {upload_assistant-4.1 → upload_assistant-4.2}/src/book_extractors.py +0 -0
  203. {upload_assistant-4.1 → upload_assistant-4.2}/src/btnid.py +0 -0
  204. {upload_assistant-4.1 → upload_assistant-4.2}/src/check_requirements.py +0 -0
  205. {upload_assistant-4.1 → upload_assistant-4.2}/src/cleanup.py +0 -0
  206. {upload_assistant-4.1 → upload_assistant-4.2}/src/cogs/__init__.py +0 -0
  207. {upload_assistant-4.1 → upload_assistant-4.2}/src/cogs/redaction.py +0 -0
  208. {upload_assistant-4.1 → upload_assistant-4.2}/src/config_helpers.py +0 -0
  209. {upload_assistant-4.1 → upload_assistant-4.2}/src/console.py +0 -0
  210. {upload_assistant-4.1 → upload_assistant-4.2}/src/cookie_auth.py +0 -0
  211. {upload_assistant-4.1 → upload_assistant-4.2}/src/description_languages.py +0 -0
  212. {upload_assistant-4.1 → upload_assistant-4.2}/src/description_review.py +0 -0
  213. {upload_assistant-4.1 → upload_assistant-4.2}/src/disc_menus.py +0 -0
  214. {upload_assistant-4.1 → upload_assistant-4.2}/src/dupe_checking.py +0 -0
  215. {upload_assistant-4.1 → upload_assistant-4.2}/src/edition.py +0 -0
  216. {upload_assistant-4.1 → upload_assistant-4.2}/src/exceptions.py +0 -0
  217. {upload_assistant-4.1 → upload_assistant-4.2}/src/exportmi.py +0 -0
  218. {upload_assistant-4.1 → upload_assistant-4.2}/src/gazellegames.py +0 -0
  219. {upload_assistant-4.1 → upload_assistant-4.2}/src/genre_map.py +0 -0
  220. {upload_assistant-4.1 → upload_assistant-4.2}/src/get_name.py +0 -0
  221. {upload_assistant-4.1 → upload_assistant-4.2}/src/get_source.py +0 -0
  222. {upload_assistant-4.1 → upload_assistant-4.2}/src/get_tracker_data.py +0 -0
  223. {upload_assistant-4.1 → upload_assistant-4.2}/src/google_books.py +0 -0
  224. {upload_assistant-4.1 → upload_assistant-4.2}/src/igdb.py +0 -0
  225. {upload_assistant-4.1 → upload_assistant-4.2}/src/imdb.py +0 -0
  226. {upload_assistant-4.1 → upload_assistant-4.2}/src/is_scene.py +0 -0
  227. {upload_assistant-4.1 → upload_assistant-4.2}/src/languages.py +0 -0
  228. {upload_assistant-4.1 → upload_assistant-4.2}/src/media_extensions.py +0 -0
  229. {upload_assistant-4.1 → upload_assistant-4.2}/src/mediainfo.py +0 -0
  230. {upload_assistant-4.1 → upload_assistant-4.2}/src/metadata_cache.py +0 -0
  231. {upload_assistant-4.1 → upload_assistant-4.2}/src/metadata_searching.py +0 -0
  232. {upload_assistant-4.1 → upload_assistant-4.2}/src/music/__init__.py +0 -0
  233. {upload_assistant-4.1 → upload_assistant-4.2}/src/music/analyzer.py +0 -0
  234. {upload_assistant-4.1 → upload_assistant-4.2}/src/music/models.py +0 -0
  235. {upload_assistant-4.1 → upload_assistant-4.2}/src/music/sources.py +0 -0
  236. {upload_assistant-4.1 → upload_assistant-4.2}/src/music/validation.py +0 -0
  237. {upload_assistant-4.1 → upload_assistant-4.2}/src/myanonamouse.py +0 -0
  238. {upload_assistant-4.1 → upload_assistant-4.2}/src/nfo.py +0 -0
  239. {upload_assistant-4.1 → upload_assistant-4.2}/src/openlibrary.py +0 -0
  240. {upload_assistant-4.1 → upload_assistant-4.2}/src/post_upload_hooks.py +0 -0
  241. {upload_assistant-4.1 → upload_assistant-4.2}/src/prep.py +0 -0
  242. {upload_assistant-4.1 → upload_assistant-4.2}/src/prep_game.py +0 -0
  243. {upload_assistant-4.1 → upload_assistant-4.2}/src/prowlarr.py +0 -0
  244. {upload_assistant-4.1 → upload_assistant-4.2}/src/queuemanage.py +0 -0
  245. {upload_assistant-4.1 → upload_assistant-4.2}/src/radarr.py +0 -0
  246. {upload_assistant-4.1 → upload_assistant-4.2}/src/screenshot_manifest.py +0 -0
  247. {upload_assistant-4.1 → upload_assistant-4.2}/src/screenshot_review.py +0 -0
  248. {upload_assistant-4.1 → upload_assistant-4.2}/src/sonarr.py +0 -0
  249. {upload_assistant-4.1 → upload_assistant-4.2}/src/temp_paths.py +0 -0
  250. {upload_assistant-4.1 → upload_assistant-4.2}/src/tmdb.py +0 -0
  251. {upload_assistant-4.1 → upload_assistant-4.2}/src/torrent_clients/__init__.py +0 -0
  252. {upload_assistant-4.1 → upload_assistant-4.2}/src/torrent_clients/deluge.py +0 -0
  253. {upload_assistant-4.1 → upload_assistant-4.2}/src/torrent_clients/path_utils.py +0 -0
  254. {upload_assistant-4.1 → upload_assistant-4.2}/src/torrent_clients/transmission.py +0 -0
  255. {upload_assistant-4.1 → upload_assistant-4.2}/src/tracker_descriptions.py +0 -0
  256. {upload_assistant-4.1 → upload_assistant-4.2}/src/tracker_images.py +0 -0
  257. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackermeta.py +0 -0
  258. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/AVISTAZ/avistaz.py +0 -0
  259. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/AVISTAZ/cinemaz.py +0 -0
  260. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/AVISTAZ/privatehd.py +0 -0
  261. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/AVISTAZ/routing.py +0 -0
  262. {upload_assistant-4.1/src/trackers → upload_assistant-4.2/src/trackers/GAZELLE}/bjshare.py +0 -0
  263. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/__init__.py +0 -0
  264. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/oneptba.py +0 -0
  265. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/ptcafe.py +0 -0
  266. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/ptfans.py +0 -0
  267. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/ptgtk.py +0 -0
  268. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/NEXUSPHP/railgunpt.py +0 -0
  269. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/UNIT3D_TEMPLATE.py +0 -0
  270. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/asiancinema.py +0 -0
  271. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/bitporn.py +0 -0
  272. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/blutopia.py +0 -0
  273. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/capybarabr.py +0 -0
  274. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/cinematik.py +0 -0
  275. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/emuwarez.py +0 -0
  276. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/homiehelpdesk.py +0 -0
  277. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/itatorrents.py +0 -0
  278. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/lastdigitalunderground.py +0 -0
  279. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/latteam.py +0 -0
  280. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/locadora.py +0 -0
  281. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/luminarr.py +0 -0
  282. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/midnightscene.py +0 -0
  283. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/nordicquality.py +0 -0
  284. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/peergarden.py +0 -0
  285. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/polishtorrent.py +0 -0
  286. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/portugas.py +0 -0
  287. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/racing4everyone.py +0 -0
  288. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/rastastugan.py +0 -0
  289. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/reelflix.py +0 -0
  290. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/retromoviesclub.py +0 -0
  291. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/samaritano.py +0 -0
  292. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/seedpool.py +0 -0
  293. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/shareisland.py +0 -0
  294. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/skipthecommercials.py +0 -0
  295. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/theoldschool.py +0 -0
  296. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/tlzdigital.py +0 -0
  297. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/torrentdesi.py +0 -0
  298. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/torrenteros.py +0 -0
  299. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/torrenthr.py +0 -0
  300. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/utopia.py +0 -0
  301. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/yuscene.py +0 -0
  302. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/UNIT3D/znth.py +0 -0
  303. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/USENET/__init__.py +0 -0
  304. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/USENET/curupira.py +0 -0
  305. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/USENET/drunkenslug.py +0 -0
  306. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/USENET/nzbgeek.py +0 -0
  307. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/USENET/search_helpers.py +0 -0
  308. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/USENET/suio.py +0 -0
  309. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/__init__.py +0 -0
  310. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/amigosshare.py +0 -0
  311. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/beyondhd.py +0 -0
  312. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/bithdtv.py +0 -0
  313. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/cathoderaytube.py +0 -0
  314. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/filelist.py +0 -0
  315. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/flood.py +0 -0
  316. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/funfile.py +0 -0
  317. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/immortalseed.py +0 -0
  318. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/makingoff.py +0 -0
  319. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/mteam.py +0 -0
  320. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/retroflix.py +0 -0
  321. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/swarmazon.py +0 -0
  322. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/totheglory.py +0 -0
  323. {upload_assistant-4.1 → upload_assistant-4.2}/src/trackers/tvchaosuk.py +0 -0
  324. {upload_assistant-4.1 → upload_assistant-4.2}/src/tvmaze.py +0 -0
  325. {upload_assistant-4.1 → upload_assistant-4.2}/src/type_utils.py +0 -0
  326. {upload_assistant-4.1 → upload_assistant-4.2}/src/update_checker.py +0 -0
  327. {upload_assistant-4.1 → upload_assistant-4.2}/src/uphelper.py +0 -0
  328. {upload_assistant-4.1 → upload_assistant-4.2}/src/uploadorder.py +0 -0
  329. {upload_assistant-4.1 → upload_assistant-4.2}/src/uploadscreens.py +0 -0
  330. {upload_assistant-4.1 → upload_assistant-4.2}/src/video.py +0 -0
  331. {upload_assistant-4.1 → upload_assistant-4.2}/src/webui_progress.py +0 -0
  332. {upload_assistant-4.1 → upload_assistant-4.2}/src/xxx_keywords.py +0 -0
  333. {upload_assistant-4.1 → upload_assistant-4.2}/src/xxx_keywords_list.py +0 -0
  334. {upload_assistant-4.1 → upload_assistant-4.2}/src/xxx_platforms.py +0 -0
  335. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_aither.py +0 -0
  336. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_amigosshare_rules.py +0 -0
  337. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_app_paths.py +0 -0
  338. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_artwork_requirements.py +0 -0
  339. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_audible.py +0 -0
  340. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_audio_classifier.py +0 -0
  341. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_audio_multitrack_naming.py +0 -0
  342. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_audio_spectrogram.py +0 -0
  343. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_avistaz_names.py +0 -0
  344. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_avistaz_network_routing.py +0 -0
  345. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_avistaz_rules.py +0 -0
  346. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_avistaz_screenshots_and_desc.py +0 -0
  347. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_avistaz_tags.py +0 -0
  348. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_binaries.py +0 -0
  349. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_bitporn.py +0 -0
  350. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_book_detection.py +0 -0
  351. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_cathoderaytube.py +0 -0
  352. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_check_requirements.py +0 -0
  353. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_cinemaz_rules.py +0 -0
  354. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_cli_smoke.py +0 -0
  355. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_client_path_handling.py +0 -0
  356. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_clients.py +0 -0
  357. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_config_generator_tag_overrides.py +0 -0
  358. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_config_helpers.py +0 -0
  359. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_console_links.py +0 -0
  360. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_curupira.py +0 -0
  361. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_description_review.py +0 -0
  362. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_description_tag_overrides.py +0 -0
  363. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_digitalcore_description.py +0 -0
  364. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_disc_menus.py +0 -0
  365. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_dvd_screenshots.py +0 -0
  366. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_edition.py +0 -0
  367. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_exportmi.py +0 -0
  368. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_ffmpeg_binary.py +0 -0
  369. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_flood.py +0 -0
  370. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_gazellegames.py +0 -0
  371. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_get_desc_mediainfo.py +0 -0
  372. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_get_desc_packs.py +0 -0
  373. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_get_dvd_mediainfo.py +0 -0
  374. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_get_name_music.py +0 -0
  375. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_get_name_xxx.py +0 -0
  376. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_get_source.py +0 -0
  377. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_hardcoded_subtitle_detection.py +0 -0
  378. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_hardcoded_subtitle_language.py +0 -0
  379. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_hdbits.py +0 -0
  380. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_hdbits_images.py +0 -0
  381. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_hdbits_search.py +0 -0
  382. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_homiehelpdesk.py +0 -0
  383. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_igdb.py +0 -0
  384. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_imdb_cache.py +0 -0
  385. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_inline_description.py +0 -0
  386. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_is_scene.py +0 -0
  387. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_lostimg_screenshot_validation.py +0 -0
  388. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_lst.py +0 -0
  389. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_makingoff_dupes.py +0 -0
  390. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_makingoff_index.py +0 -0
  391. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_makingoff_rules.py +0 -0
  392. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_meta.py +0 -0
  393. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_metadata_cache.py +0 -0
  394. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_metadata_search_year.py +0 -0
  395. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_midnightscene.py +0 -0
  396. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_mkbrr.py +0 -0
  397. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_music_cover_hosting.py +0 -0
  398. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_new_nexusphp_trackers.py +0 -0
  399. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_no_imdb.py +0 -0
  400. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_nordicquality.py +0 -0
  401. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_nzbgeek.py +0 -0
  402. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_openlibrary_cache.py +0 -0
  403. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_pack_multi_screens.py +0 -0
  404. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_peergarden.py +0 -0
  405. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_portuguese_subtitles.py +0 -0
  406. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_post_upload_hooks.py +0 -0
  407. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_prep_early_screenshots.py +0 -0
  408. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_prep_helpers_bluray.py +0 -0
  409. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_privatehd_rules.py +0 -0
  410. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_prompt_sound.py +0 -0
  411. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_prowlarr.py +0 -0
  412. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_qbittorrent_proxy_retry.py +0 -0
  413. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_rastastugan.py +0 -0
  414. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_retromoviesclub.py +0 -0
  415. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_rockethd.py +0 -0
  416. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_samaritano.py +0 -0
  417. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_screenshot_par.py +0 -0
  418. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_screenshot_review.py +0 -0
  419. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_season_episode_fallback.py +0 -0
  420. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_seedpool.py +0 -0
  421. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_shell_completions.py +0 -0
  422. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_skipthecommercials.py +0 -0
  423. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_stdin_paths.py +0 -0
  424. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_suio.py +0 -0
  425. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_takescreens_ffmpeg.py +0 -0
  426. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_temp_paths.py +0 -0
  427. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_tlzdigital.py +0 -0
  428. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_tonemapped_header_import.py +0 -0
  429. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_torrenthr.py +0 -0
  430. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_torrentleech_description.py +0 -0
  431. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_tracker_descriptions.py +0 -0
  432. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_tracker_id_args.py +0 -0
  433. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_tracker_metadata_cache.py +0 -0
  434. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_tracker_setup.py +0 -0
  435. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_tracker_tags.py +0 -0
  436. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_tvdb_cache.py +0 -0
  437. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_unit3d_flags.py +0 -0
  438. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_unit3d_search_existing.py +0 -0
  439. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_update_checker.py +0 -0
  440. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_update_notification.py +0 -0
  441. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_uphelper_prompts.py +0 -0
  442. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_upload_order.py +0 -0
  443. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_upload_xxx.py +0 -0
  444. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_uploadscreens.py +0 -0
  445. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_usenet_cli.py +0 -0
  446. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_usenet_par2.py +0 -0
  447. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_video_hdr.py +0 -0
  448. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_webui_config_paths.py +0 -0
  449. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_webui_conpty.py +0 -0
  450. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_webui_example_metadata.py +0 -0
  451. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_webui_image_hosts.py +0 -0
  452. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_webui_kill.py +0 -0
  453. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_webui_release_group_overrides.py +0 -0
  454. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_webui_runtime_safety.py +0 -0
  455. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_webui_same_origin.py +0 -0
  456. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_windows_release_workflow.py +0 -0
  457. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_windows_update_atomic_install.py +0 -0
  458. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_xxx_contact_sheets.py +0 -0
  459. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_xxx_detection.py +0 -0
  460. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_zipline_upload.py +0 -0
  461. {upload_assistant-4.1 → upload_assistant-4.2}/tests/test_znth.py +0 -0
  462. {upload_assistant-4.1 → upload_assistant-4.2}/upload_assistant.egg-info/dependency_links.txt +0 -0
  463. {upload_assistant-4.1 → upload_assistant-4.2}/upload_assistant.egg-info/entry_points.txt +0 -0
  464. {upload_assistant-4.1 → upload_assistant-4.2}/upload_assistant.egg-info/requires.txt +0 -0
  465. {upload_assistant-4.1 → upload_assistant-4.2}/upload_assistant.egg-info/top_level.txt +0 -0
  466. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/__init__.py +0 -0
  467. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/access_log.py +0 -0
  468. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/auth.py +0 -0
  469. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/favicon.ico +0 -0
  470. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/apple-touch-icon.png +0 -0
  471. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/icon-192.png +0 -0
  472. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/logo.png +0 -0
  473. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/logo.svg +0 -0
  474. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/discogs.svg +0 -0
  475. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/douban.svg +0 -0
  476. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/google_books.svg +0 -0
  477. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/igdb.svg +0 -0
  478. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/igdb_light.svg +0 -0
  479. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/imdb.svg +0 -0
  480. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/mal.svg +0 -0
  481. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/musicbrainz.ico +0 -0
  482. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/openlibrary.svg +0 -0
  483. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/steam.svg +0 -0
  484. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/tmdb.svg +0 -0
  485. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/tvdb.svg +0 -0
  486. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/providers/tvmaze.svg +0 -0
  487. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/1ptba.png +0 -0
  488. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/aither.png +0 -0
  489. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/alpharatio.png +0 -0
  490. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/amigosshare.png +0 -0
  491. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/anthelion.png +0 -0
  492. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/asiancinema.png +0 -0
  493. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/avistaz.png +0 -0
  494. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/beyondhd.png +0 -0
  495. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/bithdtv.png +0 -0
  496. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/bitporn.png +0 -0
  497. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/bjshare.png +0 -0
  498. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/blutopia.png +0 -0
  499. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/brasiltracker.png +0 -0
  500. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/broadcasthenet.png +0 -0
  501. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/capybarabr.png +0 -0
  502. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/cathoderaytube.png +0 -0
  503. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/cinematik.png +0 -0
  504. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/cinemaz.png +0 -0
  505. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/darkpeers.png +0 -0
  506. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/desitorrents.png +0 -0
  507. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/digitalcore.png +0 -0
  508. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/dreadvault.png +0 -0
  509. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/drunkenslug.png +0 -0
  510. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/emuwarez.png +0 -0
  511. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/filelist.png +0 -0
  512. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/flood.png +0 -0
  513. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/funfile.png +0 -0
  514. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/greatposterwall.png +0 -0
  515. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/hawkeuno.png +0 -0
  516. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/hdbits.png +0 -0
  517. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/hdspace.png +0 -0
  518. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/hdtorrents.png +0 -0
  519. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/homiehelpdesk.png +0 -0
  520. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/immortalseed.png +0 -0
  521. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/infinityhd.png +0 -0
  522. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/iptorrents.png +0 -0
  523. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/itatorrents.png +0 -0
  524. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/lajidui.png +0 -0
  525. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/lastdigitalunderground.png +0 -0
  526. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/latteam.png +0 -0
  527. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/lemonhd.png +0 -0
  528. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/locadora.png +0 -0
  529. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/longpt.png +0 -0
  530. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/lst.png +0 -0
  531. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/luminarr.png +0 -0
  532. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/makingoff.png +0 -0
  533. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/midnightscene.png +0 -0
  534. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/mteam.png +0 -0
  535. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/nebulance.png +0 -0
  536. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/nordicquality.png +0 -0
  537. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/nzbgeek.png +0 -0
  538. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/oldtoonsworld.png +0 -0
  539. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/onlyencodes.png +0 -0
  540. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/orpheus.png +0 -0
  541. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/passthepopcorn.png +0 -0
  542. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/peergarden.png +0 -0
  543. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/polishtorrent.png +0 -0
  544. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/portugas.png +0 -0
  545. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/privatehd.png +0 -0
  546. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/ptcafe.png +0 -0
  547. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/pterclub.png +0 -0
  548. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/ptfans.png +0 -0
  549. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/ptgtk.png +0 -0
  550. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/ptskit.png +0 -0
  551. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/ptzone.png +0 -0
  552. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/racing4everyone.png +0 -0
  553. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/railgunpt.png +0 -0
  554. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/rastastugan.png +0 -0
  555. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/reelflix.png +0 -0
  556. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/retroflix.png +0 -0
  557. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/retromoviesclub.png +0 -0
  558. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/rockethd.png +0 -0
  559. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/samaritano.png +0 -0
  560. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/seedpool.png +0 -0
  561. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/shareisland.png +0 -0
  562. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/skipthecommercials.png +0 -0
  563. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/speedapp.png +0 -0
  564. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/swarmazon.png +0 -0
  565. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/theleachzone.png +0 -0
  566. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/theoldschool.png +0 -0
  567. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/torrenteros.png +0 -0
  568. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/torrenthr.png +0 -0
  569. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/torrentleech.png +0 -0
  570. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/totheglory.png +0 -0
  571. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/tvchaosuk.png +0 -0
  572. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/ulcx.png +0 -0
  573. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/utopia.png +0 -0
  574. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/xingyungept.png +0 -0
  575. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/yuscene.png +0 -0
  576. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/trackers/zenith.png +0 -0
  577. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/webui-icons/book.svg +0 -0
  578. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/webui-icons/file-structure.svg +0 -0
  579. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/webui-icons/gamepad.svg +0 -0
  580. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/webui-icons/movie.svg +0 -0
  581. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/webui-icons/music.svg +0 -0
  582. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/webui-icons/palette.svg +0 -0
  583. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/webui-icons/screenshots.svg +0 -0
  584. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/webui-icons/settings.svg +0 -0
  585. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/img/webui-icons/tv.svg +0 -0
  586. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/js/config_image_host_fallback.js +0 -0
  587. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/js/package.json +0 -0
  588. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/js/prompt_sound.js +0 -0
  589. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/js/shared_utils.js +0 -0
  590. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/js/web_ui/static/js/package-lock.json +0 -0
  591. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/static/manifest.webmanifest +0 -0
  592. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/templates/_theme_bootstrap.html +0 -0
  593. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/templates/login.html +0 -0
  594. {upload_assistant-4.1 → upload_assistant-4.2}/web_ui/templates/login_recovery.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: upload-assistant
3
- Version: 4.1
3
+ Version: 4.2
4
4
  Summary: A simple tool to take the work out of uploading.
5
5
  Author: wastaken7
6
6
  Maintainer: wastaken7
@@ -149,6 +149,10 @@ This branch introduces new media categories and automation features not present
149
149
  - **Discogs & MusicBrainz APIs**: Optionally queries external APIs (Discogs via release/master ID or URL, and MusicBrainz) for metadata enrichment.
150
150
  - **Artwork & Cover Extraction**: Automatically searches for local cover images or extracts embedded artwork from FLAC/MP3/M4A tags to upload to image hosts.
151
151
  - **Preflight & Rule Validation**: Enforces mechanical validation for audio formats, sample/bit rates, track counts, and hybrid setups before uploading.
152
+ - **Adult Video (`XXX` Category)**:
153
+ - **Automatic Detection & Metadata**: Recognizes supported adult-platform release names, extracts common title, studio, and date fields, and builds descriptive keywords.
154
+ - **Contact Sheets & Artwork**: Generates one configurable contact sheet per video and creates a fallback cover from the source when artwork is not supplied.
155
+ - **Workflow Guide**: See the dedicated [XXX category upload guide](docs/xxx-upload.md) for naming, overrides, WebUI usage, and supported destinations.
152
156
 
153
157
  ### 2. Audio Stream Spectrogram Generation
154
158
 
@@ -293,6 +297,7 @@ Sequence Usenet and torrent tracker uploads while limiting contention with qBitt
293
297
  | <img src="web_ui/static/img/trackers/curupira.png" width="16" height="16" /> | Curupira | CURUPIRA | MOVIE, TV, BOOK, GAME |
294
298
  | <img src="web_ui/static/img/trackers/drunkenslug.png" width="16" height="16" /> | DrunkenSlug | DRUNKENSLUG | MOVIE, TV, BOOK, GAME |
295
299
  | <img src="web_ui/static/img/trackers/nzbgeek.png" width="16" height="16" /> | NZBGeek | NZBGEEK | MOVIE, TV, BOOK, GAME, MUSIC |
300
+ | <img src="web_ui/static/img/trackers/nzbnest.png" width="16" height="16" /> | NzbNest | NZBNEST | MOVIE, TV, BOOK, GAME, MUSIC |
296
301
 
297
302
  </details>
298
303
 
@@ -66,6 +66,10 @@ This branch introduces new media categories and automation features not present
66
66
  - **Discogs & MusicBrainz APIs**: Optionally queries external APIs (Discogs via release/master ID or URL, and MusicBrainz) for metadata enrichment.
67
67
  - **Artwork & Cover Extraction**: Automatically searches for local cover images or extracts embedded artwork from FLAC/MP3/M4A tags to upload to image hosts.
68
68
  - **Preflight & Rule Validation**: Enforces mechanical validation for audio formats, sample/bit rates, track counts, and hybrid setups before uploading.
69
+ - **Adult Video (`XXX` Category)**:
70
+ - **Automatic Detection & Metadata**: Recognizes supported adult-platform release names, extracts common title, studio, and date fields, and builds descriptive keywords.
71
+ - **Contact Sheets & Artwork**: Generates one configurable contact sheet per video and creates a fallback cover from the source when artwork is not supplied.
72
+ - **Workflow Guide**: See the dedicated [XXX category upload guide](docs/xxx-upload.md) for naming, overrides, WebUI usage, and supported destinations.
69
73
 
70
74
  ### 2. Audio Stream Spectrogram Generation
71
75
 
@@ -210,6 +214,7 @@ Sequence Usenet and torrent tracker uploads while limiting contention with qBitt
210
214
  | <img src="web_ui/static/img/trackers/curupira.png" width="16" height="16" /> | Curupira | CURUPIRA | MOVIE, TV, BOOK, GAME |
211
215
  | <img src="web_ui/static/img/trackers/drunkenslug.png" width="16" height="16" /> | DrunkenSlug | DRUNKENSLUG | MOVIE, TV, BOOK, GAME |
212
216
  | <img src="web_ui/static/img/trackers/nzbgeek.png" width="16" height="16" /> | NZBGeek | NZBGEEK | MOVIE, TV, BOOK, GAME, MUSIC |
217
+ | <img src="web_ui/static/img/trackers/nzbnest.png" width="16" height="16" /> | NzbNest | NZBNEST | MOVIE, TV, BOOK, GAME, MUSIC |
213
218
 
214
219
  </details>
215
220
 
@@ -0,0 +1,7 @@
1
+ """Pinned versions and upstream repositories for managed binary dependencies."""
2
+
3
+ from bin.binary_dependency_pins import PINS
4
+
5
+ DEPENDENCY_VERSIONS = {dependency: pin.version for dependency, pin in PINS.items()}
6
+ DEPENDENCY_REPOSITORIES = {dependency: pin.repository for dependency, pin in PINS.items()}
7
+ DEPENDENCY_CHECKSUMS = {dependency: pin.checksums for dependency, pin in PINS.items()}
@@ -0,0 +1,33 @@
1
+ """Independently updatable version and integrity pins for managed binaries."""
2
+
3
+ from dataclasses import dataclass
4
+ from pathlib import Path
5
+
6
+ from bin.binary_dependency_pins import bdinfo, dovi_tool, ffmpeg, hdr10plus_tool, mkbrr, nyuu, par2, pesto, seven_zip
7
+
8
+
9
+ @dataclass(frozen=True)
10
+ class BinaryDependencyPin:
11
+ version: str
12
+ repository: str
13
+ checksums: dict[str, str]
14
+ path: Path
15
+
16
+
17
+ def _pin(module_path: str | None, version: str, repository: str, checksums: dict[str, str]) -> BinaryDependencyPin:
18
+ if module_path is None:
19
+ raise RuntimeError(f"Cannot update binary dependency pins without a source file for {repository}")
20
+ return BinaryDependencyPin(version, repository, checksums, Path(module_path))
21
+
22
+
23
+ PINS = {
24
+ "7zip": _pin(seven_zip.__file__, seven_zip.VERSION, seven_zip.REPOSITORY, seven_zip.SHA256_BY_ASSET),
25
+ "bdinfo": _pin(bdinfo.__file__, bdinfo.VERSION, bdinfo.REPOSITORY, bdinfo.SHA256_BY_ASSET),
26
+ "dovi_tool": _pin(dovi_tool.__file__, dovi_tool.VERSION, dovi_tool.REPOSITORY, dovi_tool.SHA256_BY_ASSET),
27
+ "ffmpeg": _pin(ffmpeg.__file__, ffmpeg.VERSION, ffmpeg.REPOSITORY, ffmpeg.SHA256_BY_ASSET),
28
+ "hdr10plus_tool": _pin(hdr10plus_tool.__file__, hdr10plus_tool.VERSION, hdr10plus_tool.REPOSITORY, hdr10plus_tool.SHA256_BY_ASSET),
29
+ "mkbrr": _pin(mkbrr.__file__, mkbrr.VERSION, mkbrr.REPOSITORY, mkbrr.SHA256_BY_ASSET),
30
+ "nyuu": _pin(nyuu.__file__, nyuu.VERSION, nyuu.REPOSITORY, nyuu.SHA256_BY_ASSET),
31
+ "par2": _pin(par2.__file__, par2.VERSION, par2.REPOSITORY, par2.SHA256_BY_ASSET),
32
+ "pesto": _pin(pesto.__file__, pesto.VERSION, pesto.REPOSITORY, pesto.SHA256_BY_ASSET),
33
+ }
@@ -0,0 +1,12 @@
1
+ """Release and integrity pins for BDInfo."""
2
+
3
+ VERSION = "v0.4.2"
4
+ REPOSITORY = "autobrr/go-bdinfo"
5
+ SHA256_BY_ASSET = {
6
+ "bdinfo_0.4.2_darwin_amd64.tar.gz": "f4679bd06077f1f9080b58559b235f1f4d8fb8ddbb49b872956904d28b33e65c",
7
+ "bdinfo_0.4.2_darwin_arm64.tar.gz": "98dffc9dbd6f81f6b691271ecf5462b8164ec07a4f7ea357b9f03eefba06969a",
8
+ "bdinfo_0.4.2_linux_amd64.tar.gz": "8794988af6e154bc34ceccd8c327e4eb2b6386e10f248a20e21e190d472fe9b1",
9
+ "bdinfo_0.4.2_linux_arm.tar.gz": "c6a49181961836fde75e15f9dfd19284a12bc3037f164de72bd9470211461053",
10
+ "bdinfo_0.4.2_linux_arm64.tar.gz": "f9f791534b48ad6c507bef3284be8a8395edc2f7193ac18f7bcde2a5e22467dd",
11
+ "bdinfo_0.4.2_windows_amd64.zip": "e68d48912b1ca7dba73c872a67c36abaabb7c46b73ac5dad32998025246bc462",
12
+ }
@@ -0,0 +1,11 @@
1
+ """Release and integrity pins for dovi_tool."""
2
+
3
+ VERSION = "2.3.4"
4
+ REPOSITORY = "quietvoid/dovi_tool"
5
+ SHA256_BY_ASSET = {
6
+ "dovi_tool-2.3.4-aarch64-pc-windows-msvc.zip": "4056206e28f7d733fd8a29add91d286d22956b41138d6ae0d51dbbf2289d9483",
7
+ "dovi_tool-2.3.4-aarch64-unknown-linux-musl.tar.gz": "b4f22a7db56954efe4ed8d02276d0f991799e84602f3584711be6c9df950cb15",
8
+ "dovi_tool-2.3.4-universal-macOS.zip": "30d4f512eb67b7f1632cd28be5c62989bedad23f4710578aafc20c384b48ece6",
9
+ "dovi_tool-2.3.4-x86_64-pc-windows-msvc.zip": "0d9733d311dfe49f9dca0c350f7e6d978182673d333c6f07f7365daf9e6c81eb",
10
+ "dovi_tool-2.3.4-x86_64-unknown-linux-musl.tar.gz": "1844258e13c26607b32224bf1fa82b595d3b35949f5467405fda560daad32b3f",
11
+ }
@@ -0,0 +1,7 @@
1
+ """Release and integrity pins for FFmpeg."""
2
+
3
+ VERSION = "9.0.1"
4
+ REPOSITORY = "GyanD/codexffmpeg"
5
+ SHA256_BY_ASSET = {
6
+ "ffmpeg-9.0.1-essentials_build.zip": "fec81ae03971d9dd4be3ebe02e263bd2ec1d789483f931bdba5f5715e65da2e9",
7
+ }
@@ -0,0 +1,11 @@
1
+ """Release and integrity pins for hdr10plus_tool."""
2
+
3
+ VERSION = "1.7.2"
4
+ REPOSITORY = "quietvoid/hdr10plus_tool"
5
+ SHA256_BY_ASSET = {
6
+ "hdr10plus_tool-1.7.2-aarch64-pc-windows-msvc.zip": "0cc1cd6ae9fb1115e5dc3d1f6daed47c486410ad5731f60a298e5d78fe995d6b",
7
+ "hdr10plus_tool-1.7.2-aarch64-unknown-linux-musl.tar.gz": "5fb90607cd94296640f1fc2355207b8107b67baac96d37481423d08a9fce437d",
8
+ "hdr10plus_tool-1.7.2-universal-macOS.zip": "d76977ed2ea90f8d6bce9035e37ea9dbffcead4725ceb1acf455c25d8658ff28",
9
+ "hdr10plus_tool-1.7.2-x86_64-pc-windows-msvc.zip": "82b2d560073941b14c6511a431f429e33e134e5caefb60d7e8f6f6e6da8e16ba",
10
+ "hdr10plus_tool-1.7.2-x86_64-unknown-linux-musl.tar.gz": "06385f37a639d61ba21d4be3150c863846933bc3b58110e094d8fc8f1c2249f2",
11
+ }
@@ -0,0 +1,13 @@
1
+ """Release and integrity pins for mkbrr."""
2
+
3
+ VERSION = "v1.25.1"
4
+ REPOSITORY = "autobrr/mkbrr"
5
+ SHA256_BY_ASSET = {
6
+ "mkbrr_1.25.1_darwin_arm64.tar.gz": "42f1c32bd86c3d7b1e1c900ab6d29a43eec74fe3b7f3374fb8da5da19f09f013",
7
+ "mkbrr_1.25.1_darwin_x86_64.tar.gz": "410525eb87a3372346072c43bab000de3efdbe31e569cf4e477508dc6a514b40",
8
+ "mkbrr_1.25.1_freebsd_x86_64.tar.gz": "dd1a8e265263359f51605085423ba1e8214ae852fdb49c4de6c0b2f9b6543788",
9
+ "mkbrr_1.25.1_linux_arm.tar.gz": "3d59ba8b78cf60471f092e3bdc2eb3b53387259873a935dab66af88f78707e40",
10
+ "mkbrr_1.25.1_linux_arm64.tar.gz": "6cd2347406c7b2f03a12d240022c9f2d23684c336a3802e5706a6ea3e360552d",
11
+ "mkbrr_1.25.1_linux_x86_64.tar.gz": "a48a3032fad09c033918a6e7a712eb45069b2a2f02546f8672768b19991bbb3b",
12
+ "mkbrr_1.25.1_windows_x86_64.zip": "2a1ca85148d558b680d16d37e3c83b03883494b3445f82f3fd5fd97a4cbe928f",
13
+ }
@@ -0,0 +1,10 @@
1
+ """Release and integrity pins for Nyuu."""
2
+
3
+ VERSION = "v0.4.2"
4
+ REPOSITORY = "animetosho/Nyuu"
5
+ SHA256_BY_ASSET = {
6
+ "nyuu-v0.4.2-linux-aarch64.tar.xz": "8a94f3f775996e4469736494074ac7663ff463748b0e302c2bc13d0ff4a88c0b",
7
+ "nyuu-v0.4.2-linux-amd64.tar.xz": "bbea69ffaf1d8ed3465935157e3842fe7a38bade2703504879eb8bc7c0a83dff",
8
+ "nyuu-v0.4.2-macos-x64.tar.xz": "040c56a486bc4ac7e3b0eed7a482ffce1bbf747ff731ad45ffd99d7230fcb2a0",
9
+ "nyuu-v0.4.2-win32.7z": "b14eb105e064ec2bd8f6d872c1c652a9943ea54d767c80554617f4eff6c801b8",
10
+ }
@@ -0,0 +1,12 @@
1
+ """Release and integrity pins for par2."""
2
+
3
+ VERSION = "v1.5.0"
4
+ REPOSITORY = "animetosho/par2cmdline-turbo"
5
+ SHA256_BY_ASSET = {
6
+ "par2cmdline-turbo-1.5.0-linux-amd64.zip": "5a9f64386813456693c2ea1fb7649436fe7544bbdf97fd73b3483dfcc8aca464",
7
+ "par2cmdline-turbo-1.5.0-linux-arm64.zip": "3afb2f0b319fc4e6353c6d4261994757cbe3189f968a72420b4ba1d63f9c9a70",
8
+ "par2cmdline-turbo-1.5.0-macos-amd64.zip": "3786d7c947ecb8048d688e0fdca3a4ce7e945d2bd248f54523ecc8d086e143cd",
9
+ "par2cmdline-turbo-1.5.0-macos-arm64.zip": "d016436356ef706c50ad5a4ee6316eef8138ab8d8177732ab97b9c2ad95b0990",
10
+ "par2cmdline-turbo-1.5.0-win-arm64.zip": "bb73312747b706dcedd13b8d4de7acd20e17367ebb0b26ebc3ea7d55ea744735",
11
+ "par2cmdline-turbo-1.5.0-win-x64.zip": "873a6f25822415f432224cc6f734407ca2732004184e002960fc68ed1e99c5d7",
12
+ }
@@ -0,0 +1,8 @@
1
+ """Release and integrity pins for pesto."""
2
+
3
+ VERSION = "pesto-v0.10.4"
4
+ REPOSITORY = "franzopl/pesto"
5
+ SHA256_BY_ASSET = {
6
+ "pesto-linux-x86_64": "99d78f64f7876f79a34ef252be66d672e3f0cfad150c33b8f65b79ef3d1007f8",
7
+ "pesto-windows-x86_64.exe": "dcca9067f0ff70a49cc65bba7b00738c2a76e65d64a8381fb815e761dbdd53c4",
8
+ }
@@ -0,0 +1,11 @@
1
+ """Release and integrity pins for 7zip."""
2
+
3
+ VERSION = "26.03"
4
+ REPOSITORY = "ip7z/7zip"
5
+ SHA256_BY_ASSET = {
6
+ "7z2603-linux-arm.tar.xz": "4efd099f6112b39054faea9424ded044b7bcaaf494dba49b918daa781297f57f",
7
+ "7z2603-linux-arm64.tar.xz": "2389ba20e4d8295e8709c20b6263b69bd1ec4972fe38a04ad7a1badbf595b996",
8
+ "7z2603-linux-x64.tar.xz": "dc99eff5008f1ab79bd7084c68513701547a808a89502bf4133683535ab3c695",
9
+ "7z2603-mac.tar.xz": "5ca87677072c59f5602e5c49baa27d4694bacd2259b4e507f0094249d4281480",
10
+ "7zr.exe": "ad4c82fadcbdf93c03b4fc440f300509c7d60c5c2f4d183e35d9d70d6957037d",
11
+ }
@@ -0,0 +1,43 @@
1
+ """Pinned SHA-256 verification for third-party executable downloads."""
2
+
3
+ import hashlib
4
+ from pathlib import Path
5
+
6
+ from bin.binary_dependencies import DEPENDENCY_CHECKSUMS
7
+
8
+ SHA256_BY_ASSET = {
9
+ "MediaInfo_CLI_23.04_Windows_x64.zip": "b1beafae0a15168ca37db8a3061d55eba55c1a120d6a6423ac1d3f30ed869270",
10
+ "MediaInfo_CLI_26.05_Lambda_arm64.zip": "57268dcfc044cdcbe4641e26432392f002b7fa4bcb06e9d738be04cd047a2c1e",
11
+ "MediaInfo_CLI_26.05_Lambda_x86_64.zip": "1ae3744a78c93492b69f0b38bb2d1de1433c3eae04030ff1ea82ee1f60ac9a99",
12
+ "MediaInfo_CLI_26.05_Mac.dmg": "507605a7c8f1054a6996d99a4ef5b5a0711cfbf2f8ca2ef5161d6ee701ea8015",
13
+ "MediaInfo_CLI_26.05_Windows_ARM64.zip": "6b403fa1411730672adefa8d49d97cbf7163eed7fc5c1256c9a6e9f915fde1a8",
14
+ "MediaInfo_CLI_26.05_Windows_x64.zip": "f7f80620ce6d14f4995f0de6f98e3ef18ad29496db01899571152ee3311229f9",
15
+ "mkbrr_1.18.0_linux_arm.tar.gz": "f622595f6afee302c72c89abdd9f31ad3197bd85d45a8b482f97ebd21930ac51",
16
+ "mkbrr_1.18.0_linux_arm64.tar.gz": "1c187ab2b860e637296d6f0deb4c2e7754a4c1e249b0226f0be671170689de24",
17
+ "mkbrr_1.18.0_linux_x86_64.tar.gz": "a796bd97dfb093e18a1a509c8986580498e65253582983a462b977b359f987b9",
18
+ }
19
+
20
+ for dependency, checksums in DEPENDENCY_CHECKSUMS.items():
21
+ if duplicates := SHA256_BY_ASSET.keys() & checksums.keys():
22
+ raise RuntimeError(f"Duplicate checksum pins for {dependency}: {', '.join(sorted(duplicates))}")
23
+ SHA256_BY_ASSET.update(checksums)
24
+
25
+
26
+ def verify_downloaded_asset(path: Path, asset: str) -> None:
27
+ """Fail closed unless a downloaded executable archive matches its pinned hash."""
28
+ expected = SHA256_BY_ASSET.get(asset)
29
+ if expected is None:
30
+ raise RuntimeError(f"No SHA-256 checksum is pinned for {asset}")
31
+ with path.open("rb") as asset_file:
32
+ actual = hashlib.file_digest(asset_file, "sha256").hexdigest()
33
+ if actual != expected:
34
+ raise RuntimeError(f"SHA-256 checksum mismatch for {asset}")
35
+
36
+
37
+ def verify_downloaded_content(content: bytes, asset: str) -> None:
38
+ """Fail closed unless downloaded content matches its pinned hash."""
39
+ expected = SHA256_BY_ASSET.get(asset)
40
+ if expected is None:
41
+ raise RuntimeError(f"No SHA-256 checksum is pinned for {asset}")
42
+ if hashlib.sha256(content).hexdigest() != expected:
43
+ raise RuntimeError(f"SHA-256 checksum mismatch for {asset}")
@@ -9,6 +9,7 @@ from pathlib import Path
9
9
  import aiofiles
10
10
  import httpx
11
11
 
12
+ from bin.binary_dependencies import DEPENDENCY_VERSIONS
12
13
  from bin.download_integrity import verify_downloaded_asset
13
14
 
14
15
  try:
@@ -30,9 +31,10 @@ class SevenZipBinaryManager:
30
31
  """Download 7-Zip binaries for the host architecture."""
31
32
 
32
33
  @staticmethod
33
- async def ensure_7z_binary(base_dir: str | Path, version: str = "26.01") -> str:
34
+ async def ensure_7z_binary(base_dir: str | Path, version: str = DEPENDENCY_VERSIONS["7zip"]) -> str:
34
35
  system = platform.system().lower()
35
36
  machine = platform.machine().lower()
37
+ asset_version = version.replace(".", "")
36
38
  logger.debug(f"[blue]7-Zip: Detected system: {system}, architecture: {machine}[/blue]")
37
39
 
38
40
  platform_map: dict[str, dict[str, dict[str, str]]] = {
@@ -43,18 +45,18 @@ class SevenZipBinaryManager:
43
45
  "arm64": {"file": "7zr.exe", "folder": "windows/arm64"},
44
46
  },
45
47
  "darwin": {
46
- "arm64": {"file": "7z2601-mac.tar.xz", "folder": "macos/arm64"},
47
- "x86_64": {"file": "7z2601-mac.tar.xz", "folder": "macos/x86_64"},
48
- "amd64": {"file": "7z2601-mac.tar.xz", "folder": "macos/x86_64"},
48
+ "arm64": {"file": f"7z{asset_version}-mac.tar.xz", "folder": "macos/arm64"},
49
+ "x86_64": {"file": f"7z{asset_version}-mac.tar.xz", "folder": "macos/x86_64"},
50
+ "amd64": {"file": f"7z{asset_version}-mac.tar.xz", "folder": "macos/x86_64"},
49
51
  },
50
52
  "linux": {
51
- "x86_64": {"file": "7z2601-linux-x64.tar.xz", "folder": "linux/amd64"},
52
- "amd64": {"file": "7z2601-linux-x64.tar.xz", "folder": "linux/amd64"},
53
- "arm64": {"file": "7z2601-linux-arm64.tar.xz", "folder": "linux/arm64"},
54
- "aarch64": {"file": "7z2601-linux-arm64.tar.xz", "folder": "linux/arm64"},
55
- "arm": {"file": "7z2601-linux-arm.tar.xz", "folder": "linux/arm"},
56
- "armv7l": {"file": "7z2601-linux-arm.tar.xz", "folder": "linux/arm"},
57
- "armv6l": {"file": "7z2601-linux-arm.tar.xz", "folder": "linux/arm"},
53
+ "x86_64": {"file": f"7z{asset_version}-linux-x64.tar.xz", "folder": "linux/amd64"},
54
+ "amd64": {"file": f"7z{asset_version}-linux-x64.tar.xz", "folder": "linux/amd64"},
55
+ "arm64": {"file": f"7z{asset_version}-linux-arm64.tar.xz", "folder": "linux/arm64"},
56
+ "aarch64": {"file": f"7z{asset_version}-linux-arm64.tar.xz", "folder": "linux/arm64"},
57
+ "arm": {"file": f"7z{asset_version}-linux-arm.tar.xz", "folder": "linux/arm"},
58
+ "armv7l": {"file": f"7z{asset_version}-linux-arm.tar.xz", "folder": "linux/arm"},
59
+ "armv6l": {"file": f"7z{asset_version}-linux-arm.tar.xz", "folder": "linux/arm"},
58
60
  },
59
61
  }
60
62
 
@@ -11,6 +11,7 @@ from pathlib import Path
11
11
  import aiofiles
12
12
  import httpx
13
13
 
14
+ from bin.binary_dependencies import DEPENDENCY_VERSIONS
14
15
  from bin.download_integrity import verify_downloaded_asset
15
16
 
16
17
  try:
@@ -35,7 +36,7 @@ class BDInfoBinaryManager:
35
36
  """
36
37
 
37
38
  @staticmethod
38
- async def ensure_bdinfo_binary(base_dir: str | Path, version: str = "v0.4.0") -> str:
39
+ async def ensure_bdinfo_binary(base_dir: str | Path, version: str = DEPENDENCY_VERSIONS["bdinfo"]) -> str:
39
40
  system = platform.system().lower()
40
41
  machine = platform.machine().lower()
41
42
  logger.debug(f"[blue]Detected system: {system}, architecture: {machine}[/blue]")
@@ -15,6 +15,7 @@ import requests
15
15
 
16
16
  sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
17
17
 
18
+ from bin.binary_dependencies import DEPENDENCY_VERSIONS
18
19
  from bin.download_integrity import verify_downloaded_asset
19
20
 
20
21
  try:
@@ -32,7 +33,7 @@ except ImportError:
32
33
  logger = logging.getLogger(__name__)
33
34
 
34
35
 
35
- BDINFO_VERSION = "v0.4.0"
36
+ BDINFO_VERSION = DEPENDENCY_VERSIONS["bdinfo"]
36
37
  BASE_RELEASE_URL = "https://github.com/autobrr/go-bdinfo/releases/download"
37
38
 
38
39
 
@@ -3,7 +3,6 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import asyncio
6
- import hashlib
7
6
  import platform
8
7
  import shutil
9
8
  import stat
@@ -13,24 +12,13 @@ from pathlib import Path
13
12
 
14
13
  import httpx
15
14
 
15
+ from bin.binary_dependencies import DEPENDENCY_VERSIONS
16
+ from bin.download_integrity import verify_downloaded_content
16
17
  from src.console import logger
17
18
 
18
19
  TOOLS = {
19
- "dovi": {"command": "dovi_tool", "repository": "quietvoid/dovi_tool", "version": "2.3.3"},
20
- "hdr10plus": {"command": "hdr10plus_tool", "repository": "quietvoid/hdr10plus_tool", "version": "1.7.2"},
21
- }
22
-
23
- ASSET_SHA256 = {
24
- "dovi_tool-2.3.3-aarch64-pc-windows-msvc.zip": "559ed634ef0b956ab89ed965b4920371bb228983f105d99fafeb372a8190c872",
25
- "dovi_tool-2.3.3-aarch64-unknown-linux-musl.tar.gz": "daf538c275f4e702219ce8eb61db28382193ac9d0126e1ef4185a88303af4485",
26
- "dovi_tool-2.3.3-universal-macOS.zip": "b113c83fed2d8d7ed9e43f0428d02fa0d0030e20965fc24a3cd4d48597d88685",
27
- "dovi_tool-2.3.3-x86_64-pc-windows-msvc.zip": "37ae198f2a535c910befad39fc09c21cded76bf3ef2d5459d542e58c2c158311",
28
- "dovi_tool-2.3.3-x86_64-unknown-linux-musl.tar.gz": "5dae82cb2becd3b9fd726127f936a8d32635e60746d16238fdfded12aa05988c",
29
- "hdr10plus_tool-1.7.2-aarch64-pc-windows-msvc.zip": "0cc1cd6ae9fb1115e5dc3d1f6daed47c486410ad5731f60a298e5d78fe995d6b",
30
- "hdr10plus_tool-1.7.2-aarch64-unknown-linux-musl.tar.gz": "5fb90607cd94296640f1fc2355207b8107b67baac96d37481423d08a9fce437d",
31
- "hdr10plus_tool-1.7.2-universal-macOS.zip": "d76977ed2ea90f8d6bce9035e37ea9dbffcead4725ceb1acf455c25d8658ff28",
32
- "hdr10plus_tool-1.7.2-x86_64-pc-windows-msvc.zip": "82b2d560073941b14c6511a431f429e33e134e5caefb60d7e8f6f6e6da8e16ba",
33
- "hdr10plus_tool-1.7.2-x86_64-unknown-linux-musl.tar.gz": "06385f37a639d61ba21d4be3150c863846933bc3b58110e094d8fc8f1c2249f2",
20
+ "dovi": {"command": "dovi_tool", "repository": "quietvoid/dovi_tool", "version": DEPENDENCY_VERSIONS["dovi_tool"]},
21
+ "hdr10plus": {"command": "hdr10plus_tool", "repository": "quietvoid/hdr10plus_tool", "version": DEPENDENCY_VERSIONS["hdr10plus_tool"]},
34
22
  }
35
23
 
36
24
 
@@ -50,11 +38,7 @@ def _asset_name(tool: str) -> tuple[str, str]:
50
38
 
51
39
  def _verify_checksum(asset: str, content: bytes) -> None:
52
40
  """Reject release assets whose content differs from the pinned digest."""
53
- expected_checksum = ASSET_SHA256.get(asset)
54
- if expected_checksum is None:
55
- raise RuntimeError(f"Missing checksum for {asset}")
56
- if hashlib.sha256(content).hexdigest() != expected_checksum:
57
- raise RuntimeError(f"Checksum mismatch for {asset}")
41
+ verify_downloaded_content(content, asset)
58
42
 
59
43
 
60
44
  def _safe_extract(archive: Path, destination: Path) -> None:
@@ -11,6 +11,7 @@ from pathlib import Path
11
11
  import aiofiles
12
12
  import httpx
13
13
 
14
+ from bin.binary_dependencies import DEPENDENCY_VERSIONS
14
15
  from bin.download_integrity import verify_downloaded_asset
15
16
  from src.console import logger
16
17
 
@@ -18,8 +19,8 @@ from src.console import logger
18
19
  class FfmpegBinaryManager:
19
20
  """Download the verified Windows FFmpeg build into the runtime ``bin`` cache."""
20
21
 
21
- VERSION = "9.0.1"
22
- ASSET_NAME = "ffmpeg-9.0.1-essentials_build.zip"
22
+ VERSION = DEPENDENCY_VERSIONS["ffmpeg"]
23
+ ASSET_NAME = f"ffmpeg-{VERSION}-essentials_build.zip"
23
24
  DOWNLOAD_URL = f"https://github.com/GyanD/codexffmpeg/releases/download/{VERSION}/{ASSET_NAME}"
24
25
 
25
26
  @classmethod
@@ -11,6 +11,7 @@ from typing import ClassVar
11
11
  import aiofiles
12
12
  import httpx
13
13
 
14
+ from bin.binary_dependencies import DEPENDENCY_VERSIONS
14
15
  from bin.download_integrity import verify_downloaded_asset
15
16
 
16
17
  try:
@@ -77,7 +78,7 @@ class MkbrrBinaryManager:
77
78
  return shutil.which("mkbrr")
78
79
 
79
80
  @staticmethod
80
- async def ensure_mkbrr_binary(base_dir: str | Path, version: str) -> str:
81
+ async def ensure_mkbrr_binary(base_dir: str | Path, version: str = DEPENDENCY_VERSIONS["mkbrr"]) -> str:
81
82
  existing_binary = MkbrrBinaryManager.find_existing_binary(base_dir, version)
82
83
  if existing_binary:
83
84
  return existing_binary
@@ -235,7 +236,7 @@ class MkbrrBinaryManager:
235
236
  raise Exception(f"Failed to extract mkbrr binary: {e}") from e
236
237
 
237
238
  @staticmethod
238
- def download_mkbrr_for_docker(base_dir: str | Path = ".", version: str = "v1.18.0") -> str:
239
+ def download_mkbrr_for_docker(base_dir: str | Path = ".", version: str = DEPENDENCY_VERSIONS["mkbrr"]) -> str:
239
240
  """Download mkbrr binary for Docker/Linux - synchronous version."""
240
241
  system = platform.system().lower()
241
242
  machine = platform.machine().lower()
@@ -10,6 +10,7 @@ from pathlib import Path
10
10
  import aiofiles
11
11
  import httpx
12
12
 
13
+ from bin.binary_dependencies import DEPENDENCY_VERSIONS
13
14
  from bin.download_integrity import verify_downloaded_asset
14
15
 
15
16
  try:
@@ -31,28 +32,28 @@ class NyuuBinaryManager:
31
32
  """Download Nyuu binaries for the host architecture."""
32
33
 
33
34
  @staticmethod
34
- async def ensure_nyuu_binary(base_dir: str | Path, path_7z: str | None = None, version: str = "v0.4.2") -> str:
35
+ async def ensure_nyuu_binary(base_dir: str | Path, path_7z: str | None = None, version: str = DEPENDENCY_VERSIONS["nyuu"]) -> str:
35
36
  system = platform.system().lower()
36
37
  machine = platform.machine().lower()
37
38
  logger.debug(f"[blue]Nyuu: Detected system: {system}, architecture: {machine}[/blue]")
38
39
 
39
40
  platform_map: dict[str, dict[str, dict[str, str]]] = {
40
41
  "windows": {
41
- "x86_64": {"file": "nyuu-v0.4.2-win32.7z", "folder": "windows/x86_64"},
42
- "amd64": {"file": "nyuu-v0.4.2-win32.7z", "folder": "windows/x86_64"},
43
- "x86": {"file": "nyuu-v0.4.2-win32.7z", "folder": "windows/x86"},
44
- "arm64": {"file": "nyuu-v0.4.2-win32.7z", "folder": "windows/arm64"},
42
+ "x86_64": {"file": f"nyuu-{version}-win32.7z", "folder": "windows/x86_64"},
43
+ "amd64": {"file": f"nyuu-{version}-win32.7z", "folder": "windows/x86_64"},
44
+ "x86": {"file": f"nyuu-{version}-win32.7z", "folder": "windows/x86"},
45
+ "arm64": {"file": f"nyuu-{version}-win32.7z", "folder": "windows/arm64"},
45
46
  },
46
47
  "darwin": {
47
- "arm64": {"file": "nyuu-v0.4.2-macos-x64.tar.xz", "folder": "macos/arm64"},
48
- "x86_64": {"file": "nyuu-v0.4.2-macos-x64.tar.xz", "folder": "macos/x86_64"},
49
- "amd64": {"file": "nyuu-v0.4.2-macos-x64.tar.xz", "folder": "macos/x86_64"},
48
+ "arm64": {"file": f"nyuu-{version}-macos-x64.tar.xz", "folder": "macos/arm64"},
49
+ "x86_64": {"file": f"nyuu-{version}-macos-x64.tar.xz", "folder": "macos/x86_64"},
50
+ "amd64": {"file": f"nyuu-{version}-macos-x64.tar.xz", "folder": "macos/x86_64"},
50
51
  },
51
52
  "linux": {
52
- "x86_64": {"file": "nyuu-v0.4.2-linux-amd64.tar.xz", "folder": "linux/amd64"},
53
- "amd64": {"file": "nyuu-v0.4.2-linux-amd64.tar.xz", "folder": "linux/amd64"},
54
- "arm64": {"file": "nyuu-v0.4.2-linux-aarch64.tar.xz", "folder": "linux/arm64"},
55
- "aarch64": {"file": "nyuu-v0.4.2-linux-aarch64.tar.xz", "folder": "linux/arm64"},
53
+ "x86_64": {"file": f"nyuu-{version}-linux-amd64.tar.xz", "folder": "linux/amd64"},
54
+ "amd64": {"file": f"nyuu-{version}-linux-amd64.tar.xz", "folder": "linux/amd64"},
55
+ "arm64": {"file": f"nyuu-{version}-linux-aarch64.tar.xz", "folder": "linux/arm64"},
56
+ "aarch64": {"file": f"nyuu-{version}-linux-aarch64.tar.xz", "folder": "linux/arm64"},
56
57
  },
57
58
  }
58
59
 
@@ -9,6 +9,7 @@ from pathlib import Path
9
9
  import aiofiles
10
10
  import httpx
11
11
 
12
+ from bin.binary_dependencies import DEPENDENCY_VERSIONS
12
13
  from bin.download_integrity import verify_downloaded_asset
13
14
 
14
15
  try:
@@ -30,12 +31,12 @@ class Par2BinaryManager:
30
31
  """Download par2cmdline-turbo binaries for the host architecture."""
31
32
 
32
33
  @staticmethod
33
- async def ensure_par2_binary(base_dir: str | Path, version: str = "v1.4.0") -> str:
34
+ async def ensure_par2_binary(base_dir: str | Path, version: str = DEPENDENCY_VERSIONS["par2"]) -> str:
34
35
  system = platform.system().lower()
35
36
  machine = platform.machine().lower()
36
37
  logger.debug(f"[blue]PAR2: Detected system: {system}, architecture: {machine}[/blue]")
37
38
 
38
- # Strip 'v' from version for URLs if needed, but the tag is v1.4.0, while filenames have 1.4.0
39
+ # Release tags include "v", while asset filenames use the numeric version.
39
40
  v_num = version.lstrip("v")
40
41
 
41
42
  platform_map: dict[str, dict[str, dict[str, str]]] = {
@@ -8,6 +8,7 @@ from pathlib import Path
8
8
  import aiofiles
9
9
  import httpx
10
10
 
11
+ from bin.binary_dependencies import DEPENDENCY_VERSIONS
11
12
  from bin.download_integrity import verify_downloaded_asset
12
13
 
13
14
  try:
@@ -29,7 +30,7 @@ class PestoBinaryManager:
29
30
  """Download Pesto binaries for the host architecture."""
30
31
 
31
32
  @staticmethod
32
- async def ensure_pesto_binary(base_dir: str | Path, version: str = "pesto-v0.6.0") -> str:
33
+ async def ensure_pesto_binary(base_dir: str | Path, version: str = DEPENDENCY_VERSIONS["pesto"]) -> str:
33
34
  system = platform.system().lower()
34
35
  machine = platform.machine().lower()
35
36
  logger.debug(f"[blue]Pesto: Detected system: {system}, architecture: {machine}[/blue]")
@@ -299,11 +299,25 @@ config: dict[str, Any] = {
299
299
  # Works only when the input frame has a supported color tag.
300
300
  "desat": "10.0",
301
301
  # Screenshot overlays
302
- # Set to True to overlay the frame number, frame type, and "Tonemapped" label when applicable.
302
+ # Layout examples and manual setup: docs/screenshot-overlays.md
303
+ # Show enabled screenshot labels without changing the individual selections below.
304
+ # Enable at least one label below to display overlay text.
303
305
  # Enabling overlays uses FFmpeg tone mapping instead of libplacebo.
304
306
  "frame_overlay": False,
305
- # Overlay text size, scaled with resolution.
307
+ # Overlay text size (1-100), scaled with resolution. VapourSynth rounds to whole font-scale steps.
306
308
  "overlay_text_size": "18",
309
+ # Keep labels at the top, aligned to "left" or "right".
310
+ "overlay_position": "left",
311
+ # Use "stacked" for one label per line, or "single_line" for compact labels separated by bullets.
312
+ "overlay_layout": "stacked",
313
+ # Show the estimated frame number at the capture position.
314
+ "overlay_frame_number": False,
315
+ # Show the frame's picture type (I, P, or B).
316
+ "overlay_frame_type": False,
317
+ # Show the captured frame's elapsed video time (HH:MM:SS.mmm).
318
+ "overlay_timestamp": False,
319
+ # Show only when screenshots have been tonemapped to SDR.
320
+ "overlay_tonemapped": False,
307
321
  # --- DISC MENU SCREENSHOTS ---
308
322
  # Set to True to capture DVD menu screenshots from menu VOBs.
309
323
  "auto_dvd_menus": True,
@@ -524,7 +538,7 @@ config: dict[str, Any] = {
524
538
  # BRASILTRACKER, BROADCASTHENET, CAPYBARABR, CATHODERAYTUBE, CINEMATIK, CINEMAZ, CURUPIRA, DARKPEERS, DESITORRENTS, DIGITALCORE,
525
539
  # DREADVAULT, DRUNKENSLUG, EMUWAREZ, FILELIST, FLOOD, FUNFILE, GREATPOSTERWALL, HAWKEUNO, HDBITS, HDSPACE, HDTORRENTS, HOMIEHELPDESK,
526
540
  # IMMORTALSEED, INFINITYHD, IPTORRENTS, ITATORRENTS, LAJIDUI, LASTDIGITALUNDERGROUND, LATTEAM, LEMONHD, LOCADORA, LONGPT, LST,
527
- # LUMINARR, MAKINGOFF, MIDNIGHTSCENE, MTEAM, NEBULANCE, NORDICQUALITY, NZBGEEK, OLDTOONSWORLD, ONLYENCODES, ORPHEUS, PASSTHEPOPCORN,
541
+ # LUMINARR, MAKINGOFF, MIDNIGHTSCENE, MTEAM, NEBULANCE, NORDICQUALITY, NZBGEEK, NZBNEST, OLDTOONSWORLD, ONLYENCODES, ORPHEUS, PASSTHEPOPCORN,
528
542
  # PEERGARDEN, POLISHTORRENT, PORTUGAS, PRIVATEHD, PTCAFE, PTERCLUB, PTFANS, PTGTK, PTSKIT, PTZONE, RACING4EVERYONE, RAILGUNPT,
529
543
  # RASTASTUGAN, REELFLIX, RETROFLIX, RETROMOVIESCLUB, ROCKETHD, SAMARITANO, SEEDPOOL, SHAREISLAND, SKIPTHECOMMERCIALS, SPEEDAPP,
530
544
  # SUIO, SWARMAZON, THELEACHZONE, THEOLDSCHOOL, TORRENTEROS, TORRENTHR, TORRENTLEECH, TOTHEGLORY, TVCHAOSUK, ULCX, UTOPIA,
@@ -1162,6 +1176,8 @@ config: dict[str, Any] = {
1162
1176
  # You can find your api key at Settings -> Security -> API Key -> Generate API Key
1163
1177
  "api_key": "",
1164
1178
  "anon": True,
1179
+ # Force DigitalCore uploads to re-host screenshots on img.digitalcore.club using DEFAULT.sharex_api_key.
1180
+ "force_rehost_images": False,
1165
1181
  # If True, the script will use the metadata-based title instead of the directory/file name.
1166
1182
  "use_metadata_name": False,
1167
1183
  # The configurations below override the DEFAULT configuration
@@ -2115,6 +2131,16 @@ config: dict[str, Any] = {
2115
2131
  "exact_match_only": False,
2116
2132
  "inject_delay": 0,
2117
2133
  },
2134
+ "NZBNEST": {
2135
+ # NzbNest API key
2136
+ "api_key": "",
2137
+ # Maximum number of API hits the script may make within 24 hours for duplicate search.
2138
+ # Set to 0 to disable duplicate search via API.
2139
+ "daily_api_hit_limit": 0,
2140
+ # Only block uploads when the existing release exactly matches files.
2141
+ "exact_match_only": False,
2142
+ "inject_delay": 0,
2143
+ },
2118
2144
  "OLDTOONSWORLD": {
2119
2145
  # Instead of using the tracker acronym for folder name when sym/hard linking, you can use a custom name
2120
2146
  "link_dir_name": "",
@@ -2809,6 +2835,7 @@ config: dict[str, Any] = {
2809
2835
  # "use_for_search": False, set to True if using this tracker for automatic ID searching or description parsing
2810
2836
  "use_for_search": False,
2811
2837
  "api_key": "",
2838
+ "anon": True,
2812
2839
  # Only block uploads when the existing release exactly matches files and size.
2813
2840
  "exact_match_only": False,
2814
2841
  # For authorized users only. Do not change this unless you know what you are doing
@@ -3125,6 +3152,7 @@ config: dict[str, Any] = {
3125
3152
  # "use_for_search": False, set to True if using this tracker for automatic ID searching or description parsing
3126
3153
  "use_for_search": False,
3127
3154
  "api_key": "",
3155
+ "anon": True,
3128
3156
  # For authorized users only. Do not change this unless you know what you are doing
3129
3157
  # Upload as featured
3130
3158
  "featured": False,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "upload-assistant"
3
- version = "4.1"
3
+ version = "4.2"
4
4
  requires-python = ">=3.14"
5
5
  description = "A simple tool to take the work out of uploading."
6
6
  readme = "README.md"