kryten-webqueue 0.9.10__tar.gz → 0.9.12__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 (89) hide show
  1. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/CHANGELOG.md +12 -0
  2. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/PKG-INFO +1 -1
  3. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/integrations/ytpipe/downloader.py +26 -0
  4. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/pyproject.toml +1 -1
  5. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/.github/workflows/python-publish.yml +0 -0
  6. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/.github/workflows/release.yml +0 -0
  7. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/.gitignore +0 -0
  8. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/README.md +0 -0
  9. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/config.example.json +0 -0
  10. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/deploy/kryten-webqueue.service +0 -0
  11. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/deploy/nginx-queue.conf +0 -0
  12. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/docs/IMPLEMENTATION_SPEC.md +0 -0
  13. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/docs/IMPL_API_GATE.md +0 -0
  14. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/docs/IMPL_ECONOMY.md +0 -0
  15. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/docs/IMPL_KRYTEN_PY.md +0 -0
  16. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/docs/IMPL_ROBOT.md +0 -0
  17. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/docs/PRE_PLAN_GAPS.md +0 -0
  18. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/docs/PRODUCT_PLAN.md +0 -0
  19. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/docs/SPEC_JOBS_AND_BROWSE.md +0 -0
  20. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/__init__.py +0 -0
  21. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/__main__.py +0 -0
  22. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/api_gate/__init__.py +0 -0
  23. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/api_gate/client.py +0 -0
  24. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/app.py +0 -0
  25. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/auth/__init__.py +0 -0
  26. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/auth/otp.py +0 -0
  27. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/auth/rate_limit.py +0 -0
  28. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/auth/session.py +0 -0
  29. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/catalog/__init__.py +0 -0
  30. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/catalog/db.py +0 -0
  31. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/catalog/images.py +0 -0
  32. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/catalog/mediacms.py +0 -0
  33. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/catalog/sync.py +0 -0
  34. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/config.py +0 -0
  35. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/integrations/__init__.py +0 -0
  36. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/integrations/cmsutils/__init__.py +0 -0
  37. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/integrations/cmsutils/_common.py +0 -0
  38. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/integrations/cmsutils/enrichmeta.py +0 -0
  39. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/integrations/cmsutils/enrichtitles.py +0 -0
  40. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/integrations/cmsutils/enrichtv.py +0 -0
  41. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/integrations/cmsutils/fetchurls.py +0 -0
  42. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/integrations/ytpipe/__init__.py +0 -0
  43. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/jobs/__init__.py +0 -0
  44. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/jobs/fetchurls_auth.py +0 -0
  45. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/jobs/manager.py +0 -0
  46. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/jobs/tasks.py +0 -0
  47. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/playlists/__init__.py +0 -0
  48. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/playlists/fire.py +0 -0
  49. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/playlists/importer.py +0 -0
  50. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/playlists/scheduler.py +0 -0
  51. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/queue/__init__.py +0 -0
  52. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/queue/ordering.py +0 -0
  53. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/queue/poller.py +0 -0
  54. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/queue/shadow.py +0 -0
  55. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/__init__.py +0 -0
  56. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/admin_catalog.py +0 -0
  57. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/admin_jobs.py +0 -0
  58. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/admin_playlists.py +0 -0
  59. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/admin_queue.py +0 -0
  60. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/admin_schedules.py +0 -0
  61. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/auth.py +0 -0
  62. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/catalog.py +0 -0
  63. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/pages.py +0 -0
  64. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/queue.py +0 -0
  65. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/routes/user.py +0 -0
  66. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/static/css/main.css +0 -0
  67. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/static/js/main.js +0 -0
  68. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/admin/index.html +0 -0
  69. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/admin/playlists.html +0 -0
  70. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/admin/queue_mgmt.html +0 -0
  71. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/admin/schedules.html +0 -0
  72. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/auth/login.html +0 -0
  73. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/base.html +0 -0
  74. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/catalog/browse.html +0 -0
  75. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/catalog/item_detail.html +0 -0
  76. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/catalog/item_not_found.html +0 -0
  77. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/queue/index.html +0 -0
  78. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/templates/user/dashboard.html +0 -0
  79. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/ws/__init__.py +0 -0
  80. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/ws/handler.py +0 -0
  81. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/kryten_webqueue/ws/manager.py +0 -0
  82. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/tests/__init__.py +0 -0
  83. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/tests/test_fetchurls_sharepoint.py +0 -0
  84. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/tests/test_phase1.py +0 -0
  85. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/tests/test_phase2_jobs.py +0 -0
  86. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/tests/test_phase3_jobs.py +0 -0
  87. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/tests/test_phase4_live_fixes.py +0 -0
  88. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/tests/test_playlist_import.py +0 -0
  89. {kryten_webqueue-0.9.10 → kryten_webqueue-0.9.12}/tests/test_queue_announce.py +0 -0
