kryten-webqueue 0.1.6__tar.gz → 0.2.1__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 (59) hide show
  1. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/PKG-INFO +1 -1
  2. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/config.example.json +1 -1
  3. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/deploy/nginx-queue.conf +12 -2
  4. kryten_webqueue-0.2.1/kryten_webqueue/__main__.py +16 -0
  5. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/routes/pages.py +5 -6
  6. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/pyproject.toml +6 -1
  7. kryten_webqueue-0.1.6/kryten_webqueue/__main__.py +0 -10
  8. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/.github/workflows/python-publish.yml +0 -0
  9. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/.github/workflows/release.yml +0 -0
  10. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/.gitignore +0 -0
  11. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/README.md +0 -0
  12. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/deploy/kryten-webqueue.service +0 -0
  13. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/docs/IMPLEMENTATION_SPEC.md +0 -0
  14. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/docs/IMPL_API_GATE.md +0 -0
  15. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/docs/IMPL_ECONOMY.md +0 -0
  16. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/docs/IMPL_KRYTEN_PY.md +0 -0
  17. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/docs/IMPL_ROBOT.md +0 -0
  18. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/docs/PRE_PLAN_GAPS.md +0 -0
  19. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/docs/PRODUCT_PLAN.md +0 -0
  20. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/__init__.py +0 -0
  21. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/api_gate/__init__.py +0 -0
  22. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/api_gate/client.py +0 -0
  23. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/app.py +0 -0
  24. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/auth/__init__.py +0 -0
  25. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/auth/otp.py +0 -0
  26. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/auth/rate_limit.py +0 -0
  27. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/auth/session.py +0 -0
  28. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/catalog/__init__.py +0 -0
  29. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/catalog/db.py +0 -0
  30. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/catalog/images.py +0 -0
  31. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/catalog/sync.py +0 -0
  32. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/config.py +0 -0
  33. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/playlists/__init__.py +0 -0
  34. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/playlists/fire.py +0 -0
  35. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/playlists/importer.py +0 -0
  36. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/playlists/scheduler.py +0 -0
  37. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/queue/__init__.py +0 -0
  38. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/queue/ordering.py +0 -0
  39. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/queue/poller.py +0 -0
  40. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/queue/shadow.py +0 -0
  41. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/routes/__init__.py +0 -0
  42. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/routes/admin_playlists.py +0 -0
  43. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/routes/admin_queue.py +0 -0
  44. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/routes/admin_schedules.py +0 -0
  45. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/routes/auth.py +0 -0
  46. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/routes/catalog.py +0 -0
  47. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/routes/queue.py +0 -0
  48. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/routes/user.py +0 -0
  49. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/static/css/main.css +0 -0
  50. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/static/js/main.js +0 -0
  51. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/templates/admin/index.html +0 -0
  52. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/templates/auth/login.html +0 -0
  53. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/templates/base.html +0 -0
  54. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/templates/catalog/browse.html +0 -0
  55. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/templates/queue/index.html +0 -0
  56. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/templates/user/dashboard.html +0 -0
  57. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/ws/__init__.py +0 -0
  58. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/ws/handler.py +0 -0
  59. {kryten_webqueue-0.1.6 → kryten_webqueue-0.2.1}/kryten_webqueue/ws/manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kryten-webqueue
3
- Version: 0.1.6
3
+ Version: 0.2.1
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
@@ -5,7 +5,7 @@
5
5
  "secret_key": "CHANGE_ME_long_random_string",
6
6
  "session_ttl_hours": 24,
7
7
 
8
- "api_gate_url": "http://127.0.0.1:24444",
8
+ "api_gate_url": "https://www.dropsugar.co:8443/",
9
9
  "api_gate_token": "CHANGE_ME",
10
10
 
11
11
  "mediacms_url": "https://www.dropsugar.com",
