kryten-webqueue 0.34.15__tar.gz → 0.35.0__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 (163) hide show
  1. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/CHANGELOG.md +58 -0
  2. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/PKG-INFO +1 -1
  3. kryten_webqueue-0.35.0/docs/SPEC_CATALOG_ENRICHMENT_PIPELINE.md +681 -0
  4. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/app.py +9 -1
  5. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/db/__init__.py +12 -0
  6. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/db/_catalog.py +83 -12
  7. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/db/_connection.py +52 -0
  8. kryten_webqueue-0.35.0/kryten_webqueue/catalog/db/_enrichment.py +114 -0
  9. kryten_webqueue-0.35.0/kryten_webqueue/catalog/db/_people.py +90 -0
  10. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/__init__.py +30 -0
  11. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/classify.py +343 -0
  12. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/normalise.py +105 -0
  13. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/pipeline.py +235 -0
  14. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/providers.py +401 -0
  15. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/report.py +44 -0
  16. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/steps/__init__.py +8 -0
  17. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/steps/art.py +172 -0
  18. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/steps/categories.py +13 -0
  19. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/steps/meta.py +262 -0
  20. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/steps/sync.py +35 -0
  21. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/steps/tags.py +142 -0
  22. kryten_webqueue-0.35.0/kryten_webqueue/catalog/enrichment/steps/title.py +126 -0
  23. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/jobs/manager.py +12 -2
  24. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/jobs/tasks.py +91 -17
  25. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/admin_catalog.py +25 -0
  26. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/pages.py +18 -2
  27. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/static/css/main.css +23 -0
  28. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/catalog/browse.html +17 -3
  29. kryten_webqueue-0.35.0/kryten_webqueue/templates/catalog/item_detail.html +151 -0
  30. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/pyproject.toml +1 -1
  31. kryten_webqueue-0.35.0/tests/test_classify.py +129 -0
  32. kryten_webqueue-0.35.0/tests/test_people_facets.py +174 -0
  33. kryten_webqueue-0.35.0/tests/test_providers.py +120 -0
  34. kryten_webqueue-0.34.15/kryten_webqueue/templates/catalog/item_detail.html +0 -78
  35. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/.github/workflows/gitleaks.yml +0 -0
  36. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/.github/workflows/python-publish.yml +0 -0
  37. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/.github/workflows/release.yml +0 -0
  38. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/.gitignore +0 -0
  39. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/.gitleaks.toml +0 -0
  40. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/.pre-commit-config.yaml +0 -0
  41. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/AGENT-WORKFLOW-GUIDE.md +0 -0
  42. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/README.md +0 -0
  43. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/config.example.json +0 -0
  44. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/deploy/kryten-webqueue.service +0 -0
  45. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/deploy/nginx-queue.conf +0 -0
  46. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/IMPLEMENTATION_SPEC.md +0 -0
  47. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/IMPL_API_GATE.md +0 -0
  48. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/IMPL_ECONOMY.md +0 -0
  49. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/IMPL_KRYTEN_PY.md +0 -0
  50. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/IMPL_ROBOT.md +0 -0
  51. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/Kryten-Economy Service Quality Survey Report at v0.13.0.md +0 -0
  52. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/Kryten-Webqueue Service Quality Survey Report at v0.27.1.md +0 -0
  53. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/Log for incorrect promo insertion problem.txt +0 -0
  54. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/PLAN_PRESENCE_AND_PROMOS.md +0 -0
  55. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/PRE_PLAN_GAPS.md +0 -0
  56. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/PRODUCT_PLAN.md +0 -0
  57. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/SPEC_EMOTE_REHOST.md +0 -0
  58. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/SPEC_JOBS_AND_BROWSE.md +0 -0
  59. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/docs/UX_POLISH_PLAN.md +0 -0
  60. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/__init__.py +0 -0
  61. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/__main__.py +0 -0
  62. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/api_gate/__init__.py +0 -0
  63. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/api_gate/client.py +0 -0
  64. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/auth/__init__.py +0 -0
  65. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/auth/otp.py +0 -0
  66. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/auth/rate_limit.py +0 -0
  67. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/auth/session.py +0 -0
  68. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/__init__.py +0 -0
  69. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/db/_feedback.py +0 -0
  70. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/db/_playlists.py +0 -0
  71. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/db/_queue.py +0 -0
  72. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/db/_watchlist.py +0 -0
  73. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/images.py +0 -0
  74. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/mediacms.py +0 -0
  75. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/catalog/sync.py +0 -0
  76. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/config.py +0 -0
  77. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/__init__.py +0 -0
  78. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/cmsutils/__init__.py +0 -0
  79. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/cmsutils/_common.py +0 -0
  80. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/cmsutils/enrichmeta.py +0 -0
  81. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/cmsutils/enrichtitles.py +0 -0
  82. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/cmsutils/enrichtv.py +0 -0
  83. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/cmsutils/fetchurls.py +0 -0
  84. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/cmsutils/motdposters.py +0 -0
  85. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/cmsutils/playedmovies.py +0 -0
  86. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/ytpipe/__init__.py +0 -0
  87. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/integrations/ytpipe/downloader.py +0 -0
  88. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/jobs/__init__.py +0 -0
  89. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/jobs/fetchurls_auth.py +0 -0
  90. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/jobs/job_scheduler.py +0 -0
  91. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/jobs/rehost_emotes.py +0 -0
  92. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/logging_config.py +0 -0
  93. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/playlists/__init__.py +0 -0
  94. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/playlists/bulk_add.py +0 -0
  95. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/playlists/fire.py +0 -0
  96. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/playlists/importer.py +0 -0
  97. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/playlists/ordering.py +0 -0
  98. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/playlists/scheduler.py +0 -0
  99. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/promos/__init__.py +0 -0
  100. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/promos/director.py +0 -0
  101. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/queue/__init__.py +0 -0
  102. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/queue/completion.py +0 -0
  103. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/queue/ordering.py +0 -0
  104. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/queue/poller.py +0 -0
  105. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/queue/presence.py +0 -0
  106. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/queue/race_poller.py +0 -0
  107. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/queue/shadow.py +0 -0
  108. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/__init__.py +0 -0
  109. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/admin_feedback.py +0 -0
  110. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/admin_job_schedules.py +0 -0
  111. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/admin_jobs.py +0 -0
  112. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/admin_moderation.py +0 -0
  113. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/admin_playlists.py +0 -0
  114. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/admin_promos.py +0 -0
  115. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/admin_queue.py +0 -0
  116. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/admin_schedules.py +0 -0
  117. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/auth.py +0 -0
  118. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/catalog.py +0 -0
  119. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/feedback.py +0 -0
  120. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/queue.py +0 -0
  121. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/routes/user.py +0 -0
  122. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/static/js/admin-playlists.js +0 -0
  123. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/static/js/admin-promos.js +0 -0
  124. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/static/js/admin-queue-mgmt.js +0 -0
  125. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/static/js/admin-schedules.js +0 -0
  126. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/static/js/admin.js +0 -0
  127. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/static/js/main.js +0 -0
  128. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/admin/index.html +0 -0
  129. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/admin/playlists.html +0 -0
  130. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/admin/promos.html +0 -0
  131. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/admin/queue_mgmt.html +0 -0
  132. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/admin/schedules.html +0 -0
  133. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/auth/login.html +0 -0
  134. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/base.html +0 -0
  135. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/catalog/item_not_found.html +0 -0
  136. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/feedback/index.html +0 -0
  137. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/queue/index.html +0 -0
  138. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/race.html +0 -0
  139. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/user/dashboard.html +0 -0
  140. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/templates/user/my_list.html +0 -0
  141. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/ws/__init__.py +0 -0
  142. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/ws/handler.py +0 -0
  143. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/kryten_webqueue/ws/manager.py +0 -0
  144. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/__init__.py +0 -0
  145. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_config_persistence.py +0 -0
  146. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_feedback.py +0 -0
  147. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_fetchurls_sharepoint.py +0 -0
  148. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_phase1.py +0 -0
  149. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_phase2_jobs.py +0 -0
  150. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_phase3_jobs.py +0 -0
  151. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_phase4_live_fixes.py +0 -0
  152. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_playlist_import.py +0 -0
  153. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_presence_refund.py +0 -0
  154. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_promo_director.py +0 -0
  155. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_promo_pool_exclusion.py +0 -0
  156. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_queue_announce.py +0 -0
  157. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_race_poller.py +0 -0
  158. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_recently_played_hide.py +0 -0
  159. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_save_results_to_playlist.py +0 -0
  160. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_schedule_lock.py +0 -0
  161. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_search_facets.py +0 -0
  162. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_title_normalization.py +0 -0
  163. {kryten_webqueue-0.34.15 → kryten_webqueue-0.35.0}/tests/test_watchlist.py +0 -0
