kryten-webqueue 0.44.0__tar.gz → 0.44.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 (198) hide show
  1. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/CHANGELOG.md +26 -1
  2. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/PKG-INFO +1 -1
  3. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/ytpipe/downloader.py +16 -0
  4. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/admin/index.html +1 -1
  5. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/admin/playlists.html +1 -1
  6. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/admin/promos.html +1 -1
  7. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/admin/queue_mgmt.html +1 -1
  8. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/admin/schedules.html +1 -1
  9. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/base.html +3 -3
  10. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/pyproject.toml +1 -1
  11. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/.github/workflows/gitleaks.yml +0 -0
  12. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/.github/workflows/python-publish.yml +0 -0
  13. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/.github/workflows/release.yml +0 -0
  14. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/.gitignore +0 -0
  15. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/.gitleaks.toml +0 -0
  16. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/.pre-commit-config.yaml +0 -0
  17. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/AGENT-WORKFLOW-GUIDE.md +0 -0
  18. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/AGENTS.md +0 -0
  19. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/README.md +0 -0
  20. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/config.example.json +0 -0
  21. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/deploy/kryten-webqueue.service +0 -0
  22. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/deploy/nginx-queue.conf +0 -0
  23. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/IMPLEMENTATION_SPEC.md +0 -0
  24. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/IMPL_API_GATE.md +0 -0
  25. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/IMPL_ECONOMY.md +0 -0
  26. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/IMPL_KRYTEN_PY.md +0 -0
  27. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/IMPL_ROBOT.md +0 -0
  28. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/Kryten-Economy Service Quality Survey Report at v0.13.0.md +0 -0
  29. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/Kryten-Webqueue Service Quality Survey Report at v0.27.1.md +0 -0
  30. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/Log for incorrect promo insertion problem.txt +0 -0
  31. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/PLAN_PRESENCE_AND_PROMOS.md +0 -0
  32. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/PRD_TMDB_LOCAL_INDEX.md +0 -0
  33. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/PRE_PLAN_GAPS.md +0 -0
  34. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/PRODUCT_PLAN.md +0 -0
  35. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/PUBLIC_API.md +0 -0
  36. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/SPEC-Visual-UX-Sprint-August-2026.md +0 -0
  37. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/SPEC_ADMIN_ITEM_EDITOR.md +0 -0
  38. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/SPEC_CATALOG_ENRICHMENT_PIPELINE.md +0 -0
  39. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/SPEC_EMOTE_REHOST.md +0 -0
  40. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/SPEC_JOBS_AND_BROWSE.md +0 -0
  41. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/SPEC_TMDB_LOCAL_INDEX.md +0 -0
  42. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/docs/UX_POLISH_PLAN.md +0 -0
  43. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/__init__.py +0 -0
  44. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/__main__.py +0 -0
  45. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/api_gate/__init__.py +0 -0
  46. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/api_gate/client.py +0 -0
  47. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/app.py +0 -0
  48. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/auth/__init__.py +0 -0
  49. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/auth/device_keys.py +0 -0
  50. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/auth/otp.py +0 -0
  51. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/auth/rate_limit.py +0 -0
  52. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/auth/session.py +0 -0
  53. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/__init__.py +0 -0
  54. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/__init__.py +0 -0
  55. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_blackouts.py +0 -0
  56. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_catalog.py +0 -0
  57. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_connection.py +0 -0
  58. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_devices.py +0 -0
  59. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_enrichment.py +0 -0
  60. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_feedback.py +0 -0
  61. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_fetch_queue.py +0 -0
  62. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_people.py +0 -0
  63. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_playlists.py +0 -0
  64. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_queue.py +0 -0
  65. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/db/_watchlist.py +0 -0
  66. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/__init__.py +0 -0
  67. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/classify.py +0 -0
  68. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/normalise.py +0 -0
  69. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/pipeline.py +0 -0
  70. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/providers.py +0 -0
  71. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/report.py +0 -0
  72. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/steps/__init__.py +0 -0
  73. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/steps/art.py +0 -0
  74. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/steps/categories.py +0 -0
  75. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/steps/identify.py +0 -0
  76. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/steps/meta.py +0 -0
  77. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/steps/sync.py +0 -0
  78. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/steps/tags.py +0 -0
  79. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/enrichment/steps/title.py +0 -0
  80. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/images.py +0 -0
  81. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/mediacms.py +0 -0
  82. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/sync.py +0 -0
  83. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/tmdb_index/__init__.py +0 -0
  84. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/tmdb_index/_schema.py +0 -0
  85. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/tmdb_index/_textmatch.py +0 -0
  86. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/tmdb_index/_ttscrape.py +0 -0
  87. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/tmdb_index/builder.py +0 -0
  88. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/tmdb_index/coverage.py +0 -0
  89. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/catalog/tmdb_index/index.py +0 -0
  90. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/config.py +0 -0
  91. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/__init__.py +0 -0
  92. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/cmsutils/__init__.py +0 -0
  93. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/cmsutils/_common.py +0 -0
  94. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/cmsutils/blackout_scan.py +0 -0
  95. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/cmsutils/enrichmeta.py +0 -0
  96. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/cmsutils/enrichtitles.py +0 -0
  97. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/cmsutils/enrichtv.py +0 -0
  98. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/cmsutils/fetchurls.py +0 -0
  99. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/cmsutils/motdposters.py +0 -0
  100. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/cmsutils/playedmovies.py +0 -0
  101. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/integrations/ytpipe/__init__.py +0 -0
  102. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/jobs/__init__.py +0 -0
  103. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/jobs/fetchurls_auth.py +0 -0
  104. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/jobs/job_scheduler.py +0 -0
  105. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/jobs/log_capture.py +0 -0
  106. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/jobs/manager.py +0 -0
  107. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/jobs/rehost_emotes.py +0 -0
  108. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/jobs/tasks.py +0 -0
  109. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/logging_config.py +0 -0
  110. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/playlists/__init__.py +0 -0
  111. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/playlists/bulk_add.py +0 -0
  112. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/playlists/fire.py +0 -0
  113. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/playlists/importer.py +0 -0
  114. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/playlists/ordering.py +0 -0
  115. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/playlists/scheduler.py +0 -0
  116. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/promos/__init__.py +0 -0
  117. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/promos/director.py +0 -0
  118. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/queue/__init__.py +0 -0
  119. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/queue/completion.py +0 -0
  120. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/queue/ordering.py +0 -0
  121. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/queue/poller.py +0 -0
  122. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/queue/presence.py +0 -0
  123. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/queue/race_poller.py +0 -0
  124. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/queue/shadow.py +0 -0
  125. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/__init__.py +0 -0
  126. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/admin_catalog.py +0 -0
  127. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/admin_feedback.py +0 -0
  128. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/admin_job_schedules.py +0 -0
  129. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/admin_jobs.py +0 -0
  130. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/admin_moderation.py +0 -0
  131. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/admin_playlists.py +0 -0
  132. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/admin_promos.py +0 -0
  133. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/admin_queue.py +0 -0
  134. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/admin_schedules.py +0 -0
  135. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/auth.py +0 -0
  136. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/catalog.py +0 -0
  137. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/devices.py +0 -0
  138. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/feedback.py +0 -0
  139. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/pages.py +0 -0
  140. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/public_api.py +0 -0
  141. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/queue.py +0 -0
  142. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/routes/user.py +0 -0
  143. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/static/css/main.css +0 -0
  144. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/static/js/admin-playlists.js +0 -0
  145. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/static/js/admin-promos.js +0 -0
  146. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/static/js/admin-queue-mgmt.js +0 -0
  147. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/static/js/admin-schedules.js +0 -0
  148. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/static/js/admin.js +0 -0
  149. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/static/js/keybindings.js +0 -0
  150. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/static/js/main.js +0 -0
  151. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/auth/login.html +0 -0
  152. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/catalog/browse.html +0 -0
  153. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/catalog/edit_item_modal.html +0 -0
  154. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/catalog/item_detail.html +0 -0
  155. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/catalog/item_not_found.html +0 -0
  156. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/feedback/index.html +0 -0
  157. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/queue/index.html +0 -0
  158. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/race.html +0 -0
  159. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/user/dashboard.html +0 -0
  160. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/user/link_device.html +0 -0
  161. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/templates/user/my_list.html +0 -0
  162. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/ws/__init__.py +0 -0
  163. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/ws/handler.py +0 -0
  164. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/kryten_webqueue/ws/manager.py +0 -0
  165. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/scripts/AGENTS.md +0 -0
  166. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/scripts/patch_mediacms_bulk_facets.py +0 -0
  167. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/scripts/patch_mediacms_tags.py +0 -0
  168. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/scripts/trigger_enrich.py +0 -0
  169. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/__init__.py +0 -0
  170. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_catalog_blackout.py +0 -0
  171. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_catalog_delete.py +0 -0
  172. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_classify.py +0 -0
  173. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_config_persistence.py +0 -0
  174. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_device_linking.py +0 -0
  175. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_feedback.py +0 -0
  176. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_fetch_queue_pacing.py +0 -0
  177. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_fetchurls_sharepoint.py +0 -0
  178. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_identify_step.py +0 -0
  179. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_job_logs_and_queue_visibility.py +0 -0
  180. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_people_facets.py +0 -0
  181. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_phase1.py +0 -0
  182. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_phase2_jobs.py +0 -0
  183. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_phase3_jobs.py +0 -0
  184. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_phase4_live_fixes.py +0 -0
  185. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_playlist_import.py +0 -0
  186. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_presence_refund.py +0 -0
  187. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_promo_director.py +0 -0
  188. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_promo_pool_exclusion.py +0 -0
  189. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_providers.py +0 -0
  190. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_queue_announce.py +0 -0
  191. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_race_poller.py +0 -0
  192. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_recently_played_hide.py +0 -0
  193. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_save_results_to_playlist.py +0 -0
  194. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_schedule_lock.py +0 -0
  195. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_search_facets.py +0 -0
  196. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_title_normalization.py +0 -0
  197. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_tmdb_index.py +0 -0
  198. {kryten_webqueue-0.44.0 → kryten_webqueue-0.44.2}/tests/test_watchlist.py +0 -0
