kryten-webqueue 0.38.2__tar.gz → 0.38.4__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 (170) hide show
  1. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/CHANGELOG.md +37 -0
  2. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/PKG-INFO +1 -1
  3. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/static/css/main.css +52 -47
  4. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/static/js/admin.js +12 -8
  5. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/auth/login.html +2 -0
  6. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/pyproject.toml +1 -1
  7. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/.github/workflows/gitleaks.yml +0 -0
  8. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/.github/workflows/python-publish.yml +0 -0
  9. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/.github/workflows/release.yml +0 -0
  10. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/.gitignore +0 -0
  11. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/.gitleaks.toml +0 -0
  12. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/.pre-commit-config.yaml +0 -0
  13. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/AGENT-WORKFLOW-GUIDE.md +0 -0
  14. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/AGENTS.md +0 -0
  15. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/README.md +0 -0
  16. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/config.example.json +0 -0
  17. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/deploy/kryten-webqueue.service +0 -0
  18. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/deploy/nginx-queue.conf +0 -0
  19. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/IMPLEMENTATION_SPEC.md +0 -0
  20. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/IMPL_API_GATE.md +0 -0
  21. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/IMPL_ECONOMY.md +0 -0
  22. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/IMPL_KRYTEN_PY.md +0 -0
  23. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/IMPL_ROBOT.md +0 -0
  24. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/Kryten-Economy Service Quality Survey Report at v0.13.0.md +0 -0
  25. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/Kryten-Webqueue Service Quality Survey Report at v0.27.1.md +0 -0
  26. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/Log for incorrect promo insertion problem.txt +0 -0
  27. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/PLAN_PRESENCE_AND_PROMOS.md +0 -0
  28. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/PRE_PLAN_GAPS.md +0 -0
  29. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/PRODUCT_PLAN.md +0 -0
  30. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/SPEC-Visual-UX-Sprint-August-2026.md +0 -0
  31. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/SPEC_ADMIN_ITEM_EDITOR.md +0 -0
  32. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/SPEC_CATALOG_ENRICHMENT_PIPELINE.md +0 -0
  33. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/SPEC_EMOTE_REHOST.md +0 -0
  34. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/SPEC_JOBS_AND_BROWSE.md +0 -0
  35. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/docs/UX_POLISH_PLAN.md +0 -0
  36. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/__init__.py +0 -0
  37. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/__main__.py +0 -0
  38. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/api_gate/__init__.py +0 -0
  39. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/api_gate/client.py +0 -0
  40. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/app.py +0 -0
  41. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/auth/__init__.py +0 -0
  42. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/auth/otp.py +0 -0
  43. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/auth/rate_limit.py +0 -0
  44. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/auth/session.py +0 -0
  45. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/__init__.py +0 -0
  46. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/db/__init__.py +0 -0
  47. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/db/_catalog.py +0 -0
  48. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/db/_connection.py +0 -0
  49. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/db/_enrichment.py +0 -0
  50. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/db/_feedback.py +0 -0
  51. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/db/_people.py +0 -0
  52. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/db/_playlists.py +0 -0
  53. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/db/_queue.py +0 -0
  54. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/db/_watchlist.py +0 -0
  55. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/__init__.py +0 -0
  56. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/classify.py +0 -0
  57. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/normalise.py +0 -0
  58. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/pipeline.py +0 -0
  59. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/providers.py +0 -0
  60. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/report.py +0 -0
  61. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/steps/__init__.py +0 -0
  62. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/steps/art.py +0 -0
  63. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/steps/categories.py +0 -0
  64. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/steps/meta.py +0 -0
  65. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/steps/sync.py +0 -0
  66. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/steps/tags.py +0 -0
  67. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/enrichment/steps/title.py +0 -0
  68. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/images.py +0 -0
  69. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/mediacms.py +0 -0
  70. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/catalog/sync.py +0 -0
  71. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/config.py +0 -0
  72. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/__init__.py +0 -0
  73. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/cmsutils/__init__.py +0 -0
  74. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/cmsutils/_common.py +0 -0
  75. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/cmsutils/enrichmeta.py +0 -0
  76. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/cmsutils/enrichtitles.py +0 -0
  77. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/cmsutils/enrichtv.py +0 -0
  78. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/cmsutils/fetchurls.py +0 -0
  79. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/cmsutils/motdposters.py +0 -0
  80. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/cmsutils/playedmovies.py +0 -0
  81. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/ytpipe/__init__.py +0 -0
  82. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/integrations/ytpipe/downloader.py +0 -0
  83. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/jobs/__init__.py +0 -0
  84. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/jobs/fetchurls_auth.py +0 -0
  85. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/jobs/job_scheduler.py +0 -0
  86. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/jobs/manager.py +0 -0
  87. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/jobs/rehost_emotes.py +0 -0
  88. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/jobs/tasks.py +0 -0
  89. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/logging_config.py +0 -0
  90. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/playlists/__init__.py +0 -0
  91. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/playlists/bulk_add.py +0 -0
  92. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/playlists/fire.py +0 -0
  93. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/playlists/importer.py +0 -0
  94. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/playlists/ordering.py +0 -0
  95. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/playlists/scheduler.py +0 -0
  96. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/promos/__init__.py +0 -0
  97. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/promos/director.py +0 -0
  98. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/queue/__init__.py +0 -0
  99. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/queue/completion.py +0 -0
  100. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/queue/ordering.py +0 -0
  101. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/queue/poller.py +0 -0
  102. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/queue/presence.py +0 -0
  103. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/queue/race_poller.py +0 -0
  104. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/queue/shadow.py +0 -0
  105. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/__init__.py +0 -0
  106. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/admin_catalog.py +0 -0
  107. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/admin_feedback.py +0 -0
  108. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/admin_job_schedules.py +0 -0
  109. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/admin_jobs.py +0 -0
  110. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/admin_moderation.py +0 -0
  111. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/admin_playlists.py +0 -0
  112. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/admin_promos.py +0 -0
  113. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/admin_queue.py +0 -0
  114. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/admin_schedules.py +0 -0
  115. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/auth.py +0 -0
  116. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/catalog.py +0 -0
  117. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/feedback.py +0 -0
  118. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/pages.py +0 -0
  119. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/queue.py +0 -0
  120. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/routes/user.py +0 -0
  121. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/static/js/admin-playlists.js +0 -0
  122. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/static/js/admin-promos.js +0 -0
  123. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/static/js/admin-queue-mgmt.js +0 -0
  124. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/static/js/admin-schedules.js +0 -0
  125. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/static/js/main.js +0 -0
  126. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/admin/index.html +0 -0
  127. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/admin/playlists.html +0 -0
  128. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/admin/promos.html +0 -0
  129. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/admin/queue_mgmt.html +0 -0
  130. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/admin/schedules.html +0 -0
  131. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/base.html +0 -0
  132. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/catalog/browse.html +0 -0
  133. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/catalog/edit_item_modal.html +0 -0
  134. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/catalog/item_detail.html +0 -0
  135. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/catalog/item_not_found.html +0 -0
  136. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/feedback/index.html +0 -0
  137. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/queue/index.html +0 -0
  138. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/race.html +0 -0
  139. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/user/dashboard.html +0 -0
  140. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/templates/user/my_list.html +0 -0
  141. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/ws/__init__.py +0 -0
  142. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/ws/handler.py +0 -0
  143. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/kryten_webqueue/ws/manager.py +0 -0
  144. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/scripts/AGENTS.md +0 -0
  145. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/scripts/patch_mediacms_bulk_facets.py +0 -0
  146. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/scripts/patch_mediacms_tags.py +0 -0
  147. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/scripts/trigger_enrich.py +0 -0
  148. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/__init__.py +0 -0
  149. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_classify.py +0 -0
  150. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_config_persistence.py +0 -0
  151. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_feedback.py +0 -0
  152. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_fetchurls_sharepoint.py +0 -0
  153. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_people_facets.py +0 -0
  154. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_phase1.py +0 -0
  155. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_phase2_jobs.py +0 -0
  156. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_phase3_jobs.py +0 -0
  157. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_phase4_live_fixes.py +0 -0
  158. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_playlist_import.py +0 -0
  159. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_presence_refund.py +0 -0
  160. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_promo_director.py +0 -0
  161. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_promo_pool_exclusion.py +0 -0
  162. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_providers.py +0 -0
  163. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_queue_announce.py +0 -0
  164. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_race_poller.py +0 -0
  165. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_recently_played_hide.py +0 -0
  166. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_save_results_to_playlist.py +0 -0
  167. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_schedule_lock.py +0 -0
  168. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_search_facets.py +0 -0
  169. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_title_normalization.py +0 -0
  170. {kryten_webqueue-0.38.2 → kryten_webqueue-0.38.4}/tests/test_watchlist.py +0 -0