@@ -2,6 +2,64 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.35.0] - 2026-08-13
6
+
7
+ ### Added
8
+
9
+ - **Unified Catalog Enrichment Pipeline** (`kryten_webqueue/catalog/enrichment/`).
10
+ Consolidates `enrichtitles`, `enrichmeta`, `enrichtv`, and the sync-time art
11
+ resolver into a single `CatalogEnrichmentPipeline` with composable, named steps.
12
+
13
+ **Steps:** `sync` → `classify` → `title` → `meta` → `art` → `tags` →
14
+ `categories` (stub, deferred).
15
+
16
+ **Key fixes:**
17
+ - Art step uses `classification.lookup_title` (the extracted film title, e.g.
18
+ `"Phantom of the Mall (1989)"`) instead of the raw CMS title (`"Phantom of
19
+ the Mall Svengoolie"`). Svengoolie, MonsterVision, Last Drive-In, Rifftrax,
20
+ and MST3K items can now resolve TMDB posters correctly.
21
+ - Single `HOSTED_SHOW_REGISTRY` replaces three scattered `_HOSTED_PATTERNS`
22
+ lists; hosted-show detection is now authoritative in `classify.py`.
23
+ - Single `normalise.py` replaces five separate title-cleaning implementations.
24
+ - `meta_json` cached in `item_enrichment_state` carries `poster_url` so art
25
+ and meta share one TMDB call (no double lookup).
26
+ - Meta step populates `catalog_people` / `catalog_studios` tables from TMDB
27
+ credits automatically.
28
+
29
+ **New job:** `catalog_enrich` — full or partial pipeline; params: `steps`,
30
+ `tokens`, `force`, `dry_run`, `limit`, `min_score`.
31
+
32
+ **Backward-compat wrappers:** `enrichtitles`, `enrichmeta`, `enrichtv` now
33
+ delegate to the new pipeline (`steps=classify,title` / `classify,meta`).
34
+
35
+ **Re-enrich button** on the item detail admin panel — force-runs all
36
+ enrichment steps for a single item without touching the cron schedule.
37
+
38
+ **DB migration v19:** `item_enrichment_state` table — per-item cache of
39
+ classification, TMDB/OMDB result, and per-step timestamps.
40
+
41
+ ## [0.34.16] - 2026-08-13
42
+
43
+ ### Added
44
+
45
+ - **Cast, crew, and studio facets.** New M-to-many tables (`people`,
46
+ `catalog_people`, `studios`, `catalog_studios` — migration v18) mirror the
47
+ tag model. Supported roles: `cast`, `director`, `producer`, `writer`.
48
+
49
+ - **Item detail page** shows Director, Cast, Producers, Writer, and Studio
50
+ chip groups. Each chip is a link to `Browse` filtered by that person or
51
+ studio — e.g. clicking James Cameron shows every item he's involved in,
52
+ regardless of role.
53
+
54
+ - **Browse and search** accept `person=` and `studio=` query params and
55
+ filter results via `AND friendly_token IN (...)` subqueries (same pattern
56
+ as category/tag). The active filter is shown as a dismissible banner with
57
+ a **Clear** link. Filter persists across pagination.
58
+
59
+ - **Spec committed** — `docs/SPEC_CATALOG_ENRICHMENT_PIPELINE.md` defines the
60
+ full consolidated enrichment pipeline (Sorties 1–7) that will populate
61
+ these tables automatically.
62
+
5
63
  ## [0.34.15] - 2026-08-13
6
64
 
7
65
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: kryten-webqueue
3
- Version: 0.34.15
3
+ Version: 0.35.0
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