@@ -1,6 +1,31 @@
1
1
  # Changelog
2
2
 
3
- ## [Unreleased]
3
+ ## [0.44.2] - 2026-08-29
4
+
5
+ ### Changed
6
+
7
+ - **Gentler source fetching (fixes intermittent Tubi "Read timed out").** Every
8
+ yt-dlp call now flows through a socket-timeout **floor of 60s** (raising
9
+ over-aggressive per-call values like 10s), paces data-extraction HTTP requests
10
+ (`sleep_interval_requests = 1s`), and retries a failed webpage/m3u8 extraction
11
+ step (`extractor_retries = 5`). Sources like Tubi soft-throttle bursts of
12
+ requests, which surfaced as `HTTPSConnectionPool(host='tubitv.com'): Read timed
13
+ out` and cascading "Requested format is not available" errors; these defaults
14
+ make the downloader slower-but-steadier and far less likely to trip throttling.
15
+ Applied centrally in the vendored downloader's `YoutubeDL` wrapper.
16
+
17
+ ## [0.44.1] - 2026-08-27
18
+
19
+ ### Fixed
20
+
21
+ - **Static assets are now cache-busted by version.** JS/CSS includes gained a
22
+ `?v={app_version}` query string, so browsers fetch fresh assets after every
23
+ release instead of serving a stale cached copy. This fixes the admin Download
24
+ Queue rendering as empty immediately after the 0.44.0 upgrade: the new endpoint
25
+ returns `{items, …}` but a cached pre-0.44.0 `admin.js` read the response as a
26
+ bare array, so `.length` was `undefined` and it showed "Queue is empty."
27
+
28
+ ## [0.44.0]
4
29
 
