kryten-webqueue 0.6.4__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.
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/CHANGELOG.md +8 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/PKG-INFO +1 -1
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/catalog/db.py +10 -8
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/pyproject.toml +1 -1
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/.github/workflows/python-publish.yml +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/.github/workflows/release.yml +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/.gitignore +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/README.md +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/config.example.json +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/deploy/kryten-webqueue.service +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/deploy/nginx-queue.conf +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/docs/IMPLEMENTATION_SPEC.md +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/docs/IMPL_API_GATE.md +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/docs/IMPL_ECONOMY.md +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/docs/IMPL_KRYTEN_PY.md +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/docs/IMPL_ROBOT.md +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/docs/PRE_PLAN_GAPS.md +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/docs/PRODUCT_PLAN.md +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/__init__.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/__main__.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/api_gate/__init__.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/api_gate/client.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/app.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/auth/__init__.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/auth/otp.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/auth/rate_limit.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/auth/session.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/catalog/__init__.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/catalog/images.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/catalog/sync.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/config.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/jobs/__init__.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/jobs/manager.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/playlists/__init__.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/playlists/fire.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/playlists/importer.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/playlists/scheduler.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/queue/__init__.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/queue/ordering.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/queue/poller.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/queue/shadow.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/__init__.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/admin_jobs.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/admin_playlists.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/admin_queue.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/admin_schedules.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/auth.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/catalog.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/pages.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/queue.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/routes/user.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/static/css/main.css +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/static/js/main.js +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/index.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/playlists.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/queue_mgmt.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/schedules.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/auth/login.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/base.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/catalog/browse.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/catalog/item_detail.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/catalog/item_not_found.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/queue/index.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/user/dashboard.html +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/ws/__init__.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/ws/handler.py +0 -0
- {kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/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.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
|
+
|
|
7
15
|
## [0.6.4] - 2026-06-08
|
|
8
16
|
|
|
9
17
|
### Changed
|
|
@@ -238,8 +238,7 @@ 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
|
|
242
|
-
(SELECT COUNT(*) FROM queue_history qh WHERE qh.friendly_token = c.friendly_token) AS play_count
|
|
241
|
+
SELECT c.friendly_token, c.title, c.duration_sec, c.cover_art_path, c.thumbnail_url, c.manifest_url
|
|
243
242
|
FROM catalog c
|
|
244
243
|
WHERE c.friendly_token NOT IN (
|
|
245
244
|
SELECT spi.media_id FROM saved_playlist_items spi
|
|
@@ -260,15 +259,18 @@ class Database:
|
|
|
260
259
|
# Quality-weighted ordering so the landing page leads with presentable
|
|
261
260
|
# items instead of alphabetical junk. No curation required — every signal
|
|
262
261
|
# is derived from existing data:
|
|
263
|
-
# 1. Items with box art
|
|
264
|
-
#
|
|
265
|
-
#
|
|
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
|
|
266
269
|
# "02 - Episode" style entries.
|
|
267
|
-
#
|
|
270
|
+
# 3. Finally alphabetical for a stable, predictable tail.
|
|
268
271
|
query += """
|
|
269
272
|
ORDER BY
|
|
270
|
-
(c.
|
|
271
|
-
play_count DESC,
|
|
273
|
+
(c.cover_art_source IN ('tmdb', 'omdb')) DESC,
|
|
272
274
|
(CASE WHEN c.title GLOB '[A-Za-z]*' THEN 0 ELSE 1 END) ASC,
|
|
273
275
|
c.title ASC
|
|
274
276
|
LIMIT ? OFFSET ?
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/playlists.html
RENAMED
|
File without changes
|
{kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/queue_mgmt.html
RENAMED
|
File without changes
|
{kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/admin/schedules.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/catalog/browse.html
RENAMED
|
File without changes
|
{kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/catalog/item_detail.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kryten_webqueue-0.6.4 → kryten_webqueue-0.6.5}/kryten_webqueue/templates/user/dashboard.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|