From 27917cc8183a3db02db9b165b37a1c96135162db Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Sun, 29 Nov 2020 19:04:22 -0500 Subject: [PATCH] Further Channel Enhancements --- data/www/templates/channels.html | 14 +++++++++- fHDHR/device/channels/__init__.py | 6 +++++ fHDHR/device/channels/channel.py | 30 +++++++++++++++++++-- fHDHR/http/api/channels.py | 44 ++++++++++++++++++++++++++++++- fHDHR/http/api/lineup_post.py | 23 ++++++++++++++++ fHDHR/http/files/lineup_json.py | 8 +++++- fHDHR/http/files/lineup_xml.py | 16 ++++++----- 7 files changed, 130 insertions(+), 11 deletions(-) diff --git a/data/www/templates/channels.html b/data/www/templates/channels.html index 0997f84..5a49898 100644 --- a/data/www/templates/channels.html +++ b/data/www/templates/channels.html @@ -11,7 +11,8 @@ Channel CallSign Channel Number Channel Thumbnail - Status + Enabled + Favorite Update Reset @@ -41,6 +42,17 @@ {% endif %} + + + diff --git a/fHDHR/device/channels/__init__.py b/fHDHR/device/channels/__init__.py index bcfd6ce..261a420 100644 --- a/fHDHR/device/channels/__init__.py +++ b/fHDHR/device/channels/__init__.py @@ -33,6 +33,12 @@ class Channels(): def set_channel_status(self, keyfind, valfind, updatedict): self.get_channel_obj(keyfind, valfind).set_status(updatedict) + 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 [] diff --git a/fHDHR/device/channels/channel.py b/fHDHR/device/channels/channel.py index 5cc8a46..dfa8378 100644 --- a/fHDHR/device/channels/channel.py +++ b/fHDHR/device/channels/channel.py @@ -62,6 +62,10 @@ class Channel(): 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): @@ -71,8 +75,9 @@ class Channel(): "callsign": None, "origin_callsign": None, "number": None, "origin_number": None, "tags": [], "origin_tags": [], - "enabled": True, - "thumbnail": None, "origin_thumbnail": None + "thumbnail": None, "origin_thumbnail": None, + "enabled": True, "favorite": 0, + "HD": 0, } def destroy(self): @@ -95,6 +100,8 @@ class Channel(): '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): @@ -103,6 +110,25 @@ class Channel(): 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["fhdhr_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["fhdhr_id"], "info", self.dict) + def __getattr__(self, name): ''' will only get called for undefined attributes ''' if name in list(self.dict.keys()): diff --git a/fHDHR/http/api/channels.py b/fHDHR/http/api/channels.py index 4ab1a4f..6154b03 100644 --- a/fHDHR/http/api/channels.py +++ b/fHDHR/http/api/channels.py @@ -1,4 +1,4 @@ -from flask import request, redirect, Response +from flask import request, redirect, Response, abort import urllib.parse import json @@ -33,6 +33,46 @@ class Channels(): 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 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 + self.fhdhr.device.channels.set_channel_enablement("number", channel, method) + elif method == "update": channel_id = request.form.get('id', None) updatedict = {} @@ -49,6 +89,8 @@ class Channels(): 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": diff --git a/fHDHR/http/api/lineup_post.py b/fHDHR/http/api/lineup_post.py index a9cc62c..491a435 100644 --- a/fHDHR/http/api/lineup_post.py +++ b/fHDHR/http/api/lineup_post.py @@ -27,5 +27,28 @@ class Lineup_Post(): 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/files/lineup_json.py b/fHDHR/http/files/lineup_json.py index 7a4e3c4..aaf9187 100644 --- a/fHDHR/http/files/lineup_json.py +++ b/fHDHR/http/files/lineup_json.py @@ -16,12 +16,18 @@ class Lineup_JSON(): 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: + if channel_obj.enabled or show == "found": 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 jsonlineup.append(lineup_dict) lineup_json = json.dumps(jsonlineup, indent=4) diff --git a/fHDHR/http/files/lineup_xml.py b/fHDHR/http/files/lineup_xml.py index 8a8a687..695c6f2 100644 --- a/fHDHR/http/files/lineup_xml.py +++ b/fHDHR/http/files/lineup_xml.py @@ -19,17 +19,21 @@ class Lineup_XML(): 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: + 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"] - program_out = sub_el(out, 'Program') - sub_el(program_out, 'GuideNumber', lineup_dict['GuideNumber']) - sub_el(program_out, 'GuideName', lineup_dict['GuideName']) - sub_el(program_out, 'Tags', lineup_dict['Tags']) - sub_el(program_out, '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')