add raw mode

This commit is contained in:
Roy Olav Purser 2021-09-26 14:19:03 +02:00
parent 2909e14fe4
commit fdf26cd34f
Signed by: roypur
GPG Key ID: E14D26A036F21656
2 changed files with 34 additions and 12 deletions

View File

@ -5,6 +5,7 @@ import os
import re import re
import base64 import base64
import logging import logging
import distutils.util
import asyncio import asyncio
import tornado.web import tornado.web
import tornado.routing import tornado.routing
@ -120,6 +121,7 @@ stream_providers.setup(proxy_keys)
class UpstreamHandler(): class UpstreamHandler():
def __init__(self): def __init__(self):
self.provider = None self.provider = None
self.raw = False
self.valid = False self.valid = False
self.proxy = ProxyElem(None) self.proxy = ProxyElem(None)
self.upstream = None self.upstream = None
@ -141,6 +143,12 @@ class UpstreamHandler():
return (True, proxy) return (True, proxy)
async def setup(self, handler): async def setup(self, handler):
self.provider = handler.get_query_argument("provider", None) self.provider = handler.get_query_argument("provider", None)
raw_str = handler.get_query_argument("raw", None)
if isinstance(raw_str, str):
try:
self.raw = bool(distutils.util.strtobool(raw_str))
except ValueError as e:
logger.info(e)
if self.provider in providers.keys(): if self.provider in providers.keys():
self.valid = True self.valid = True
path = handler.request.path path = handler.request.path
@ -211,13 +219,18 @@ class MainHandler(tornado.web.RequestHandler):
handler = UpstreamHandler() handler = UpstreamHandler()
await handler.setup(self) await handler.setup(self)
if handler.valid: if handler.valid:
if handler.raw:
await self.handle_raw(handler)
else:
await self.handle_render(handler) await self.handle_render(handler)
else: else:
logger.info(f'provider missing {self.request.uri}') logger.info(f'provider missing {self.request.uri}')
self.set_status(404) self.set_status(404)
self.write("Stream not found. (provider missing)") self.write("Stream not found. (provider missing)")
async def get_data(self, handler):
async def handle_render(self, handler): video_info = None
meta = None
title = None
if template_script is not None and template_html is not None: if template_script is not None and template_html is not None:
provider_data = None provider_data = None
if handler.provider.startswith("nextcloud"): if handler.provider.startswith("nextcloud"):
@ -227,26 +240,35 @@ class MainHandler(tornado.web.RequestHandler):
else: else:
provider_data = await stream_providers.get_any(handler.upstream, handler.proxy, logger) provider_data = await stream_providers.get_any(handler.upstream, handler.proxy, logger)
proxied = await handler.proxy.proxy_url([provider_data.upstream(), provider_data.thumbnail()]) proxied = await handler.proxy.proxy_url([provider_data.upstream(), provider_data.thumbnail()])
video_info = {} video_info = {}
video_info["upstream"] = proxied[0] video_info["upstream"] = proxied[0]
video_info["poster"] = proxied[1] video_info["poster"] = proxied[1]
video_info["ctype"] = provider_data.ctype() video_info["ctype"] = provider_data.ctype()
meta = provider_data.meta()
title = provider_data.title()
return (video_info, meta, title)
async def handle_raw(self, handler):
video_info, meta, title = await self.get_data(handler)
if video_info is not None:
self.redirect(url=video_info["upstream"], status=303)
else:
self.set_status(404)
self.write("HTML template missing.")
async def handle_render(self, handler):
video_info, meta, title = await self.get_data(handler)
if video_info is not None:
script = template_script.generate(info=json.dumps(video_info)) script = template_script.generate(info=json.dumps(video_info))
b64 = str(base64.b64encode(script), "ascii") b64 = str(base64.b64encode(script), "ascii")
script_file = f'data:text/javascript;charset=utf-8;base64,{b64}' script_file = f'data:text/javascript;charset=utf-8;base64,{b64}'
data["script"] = script_file data["script"] = script_file
data["videojs_version"] = videojs_version data["videojs_version"] = videojs_version
data["chromecast_version"] = chromecast_version data["chromecast_version"] = chromecast_version
data["font_awesome_version"] = font_awesome_version data["font_awesome_version"] = font_awesome_version
rendered_html = template_html.generate(data=data, meta=provider_data.meta(), title=provider_data.title()) rendered_html = template_html.generate(data=data, meta=meta, title=title)
self.write(rendered_html) self.write(rendered_html)
else: else:
self.set_status(404) self.set_status(404)
self.write("HTML template missing.") self.write("HTML template missing.")
async def get(self): async def get(self):
await self.handle_any(True) await self.handle_any(True)
async def head(self): async def head(self):

View File

@ -1,6 +1,6 @@
{ {
"/direkte/nrk1?provider=nrk": {"radio": false, "name": "NRK 1"}, "/direkte/nrk1?provider=nrk&raw=true": {"radio": false, "name": "NRK 1"},
"/direkte/nrk2?provider=nrk": {"radio": false, "name": "NRK 2"}, "/direkte/nrk2?provider=nrk&raw=true": {"radio": false, "name": "NRK 2"},
"/direkte/nrk3?provider=nrk": {"radio": false, "name": "NRK 3"}, "/direkte/nrk3?provider=nrk&raw=true": {"radio": false, "name": "NRK 3"},
"/direkte/nrksuper?provider=nrk": {"radio": false, "name": "NRK Super"} "/direkte/nrksuper?provider=nrk&raw=true": {"radio": false, "name": "NRK Super"}
} }