kryten-webqueue 0.6.3__tar.gz → 0.6.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 (67) hide show
  1. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/CHANGELOG.md +8 -0
  2. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/PKG-INFO +1 -1
  3. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/catalog/db.py +18 -2
  4. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/pyproject.toml +1 -1
  5. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/.github/workflows/python-publish.yml +0 -0
  6. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/.github/workflows/release.yml +0 -0
  7. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/.gitignore +0 -0
  8. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/README.md +0 -0
  9. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/config.example.json +0 -0
  10. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/deploy/kryten-webqueue.service +0 -0
  11. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/deploy/nginx-queue.conf +0 -0
  12. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/IMPLEMENTATION_SPEC.md +0 -0
  13. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/IMPL_API_GATE.md +0 -0
  14. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/IMPL_ECONOMY.md +0 -0
  15. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/IMPL_KRYTEN_PY.md +0 -0
  16. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/IMPL_ROBOT.md +0 -0
  17. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/PRE_PLAN_GAPS.md +0 -0
  18. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/PRODUCT_PLAN.md +0 -0
  19. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/__init__.py +0 -0
  20. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/__main__.py +0 -0
  21. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/api_gate/__init__.py +0 -0
  22. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/api_gate/client.py +0 -0
  23. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/app.py +0 -0
  24. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/auth/__init__.py +0 -0
  25. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/auth/otp.py +0 -0
  26. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/auth/rate_limit.py +0 -0
  27. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/auth/session.py +0 -0
  28. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/catalog/__init__.py +0 -0
  29. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/catalog/images.py +0 -0
  30. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/catalog/sync.py +0 -0
  31. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/config.py +0 -0
  32. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/jobs/__init__.py +0 -0
  33. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/jobs/manager.py +0 -0
  34. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/playlists/__init__.py +0 -0
  35. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/playlists/fire.py +0 -0
  36. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/playlists/importer.py +0 -0
  37. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/playlists/scheduler.py +0 -0
  38. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/queue/__init__.py +0 -0
  39. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/queue/ordering.py +0 -0
  40. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/queue/poller.py +0 -0
  41. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/queue/shadow.py +0 -0
  42. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/__init__.py +0 -0
  43. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/admin_jobs.py +0 -0
  44. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/admin_playlists.py +0 -0
  45. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/admin_queue.py +0 -0
  46. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/admin_schedules.py +0 -0
  47. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/auth.py +0 -0
  48. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/catalog.py +0 -0
  49. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/pages.py +0 -0
  50. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/queue.py +0 -0
  51. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/user.py +0 -0
  52. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/static/css/main.css +0 -0
  53. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/static/js/main.js +0 -0
  54. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/index.html +0 -0
  55. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/playlists.html +0 -0
  56. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/queue_mgmt.html +0 -0
  57. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/schedules.html +0 -0
  58. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/auth/login.html +0 -0
  59. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/base.html +0 -0
  60. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/catalog/browse.html +0 -0
  61. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/catalog/item_detail.html +0 -0
  62. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/catalog/item_not_found.html +0 -0
  63. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/queue/index.html +0 -0
  64. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/user/dashboard.html +0 -0
  65. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/ws/__init__.py +0 -0
  66. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/ws/handler.py +0 -0
  67. {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/ws/manager.py +0 -0
@@ -4,6 +4,14 @@ 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.4] - 2026-06-08
8
+
9
+ ### Changed
10
+
11
+ - **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.
12
+
13
+ [0.6.4]: https://github.com/grobertson/kryten-webqueue/releases/tag/v0.6.4
14
+
7
15
  ## [0.6.3] - 2026-06-08
8
16
 
9
17
  ### 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.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
@@ -238,7 +238,8 @@ class Database:
238
238
 
239
239
  async def browse(self, *, category: str | None = None, page: int = 1, per_page: int = 24) -> list[dict]:
240
240
  query = """
241
- SELECT c.friendly_token, c.title, c.duration_sec, c.cover_art_path, c.thumbnail_url, c.manifest_url
241
+ SELECT c.friendly_token, c.title, c.duration_sec, c.cover_art_path, c.thumbnail_url, c.manifest_url,
242
+ (SELECT COUNT(*) FROM queue_history qh WHERE qh.friendly_token = c.friendly_token) AS play_count
242
243
  FROM catalog c
243
244
  WHERE c.friendly_token NOT IN (
244
245
  SELECT spi.media_id FROM saved_playlist_items spi
@@ -256,7 +257,22 @@ class Database:
256
257
  )
257
258
  """
258
259
  params.append(category)
259
- query += " ORDER BY c.title ASC LIMIT ? OFFSET ?"
260
+ # Quality-weighted ordering so the landing page leads with presentable
261
+ # items instead of alphabetical junk. No curation required — every signal
262
+ # is derived from existing data:
263
+ # 1. Items with box art (cover or thumbnail) first.
264
+ # 2. Then by real popularity (times queued).
265
+ # 3. Titles beginning with a letter before number/symbol-prefixed
266
+ # "02 - Episode" style entries.
267
+ # 4. Finally alphabetical for a stable, predictable tail.
268
+ query += """
269
+ ORDER BY
270
+ (c.cover_art_path IS NOT NULL OR c.thumbnail_url IS NOT NULL) DESC,
271
+ play_count DESC,
272
+ (CASE WHEN c.title GLOB '[A-Za-z]*' THEN 0 ELSE 1 END) ASC,
273
+ c.title ASC
274
+ LIMIT ? OFFSET ?
275
+ """
260
276
  params.extend([per_page, (page - 1) * per_page])
261
277
  return await self._fetch_all(query, params)
262
278
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kryten-webqueue"
3
- version = "0.6.3"
3
+ version = "0.6.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"