From 8ae419d14c898e43e5a0c84318a5bee6599ac4fe Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sat, 5 Dec 2020 11:08:04 -0500 Subject: [PATCH] first push --- Dockerfile | 12 + LICENSE | 13 + README.md | 20 +- config.all.ini | 45 ++ config.example.ini | 4 + data/cache/PLACEHOLDER | 0 data/garamond.ttf | Bin 0 -> 198604 bytes data/internal_config/ZZ_serviceconf.json | 70 +++ data/internal_config/database.json | 39 ++ data/internal_config/epg.json | 9 + data/internal_config/fhdhr.json | 61 +++ data/internal_config/logging.json | 9 + data/internal_config/main.json | 19 + data/internal_config/rmg.json | 9 + data/internal_config/ssdp.json | 14 + data/internal_config/streaming.json | 33 ++ data/www/favicon.ico | Bin 0 -> 15406 bytes data/www/style.css | 8 + data/www/templates/base.html | 57 +++ data/www/templates/channels.html | 74 ++++ data/www/templates/channels_editor.html | 71 +++ data/www/templates/cluster.html | 51 +++ data/www/templates/diagnostics.html | 36 ++ data/www/templates/guide.html | 36 ++ data/www/templates/index.html | 20 + data/www/templates/origin.html | 20 + data/www/templates/settings.html | 60 +++ data/www/templates/tuners.html | 49 +++ data/www/templates/version.html | 20 + data/www/templates/xmltv.html | 38 ++ docs/ADV_Config.md | 129 ++++++ docs/Config.md | 41 ++ docs/Origin.md | 15 + docs/README.md | 46 ++ docs/Related-Projects.md | 26 ++ docs/Usage.md | 129 ++++++ docs/WebUI.md | 98 +++++ docs/images/logo.ico | Bin 0 -> 15406 bytes docs/screenshots/webui_cluster_joined.PNG | Bin 0 -> 30793 bytes docs/screenshots/webui_cluster_unjoined.PNG | Bin 0 -> 27734 bytes docs/screenshots/webui_diagnostics.PNG | Bin 0 -> 23190 bytes docs/screenshots/webui_guide.PNG | Bin 0 -> 140288 bytes docs/screenshots/webui_main.PNG | Bin 0 -> 23456 bytes docs/screenshots/webui_origin.PNG | Bin 0 -> 30489 bytes docs/screenshots/webui_settings.PNG | Bin 0 -> 53822 bytes docs/screenshots/webui_streams.PNG | Bin 0 -> 39796 bytes docs/screenshots/webui_version.PNG | Bin 0 -> 26918 bytes docs/screenshots/webui_xmltv.PNG | Bin 0 -> 27723 bytes fHDHR/__init__.py | 34 ++ fHDHR/cli/__init__.py | 0 fHDHR/cli/run.py | 114 +++++ fHDHR/config/__init__.py | 301 +++++++++++++ fHDHR/db/__init__.py | 405 ++++++++++++++++++ fHDHR/device/__init__.py | 23 + fHDHR/device/channels/__init__.py | 95 ++++ fHDHR/device/channels/chan_ident.py | 38 ++ fHDHR/device/channels/channel.py | 137 ++++++ fHDHR/device/cluster.py | 165 +++++++ fHDHR/device/epg.py | 187 ++++++++ fHDHR/device/epgtypes/__init__.py | 0 fHDHR/device/epgtypes/blocks.py | 66 +++ fHDHR/device/images.py | 60 +++ fHDHR/device/ssdp/__init__.py | 198 +++++++++ fHDHR/device/ssdp/hdhr_ssdp.py | 44 ++ fHDHR/device/ssdp/rmg_ssdp.py | 44 ++ fHDHR/device/ssdp/ssdp_detect.py | 16 + fHDHR/device/tuners/__init__.py | 106 +++++ fHDHR/device/tuners/stream/__init__.py | 27 ++ .../tuners/stream/direct_m3u8_stream.py | 99 +++++ fHDHR/device/tuners/stream/direct_stream.py | 63 +++ fHDHR/device/tuners/stream/ffmpeg_stream.py | 130 ++++++ fHDHR/device/tuners/stream/vlc_stream.py | 121 ++++++ fHDHR/device/tuners/tuner.py | 106 +++++ fHDHR/exceptions/__init__.py | 40 ++ fHDHR/http/__init__.py | 92 ++++ fHDHR/http/api/__init__.py | 32 ++ fHDHR/http/api/channels.py | 111 +++++ fHDHR/http/api/cluster.py | 56 +++ fHDHR/http/api/debug.py | 29 ++ fHDHR/http/api/epg.py | 49 +++ fHDHR/http/api/images.py | 44 ++ fHDHR/http/api/m3u.py | 89 ++++ fHDHR/http/api/root_url.py | 32 ++ fHDHR/http/api/settings.py | 40 ++ fHDHR/http/api/tuners.py | 125 ++++++ fHDHR/http/api/xmltv.py | 156 +++++++ fHDHR/http/files/__init__.py | 15 + fHDHR/http/files/device_xml.py | 21 + fHDHR/http/files/favicon_ico.py | 18 + fHDHR/http/files/style_css.py | 44 ++ fHDHR/http/hdhr/__init__.py | 31 ++ fHDHR/http/hdhr/auto.py | 45 ++ fHDHR/http/hdhr/device_xml.py | 53 +++ fHDHR/http/hdhr/discover_json.py | 35 ++ fHDHR/http/hdhr/lineup_json.py | 37 ++ fHDHR/http/hdhr/lineup_post.py | 60 +++ fHDHR/http/hdhr/lineup_status_json.py | 50 +++ fHDHR/http/hdhr/lineup_xml.py | 45 ++ fHDHR/http/hdhr/tuner.py | 47 ++ fHDHR/http/pages/__init__.py | 31 ++ fHDHR/http/pages/channels_editor.py | 23 + fHDHR/http/pages/channels_html.py | 30 ++ fHDHR/http/pages/cluster_html.py | 50 +++ fHDHR/http/pages/diagnostics_html.py | 125 ++++++ fHDHR/http/pages/guide_html.py | 43 ++ fHDHR/http/pages/index_html.py | 27 ++ fHDHR/http/pages/origin_html.py | 18 + fHDHR/http/pages/settings_html.py | 33 ++ fHDHR/http/pages/tuners_html.py | 36 ++ fHDHR/http/pages/version_html.py | 18 + fHDHR/http/pages/xmltv_html.py | 16 + fHDHR/http/rmg/__init__.py | 30 ++ fHDHR/http/rmg/device_xml.py | 58 +++ fHDHR/http/rmg/devices_devicekey.py | 94 ++++ fHDHR/http/rmg/devices_devicekey_channels.py | 47 ++ fHDHR/http/rmg/devices_devicekey_media.py | 31 ++ fHDHR/http/rmg/devices_devicekey_networks.py | 38 ++ fHDHR/http/rmg/devices_devicekey_prefs.py | 18 + fHDHR/http/rmg/devices_devicekey_scan.py | 65 +++ fHDHR/http/rmg/devices_devicekey_scanners.py | 48 +++ fHDHR/http/rmg/devices_discover.py | 49 +++ fHDHR/http/rmg/devices_probe.py | 51 +++ fHDHR/http/rmg/rmg_ident_xml.py | 38 ++ fHDHR/origin/__init__.py | 93 ++++ fHDHR/origin/origin_channels.py | 57 +++ fHDHR/origin/origin_epg.py | 11 + fHDHR/origin/origin_service.py | 12 + fHDHR/tools/__init__.py | 136 ++++++ garamond.ttf | Bin 0 -> 198604 bytes main.py | 17 + requirements.txt | 8 + 131 files changed, 6706 insertions(+), 1 deletion(-) create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 config.all.ini create mode 100644 config.example.ini create mode 100644 data/cache/PLACEHOLDER create mode 100644 data/garamond.ttf create mode 100644 data/internal_config/ZZ_serviceconf.json create mode 100644 data/internal_config/database.json create mode 100644 data/internal_config/epg.json create mode 100644 data/internal_config/fhdhr.json create mode 100644 data/internal_config/logging.json create mode 100644 data/internal_config/main.json create mode 100644 data/internal_config/rmg.json create mode 100644 data/internal_config/ssdp.json create mode 100644 data/internal_config/streaming.json create mode 100644 data/www/favicon.ico create mode 100644 data/www/style.css create mode 100644 data/www/templates/base.html create mode 100644 data/www/templates/channels.html create mode 100644 data/www/templates/channels_editor.html create mode 100644 data/www/templates/cluster.html create mode 100644 data/www/templates/diagnostics.html create mode 100644 data/www/templates/guide.html create mode 100644 data/www/templates/index.html create mode 100644 data/www/templates/origin.html create mode 100644 data/www/templates/settings.html create mode 100644 data/www/templates/tuners.html create mode 100644 data/www/templates/version.html create mode 100644 data/www/templates/xmltv.html create mode 100644 docs/ADV_Config.md create mode 100644 docs/Config.md create mode 100644 docs/Origin.md create mode 100644 docs/README.md create mode 100644 docs/Related-Projects.md create mode 100644 docs/Usage.md create mode 100644 docs/WebUI.md create mode 100644 docs/images/logo.ico create mode 100644 docs/screenshots/webui_cluster_joined.PNG create mode 100644 docs/screenshots/webui_cluster_unjoined.PNG create mode 100644 docs/screenshots/webui_diagnostics.PNG create mode 100644 docs/screenshots/webui_guide.PNG create mode 100644 docs/screenshots/webui_main.PNG create mode 100644 docs/screenshots/webui_origin.PNG create mode 100644 docs/screenshots/webui_settings.PNG create mode 100644 docs/screenshots/webui_streams.PNG create mode 100644 docs/screenshots/webui_version.PNG create mode 100644 docs/screenshots/webui_xmltv.PNG create mode 100644 fHDHR/__init__.py create mode 100644 fHDHR/cli/__init__.py create mode 100644 fHDHR/cli/run.py create mode 100644 fHDHR/config/__init__.py create mode 100644 fHDHR/db/__init__.py create mode 100644 fHDHR/device/__init__.py create mode 100644 fHDHR/device/channels/__init__.py create mode 100644 fHDHR/device/channels/chan_ident.py create mode 100644 fHDHR/device/channels/channel.py create mode 100644 fHDHR/device/cluster.py create mode 100644 fHDHR/device/epg.py create mode 100644 fHDHR/device/epgtypes/__init__.py create mode 100644 fHDHR/device/epgtypes/blocks.py create mode 100644 fHDHR/device/images.py create mode 100644 fHDHR/device/ssdp/__init__.py create mode 100644 fHDHR/device/ssdp/hdhr_ssdp.py create mode 100644 fHDHR/device/ssdp/rmg_ssdp.py create mode 100644 fHDHR/device/ssdp/ssdp_detect.py create mode 100644 fHDHR/device/tuners/__init__.py create mode 100644 fHDHR/device/tuners/stream/__init__.py create mode 100644 fHDHR/device/tuners/stream/direct_m3u8_stream.py create mode 100644 fHDHR/device/tuners/stream/direct_stream.py create mode 100644 fHDHR/device/tuners/stream/ffmpeg_stream.py create mode 100644 fHDHR/device/tuners/stream/vlc_stream.py create mode 100644 fHDHR/device/tuners/tuner.py create mode 100644 fHDHR/exceptions/__init__.py create mode 100644 fHDHR/http/__init__.py create mode 100644 fHDHR/http/api/__init__.py create mode 100644 fHDHR/http/api/channels.py create mode 100644 fHDHR/http/api/cluster.py create mode 100644 fHDHR/http/api/debug.py create mode 100644 fHDHR/http/api/epg.py create mode 100644 fHDHR/http/api/images.py create mode 100644 fHDHR/http/api/m3u.py create mode 100644 fHDHR/http/api/root_url.py create mode 100644 fHDHR/http/api/settings.py create mode 100644 fHDHR/http/api/tuners.py create mode 100644 fHDHR/http/api/xmltv.py create mode 100644 fHDHR/http/files/__init__.py create mode 100644 fHDHR/http/files/device_xml.py create mode 100644 fHDHR/http/files/favicon_ico.py create mode 100644 fHDHR/http/files/style_css.py create mode 100644 fHDHR/http/hdhr/__init__.py create mode 100644 fHDHR/http/hdhr/auto.py create mode 100644 fHDHR/http/hdhr/device_xml.py create mode 100644 fHDHR/http/hdhr/discover_json.py create mode 100644 fHDHR/http/hdhr/lineup_json.py create mode 100644 fHDHR/http/hdhr/lineup_post.py create mode 100644 fHDHR/http/hdhr/lineup_status_json.py create mode 100644 fHDHR/http/hdhr/lineup_xml.py create mode 100644 fHDHR/http/hdhr/tuner.py create mode 100644 fHDHR/http/pages/__init__.py create mode 100644 fHDHR/http/pages/channels_editor.py create mode 100644 fHDHR/http/pages/channels_html.py create mode 100644 fHDHR/http/pages/cluster_html.py create mode 100644 fHDHR/http/pages/diagnostics_html.py create mode 100644 fHDHR/http/pages/guide_html.py create mode 100644 fHDHR/http/pages/index_html.py create mode 100644 fHDHR/http/pages/origin_html.py create mode 100644 fHDHR/http/pages/settings_html.py create mode 100644 fHDHR/http/pages/tuners_html.py create mode 100644 fHDHR/http/pages/version_html.py create mode 100644 fHDHR/http/pages/xmltv_html.py create mode 100644 fHDHR/http/rmg/__init__.py create mode 100644 fHDHR/http/rmg/device_xml.py create mode 100644 fHDHR/http/rmg/devices_devicekey.py create mode 100644 fHDHR/http/rmg/devices_devicekey_channels.py create mode 100644 fHDHR/http/rmg/devices_devicekey_media.py create mode 100644 fHDHR/http/rmg/devices_devicekey_networks.py create mode 100644 fHDHR/http/rmg/devices_devicekey_prefs.py create mode 100644 fHDHR/http/rmg/devices_devicekey_scan.py create mode 100644 fHDHR/http/rmg/devices_devicekey_scanners.py create mode 100644 fHDHR/http/rmg/devices_discover.py create mode 100644 fHDHR/http/rmg/devices_probe.py create mode 100644 fHDHR/http/rmg/rmg_ident_xml.py create mode 100644 fHDHR/origin/__init__.py create mode 100644 fHDHR/origin/origin_channels.py create mode 100644 fHDHR/origin/origin_epg.py create mode 100644 fHDHR/origin/origin_service.py create mode 100644 fHDHR/tools/__init__.py create mode 100644 garamond.ttf create mode 100644 main.py create mode 100644 requirements.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..eabd335 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM python:3.8-slim + +RUN apt-get -qq update && \ + apt-get -qq -y install ffmpeg gcc && \ + apt-get autoclean && \ + rm -rf /var/lib/apt/lists/* + +COPY ./ /app/ +WORKDIR /app +RUN pip3 install -r requirements.txt + +ENTRYPOINT ["python3", "/app/main.py", "--config", "/app/config/config.ini"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..caca53d --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + +Copyright (C) 2020 Sam Zick + +Everyone is permitted to copy and distribute verbatim or modified +copies of this license document, and changing it is allowed as long +as the name is changed. + +DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/README.md b/README.md index b91ff76..2d76494 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,20 @@ -# fHDHR_ToonamiAftermath +

fHDHR_ToonamiAftermath Logo

+ +Welcome to the world of streaming content as a DVR device! We use some fancy python here to achieve a system of: + +**f**un +**H**ome +**D**istribution +**H**iatus +**R**ecreation + + +Please Check the [Docs](docs/README.md) for Installation information. + +fHDHR is labeled as beta until we reach v1.0.0 + +Join us in `#fHDHR `_ on Freenode. + + +Due to multiple issues, I'm dropping official support for Windows. diff --git a/config.all.ini b/config.all.ini new file mode 100644 index 0000000..5983758 --- /dev/null +++ b/config.all.ini @@ -0,0 +1,45 @@ +[main] +# uuid = +# cache_dir = +# servicename = ToonamiAftermath +# reponame = fHDHR_ToonamiAftermath + +[fhdhr] +# address = 0.0.0.0 +# discovery_address = 0.0.0.0 +# port = 5004 +# stream_type = direct +# tuner_count = 4 +# friendlyname = fHDHR-ToonamiAftermath +# reporting_firmware_name = fHDHR_ToonamiAftermath +# reporting_manufacturer = BoronDust +# reporting_model = fHDHR +# reporting_firmware_ver = 20201001 +# reporting_tuner_type = Antenna +# device_auth = fHDHR + +[epg] +# images = pass +# method = origin +# update_frequency = 43200 + +[ffmpeg] +# path = ffmpeg +# bytes_per_read = 1152000 + +[vlc] +# path = cvlc +# bytes_per_read = 1152000 + +[direct_stream] +# chunksize = 1048576 + +[logging] +# level = WARNING + +[database] +# type = sqlite +# driver = None + +[toonamiaftermath] +# force_best = False diff --git a/config.example.ini b/config.example.ini new file mode 100644 index 0000000..f5837c7 --- /dev/null +++ b/config.example.ini @@ -0,0 +1,4 @@ +[fhdhr] +# address = 0.0.0.0 +# port = 5004 +# discovery_address = 0.0.0.0 diff --git a/data/cache/PLACEHOLDER b/data/cache/PLACEHOLDER new file mode 100644 index 0000000..e69de29 diff --git a/data/garamond.ttf b/data/garamond.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0a059a401c7a1c92c18213281690c3eae37e4745 GIT binary patch literal 198604 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 literal 0 HcmV?d00001 diff --git a/data/www/style.css b/data/www/style.css new file mode 100644 index 0000000..bba3e9f --- /dev/null +++ b/data/www/style.css @@ -0,0 +1,8 @@ +.pull-right { float: right; } + +.pull-left { float: left; } + +.center { + margin-left: auto; + margin-right: auto; +} diff --git a/data/www/templates/base.html b/data/www/templates/base.html new file mode 100644 index 0000000..e00aecf --- /dev/null +++ b/data/www/templates/base.html @@ -0,0 +1,57 @@ + + + {{ fhdhr.config.dict["fhdhr"]["friendlyname"] }} + + + + + +

+ {{ fhdhr.config.dict["fhdhr"]["friendlyname"] }} + + fHDHR Logo +

+

+

+
+ + + + + + + + + + + + + xmltv + m3u + +
+
+ + {% set locations = fhdhr.device.cluster.get_cluster_dicts_web() %} + {% if locations %} +
+ {% for location in locations %} + + {% endfor %} +
+
+ {% endif %} + + {% set retmessage = request.args.get('retmessage', default=None) %} + {% if retmessage %} +

{{ retmessage }}

+ {% endif %} + + {% block content %}{% endblock %} + + + diff --git a/data/www/templates/channels.html b/data/www/templates/channels.html new file mode 100644 index 0000000..c2081b4 --- /dev/null +++ b/data/www/templates/channels.html @@ -0,0 +1,74 @@ +{% extends "base.html" %} + +{% block content %} + +

{{ fhdhr.config.dict["fhdhr"]["friendlyname"] }} Channels

+ +
+

Note: This may take some time.

+
+
+ + + + + + + + {% for key in list(channels_dict.keys()) %} + + + + + {% endfor %} + +
+ +
+
+ +
{{ key }}{{ channels_dict[key] }}
+ + + + + + + + + + + {% for chan_dict in channelslist %} + + + + + + + + {% if chan_dict["thumbnail"] %} + + {% else %} + + {% endif %} + + {% if chan_dict["enabled"] %} + + {% else %} + + {% endif %} + + {% if chan_dict["favorite"] %} + + {% else %} + + {% endif %} + + {% endfor %} + +{% endblock %} diff --git a/data/www/templates/channels_editor.html b/data/www/templates/channels_editor.html new file mode 100644 index 0000000..0f89269 --- /dev/null +++ b/data/www/templates/channels_editor.html @@ -0,0 +1,71 @@ +{% extends "base.html" %} + +{% block content %} + +

{{ fhdhr.config.dict["fhdhr"]["friendlyname"] }} Channels Editor

+ +
+ + +
+ +
PlayChannel NameChannel CallSignChannel NumberChannel ThumbnailEnabledFavorite
+ {% if chan_dict["enabled"] %} + Play + {% endif %} + + {{ chan_dict["name"] }}{{ chan_dict["callsign"] }}{{ chan_dict["number"] }}{{ chan_dict[No Image AvailableEnabledDisabledYesNo
+ + + + + + + + + + + + {% for chan_dict in channelslist %} + + + + + + + + + + + + + + + + + + + + + + + + + {% endfor %} + +{% endblock %} diff --git a/data/www/templates/cluster.html b/data/www/templates/cluster.html new file mode 100644 index 0000000..c7b156e --- /dev/null +++ b/data/www/templates/cluster.html @@ -0,0 +1,51 @@ +{% extends "base.html" %} + +{% block content %} + +

Cluster/SSDP

+ {% if not fhdhr.config.dict["fhdhr"]["discovery_address"] %} +

Discovery Address must be set for Cluster/SSDP

+ {% else %} + +
+ + + +
+
+ +
Channel NameChannel CallSignChannel NumberChannel ThumbnailEnabledFavoriteUpdateReset
+ + + +
+ + + + + + + + {% for location in locations_list %} + + + + + + + + {% endfor %} + + {% endif %} + +{% endblock %} diff --git a/data/www/templates/diagnostics.html b/data/www/templates/diagnostics.html new file mode 100644 index 0000000..1c75f76 --- /dev/null +++ b/data/www/templates/diagnostics.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} + +{% block content %} + +

fHDHR Diagnostic Links

+ +
NameLocationJoinedOptions
{{ location["name"] }}{{ location["location"] }}{{ location["joined"] }} +
+ + {% if location["joined"] in ["True", "False"] %} + + {% endif %} + + {% if location["joined"] == "True" %} + + {% elif location["joined"] == "False" %} + + {% endif %} + +
+
+ + + + + + + + {% for button_item in button_list %} + + + {% if button_item["hdhr"] %} + + {% else %} + + {% endif %} + {% if button_item["rmg"] %} + + {% else %} + + {% endif %} + {% if button_item["other"] %} + + {% else %} + + {% endif %} + + {% endfor %} + +{% endblock %} diff --git a/data/www/templates/guide.html b/data/www/templates/guide.html new file mode 100644 index 0000000..f42eb5c --- /dev/null +++ b/data/www/templates/guide.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} + +{% block content %} + +

What's On {{ fhdhr.config.dict["fhdhr"]["friendlyname"] }}

+ +

+ {% for epg_method in epg_methods %} + + {% endfor %} +

+ +
ItemHDHRRMGNon-Specific
{{ button_item["label"] }}
+ + + + + + + + + + + {% for chan_dict in chan_guide_list %} + + + + + + + + + + {% endfor %} + +{% endblock %} diff --git a/data/www/templates/index.html b/data/www/templates/index.html new file mode 100644 index 0000000..f5bea44 --- /dev/null +++ b/data/www/templates/index.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} + +{% block content %} + +

fHDHR Status

+ +
Channel NameChannel NumberChannel ThumbnailContent TitleContent ThumbnailContent DescriptionContent Remaining Time
{{ chan_dict["name"] }}{{ chan_dict["number"] }}{{ chan_dict[{{ chan_dict["listing_title"] }}{{ chan_dict[{{ chan_dict["listing_description"] }}{{ chan_dict["remaining_time"] }}
+ + + + + + {% for key in list(fhdhr_status_dict.keys()) %} + + + + + {% endfor %} + +{% endblock %} diff --git a/data/www/templates/origin.html b/data/www/templates/origin.html new file mode 100644 index 0000000..b64ccd4 --- /dev/null +++ b/data/www/templates/origin.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} + +{% block content %} + +

{{ fhdhr.config.dict["main"]["servicename"] }} Status

+ +
{{ key }}{{ fhdhr_status_dict[key] }}
+ + + + + + {% for key in list(origin_status_dict.keys()) %} + + + + + {% endfor %} + +{% endblock %} diff --git a/data/www/templates/settings.html b/data/www/templates/settings.html new file mode 100644 index 0000000..6719fa1 --- /dev/null +++ b/data/www/templates/settings.html @@ -0,0 +1,60 @@ +{% extends "base.html" %} + +{% block content %} + +

fHDHR Settings

+ +

Settings will require a manual restart.

+ + {% for config_section in list(web_settings_dict.keys()) %} + + {% if config_section == "origin" %} +

{{ fhdhr.config.dict["main"]["dictpopname"] }}

+ {% else %} +

{{ config_section }}

+ {% endif %} + +
{{ key }}{{ origin_status_dict[key] }}
+ + + + + + + + + {% for config_item in list(web_settings_dict[config_section].keys()) %} + + + + + + + + + + + {% if web_settings_dict[config_section][config_item]["hide"] %} + + {% else %} + + {% endif %} + + + + + + + + + + + + + + {% endfor %} +
Config NameConfig Default ValueConfig ValueUpdateReset
{{ config_item }}{{ web_settings_dict[config_section][config_item]["value_default"] }}
+ + {% endfor %} + +{% endblock %} diff --git a/data/www/templates/tuners.html b/data/www/templates/tuners.html new file mode 100644 index 0000000..e85a295 --- /dev/null +++ b/data/www/templates/tuners.html @@ -0,0 +1,49 @@ +{% extends "base.html" %} + +{% block content %} + +

fHDHR Streams

+ + + + + + + + + + + + + {% for tuner_dict in tuner_list %} + + + + {% if tuner_dict["status"] in ["Active", "Acquired"] %} + + {% else %} + + {% endif %} + {% if tuner_dict["status"] == "Active" %} + + + + {% else %} + + + + {% endif %} + + + {% endfor %} + +{% endblock %} diff --git a/data/www/templates/version.html b/data/www/templates/version.html new file mode 100644 index 0000000..249e35b --- /dev/null +++ b/data/www/templates/version.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} + +{% block content %} + +

fHDHR Version Information

+ +
TunerStatusChannelMethodTime ActiveTotal DownloadedOptions
{{ tuner_dict["number"] }}{{ tuner_dict["status"] }}{{ tuner_dict["channel_number"] }}N/A{{ tuner_dict["method"] }}{{ tuner_dict["play_duration"] }}{{ tuner_dict["downloaded"] }}N/AN/AN/A +
+ {% if tuner_dict["status"] != "Inactive" %} + + {% endif %} + {% if not tuner_scanning and tuner_dict["status"] == "Inactive" %} + + {% endif %} +
+
+ + + + + + {% for key in list(version_dict.keys()) %} + + + + + {% endfor %} + +{% endblock %} diff --git a/data/www/templates/xmltv.html b/data/www/templates/xmltv.html new file mode 100644 index 0000000..697febc --- /dev/null +++ b/data/www/templates/xmltv.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} + +{% block content %} + +

xmltv

+ +
{{ key }}{{ version_dict[key] }}
+ + + + + + + + {% for epg_method in fhdhr.config.dict["main"]["valid_epg_methods"] %} + {% if epg_method not in [None, "None"] %} + {% set epg_method_name = epg_method %} + {% if epg_method == "origin" %} + {% set epg_method_name = fhdhr.config.dict["main"]["dictpopname"] %} + {% endif %} + + + + + + + + + + {% endif %} + {% endfor %} + +{% endblock %} diff --git a/docs/ADV_Config.md b/docs/ADV_Config.md new file mode 100644 index 0000000..56be4dd --- /dev/null +++ b/docs/ADV_Config.md @@ -0,0 +1,129 @@ +

fHDHR Logo

+ +--- +[Main](README.md) | [Setup and Usage](Usage.md) | [toonamiaftermath](Origin.md) | [Credits/Related Projects](Related-Projects.md) +--- +**f**un +**H**ome +**D**istribution +**H**iatus +**R**ecreation + +--- + +[Basic Configuration](Config.md) | [Advanced Configuration](ADV_Config.md) | [WebUI](WebUI.md) + +--- + +Here, we'll break down all of the configuration options per section. + +## Main +Here's the `main` section. +* `uuid` will be created automatically, you need not worry about this. +* `cache_dir` is handy for keeping cached files out of the script directory. This is helpful for reinstalls as well as development. + +```` +[main] +# uuid = +# cache_dir = +```` + +## fhdhr + +The `fhdhr` contains all the configuration options for interfacing between this script and your media platform. +* `address` and `port` are what we will allow the script to listen on. `0.0.0.0` is the default, and will respond to all. +* `discovery_address` may be helpful for making SSDP work properly. If `address` is not `0.0.0.0`, we will use that. If this is not set to a real IP, we won't run SSDP. SSDP is only really helpful for discovering in Plex/Emby. It's a wasted resource since you can manually add the `ip:port` of the script to Plex. +* `tuner_count` is a limit of devices able to stream from the script. +* `friendlyname` is to set the name that Plex sees the script as. +* `stream_type` can be set to `ffmpeg`, `vlc` or `direct`. + + +```` +[fhdhr] +# address = 0.0.0.0 +# discovery_address = 0.0.0.0 +# port = 5004 +# stream_type = direct +# tuner_count = 4 +# friendlyname = fHDHR-toonamiaftermath +# reporting_firmware_name = fHDHR_ToonamiAftermath +# reporting_manufacturer = BoronDust +# reporting_model = fHDHR +# reporting_firmware_ver = 20201001 +# reporting_tuner_type = Antenna +# device_auth = fHDHR +```` + +# EPG +* `images` can be set to `proxy` or `pass`. If you choose `proxy`, images will be reverse proxied through fHDHR. +* `method` defaults to `origin` and will pull the xmltv data from toonamiaftermath. Other Options include `blocks` which is an hourly schedule with minimal channel information. Another option is `zap2it`, which is another source of EPG information. Channel Numbers may need to be manually mapped. +* `update_frequency` * `epg_update_frequency` determines how often we check for new scheduling information. In Seconds. + +```` +[epg] +# images = pass +# method = origin +# update_frequency = 43200 +```` + +## ffmpeg + +The `ffmpeg` section includes: +* `path` is useful if ffmpeg is not in your systems PATH, or you want to manually specify. +* `bytes_per_read` determines how many bytes of the stream to read before sending the data to your client. Increasing this value may cause longer load times, and lowering it may effect `stuttering`. + +```` +[ffmpeg] +# path = ffmpeg +# bytes_per_read = 1152000 +```` + +## vlc + +The `vlc` section includes: +* `path` is useful if ffmpeg is not in your systems PATH, or you want to manually specify. +* `bytes_per_read` determines how many bytes of the stream to read before sending the data to your client. Increasing this value may cause longer load times, and lowering it may effect `stuttering`. + +```` +[vlc] +# path = ffmpeg +# bytes_per_read = 1152000 +```` + +## direct_stream + +The `direct_stream` section is for when you set the `[fhdhr]stream_type` to `direct` +* `chunksize` is how much data to read at a time. + +```` +[direct_stream] +# chunksize = 1024*1024 +```` + +# Logging +* `level` determines the amount of logging you wish to see in the console, as well as to the logfile (stored in your cache directory). + +```` +[logging] +# level = WARNING +```` + +# Database +* experiment with these settings at your own risk. We use sqlalchemy to provide database options, but we default to sqlite. + +TODO: improve documentation here. + +```` +[database] +# type = sqlite +# driver = None +```` + +## toonamiaftermath +The `toonamiaftermath` section + +```` +[toonamiaftermath] +# username = +# password = +```` diff --git a/docs/Config.md b/docs/Config.md new file mode 100644 index 0000000..ce517cc --- /dev/null +++ b/docs/Config.md @@ -0,0 +1,41 @@ +

fHDHR Logo

+ +--- +[Main](README.md) | [Setup and Usage](Usage.md) | [toonamiaftermath](Origin.md) | [Credits/Related Projects](Related-Projects.md) +--- +**f**un +**H**ome +**D**istribution +**H**iatus +**R**ecreation + +--- + +[Basic Configuration](Config.md) | [Advanced Configuration](ADV_Config.md) | [WebUI](WebUI.md) + +--- + +The example config file contains all of the things that the typical user may need to fill out. + +Please see the Advanced Configuration page for more information. + +## fHDHR + +Under `fhdhr`, you'll find 2 addresses listed. `0.0.0.0` works great for a listen address, however, it seems that SSDP works best if the discovery address is set to the IP to say that there is a service at. + +```` +[fhdhr] +# address = 0.0.0.0 +# port = 5004 +# discovery_address = 0.0.0.0 +```` + +## toonamiaftermath + +toonamiaftermath requires signin credentials, so add those. + +```` +[toonamiaftermath] +# username = +# password = +```` diff --git a/docs/Origin.md b/docs/Origin.md new file mode 100644 index 0000000..afc9f8b --- /dev/null +++ b/docs/Origin.md @@ -0,0 +1,15 @@ +

fHDHR Logo

+ +--- +[Main](README.md) | [Setup and Usage](Usage.md) | [toonamiaftermath](Origin.md) | [Credits/Related Projects](Related-Projects.md) +--- +**f**un +**H**ome +**D**istribution +**H**iatus +**R**ecreation + +--- + + +This varient of fHDHR connects to [toonamiaftermath](https://toonamiaftermath.com/about). diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..1b4f310 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,46 @@ +

fHDHR Logo

+ +--- +[Main](README.md) | [Setup and Usage](Usage.md) | [toonamiaftermath](Origin.md) | [Credits/Related Projects](Related-Projects.md) +--- +**f**un +**H**ome +**D**istribution +**H**iatus +**R**ecreation + +--- + +# The Boring Disclaimers (at the top of the docs for a reason) + + +fHDHR is a Python service to take various sources of video and make them accessible to client software including, but not limited to: + +* [Plex](https://www.plex.tv/) +* [Emby](https://emby.media/) +* [Jellyfin](https://jellyfin.org/) +* [Channels](https://getchannels.com/) + +fHDHR is not directly affiliated with the above client software, and you will receive NO support for this script via their forums. + +fHDHR is able to connect to clients by emulating a piece of hardware called the [HDHomeRun from SiliconDust](https://www.silicondust.com/). fHDHR is in NO way affiliated with SiliconDust, and is NOT a HDHomeRun device. fHDHR simply uses the API structure used by the authentic HDHomeRun to connect to client DVR solutions. + +# History + +I got the Huappage QuadHD, and the Mohu Sail as a pandemic-project. All was fine working within Plex, but I also have emby setup as a backup to Plex when auth is broken. + +I thought to myself, "Self, I should look on github for a way to share my tv tuner between the two". + +That's when I tried both npvrProxy with NextPVR as well as tvhProxy with TVHeadend. I had to tinker with both to get them working, but I started testing which one I liked more. + +Around this same time, I stumbled upon [locast2plex by tgorgdotcom](https://github.com/tgorgdotcom/locast2plex). I wanted to contribute to that project to get it to a point that I could fork it to work for other video stream sources. + +The locast2plex code development wasn't going quite fast enough for the feature-creep in my head. + +I then proceded to create the initial iteration of fHDHR which I originally called "FakeHDHR". I've rewritten the core functionality a few times before landing on the current code structure, which feels 'right'. + +I've worked really hard to create a structure that simplifies new variants of the core code to work with different 'origin' streams. Combining these works really well with [xTeVe](https://github.com/xteve-project/xTeVe). + +One of the variants goes as far as scraping a table from a PDF file for creating a channel guide! + +I can easily create more variants of the project to do other video sources. Paid ones, I could potentially accept donations for, as I don't want to pay to develop for multiple platforms. diff --git a/docs/Related-Projects.md b/docs/Related-Projects.md new file mode 100644 index 0000000..4f3133c --- /dev/null +++ b/docs/Related-Projects.md @@ -0,0 +1,26 @@ +

fHDHR Logo

+ +--- +[Main](README.md) | [Setup and Usage](Usage.md) | [toonamiaftermath](Origin.md) | [Credits/Related Projects](Related-Projects.md) +--- +**f**un +**H**ome +**D**istribution +**H**iatus +**R**ecreation + +--- + + +While the fHDHR reops share very little code from the below projects, they were a source of inspiration: + + * [tvhProxy by jkaberg](https://github.com/jkaberg/tvhProxy) + * [locast2plex by tgorgdotcom](https://github.com/tgorgdotcom/locast2plex) + + +Aside from the above, these other projects are worth a look as well: + +* [npvrProxy](https://github.com/rogueosb/npvrProxy) +* [xTeVe](https://xteve.de/) +* [telly](https://github.com/tellytv/telly) +* [dizquetv](https://github.com/vexorian/dizquetv) diff --git a/docs/Usage.md b/docs/Usage.md new file mode 100644 index 0000000..6b321ff --- /dev/null +++ b/docs/Usage.md @@ -0,0 +1,129 @@ +

fHDHR Logo

+ +--- +[Main](README.md) | [Setup and Usage](Usage.md) | [toonamiaftermath](Origin.md) | [Credits/Related Projects](Related-Projects.md) +--- +**f**un +**H**ome +**D**istribution +**H**iatus +**R**ecreation + +--- + +[Basic Configuration](Config.md) | [Advanced Configuration](ADV_Config.md) | [WebUI](WebUI.md) + +--- + +# Author Notes + +* All Testing is currently done in Proxmox LXC, Ubuntu 20.04, Python 3.8 + + +# Prerequisites + +* A Linux or Mac "Server". Windows currently does not work. A "Server" is a computer that is typically always online. +* Python 3.7 or later. +* Consult [This Page](Origin.md) for additional setup specific to this variant of fHDHR. + + +# Optional Prerequisites +* If you intend to use Docker, [This Guide](https://docs.docker.com/get-started/) should help you get started. The author of fHDHR is not a docker user, but will still try to help. + +fHDHR uses direct connections with video sources by default. Alternatively, you can install and update the [config](Config.md) accordingly. You will need to make these available to your systems PATH, or manually set their path via the config file. + +* ffmpeg +* vlc + + +# Installation + +## Linux + +* Download the zip, or git clone +* Navigate into your script directory and run `pip3 install -r requirements.txt` +* Copy the included `config.example.ini` file to a known location. The script will not run without this. There is no default configuration file location. [Modify the configuration file to suit your needs.](Config.md) + +* Run with `python3 main.py -c=` and the path to the config file. + + +## Docker +This portion of the guide assumes you are using a Linux system with both docker and docker-compose installed. This (or some variation thereof) may work on Mac or Windows, but has not been tested. + +* this guide assumes we wish to use the `~/fhdhr` directory for our install (you can use whatever directory you like, just make the appropriate changes elsewhere in this guide) and that we are installing for toonamiaftermath support +* run the following commands to clone the repo into `~/fhdhr/fHDHR_ToonamiAftermath` +``` +cd ~/fhdhr +git clone https://github.com/fHDHR/fHDHR_ToonamiAftermath.git +``` +* create your config.ini file (as described earlier in this guide) in the `~/fhdhr/fHDHR_ToonamiAftermath` directory +* while still in the `~/fhdhr` directory, create the following `docker-compose.yml` file +``` +version: '3' + +services: + toonamiaftermath: + build: ./fHDHR_ToonamiAftermath + container_name: toonamiaftermath + network_mode: host + volumes: + - ./fHDHR_ToonamiAftermath/config.ini:/app/config/config.ini +``` +* run the following command to build and launch the container +``` +docker-compose up --build -d toonamiaftermath +``` + +After a short period of time (during which docker will build your new fHDHR container), you should now have a working build of fHDHR running inside a docker container. + +As the code changes and new versions / bug fixes are released, at any point you can pull the latest version of the code and rebuild your container with the following commands: +``` +cd ~/fhdhr/fHDHR_ToonamiAftermath +git checkout master +git pull +cd ~/fhdhr +docker-compose up --build -d toonamiaftermath +``` +
+ +You can also run multiple instances of fHDHR to support additional sources by cloning the appropriate repo into your `~/fhdhr` directory and adding the necessary services to the docker-compose file we created above. + +* for example, if we also wanted toonamiaftermath support, you would clone the toonamiaftermath repository: +``` +cd ~/fhdhr +git clone https://github.com/fHDHR/fHDHR_ToonamiAftermath.git +``` +* **NOTE**: if you are running multiple services on the same machine, you must change the port in your config.ini file for each one. For example, if toonamiaftermath was using the default port of 5004, toonamiaftermath cannot also use that port. You must change the port in your toonamiaftermath config.ini file to something else (5005, for example). +* add toonamiaftermath as a service in your `docker-compose.yml` file +``` +version: '3' + +services: + toonamiaftermath: + build: ./fHDHR_ToonamiAftermath + container_name: toonamiaftermath + network_mode: host + volumes: + - ./fHDHR_ToonamiAftermath/config.ini:/app/config/config.ini + + toonamiaftermath: + build: ./fHDHR_ToonamiAftermath + container_name: toonamiaftermath + network_mode: host + volumes: + - ./fHDHR_ToonamiAftermath/config.ini:/app/config/config.ini +``` +* run the following command to build and launch the container +``` +docker-compose up --build -d toonamiaftermath +``` + +You can repeat these instructions for as many fHDHR containers as your system resources will allow. + +# Setup + +Now that you have fHDHR running, You can navigate (in a web browser) to the IP:Port from the configuration step above. + +If you did not setup a `discovery_address` in your config, SSDP will be disabled. This is not a problem as clients like Plex can have the IP:Port entered manually! + +You can copy the xmltv link from the webUI and use that in your client software to provide Channel Guide information. diff --git a/docs/WebUI.md b/docs/WebUI.md new file mode 100644 index 0000000..1aeb6a5 --- /dev/null +++ b/docs/WebUI.md @@ -0,0 +1,98 @@ +

fHDHR Logo

+ +--- +[Main](README.md) | [Setup and Usage](Usage.md) | [toonamiaftermath](Origin.md) | [Credits/Related Projects](Related-Projects.md) +--- +**f**un +**H**ome +**D**istribution +**H**iatus +**R**ecreation + +--- + +[Basic Configuration](Config.md) | [Advanced Configuration](ADV_Config.md) | [WebUI](WebUI.md) + +--- + + +This Page will introduce basic handling of the script from the Web Interface provided at IP:Port + +The Pages are available in the buttons at the top, links to xmltv and m3u are provided at the top for ease of access. + + +# Main Landing Page + +Below is the main landing page with basic information. + +Main Page + +# toonamiaftermath + +Here you will have access to some basic information about the service we are proxying. + +The webUI will still work, even if setup didn't go smoothly. + +Origin Page + +# Guide + +This Page give you information about what is currently playing on all stations. It will also show the time remaining for each item. + +* Note: The Play link in the left hand column can be copied to play a channel in VLC media player! + +Guide Page + + +# Cluster + +Since SSDP is used for service discovery, I decided to also use it for ease of management. + +This tab will not have the below options if SSDP isn't running. + +Joining a cluster will provide a second row of buttons for the clustered servers. + +Unjoined: + +Cluster Page, UnJoined + +Joined: + +Cluster Page, Joined + + +# Streams + +This Page will show all active streams, and tuner information. You can also terminate a stream from here. + +* Note: Clients will often have an amount buffered, and the connection termination is not immediate from a viewing perspective. However, the connection to the source is indeed cut off. + +Streams Page + +# xmltv + +This page will give you access to all the xmltv formats provided by this varient. + +From here, you can manually update or even clear the cached epg, and then update. + +xmltv Page + +# Version + +This page will give valuable information about the environment the script is being run in. + +Version Page + +# Diganostics + +This page has various links to json/xml files that make the magic work, as well as debug and cluster information. + +Diagnostics Page + +# Settings + +This page allows viewing/changing all possible configuration options. + +* Note: This will require a restart of the script to have any effect. + +Diagnostics Page diff --git a/docs/images/logo.ico b/docs/images/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..9ec58daab101c29e268ecb4789d6bfc0a4dd7720 GIT binary patch literal 15406 zcmeI2S8o(C6opNBCgFki-4I0!2ozeV0v;fU58i?n6#9e#f&3)_JL*ZYKdLg11nfqlEB0_XBP7{V_KEOXm=s)Vs%_0lA;nGRnUZiwV1BCm8*?kmQ{@riXI>h>7d~C&J1@U+KY6#i zhX369Jnq}_Hs_fJOaqA;I3Dy7>yC3leq3q){GQSWg#E$^;hC@)YlbaBJ+GAB8|1$z z?Vn#%nspRwEY?Zeg!@9X9DM!MljQ$$;BQ#zJwZMzkGTI$s*|-KI3oDxv_JI!NqNd< z_3Q06tB$h*>qpw(BfO08RM&d`DYISh^<=%`pLHvGO6vbBkv}wm4q2OL_3Q0+tB!}l z2jPuySn$ujD(&BKztUTU9RfDweYs|?w7FNnFKhi~>M~pFKhuC|UpqE|OBZeB@$$9uWO-WYnY?t8!OsjF z;oAAFbB(B1xoh9=yXuG-0k@i zTCWsn?lj$)ZcGEF0n>nKVEJi)a}DephwuKK^8Wlpc%L{1``heUbN{nIxzj?Qa6w=X zm~#@God|7Pm1ggpJ^iqL;u#wS;v3<8&ZTq-H>3OPQ#RBE(U+zLs%zm*eNt}UMIB6lCH;pgZ$qX7z-ZH zl}0b2ek#hx`4jIrCZMA%oYL6T!Bk6!6pz!+ux zRs`mgp#XQ3ZiGMMfU)djPFZ+0Y6E}zi8$Ip;en85{-K?5{V<-XGmKL<$|r3(_!GCJ z-vRST8vcwE&!0J;SSPyQCA=5X@=05sSUO{kI4<1LF7E)%KNiCJD8qMwam{^r!{5gu z>2t=+J^?L;wyjDJ$`A3-UV(4WfWY|yv>rciNc-UaR)7yWryTKHzQg^(u)zIR@r~C@ ze-m>?t9*y)H*^p$XL;)r(|~EfG+-Jq4VVT@1Ezu68YprMvU;ANsB2$;7DD{z3fP8O oe~u$Mzfq(%%toBsID_KPaTMS@!JqRp(o2;){OxBwkhKSX1ES!?k^lez literal 0 HcmV?d00001 diff --git a/docs/screenshots/webui_cluster_joined.PNG b/docs/screenshots/webui_cluster_joined.PNG new file mode 100644 index 0000000000000000000000000000000000000000..97bd3ef8deecfc34171909ea11ccad17cbecfee5 GIT binary patch literal 30793 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/webui_cluster_unjoined.PNG b/docs/screenshots/webui_cluster_unjoined.PNG new file mode 100644 index 0000000000000000000000000000000000000000..e86cfe6bef35d67980adc8088871afc201003ed0 GIT binary patch literal 27734 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 WK#kkveE;SzeD_!DZ%WTyzV#m)!69D& literal 0 HcmV?d00001 diff --git a/docs/screenshots/webui_diagnostics.PNG b/docs/screenshots/webui_diagnostics.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ac4e65fda6ea17c53f86098c732d76f4cdefa3fb GIT binary patch literal 23190 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/webui_guide.PNG b/docs/screenshots/webui_guide.PNG new file mode 100644 index 0000000000000000000000000000000000000000..7e2158de06e2ac225288e267d1f7e9056025597e GIT binary patch literal 140288 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%0Ad9LFTK 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 Gy7Eun>h2@} literal 0 HcmV?d00001 diff --git a/docs/screenshots/webui_origin.PNG b/docs/screenshots/webui_origin.PNG new file mode 100644 index 0000000000000000000000000000000000000000..2c65f90f473c80463fc64398b9baab4fca2535a8 GIT binary patch literal 30489 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/webui_settings.PNG b/docs/screenshots/webui_settings.PNG new file mode 100644 index 0000000000000000000000000000000000000000..4303c0e4efc6d57017eaf9b3fcad7767ee1992c2 GIT binary patch literal 53822 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/webui_streams.PNG b/docs/screenshots/webui_streams.PNG new file mode 100644 index 0000000000000000000000000000000000000000..17fb6957f9ef420557ee9e39f573a44e286a7e6a GIT binary patch literal 39796 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/webui_version.PNG b/docs/screenshots/webui_version.PNG new file mode 100644 index 0000000000000000000000000000000000000000..abc3c4a0a55dec1fb779a10f74b98d9937c5cb6f GIT binary patch literal 26918 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 K9xF2UxbZ&?%Ax82 literal 0 HcmV?d00001 diff --git a/docs/screenshots/webui_xmltv.PNG b/docs/screenshots/webui_xmltv.PNG new file mode 100644 index 0000000000000000000000000000000000000000..e73cd652f91cd982ac2596d7a1ba6ccd70f5d8aa GIT binary patch literal 27723 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 literal 0 HcmV?d00001 diff --git a/fHDHR/__init__.py b/fHDHR/__init__.py new file mode 100644 index 0000000..d909e43 --- /dev/null +++ b/fHDHR/__init__.py @@ -0,0 +1,34 @@ +# coding=utf-8 + +from .origin import OriginServiceWrapper +from .device import fHDHR_Device + +import fHDHR.tools + +fHDHR_VERSION = "v0.4.5-beta" + + +class fHDHR_INT_OBJ(): + + def __init__(self, settings, logger, db): + self.version = fHDHR_VERSION + self.config = settings + self.logger = logger + self.db = db + + self.web = fHDHR.tools.WebReq() + + +class fHDHR_OBJ(): + + def __init__(self, settings, logger, db): + self.fhdhr = fHDHR_INT_OBJ(settings, logger, db) + + self.origin = OriginServiceWrapper(self.fhdhr) + + self.device = fHDHR_Device(self.fhdhr, self.origin) + + def __getattr__(self, name): + ''' will only get called for undefined attributes ''' + if hasattr(self.fhdhr, name): + return eval("self.fhdhr." + name) diff --git a/fHDHR/cli/__init__.py b/fHDHR/cli/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fHDHR/cli/run.py b/fHDHR/cli/run.py new file mode 100644 index 0000000..bcf80a6 --- /dev/null +++ b/fHDHR/cli/run.py @@ -0,0 +1,114 @@ +import os +import sys +import argparse +import time +import multiprocessing +import threading +import platform + +from fHDHR import fHDHR_VERSION, fHDHR_OBJ +import fHDHR.exceptions +import fHDHR.config +from fHDHR.http import fHDHR_HTTP_Server +from fHDHR.db import fHDHRdb + +ERR_CODE = 1 +ERR_CODE_NO_RESTART = 2 + + +if sys.version_info.major == 2 or sys.version_info < (3, 7): + print('Error: fHDHR requires python 3.7+.') + sys.exit(1) + +opersystem = platform.system() +if opersystem in ["Windows"]: + print("WARNING: This script may fail on Windows. Try Setting the `thread_method` to `threading`") + + +def build_args_parser(): + """Build argument parser for fHDHR""" + parser = argparse.ArgumentParser(description='fHDHR') + parser.add_argument('-c', '--config', dest='cfg', type=str, required=True, help='configuration file to load.') + return parser.parse_args() + + +def get_configuration(args, script_dir): + if not os.path.isfile(args.cfg): + raise fHDHR.exceptions.ConfigurationNotFound(filename=args.cfg) + return fHDHR.config.Config(args.cfg, script_dir) + + +def run(settings, logger, db): + + fhdhr = fHDHR_OBJ(settings, logger, db) + fhdhrweb = fHDHR_HTTP_Server(fhdhr) + + try: + + print("HTTP Server Starting") + if settings.dict["main"]["thread_method"] in ["multiprocessing"]: + fhdhr_web = multiprocessing.Process(target=fhdhrweb.run) + elif settings.dict["main"]["thread_method"] in ["threading"]: + fhdhr_web = threading.Thread(target=fhdhrweb.run) + if settings.dict["main"]["thread_method"] in ["multiprocessing", "threading"]: + fhdhr_web.start() + + if settings.dict["fhdhr"]["discovery_address"]: + print("SSDP Server Starting") + if settings.dict["main"]["thread_method"] in ["multiprocessing"]: + fhdhr_ssdp = multiprocessing.Process(target=fhdhr.device.ssdp.run) + elif settings.dict["main"]["thread_method"] in ["threading"]: + fhdhr_ssdp = threading.Thread(target=fhdhr.device.ssdp.run) + if settings.dict["main"]["thread_method"] in ["multiprocessing", "threading"]: + fhdhr_ssdp.start() + + if settings.dict["epg"]["method"]: + print("EPG Update Starting") + if settings.dict["main"]["thread_method"] in ["multiprocessing"]: + fhdhr_epg = multiprocessing.Process(target=fhdhr.device.epg.run) + elif settings.dict["main"]["thread_method"] in ["threading"]: + fhdhr_epg = threading.Thread(target=fhdhr.device.epg.run) + if settings.dict["main"]["thread_method"] in ["multiprocessing", "threading"]: + fhdhr_epg.start() + + # wait forever + while True: + time.sleep(3600) + + except KeyboardInterrupt: + return ERR_CODE_NO_RESTART + + return ERR_CODE + + +def start(args, script_dir): + """Get Configuration for fHDHR and start""" + + try: + settings = get_configuration(args, script_dir) + except fHDHR.exceptions.ConfigurationError as e: + print(e) + return ERR_CODE_NO_RESTART + + logger = settings.logging_setup() + + db = fHDHRdb(settings) + + return run(settings, logger, db) + + +def main(script_dir): + """fHDHR run script entry point""" + + print("Loading fHDHR " + fHDHR_VERSION) + + try: + args = build_args_parser() + return start(args, script_dir) + except KeyboardInterrupt: + print("\n\nInterrupted") + return ERR_CODE + + +if __name__ == '__main__': + main() diff --git a/fHDHR/config/__init__.py b/fHDHR/config/__init__.py new file mode 100644 index 0000000..af054f0 --- /dev/null +++ b/fHDHR/config/__init__.py @@ -0,0 +1,301 @@ +import os +import sys +import random +import configparser +import pathlib +import logging +import subprocess +import platform +import json + +import fHDHR.exceptions +from fHDHR import fHDHR_VERSION +from fHDHR.tools import isint, isfloat, is_arithmetic, is_docker + + +class Config(): + + def __init__(self, filename, script_dir): + self.internal = {} + self.conf_default = {} + self.dict = {} + self.config_file = filename + + self.initial_load(script_dir) + self.config_verification() + + def initial_load(self, script_dir): + + data_dir = pathlib.Path(script_dir).joinpath('data') + www_dir = pathlib.Path(data_dir).joinpath('www') + + self.internal["paths"] = { + "script_dir": script_dir, + "data_dir": data_dir, + "cache_dir": pathlib.Path(data_dir).joinpath('cache'), + "internal_config": pathlib.Path(data_dir).joinpath('internal_config'), + "www_dir": www_dir, + "www_templates_dir": pathlib.Path(www_dir).joinpath('templates'), + "font": pathlib.Path(data_dir).joinpath('garamond.ttf'), + } + + for conffile in os.listdir(self.internal["paths"]["internal_config"]): + conffilepath = os.path.join(self.internal["paths"]["internal_config"], conffile) + if str(conffilepath).endswith(".json"): + self.read_json_config(conffilepath) + + print("Loading Configuration File: " + str(self.config_file)) + self.read_ini_config(self.config_file) + + self.load_versions() + + def load_versions(self): + + self.internal["versions"] = {} + + self.internal["versions"]["fHDHR"] = fHDHR_VERSION + + self.internal["versions"]["Python"] = sys.version + + opersystem = platform.system() + self.internal["versions"]["Operating System"] = opersystem + if opersystem in ["Linux", "Darwin"]: + # Linux/Mac + if os.getuid() == 0 or os.geteuid() == 0: + print('Warning: Do not run fHDHR with root privileges.') + elif opersystem in ["Windows"]: + # Windows + if os.environ.get("USERNAME") == "Administrator": + print('Warning: Do not run fHDHR as Administrator.') + else: + print("Uncommon Operating System, use at your own risk.") + + isdocker = is_docker() + self.internal["versions"]["Docker"] = isdocker + + if self.dict["fhdhr"]["stream_type"] == "ffmpeg": + try: + ffmpeg_command = [self.dict["ffmpeg"]["path"], + "-version", + "pipe:stdout" + ] + + ffmpeg_proc = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE) + ffmpeg_version = ffmpeg_proc.stdout.read() + ffmpeg_proc.terminate() + ffmpeg_proc.communicate() + ffmpeg_version = ffmpeg_version.decode().split("version ")[1].split(" ")[0] + except FileNotFoundError: + ffmpeg_version = "Missing" + print("Failed to find ffmpeg.") + self.internal["versions"]["ffmpeg"] = ffmpeg_version + + if self.dict["fhdhr"]["stream_type"] == "vlc": + try: + vlc_command = [self.dict["vlc"]["path"], + "--version", + "pipe:stdout" + ] + + vlc_proc = subprocess.Popen(vlc_command, stdout=subprocess.PIPE) + vlc_version = vlc_proc.stdout.read() + vlc_proc.terminate() + vlc_proc.communicate() + vlc_version = vlc_version.decode().split("version ")[1].split('\n')[0] + except FileNotFoundError: + vlc_version = "Missing" + print("Failed to find vlc.") + self.internal["versions"]["vlc"] = vlc_version + + def read_json_config(self, conffilepath): + with open(conffilepath, 'r') as jsonconf: + confimport = json.load(jsonconf) + for section in list(confimport.keys()): + + if section not in self.dict.keys(): + self.dict[section] = {} + + if section not in self.conf_default.keys(): + self.conf_default[section] = {} + + for key in list(confimport[section].keys()): + + if key not in list(self.conf_default[section].keys()): + self.conf_default[section][key] = {} + + confvalue = confimport[section][key]["value"] + if isint(confvalue): + confvalue = int(confvalue) + elif isfloat(confvalue): + confvalue = float(confvalue) + elif is_arithmetic(confvalue): + confvalue = eval(confvalue) + elif "," in confvalue: + confvalue = confvalue.split(",") + elif str(confvalue).lower() in ["none"]: + confvalue = None + elif str(confvalue).lower() in ["false"]: + confvalue = False + elif str(confvalue).lower() in ["true"]: + confvalue = True + + self.dict[section][key] = confvalue + + self.conf_default[section][key]["value"] = confvalue + + for config_option in ["config_web_hidden", "config_file", "config_web"]: + if config_option not in list(confimport[section][key].keys()): + config_option_value = False + else: + config_option_value = confimport[section][key][config_option] + if str(config_option_value).lower() in ["none"]: + config_option_value = None + elif str(config_option_value).lower() in ["false"]: + config_option_value = False + elif str(config_option_value).lower() in ["true"]: + config_option_value = True + self.conf_default[section][key][config_option] = config_option_value + + def read_ini_config(self, conffilepath): + config_handler = configparser.ConfigParser() + config_handler.read(conffilepath) + for each_section in config_handler.sections(): + if each_section.lower() not in list(self.dict.keys()): + self.dict[each_section.lower()] = {} + for (each_key, each_val) in config_handler.items(each_section): + if not each_val: + each_val = None + elif each_val.lower() in ["none"]: + each_val = None + elif each_val.lower() in ["false"]: + each_val = False + elif each_val.lower() in ["true"]: + each_val = True + elif isint(each_val): + each_val = int(each_val) + elif isfloat(each_val): + each_val = float(each_val) + elif is_arithmetic(each_val): + each_val = eval(each_val) + elif "," in each_val: + each_val = each_val.split(",") + + import_val = True + if each_section in list(self.conf_default.keys()): + if each_key in list(self.conf_default[each_section].keys()): + if not self.conf_default[each_section][each_key]["config_file"]: + import_val = False + + if import_val: + self.dict[each_section.lower()][each_key.lower()] = each_val + + def write(self, section, key, value): + if section == self.dict["main"]["dictpopname"]: + self.dict["origin"][key] = value + else: + self.dict[section][key] = value + + config_handler = configparser.ConfigParser() + config_handler.read(self.config_file) + + if not config_handler.has_section(section): + config_handler.add_section(section) + + config_handler.set(section, key, value) + + with open(self.config_file, 'w') as config_file: + config_handler.write(config_file) + + def config_verification(self): + + if self.dict["main"]["thread_method"] not in ["threading", "multiprocessing"]: + raise fHDHR.exceptions.ConfigurationError("Invalid Threading Method. Exiting...") + + if self.dict["main"]["required"]: + required_missing = [] + if isinstance(self.dict["main"]["required"], str): + self.dict["main"]["required"] = [self.dict["main"]["required"]] + if len(self.dict["main"]["required"]): + for req_item in self.dict["main"]["required"]: + req_section = req_item.split("/")[0] + req_key = req_item.split("/")[1] + if not self.dict[req_section][req_key]: + required_missing.append(req_item) + if len(required_missing): + raise fHDHR.exceptions.ConfigurationError("Required configuration options missing: " + ", ".join(required_missing)) + + self.dict["origin"] = self.dict.pop(self.dict["main"]["dictpopname"]) + + if isinstance(self.dict["main"]["valid_epg_methods"], str): + self.dict["main"]["valid_epg_methods"] = [self.dict["main"]["valid_epg_methods"]] + + if self.dict["epg"]["method"] and self.dict["epg"]["method"] not in ["None"]: + if isinstance(self.dict["epg"]["method"], str): + self.dict["epg"]["method"] = [self.dict["epg"]["method"]] + epg_methods = [] + for epg_method in self.dict["epg"]["method"]: + if epg_method == self.dict["main"]["dictpopname"] or epg_method == "origin": + epg_methods.append("origin") + elif epg_method in ["None"]: + raise fHDHR.exceptions.ConfigurationError("Invalid EPG Method. Exiting...") + elif epg_method in self.dict["main"]["valid_epg_methods"]: + epg_methods.append(epg_method) + else: + raise fHDHR.exceptions.ConfigurationError("Invalid EPG Method. Exiting...") + self.dict["epg"]["def_method"] = self.dict["epg"]["method"][0] + + if not self.dict["main"]["uuid"]: + self.dict["main"]["uuid"] = ''.join(random.choice("hijklmnopqrstuvwxyz") for i in range(8)) + self.write('main', 'uuid', self.dict["main"]["uuid"]) + + if self.dict["main"]["cache_dir"]: + if not pathlib.Path(self.dict["main"]["cache_dir"]).is_dir(): + raise fHDHR.exceptions.ConfigurationError("Invalid Cache Directory. Exiting...") + self.internal["paths"]["cache_dir"] = pathlib.Path(self.dict["main"]["cache_dir"]) + cache_dir = self.internal["paths"]["cache_dir"] + + logs_dir = pathlib.Path(cache_dir).joinpath('logs') + self.internal["paths"]["logs_dir"] = logs_dir + if not logs_dir.is_dir(): + logs_dir.mkdir() + + self.dict["database"]["path"] = pathlib.Path(cache_dir).joinpath('fhdhr.db') + + if self.dict["fhdhr"]["stream_type"] not in ["direct", "ffmpeg", "vlc"]: + raise fHDHR.exceptions.ConfigurationError("Invalid stream type. Exiting...") + + if not self.dict["fhdhr"]["discovery_address"] and self.dict["fhdhr"]["address"] != "0.0.0.0": + self.dict["fhdhr"]["discovery_address"] = self.dict["fhdhr"]["address"] + if not self.dict["fhdhr"]["discovery_address"] or self.dict["fhdhr"]["discovery_address"] == "0.0.0.0": + self.dict["fhdhr"]["discovery_address"] = None + + def logging_setup(self): + + log_level = self.dict["logging"]["level"].upper() + + # Create a custom logger + logging.basicConfig(format='%(name)s - %(levelname)s - %(message)s', level=log_level) + logger = logging.getLogger('fHDHR') + log_file = os.path.join(self.internal["paths"]["logs_dir"], 'fHDHR.log') + + # Create handlers + # c_handler = logging.StreamHandler() + f_handler = logging.FileHandler(log_file) + # c_handler.setLevel(log_level) + f_handler.setLevel(log_level) + + # Create formatters and add it to handlers + # c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s') + f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + # c_handler.setFormatter(c_format) + f_handler.setFormatter(f_format) + + # Add handlers to the logger + # logger.addHandler(c_handler) + logger.addHandler(f_handler) + return logger + + def __getattr__(self, name): + ''' will only get called for undefined attributes ''' + if name in list(self.dict.keys()): + return self.dict[name] diff --git a/fHDHR/db/__init__.py b/fHDHR/db/__init__.py new file mode 100644 index 0000000..86fd530 --- /dev/null +++ b/fHDHR/db/__init__.py @@ -0,0 +1,405 @@ +# coding=utf-8 + +import json +import os.path +import traceback + +from sqlalchemy import Column, create_engine, String, Text +from sqlalchemy.engine.url import URL +from sqlalchemy.exc import OperationalError, SQLAlchemyError +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import scoped_session, sessionmaker + + +def _deserialize(value): + if value is None: + return None + # sqlite likes to return ints for strings that look like ints, even though + # the column type is string. That's how you do dynamic typing wrong. + value = str(value) + # Just in case someone's mucking with the DB in a way we can't account for, + # ignore json parsing errors + try: + value = json.loads(value) + except ValueError: + pass + return value + + +BASE = declarative_base() +MYSQL_TABLE_ARGS = {'mysql_engine': 'InnoDB', + 'mysql_charset': 'utf8mb4', + 'mysql_collate': 'utf8mb4_unicode_ci'} + + +class ChannelValues(BASE): + __tablename__ = 'channel_values' + __table_args__ = MYSQL_TABLE_ARGS + channel = Column(String(255), primary_key=True) + namespace = Column(String(255), primary_key=True) + key = Column(String(255), primary_key=True) + value = Column(Text()) + + +class ProgramValues(BASE): + __tablename__ = 'program_values' + __table_args__ = MYSQL_TABLE_ARGS + program = Column(String(255), primary_key=True) + namespace = Column(String(255), primary_key=True) + key = Column(String(255), primary_key=True) + value = Column(Text()) + + +class CacheValues(BASE): + __tablename__ = 'cache_values' + __table_args__ = MYSQL_TABLE_ARGS + cacheitem = Column(String(255), primary_key=True) + namespace = Column(String(255), primary_key=True) + key = Column(String(255), primary_key=True) + value = Column(Text()) + + +class fHDHRValues(BASE): + __tablename__ = 'fhdhr_values' + __table_args__ = MYSQL_TABLE_ARGS + item = Column(String(255), primary_key=True) + namespace = Column(String(255), primary_key=True) + key = Column(String(255), primary_key=True) + value = Column(Text()) + + +class fHDHRdb(object): + + def __init__(self, settings): + self.config = settings + # MySQL - mysql://username:password@localhost/db + # SQLite - sqlite:////cache/path/default.db + self.type = self.config.dict["database"]["type"] + + # Handle SQLite explicitly as a default + if self.type == 'sqlite': + path = self.config.dict["database"]["path"] + path = os.path.expanduser(path) + self.filename = path + self.url = 'sqlite:///%s' % path + # Otherwise, handle all other database engines + else: + query = {} + if self.type == 'mysql': + drivername = self.config.dict["database"]["driver"] or 'mysql' + query = {'charset': 'utf8mb4'} + elif self.type == 'postgres': + drivername = self.config.dict["database"]["driver"] or 'postgresql' + elif self.type == 'oracle': + drivername = self.config.dict["database"]["driver"] or 'oracle' + elif self.type == 'mssql': + drivername = self.config.dict["database"]["driver"] or 'mssql+pymssql' + elif self.type == 'firebird': + drivername = self.config.dict["database"]["driver"] or 'firebird+fdb' + elif self.type == 'sybase': + drivername = self.config.dict["database"]["driver"] or 'sybase+pysybase' + else: + raise Exception('Unknown db_type') + + db_user = self.config.dict["database"]["user"] + db_pass = self.config.dict["database"]["pass"] + db_host = self.config.dict["database"]["host"] + db_port = self.config.dict["database"]["port"] # Optional + db_name = self.config.dict["database"]["name"] # Optional, depending on DB + + # Ensure we have all our variables defined + if db_user is None or db_pass is None or db_host is None: + raise Exception('Please make sure the following core ' + 'configuration values are defined: ' + 'db_user, db_pass, db_host') + self.url = URL(drivername=drivername, username=db_user, + password=db_pass, host=db_host, port=db_port, + database=db_name, query=query) + + self.engine = create_engine(self.url, pool_recycle=3600) + + # Catch any errors connecting to database + try: + self.engine.connect() + except OperationalError: + print("OperationalError: Unable to connect to database.") + raise + + # Create our tables + BASE.metadata.create_all(self.engine) + + self.ssession = scoped_session(sessionmaker(bind=self.engine)) + + def connect(self): + if self.type != 'sqlite': + print( + "Raw connection requested when 'db_type' is not 'sqlite':\n" + "Consider using 'db.session()' to get a SQLAlchemy session " + "instead here:\n%s", + traceback.format_list(traceback.extract_stack()[:-1])[-1][:-1]) + return self.engine.raw_connection() + + def session(self): + return self.ssession() + + def execute(self, *args, **kwargs): + return self.engine.execute(*args, **kwargs) + + def get_uri(self): + return self.url + + # Channel Values + + def set_channel_value(self, channel, key, value, namespace='default'): + channel = channel.lower() + value = json.dumps(value, ensure_ascii=False) + session = self.ssession() + try: + result = session.query(ChannelValues) \ + .filter(ChannelValues.channel == channel)\ + .filter(ChannelValues.namespace == namespace)\ + .filter(ChannelValues.key == key) \ + .one_or_none() + # ChannelValues exists, update + if result: + result.value = value + session.commit() + # DNE - Insert + else: + new_channelvalue = ChannelValues(channel=channel, namespace=namespace, key=key, value=value) + session.add(new_channelvalue) + session.commit() + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + def get_channel_value(self, channel, key, namespace='default'): + channel = channel.lower() + session = self.ssession() + try: + result = session.query(ChannelValues) \ + .filter(ChannelValues.channel == channel)\ + .filter(ChannelValues.namespace == namespace)\ + .filter(ChannelValues.key == key) \ + .one_or_none() + if result is not None: + result = result.value + return _deserialize(result) + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + def delete_channel_value(self, channel, key, namespace='default'): + channel = channel.lower() + session = self.ssession() + try: + result = session.query(ChannelValues) \ + .filter(ChannelValues.channel == channel)\ + .filter(ChannelValues.namespace == namespace)\ + .filter(ChannelValues.key == key) \ + .one_or_none() + # ChannelValues exists, delete + if result: + session.delete(result) + session.commit() + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + # Program Values + + def set_program_value(self, program, key, value, namespace='default'): + program = program.lower() + value = json.dumps(value, ensure_ascii=False) + session = self.ssession() + try: + result = session.query(ProgramValues) \ + .filter(ProgramValues.program == program)\ + .filter(ProgramValues.namespace == namespace)\ + .filter(ProgramValues.key == key) \ + .one_or_none() + # ProgramValue exists, update + if result: + result.value = value + session.commit() + # DNE - Insert + else: + new_programvalue = ProgramValues(program=program, namespace=namespace, key=key, value=value) + session.add(new_programvalue) + session.commit() + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + def get_program_value(self, program, key, namespace='default'): + program = program.lower() + session = self.ssession() + try: + result = session.query(ProgramValues) \ + .filter(ProgramValues.program == program)\ + .filter(ProgramValues.namespace == namespace)\ + .filter(ProgramValues.key == key) \ + .one_or_none() + if result is not None: + result = result.value + return _deserialize(result) + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + def delete_program_value(self, program, key, namespace='default'): + program = program.lower() + session = self.ssession() + try: + result = session.query(ProgramValues) \ + .filter(ProgramValues.program == program)\ + .filter(ProgramValues.namespace == namespace)\ + .filter(ProgramValues.key == key) \ + .one_or_none() + # ProgramValue exists, delete + if result: + session.delete(result) + session.commit() + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + # Cache Values + + def set_cacheitem_value(self, cacheitem, key, value, namespace='default'): + cacheitem = cacheitem.lower() + value = json.dumps(value, ensure_ascii=False) + session = self.ssession() + try: + result = session.query(CacheValues) \ + .filter(CacheValues.cacheitem == cacheitem)\ + .filter(CacheValues.namespace == namespace)\ + .filter(CacheValues.key == key) \ + .one_or_none() + # ProgramValue exists, update + if result: + result.value = value + session.commit() + # DNE - Insert + else: + new_cacheitemvalue = CacheValues(cacheitem=cacheitem, namespace=namespace, key=key, value=value) + session.add(new_cacheitemvalue) + session.commit() + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + def get_cacheitem_value(self, cacheitem, key, namespace='default'): + cacheitem = cacheitem.lower() + session = self.ssession() + try: + result = session.query(CacheValues) \ + .filter(CacheValues.cacheitem == cacheitem)\ + .filter(CacheValues.namespace == namespace)\ + .filter(CacheValues.key == key) \ + .one_or_none() + if result is not None: + result = result.value + return _deserialize(result) + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + def delete_cacheitem_value(self, cacheitem, key, namespace='default'): + cacheitem = cacheitem.lower() + session = self.ssession() + try: + result = session.query(CacheValues) \ + .filter(CacheValues.cacheitem == cacheitem)\ + .filter(CacheValues.namespace == namespace)\ + .filter(CacheValues.key == key) \ + .one_or_none() + # ProgramValue exists, delete + if result: + session.delete(result) + session.commit() + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + # fHDHR Values + + def set_fhdhr_value(self, item, key, value, namespace='default'): + item = item.lower() + value = json.dumps(value, ensure_ascii=False) + session = self.ssession() + try: + result = session.query(fHDHRValues) \ + .filter(fHDHRValues.item == item)\ + .filter(fHDHRValues.namespace == namespace)\ + .filter(fHDHRValues.key == key) \ + .one_or_none() + # ProgramValue exists, update + if result: + result.value = value + session.commit() + # DNE - Insert + else: + new_cacheitemvalue = fHDHRValues(item=item, namespace=namespace, key=key, value=value) + session.add(new_cacheitemvalue) + session.commit() + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + def get_fhdhr_value(self, item, key, namespace='default'): + item = item.lower() + session = self.ssession() + try: + result = session.query(fHDHRValues) \ + .filter(fHDHRValues.item == item)\ + .filter(fHDHRValues.namespace == namespace)\ + .filter(fHDHRValues.key == key) \ + .one_or_none() + if result is not None: + result = result.value + return _deserialize(result) + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() + + def delete_fhdhr_value(self, item, key, namespace='default'): + item = item.lower() + session = self.ssession() + try: + result = session.query(fHDHRValues) \ + .filter(fHDHRValues.item == item)\ + .filter(fHDHRValues.namespace == namespace)\ + .filter(fHDHRValues.key == key) \ + .one_or_none() + # ProgramValue exists, delete + if result: + session.delete(result) + session.commit() + except SQLAlchemyError: + session.rollback() + raise + finally: + session.close() diff --git a/fHDHR/device/__init__.py b/fHDHR/device/__init__.py new file mode 100644 index 0000000..fc442e7 --- /dev/null +++ b/fHDHR/device/__init__.py @@ -0,0 +1,23 @@ +from .channels import Channels +from .epg import EPG +from .tuners import Tuners +from .images import imageHandler +from .ssdp import SSDPServer +from .cluster import fHDHR_Cluster + + +class fHDHR_Device(): + + def __init__(self, fhdhr, origin): + + self.channels = Channels(fhdhr, origin) + + self.epg = EPG(fhdhr, self.channels, origin) + + self.tuners = Tuners(fhdhr, self.epg, self.channels) + + self.images = imageHandler(fhdhr, self.epg) + + self.ssdp = SSDPServer(fhdhr) + + self.cluster = fHDHR_Cluster(fhdhr, self.ssdp) diff --git a/fHDHR/device/channels/__init__.py b/fHDHR/device/channels/__init__.py new file mode 100644 index 0000000..119da2f --- /dev/null +++ b/fHDHR/device/channels/__init__.py @@ -0,0 +1,95 @@ +import datetime +import time + +from fHDHR.tools import hours_between_datetime + +from .channel import Channel +from .chan_ident import Channel_IDs + + +class Channels(): + + def __init__(self, fhdhr, origin): + self.fhdhr = fhdhr + + self.origin = origin + + self.id_system = Channel_IDs(fhdhr) + + self.list = {} + self.list_update_time = None + + self.get_db_channels() + haseverscanned = self.fhdhr.db.get_fhdhr_value("channels", "scanned_time") + if (self.fhdhr.config.dict["fhdhr"]["chanscan_on_start"] or not haseverscanned): + self.get_channels() + + def get_channel_obj(self, keyfind, valfind): + return next(self.list[fhdhr_id] for fhdhr_id in list(self.list.keys()) if self.list[fhdhr_id].dict[keyfind] == valfind) + + def get_channel_list(self, keyfind): + return [self.list[x].dict[keyfind] for x in list(self.list.keys())] + + def set_channel_status(self, keyfind, valfind, updatedict): + self.get_channel_obj(keyfind, valfind).set_status(updatedict) + + def set_channel_enablement_all(self, enablement): + for fhdhr_id in list(self.list.keys()): + self.list[fhdhr_id].set_enablement(enablement) + + def set_channel_enablement(self, keyfind, valfind, enablement): + self.get_channel_obj(keyfind, valfind).set_enablement(enablement) + + def set_channel_favorite(self, keyfind, valfind, enablement): + self.get_channel_obj(keyfind, valfind).set_favorite(enablement) + + def get_db_channels(self): + self.fhdhr.logger.info("Checking for Channel information stored in the database.") + channel_ids = self.fhdhr.db.get_fhdhr_value("channels", "list") or [] + if len(channel_ids): + self.fhdhr.logger.info("Found %s existing channels in the database." % str(len(channel_ids))) + for channel_id in channel_ids: + channel_obj = Channel(self.fhdhr, self.id_system, channel_id=channel_id) + channel_id = channel_obj.dict["id"] + self.list[channel_id] = channel_obj + + def get_channels(self, forceupdate=False): + """Pull Channels from origin. + + Output a list. + + Don't pull more often than 12 hours. + """ + + updatelist = False + if not self.list_update_time: + updatelist = True + elif hours_between_datetime(self.list_update_time, datetime.datetime.now()) > 12: + updatelist = True + elif forceupdate: + updatelist = True + + if updatelist: + self.fhdhr.logger.info("Performing Channel Scan.") + channel_dict_list = self.origin.get_channels() + for channel_info in channel_dict_list: + channel_obj = Channel(self.fhdhr, self.id_system, origin_id=channel_info["id"]) + channel_id = channel_obj.dict["id"] + channel_obj.basics(channel_info) + self.list[channel_id] = channel_obj + + if not self.list_update_time: + self.fhdhr.logger.info("Found " + str(len(self.list)) + " channels for " + str(self.fhdhr.config.dict["main"]["servicename"])) + self.list_update_time = datetime.datetime.now() + self.fhdhr.db.set_fhdhr_value("channels", "scanned_time", time.time()) + + channel_list = [] + for chan_obj in list(self.list.keys()): + channel_list.append(self.list[chan_obj].dict) + return channel_list + + def get_channel_stream(self, channel_number): + return self.origin.get_channel_stream(self.get_channel_dict("number", channel_number)) + + def get_channel_dict(self, keyfind, valfind): + return self.get_channel_obj(keyfind, valfind).dict diff --git a/fHDHR/device/channels/chan_ident.py b/fHDHR/device/channels/chan_ident.py new file mode 100644 index 0000000..ae94d7d --- /dev/null +++ b/fHDHR/device/channels/chan_ident.py @@ -0,0 +1,38 @@ +import uuid + + +class Channel_IDs(): + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def get(self, origin_id): + existing_ids = self.fhdhr.db.get_fhdhr_value("channels", "list") or [] + existing_channel_info = [self.fhdhr.db.get_channel_value(channel_id, "dict") or {} for channel_id in existing_ids] + for existing_channel in existing_channel_info: + if existing_channel["origin_id"] == origin_id: + return existing_channel["id"] + return self.assign() + + def assign(self): + existing_ids = self.fhdhr.db.get_fhdhr_value("channels", "list") or [] + channel_id = None + while not channel_id: + unique_id = str(uuid.uuid4()) + if str(unique_id) not in existing_ids: + channel_id = str(unique_id) + existing_ids.append(channel_id) + self.fhdhr.db.set_fhdhr_value("channels", "list", existing_ids) + return channel_id + + def get_number(self, channel_id): + existing_ids = self.fhdhr.db.get_fhdhr_value("channels", "list") or [] + existing_channel_info = [self.fhdhr.db.get_channel_value(channel_id, "dict") or {} for channel_id in existing_ids] + cnumber = [existing_channel["number"] for existing_channel in existing_channel_info if existing_channel["id"] == channel_id] or None + if cnumber: + return cnumber + + used_numbers = [existing_channel["number"] for existing_channel in existing_channel_info] + for i in range(1000, 2000): + if str(float(i)) not in used_numbers: + break + return str(float(i)) diff --git a/fHDHR/device/channels/channel.py b/fHDHR/device/channels/channel.py new file mode 100644 index 0000000..4a1ad68 --- /dev/null +++ b/fHDHR/device/channels/channel.py @@ -0,0 +1,137 @@ + + +class Channel(): + + def __init__(self, fhdhr, id_system, origin_id=None, channel_id=None): + self.fhdhr = fhdhr + + self.id_system = id_system + + if not channel_id: + if origin_id: + channel_id = id_system.get(origin_id) + else: + channel_id = id_system.assign() + self.dict = self.fhdhr.db.get_channel_value(str(channel_id), "dict") or self.default_dict(channel_id) + self.verify_dict() + self.fhdhr.db.set_channel_value(self.dict["id"], "dict", self.dict) + + def verify_dict(self): + """Development Purposes + Add new Channel dict keys + """ + default_dict = self.default_dict(self.dict["id"]) + for key in list(default_dict.keys()): + if key not in list(self.dict.keys()): + self.dict[key] = default_dict[key] + + def basics(self, channel_info): + """Some Channel Information is Critical""" + + if "name" not in list(channel_info.keys()): + channel_info["name"] = self.dict["id"] + self.dict["origin_name"] = channel_info["name"] + if not self.dict["name"]: + self.dict["name"] = self.dict["origin_name"] + + if "id" not in list(channel_info.keys()): + channel_info["id"] = channel_info["name"] + self.dict["origin_id"] = channel_info["id"] + + if "callsign" not in list(channel_info.keys()): + channel_info["callsign"] = channel_info["name"] + self.dict["origin_callsign"] = channel_info["callsign"] + if not self.dict["callsign"]: + self.dict["callsign"] = self.dict["origin_callsign"] + + if "tags" not in list(channel_info.keys()): + channel_info["tags"] = [] + self.dict["origin_tags"] = channel_info["tags"] + if not self.dict["tags"]: + self.dict["tags"] = self.dict["origin_tags"] + + if "number" not in list(channel_info.keys()): + channel_info["number"] = self.id_system.get_number(channel_info["id"]) + self.dict["origin_number"] = str(float(channel_info["number"])) + if not self.dict["number"]: + self.dict["number"] = self.dict["origin_number"] + + if "thumbnail" not in list(channel_info.keys()): + channel_info["thumbnail"] = None + self.dict["origin_thumbnail"] = channel_info["thumbnail"] + if not self.dict["thumbnail"]: + self.dict["thumbnail"] = self.dict["origin_thumbnail"] + + if "HD" not in list(channel_info.keys()): + channel_info["HD"] = 0 + self.dict["HD"] = channel_info["HD"] + + self.fhdhr.db.set_channel_value(self.dict["id"], "dict", self.dict) + + def default_dict(self, channel_id): + return { + "id": str(channel_id), "origin_id": None, + "name": None, "origin_name": None, + "callsign": None, "origin_callsign": None, + "number": None, "origin_number": None, + "tags": [], "origin_tags": [], + "thumbnail": None, "origin_thumbnail": None, + "enabled": True, "favorite": 0, + "HD": 0, + } + + def destroy(self): + self.fhdhr.db.delete_channel_value(self.dict["id"], "dict") + channel_ids = self.fhdhr.db.get_fhdhr_value("channels", "list") or [] + if self.dict["id"] in channel_ids: + channel_ids.remove(self.dict["id"]) + self.fhdhr.db.set_fhdhr_value("channels", "list", channel_ids) + + def set_status(self, updatedict): + for key in list(updatedict.keys()): + if key == "number": + updatedict[key] = str(float(updatedict[key])) + self.dict[key] = updatedict[key] + self.fhdhr.db.set_channel_value(self.dict["id"], "dict", self.dict) + + def lineup_dict(self): + return { + 'GuideNumber': self.dict['number'], + 'GuideName': self.dict['name'], + 'Tags': ",".join(self.dict['tags']), + 'URL': self.stream_url(), + 'HD': self.dict["HD"], + "Favorite": self.dict["favorite"], + } + + def stream_url(self): + return ('/auto/v%s' % self.dict['number']) + + def play_url(self): + return ('/api/m3u?method=get&channel=%s' % self.dict['number']) + + def set_favorite(self, enablement): + if enablement == "+": + self.dict["favorite"] = 1 + elif enablement == "+": + self.dict["favorite"] = 0 + self.fhdhr.db.set_channel_value(self.dict["id"], "info", self.dict) + + def set_enablement(self, enablement): + if enablement == "disable": + self.dict["enabled"] = False + elif enablement == "enable": + self.dict["enabled"] = True + elif enablement == "toggle": + if self.dict["enabled"]: + self.dict["enabled"] = False + else: + self.dict["enabled"] = True + self.fhdhr.db.set_channel_value(self.dict["id"], "info", self.dict) + + def __getattr__(self, name): + ''' will only get called for undefined attributes ''' + if name in list(self.dict.keys()): + return self.dict[name] + else: + return None diff --git a/fHDHR/device/cluster.py b/fHDHR/device/cluster.py new file mode 100644 index 0000000..3a6e629 --- /dev/null +++ b/fHDHR/device/cluster.py @@ -0,0 +1,165 @@ +import urllib.parse +from collections import OrderedDict + + +class fHDHR_Cluster(): + + def __init__(self, fhdhr, ssdp): + self.fhdhr = fhdhr + + self.ssdp = ssdp + + self.friendlyname = self.fhdhr.config.dict["fhdhr"]["friendlyname"] + self.location = None + self.location_url = None + + if fhdhr.config.dict["fhdhr"]["discovery_address"]: + self.location = ('http://' + fhdhr.config.dict["fhdhr"]["discovery_address"] + ':' + + str(fhdhr.config.dict["fhdhr"]["port"])) + self.location_url = urllib.parse.quote(self.location) + + self.startup_sync() + + def cluster(self): + return self.fhdhr.db.get_fhdhr_value("cluster", "dict") or self.default_cluster() + + def get_cluster_dicts_web(self): + fhdhr_list = self.cluster() + locations = [] + for location in list(fhdhr_list.keys()): + item_dict = { + "base_url": fhdhr_list[location]["base_url"], + "name": fhdhr_list[location]["name"] + } + if item_dict["base_url"] != self.location: + locations.append(item_dict) + if len(locations): + locations = sorted(locations, key=lambda i: i['name']) + return locations + else: + return None + + def get_list(self): + cluster = self.fhdhr.db.get_fhdhr_value("cluster", "dict") or self.default_cluster() + return_dict = {} + for location in list(cluster.keys()): + if location != self.location: + return_dict[location] = { + "Joined": True + } + + detected_list = self.ssdp.detect_method.get() + for location in detected_list: + if location not in list(cluster.keys()): + return_dict[location] = { + "Joined": False + } + return_dict = OrderedDict(sorted(return_dict.items())) + return return_dict + + def default_cluster(self): + defdict = {} + defdict[self.location] = { + "base_url": self.location, + "name": self.friendlyname + } + return defdict + + def startup_sync(self): + self.fhdhr.logger.info("Syncronizing with Cluster.") + cluster = self.fhdhr.db.get_fhdhr_value("cluster", "dict") or self.default_cluster() + if not len(list(cluster.keys())): + self.fhdhr.logger.info("No Cluster Found.") + else: + self.fhdhr.logger.info("Found %s clustered services." % str(len(list(cluster.keys())))) + for location in list(cluster.keys()): + if location != self.location: + self.fhdhr.logger.info("Checking Cluster Syncronization information from %s." % location) + sync_url = location + "/api/cluster?method=get" + try: + sync_open = self.fhdhr.web.session.get(sync_url) + retrieved_cluster = sync_open.json() + if self.location not in list(retrieved_cluster.keys()): + return self.leave() + except self.fhdhr.web.exceptions.ConnectionError: + self.fhdhr.logger.error("Unreachable: " + location) + + def leave(self): + self.fhdhr.logger.info("Leaving cluster.") + self.fhdhr.db.set_fhdhr_value("cluster", "dict", self.default_cluster()) + + def disconnect(self): + cluster = self.fhdhr.db.get_fhdhr_value("cluster", "dict") or self.default_cluster() + for location in list(cluster.keys()): + if location != self.location: + self.fhdhr.logger.info("Informing %s that I am departing the Cluster." % location) + sync_url = location + "/api/cluster?method=del&location=" + self.location + try: + self.fhdhr.web.session.get(sync_url) + except self.fhdhr.web.exceptions.ConnectionError: + self.fhdhr.logger.error("Unreachable: " + location) + self.leave() + + def sync(self, location): + sync_url = location + "/api/cluster?method=get" + try: + sync_open = self.fhdhr.web.session.get(sync_url) + self.fhdhr.db.set_fhdhr_value("cluster", "dict", sync_open.json()) + except self.fhdhr.web.exceptions.ConnectionError: + self.fhdhr.logger.error("Unreachable: " + location) + + def push_sync(self): + cluster = self.fhdhr.db.get_fhdhr_value("cluster", "dict") or self.default_cluster() + for location in list(cluster.keys()): + if location != self.location: + sync_url = location + "/api/cluster?method=sync&location=" + self.location_url + try: + self.fhdhr.web.session.get(sync_url) + except self.fhdhr.web.exceptions.ConnectionError: + self.fhdhr.logger.error("Unreachable: " + location) + + def add(self, location): + cluster = self.fhdhr.db.get_fhdhr_value("cluster", "dict") or self.default_cluster() + if location not in list(cluster.keys()): + self.fhdhr.logger.info("Adding %s to cluster." % location) + cluster[location] = {"base_url": location} + + location_info_url = "%s/hdhr/discover.json" % location + try: + location_info_req = self.fhdhr.web.session.get(location_info_url) + except self.fhdhr.web.exceptions.ConnectionError: + self.fhdhr.logger.error("Unreachable: " + location) + del cluster[location] + self.fhdhr.db.set_fhdhr_value("cluster", "dict", cluster) + return + location_info = location_info_req.json() + cluster[location]["name"] = location_info["FriendlyName"] + + cluster_info_url = location + "/api/cluster?method=get" + try: + cluster_info_req = self.fhdhr.web.session.get(cluster_info_url) + except self.fhdhr.web.exceptions.ConnectionError: + self.fhdhr.logger.error("Unreachable: " + location) + del cluster[location] + self.fhdhr.db.set_fhdhr_value("cluster", "dict", cluster) + return + cluster_info = cluster_info_req.json() + for cluster_key in list(cluster_info.keys()): + if cluster_key not in list(cluster.keys()): + cluster[cluster_key] = cluster_info[cluster_key] + + self.fhdhr.db.set_fhdhr_value("cluster", "dict", cluster) + self.push_sync() + + def remove(self, location): + cluster = self.fhdhr.db.get_fhdhr_value("cluster", "dict") or self.default_cluster() + if location in list(cluster.keys()): + self.fhdhr.logger.info("Removing %s from cluster." % location) + del cluster[location] + sync_url = location + "/api/cluster?method=leave" + try: + self.fhdhr.web.session.get(sync_url) + except self.fhdhr.web.exceptions.ConnectionError: + self.fhdhr.logger.error("Unreachable: " + location) + self.push_sync() + self.fhdhr.db.set_fhdhr_value("cluster", "dict", cluster) diff --git a/fHDHR/device/epg.py b/fHDHR/device/epg.py new file mode 100644 index 0000000..788c177 --- /dev/null +++ b/fHDHR/device/epg.py @@ -0,0 +1,187 @@ +import os +import time +import datetime +from collections import OrderedDict + +epgtype_list = [] +device_dir = os.path.dirname(__file__) +for entry in os.scandir(device_dir + '/epgtypes'): + if entry.is_file(): + if entry.name[0] != '_': + epgtype_list.append(str(entry.name[:-3])) + impstring = f'from .epgtypes import {entry.name}'[:-3] + exec(impstring) + + +class EPG(): + + def __init__(self, fhdhr, channels, origin): + self.fhdhr = fhdhr + + self.origin = origin + self.channels = channels + + self.epgdict = {} + + self.epg_method_selfadd() + + self.epg_methods = self.fhdhr.config.dict["epg"]["method"] + self.valid_epg_methods = [x for x in self.fhdhr.config.dict["main"]["valid_epg_methods"] if x and x not in [None, "None"]] + self.def_method = self.fhdhr.config.dict["epg"]["def_method"] + self.sleeptime = {} + for epg_method in self.epg_methods: + if epg_method in list(self.fhdhr.config.dict.keys()): + if "update_frequency" in list(self.fhdhr.config.dict[epg_method].keys()): + self.sleeptime[epg_method] = self.fhdhr.config.dict[epg_method]["update_frequency"] + if epg_method not in list(self.sleeptime.keys()): + self.sleeptime[epg_method] = self.fhdhr.config.dict["epg"]["update_frequency"] + + def clear_epg_cache(self, method=None): + + if not method: + method = self.def_method + if (method == self.fhdhr.config.dict["main"]["dictpopname"] or + method not in self.fhdhr.config.dict["main"]["valid_epg_methods"]): + method = "origin" + + epgtypename = method + if method in [self.fhdhr.config.dict["main"]["dictpopname"], "origin"]: + epgtypename = self.fhdhr.config.dict["main"]["dictpopname"] + + self.fhdhr.logger.info("Clearing " + epgtypename + " EPG cache.") + + method_to_call = getattr(self, method) + if hasattr(method_to_call, 'clear_cache'): + func_to_call = getattr(method_to_call, 'clear_cache') + func_to_call() + + if method in list(self.epgdict.keys()): + del self.epgdict[method] + + self.fhdhr.db.delete_fhdhr_value("epg_dict", method) + + def whats_on_now(self, channel, method=None): + epgdict = self.get_epg(method) + listings = epgdict[channel]["listing"] + for listing in listings: + nowtime = datetime.datetime.utcnow() + start_time = datetime.datetime.strptime(listing["time_start"], '%Y%m%d%H%M%S +0000') + end_time = datetime.datetime.strptime(listing["time_end"], '%Y%m%d%H%M%S +0000') + if start_time <= nowtime <= end_time: + epgitem = epgdict[channel].copy() + epgitem["listing"] = [listing] + return epgitem + return None + + def whats_on_allchans(self, method=None): + + if not method: + method = self.def_method + if (method == self.fhdhr.config.dict["main"]["dictpopname"] or + method not in self.fhdhr.config.dict["main"]["valid_epg_methods"]): + method = "origin" + + channel_guide_list = [] + epgdict = self.get_epg(method) + channels = list(epgdict.keys()) + for channel in channels: + whatson = self.whats_on_now(epgdict[channel]["number"], method) + if whatson: + channel_guide_list.append(whatson) + return channel_guide_list + + def get_epg(self, method=None): + + if not method: + method = self.def_method + if (method == self.fhdhr.config.dict["main"]["dictpopname"] or + method not in self.fhdhr.config.dict["main"]["valid_epg_methods"]): + method = "origin" + + if method not in list(self.epgdict.keys()): + + epgdict = self.fhdhr.db.get_fhdhr_value("epg_dict", method) or None + if not epgdict: + self.update(method) + self.epgdict[method] = self.fhdhr.db.get_fhdhr_value("epg_dict", method) or {} + else: + self.epgdict[method] = epgdict + return self.epgdict[method] + else: + return self.epgdict[method] + + def get_thumbnail(self, itemtype, itemid): + if itemtype == "channel": + chandict = self.find_channel_dict(itemid) + return chandict["thumbnail"] + elif itemtype == "content": + progdict = self.find_program_dict(itemid) + return progdict["thumbnail"] + return None + + def find_channel_dict(self, channel_id): + epgdict = self.get_epg() + channel_list = [] + for channel in list(epgdict.keys()): + channel_list.append(epgdict[channel]) + return next(item for item in channel_list if item["id"] == channel_id) + + def find_program_dict(self, event_id): + epgdict = self.get_epg() + event_list = [] + for channel in list(epgdict.keys()): + event_list.extend(epgdict[channel]["listing"]) + return next(item for item in event_list if item["id"] == event_id) + + def epg_method_selfadd(self): + self.fhdhr.logger.info("Checking for Optional EPG methods.") + for method in epgtype_list: + self.fhdhr.logger.info("Found %s EPG method." % method) + exec("%s = %s" % ("self." + str(method), str(method) + "." + str(method) + "EPG(self.fhdhr, self.channels)")) + + def update(self, method=None): + + if not method: + method = self.def_method + if (method == self.fhdhr.config.dict["main"]["dictpopname"] or + method not in self.fhdhr.config.dict["main"]["valid_epg_methods"]): + method = "origin" + + epgtypename = method + if method in [self.fhdhr.config.dict["main"]["dictpopname"], "origin"]: + epgtypename = self.fhdhr.config.dict["main"]["dictpopname"] + + self.fhdhr.logger.info("Updating " + epgtypename + " EPG cache.") + method_to_call = getattr(self, method) + func_to_call = getattr(method_to_call, 'update_epg') + if method == 'origin': + programguide = func_to_call(self.channels) + else: + programguide = func_to_call() + + for chan in list(programguide.keys()): + floatnum = str(float(chan)) + programguide[floatnum] = programguide.pop(chan) + programguide[floatnum]["number"] = floatnum + + programguide = OrderedDict(sorted(programguide.items())) + + for cnum in programguide: + programguide[cnum]["listing"] = sorted(programguide[cnum]["listing"], key=lambda i: i['time_start']) + + self.epgdict = programguide + self.fhdhr.db.set_fhdhr_value("epg_dict", method, programguide) + self.fhdhr.db.set_fhdhr_value("update_time", method, time.time()) + self.fhdhr.logger.info("Wrote " + epgtypename + " EPG cache.") + + def run(self): + for epg_method in self.epg_methods: + self.update(epg_method) + try: + while True: + for epg_method in self.epg_methods: + if time.time() >= (self.fhdhr.db.get_fhdhr_value("update_time", epg_method) + self.sleeptime[epg_method]): + self.update(epg_method) + time.sleep(3600) + except KeyboardInterrupt: + pass diff --git a/fHDHR/device/epgtypes/__init__.py b/fHDHR/device/epgtypes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fHDHR/device/epgtypes/blocks.py b/fHDHR/device/epgtypes/blocks.py new file mode 100644 index 0000000..4beb923 --- /dev/null +++ b/fHDHR/device/epgtypes/blocks.py @@ -0,0 +1,66 @@ +import datetime + + +class blocksEPG(): + + def __init__(self, fhdhr, channels): + self.fhdhr = fhdhr + + self.channels = channels + + def update_epg(self): + programguide = {} + + timestamps = [] + todaydate = datetime.date.today() + for x in range(0, 6): + xdate = todaydate + datetime.timedelta(days=x) + xtdate = xdate + datetime.timedelta(days=1) + + for hour in range(0, 24): + time_start = datetime.datetime.combine(xdate, datetime.time(hour, 0)) + if hour + 1 < 24: + time_end = datetime.datetime.combine(xdate, datetime.time(hour + 1, 0)) + else: + time_end = datetime.datetime.combine(xtdate, datetime.time(0, 0)) + timestampdict = { + "time_start": str(time_start.strftime('%Y%m%d%H%M%S')) + " +0000", + "time_end": str(time_end.strftime('%Y%m%d%H%M%S')) + " +0000", + } + timestamps.append(timestampdict) + + for fhdhr_id in list(self.channels.list.keys()): + c = self.channels.list[fhdhr_id].dict + + if str(c["number"]) not in list(programguide.keys()): + programguide[str(c["number"])] = { + "callsign": c["callsign"], + "name": c["name"], + "number": c["number"], + "id": c["origin_id"], + "thumbnail": ("/api/images?method=generate&type=channel&message=%s" % (str(c['number']))), + "listing": [], + } + + for timestamp in timestamps: + clean_prog_dict = { + "time_start": timestamp['time_start'], + "time_end": timestamp['time_end'], + "duration_minutes": 60, + "thumbnail": ("/api/images?method=generate&type=content&message=%s" % (str(c["origin_id"]) + "_" + str(timestamp['time_start']).split(" ")[0])), + "title": "Unavailable", + "sub-title": "Unavailable", + "description": "Unavailable", + "rating": "N/A", + "episodetitle": None, + "releaseyear": None, + "genres": [], + "seasonnumber": None, + "episodenumber": None, + "isnew": False, + "id": str(c["origin_id"]) + "_" + str(timestamp['time_start']).split(" ")[0], + } + + programguide[str(c["number"])]["listing"].append(clean_prog_dict) + + return programguide diff --git a/fHDHR/device/images.py b/fHDHR/device/images.py new file mode 100644 index 0000000..1a8befd --- /dev/null +++ b/fHDHR/device/images.py @@ -0,0 +1,60 @@ +from io import BytesIO +import PIL.Image +import PIL.ImageDraw +import PIL.ImageFont + + +class imageHandler(): + + def __init__(self, fhdhr, epg): + self.fhdhr = fhdhr + + def get_epg_image(self, image_type, content_id): + imageUri = self.epg.get_thumbnail(image_type, str(content_id)) + if not imageUri: + return self.generate_image(image_type, str(content_id)) + + req = self.fhdhr.web.session.get(imageUri) + return req.content + + def getSize(self, txt, font): + testImg = PIL.Image.new('RGB', (1, 1)) + testDraw = PIL.ImageDraw.Draw(testImg) + return testDraw.textsize(txt, font) + + def generate_image(self, messagetype, message): + if messagetype == "channel": + width = 360 + height = 270 + fontsize = 72 + elif messagetype == "content": + width = 1080 + height = 1440 + fontsize = 100 + + colorBackground = "#228822" + colorText = "#717D7E" + colorOutline = "#717D7E" + fontname = str(self.fhdhr.config.internal["paths"]["font"]) + + font = PIL.ImageFont.truetype(fontname, fontsize) + text_width, text_height = self.getSize(message, font) + img = PIL.Image.new('RGBA', (width+4, height+4), colorBackground) + d = PIL.ImageDraw.Draw(img) + d.text(((width-text_width)/2, (height-text_height)/2), message, fill=colorText, font=font) + d.rectangle((0, 0, width+3, height+3), outline=colorOutline) + + s = BytesIO() + img.save(s, 'png') + return s.getvalue() + + def get_image_type(self, image_data): + header_byte = image_data[0:3].hex().lower() + if header_byte == '474946': + return "image/gif" + elif header_byte == '89504e': + return "image/png" + elif header_byte == 'ffd8ff': + return "image/jpeg" + else: + return "image/jpeg" diff --git a/fHDHR/device/ssdp/__init__.py b/fHDHR/device/ssdp/__init__.py new file mode 100644 index 0000000..ed317d8 --- /dev/null +++ b/fHDHR/device/ssdp/__init__.py @@ -0,0 +1,198 @@ +# Adapted from https://github.com/MoshiBin/ssdpy and https://github.com/ZeWaren/python-upnp-ssdp-example +import socket +import struct +import time + +from .ssdp_detect import fHDHR_Detect +from .rmg_ssdp import RMG_SSDP +from .hdhr_ssdp import HDHR_SSDP + + +class SSDPServer(): + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + self.detect_method = fHDHR_Detect(fhdhr) + + if (fhdhr.config.dict["fhdhr"]["discovery_address"] and + fhdhr.config.dict["ssdp"]["enabled"]): + + self.sock = None + self.proto = "ipv4" + self.port = 1900 + self.iface = None + self.address = None + + allowed_protos = ("ipv4", "ipv6") + if self.proto not in allowed_protos: + raise ValueError("Invalid proto - expected one of {}".format(allowed_protos)) + + self.location = ('http://' + fhdhr.config.dict["fhdhr"]["discovery_address"] + ':' + + str(fhdhr.config.dict["fhdhr"]["port"]) + '/device.xml') + + self._iface = None + + if self.proto == "ipv4": + self._af_type = socket.AF_INET + self._broadcast_ip = "239.255.255.250" + self._address = (self._broadcast_ip, self.port) + self.bind_address = "0.0.0.0" + elif self.proto == "ipv6": + self._af_type = socket.AF_INET6 + self._broadcast_ip = "ff02::c" + self._address = (self._broadcast_ip, self.port, 0, 0) + self.bind_address = "::" + + self.broadcast_addy = "{}:{}".format(self._broadcast_ip, self.port) + + self.sock = socket.socket(self._af_type, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + + # Bind to specific interface + if self.iface is not None: + self.sock.setsockopt(socket.SOL_SOCKET, getattr(socket, "SO_BINDTODEVICE", 25), self.iface) + + # Subscribe to multicast address + if self.proto == "ipv4": + mreq = socket.inet_aton(self._broadcast_ip) + if self.address is not None: + mreq += socket.inet_aton(self.address) + else: + mreq += struct.pack(b"@I", socket.INADDR_ANY) + self.sock.setsockopt( + socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq, + ) + # Allow multicasts on loopback devices (necessary for testing) + self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1) + elif self.proto == "ipv6": + # In IPv6 we use the interface index, not the address when subscribing to the group + mreq = socket.inet_pton(socket.AF_INET6, self._broadcast_ip) + if self.iface is not None: + iface_index = socket.if_nametoindex(self.iface) + # Send outgoing packets from the same interface + self.sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, iface_index) + mreq += struct.pack(b"@I", iface_index) + else: + mreq += socket.inet_pton(socket.AF_INET6, "::") + self.sock.setsockopt( + socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq, + ) + self.sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_LOOP, 1) + self.sock.bind((self.bind_address, self.port)) + + self.msearch_payload = self.create_msearch_payload() + + self.rmg_ssdp = RMG_SSDP(fhdhr, self._broadcast_ip) + self.hdhr_ssdp = HDHR_SSDP(fhdhr, self._broadcast_ip) + + self.refresh = int(fhdhr.config.dict["ssdp"]["refresh_frequency"]) + self.refresh_last = None + + self.do_alive() + self.m_search() + + def do_alive(self, forcealive=False): + + send_alive = False + if not self.refresh_last: + send_alive = True + elif forcealive: + send_alive = True + elif time.time() >= (self.refresh_last + self.refresh): + send_alive = True + + if send_alive: + self.fhdhr.logger.info("Sending Alive message to network.") + self.do_notify(('239.255.255.250', 1900)) + self.refresh_last = time.time() + + def do_notify(self, address): + + notify_list = [] + + hdhr_notify = self.hdhr_ssdp.get() + notify_list.append(hdhr_notify) + + if self.fhdhr.config.dict["rmg"]["enabled"]: + rmg_notify = self.rmg_ssdp.get() + notify_list.append(rmg_notify) + + for notify in notify_list: + + self.fhdhr.logger.debug("Created {}".format(notify)) + try: + self.sock.sendto(notify, address) + except OSError as e: + # Most commonly: We received a multicast from an IP not in our subnet + self.fhdhr.logger.debug("Unable to send NOTIFY: %s" % e) + pass + + def on_recv(self, data, address): + self.fhdhr.logger.debug("Received packet from {}: {}".format(address, data)) + + try: + header, payload = data.decode().split('\r\n\r\n')[:2] + except ValueError: + self.fhdhr.logger.error("Error with Received packet from {}: {}".format(address, data)) + return + + lines = header.split('\r\n') + cmd = lines[0].split(' ') + lines = map(lambda x: x.replace(': ', ':', 1), lines[1:]) + lines = filter(lambda x: len(x) > 0, lines) + + headers = [x.split(':', 1) for x in lines] + headers = dict(map(lambda x: (x[0].lower(), x[1]), headers)) + + if cmd[0] == 'M-SEARCH' and cmd[1] == '*': + # SSDP discovery + self.fhdhr.logger.debug("Received qualifying M-SEARCH from {}".format(address)) + self.fhdhr.logger.debug("M-SEARCH data: {}".format(headers)) + + self.do_notify(address) + + elif cmd[0] == 'NOTIFY' and cmd[1] == '*': + # SSDP presence + self.fhdhr.logger.debug("NOTIFY data: {}".format(headers)) + try: + if headers["server"].startswith("fHDHR"): + if headers["location"] != self.location: + savelocation = headers["location"].split("/device.xml")[0] + if savelocation.endswith("/hdhr"): + savelocation = savelocation.replace("/hdhr", '') + elif savelocation.endswith("/rmg"): + savelocation = savelocation.replace("/rmg", '') + self.detect_method.set(savelocation) + except KeyError: + return + else: + self.fhdhr.logger.debug('Unknown SSDP command %s %s' % (cmd[0], cmd[1])) + + def m_search(self): + data = self.msearch_payload + self.sock.sendto(data, self._address) + + def create_msearch_payload(self): + data = ( + "M-SEARCH * HTTP/1.1\r\n" + "HOST:{}\r\n" + 'MAN: "ssdp:discover"\r\n' + "ST:{}\r\n" + "MX:{}\r\n" + ).format( + self.broadcast_addy, + "ssdp:all", + 1 + ) + data += "\r\n" + return data.encode("utf-8") + + def run(self): + try: + while True: + data, address = self.sock.recvfrom(1024) + self.on_recv(data, address) + self.do_alive() + except KeyboardInterrupt: + self.sock.close() diff --git a/fHDHR/device/ssdp/hdhr_ssdp.py b/fHDHR/device/ssdp/hdhr_ssdp.py new file mode 100644 index 0000000..7f8cb11 --- /dev/null +++ b/fHDHR/device/ssdp/hdhr_ssdp.py @@ -0,0 +1,44 @@ + + +class HDHR_SSDP(): + + def __init__(self, fhdhr, _broadcast_ip): + self.fhdhr = fhdhr + + self.ssdp_content = None + + self._broadcast_ip = _broadcast_ip + self.nt = 'urn:schemas-upnp-org:device:MediaServer:1' + self.usn = 'uuid:' + fhdhr.config.dict["main"]["uuid"] + '::' + self.nt + self.server = 'fHDHR/%s UPnP/1.0' % fhdhr.version + self.location = ('http://' + fhdhr.config.dict["fhdhr"]["discovery_address"] + ':' + + str(fhdhr.config.dict["fhdhr"]["port"]) + '/device.xml') + self.al = self.location + self.max_age = 1800 + + def get(self): + if self.ssdp_content: + return self.ssdp_content.encode("utf-8") + + data = ( + "NOTIFY * HTTP/1.1\r\n" + "HOST:{}\r\n" + "NT:{}\r\n" + "NTS:ssdp:alive\r\n" + "USN:{}\r\n" + "SERVER:{}\r\n" + ).format( + self._broadcast_ip, + self.nt, + self.usn, + self.server + ) + if self.location is not None: + data += "LOCATION:{}\r\n".format(self.location) + if self.al is not None: + data += "AL:{}\r\n".format(self.al) + if self.max_age is not None: + data += "Cache-Control:max-age={}\r\n".format(self.max_age) + data += "\r\n" + self.ssdp_content = data + return data.encode("utf-8") diff --git a/fHDHR/device/ssdp/rmg_ssdp.py b/fHDHR/device/ssdp/rmg_ssdp.py new file mode 100644 index 0000000..31d6466 --- /dev/null +++ b/fHDHR/device/ssdp/rmg_ssdp.py @@ -0,0 +1,44 @@ + + +class RMG_SSDP(): + + def __init__(self, fhdhr, _broadcast_ip): + self.fhdhr = fhdhr + + self.ssdp_content = None + + self._broadcast_ip = _broadcast_ip + self.nt = 'urn:schemas-upnp-org:device-1-0' + self.usn = 'uuid:' + fhdhr.config.dict["main"]["uuid"] + '::' + self.nt + self.server = 'fHDHR/%s UPnP/1.0' % fhdhr.version + self.location = ('http://' + fhdhr.config.dict["fhdhr"]["discovery_address"] + ':' + + str(fhdhr.config.dict["fhdhr"]["port"]) + '/device.xml') + self.al = self.location + self.max_age = 1800 + + def get(self): + if self.ssdp_content: + return self.ssdp_content.encode("utf-8") + + data = ( + "NOTIFY * HTTP/1.1\r\n" + "HOST:{}\r\n" + "NT:{}\r\n" + "NTS:ssdp:alive\r\n" + "USN:{}\r\n" + "SERVER:{}\r\n" + ).format( + self._broadcast_ip, + self.nt, + self.usn, + self.server + ) + if self.location is not None: + data += "LOCATION:{}\r\n".format(self.location) + if self.al is not None: + data += "AL:{}\r\n".format(self.al) + if self.max_age is not None: + data += "Cache-Control:max-age={}\r\n".format(self.max_age) + data += "\r\n" + self.ssdp_content = data + return data.encode("utf-8") diff --git a/fHDHR/device/ssdp/ssdp_detect.py b/fHDHR/device/ssdp/ssdp_detect.py new file mode 100644 index 0000000..e9800b5 --- /dev/null +++ b/fHDHR/device/ssdp/ssdp_detect.py @@ -0,0 +1,16 @@ + + +class fHDHR_Detect(): + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + self.fhdhr.db.delete_fhdhr_value("ssdp_detect", "list") + + def set(self, location): + detect_list = self.fhdhr.db.get_fhdhr_value("ssdp_detect", "list") or [] + if location not in detect_list: + detect_list.append(location) + self.fhdhr.db.set_fhdhr_value("ssdp_detect", "list", detect_list) + + def get(self): + return self.fhdhr.db.get_fhdhr_value("ssdp_detect", "list") or [] diff --git a/fHDHR/device/tuners/__init__.py b/fHDHR/device/tuners/__init__.py new file mode 100644 index 0000000..7ddbb8d --- /dev/null +++ b/fHDHR/device/tuners/__init__.py @@ -0,0 +1,106 @@ + +from fHDHR.exceptions import TunerError + +from .tuner import Tuner + + +class Tuners(): + + def __init__(self, fhdhr, epg, channels): + self.fhdhr = fhdhr + self.channels = channels + + self.epg = epg + self.max_tuners = int(self.fhdhr.config.dict["fhdhr"]["tuner_count"]) + + self.tuners = {} + + self.fhdhr.logger.info("Creating %s tuners." % str(self.max_tuners)) + + for i in range(0, self.max_tuners): + self.tuners[str(i)] = Tuner(fhdhr, i, epg) + + def get_available_tuner(self): + return next(tunernum for tunernum in list(self.tuners.keys()) if not self.tuners[tunernum].tuner_lock.locked()) or None + + def get_scanning_tuner(self): + return next(tunernum for tunernum in list(self.tuners.keys()) if self.tuners[tunernum].status["status"] == "Scanning") or None + + def stop_tuner_scan(self): + tunernum = self.get_scanning_tuner() + if tunernum: + self.tuners[str(tunernum)].close() + + def tuner_scan(self): + """Temporarily use a tuner for a scan""" + if not self.available_tuner_count(): + raise TunerError("805 - All Tuners In Use") + + tunernumber = self.get_available_tuner() + self.tuners[str(tunernumber)].channel_scan() + + if not tunernumber: + raise TunerError("805 - All Tuners In Use") + + def tuner_grab(self, tuner_number, channel_number): + + if str(tuner_number) not in list(self.tuners.keys()): + self.fhdhr.logger.error("Tuner %s does not exist." % str(tuner_number)) + raise TunerError("806 - Tune Failed") + + # TunerError will raise if unavailable + self.tuners[str(tuner_number)].grab(channel_number) + + return tuner_number + + def first_available(self, channel_number): + + if not self.available_tuner_count(): + raise TunerError("805 - All Tuners In Use") + + tunernumber = self.get_available_tuner() + + if not tunernumber: + raise TunerError("805 - All Tuners In Use") + else: + self.tuners[str(tunernumber)].grab(channel_number) + return tunernumber + + def tuner_close(self, tunernum): + self.tuners[str(tunernum)].close() + + def status(self): + all_status = {} + for tunernum in list(self.tuners.keys()): + all_status[tunernum] = self.tuners[str(tunernum)].get_status() + return all_status + + def available_tuner_count(self): + available_tuners = 0 + for tunernum in list(self.tuners.keys()): + if not self.tuners[str(tunernum)].tuner_lock.locked(): + available_tuners += 1 + return available_tuners + + def inuse_tuner_count(self): + inuse_tuners = 0 + for tunernum in list(self.tuners.keys()): + if self.tuners[str(tunernum)].tuner_lock.locked(): + inuse_tuners += 1 + return inuse_tuners + + def get_stream_info(self, stream_args): + + stream_args["channelUri"] = self.channels.get_channel_stream(str(stream_args["channel"])) + if not stream_args["channelUri"]: + raise TunerError("806 - Tune Failed") + + channelUri_headers = self.fhdhr.web.session.head(stream_args["channelUri"]).headers + stream_args["true_content_type"] = channelUri_headers['Content-Type'] + + if stream_args["true_content_type"].startswith(tuple(["application/", "text/"])): + stream_args["content_type"] = "video/mpeg" + else: + stream_args["content_type"] = stream_args["true_content_type"] + + return stream_args diff --git a/fHDHR/device/tuners/stream/__init__.py b/fHDHR/device/tuners/stream/__init__.py new file mode 100644 index 0000000..e768011 --- /dev/null +++ b/fHDHR/device/tuners/stream/__init__.py @@ -0,0 +1,27 @@ + + +from .direct_stream import Direct_Stream +from .direct_m3u8_stream import Direct_M3U8_Stream +from .ffmpeg_stream import FFMPEG_Stream +from .vlc_stream import VLC_Stream + + +class Stream(): + + def __init__(self, fhdhr, stream_args, tuner): + self.fhdhr = fhdhr + self.stream_args = stream_args + + if stream_args["method"] == "ffmpeg": + self.method = FFMPEG_Stream(fhdhr, stream_args, tuner) + if stream_args["method"] == "vlc": + self.method = VLC_Stream(fhdhr, stream_args, tuner) + elif (stream_args["method"] == "direct" and + not self.stream_args["true_content_type"].startswith(tuple(["application/", "text/"]))): + self.method = Direct_Stream(fhdhr, stream_args, tuner) + elif (stream_args["method"] == "direct" and + self.stream_args["true_content_type"].startswith(tuple(["application/", "text/"]))): + self.method = Direct_M3U8_Stream(fhdhr, stream_args, tuner) + + def get(self): + return self.method.get() diff --git a/fHDHR/device/tuners/stream/direct_m3u8_stream.py b/fHDHR/device/tuners/stream/direct_m3u8_stream.py new file mode 100644 index 0000000..8140e22 --- /dev/null +++ b/fHDHR/device/tuners/stream/direct_m3u8_stream.py @@ -0,0 +1,99 @@ +import sys +import time +import m3u8 + +from Crypto.Cipher import AES + +# from fHDHR.exceptions import TunerError + + +class Direct_M3U8_Stream(): + + def __init__(self, fhdhr, stream_args, tuner): + self.fhdhr = fhdhr + self.stream_args = stream_args + self.tuner = tuner + + self.chunksize = int(self.fhdhr.config.dict["direct_stream"]['chunksize']) + + def get(self): + + if not self.stream_args["duration"] == 0: + self.stream_args["time_end"] = self.stream_args["duration"] + time.time() + + self.fhdhr.logger.info("Detected stream URL is m3u8: %s" % self.stream_args["true_content_type"]) + + channelUri = self.stream_args["channelUri"] + while True: + + self.fhdhr.logger.info("Opening m3u8 for reading %s" % channelUri) + videoUrlM3u = m3u8.load(channelUri) + if len(videoUrlM3u.playlists): + self.fhdhr.logger.info("%s m3u8 varients found" % len(videoUrlM3u.playlists)) + channelUri = videoUrlM3u.playlists[0].absolute_uri + else: + break + + def generate(): + + try: + + played_chunk_urls = [] + + while self.tuner.tuner_lock.locked(): + + playlist = m3u8.load(channelUri) + segments = playlist.segments + + if len(played_chunk_urls): + newsegments = 0 + for segment in segments: + if segment.absolute_uri not in played_chunk_urls: + newsegments += 1 + self.fhdhr.logger.info("Refreshing m3u8, Loaded %s new segments." % str(newsegments)) + else: + self.fhdhr.logger.info("Loaded %s segments." % str(len(segments))) + + if playlist.keys != [None]: + keys = [{"url": key.absolute_uri, "method": key.method, "iv": key.iv} for key in playlist.keys if key] + else: + keys = [None for i in range(0, len(segments))] + + for segment, key in zip(segments, keys): + chunkurl = segment.absolute_uri + + if chunkurl and chunkurl not in played_chunk_urls: + played_chunk_urls.append(chunkurl) + + if (not self.stream_args["duration"] == 0 and + not time.time() < self.stream_args["time_end"]): + self.fhdhr.logger.info("Requested Duration Expired.") + self.tuner.close() + + chunk = self.fhdhr.web.session.get(chunkurl).content + if not chunk: + break + # raise TunerError("807 - No Video Data") + if key: + if key["url"]: + keyfile = self.fhdhr.web.session.get(key["url"]).content + cryptor = AES.new(keyfile, AES.MODE_CBC, keyfile) + self.fhdhr.logger.info("Decrypting Chunk #%s with key: %s" % (len(played_chunk_urls), key["url"])) + chunk = cryptor.decrypt(chunk) + + chunk_size = int(sys.getsizeof(chunk)) + self.fhdhr.logger.info("Passing Through Chunk #%s with size %s: %s" % (len(played_chunk_urls), chunk_size, chunkurl)) + yield chunk + self.tuner.add_downloaded_size(chunk_size) + + self.fhdhr.logger.info("Connection Closed: Tuner Lock Removed") + + except GeneratorExit: + self.fhdhr.logger.info("Connection Closed.") + except Exception as e: + self.fhdhr.logger.info("Connection Closed: " + str(e)) + finally: + self.tuner.close() + # raise TunerError("806 - Tune Failed") + + return generate() diff --git a/fHDHR/device/tuners/stream/direct_stream.py b/fHDHR/device/tuners/stream/direct_stream.py new file mode 100644 index 0000000..ea8c22b --- /dev/null +++ b/fHDHR/device/tuners/stream/direct_stream.py @@ -0,0 +1,63 @@ +import sys +import time + +# from fHDHR.exceptions import TunerError + + +class Direct_Stream(): + + def __init__(self, fhdhr, stream_args, tuner): + self.fhdhr = fhdhr + self.stream_args = stream_args + self.tuner = tuner + + self.chunksize = int(self.fhdhr.config.dict["direct_stream"]['chunksize']) + + def get(self): + + if not self.stream_args["duration"] == 0: + self.stream_args["time_end"] = self.stream_args["duration"] + time.time() + + self.fhdhr.logger.info("Direct Stream of %s URL: %s" % (self.stream_args["true_content_type"], self.stream_args["channelUri"])) + + req = self.fhdhr.web.session.get(self.stream_args["channelUri"], stream=True) + + def generate(): + + try: + + chunk_counter = 1 + + while self.tuner.tuner_lock.locked(): + + for chunk in req.iter_content(chunk_size=self.chunksize): + + if (not self.stream_args["duration"] == 0 and + not time.time() < self.stream_args["time_end"]): + req.close() + self.fhdhr.logger.info("Requested Duration Expired.") + self.tuner.close() + + if not chunk: + break + # raise TunerError("807 - No Video Data") + + chunk_size = int(sys.getsizeof(chunk)) + self.fhdhr.logger.info("Passing Through Chunk #%s with size %s" % (chunk_counter, chunk_size)) + yield chunk + self.tuner.add_downloaded_size(chunk_size) + + chunk_counter += 1 + + self.fhdhr.logger.info("Connection Closed: Tuner Lock Removed") + + except GeneratorExit: + self.fhdhr.logger.info("Connection Closed.") + except Exception as e: + self.fhdhr.logger.info("Connection Closed: " + str(e)) + finally: + req.close() + self.tuner.close() + # raise TunerError("806 - Tune Failed") + + return generate() diff --git a/fHDHR/device/tuners/stream/ffmpeg_stream.py b/fHDHR/device/tuners/stream/ffmpeg_stream.py new file mode 100644 index 0000000..552a879 --- /dev/null +++ b/fHDHR/device/tuners/stream/ffmpeg_stream.py @@ -0,0 +1,130 @@ +import sys +import subprocess + +# from fHDHR.exceptions import TunerError + + +class FFMPEG_Stream(): + + def __init__(self, fhdhr, stream_args, tuner): + self.fhdhr = fhdhr + self.stream_args = stream_args + self.tuner = tuner + + self.bytes_per_read = int(self.fhdhr.config.dict["ffmpeg"]["bytes_per_read"]) + self.ffmpeg_command = self.ffmpeg_command_assemble(stream_args) + + def get(self): + + ffmpeg_proc = subprocess.Popen(self.ffmpeg_command, stdout=subprocess.PIPE) + + def generate(): + try: + while self.tuner.tuner_lock.locked(): + + chunk = ffmpeg_proc.stdout.read(self.bytes_per_read) + if not chunk: + break + # raise TunerError("807 - No Video Data") + yield chunk + chunk_size = int(sys.getsizeof(chunk)) + self.tuner.add_downloaded_size(chunk_size) + self.fhdhr.logger.info("Connection Closed: Tuner Lock Removed") + + except GeneratorExit: + self.fhdhr.logger.info("Connection Closed.") + except Exception as e: + self.fhdhr.logger.info("Connection Closed: " + str(e)) + finally: + ffmpeg_proc.terminate() + ffmpeg_proc.communicate() + self.tuner.close() + # raise TunerError("806 - Tune Failed") + + return generate() + + def ffmpeg_command_assemble(self, stream_args): + ffmpeg_command = [ + self.fhdhr.config.dict["ffmpeg"]["path"], + "-i", stream_args["channelUri"], + ] + ffmpeg_command.extend(self.ffmpeg_duration(stream_args)) + ffmpeg_command.extend(self.transcode_profiles(stream_args)) + ffmpeg_command.extend(self.ffmpeg_loglevel()) + ffmpeg_command.extend(["pipe:stdout"]) + return ffmpeg_command + + def ffmpeg_duration(self, stream_args): + ffmpeg_command = [] + if stream_args["duration"]: + ffmpeg_command.extend(["-t", str(stream_args["duration"])]) + else: + ffmpeg_command.extend( + [ + "-reconnect", "1", + "-reconnect_at_eof", "1", + "-reconnect_streamed", "1", + "-reconnect_delay_max", "2", + ] + ) + + return ffmpeg_command + + def ffmpeg_loglevel(self): + ffmpeg_command = [] + log_level = self.fhdhr.config.dict["logging"]["level"].lower() + + loglevel_dict = { + "debug": "debug", + "info": "info", + "error": "error", + "warning": "warning", + "critical": "fatal", + } + if log_level not in ["info", "debug"]: + ffmpeg_command.extend(["-nostats", "-hide_banner"]) + ffmpeg_command.extend(["-loglevel", loglevel_dict[log_level]]) + return ffmpeg_command + + def transcode_profiles(self, stream_args): + # TODO implement actual profiles here + """ + • heavy: transcode to AVC with the same resolution, frame-rate, and interlacing as the + original stream. For example 1080i60 AVC 1080i60, 720p60 AVC 720p60. → → + • mobile: trancode to AVC progressive not exceeding 1280x720 30fps. + • internet720: transcode to low bitrate AVC progressive not exceeding 1280x720 30fps. + • internet480: transcode to low bitrate AVC progressive not exceeding 848x480 30fps for + 16:9 content, not exceeding 640x480 30fps for 4:3 content. + • internet360: transcode to low bitrate AVC progressive not exceeding 640x360 30fps for + 16:9 content, not exceeding 480x360 30fps for 4:3 content. + • internet240: transcode to low bitrate AVC progressive not exceeding 432x240 30fps for + 16:9 content, not exceeding 320x240 30fps for 4:3 content + """ + + if stream_args["transcode"]: + self.fhdhr.logger.info("Client requested a " + stream_args["transcode"] + " transcode for stream.") + stream_args["transcode"] = None + + ffmpeg_command = [] + + if not stream_args["transcode"]: + ffmpeg_command.extend( + [ + "-c", "copy", + "-f", "mpegts", + ] + ) + elif stream_args["transcode"] == "heavy": + ffmpeg_command.extend([]) + elif stream_args["transcode"] == "mobile": + ffmpeg_command.extend([]) + elif stream_args["transcode"] == "internet720": + ffmpeg_command.extend([]) + elif stream_args["transcode"] == "internet480": + ffmpeg_command.extend([]) + elif stream_args["transcode"] == "internet360": + ffmpeg_command.extend([]) + elif stream_args["transcode"] == "internet240": + ffmpeg_command.extend([]) + + return ffmpeg_command diff --git a/fHDHR/device/tuners/stream/vlc_stream.py b/fHDHR/device/tuners/stream/vlc_stream.py new file mode 100644 index 0000000..6f9ad1a --- /dev/null +++ b/fHDHR/device/tuners/stream/vlc_stream.py @@ -0,0 +1,121 @@ +import sys +import subprocess + +# from fHDHR.exceptions import TunerError + + +class VLC_Stream(): + + def __init__(self, fhdhr, stream_args, tuner): + self.fhdhr = fhdhr + self.stream_args = stream_args + self.tuner = tuner + + self.bytes_per_read = int(self.fhdhr.config.dict["vlc"]["bytes_per_read"]) + self.vlc_command = self.vlc_command_assemble(stream_args) + + def get(self): + + vlc_proc = subprocess.Popen(self.vlc_command, stdout=subprocess.PIPE) + + def generate(): + try: + + while self.tuner.tuner_lock.locked(): + + chunk = vlc_proc.stdout.read(self.bytes_per_read) + if not chunk: + break + # raise TunerError("807 - No Video Data") + yield chunk + chunk_size = int(sys.getsizeof(chunk)) + self.tuner.add_downloaded_size(chunk_size) + self.fhdhr.logger.info("Connection Closed: Tuner Lock Removed") + + except GeneratorExit: + self.fhdhr.logger.info("Connection Closed.") + except Exception as e: + self.fhdhr.logger.info("Connection Closed: " + str(e)) + finally: + vlc_proc.terminate() + vlc_proc.communicate() + self.fhdhr.logger.info("Connection Closed: Tuner Lock Removed") + self.tuner.close() + # raise TunerError("806 - Tune Failed") + + return generate() + + def vlc_command_assemble(self, stream_args): + vlc_command = [ + self.fhdhr.config.dict["vlc"]["path"], + "-I", "dummy", stream_args["channelUri"], + ] + vlc_command.extend(self.vlc_duration(stream_args)) + vlc_command.extend(self.vlc_loglevel()) + vlc_command.extend(["--sout"]) + vlc_command.extend(self.transcode_profiles(stream_args)) + return vlc_command + + def vlc_duration(self, stream_args): + vlc_command = [] + if stream_args["duration"]: + vlc_command.extend(["--run-time=%s" % str(stream_args["duration"])]) + return vlc_command + + def vlc_loglevel(self): + vlc_command = [] + log_level = self.fhdhr.config.dict["logging"]["level"].lower() + + loglevel_dict = { + "debug": "3", + "info": "0", + "error": "1", + "warning": "2", + "critical": "1", + } + vlc_command.extend(["--log-verbose=", loglevel_dict[log_level]]) + if log_level not in ["info", "debug"]: + vlc_command.extend(["--quiet"]) + return vlc_command + + def transcode_profiles(self, stream_args): + # TODO implement actual profiles here + """ + • heavy: transcode to AVC with the same resolution, frame-rate, and interlacing as the + original stream. For example 1080i60 AVC 1080i60, 720p60 AVC 720p60. → → + • mobile: trancode to AVC progressive not exceeding 1280x720 30fps. + • internet720: transcode to low bitrate AVC progressive not exceeding 1280x720 30fps. + • internet480: transcode to low bitrate AVC progressive not exceeding 848x480 30fps for + 16:9 content, not exceeding 640x480 30fps for 4:3 content. + • internet360: transcode to low bitrate AVC progressive not exceeding 640x360 30fps for + 16:9 content, not exceeding 480x360 30fps for 4:3 content. + • internet240: transcode to low bitrate AVC progressive not exceeding 432x240 30fps for + 16:9 content, not exceeding 320x240 30fps for 4:3 content + """ + vlc_command = [] + + if stream_args["transcode"]: + self.fhdhr.logger.info("Client requested a " + stream_args["transcode"] + " transcode for stream.") + stream_args["transcode"] = None + + vlc_transcode_string = "#std{mux=ts,access=file,dst=-}" + return [vlc_transcode_string] + + '#transcode{vcodec=mp2v,vb=4096,acodec=mp2a,ab=192,scale=1,channels=2,deinterlace}:std{access=file,mux=ts,dst=-"}' + + if not stream_args["transcode"]: + vlc_command.extend([]) + elif stream_args["transcode"] == "heavy": + vlc_command.extend([]) + elif stream_args["transcode"] == "mobile": + vlc_command.extend([]) + elif stream_args["transcode"] == "internet720": + vlc_command.extend([]) + elif stream_args["transcode"] == "internet480": + vlc_command.extend([]) + elif stream_args["transcode"] == "internet360": + vlc_command.extend([]) + elif stream_args["transcode"] == "internet240": + vlc_command.extend([]) + + return vlc_command diff --git a/fHDHR/device/tuners/tuner.py b/fHDHR/device/tuners/tuner.py new file mode 100644 index 0000000..09c7421 --- /dev/null +++ b/fHDHR/device/tuners/tuner.py @@ -0,0 +1,106 @@ +import multiprocessing +import threading +import datetime + +from fHDHR.exceptions import TunerError +from fHDHR.tools import humanized_time + +from .stream import Stream + + +class Tuner(): + def __init__(self, fhdhr, inum, epg): + self.fhdhr = fhdhr + + self.number = inum + self.epg = epg + + self.tuner_lock = threading.Lock() + self.set_off_status() + + if fhdhr.config.dict["fhdhr"]["address"] == "0.0.0.0": + self.location = ('http://127.0.0.1:%s' % str(fhdhr.config.dict["fhdhr"]["port"])) + else: + self.location = ('http://%s:%s' % (fhdhr.config.dict["fhdhr"]["address"], str(fhdhr.config.dict["fhdhr"]["port"]))) + + self.chanscan_url = "%s/api/channels?method=scan" % (self.location) + self.close_url = "%s/api/tuners?method=close&tuner=%s" % (self.location, str(self.number)) + + def channel_scan(self): + if self.tuner_lock.locked(): + self.fhdhr.logger.error("Tuner #%s is not available." % str(self.number)) + raise TunerError("804 - Tuner In Use") + + if self.status["status"] == "Scanning": + self.fhdhr.logger.info("Channel Scan Already In Progress!") + else: + + self.tuner_lock.acquire() + self.status["status"] = "Scanning" + self.fhdhr.logger.info("Tuner #%s Performing Channel Scan." % str(self.number)) + + if self.fhdhr.config.dict["main"]["thread_method"] in ["multiprocessing"]: + chanscan = multiprocessing.Process(target=self.runscan) + elif self.fhdhr.config.dict["main"]["thread_method"] in ["threading"]: + chanscan = threading.Thread(target=self.runscan) + if self.fhdhr.config.dict["main"]["thread_method"] in ["multiprocessing", "threading"]: + chanscan.start() + + def runscan(self): + self.fhdhr.web.session.get(self.chanscan_url) + self.fhdhr.logger.info("Requested Channel Scan Complete.") + self.fhdhr.web.session.get(self.close_url) + + def add_downloaded_size(self, bytes_count): + if "downloaded" in list(self.status.keys()): + self.status["downloaded"] += bytes_count + + def grab(self, channel_number): + if self.tuner_lock.locked(): + self.fhdhr.logger.error("Tuner #" + str(self.number) + " is not available.") + raise TunerError("804 - Tuner In Use") + self.tuner_lock.acquire() + self.status["status"] = "Acquired" + self.status["channel"] = channel_number + self.fhdhr.logger.info("Tuner #%s Acquired." % str(self.number)) + + def close(self): + self.set_off_status() + if self.tuner_lock.locked(): + self.tuner_lock.release() + self.fhdhr.logger.info("Tuner #" + str(self.number) + " Released.") + + def get_status(self): + current_status = self.status.copy() + if current_status["status"] == "Active": + current_status["Play Time"] = str( + humanized_time( + int((datetime.datetime.utcnow() - current_status["time_start"]).total_seconds()))) + current_status["time_start"] = str(current_status["time_start"]) + current_status["epg"] = self.epg.whats_on_now(current_status["channel"]) + return current_status + + def set_off_status(self): + self.status = {"status": "Inactive"} + + def get_stream(self, stream_args, tuner): + stream = Stream(self.fhdhr, stream_args, tuner) + return stream.get() + + def set_status(self, stream_args): + if self.status["status"] != "Active": + self.status = { + "status": "Active", + "clients": [], + "clients_id": [], + "method": stream_args["method"], + "accessed": [stream_args["accessed"]], + "channel": stream_args["channel"], + "proxied_url": stream_args["channelUri"], + "time_start": datetime.datetime.utcnow(), + "downloaded": 0 + } + if stream_args["client"] not in self.status["clients"]: + self.status["clients"].append(stream_args["client"]) + if stream_args["client_id"] not in self.status["clients_id"]: + self.status["clients_id"].append(stream_args["client_id"]) diff --git a/fHDHR/exceptions/__init__.py b/fHDHR/exceptions/__init__.py new file mode 100644 index 0000000..cc7a99d --- /dev/null +++ b/fHDHR/exceptions/__init__.py @@ -0,0 +1,40 @@ + +class TunerError(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return 'TunerError: %s' % self.value + + +class OriginSetupError(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return 'OriginSetupError: %s' % self.value + + +class EPGSetupError(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return 'EPGSetupError: %s' % self.value + + +class ConfigurationError(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return 'ConfigurationError: %s' % self.value + + +class ConfigurationNotFound(ConfigurationError): + def __init__(self, filename): + super(ConfigurationNotFound, self).__init__(None) + self.filename = filename + + def __str__(self): + return 'Unable to find the configuration file %s' % self.filename diff --git a/fHDHR/http/__init__.py b/fHDHR/http/__init__.py new file mode 100644 index 0000000..1fd3ec7 --- /dev/null +++ b/fHDHR/http/__init__.py @@ -0,0 +1,92 @@ +from gevent.pywsgi import WSGIServer +from flask import Flask, request + +from .pages import fHDHR_Pages +from .files import fHDHR_Files +from .hdhr import fHDHR_HDHR +from .rmg import fHDHR_RMG +from .api import fHDHR_API + + +class fHDHR_HTTP_Server(): + app = None + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + self.template_folder = fhdhr.config.internal["paths"]["www_templates_dir"] + + self.fhdhr.logger.info("Loading Flask.") + + self.app = Flask("fHDHR", template_folder=self.template_folder) + + self.fhdhr.logger.info("Loading HTTP Pages Endpoints.") + self.pages = fHDHR_Pages(fhdhr) + self.add_endpoints(self.pages, "pages") + + self.fhdhr.logger.info("Loading HTTP Files Endpoints.") + self.files = fHDHR_Files(fhdhr) + self.add_endpoints(self.files, "files") + + self.fhdhr.logger.info("Loading HTTP HDHR Endpoints.") + self.hdhr = fHDHR_HDHR(fhdhr) + self.add_endpoints(self.hdhr, "hdhr") + + self.fhdhr.logger.info("Loading HTTP RMG Endpoints.") + self.rmg = fHDHR_RMG(fhdhr) + self.add_endpoints(self.rmg, "rmg") + + self.fhdhr.logger.info("Loading HTTP API Endpoints.") + self.api = fHDHR_API(fhdhr) + self.add_endpoints(self.api, "api") + + self.app.before_request(self.before_request) + self.app.after_request(self.after_request) + + def before_request(self): + self.fhdhr.logger.debug("Client %s requested %s Opening" % (request.method, request.path)) + + def after_request(self, response): + self.fhdhr.logger.debug("Client %s requested %s Closing" % (request.method, request.path)) + return response + + def add_endpoints(self, index_list, index_name): + item_list = [x for x in dir(index_list) if self.isapath(x)] + for item in item_list: + endpoints = eval("self." + str(index_name) + "." + str(item) + ".endpoints") + if isinstance(endpoints, str): + endpoints = [endpoints] + handler = eval("self." + str(index_name) + "." + str(item)) + endpoint_name = eval("self." + str(index_name) + "." + str(item) + ".endpoint_name") + try: + endpoint_methods = eval("self." + str(index_name) + "." + str(item) + ".endpoint_methods") + except AttributeError: + endpoint_methods = ['GET'] + self.fhdhr.logger.info("Adding endpoint %s available at %s with %s methods." % (endpoint_name, ",".join(endpoints), ",".join(endpoint_methods))) + for endpoint in endpoints: + self.add_endpoint(endpoint=endpoint, + endpoint_name=endpoint_name, + handler=handler, + methods=endpoint_methods) + + def isapath(self, item): + not_a_page_list = ["fhdhr", "htmlerror", "page_elements"] + if item in not_a_page_list: + return False + elif item.startswith("__") and item.endswith("__"): + return False + else: + return True + + def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None, methods=['GET']): + self.app.add_url_rule(endpoint, endpoint_name, handler, methods=methods) + + def run(self): + self.http = WSGIServer(( + self.fhdhr.config.dict["fhdhr"]["address"], + int(self.fhdhr.config.dict["fhdhr"]["port"]) + ), self.app.wsgi_app, log=self.fhdhr.logger) + try: + self.http.serve_forever() + except KeyboardInterrupt: + self.http.stop() diff --git a/fHDHR/http/api/__init__.py b/fHDHR/http/api/__init__.py new file mode 100644 index 0000000..359f9a6 --- /dev/null +++ b/fHDHR/http/api/__init__.py @@ -0,0 +1,32 @@ + +from .root_url import Root_URL + +from .cluster import Cluster +from .settings import Settings +from .channels import Channels +from .xmltv import xmlTV +from .m3u import M3U +from .epg import EPG +from .tuners import Tuners +from .debug import Debug_JSON + +from .images import Images + + +class fHDHR_API(): + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + self.root_url = Root_URL(fhdhr) + + self.cluster = Cluster(fhdhr) + self.settings = Settings(fhdhr) + self.channels = Channels(fhdhr) + self.xmltv = xmlTV(fhdhr) + self.m3u = M3U(fhdhr) + self.epg = EPG(fhdhr) + self.tuners = Tuners(fhdhr) + self.debug = Debug_JSON(fhdhr) + + self.images = Images(fhdhr) diff --git a/fHDHR/http/api/channels.py b/fHDHR/http/api/channels.py new file mode 100644 index 0000000..f2c5175 --- /dev/null +++ b/fHDHR/http/api/channels.py @@ -0,0 +1,111 @@ +from flask import request, redirect, Response, abort +import urllib.parse +import json + + +class Channels(): + endpoints = ["/api/channels"] + endpoint_name = "api_channels" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + method = request.args.get('method', default=None, type=str) + redirect_url = request.args.get('redirect', default=None, type=str) + + if method == "get": + channels_info = [] + for fhdhr_id in list(self.fhdhr.device.channels.list.keys()): + channel_obj = self.fhdhr.device.channels.list[fhdhr_id] + channel_dict = channel_obj.dict.copy() + channel_dict["play_url"] = channel_obj.play_url() + channel_dict["stream_url"] = channel_obj.stream_url() + channels_info.append(channel_dict) + channels_info_json = json.dumps(channels_info, indent=4) + + return Response(status=200, + response=channels_info_json, + mimetype='application/json') + + elif method == "favorite": + + channel = request.args.get('channel', default=None, type=str) + if not channel: + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Failed" % method)) + else: + return "%s Falied" % method + + if channel.startstwith(tuple(["+", "-", "x"])): + + channel_method = channel[0] + channel_number = channel[1:] + + if str(channel_number) not in [str(x) for x in self.fhdhr.device.channels.get_channel_list("number")]: + response = Response("Not Found", status=404) + response.headers["X-fHDHR-Error"] = "801 - Unknown Channel" + self.fhdhr.logger.error(response.headers["X-fHDHR-Error"]) + abort(response) + + if channel_method == "+": + self.fhdhr.device.channels.set_channel_enablement("number", channel_number, channel_method) + elif channel_method == "-": + self.fhdhr.device.channels.set_channel_enablement("number", channel_number, channel_method) + elif channel_method == "x": + self.fhdhr.device.channels.set_channel_enablement("number", channel_number, "toggle") + + else: + self.fhdhr.logger.warning("Unknown favorite command " + request.args['favorite']) + return abort(200, "Not a valid favorite command") + + elif method in ["enable", "disable"]: + channel = request.args.get('channel', default=None, type=str) + if channel == "all": + self.fhdhr.device.channels.set_channel_enablement_all(method) + elif not channel or str(channel) not in [str(x) for x in self.fhdhr.device.channels.get_channel_list("number")]: + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Failed" % method)) + else: + return "%s Falied" % method + else: + self.fhdhr.device.channels.set_channel_enablement("number", channel, method) + + elif method == "update": + channel_id = request.form.get('id', None) + updatedict = {} + for key in list(request.form.keys()): + if key != "id": + if key in ["name", "callsign", "thumbnail"]: + updatedict[key] = str(request.form.get(key)) + elif key in ["number"]: + updatedict[key] = float(request.form.get(key)) + elif key in ["enabled"]: + confvalue = request.form.get(key) + if str(confvalue).lower() in ["false"]: + confvalue = False + elif str(confvalue).lower() in ["true"]: + confvalue = True + updatedict[key] = confvalue + elif key in ["favorite", "HD"]: + updatedict[key] = int(request.form.get(key)) + self.fhdhr.device.channels.set_channel_status("id", channel_id, updatedict) + + elif method == "scan": + self.fhdhr.device.channels.get_channels(forceupdate=True) + + else: + return "Invalid Method" + + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Success" % method)) + else: + if method == "scan": + return redirect('/lineup_status.json') + else: + return "%s Success" % method diff --git a/fHDHR/http/api/cluster.py b/fHDHR/http/api/cluster.py new file mode 100644 index 0000000..f14c887 --- /dev/null +++ b/fHDHR/http/api/cluster.py @@ -0,0 +1,56 @@ +from flask import request, redirect, Response +import urllib.parse +import json + + +class Cluster(): + endpoints = ["/api/cluster"] + endpoint_name = "api_cluster" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + method = request.args.get('method', default="get", type=str) + location = request.args.get("location", default=None, type=str) + redirect_url = request.args.get('redirect', default=None, type=str) + + if method == "get": + jsoncluster = self.fhdhr.device.cluster.cluster() + cluster_json = json.dumps(jsoncluster, indent=4) + + return Response(status=200, + response=cluster_json, + mimetype='application/json') + + elif method == "scan": + self.fhdhr.device.ssdp.m_search() + + elif method == 'add': + self.fhdhr.device.cluster.add(location) + elif method == 'del': + self.fhdhr.device.cluster.remove(location) + + elif method == 'sync': + self.fhdhr.device.cluster.sync(location) + + elif method == 'leave': + self.fhdhr.device.cluster.leave() + elif method == 'disconnect': + self.fhdhr.device.cluster.disconnect() + + elif method == 'alive': + self.fhdhr.device.ssdp.do_alive(forcealive=True) + + else: + return "Invalid Method" + + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Success" % method)) + else: + return "%s Success" % method diff --git a/fHDHR/http/api/debug.py b/fHDHR/http/api/debug.py new file mode 100644 index 0000000..7ca9df7 --- /dev/null +++ b/fHDHR/http/api/debug.py @@ -0,0 +1,29 @@ +from flask import request, Response +import json + + +class Debug_JSON(): + endpoints = ["/api/debug"] + endpoint_name = "api_debug" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + base_url = request.url_root[:-1] + + debugjson = { + "base_url": base_url, + "total channels": len(self.fhdhr.device.channels.list), + "tuner status": self.fhdhr.device.tuners.status(), + } + cluster_json = json.dumps(debugjson, indent=4) + + return Response(status=200, + response=cluster_json, + mimetype='application/json') diff --git a/fHDHR/http/api/epg.py b/fHDHR/http/api/epg.py new file mode 100644 index 0000000..26a8040 --- /dev/null +++ b/fHDHR/http/api/epg.py @@ -0,0 +1,49 @@ +from flask import Response, request, redirect +import urllib.parse +import json + + +class EPG(): + """Methods to create xmltv.xml""" + endpoints = ["/api/epg"] + endpoint_name = "api_epg" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + method = request.args.get('method', default="get", type=str) + + source = request.args.get('source', default=self.fhdhr.config.dict["epg"]["def_method"], type=str) + if source not in self.fhdhr.config.dict["main"]["valid_epg_methods"]: + return "%s Invalid xmltv method" % source + + redirect_url = request.args.get('redirect', default=None, type=str) + + if method == "get": + + epgdict = self.fhdhr.device.epg.get_epg(source) + epg_json = json.dumps(epgdict, indent=4) + + return Response(status=200, + response=epg_json, + mimetype='application/json') + + elif method == "update": + self.fhdhr.device.epg.update(source) + + elif method == "clearcache": + self.fhdhr.device.epg.clear_epg_cache(source) + + else: + return "%s Invalid Method" % method + + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Success" % method)) + else: + return "%s Success" % method diff --git a/fHDHR/http/api/images.py b/fHDHR/http/api/images.py new file mode 100644 index 0000000..351ff3f --- /dev/null +++ b/fHDHR/http/api/images.py @@ -0,0 +1,44 @@ +from flask import request, Response, abort + + +class Images(): + endpoints = ["/api/images"] + endpoint_name = "api_images" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + image = None + + method = request.args.get('method', default="get", type=str) + + if method == "generate": + image_type = request.args.get('type', default="content", type=str) + if image_type in ["content", "channel"]: + message = request.args.get('message', default="Unknown Request", type=str) + image = self.fhdhr.device.images.generate_image(image_type, message) + + elif method == "get": + source = request.args.get('source', default=self.fhdhr.config.dict["epg"]["method"], type=str) + if source in self.fhdhr.config.dict["main"]["valid_epg_methods"]: + image_type = request.args.get('type', default="content", type=str) + if image_type in ["content", "channel"]: + image_id = request.args.get('id', default=None, type=str) + if image_id: + image = self.fhdhr.device.images.get_epg_image(image_type, image_id) + + else: + image = self.fhdhr.device.images.generate_image("content", "Unknown Request") + + if image: + imagemimetype = self.fhdhr.device.images.get_image_type(image) + return Response(image, content_type=imagemimetype, direct_passthrough=True) + + else: + return abort(501, "Not a valid image request") diff --git a/fHDHR/http/api/m3u.py b/fHDHR/http/api/m3u.py new file mode 100644 index 0000000..940e7c7 --- /dev/null +++ b/fHDHR/http/api/m3u.py @@ -0,0 +1,89 @@ +from flask import Response, request, redirect +import urllib.parse +from io import StringIO + + +class M3U(): + endpoints = ["/api/m3u", "/api/channels.m3u"] + endpoint_name = "api_m3u" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + base_url = request.url_root[:-1] + + method = request.args.get('method', default="get", type=str) + channel = request.args.get('channel', default="all", type=str) + redirect_url = request.args.get('redirect', default=None, type=str) + + if method == "get": + + FORMAT_DESCRIPTOR = "#EXTM3U" + RECORD_MARKER = "#EXTINF" + + fakefile = StringIO() + + xmltvurl = ('%s/api/xmltv' % base_url) + + fakefile.write( + "%s\n" % ( + FORMAT_DESCRIPTOR + " " + + "url-tvg=\"" + xmltvurl + "\"" + " " + + "x-tvg-url=\"" + xmltvurl + "\"") + ) + + channel_items = [] + + if channel == "all": + fileName = "channels.m3u" + for fhdhr_id in list(self.fhdhr.device.channels.list.keys()): + channel_obj = self.fhdhr.device.channels.list[fhdhr_id] + if channel_obj.enabled: + channel_items.append(channel_obj) + elif str(channel) in [str(x) for x in self.fhdhr.device.channels.get_channel_list("number")]: + channel_obj = self.fhdhr.device.channels.get_channel_obj("number", channel) + fileName = str(channel_obj.number) + ".m3u" + if channel_obj.enabled: + channel_items.append(channel_obj) + else: + return "Channel Disabled" + else: + return "Invalid Channel" + + for channel_obj in channel_items: + + if self.fhdhr.config.dict["epg"]["images"] == "proxy" or not channel_obj.thumbnail: + logourl = ('%s/api/images?method=get&type=channel&id=%s' % + (base_url, str(channel_obj.dict['origin_id']))) + else: + logourl = channel_obj.thumbnail + + fakefile.write( + "%s\n" % ( + RECORD_MARKER + ":0" + " " + + "channelID=\"" + str(channel_obj.dict['origin_id']) + "\" " + + "tvg-chno=\"" + str(channel_obj.dict['number']) + "\" " + + "tvg-name=\"" + str(channel_obj.dict['name']) + "\" " + + "tvg-id=\"" + str(channel_obj.dict['number']) + "\" " + + "tvg-logo=\"" + logourl + "\" " + + "group-title=\"" + self.fhdhr.config.dict["fhdhr"]["friendlyname"] + "\"," + str(channel_obj.dict['name'])) + ) + + fakefile.write("%s\n" % (base_url + channel_obj.stream_url())) + + channels_m3u = fakefile.getvalue() + + resp = Response(status=200, response=channels_m3u, mimetype='audio/x-mpegurl') + resp.headers["content-disposition"] = "attachment; filename=" + fileName + return resp + + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Success" % method)) + else: + return "%s Success" % method diff --git a/fHDHR/http/api/root_url.py b/fHDHR/http/api/root_url.py new file mode 100644 index 0000000..68a8d75 --- /dev/null +++ b/fHDHR/http/api/root_url.py @@ -0,0 +1,32 @@ +from flask import redirect, request + + +class Root_URL(): + endpoints = ["/"] + endpoint_name = "page_root_html" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + user_agent = request.headers.get('User-Agent') + + # Client Devices Discovering Device Information + if not user_agent or str(user_agent).lower().startswith("plexmediaserver"): + + # Plex Remote Media Grabber redirect + if self.fhdhr.config.dict["rmg"]["enabled"] and str(user_agent).lower().startswith("plexmediaserver"): + return redirect("/rmg") + + # Client Device is looking for HDHR type device + else: + return redirect("/hdhr/device.xml") + + # Anything Else is likely a Web Browser + else: + return redirect("/index") diff --git a/fHDHR/http/api/settings.py b/fHDHR/http/api/settings.py new file mode 100644 index 0000000..a4fcf19 --- /dev/null +++ b/fHDHR/http/api/settings.py @@ -0,0 +1,40 @@ +from flask import request, redirect +import urllib.parse + + +class Settings(): + endpoints = ["/api/settings"] + endpoint_name = "api_settings" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + method = request.args.get('method', default="get", type=str) + redirect_url = request.args.get('redirect', default=None, type=str) + + if method == "update": + config_section = request.form.get('config_section', None) + config_name = request.form.get('config_name', None) + config_value = request.form.get('config_value', None) + + if not config_section or not config_name or not config_value: + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Failed" % method)) + else: + return "%s Falied" % method + + if config_section == "origin": + config_section = self.fhdhr.config.dict["main"]["dictpopname"] + + self.fhdhr.config.write(config_section, config_name, config_value) + + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Success" % method)) + else: + return "%s Success" % method diff --git a/fHDHR/http/api/tuners.py b/fHDHR/http/api/tuners.py new file mode 100644 index 0000000..b2e2fbd --- /dev/null +++ b/fHDHR/http/api/tuners.py @@ -0,0 +1,125 @@ +from flask import Response, request, redirect, abort, stream_with_context +import urllib.parse +import uuid + +from fHDHR.exceptions import TunerError + + +class Tuners(): + endpoints = ["/api/tuners"] + endpoint_name = "api_tuners" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + client_address = request.remote_addr + + accessed_url = request.args.get('accessed', default=request.url, type=str) + + method = request.args.get('method', default=self.fhdhr.config.dict["fhdhr"]["stream_type"], type=str) + + tuner_number = request.args.get('tuner', None, type=str) + + redirect_url = request.args.get('redirect', default=None, type=str) + + if method in ["direct", "ffmpeg", "vlc"]: + + channel_number = request.args.get('channel', None, type=str) + if not channel_number: + return "Missing Channel" + + if str(channel_number) not in [str(x) for x in self.fhdhr.device.channels.get_channel_list("number")]: + response = Response("Not Found", status=404) + response.headers["X-fHDHR-Error"] = "801 - Unknown Channel" + self.fhdhr.logger.error(response.headers["X-fHDHR-Error"]) + abort(response) + + channel_dict = self.fhdhr.device.channels.get_channel_dict("number", channel_number) + if not channel_dict["enabled"]: + response = Response("Service Unavailable", status=503) + response.headers["X-fHDHR-Error"] = str("806 - Tune Failed") + self.fhdhr.logger.error(response.headers["X-fHDHR-Error"]) + abort(response) + + duration = request.args.get('duration', default=0, type=int) + + transcode = request.args.get('transcode', default=None, type=str) + valid_transcode_types = [None, "heavy", "mobile", "internet720", "internet480", "internet360", "internet240"] + if transcode not in valid_transcode_types: + response = Response("Service Unavailable", status=503) + response.headers["X-fHDHR-Error"] = "802 - Unknown Transcode Profile" + self.fhdhr.logger.error(response.headers["X-fHDHR-Error"]) + abort(response) + + stream_args = { + "channel": channel_number, + "method": method, + "duration": duration, + "transcode": transcode, + "accessed": accessed_url, + "client": client_address, + "client_id": str(client_address) + "_" + str(uuid.uuid4()) + } + + try: + if not tuner_number: + tunernum = self.fhdhr.device.tuners.first_available(channel_number) + else: + tunernum = self.fhdhr.device.tuners.tuner_grab(tuner_number, channel_number) + except TunerError as e: + self.fhdhr.logger.info("A %s stream request for channel %s was rejected due to %s" + % (stream_args["method"], str(stream_args["channel"]), str(e))) + response = Response("Service Unavailable", status=503) + response.headers["X-fHDHR-Error"] = str(e) + self.fhdhr.logger.error(response.headers["X-fHDHR-Error"]) + abort(response) + tuner = self.fhdhr.device.tuners.tuners[str(tunernum)] + + try: + stream_args = self.fhdhr.device.tuners.get_stream_info(stream_args) + except TunerError as e: + self.fhdhr.logger.info("A %s stream request for channel %s was rejected due to %s" + % (stream_args["method"], str(stream_args["channel"]), str(e))) + response = Response("Service Unavailable", status=503) + response.headers["X-fHDHR-Error"] = str(e) + self.fhdhr.logger.error(response.headers["X-fHDHR-Error"]) + tuner.close() + abort(response) + + self.fhdhr.logger.info("Tuner #" + str(tunernum) + " to be used for stream.") + tuner.set_status(stream_args) + + if stream_args["method"] == "direct": + return Response(tuner.get_stream(stream_args, tuner), content_type=stream_args["content_type"], direct_passthrough=True) + elif stream_args["method"] in ["ffmpeg", "vlc"]: + return Response(stream_with_context(tuner.get_stream(stream_args, tuner)), mimetype=stream_args["content_type"]) + + elif method == "close": + + if not tuner_number or str(tuner_number) not in list(self.fhdhr.device.tuners.tuners.keys()): + return "%s Invalid tuner" % str(tuner_number) + + tuner = self.fhdhr.device.tuners.tuners[str(tuner_number)] + tuner.close() + + elif method == "scan": + + if not tuner_number: + self.fhdhr.device.tuners.tuner_scan() + else: + tuner = self.fhdhr.device.tuners.tuners[str(tuner_number)] + tuner.channel_scan() + + else: + return "%s Invalid Method" % method + + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Success" % method)) + else: + return "%s Success" % method diff --git a/fHDHR/http/api/xmltv.py b/fHDHR/http/api/xmltv.py new file mode 100644 index 0000000..3191c2e --- /dev/null +++ b/fHDHR/http/api/xmltv.py @@ -0,0 +1,156 @@ +from flask import Response, request, redirect +import xml.etree.ElementTree +from io import BytesIO +import urllib.parse + +from fHDHR.tools import sub_el + + +class xmlTV(): + """Methods to create xmltv.xml""" + endpoints = ["/api/xmltv", "/xmltv.xml"] + endpoint_name = "api_xmltv" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + if self.fhdhr.config.dict["fhdhr"]["require_auth"]: + DeviceAuth = request.args.get('DeviceAuth', default=None, type=str) + if DeviceAuth != self.fhdhr.config.dict["fhdhr"]["device_auth"]: + return "not subscribed" + + base_url = request.url_root[:-1] + + method = request.args.get('method', default="get", type=str) + + source = request.args.get('source', default=self.fhdhr.config.dict["epg"]["def_method"], type=str) + if source not in self.fhdhr.config.dict["main"]["valid_epg_methods"]: + return "%s Invalid xmltv method" % source + + redirect_url = request.args.get('redirect', default=None, type=str) + + if method == "get": + + epgdict = self.fhdhr.device.epg.get_epg(source) + xmltv_xml = self.create_xmltv(base_url, epgdict) + + return Response(status=200, + response=xmltv_xml, + mimetype='application/xml') + + elif method == "update": + self.fhdhr.device.epg.update(source) + + elif method == "clearcache": + self.fhdhr.device.epg.clear_epg_cache(source) + + else: + return "%s Invalid Method" % method + + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Success" % method)) + else: + return "%s Success" % method + + def xmltv_headers(self): + """This method creates the XML headers for our xmltv""" + xmltvgen = xml.etree.ElementTree.Element('tv') + xmltvgen.set('source-info-url', self.fhdhr.config.dict["fhdhr"]["friendlyname"]) + xmltvgen.set('source-info-name', self.fhdhr.config.dict["main"]["servicename"]) + xmltvgen.set('generator-info-name', 'fHDHR') + xmltvgen.set('generator-info-url', 'fHDHR/' + self.fhdhr.config.dict["main"]["reponame"]) + return xmltvgen + + def xmltv_file(self, xmltvgen): + """This method is used to close out the xml file""" + xmltvfile = BytesIO() + xmltvfile.write(b'\n') + xmltvfile.write(xml.etree.ElementTree.tostring(xmltvgen, encoding='UTF-8')) + return xmltvfile.getvalue() + + def xmltv_empty(self): + """This method is called when creation of a full xmltv is not possible""" + return self.xmltv_file(self.xmltv_headers()) + + def create_xmltv(self, base_url, epgdict): + if not epgdict: + return self.xmltv_empty() + + out = self.xmltv_headers() + + for c in list(epgdict.keys()): + + c_out = sub_el(out, 'channel', id=str(epgdict[c]['number'])) + sub_el(c_out, 'display-name', + text='%s %s' % (epgdict[c]['number'], epgdict[c]['callsign'])) + sub_el(c_out, 'display-name', + text='%s %s %s' % (epgdict[c]['number'], epgdict[c]['callsign'], str(epgdict[c]['id']))) + sub_el(c_out, 'display-name', text=epgdict[c]['number']) + sub_el(c_out, 'display-name', text=epgdict[c]['callsign']) + sub_el(c_out, 'display-name', text=epgdict[c]['name']) + + if epgdict[c]["thumbnail"] is not None: + if self.fhdhr.config.dict["epg"]["images"] == "proxy": + sub_el(c_out, 'icon', src=(str(base_url) + "/api/images?method=get&type=channel&id=" + str(epgdict[c]['id']))) + else: + sub_el(c_out, 'icon', src=(epgdict[c]["thumbnail"])) + else: + sub_el(c_out, 'icon', src=(str(base_url) + "/api/images?method=generate&type=channel&message=" + urllib.parse.quote(epgdict[c]['name']))) + + for channelnum in list(epgdict.keys()): + + channel_listing = epgdict[channelnum]['listing'] + + for program in channel_listing: + + prog_out = sub_el(out, 'programme', + start=program['time_start'], + stop=program['time_end'], + channel=str(channelnum)) + + sub_el(prog_out, 'title', lang='en', text=program['title']) + + sub_el(prog_out, 'desc', lang='en', text=program['description']) + + sub_el(prog_out, 'sub-title', lang='en', text='Movie: ' + program['sub-title']) + + sub_el(prog_out, 'length', units='minutes', text=str(int(program['duration_minutes']))) + + for f in program['genres']: + sub_el(prog_out, 'category', lang='en', text=f) + sub_el(prog_out, 'genre', lang='en', text=f) + + if program['seasonnumber'] and program['episodenumber']: + s_ = int(str(program['seasonnumber']), 10) + e_ = int(str(program['episodenumber']), 10) + sub_el(prog_out, 'episode-num', system='dd_progid', + text=str(program['id'])) + sub_el(prog_out, 'episode-num', system='common', + text='S%02dE%02d' % (s_, e_)) + sub_el(prog_out, 'episode-num', system='xmltv_ns', + text='%d.%d.' % (int(s_)-1, int(e_)-1)) + sub_el(prog_out, 'episode-num', system='SxxExx">S', + text='S%02dE%02d' % (s_, e_)) + + if program["thumbnail"]: + if self.fhdhr.config.dict["epg"]["images"] == "proxy": + sub_el(prog_out, 'icon', src=(str(base_url) + "/api/images?method=get&type=content&id=" + str(program['id']))) + else: + sub_el(prog_out, 'icon', src=(program["thumbnail"])) + else: + sub_el(prog_out, 'icon', src=(str(base_url) + "/api/images?method=generate&type=content&message=" + urllib.parse.quote(program['title']))) + + if program['rating']: + rating_out = sub_el(prog_out, 'rating', system="MPAA") + sub_el(rating_out, 'value', text=program['rating']) + + if program['isnew']: + sub_el(prog_out, 'new') + + return self.xmltv_file(out) diff --git a/fHDHR/http/files/__init__.py b/fHDHR/http/files/__init__.py new file mode 100644 index 0000000..905566b --- /dev/null +++ b/fHDHR/http/files/__init__.py @@ -0,0 +1,15 @@ + + +from .favicon_ico import Favicon_ICO +from .style_css import Style_CSS +from .device_xml import Device_XML + + +class fHDHR_Files(): + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + self.favicon = Favicon_ICO(fhdhr) + self.style = Style_CSS(fhdhr) + self.device_xml = Device_XML(fhdhr) diff --git a/fHDHR/http/files/device_xml.py b/fHDHR/http/files/device_xml.py new file mode 100644 index 0000000..3bca8cf --- /dev/null +++ b/fHDHR/http/files/device_xml.py @@ -0,0 +1,21 @@ +from flask import request, redirect + + +class Device_XML(): + endpoints = ["/device.xml"] + endpoint_name = "file_device_xml" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + user_agent = request.headers.get('User-Agent') + if (self.fhdhr.config.dict["rmg"]["enabled"] and + str(user_agent).lower().startswith("plexmediaserver")): + return redirect("/rmg/device.xml") + else: + return redirect("/hdhr/device.xml") diff --git a/fHDHR/http/files/favicon_ico.py b/fHDHR/http/files/favicon_ico.py new file mode 100644 index 0000000..dabc50a --- /dev/null +++ b/fHDHR/http/files/favicon_ico.py @@ -0,0 +1,18 @@ +from flask import send_from_directory + + +class Favicon_ICO(): + endpoints = ["/favicon.ico"] + endpoint_name = "file_favicon_ico" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + return send_from_directory(self.fhdhr.config.internal["paths"]["www_dir"], + 'favicon.ico', + mimetype='image/vnd.microsoft.icon') diff --git a/fHDHR/http/files/style_css.py b/fHDHR/http/files/style_css.py new file mode 100644 index 0000000..d51a7b2 --- /dev/null +++ b/fHDHR/http/files/style_css.py @@ -0,0 +1,44 @@ +from flask import Response +import pathlib +from io import StringIO + + +class Style_CSS(): + endpoints = ["/style.css"] + endpoint_name = "file_style_css" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + self.internal_style_file = pathlib.Path( + self.fhdhr.config.internal["paths"]["www_dir"]).joinpath('style.css') + + self.internal_style = StringIO() + self.internal_style.write(open(self.internal_style_file).read()) + + self.pull_external_theme() + + def pull_external_theme(self): + self.external_style = None + self.external_style_address = None + if self.fhdhr.config.dict["web_ui"]["theme"]: + if self.fhdhr.config.dict["web_ui"]["theme"].startswith(tuple(["http://", "https://"])): + css_req = self.fhdhr.web.session.get(self.fhdhr.config.dict["web_ui"]["theme"]) + self.external_style = StringIO(css_req.text) + self.external_style_address = self.fhdhr.config.dict["web_ui"]["theme"] + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + main_output = StringIO() + + main_output.write(self.internal_style.getvalue()) + if self.fhdhr.config.dict["web_ui"]["theme"]: + if self.fhdhr.config.dict["web_ui"]["theme"] != self.external_style_address: + self.pull_external_theme() + if self.external_style: + main_output.write(self.external_style.getvalue()) + + return Response(status=200, response=main_output.getvalue(), mimetype="text/css") diff --git a/fHDHR/http/hdhr/__init__.py b/fHDHR/http/hdhr/__init__.py new file mode 100644 index 0000000..a545826 --- /dev/null +++ b/fHDHR/http/hdhr/__init__.py @@ -0,0 +1,31 @@ + + +from .lineup_xml import Lineup_XML +from .discover_json import Discover_JSON +from .lineup_json import Lineup_JSON +from .lineup_status_json import Lineup_Status_JSON + +from .lineup_post import Lineup_Post +from .device_xml import HDHR_Device_XML + +from .auto import Auto +from .tuner import Tuner + + +class fHDHR_HDHR(): + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + self.lineup_post = Lineup_Post(fhdhr) + + self.device_xml = HDHR_Device_XML(fhdhr) + + self.auto = Auto(fhdhr) + self.tuner = Tuner(fhdhr) + + self.lineup_xml = Lineup_XML(fhdhr) + + self.discover_json = Discover_JSON(fhdhr) + self.lineup_json = Lineup_JSON(fhdhr) + self.lineup_status_json = Lineup_Status_JSON(fhdhr) diff --git a/fHDHR/http/hdhr/auto.py b/fHDHR/http/hdhr/auto.py new file mode 100644 index 0000000..63e4664 --- /dev/null +++ b/fHDHR/http/hdhr/auto.py @@ -0,0 +1,45 @@ +from flask import request, abort, redirect +import urllib.parse + + +class Auto(): + endpoints = ['/auto/', '/hdhr/auto/'] + endpoint_name = "hdhr_auto" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, channel, *args): + return self.get(channel, *args) + + def get(self, channel, *args): + + method = request.args.get('method', default=self.fhdhr.config.dict["fhdhr"]["stream_type"], type=str) + + redirect_url = "/api/tuners?method=%s" % (method) + + if channel.startswith("v"): + channel_number = channel.replace('v', '') + elif channel.startswith("ch"): + channel_freq = channel.replace('ch', '').split("-")[0] + subchannel = 0 + if "-" in channel: + subchannel = channel.replace('ch', '').split("-")[1] + self.fhdhr.logger.error("Not Implemented %s-%s" % (str(channel_freq), str(subchannel))) + abort(501, "Not Implemented %s-%s" % (str(channel_freq), str(subchannel))) + else: + channel_number = channel + + redirect_url += "&channel=%s" % str(channel_number) + + duration = request.args.get('duration', default=0, type=int) + if duration: + redirect_url += "&duration=%s" % str(duration) + + transcode = request.args.get('transcode', default=None, type=str) + if transcode: + redirect_url += "&transcode=%s" % str(transcode) + + redirect_url += "&accessed=%s" % urllib.parse.quote(request.url) + + return redirect(redirect_url) diff --git a/fHDHR/http/hdhr/device_xml.py b/fHDHR/http/hdhr/device_xml.py new file mode 100644 index 0000000..6dc0250 --- /dev/null +++ b/fHDHR/http/hdhr/device_xml.py @@ -0,0 +1,53 @@ +from flask import Response, request +from io import BytesIO +import xml.etree.ElementTree + +from fHDHR.tools import sub_el + + +class HDHR_Device_XML(): + endpoints = ["/hdhr/device.xml"] + endpoint_name = "hdhr_device_xml" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + """Device.xml referenced from SSDP""" + + base_url = request.url_root[:-1] + + out = xml.etree.ElementTree.Element('root') + out.set('xmlns', "urn:schemas-upnp-org:device-1-0") + + sub_el(out, 'URLBase', "%s" % base_url) + + specVersion_out = sub_el(out, 'specVersion') + sub_el(specVersion_out, 'major', "1") + sub_el(specVersion_out, 'minor', "0") + + device_out = sub_el(out, 'device') + + sub_el(device_out, 'deviceType', "urn:schemas-upnp-org:device:MediaServer:1") + + sub_el(device_out, 'friendlyName', self.fhdhr.config.dict["fhdhr"]["friendlyname"]) + sub_el(device_out, 'manufacturer', self.fhdhr.config.dict["fhdhr"]["reporting_manufacturer"]) + sub_el(device_out, 'manufacturerURL', "https://github.com/fHDHR/%s" % self.fhdhr.config.dict["main"]["reponame"]) + sub_el(device_out, 'modelName', self.fhdhr.config.dict["fhdhr"]["reporting_model"]) + sub_el(device_out, 'modelNumber', self.fhdhr.config.internal["versions"]["fHDHR"]) + + sub_el(device_out, 'serialNumber') + + sub_el(device_out, 'UDN', "uuid:" + self.fhdhr.config.dict["main"]["uuid"]) + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() + + return Response(status=200, + response=device_xml, + mimetype='application/xml') diff --git a/fHDHR/http/hdhr/discover_json.py b/fHDHR/http/hdhr/discover_json.py new file mode 100644 index 0000000..a31326a --- /dev/null +++ b/fHDHR/http/hdhr/discover_json.py @@ -0,0 +1,35 @@ +from flask import Response, request +import json + + +class Discover_JSON(): + endpoints = ["/discover.json", "/hdhr/discover.json"] + endpoint_name = "hdhr_discover_json" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + base_url = request.url_root[:-1] + + jsondiscover = { + "FriendlyName": self.fhdhr.config.dict["fhdhr"]["friendlyname"], + "Manufacturer": self.fhdhr.config.dict["fhdhr"]["reporting_manufacturer"], + "ModelNumber": self.fhdhr.config.dict["fhdhr"]["reporting_model"], + "FirmwareName": self.fhdhr.config.dict["fhdhr"]["reporting_firmware_name"], + "TunerCount": self.fhdhr.config.dict["fhdhr"]["tuner_count"], + "FirmwareVersion": self.fhdhr.config.dict["fhdhr"]["reporting_firmware_ver"], + "DeviceID": self.fhdhr.config.dict["main"]["uuid"], + "DeviceAuth": self.fhdhr.config.dict["fhdhr"]["device_auth"], + "BaseURL": "%s" % base_url, + "LineupURL": "%s/lineup.json" % base_url + } + discover_json = json.dumps(jsondiscover, indent=4) + + return Response(status=200, + response=discover_json, + mimetype='application/json') diff --git a/fHDHR/http/hdhr/lineup_json.py b/fHDHR/http/hdhr/lineup_json.py new file mode 100644 index 0000000..0638deb --- /dev/null +++ b/fHDHR/http/hdhr/lineup_json.py @@ -0,0 +1,37 @@ +from flask import Response, request +import json + + +class Lineup_JSON(): + endpoints = ["/lineup.json", "/hdhr/lineup.json"] + endpoint_name = "hdhr_lineup_json" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + base_url = request.url_root[:-1] + + show = request.args.get('show', default="all", type=str) + + jsonlineup = [] + for fhdhr_id in list(self.fhdhr.device.channels.list.keys()): + channel_obj = self.fhdhr.device.channels.list[fhdhr_id] + if channel_obj.enabled or show == "found": + lineup_dict = channel_obj.lineup_dict() + lineup_dict["URL"] = "%s%s" % (base_url, lineup_dict["URL"]) + if show == "found" and channel_obj.enabled: + lineup_dict["Enabled"] = 1 + elif show == "found" and not channel_obj.enabled: + lineup_dict["Enabled"] = 0 + jsonlineup.append(lineup_dict) + + lineup_json = json.dumps(jsonlineup, indent=4) + + return Response(status=200, + response=lineup_json, + mimetype='application/json') diff --git a/fHDHR/http/hdhr/lineup_post.py b/fHDHR/http/hdhr/lineup_post.py new file mode 100644 index 0000000..adea967 --- /dev/null +++ b/fHDHR/http/hdhr/lineup_post.py @@ -0,0 +1,60 @@ +from flask import request, abort, Response + +from fHDHR.exceptions import TunerError + + +class Lineup_Post(): + endpoints = ["/lineup.post", "/hdhr/lineup.post"] + endpoint_name = "hdhr_lineup_post" + endpoint_methods = ["POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + if 'scan' in list(request.args.keys()): + + if request.args['scan'] == 'start': + try: + self.fhdhr.device.tuners.tuner_scan() + except TunerError as e: + self.fhdhr.logger.info(str(e)) + return Response(status=200, mimetype='text/html') + + elif request.args['scan'] == 'abort': + self.fhdhr.device.tuners.stop_tuner_scan() + return Response(status=200, mimetype='text/html') + + else: + self.fhdhr.logger.warning("Unknown scan command " + request.args['scan']) + return abort(200, "Not a valid scan command") + + elif 'favorite' in list(request.args.keys()): + if request.args['favorite'].startstwith(tuple(["+", "-", "x"])): + + channel_method = request.args['favorite'][0] + channel_number = request.args['favorite'][1:] + + if str(channel_number) not in [str(x) for x in self.fhdhr.device.channels.get_channel_list("number")]: + response = Response("Not Found", status=404) + response.headers["X-fHDHR-Error"] = "801 - Unknown Channel" + self.fhdhr.logger.error(response.headers["X-fHDHR-Error"]) + abort(response) + + if channel_method == "+": + self.fhdhr.device.channels.set_channel_enablement("number", channel_number, channel_method) + elif channel_method == "-": + self.fhdhr.device.channels.set_channel_enablement("number", channel_number, channel_method) + elif channel_method == "x": + self.fhdhr.device.channels.set_channel_enablement("number", channel_number, "toggle") + + else: + self.fhdhr.logger.warning("Unknown favorite command " + request.args['favorite']) + return abort(200, "Not a valid favorite command") + + else: + return abort(501, "Not a valid command") diff --git a/fHDHR/http/hdhr/lineup_status_json.py b/fHDHR/http/hdhr/lineup_status_json.py new file mode 100644 index 0000000..7c0abf5 --- /dev/null +++ b/fHDHR/http/hdhr/lineup_status_json.py @@ -0,0 +1,50 @@ +from flask import Response +import json + + +class Lineup_Status_JSON(): + endpoints = ["/lineup_status.json", "/hdhr/lineup_status.json"] + endpoint_name = "hdhr_lineup_status_json" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + tuner_status = self.fhdhr.device.tuners.status() + tuners_scanning = 0 + for tuner_number in list(tuner_status.keys()): + if tuner_status[tuner_number]["status"] == "Scanning": + tuners_scanning += 1 + + if tuners_scanning: + jsonlineup = self.scan_in_progress() + elif not len(self.fhdhr.device.channels.list): + jsonlineup = self.scan_in_progress() + else: + jsonlineup = self.not_scanning() + lineup_json = json.dumps(jsonlineup, indent=4) + + return Response(status=200, + response=lineup_json, + mimetype='application/json') + + def scan_in_progress(self): + jsonlineup = { + "ScanInProgress": "true", + "Progress": 99, + "Found": len(self.fhdhr.device.channels.list) + } + return jsonlineup + + def not_scanning(self): + jsonlineup = { + "ScanInProgress": "false", + "ScanPossible": "true", + "Source": self.fhdhr.config.dict["fhdhr"]["reporting_tuner_type"], + "SourceList": [self.fhdhr.config.dict["fhdhr"]["reporting_tuner_type"]], + } + return jsonlineup diff --git a/fHDHR/http/hdhr/lineup_xml.py b/fHDHR/http/hdhr/lineup_xml.py new file mode 100644 index 0000000..c5aa8c5 --- /dev/null +++ b/fHDHR/http/hdhr/lineup_xml.py @@ -0,0 +1,45 @@ +from flask import Response, request +from io import BytesIO +import xml.etree.ElementTree + +from fHDHR.tools import sub_el + + +class Lineup_XML(): + endpoints = ["/lineup.xml", "/hdhr/lineup.xml"] + endpoint_name = "hdhr_lineup_xml" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + base_url = request.url_root[:-1] + + show = request.args.get('show', default="all", type=str) + + out = xml.etree.ElementTree.Element('Lineup') + for fhdhr_id in list(self.fhdhr.device.channels.list.keys()): + channel_obj = self.fhdhr.device.channels.list[fhdhr_id] + if channel_obj.enabled or show == "found": + program_out = sub_el(out, 'Program') + lineup_dict = channel_obj.lineup_dict() + lineup_dict["URL"] = base_url + lineup_dict["URL"] + if show == "found" and channel_obj.enabled: + lineup_dict["Enabled"] = 1 + elif show == "found" and not channel_obj.enabled: + lineup_dict["Enabled"] = 0 + for key in list(lineup_dict.keys()): + sub_el(program_out, str(key), str(lineup_dict[key])) + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + lineup_xml = fakefile.getvalue() + + return Response(status=200, + response=lineup_xml, + mimetype='application/xml') diff --git a/fHDHR/http/hdhr/tuner.py b/fHDHR/http/hdhr/tuner.py new file mode 100644 index 0000000..072b79b --- /dev/null +++ b/fHDHR/http/hdhr/tuner.py @@ -0,0 +1,47 @@ +from flask import request, abort, redirect +import urllib.parse + + +class Tuner(): + endpoints = ['/tuner/', '/hdhr/tuner/'] + endpoint_name = "hdhr_tuner" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, tuner_number, channel, *args): + return self.get(tuner_number, channel, *args) + + def get(self, tuner_number, channel, *args): + + method = request.args.get('method', default=self.fhdhr.config.dict["fhdhr"]["stream_type"], type=str) + + redirect_url = "/api/tuners?method=%s" % (method) + + redirect_url += "&tuner=%s" % str(tuner_number) + + if channel.startswith("v"): + channel_number = channel.replace('v', '') + elif channel.startswith("ch"): + channel_freq = channel.replace('ch', '').split("-")[0] + subchannel = 0 + if "-" in channel: + subchannel = channel.replace('ch', '').split("-")[1] + self.fhdhr.logger.error("Not Implemented %s-%s" % (str(channel_freq), str(subchannel))) + abort(501, "Not Implemented %s-%s" % (str(channel_freq), str(subchannel))) + else: + channel_number = channel + + redirect_url += "&channel=%s" % str(channel_number) + + duration = request.args.get('duration', default=0, type=int) + if duration: + redirect_url += "&duration=%s" % str(duration) + + transcode = request.args.get('transcode', default=None, type=str) + if transcode: + redirect_url += "&transcode=%s" % str(transcode) + + redirect_url += "&accessed=%s" % urllib.parse.quote(request.url) + + return redirect(redirect_url) diff --git a/fHDHR/http/pages/__init__.py b/fHDHR/http/pages/__init__.py new file mode 100644 index 0000000..95d6eea --- /dev/null +++ b/fHDHR/http/pages/__init__.py @@ -0,0 +1,31 @@ + + +from .index_html import Index_HTML +from .origin_html import Origin_HTML +from .channels_html import Channels_HTML +from .guide_html import Guide_HTML +from .cluster_html import Cluster_HTML +from .tuners_html import Tuners_HTML +from .xmltv_html import xmlTV_HTML +from .version_html import Version_HTML +from .diagnostics_html import Diagnostics_HTML +from .settings_html import Settings_HTML +from .channels_editor import Channels_Editor_HTML + + +class fHDHR_Pages(): + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + self.index_html = Index_HTML(fhdhr) + self.origin_html = Origin_HTML(fhdhr) + self.channels_html = Channels_HTML(fhdhr) + self.channels_editor = Channels_Editor_HTML(fhdhr) + self.guide_html = Guide_HTML(fhdhr) + self.cluster_html = Cluster_HTML(fhdhr) + self.tuners_html = Tuners_HTML(fhdhr) + self.xmltv_html = xmlTV_HTML(fhdhr) + self.version_html = Version_HTML(fhdhr) + self.diagnostics_html = Diagnostics_HTML(fhdhr) + self.settings_html = Settings_HTML(fhdhr) diff --git a/fHDHR/http/pages/channels_editor.py b/fHDHR/http/pages/channels_editor.py new file mode 100644 index 0000000..f766127 --- /dev/null +++ b/fHDHR/http/pages/channels_editor.py @@ -0,0 +1,23 @@ +from flask import request, render_template + + +class Channels_Editor_HTML(): + endpoints = ["/channels_editor", "/channels_editor.html"] + endpoint_name = "page_channels_editor_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + channelslist = [] + for fhdhr_id in list(self.fhdhr.device.channels.list.keys()): + channel_obj = self.fhdhr.device.channels.list[fhdhr_id] + channel_dict = channel_obj.dict.copy() + channel_dict["play_url"] = channel_obj.play_url() + channelslist.append(channel_dict) + + return render_template('channels_editor.html', request=request, fhdhr=self.fhdhr, channelslist=channelslist) diff --git a/fHDHR/http/pages/channels_html.py b/fHDHR/http/pages/channels_html.py new file mode 100644 index 0000000..1f4213b --- /dev/null +++ b/fHDHR/http/pages/channels_html.py @@ -0,0 +1,30 @@ +from flask import request, render_template + + +class Channels_HTML(): + endpoints = ["/channels", "/channels.html"] + endpoint_name = "page_channels_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + channels_dict = { + "Total Channels": len(list(self.fhdhr.device.channels.list.keys())), + "Enabled": 0, + } + + channelslist = [] + for fhdhr_id in list(self.fhdhr.device.channels.list.keys()): + channel_obj = self.fhdhr.device.channels.list[fhdhr_id] + channel_dict = channel_obj.dict.copy() + channel_dict["play_url"] = channel_obj.play_url() + channelslist.append(channel_dict) + if channel_dict["enabled"]: + channels_dict["Enabled"] += 1 + + return render_template('channels.html', request=request, fhdhr=self.fhdhr, channelslist=channelslist, channels_dict=channels_dict, list=list) diff --git a/fHDHR/http/pages/cluster_html.py b/fHDHR/http/pages/cluster_html.py new file mode 100644 index 0000000..95fdb21 --- /dev/null +++ b/fHDHR/http/pages/cluster_html.py @@ -0,0 +1,50 @@ +from flask import request, render_template +import urllib.parse + + +class Cluster_HTML(): + endpoints = ["/cluster", "/cluster.html"] + endpoint_name = "page_cluster_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + self.location_dict = { + "name": self.fhdhr.config.dict["fhdhr"]["friendlyname"], + "location": self.fhdhr.device.cluster.location, + "joined": "N/A", + "url_query": self.fhdhr.device.cluster.location_url + } + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + locations_list = [] + + if self.fhdhr.config.dict["fhdhr"]["discovery_address"]: + + locations_list.append(self.location_dict) + + fhdhr_list = self.fhdhr.device.cluster.get_list() + for location in list(fhdhr_list.keys()): + + if location in list(self.fhdhr.device.cluster.cluster().keys()): + location_name = self.fhdhr.device.cluster.cluster()[location]["name"] + else: + try: + location_info_url = location + "/discover.json" + location_info_req = self.fhdhr.web.session.get(location_info_url) + location_info = location_info_req.json() + location_name = location_info["FriendlyName"] + except self.fhdhr.web.exceptions.ConnectionError: + self.fhdhr.logger.error("Unreachable: " + location) + location_dict = { + "name": location_name, + "location": location, + "joined": str(fhdhr_list[location]["Joined"]), + "url_query": urllib.parse.quote(location) + } + locations_list.append(location_dict) + + return render_template('cluster.html', request=request, fhdhr=self.fhdhr, locations_list=locations_list) diff --git a/fHDHR/http/pages/diagnostics_html.py b/fHDHR/http/pages/diagnostics_html.py new file mode 100644 index 0000000..04eda62 --- /dev/null +++ b/fHDHR/http/pages/diagnostics_html.py @@ -0,0 +1,125 @@ +from flask import request, render_template + + +class Diagnostics_HTML(): + endpoints = ["/diagnostics", "/diagnostics.html"] + endpoint_name = "page_diagnostics_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + base_url = request.url_root[:-1] + + button_list = [] + + button_list.append({ + "label": "Debug Json", + "hdhr": None, + "rmg": None, + "other": "/api/debug", + }) + + button_list.append({ + "label": "Cluster Json", + "hdhr": None, + "rmg": None, + "other": "/api/cluster?method=get", + }) + + button_list.append({ + "label": "Lineup XML", + "hdhr": "/lineup.xml", + "rmg": None, + "other": None, + }) + + button_list.append({ + "label": "Lineup JSON", + "hdhr": "/hdhr/lineup.json", + "rmg": None, + "other": None, + }) + + button_list.append({ + "label": "Lineup Status", + "hdhr": "/hdhr/lineup_status.json", + "rmg": None, + "other": None, + }) + + button_list.append({ + "label": "Discover Json", + "hdhr": "/hdhr/discover.json", + "rmg": None, + "other": None, + }) + + button_list.append({ + "label": "Device XML", + "hdhr": "/hdhr/device.xml", + "rmg": "/rmg/device.xml", + "other": None, + }) + + button_list.append({ + "label": "RMG Identification XML", + "hdhr": "", + "rmg": "/rmg", + "other": None, + }) + + button_list.append({ + "label": "RMG Devices Discover", + "hdhr": "", + "rmg": "/rmg/devices/discover", + "other": None, + }) + + button_list.append({ + "label": "RMG Devices Probe", + "hdhr": "", + "rmg": "/rmg/devices/probe?uri=%s" % base_url, + "other": None, + }) + + button_list.append({ + "label": "RMG Devices by DeviceKey", + "hdhr": "", + "rmg": "/rmg/devices/%s" % self.fhdhr.config.dict["main"]["uuid"], + "other": None, + }) + + button_list.append({ + "label": "RMG Channels by DeviceKey", + "hdhr": "", + "rmg": "/rmg/devices/%s/channels" % self.fhdhr.config.dict["main"]["uuid"], + "other": None, + }) + + button_list.append({ + "label": "RMG Scanners by DeviceKey", + "hdhr": "", + "rmg": "/rmg/devices/%s/scanners" % self.fhdhr.config.dict["main"]["uuid"], + "other": None, + }) + + button_list.append({ + "label": "RMG Networks by DeviceKey", + "hdhr": "", + "rmg": "/rmg/devices/%s/networks" % self.fhdhr.config.dict["main"]["uuid"], + "other": None, + }) + + button_list.append({ + "label": "RMG Scan by DeviceKey", + "hdhr": "", + "rmg": "/rmg/devices/%s/scan" % self.fhdhr.config.dict["main"]["uuid"], + "other": None, + }) + + return render_template('diagnostics.html', request=request, fhdhr=self.fhdhr, button_list=button_list) diff --git a/fHDHR/http/pages/guide_html.py b/fHDHR/http/pages/guide_html.py new file mode 100644 index 0000000..626eca7 --- /dev/null +++ b/fHDHR/http/pages/guide_html.py @@ -0,0 +1,43 @@ +from flask import request, render_template +import datetime + +from fHDHR.tools import humanized_time + + +class Guide_HTML(): + endpoints = ["/guide", "/guide.html"] + endpoint_name = "page_guide_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + nowtime = datetime.datetime.utcnow() + + chan_guide_list = [] + + source = request.args.get('source', default=self.fhdhr.device.epg.def_method, type=str) + epg_methods = self.fhdhr.device.epg.valid_epg_methods + if source not in epg_methods: + source = self.fhdhr.device.epg.def_method + + for channel in self.fhdhr.device.epg.whats_on_allchans(source): + end_time = datetime.datetime.strptime(channel["listing"][0]["time_end"], '%Y%m%d%H%M%S +0000') + remaining_time = humanized_time(int((end_time - nowtime).total_seconds())) + + chan_dict = { + "name": channel["name"], + "number": channel["number"], + "chan_thumbnail": channel["thumbnail"], + "listing_title": channel["listing"][0]["title"], + "listing_thumbnail": channel["listing"][0]["thumbnail"], + "listing_description": channel["listing"][0]["description"], + "remaining_time": str(remaining_time) + } + chan_guide_list.append(chan_dict) + + return render_template('guide.html', request=request, fhdhr=self.fhdhr, chan_guide_list=chan_guide_list, epg_methods=epg_methods) diff --git a/fHDHR/http/pages/index_html.py b/fHDHR/http/pages/index_html.py new file mode 100644 index 0000000..9da681a --- /dev/null +++ b/fHDHR/http/pages/index_html.py @@ -0,0 +1,27 @@ +from flask import request, render_template + + +class Index_HTML(): + endpoints = ["/index", "/index.html"] + endpoint_name = "page_index_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + tuners_in_use = self.fhdhr.device.tuners.inuse_tuner_count() + max_tuners = self.fhdhr.device.tuners.max_tuners + + fhdhr_status_dict = { + "Script Directory": str(self.fhdhr.config.internal["paths"]["script_dir"]), + "Config File": str(self.fhdhr.config.config_file), + "Cache Path": str(self.fhdhr.config.internal["paths"]["cache_dir"]), + "Total Channels": len(self.fhdhr.device.channels.list), + "Tuner Usage": ("%s/%s" % (str(tuners_in_use), str(max_tuners))), + } + + return render_template('index.html', request=request, fhdhr=self.fhdhr, fhdhr_status_dict=fhdhr_status_dict, list=list) diff --git a/fHDHR/http/pages/origin_html.py b/fHDHR/http/pages/origin_html.py new file mode 100644 index 0000000..82ca881 --- /dev/null +++ b/fHDHR/http/pages/origin_html.py @@ -0,0 +1,18 @@ +from flask import request, render_template + + +class Origin_HTML(): + endpoints = ["/origin", "/origin.html"] + endpoint_name = "page_origin_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + origin_status_dict = self.fhdhr.origin.get_status_dict() + origin_status_dict["Total Channels"] = len(self.fhdhr.device.channels.list) + return render_template('origin.html', request=request, fhdhr=self.fhdhr, origin_status_dict=origin_status_dict, list=list) diff --git a/fHDHR/http/pages/settings_html.py b/fHDHR/http/pages/settings_html.py new file mode 100644 index 0000000..de7d615 --- /dev/null +++ b/fHDHR/http/pages/settings_html.py @@ -0,0 +1,33 @@ +from flask import request, render_template + + +class Settings_HTML(): + endpoints = ["/settings", "/settings.html"] + endpoint_name = "page_settings_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + web_settings_dict = {} + for config_section in list(self.fhdhr.config.conf_default.keys()): + web_settings_dict[config_section] = {} + + for config_item in list(self.fhdhr.config.conf_default[config_section].keys()): + if self.fhdhr.config.conf_default[config_section][config_item]["config_web"]: + real_config_section = config_section + if config_section == self.fhdhr.config.dict["main"]["dictpopname"]: + real_config_section = "origin" + web_settings_dict[config_section][config_item] = { + "value": self.fhdhr.config.dict[real_config_section][config_item], + "value_default": self.fhdhr.config.conf_default[config_section][config_item]["value"], + "hide": self.fhdhr.config.conf_default[config_section][config_item]["config_web_hidden"] + } + if not len(web_settings_dict[config_section].keys()): + del web_settings_dict[config_section] + + return render_template('settings.html', request=request, fhdhr=self.fhdhr, web_settings_dict=web_settings_dict, list=list) diff --git a/fHDHR/http/pages/tuners_html.py b/fHDHR/http/pages/tuners_html.py new file mode 100644 index 0000000..787076b --- /dev/null +++ b/fHDHR/http/pages/tuners_html.py @@ -0,0 +1,36 @@ +from flask import request, render_template + +from fHDHR.tools import humanized_filesize + + +class Tuners_HTML(): + endpoints = ["/tuners", "/tuners.html"] + endpoint_name = "page_streams_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + tuner_list = [] + tuner_status = self.fhdhr.device.tuners.status() + tuner_scanning = 0 + for tuner in list(tuner_status.keys()): + tuner_dict = { + "number": str(tuner), + "status": str(tuner_status[tuner]["status"]), + } + if tuner_status[tuner]["status"] == "Active": + tuner_dict["channel_number"] = tuner_status[tuner]["channel"] + tuner_dict["method"] = tuner_status[tuner]["method"] + tuner_dict["play_duration"] = str(tuner_status[tuner]["Play Time"]) + tuner_dict["downloaded"] = humanized_filesize(tuner_status[tuner]["downloaded"]) + elif tuner_status[tuner]["status"] == "Scanning": + tuner_scanning += 1 + + tuner_list.append(tuner_dict) + + return render_template('tuners.html', request=request, fhdhr=self.fhdhr, tuner_list=tuner_list, tuner_scanning=tuner_scanning) diff --git a/fHDHR/http/pages/version_html.py b/fHDHR/http/pages/version_html.py new file mode 100644 index 0000000..24eca65 --- /dev/null +++ b/fHDHR/http/pages/version_html.py @@ -0,0 +1,18 @@ +from flask import request, render_template + + +class Version_HTML(): + endpoints = ["/version", "/version.html"] + endpoint_name = "page_version_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + version_dict = {} + for key in list(self.fhdhr.config.internal["versions"].keys()): + version_dict[key] = self.fhdhr.config.internal["versions"][key] + return render_template('version.html', request=request, fhdhr=self.fhdhr, version_dict=version_dict, list=list) diff --git a/fHDHR/http/pages/xmltv_html.py b/fHDHR/http/pages/xmltv_html.py new file mode 100644 index 0000000..869f0b7 --- /dev/null +++ b/fHDHR/http/pages/xmltv_html.py @@ -0,0 +1,16 @@ +from flask import request, render_template + + +class xmlTV_HTML(): + endpoints = ["/xmltv", "/xmltv.html"] + endpoint_name = "page_xmltv_html" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + return render_template('xmltv.html', request=request, fhdhr=self.fhdhr) diff --git a/fHDHR/http/rmg/__init__.py b/fHDHR/http/rmg/__init__.py new file mode 100644 index 0000000..bccf4e0 --- /dev/null +++ b/fHDHR/http/rmg/__init__.py @@ -0,0 +1,30 @@ + +from .rmg_ident_xml import RMG_Ident_XML +from .device_xml import RMG_Device_XML +from .devices_discover import RMG_Devices_Discover +from .devices_probe import RMG_Devices_Probe +from .devices_devicekey import RMG_Devices_DeviceKey +from .devices_devicekey_channels import RMG_Devices_DeviceKey_Channels +from .devices_devicekey_scanners import RMG_Devices_DeviceKey_Scanners +from .devices_devicekey_networks import RMG_Devices_DeviceKey_Networks +from .devices_devicekey_scan import RMG_Devices_DeviceKey_Scan +from .devices_devicekey_prefs import RMG_Devices_DeviceKey_Prefs +from .devices_devicekey_media import RMG_Devices_DeviceKey_Media + + +class fHDHR_RMG(): + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + self.rmg_ident_xml = RMG_Ident_XML(fhdhr) + self.device_xml = RMG_Device_XML(fhdhr) + self.devices_discover = RMG_Devices_Discover(fhdhr) + self.devices_probe = RMG_Devices_Probe(fhdhr) + self.devices_devicekey = RMG_Devices_DeviceKey(fhdhr) + self.devices_devicekey_channels = RMG_Devices_DeviceKey_Channels(fhdhr) + self.devices_devicekey_scanners = RMG_Devices_DeviceKey_Scanners(fhdhr) + self.devices_devicekey_networks = RMG_Devices_DeviceKey_Networks(fhdhr) + self.devices_devicekey_scan = RMG_Devices_DeviceKey_Scan(fhdhr) + self.devices_devicekey_prefs = RMG_Devices_DeviceKey_Prefs(fhdhr) + self.devices_devicekey_media = RMG_Devices_DeviceKey_Media(fhdhr) diff --git a/fHDHR/http/rmg/device_xml.py b/fHDHR/http/rmg/device_xml.py new file mode 100644 index 0000000..8740bc9 --- /dev/null +++ b/fHDHR/http/rmg/device_xml.py @@ -0,0 +1,58 @@ +from flask import Response, request +from io import BytesIO +import xml.etree.ElementTree + +from fHDHR.tools import sub_el + + +class RMG_Device_XML(): + endpoints = ["/rmg/device.xml"] + endpoint_name = "rmg_device_xml" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + """Device.xml referenced from SSDP""" + + base_url = request.url_root[:-1] + + out = xml.etree.ElementTree.Element('root') + out.set('xmlns', "urn:schemas-upnp-org:device-1-0") + + specVersion_out = sub_el(out, 'specVersion') + sub_el(specVersion_out, 'major', "1") + sub_el(specVersion_out, 'minor', "0") + + device_out = sub_el(out, 'device') + + sub_el(device_out, 'deviceType', "urn:plex-tv:device:Media:1") + + sub_el(device_out, 'friendlyName', self.fhdhr.config.dict["fhdhr"]["friendlyname"]) + sub_el(device_out, 'manufacturer', self.fhdhr.config.dict["fhdhr"]["reporting_manufacturer"]) + sub_el(device_out, 'manufacturerURL', "https://github.com/fHDHR/%s" % self.fhdhr.config.dict["main"]["reponame"]) + sub_el(device_out, 'modelName', self.fhdhr.config.dict["fhdhr"]["reporting_model"]) + sub_el(device_out, 'modelNumber', self.fhdhr.config.internal["versions"]["fHDHR"]) + + sub_el(device_out, 'modelDescription', self.fhdhr.config.dict["fhdhr"]["friendlyname"]) + sub_el(device_out, 'modelURL', "https://github.com/fHDHR/%s" % self.fhdhr.config.dict["main"]["reponame"]) + + serviceList_out = sub_el(device_out, 'serviceList') + service_out = sub_el(serviceList_out, 'service') + sub_el(out, 'URLBase', "%s" % base_url) + sub_el(service_out, 'serviceType', "urn:plex-tv:service:MediaGrabber:1") + sub_el(service_out, 'serviceId', "urn:plex-tv:serviceId:MediaGrabber") + + sub_el(device_out, 'UDN', "uuid:%s" % self.fhdhr.config.dict["main"]["uuid"]) + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() + + return Response(status=200, + response=device_xml, + mimetype='application/xml') diff --git a/fHDHR/http/rmg/devices_devicekey.py b/fHDHR/http/rmg/devices_devicekey.py new file mode 100644 index 0000000..697b6bc --- /dev/null +++ b/fHDHR/http/rmg/devices_devicekey.py @@ -0,0 +1,94 @@ +from flask import Response, request +from io import BytesIO +import xml.etree.ElementTree + +from fHDHR.tools import sub_el + + +class RMG_Devices_DeviceKey(): + endpoints = ["/devices/", "/rmg/devices/"] + endpoint_name = "rmg_devices_devicekey" + endpoint_methods = ["GET"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, devicekey, *args): + return self.get(devicekey, *args) + + def get(self, devicekey, *args): + """Returns the identity, capabilities, and current status of the devices and each of its tuners.""" + + base_url = request.url_root[:-1] + + out = xml.etree.ElementTree.Element('MediaContainer') + if devicekey == self.fhdhr.config.dict["main"]["uuid"]: + out.set('size', "1") + device_out = sub_el(out, 'Device', + key=self.fhdhr.config.dict["main"]["uuid"], + make=self.fhdhr.config.dict["fhdhr"]["reporting_manufacturer"], + model=self.fhdhr.config.dict["fhdhr"]["reporting_model"], + modelNumber=self.fhdhr.config.internal["versions"]["fHDHR"], + protocol="livetv", + status="alive", + title=self.fhdhr.config.dict["fhdhr"]["friendlyname"], + tuners=str(self.fhdhr.config.dict["fhdhr"]["tuner_count"]), + uri=base_url, + uuid="device://tv.plex.grabbers.fHDHR/%s" % self.fhdhr.config.dict["main"]["uuid"], + ) + + tuner_status = self.fhdhr.device.tuners.status() + + for tuner_number in list(tuner_status.keys()): + tuner_dict = tuner_status[tuner_number] + + # Idle + if tuner_dict["status"] in ["Inactive"]: + sub_el(device_out, 'Tuner', + index=tuner_number, + status="idle", + ) + + # Streaming + elif tuner_dict["status"] in ["Active", "Acquired"]: + sub_el(device_out, 'Tuner', + index=tuner_number, + status="streaming", + channelIdentifier="id://%s" % tuner_dict["channel"], + signalStrength="100", + signalQuality="100", + symbolQuality="100", + lock="1", + ) + + # Scanning + elif tuner_dict["status"] in ["Scanning"]: + sub_el(device_out, 'Tuner', + index=tuner_number, + status="scanning", + progress="99", + channelsFound=str(len(self.fhdhr.device.channels.list)), + ) + + # TODO networksScanned + elif tuner_dict["status"] in ["networksScanned"]: + sub_el(device_out, 'Tuner', + index=tuner_number, + status="networksScanned", + ) + + # Error + elif tuner_dict["status"] in ["Error"]: + sub_el(device_out, 'Tuner', + index=tuner_number, + status="error", + ) + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() + + return Response(status=200, + response=device_xml, + mimetype='application/xml') diff --git a/fHDHR/http/rmg/devices_devicekey_channels.py b/fHDHR/http/rmg/devices_devicekey_channels.py new file mode 100644 index 0000000..8122f93 --- /dev/null +++ b/fHDHR/http/rmg/devices_devicekey_channels.py @@ -0,0 +1,47 @@ +from flask import Response +from io import BytesIO +import xml.etree.ElementTree + +from fHDHR.tools import sub_el + + +class RMG_Devices_DeviceKey_Channels(): + endpoints = ["/devices//channels", "/rmg/devices//channels"] + endpoint_name = "rmg_devices_devicekey_channels" + endpoint_methods = ["GET"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, devicekey, *args): + return self.get(devicekey, *args) + + def get(self, devicekey, *args): + """Returns the current channels.""" + + out = xml.etree.ElementTree.Element('MediaContainer') + if devicekey == self.fhdhr.config.dict["main"]["uuid"]: + out.set('size', str(len(self.fhdhr.device.channels.list))) + for fhdhr_id in list(self.fhdhr.device.channels.list.keys()): + channel_obj = self.fhdhr.device.channels.list[fhdhr_id] + if channel_obj.enabled: + sub_el(out, 'Channel', + drm="0", + channelIdentifier="id://%s" % channel_obj.dict["number"], + name=channel_obj.dict["name"], + origin=channel_obj.dict["callsign"], + number=str(channel_obj.dict["number"]), + type="tv", + # TODO param + signalStrength="100", + signalQuality="100", + ) + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() + + return Response(status=200, + response=device_xml, + mimetype='application/xml') diff --git a/fHDHR/http/rmg/devices_devicekey_media.py b/fHDHR/http/rmg/devices_devicekey_media.py new file mode 100644 index 0000000..6cf7c7b --- /dev/null +++ b/fHDHR/http/rmg/devices_devicekey_media.py @@ -0,0 +1,31 @@ +from flask import request, redirect +import urllib.parse + + +class RMG_Devices_DeviceKey_Media(): + endpoints = ["/devices//media/", "/rmg/devices//media/"] + endpoint_name = "rmg_devices_devicekey_media" + endpoint_methods = ["GET"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, devicekey, channel, *args): + return self.get(devicekey, channel, *args) + + def get(self, devicekey, channel, *args): + + param = request.args.get('method', default=None, type=str) + self.fhdhr.logger.debug("param:%s" % param) + + method = self.fhdhr.config.dict["fhdhr"]["stream_type"] + + redirect_url = "/api/tuners?method=%s" % (method) + + if str(channel).startswith('id://'): + channel = str(channel).replace('id://', '') + redirect_url += "&channel=%s" % str(channel) + + redirect_url += "&accessed=%s" % urllib.parse.quote(request.url) + + return redirect(redirect_url) diff --git a/fHDHR/http/rmg/devices_devicekey_networks.py b/fHDHR/http/rmg/devices_devicekey_networks.py new file mode 100644 index 0000000..c635965 --- /dev/null +++ b/fHDHR/http/rmg/devices_devicekey_networks.py @@ -0,0 +1,38 @@ +from flask import Response +from io import BytesIO +import xml.etree.ElementTree + +from fHDHR.tools import sub_el + + +class RMG_Devices_DeviceKey_Networks(): + endpoints = ["/devices//networks", "/rmg/devices//networks"] + endpoint_name = "rmg_devices_devicekey_networks" + endpoint_methods = ["GET"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, devicekey, *args): + return self.get(devicekey, *args) + + def get(self, devicekey, *args): + """In some cases, channel scanning is a two-step process, where the first stage consists of scanning for networks (this is called "fast scan").""" + + out = xml.etree.ElementTree.Element('MediaContainer') + if devicekey == self.fhdhr.config.dict["main"]["uuid"]: + out.set('size', "1") + + sub_el(out, 'Network', + key="1", + title="fHDHR" + ) + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() + + return Response(status=200, + response=device_xml, + mimetype='application/xml') diff --git a/fHDHR/http/rmg/devices_devicekey_prefs.py b/fHDHR/http/rmg/devices_devicekey_prefs.py new file mode 100644 index 0000000..90a1e06 --- /dev/null +++ b/fHDHR/http/rmg/devices_devicekey_prefs.py @@ -0,0 +1,18 @@ +from flask import Response + + +class RMG_Devices_DeviceKey_Prefs(): + endpoints = ["/devices//prefs", "/rmg/devices//prefs"] + endpoint_name = "rmg_devices_devicekey_prefs" + endpoint_methods = ["GET", "PUT"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, devicekey, *args): + return self.get(devicekey, *args) + + def get(self, devicekey, *args): + """Prefs sent back from Plex in Key-Pair format""" + + return Response(status=200) diff --git a/fHDHR/http/rmg/devices_devicekey_scan.py b/fHDHR/http/rmg/devices_devicekey_scan.py new file mode 100644 index 0000000..f7d3aea --- /dev/null +++ b/fHDHR/http/rmg/devices_devicekey_scan.py @@ -0,0 +1,65 @@ +from flask import Response, request +from io import BytesIO +import xml.etree.ElementTree + + +class RMG_Devices_DeviceKey_Scan(): + endpoints = ["/devices//scan", "/rmg/devices//scan"] + endpoint_name = "rmg_devices_devicekey_scan" + endpoint_methods = ["GET", "POST", "DELETE"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, devicekey, *args): + return self.get(devicekey, *args) + + def get(self, devicekey, *args): + """Starts a background channel scan.""" + + if request.method in ["GET", "POST"]: + + network = request.args.get('network', default=None, type=str) + source = request.args.get('source', default=None, type=int) + provider = request.args.get('provider', default=1, type=int) + + self.fhdhr.logger.debug("Scan Requested network:%s, source:%s, provider:%s" % (network, source, provider)) + + out = xml.etree.ElementTree.Element('MediaContainer') + if devicekey == self.fhdhr.config.dict["main"]["uuid"]: + + tuner_status = self.fhdhr.device.tuners.status() + tuner_scanning = 0 + for tuner in list(tuner_status.keys()): + if tuner_status[tuner]["status"] == "Scanning": + tuner_scanning += 1 + + if tuner_scanning: + out.set('status', "1") + out.set('message', "Scanning") + else: + out.set('status', "0") + out.set('message', "Not Scanning") + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() + + return Response(status=200, + response=device_xml, + mimetype='application/xml') + + elif request.method in ["DELETE"]: + + out = xml.etree.ElementTree.Element('MediaContainer') + if devicekey == self.fhdhr.config.dict["main"]["uuid"]: + + self.fhdhr.device.tuners.stop_tuner_scan() + out.set('status', "0") + out.set('message', "Scan Aborted") + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() diff --git a/fHDHR/http/rmg/devices_devicekey_scanners.py b/fHDHR/http/rmg/devices_devicekey_scanners.py new file mode 100644 index 0000000..4a2d4ec --- /dev/null +++ b/fHDHR/http/rmg/devices_devicekey_scanners.py @@ -0,0 +1,48 @@ +from flask import Response, request +from io import BytesIO +import xml.etree.ElementTree + +from fHDHR.tools import sub_el + + +class RMG_Devices_DeviceKey_Scanners(): + endpoints = ["/devices//scanners", "/rmg/devices//scanners"] + endpoint_name = "rmg_devices_devicekey_scanners" + endpoint_methods = ["GET"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, devicekey, *args): + return self.get(devicekey, *args) + + def get(self, devicekey, *args): + """ascertain which type of scanners are supported.""" + + method = request.args.get('type', default="0", type=str) + # 0 (atsc), 1 (cqam), 2 (dvb-s), 3 (iptv), 4 (virtual), 5 (dvb-t), 6 (dvb-c), 7 (isdbt) + + out = xml.etree.ElementTree.Element('MediaContainer') + if devicekey == self.fhdhr.config.dict["main"]["uuid"]: + if method == "0": + out.set('size', "1") + out.set('simultaneousScanners', "1") + + scanner_out = sub_el(out, 'Scanner', + type="atsc", + # TODO country + ) + sub_el(scanner_out, 'Setting', + id="provider", + type="text", + enumValues=self.fhdhr.config.dict["main"]["servicename"] + ) + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() + + return Response(status=200, + response=device_xml, + mimetype='application/xml') diff --git a/fHDHR/http/rmg/devices_discover.py b/fHDHR/http/rmg/devices_discover.py new file mode 100644 index 0000000..82daca1 --- /dev/null +++ b/fHDHR/http/rmg/devices_discover.py @@ -0,0 +1,49 @@ +from flask import Response, request +from io import BytesIO +import xml.etree.ElementTree + +from fHDHR.tools import sub_el + + +class RMG_Devices_Discover(): + endpoints = ["/devices/discover", "/rmg/devices/discover"] + endpoint_name = "rmg_devices_discover" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + """This endpoint requests the grabber attempt to discover any devices it can, and it returns zero or more devices.""" + + base_url = request.url_root[:-1] + + out = xml.etree.ElementTree.Element('MediaContainer') + out.set('size', "1") + sub_el(out, 'Device', + key=self.fhdhr.config.dict["main"]["uuid"], + make=self.fhdhr.config.dict["fhdhr"]["reporting_manufacturer"], + model=self.fhdhr.config.dict["fhdhr"]["reporting_model"], + modelNumber=self.fhdhr.config.internal["versions"]["fHDHR"], + protocol="livetv", + status="alive", + title=self.fhdhr.config.dict["fhdhr"]["friendlyname"], + tuners=str(self.fhdhr.config.dict["fhdhr"]["tuner_count"]), + uri=base_url, + uuid="device://tv.plex.grabbers.fHDHR/%s" % self.fhdhr.config.dict["main"]["uuid"], + thumb="favicon.ico", + interface='network' + # TODO add preferences + ) + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() + + return Response(status=200, + response=device_xml, + mimetype='application/xml') diff --git a/fHDHR/http/rmg/devices_probe.py b/fHDHR/http/rmg/devices_probe.py new file mode 100644 index 0000000..e59ec2d --- /dev/null +++ b/fHDHR/http/rmg/devices_probe.py @@ -0,0 +1,51 @@ +from flask import Response, request +from io import BytesIO +import xml.etree.ElementTree + +from fHDHR.tools import sub_el + + +class RMG_Devices_Probe(): + endpoints = ["/devices/probe", "/rmg/devices/probe"] + endpoint_name = "rmg_devices_probe" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + """Probes a specific URI for a network device, and returns a device, if it exists at the given URI.""" + + base_url = request.url_root[:-1] + + uri = request.args.get('uri', default=None, type=str) + + out = xml.etree.ElementTree.Element('MediaContainer') + out.set('size', "1") + if uri == base_url: + sub_el(out, 'Device', + key=self.fhdhr.config.dict["main"]["uuid"], + make=self.fhdhr.config.dict["fhdhr"]["reporting_manufacturer"], + model=self.fhdhr.config.dict["fhdhr"]["reporting_model"], + modelNumber=self.fhdhr.config.internal["versions"]["fHDHR"], + protocol="livetv", + status="alive", + title=self.fhdhr.config.dict["fhdhr"]["friendlyname"], + tuners=str(self.fhdhr.config.dict["fhdhr"]["tuner_count"]), + uri=base_url, + uuid="device://tv.plex.grabbers.fHDHR/%s" % self.fhdhr.config.dict["main"]["uuid"], + thumb="favicon.ico", + interface='network' + ) + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() + + return Response(status=200, + response=device_xml, + mimetype='application/xml') diff --git a/fHDHR/http/rmg/rmg_ident_xml.py b/fHDHR/http/rmg/rmg_ident_xml.py new file mode 100644 index 0000000..8b5749b --- /dev/null +++ b/fHDHR/http/rmg/rmg_ident_xml.py @@ -0,0 +1,38 @@ +from flask import Response, request +from io import BytesIO +import xml.etree.ElementTree + +from fHDHR.tools import sub_el + + +class RMG_Ident_XML(): + endpoints = ["/rmg", "/rmg/"] + endpoint_name = "rmg_ident_xml" + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + """Provides general information about the media grabber""" + + base_url = request.url_root[:-1] + + out = xml.etree.ElementTree.Element('MediaContainer') + sub_el(out, 'MediaGrabber', + identifier="tv.plex.grabbers.fHDHR", + title=str(self.fhdhr.config.dict["fhdhr"]["friendlyname"]), + protocols="livetv", + icon="%s/favicon.ico" % base_url + ) + + fakefile = BytesIO() + fakefile.write(b'\n') + fakefile.write(xml.etree.ElementTree.tostring(out, encoding='UTF-8')) + device_xml = fakefile.getvalue() + + return Response(status=200, + response=device_xml, + mimetype='application/xml') diff --git a/fHDHR/origin/__init__.py b/fHDHR/origin/__init__.py new file mode 100644 index 0000000..c8e1412 --- /dev/null +++ b/fHDHR/origin/__init__.py @@ -0,0 +1,93 @@ +from .origin_service import OriginService +from .origin_channels import OriginChannels +from .origin_epg import OriginEPG + +import fHDHR.exceptions + + +class OriginEPG_StandIN(): + def __init__(self): + pass + + def update_epg(self, channels): + return {} + + +class OriginChannels_StandIN(): + def __init__(self): + pass + + def get_channels(self): + return [] + + def get_channel_stream(self, chandict): + return None + + +class OriginServiceWrapper(): + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + self.servicename = fhdhr.config.dict["main"]["servicename"] + + self.setup_success = None + self.setup() + + def setup(self): + + try: + self.origin = OriginService(self.fhdhr) + self.setup_success = True + self.fhdhr.logger.info("%s Setup Success" % self.servicename) + except fHDHR.exceptions.OriginSetupError as e: + self.fhdhr.logger.error(e) + self.setup_success = False + + if self.setup_success: + self.channels = OriginChannels(self.fhdhr, self.origin) + self.epg = OriginEPG(self.fhdhr) + else: + self.channels = OriginChannels_StandIN() + self.epg = OriginEPG_StandIN() + + def get_channels(self): + return self.channels.get_channels() + + def get_channel_stream(self, chandict): + return self.channels.get_channel_stream(chandict) + + def update_epg(self, channels): + return self.epg.update_epg(channels) + + def get_status_dict(self): + + if self.setup_success: + status_dict = { + "Setup": "Success", + } + + try: + full_status_dict = self.origin.get_status_dict() + for status_key in list(full_status_dict.keys()): + status_dict[status_key] = full_status_dict[status_key] + return status_dict + except AttributeError: + return status_dict + else: + return { + "Setup": "Failed", + } + + def __getattr__(self, name): + ''' will only get called for undefined attributes ''' + if hasattr(self.fhdhr, name): + return eval("self.fhdhr." + name) + if hasattr(self.origin, name): + return eval("self.origin." + name) + elif hasattr(self.channels, name): + return eval("self.channels." + name) + elif hasattr(self.epg, name): + return eval("self.epg." + name) + else: + raise AttributeError(name) diff --git a/fHDHR/origin/origin_channels.py b/fHDHR/origin/origin_channels.py new file mode 100644 index 0000000..f0e1c41 --- /dev/null +++ b/fHDHR/origin/origin_channels.py @@ -0,0 +1,57 @@ +import m3u8 + + +class OriginChannels(): + + def __init__(self, fhdhr, origin): + self.fhdhr = fhdhr + self.origin = origin + + self.base_api = 'http://watchtoonamiaftermath.com/api/linear/channels' + + def get_channels(self): + + channel_list = [] + + channels_json = self.fhdhr.web.session.get(self.base_api).json() + for channel_dict in channels_json: + if not channel_dict["disabled"]: + + clean_station_item = { + "name": channel_dict["config"]["affiliation"] or channel_dict["config"]["callsign"], + "callsign": channel_dict["config"]["callsign"], + "id": channel_dict["identifier"], + "thumbnail": channel_dict["icon"], + } + channel_list.append(clean_station_item) + + return channel_list + + def get_channel_stream(self, chandict): + channels_json = self.fhdhr.web.session.get(self.base_api).json() + origin_chandict = self.get_channel_dict(channels_json, "identifier", chandict["origin_id"]) + streamdict = self.get_channel_dict(origin_chandict["streams"], "StreamType", 'website') + streamurl = streamdict['Url'] + if self.fhdhr.config.dict["origin"]["force_best"]: + streamurl = self.m3u8_beststream(streamurl) + return streamurl + + def get_channel_dict(self, chanlist, keyfind, valfind): + return next(item for item in chanlist if item[keyfind] == valfind) + + def m3u8_beststream(self, m3u8_url): + bestStream = None + videoUrlM3u = m3u8.load(m3u8_url) + if not videoUrlM3u.is_variant: + return m3u8_url + + for videoStream in videoUrlM3u.playlists: + if not bestStream: + bestStream = videoStream + elif videoStream.stream_info.bandwidth > bestStream.stream_info.bandwidth: + bestStream = videoStream + + if not bestStream: + return bestStream.absolute_uri + else: + return m3u8_url diff --git a/fHDHR/origin/origin_epg.py b/fHDHR/origin/origin_epg.py new file mode 100644 index 0000000..525eb69 --- /dev/null +++ b/fHDHR/origin/origin_epg.py @@ -0,0 +1,11 @@ + + +class OriginEPG(): + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def update_epg(self, fhdhr_channels): + programguide = {} + + return programguide diff --git a/fHDHR/origin/origin_service.py b/fHDHR/origin/origin_service.py new file mode 100644 index 0000000..ca54ae7 --- /dev/null +++ b/fHDHR/origin/origin_service.py @@ -0,0 +1,12 @@ + + +class OriginService(): + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def get_status_dict(self): + ret_status_dict = { + "Login": "Success", + } + return ret_status_dict diff --git a/fHDHR/tools/__init__.py b/fHDHR/tools/__init__.py new file mode 100644 index 0000000..0295ad2 --- /dev/null +++ b/fHDHR/tools/__init__.py @@ -0,0 +1,136 @@ +import os +import re +import ast +import requests +import xml.etree.ElementTree + +UNARY_OPS = (ast.UAdd, ast.USub) +BINARY_OPS = (ast.Add, ast.Sub, ast.Mult, ast.Div, ast.Mod) + + +def is_docker(): + path = "/proc/self/cgroup" + if not os.path.isfile(path): + return False + with open(path) as f: + for line in f: + if re.match("\d+:[\w=]+:/docker(-[ce]e)?/\w+", line): + return True + return False + + +def sub_el(parent, sub_el_item_name, text=None, **kwargs): + el = xml.etree.ElementTree.SubElement(parent, sub_el_item_name, **kwargs) + if text: + el.text = text + return el + + +def xmldictmaker(inputdict, req_items, list_items=[], str_items=[]): + xml_dict = {} + + for origitem in list(inputdict.keys()): + xml_dict[origitem] = inputdict[origitem] + + for req_item in req_items: + if req_item not in list(inputdict.keys()): + xml_dict[req_item] = None + if not xml_dict[req_item]: + if req_item in list_items: + xml_dict[req_item] = [] + elif req_item in str_items: + xml_dict[req_item] = "" + + return xml_dict + + +def is_arithmetic(s): + def _is_arithmetic(node): + if isinstance(node, ast.Num): + return True + elif isinstance(node, ast.Expression): + return _is_arithmetic(node.body) + elif isinstance(node, ast.UnaryOp): + valid_op = isinstance(node.op, UNARY_OPS) + return valid_op and _is_arithmetic(node.operand) + elif isinstance(node, ast.BinOp): + valid_op = isinstance(node.op, BINARY_OPS) + return valid_op and _is_arithmetic(node.left) and _is_arithmetic(node.right) + else: + raise ValueError('Unsupported type {}'.format(node)) + + try: + return _is_arithmetic(ast.parse(s, mode='eval')) + except (SyntaxError, ValueError): + return False + + +def isint(x): + try: + a = float(x) + b = int(a) + except ValueError: + return False + else: + return a == b + + +def isfloat(x): + try: + float(x) + except ValueError: + return False + else: + return True + + +def hours_between_datetime(first_time, later_time): + timebetween = first_time - later_time + return (timebetween.total_seconds() / 60 / 60) + + +def humanized_filesize(size, decimal_places=2): + for unit in ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']: + if size < 1024.0 or unit == 'YiB': + break + size /= 1024.0 + return f"{size:.{decimal_places}f} {unit}" + + +def humanized_time(countdownseconds): + time = float(countdownseconds) + if time == 0: + return "just now" + year = time // (365 * 24 * 3600) + time = time % (365 * 24 * 3600) + day = time // (24 * 3600) + time = time % (24 * 3600) + time = time % (24 * 3600) + hour = time // 3600 + time %= 3600 + minute = time // 60 + time %= 60 + second = time + displaymsg = None + timearray = ['year', 'day', 'hour', 'minute', 'second'] + for x in timearray: + currenttimevar = eval(x) + if currenttimevar >= 1: + timetype = x + if currenttimevar > 1: + timetype = str(x+"s") + if displaymsg: + displaymsg = str(displaymsg + " " + str(int(currenttimevar)) + " " + timetype) + else: + displaymsg = str(str(int(currenttimevar)) + " " + timetype) + if not displaymsg: + return "just now" + return displaymsg + # just for ignoring a pep error + year, day, hour, minute, second + + +class WebReq(): + def __init__(self): + self.session = requests.Session() + self.exceptions = requests.exceptions diff --git a/garamond.ttf b/garamond.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0a059a401c7a1c92c18213281690c3eae37e4745 GIT binary patch literal 198604 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
VersionXMLTV LinkEPG LinkOptions
{{ epg_method_name }}{{ epg_method_name }}{{ epg_method_name }} +
+ + +
+
Fq4kP7hcq!Q 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