kryten-webqueue 0.4.5__tar.gz → 0.4.6__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 (62) hide show
  1. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/CHANGELOG.md +8 -0
  2. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/PKG-INFO +1 -1
  3. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/queue/ordering.py +8 -4
  4. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/routes/queue.py +4 -2
  5. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/pyproject.toml +1 -1
  6. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/.github/workflows/python-publish.yml +0 -0
  7. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/.github/workflows/release.yml +0 -0
  8. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/.gitignore +0 -0
  9. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/README.md +0 -0
  10. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/config.example.json +0 -0
  11. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/deploy/kryten-webqueue.service +0 -0
  12. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/deploy/nginx-queue.conf +0 -0
  13. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/docs/IMPLEMENTATION_SPEC.md +0 -0
  14. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/docs/IMPL_API_GATE.md +0 -0
  15. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/docs/IMPL_ECONOMY.md +0 -0
  16. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/docs/IMPL_KRYTEN_PY.md +0 -0
  17. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/docs/IMPL_ROBOT.md +0 -0
  18. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/docs/PRE_PLAN_GAPS.md +0 -0
  19. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/docs/PRODUCT_PLAN.md +0 -0
  20. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/__init__.py +0 -0
  21. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/__main__.py +0 -0
  22. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/api_gate/__init__.py +0 -0
  23. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/api_gate/client.py +0 -0
  24. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/app.py +0 -0
  25. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/auth/__init__.py +0 -0
  26. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/auth/otp.py +0 -0
  27. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/auth/rate_limit.py +0 -0
  28. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/auth/session.py +0 -0
  29. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/catalog/__init__.py +0 -0
  30. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/catalog/db.py +0 -0
  31. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/catalog/images.py +0 -0
  32. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/catalog/sync.py +0 -0
  33. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/config.py +0 -0
  34. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/playlists/__init__.py +0 -0
  35. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/playlists/fire.py +0 -0
  36. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/playlists/importer.py +0 -0
  37. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/playlists/scheduler.py +0 -0
  38. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/queue/__init__.py +0 -0
  39. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/queue/poller.py +0 -0
  40. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/queue/shadow.py +0 -0
  41. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/routes/__init__.py +0 -0
  42. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/routes/admin_playlists.py +0 -0
  43. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/routes/admin_queue.py +0 -0
  44. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/routes/admin_schedules.py +0 -0
  45. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/routes/auth.py +0 -0
  46. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/routes/catalog.py +0 -0
  47. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/routes/pages.py +0 -0
  48. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/routes/user.py +0 -0
  49. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/static/css/main.css +0 -0
  50. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/static/js/main.js +0 -0
  51. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/templates/admin/index.html +0 -0
  52. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/templates/admin/playlists.html +0 -0
  53. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/templates/admin/queue_mgmt.html +0 -0
  54. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/templates/admin/schedules.html +0 -0
  55. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/templates/auth/login.html +0 -0
  56. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/templates/base.html +0 -0
  57. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/templates/catalog/browse.html +0 -0
  58. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/templates/queue/index.html +0 -0
  59. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/templates/user/dashboard.html +0 -0
  60. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/ws/__init__.py +0 -0
  61. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/ws/handler.py +0 -0
  62. {kryten_webqueue-0.4.5 → kryten_webqueue-0.4.6}/kryten_webqueue/ws/manager.py +0 -0
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
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
7
 
8
+ ## [0.4.6] - 2026-06-04
9
+
10
+ ### Fixed
11
+
12
+ - **Wrong media ID sent to CyTube** — `/queue/add` and `/queue/playnext` were passing `friendly_token` (the MediaCMS slug, e.g. `"my-movie-2024"`) as the `id` field for CyTube custom media type `"cm"`. CyTube requires the manifest URL as the ID; the slug was silently rejected, the `queue` confirmation event never fired, the Robot waited 8 seconds, and kryten-py's matching 8-second timeout fired first giving a 504. Fixed by passing `item["manifest_url"]` as `media_id` to CyTube and threading `friendly_token` separately through `insert_pay_queue` / `insert_pay_playnext` for spend/history records
13
+
14
+ [0.4.6]: https://github.com/grobertson/kryten-webqueue/releases/tag/v0.4.6
15
+
8
16
  ## [0.4.5] - 2026-06-04
