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.
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/CHANGELOG.md +8 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/PKG-INFO +1 -1
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/catalog/db.py +18 -2
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/pyproject.toml +1 -1
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/.github/workflows/python-publish.yml +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/.github/workflows/release.yml +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/.gitignore +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/README.md +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/config.example.json +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/deploy/kryten-webqueue.service +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/deploy/nginx-queue.conf +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/IMPLEMENTATION_SPEC.md +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/IMPL_API_GATE.md +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/IMPL_ECONOMY.md +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/IMPL_KRYTEN_PY.md +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/IMPL_ROBOT.md +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/PRE_PLAN_GAPS.md +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/docs/PRODUCT_PLAN.md +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/__init__.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/__main__.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/api_gate/__init__.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/api_gate/client.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/app.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/auth/__init__.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/auth/otp.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/auth/rate_limit.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/auth/session.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/catalog/__init__.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/catalog/images.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/catalog/sync.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/config.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/jobs/__init__.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/jobs/manager.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/playlists/__init__.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/playlists/fire.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/playlists/importer.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/playlists/scheduler.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/queue/__init__.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/queue/ordering.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/queue/poller.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/queue/shadow.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/__init__.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/admin_jobs.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/admin_playlists.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/admin_queue.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/admin_schedules.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/auth.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/catalog.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/pages.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/queue.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/routes/user.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/static/css/main.css +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/static/js/main.js +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/index.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/playlists.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/queue_mgmt.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/schedules.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/auth/login.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/base.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/catalog/browse.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/catalog/item_detail.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/catalog/item_not_found.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/queue/index.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/user/dashboard.html +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/ws/__init__.py +0 -0
- {kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/ws/handler.py +0 -0
- {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
|
|
@@ -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
|
-
|
|
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
|
|
|
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.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/playlists.html
RENAMED
|
File without changes
|
{kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/queue_mgmt.html
RENAMED
|
File without changes
|
{kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/admin/schedules.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/catalog/browse.html
RENAMED
|
File without changes
|
{kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/catalog/item_detail.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kryten_webqueue-0.6.3 → kryten_webqueue-0.6.4}/kryten_webqueue/templates/user/dashboard.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|