kryten-webqueue 0.6.3__tar.gz → 0.6.5__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 (67) hide show
  1. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/CHANGELOG.md +16 -0
  2. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/PKG-INFO +1 -1
  3. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/catalog/db.py +19 -1
  4. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/pyproject.toml +1 -1
  5. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/.github/workflows/python-publish.yml +0 -0
  6. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/.github/workflows/release.yml +0 -0
  7. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/.gitignore +0 -0
  8. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/README.md +0 -0
  9. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/config.example.json +0 -0
  10. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/deploy/kryten-webqueue.service +0 -0
  11. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/deploy/nginx-queue.conf +0 -0
  12. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/docs/IMPLEMENTATION_SPEC.md +0 -0
  13. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/docs/IMPL_API_GATE.md +0 -0
  14. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/docs/IMPL_ECONOMY.md +0 -0
  15. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/docs/IMPL_KRYTEN_PY.md +0 -0
  16. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/docs/IMPL_ROBOT.md +0 -0
  17. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/docs/PRE_PLAN_GAPS.md +0 -0
  18. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/docs/PRODUCT_PLAN.md +0 -0
  19. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/__init__.py +0 -0
  20. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/__main__.py +0 -0
  21. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/api_gate/__init__.py +0 -0
  22. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/api_gate/client.py +0 -0
  23. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/app.py +0 -0
  24. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/auth/__init__.py +0 -0
  25. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/auth/otp.py +0 -0
  26. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/auth/rate_limit.py +0 -0
  27. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/auth/session.py +0 -0
  28. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/catalog/__init__.py +0 -0
  29. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/catalog/images.py +0 -0
  30. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/catalog/sync.py +0 -0
  31. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/config.py +0 -0
  32. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/jobs/__init__.py +0 -0
  33. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/jobs/manager.py +0 -0
  34. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/playlists/__init__.py +0 -0
  35. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/playlists/fire.py +0 -0
  36. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/playlists/importer.py +0 -0
  37. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/playlists/scheduler.py +0 -0
  38. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/queue/__init__.py +0 -0
  39. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/queue/ordering.py +0 -0
  40. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/queue/poller.py +0 -0
  41. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/queue/shadow.py +0 -0
  42. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/__init__.py +0 -0
  43. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/admin_jobs.py +0 -0
  44. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/admin_playlists.py +0 -0
  45. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/admin_queue.py +0 -0
  46. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/admin_schedules.py +0 -0
  47. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/auth.py +0 -0
  48. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/catalog.py +0 -0
  49. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/pages.py +0 -0
  50. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/queue.py +0 -0
  51. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/user.py +0 -0
  52. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/static/css/main.css +0 -0
  53. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/static/js/main.js +0 -0
  54. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/index.html +0 -0
  55. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/playlists.html +0 -0
  56. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/queue_mgmt.html +0 -0
  57. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/schedules.html +0 -0
  58. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/auth/login.html +0 -0
  59. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/base.html +0 -0
  60. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/catalog/browse.html +0 -0
  61. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/catalog/item_detail.html +0 -0
  62. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/catalog/item_not_found.html +0 -0
  63. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/queue/index.html +0 -0
  64. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/user/dashboard.html +0 -0
  65. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/ws/__init__.py +0 -0
  66. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/ws/handler.py +0 -0
  67. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.5}/kryten_webqueue/ws/manager.py +0 -0
@@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+ ## [0.6.5] - 2026-06-08
8
+
9
+ ### Changed
10
+
11
+ - **Refined catalog browse ordering** — Tightened the quality-weighted sort introduced in 0.6.4 based on feedback. (1) Dropped the popularity (times-queued) tier, which discouraged discovery. (2) Replaced the weak "has cover art" test with a real-poster signal: items are led by `cover_art_source IN ('tmdb', 'omdb')` rather than mere presence of a `cover_art_path`/`thumbnail_url` — nearly every item carries a MediaCMS thumbnail, and the resolver also caches that thumbnail as a last-resort cover (`cover_art_source = 'thumbnail'`), so the old test was almost always true. A genuine TMDB/OMDB poster match also implies a well-formed, matchable title. Letter-first-then-alphabetical ordering (which correctly sinks `"02 - Episode"` style entries) is retained.
12
+
13
+ [0.6.5]: https://github.com/grobertson/kryten-webqueue/releases/tag/v0.6.5
14
+
15
+ ## [0.6.4] - 2026-06-08
16
+
17
+ ### Changed
18
+
19
+ - **Quality-weighted catalog browse ordering** — The catalog landing no longer leads with alphabetical junk (art-less, number-prefixed "02 - Episode" entries). Browse results are now ranked by signals derived entirely from existing data — no curation or featured-item maintenance required: (1) items with box art (cover or thumbnail) first, (2) then by real popularity (times queued, from `queue_history`), (3) titles beginning with a letter before number/symbol-prefixed titles, (4) then alphabetical for a stable tail. Applies to both the unfiltered landing and category-filtered browse; search continues to use full-text relevance.
20
+
21
+ [0.6.4]: https://github.com/grobertson/kryten-webqueue/releases/tag/v0.6.4
22
+
7
23
  ## [0.6.3] - 2026-06-08
8
24
 
9
25
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kryten-webqueue
3
- Version: 0.6.3
3
+ Version: 0.6.5
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
@@ -256,7 +256,25 @@ class Database:
256
256
  )
257
257
  """
258
258
  params.append(category)
259
- query += " ORDER BY c.title ASC LIMIT ? OFFSET ?"
259
+ # Quality-weighted ordering so the landing page leads with presentable
260
+ # items instead of alphabetical junk. No curation required — every signal
261
+ # is derived from existing data:
262
+ # 1. Items with REAL box art first. The strong signal is a poster match
263
+ # from TMDB/OMDB (cover_art_source), NOT mere presence of a
264
+ # cover_art_path/thumbnail_url — almost every item carries a MediaCMS
265
+ # thumbnail, and the resolver also caches that thumbnail as a
266
+ # last-resort cover (cover_art_source = 'thumbnail'). A genuine
267
+ # poster match also implies a well-formed, matchable title.
268
+ # 2. Titles beginning with a letter before number/symbol-prefixed
269
+ # "02 - Episode" style entries.
270
+ # 3. Finally alphabetical for a stable, predictable tail.
271
+ query += """
272
+ ORDER BY
273
+ (c.cover_art_source IN ('tmdb', 'omdb')) DESC,
274
+ (CASE WHEN c.title GLOB '[A-Za-z]*' THEN 0 ELSE 1 END) ASC,
275
+ c.title ASC
276
+ LIMIT ? OFFSET ?
277
+ """
260
278
  params.extend([per_page, (page - 1) * per_page])
261
279
  return await self._fetch_all(query, params)
262
280
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kryten-webqueue"
3
- version = "0.6.3"
3
+ version = "0.6.5"
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"