9
17
 
10
18
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kryten-webqueue
3
- Version: 0.4.5
3
+ Version: 0.4.6
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
@@ -18,6 +18,7 @@ async def insert_pay_queue(
18
18
  username: str,
19
19
  media_type: str,
20
20
  media_id: str,
21
+ friendly_token: str | None = None,
21
22
  title: str,
22
23
  duration_sec: int,
23
24
  tier: str,
@@ -71,9 +72,10 @@ async def insert_pay_queue(
71
72
  await api_gate.playlist_move(uid, last_pay_uid)
72
73
 
73
74
  # Record spend
75
+ _ft = friendly_token if friendly_token is not None else (media_id if media_type == "cm" else None)
74
76
  await db.save_spend_request(
75
77
  request_id, username=username, uid=uid,
76
- friendly_token=media_id if media_type == "cm" else None,
78
+ friendly_token=_ft,
77
79
  tier=tier, z_cost=z_cost,
78
80
  )
79
81
 
@@ -99,7 +101,7 @@ async def insert_pay_queue(
99
101
 
100
102
  # Queue history
101
103
  await db.add_queue_history(
102
- username=username, friendly_token=media_id if media_type == "cm" else None,
104
+ username=username, friendly_token=_ft,
103
105
  title=title, tier=tier, z_cost=z_cost,
104
106
  )
105
107
 
@@ -114,6 +116,7 @@ async def insert_pay_playnext(
114
116
  username: str,
115
117
  media_type: str,
116
118
  media_id: str,
119
+ friendly_token: str | None = None,
117
120
  title: str,
118
121
  duration_sec: int,
119
122
  tier: str,
@@ -161,9 +164,10 @@ async def insert_pay_playnext(
161
164
  await api_gate.playlist_move(uid, "prepend")
162
165
 
163
166
  # Record spend
167
+ _ft = friendly_token if friendly_token is not None else (media_id if media_type == "cm" else None)
164
168
  await db.save_spend_request(
165
169
  request_id, username=username, uid=uid,
166
- friendly_token=media_id if media_type == "cm" else None,
170
+ friendly_token=_ft,
167
171
  tier=tier, z_cost=z_cost,
168
172
  )
169
173
 
@@ -183,7 +187,7 @@ async def insert_pay_playnext(
183
187
  await shadow.insert_at(item, 0)
184
188
 
185
189
  await db.add_queue_history(
186
- username=username, friendly_token=media_id if media_type == "cm" else None,
190
+ username=username, friendly_token=_ft,
187
191
  title=title, tier=tier, z_cost=z_cost,
188
192
  )
189
193
 
@@ -56,7 +56,8 @@ async def add_to_queue(request: Request, user: dict = Depends(get_current_user))
56
56
  db=db,
57
57
  username=user["username"],
58
58
  media_type="cm",
59
- media_id=friendly_token,
59
+ media_id=item["manifest_url"],
60
+ friendly_token=friendly_token,
60
61
  title=item["title"],
61
62
  duration_sec=item["duration_sec"],
62
63
  tier=tier,
@@ -111,7 +112,8 @@ async def play_next(request: Request, user: dict = Depends(get_current_user)):
111
112
  db=db,
112
113
  username=user["username"],
113
114
  media_type="cm",
114
- media_id=friendly_token,
115
+ media_id=item["manifest_url"],
116
+ friendly_token=friendly_token,
115
117
  title=item["title"],
116
118
  duration_sec=item["duration_sec"],
117
119
  tier=tier,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kryten-webqueue"
3
- version = "0.4.5"
3
+ version = "0.4.6"
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"