@@ -2,6 +2,43 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.38.4] - 2026-08-15
6
+
7
+ ### Changed
8
+
9
+ - **Admin job action buttons now sit in fixed, aligned columns.** The action rail
10
+ is a fixed three-column grid: Run/Begin (col 1), edit-schedule (col 2, empty
11
+ placeholder when no schedule exists), and a toggling add/delete-schedule button
12
+ (col 3). Buttons line up across every row regardless of schedule state. Dropped
13
+ the trailing ellipsis from the "Begin"/"Running" labels for a more uniform look,
14
+ and the delete-schedule button now uses the standard `btn-danger` style instead
15
+ of an inline (and mis-named) color variable.
16
+
17
+ ## [0.38.3] - 2026-08-15
18
+
19
+ ### Changed
20
+
21
+ - **Reverted to sans-serif everywhere.** The 0.38.0 serif experiment (Georgia for
22
+ body and headings) was reverted; `--font-body` and `--font-heading` now use the
23
+ same Inter sans stack as the rest of the UI.
24
+ - **Restored the colored light-mode pills.** The 0.38.0 light-mode "contrast"
25
+ overrides that flattened every `.np-chip-*` to solid amber were removed, bringing
26
+ back the mint-green people and peach tag pills in light mode. All pills keep their
27
+ colored translucent styles in both themes.
28
+ - **Pill-shaped badges.** `.qi-badge` and `.job-badge` were rounded from 3px to full
29
+ 999px pills to match the catalog/queue chips.
30
+
31
+ ### Fixed
32
+
33
+ - **Login title now centers.** The Channel-Z Unicode title rendered at the default
34
+ h1 size overflowed the 400px auth container (with `white-space: nowrap`), so it
35
+ could not center. It now uses a clamped `font-size` that fits and centers.
36
+ - **Admin jobs list is a real aligned grid.** Previously each row was its own grid,
37
+ so the status/last-run/action columns never lined up. `.jobs-list` is now the
38
+ shared grid and rows use `display: contents`, so buttons and timestamps align in
39
+ columns across every row. Job badges are more visible and the last-run timestamp
40
+ is larger (0.75rem -> 0.9rem).
41
+
5
42
  ## [0.38.2] - 2026-08-15