5
30
  ### Added
6
31
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: kryten-webqueue
3
- Version: 0.44.0
3
+ Version: 0.44.2
4
4
  Summary: Netflix/Tubi-style catalog browser and pay-to-play queue management for CyTube
5
5
  Author: grobertson
6
6
  License-Expression: MIT
@@ -54,12 +54,28 @@ from . import RetryableUploadError
54
54
  _JS_RUNTIMES = {"deno": {}, "node": {}}
55
55
  _REMOTE_COMPONENTS = ["ejs:github", "ejs:npm"]
56
56
 
57
+ # "Be gentle" defaults applied to every yt-dlp call (see subclass below). Sources
58
+ # like Tubi soft-throttle repeat requests, surfacing as intermittent
59
+ # "Read timed out" on the webpage/m3u8 extraction steps. Pace requests, tolerate
60
+ # slow responses, and retry the extractor rather than hard-failing.
61
+ _SOURCE_SOCKET_TIMEOUT = 60 # floor (yt-dlp default is 20)
62
+ _SOURCE_SLEEP_REQUESTS = 1.0 # seconds between data-extraction HTTP requests
63
+ _SOURCE_EXTRACTOR_RETRIES = 5 # retry a failed "Downloading webpage" step
64
+
57
65
 
58
66
  class _YoutubeDLWithJSRuntimes(yt_dlp.YoutubeDL):