@@ -1,9 +1,17 @@
1
1
  server {
2
- listen 443 ssl http2;
2
+ listen 443 ssl;
3
+ http2 on;
3
4
  server_name queue.dropsugar.co;
4
5
 
5
6
  ssl_certificate /etc/letsencrypt/live/queue.dropsugar.co/fullchain.pem;
6
7
  ssl_certificate_key /etc/letsencrypt/live/queue.dropsugar.co/privkey.pem;
8
+ ssl_protocols TLSv1.2 TLSv1.3;
9
+ ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
10
+ ssl_prefer_server_ciphers off;
11
+ ssl_session_cache shared:SSL:10m;
12
+ ssl_session_timeout 1d;
13
+
14
+ add_header Strict-Transport-Security "max-age=31536000" always;
7
15
 
8
16
  # WebSocket upgrade
9
17
  location /ws {
@@ -21,6 +29,8 @@ server {
21
29
  # API + pages
22
30
  location / {
23
31
  proxy_pass http://127.0.0.1:2010;
32
+ proxy_http_version 1.1;
33
+ proxy_set_header Connection "";
24
34
  proxy_set_header Host $host;
25
35
  proxy_set_header X-Real-IP $remote_addr;
26
36
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -45,5 +55,5 @@ server {
45
55
  server {
46
56
  listen 80;
47
57
  server_name queue.dropsugar.co;
48
- return 301 https://$server_name$request_uri;
58
+ return 301 https://$host$request_uri;
49
59
  }
@@ -0,0 +1,16 @@
1
+ import os
2
+ import uvicorn
3
+
4
+ from .config import Config
5
+ from .app import create_app
6
+
7
+
8
+ def main():
9
+ config_path = os.environ.get("WQ_CONFIG", "/etc/kryten-webqueue/config.json")
10
+ config = Config.from_file(config_path)
11
+ app = create_app(config)
12
+ uvicorn.run(app, host=config.host, port=config.port)
13
+
14
+
15
+ if __name__ == "__main__":
16
+ main()
@@ -36,7 +36,7 @@ async def login_page(request: Request):
36
36
  user = _get_user_or_none(request)
37
37
  if user:
38
38
  return RedirectResponse("/catalog/browse")
39
- return templates.TemplateResponse("auth/login.html", {"request": request, "user": None})
39
+ return templates.TemplateResponse(request, "auth/login.html", {"user": None})
40
40
 
41
41
 
42
42
  @router.get("/catalog/browse", response_class=HTMLResponse)
@@ -47,8 +47,7 @@ async def catalog_browse_page(request: Request, category: str | None = None, pag
47
47
  db = request.app.state.db
48
48
  items = await db.browse(category=category, page=page)
49
49
  categories = await db.get_categories()
50
- return templates.TemplateResponse("catalog/browse.html", {
51
- "request": request,
50
+ return templates.TemplateResponse(request, "catalog/browse.html", {
52
51
  "user": user,
53
52
  "items": items,
54
53
  "categories": categories,
@@ -63,7 +62,7 @@ async def queue_page(request: Request):
63
62
  user = _get_user_or_none(request)
64
63
  if not user:
65
64
  return RedirectResponse("/auth/login")
66
- return templates.TemplateResponse("queue/index.html", {"request": request, "user": user})
65
+ return templates.TemplateResponse(request, "queue/index.html", {"user": user})
67
66
 
68
67
 
69
68
  @router.get("/user/dashboard", response_class=HTMLResponse)
@@ -71,7 +70,7 @@ async def user_dashboard_page(request: Request):
71
70
  user = _get_user_or_none(request)
72
71
  if not user:
73
72
  return RedirectResponse("/auth/login")
74
- return templates.TemplateResponse("user/dashboard.html", {"request": request, "user": user})
73
+ return templates.TemplateResponse(request, "user/dashboard.html", {"user": user})
75
74
 
76
75
 
77
76
  @router.get("/admin", response_class=HTMLResponse)
@@ -79,4 +78,4 @@ async def admin_page(request: Request):
79
78
  user = _get_user_or_none(request)
80
79
  if not user or user.get("rank", 0) < 3:
81
80
  return RedirectResponse("/auth/login")
82
- return templates.TemplateResponse("admin/index.html", {"request": request, "user": user})
81
+ return templates.TemplateResponse(request, "admin/index.html", {"user": user})
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kryten-webqueue"
3
- version = "0.1.6"
3
+ version = "0.2.1"
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"
@@ -41,5 +41,10 @@ build-backend = "hatchling.build"
41
41
  [tool.hatch.build.targets.wheel]
42
42
  packages = ["kryten_webqueue"]
43
43
 
44
+ [tool.hatch.build.targets.wheel.shared-data]
45
+ "deploy/nginx-queue.conf" = "share/kryten-webqueue/nginx-queue.conf"
46
+ "deploy/kryten-webqueue.service" = "share/kryten-webqueue/kryten-webqueue.service"
47
+ "config.example.json" = "share/kryten-webqueue/config.example.json"
48
+
44
49
  [tool.pytest.ini_options]
45
50
  asyncio_mode = "auto"
@@ -1,10 +0,0 @@
1
- import os
2
- import uvicorn
3
-
4
- from .config import Config
5
- from .app import create_app
6
-
7
- config_path = os.environ.get("WQ_CONFIG", "/etc/kryten-webqueue/config.json")
8
- config = Config.from_file(config_path)
9
- app = create_app(config)
10
- uvicorn.run(app, host=config.host, port=config.port)