6
43
 
7
44
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: kryten-webqueue
3
- Version: 0.38.2
3
+ Version: 0.38.4
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
@@ -21,8 +21,8 @@
21
21
  --shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
22
22
  --radius: 8px;
23
23
  --nav-height: 4rem;
24
- --font-body: Georgia, 'Times New Roman', serif;
25
- --font-heading: Georgia, 'Times New Roman', serif;
24
+ --font-body: 'Inter', 'Helvetica Neue', 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, sans-serif;
25
+ --font-heading: 'Inter', 'Helvetica Neue', 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, sans-serif;
26
26
  --font-ui: 'Inter', 'Helvetica Neue', 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, sans-serif;
27
27
  --font-mono: 'Consolas', 'Courier New', monospace;
28
28
  }
@@ -65,35 +65,9 @@
65
65
  --shadow: 0 4px 12px rgba(60, 40, 0, 0.15);
66
66
  }
67
67
 
68
- /* Light mode contrast overrides for pills, badges, chips */
69
- :root[data-theme="light"] .job-badge {
70
- color: var(--text-primary);
71
- background: var(--bg-secondary);
72
- border: 1px solid var(--border);
73
- }
74
-
75
- :root[data-theme="light"] .np-chip-cat,
76
- :root[data-theme="light"] .np-chip-tag,
77
- :root[data-theme="light"] .np-chip-person,
78
- :root[data-theme="light"] .np-chip-studio {
79
- background: var(--accent);
80
- color: var(--accent-text);
81
- border-color: var(--accent);
82
- font-weight: 600;
83
- }
84
-
85
- :root[data-theme="light"] .qi-badge,
86
- :root[data-theme="light"] .badge-paid {
87
- background: var(--accent);
88
- color: var(--accent-text);
89
- font-weight: 600;
90
- }
91
-
92
- :root[data-theme="light"] .badge-promo {
93
- background: var(--warning);
94
- color: #ffffff;
95
- font-weight: 600;
96
- }
68
+ /* Pills, badges, and chips keep their colored styles in both themes
69
+ (mint-green people, peach tags, etc.). Their translucent backgrounds and
70
+ colored borders read correctly on the light cream surfaces too. */
97
71
 