@@ -6,6 +6,18 @@ 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
  ## [Unreleased]
8
8
 
9
+ ## [0.9.12] — 2026-06-12
10
+
11
+ ### Fixed
12
+
13
+ - **`fetch`/`fetchurls` no longer crash with "Invalid js_runtimes format".** Newer yt-dlp expects `js_runtimes` as a dict of `{runtime: {config}}`, not a list; the vendored downloader now passes `js_runtimes={'deno': {}, 'node': {}}`.
14
+
15
+ ## [0.9.11] — 2026-06-12
16
+
17
+ ### Fixed
18
+
19
+ - **`fetch`/`fetchurls` now enable a Node.js JavaScript runtime for yt-dlp.** yt-dlp needs an external JS runtime to solve YouTube's JS challenges; only `deno` is enabled by default, so hosts with only Node installed hit a "No supported JavaScript runtime could be found" warning and could miss formats. The vendored downloader now passes `js_runtimes=['deno', 'node']` to every yt-dlp call (priority deno > node, so the highest-priority available runtime is used), applied centrally via a thin `YoutubeDL` wrapper.
20
+
9
21
  ## [0.9.10] — 2026-06-12
10
22
 
11
23
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kryten-webqueue
3
- Version: 0.9.10
3
+ Version: 0.9.12
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
@@ -34,6 +34,32 @@ import yt_dlp
34
34
  from slugify import slugify
35
35
 
36
36
 
37
+ # yt-dlp needs an external JavaScript runtime to solve YouTube's JS challenges.
38
+ # Only "deno" is enabled by default; many hosts only have Node installed, which
39
+ # triggers a "No supported JavaScript runtime could be found" warning and missing
40
+ # formats. Enable both (priority order deno > node) so the highest-priority
41
+ # available runtime is used. Applied centrally via a thin YoutubeDL subclass so
42
+ # every extraction/download call in this module gets it without editing each
43
+ # ydl_opts dict. ``setdefault`` means an explicit per-call value still wins.
44
+ #
45
+ # yt-dlp expects ``js_runtimes`` as a dict of ``{runtime: {config}}`` (an empty
46
+ # dict means default config for that runtime); passing a list raises
47
+ # "Invalid js_runtimes format, expected a dict of {runtime: {config}}".
48
+ _JS_RUNTIMES = {"deno": {}, "node": {}}
49
+
50
+
51
+ class _YoutubeDLWithJSRuntimes(yt_dlp.YoutubeDL):
52
+ def __init__(self, params=None, *args, **kwargs): # noqa: D107
53
+ merged = dict(params or {})
54
+ merged.setdefault("js_runtimes", dict(_JS_RUNTIMES))
55
+ super().__init__(merged, *args, **kwargs)
56
+
57
+
58
+ # Route all `yt_dlp.YoutubeDL(...)` calls in this module through the wrapper.
59
+ yt_dlp.YoutubeDL = _YoutubeDLWithJSRuntimes
60
+
61
+
62
+
37
63
  def clean_youtube_url(url: str) -> str:
38
64
  """
39
65
  Clean YouTube URLs by removing Mix/Radio playlist parameters.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kryten-webqueue"
3
- version = "0.9.10"
3
+ version = "0.9.12"
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"