59
67
  def __init__(self, params=None, *args, **kwargs): # noqa: D107
60
68
  merged = dict(params or {})
61
69
  merged.setdefault("js_runtimes", dict(_JS_RUNTIMES))
62
70
  merged.setdefault("remote_components", list(_REMOTE_COMPONENTS))
71
+ # Enforce a socket-timeout floor (raise over-aggressive per-call values
72
+ # like 10s), pace extraction requests, and retry transient extractor
73
+ # failures. setdefault lets an explicit larger per-call value still win.
74
+ merged["socket_timeout"] = max(
75
+ int(merged.get("socket_timeout") or 0), _SOURCE_SOCKET_TIMEOUT
76
+ )
77
+ merged.setdefault("sleep_interval_requests", _SOURCE_SLEEP_REQUESTS)
78
+ merged.setdefault("extractor_retries", _SOURCE_EXTRACTOR_RETRIES)
63
79
  super().__init__(merged, *args, **kwargs)
64
80
 
65
81
 
@@ -185,5 +185,5 @@
185
185
  {% endblock %}
186
186
 
187
187
  {% block scripts %}
188
- <script src="/static/js/admin.js"></script>
188
+ <script src="/static/js/admin.js?v={{ app_version }}"></script>
189
189
  {% endblock %}
@@ -65,5 +65,5 @@
65
65
  {% endblock %}
66
66
 
67
67
  {% block scripts %}
68
- <script src="/static/js/admin-playlists.js"></script>
68
+ <script src="/static/js/admin-playlists.js?v={{ app_version }}"></script>
69
69
  {% endblock %}
@@ -41,5 +41,5 @@
41
41
  {% endblock %}
42
42
 
43
43
  {% block scripts %}
44
- <script src="/static/js/admin-promos.js"></script>
44
+ <script src="/static/js/admin-promos.js?v={{ app_version }}"></script>
45
45
  {% endblock %}
@@ -31,5 +31,5 @@
31
31
  {% endblock %}
32
32
 
33
33
  {% block scripts %}
34
- <script src="/static/js/admin-queue-mgmt.js"></script>
34
+ <script src="/static/js/admin-queue-mgmt.js?v={{ app_version }}"></script>
35
35
  {% endblock %}
@@ -21,5 +21,5 @@
21
21
  {% endblock %}
22
22
 
23
23
  {% block scripts %}
24
- <script src="/static/js/admin-schedules.js"></script>
24
+ <script src="/static/js/admin-schedules.js?v={{ app_version }}"></script>
25
25
  {% endblock %}
@@ -23,7 +23,7 @@
23
23
  <link rel="preconnect" href="https://fonts.googleapis.com">
24
24
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
25
25
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap">
26
- <link rel="stylesheet" href="/static/css/main.css">
26
+ <link rel="stylesheet" href="/static/css/main.css?v={{ app_version }}">
27
27
  {% block head %}{% endblock %}
28
28
  </head>
29
29
  <body class="{% block body_class %}{% endblock %}">
@@ -60,8 +60,8 @@
60
60
  <p>&copy; Channel-Z — Powered by <a href="https://github.com/grobertson/kryten-webqueue" target="_blank" rel="noopener">kryten-webqueue</a>{% if app_version %} <span class="footer-version">v{{ app_version }}</span>{% endif %}</p>
61
61
  </footer>
62
62
 
63
- <script src="/static/js/main.js"></script>
64
- <script src="/static/js/keybindings.js"></script>
63
+ <script src="/static/js/main.js?v={{ app_version }}"></script>
64
+ <script src="/static/js/keybindings.js?v={{ app_version }}"></script>
65
65
  {% block scripts %}{% endblock %}
66
66
  </body>
67
67
  </html>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kryten-webqueue"
3
- version = "0.44.0"
3
+ version = "0.44.2"
4
4
  description = "Netflix/Tubi-style catalog browser and pay-to-play queue management for CyTube"
5
5
  readme = "README.md"
6
6
  license = "MIT"