98
72
  * {
99
73
  margin: 0;
@@ -713,7 +687,7 @@ a:hover {
713
687
  .qi-badge {
714
688
  font-size: 0.85rem;
715
689
  padding: 0.2rem 0.6rem;
716
- border-radius: 3px;
690
+ border-radius: 999px;
717
691
  background: var(--accent);
718
692
  color: var(--accent-text);
719
693
  }
@@ -1310,41 +1284,72 @@ a.np-chip {
1310
1284
 
1311
1285
  /* Jobs */
1312
1286
  .jobs-list {
1313
- display: flex;
1314
- flex-direction: column;
1315
- gap: 0.5rem;
1287
+ display: grid;
1288
+ grid-template-columns: minmax(0, 1fr) auto auto;
1289
+ align-items: stretch;
1290
+ gap: 0.4rem 1.25rem;
1316
1291
  margin-bottom: 1rem;
1317
1292
  }
1293
+ /* Each row spreads its three cells across the shared grid so the status,
1294
+ last-run, and action columns line up across every row. */
1318
1295
  .job-row {
1319
- display: grid;
1320
- grid-template-columns: minmax(0, 1fr) auto auto auto;
1321
- gap: 0.75rem;
1322
- align-items: center;
1323
- padding: 0.5rem 0.75rem;
1296
+ display: contents;
1297
+ }
1298
+ .job-row > * {
1324
1299
  background: var(--bg-card);
1300
+ padding: 0.55rem 0.75rem;
1325
1301
  border-radius: var(--radius);
1302
+ display: flex;
1303
+ align-items: center;
1326
1304
  }
1327
1305
  .job-label {
1328
1306
  min-width: 0;
1307
+ gap: 0.4rem;
1329
1308
  overflow: hidden;
1330
- text-overflow: ellipsis;
1309
+ }
1310
+ /* Fixed three-column button rail so Run / edit-schedule / add-delete line up
1311
+ across every row, whether or not a schedule exists (empty slots hold space). */
1312
+ .job-actions {
1313
+ display: grid;
1314
+ grid-template-columns: 5rem 2.4rem 2.4rem;
1315
+ gap: 0.4rem;
1316
+ justify-content: end;
1317
+ align-items: center;
1318
+ }
1319
+ .job-actions > .btn {
1320
+ width: 100%;
1321
+ padding-left: 0.35rem;
1322
+ padding-right: 0.35rem;
1323
+ text-align: center;
1331
1324
  }
1332
1325
  .job-badge {
1333
- font-size: 0.85rem;
1326
+ font-family: var(--font-ui);
1327
+ font-size: 0.8rem;
1328
+ font-weight: 600;
1334
1329
  text-transform: uppercase;
1335
1330
  letter-spacing: 0.04em;
1336
- padding: 0.2rem 0.6rem;
1337
- border-radius: 3px;
1338
- background: var(--bg-elevated, #222);
1339
- color: var(--text-secondary);
1331
+ padding: 0.2rem 0.65rem;
1332
+ border-radius: 999px;
1333
+ background: rgba(232, 150, 16, 0.15);
1334
+ color: var(--accent);
1335
+ border: 1px solid var(--accent);
1340
1336
  white-space: nowrap;
1341
1337
  }
1342
1338
  .job-last-run {
1343
- font-size: 0.75rem;
1339
+ font-size: 0.9rem;
1344
1340
  color: var(--text-secondary);
1345
1341
  white-space: nowrap;
1346
1342
  font-variant-numeric: tabular-nums;
1347
1343
  }
1344
+ @media (max-width: 640px) {
1345
+ .jobs-list {
1346
+ grid-template-columns: 1fr;
1347
+ gap: 0.25rem;
1348
+ }
1349
+ .job-row > .job-actions {
1350
+ justify-content: start;
1351
+ }
1352
+ }
1348
1353
  /* Job Run parameter modal */
1349
1354
  .job-params {
1350
1355
  display: flex;
@@ -262,19 +262,23 @@ async function loadJobs() {
262
262
  const schedBadge = sched
263
263
  ? ` <span class="job-badge" title="${escapeHtml(sched.cron_expression || '')}">${sched.is_active ? 'scheduled' : 'paused'}</span>`
264
264
  : '';
265
- const schedEditBtn = `<button class="btn btn-sm" onclick="openScheduleModal('${j.name}')" title="${sched ? 'Edit schedule' : 'Create schedule'}">${sched ? (sched.is_active ? '\u23f0' : '\u23f8') : '\u2295'}</button>`;
266
- const schedDelBtn = sched
267
- ? `<button class="btn btn-sm" onclick="removeJobSchedule('${j.name}')" title="Remove schedule" style="color:var(--color-danger)">\u00d7</button>`
268
- : '';
265
+ // Column 2: edit an existing schedule. When none exists this is an
266
+ // empty placeholder so the add/delete toggle stays anchored in column 3.
267
+ const schedEditBtn = sched
268
+ ? `<button class="btn btn-sm" onclick="openScheduleModal('${j.name}')" title="Edit schedule">${sched.is_active ? '\u23f0' : '\u23f8'}</button>`
269
+ : '<span class="job-action-empty"></span>';
270
+ // Column 3: toggles between "add schedule" (none) and "delete schedule".
271
+ const schedToggleBtn = sched
272
+ ? `<button class="btn btn-sm btn-danger" onclick="removeJobSchedule('${j.name}')" title="Delete schedule">\u00d7</button>`
273
+ : `<button class="btn btn-sm" onclick="openScheduleModal('${j.name}')" title="Add schedule">\u2295</button>`;
269
274
  return `
270
275
  <div class="job-row">
271
276
  <span class="job-label">${escapeHtml(j.label)}${hasParams ? ' <span class="job-badge">params</span>' : ''}${schedBadge}</span>
272
277
  ${summary}
273
278
  <div class="job-actions">
274
- <button class="btn btn-sm" onclick="startJob('${j.name}')" ${j.running ? 'disabled' : ''}>
275
- ${j.running ? 'Running\u2026' : (hasParams ? 'Begin\u2026' : 'Run')}
276
- </button>
277
- ${schedEditBtn}${schedDelBtn}
279
+ <button class="btn btn-sm" onclick="startJob('${j.name}')" ${j.running ? 'disabled' : ''}>${j.running ? 'Running' : (hasParams ? 'Begin' : 'Run')}</button>
280
+ ${schedEditBtn}
281
+ ${schedToggleBtn}
278
282
  </div>
279
283
  </div>`;
280
284
  }).join('')
@@ -30,6 +30,8 @@
30
30
  font-weight: 700;
31
31
  white-space: nowrap;
32
32
  letter-spacing: 0.02em;
33
+ font-size: clamp(1.1rem, 5vw, 1.6rem);
34
+ text-align: center;
33
35
  }
34
36
  .login-instructions {
35
37
  font-size: 1.1rem;
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kryten-webqueue"
3
- version = "0.38.2"
3
+ version = "0.38.4"
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"