From 8186e687b24e9bcef1fb96d553eb5600acab278f Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 30 Nov 2020 08:22:06 -0500 Subject: [PATCH 1/4] Move Channel Update Button to Channels Page --- data/www/templates/channels.html | 5 +++++ data/www/templates/origin.html | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data/www/templates/channels.html b/data/www/templates/channels.html index 5a49898..2102f25 100644 --- a/data/www/templates/channels.html +++ b/data/www/templates/channels.html @@ -4,6 +4,11 @@

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

+
+

Note: This may take some time.

+
+
+ diff --git a/data/www/templates/origin.html b/data/www/templates/origin.html index 1b55965..b64ccd4 100644 --- a/data/www/templates/origin.html +++ b/data/www/templates/origin.html @@ -4,11 +4,6 @@

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

-
- -
-
-
Play
From f45fdf7719952221a397031e81f9149804cb2648 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 30 Nov 2020 08:38:44 -0500 Subject: [PATCH 2/4] Improve Channel Update from Web Interface --- fHDHR/device/station_scan.py | 23 ++++++++++++++++------- fHDHR/http/api/channels.py | 2 +- fHDHR/http/api/lineup_post.py | 2 +- fHDHR/http/pages/channels_html.py | 9 ++++++++- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/fHDHR/device/station_scan.py b/fHDHR/device/station_scan.py index 3f9717d..69c7347 100644 --- a/fHDHR/device/station_scan.py +++ b/fHDHR/device/station_scan.py @@ -1,4 +1,5 @@ -from multiprocessing import Process +import multiprocessing +import threading class Station_Scan(): @@ -10,16 +11,24 @@ class Station_Scan(): self.fhdhr.db.delete_fhdhr_value("station_scan", "scanning") - def scan(self): + def scan(self, waitfordone=False): self.fhdhr.logger.info("Channel Scan Requested by Client.") scan_status = self.fhdhr.db.get_fhdhr_value("station_scan", "scanning") - if not scan_status: - self.fhdhr.db.set_fhdhr_value("station_scan", "scanning", 1) - chanscan = Process(target=self.runscan) - chanscan.start() - else: + if scan_status: self.fhdhr.logger.info("Channel Scan Already In Progress!") + else: + self.fhdhr.db.set_fhdhr_value("station_scan", "scanning", 1) + + if waitfordone: + self.runscan() + else: + 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.channels.get_channels(forceupdate=True) diff --git a/fHDHR/http/api/channels.py b/fHDHR/http/api/channels.py index 6154b03..9dc7a6e 100644 --- a/fHDHR/http/api/channels.py +++ b/fHDHR/http/api/channels.py @@ -94,7 +94,7 @@ class Channels(): self.fhdhr.device.channels.set_channel_status("id", channel_id, updatedict) elif method == "scan": - self.fhdhr.device.station_scan.scan() + self.fhdhr.device.station_scan.scan(waitfordone=True) else: return "Invalid Method" diff --git a/fHDHR/http/api/lineup_post.py b/fHDHR/http/api/lineup_post.py index 491a435..014c6cd 100644 --- a/fHDHR/http/api/lineup_post.py +++ b/fHDHR/http/api/lineup_post.py @@ -17,7 +17,7 @@ class Lineup_Post(): if 'scan' in list(request.args.keys()): if request.args['scan'] == 'start': - self.fhdhr.device.station_scan.scan() + self.fhdhr.device.station_scan.scan(waitfordone=False) return Response(status=200, mimetype='text/html') elif request.args['scan'] == 'abort': diff --git a/fHDHR/http/pages/channels_html.py b/fHDHR/http/pages/channels_html.py index 193b214..d610fca 100644 --- a/fHDHR/http/pages/channels_html.py +++ b/fHDHR/http/pages/channels_html.py @@ -13,11 +13,18 @@ class Channels_HTML(): 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) + return render_template('channels.html', request=request, fhdhr=self.fhdhr, channelslist=channelslist, channels_dict=channels_dict) From cd88725dd9f4e353a1aa029527ad9ec6110ebd2c Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 30 Nov 2020 08:49:25 -0500 Subject: [PATCH 3/4] Add Information to Channels Page --- data/www/templates/channels.html | 13 +++++++++++++ fHDHR/http/pages/channels_html.py | 6 +++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/data/www/templates/channels.html b/data/www/templates/channels.html index 2102f25..77a0ff7 100644 --- a/data/www/templates/channels.html +++ b/data/www/templates/channels.html @@ -9,6 +9,19 @@
+
+ + + + + + {% for key in list(channels_dict.keys()) %} + + + + + {% endfor %} +
{{ key }}{{ channels_dict[key] }}
diff --git a/fHDHR/http/pages/channels_html.py b/fHDHR/http/pages/channels_html.py index d610fca..1f4213b 100644 --- a/fHDHR/http/pages/channels_html.py +++ b/fHDHR/http/pages/channels_html.py @@ -15,7 +15,7 @@ class Channels_HTML(): channels_dict = { "Total Channels": len(list(self.fhdhr.device.channels.list.keys())), - "enabled": 0, + "Enabled": 0, } channelslist = [] @@ -25,6 +25,6 @@ class Channels_HTML(): channel_dict["play_url"] = channel_obj.play_url() channelslist.append(channel_dict) if channel_dict["enabled"]: - channels_dict["enabled"] += 1 + channels_dict["Enabled"] += 1 - return render_template('channels.html', request=request, fhdhr=self.fhdhr, channelslist=channelslist, channels_dict=channels_dict) + return render_template('channels.html', request=request, fhdhr=self.fhdhr, channelslist=channelslist, channels_dict=channels_dict, list=list) From c61df94ae4f68d38b8c65f7af7470c8a79d48a22 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 30 Nov 2020 10:56:14 -0500 Subject: [PATCH 4/4] Add Downloaded Size Parameter to Tuner Status --- data/www/templates/streams.html | 3 +++ fHDHR/device/tuners/stream/direct_stream.py | 5 +++++ fHDHR/device/tuners/stream/ffmpeg_stream.py | 9 ++++++--- fHDHR/device/tuners/stream/vlc_stream.py | 9 ++++++--- fHDHR/device/tuners/tuner.py | 5 +++++ fHDHR/http/pages/streams_html.py | 3 +++ fHDHR/tools/__init__.py | 8 ++++++++ 7 files changed, 36 insertions(+), 6 deletions(-) diff --git a/data/www/templates/streams.html b/data/www/templates/streams.html index ff80693..fc387a4 100644 --- a/data/www/templates/streams.html +++ b/data/www/templates/streams.html @@ -11,6 +11,7 @@ + @@ -22,10 +23,12 @@ + {% else %} + {% endif %}
PlayChannel Method Time ActiveTotal Downloaded Options
{{ tuner_dict["channel_number"] }} {{ tuner_dict["method"] }} {{ tuner_dict["play_duration"] }}{{ tuner_dict["downloaded"] }}N/A N/A N/AN/A
diff --git a/fHDHR/device/tuners/stream/direct_stream.py b/fHDHR/device/tuners/stream/direct_stream.py index 706baef..286b4aa 100644 --- a/fHDHR/device/tuners/stream/direct_stream.py +++ b/fHDHR/device/tuners/stream/direct_stream.py @@ -1,3 +1,4 @@ +import sys import time import m3u8 @@ -48,6 +49,8 @@ class Direct_Stream(): self.fhdhr.logger.info("Passing Through Chunk #%s with size %s" % (chunk_counter, self.chunksize)) yield chunk + chunk_size = int(sys.getsizeof(chunk)) + self.tuner.add_downloaded_size(chunk_size) chunk_counter += 1 @@ -123,6 +126,8 @@ class Direct_Stream(): self.fhdhr.logger.info("Passing Through Chunk: %s" % chunkurl) yield chunk + chunk_size = int(sys.getsizeof(chunk)) + self.tuner.add_downloaded_size(chunk_size) if playlist.target_duration: time.sleep(int(playlist.target_duration)) diff --git a/fHDHR/device/tuners/stream/ffmpeg_stream.py b/fHDHR/device/tuners/stream/ffmpeg_stream.py index 6550865..552a879 100644 --- a/fHDHR/device/tuners/stream/ffmpeg_stream.py +++ b/fHDHR/device/tuners/stream/ffmpeg_stream.py @@ -1,3 +1,4 @@ +import sys import subprocess # from fHDHR.exceptions import TunerError @@ -21,11 +22,13 @@ class FFMPEG_Stream(): try: while self.tuner.tuner_lock.locked(): - videoData = ffmpeg_proc.stdout.read(self.bytes_per_read) - if not videoData: + chunk = ffmpeg_proc.stdout.read(self.bytes_per_read) + if not chunk: break # raise TunerError("807 - No Video Data") - yield videoData + 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: diff --git a/fHDHR/device/tuners/stream/vlc_stream.py b/fHDHR/device/tuners/stream/vlc_stream.py index 78b6a9b..6f9ad1a 100644 --- a/fHDHR/device/tuners/stream/vlc_stream.py +++ b/fHDHR/device/tuners/stream/vlc_stream.py @@ -1,3 +1,4 @@ +import sys import subprocess # from fHDHR.exceptions import TunerError @@ -22,11 +23,13 @@ class VLC_Stream(): while self.tuner.tuner_lock.locked(): - videoData = vlc_proc.stdout.read(self.bytes_per_read) - if not videoData: + chunk = vlc_proc.stdout.read(self.bytes_per_read) + if not chunk: break # raise TunerError("807 - No Video Data") - yield videoData + 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: diff --git a/fHDHR/device/tuners/tuner.py b/fHDHR/device/tuners/tuner.py index f558edb..37f6409 100644 --- a/fHDHR/device/tuners/tuner.py +++ b/fHDHR/device/tuners/tuner.py @@ -17,6 +17,10 @@ class Tuner(): self.tuner_lock = threading.Lock() self.set_off_status() + def add_downloaded_size(self, bytes_count): + if "downloaded" in list(self.status.keys()): + self.status["downloaded"] += bytes_count + def grab(self): if self.tuner_lock.locked(): self.fhdhr.logger.error("Tuner #" + str(self.number) + " is not available.") @@ -56,4 +60,5 @@ class Tuner(): "channel": stream_args["channel"], "proxied_url": stream_args["channelUri"], "time_start": datetime.datetime.utcnow(), + "downloaded": 0 } diff --git a/fHDHR/http/pages/streams_html.py b/fHDHR/http/pages/streams_html.py index 292ba74..5edd00c 100644 --- a/fHDHR/http/pages/streams_html.py +++ b/fHDHR/http/pages/streams_html.py @@ -1,5 +1,7 @@ from flask import request, render_template +from fHDHR.tools import humanized_filesize + class Streams_HTML(): endpoints = ["/streams", "/streams.html"] @@ -24,6 +26,7 @@ class Streams_HTML(): 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"]) tuner_list.append(tuner_dict) diff --git a/fHDHR/tools/__init__.py b/fHDHR/tools/__init__.py index 33daf32..240b14b 100644 --- a/fHDHR/tools/__init__.py +++ b/fHDHR/tools/__init__.py @@ -89,6 +89,14 @@ def hours_between_datetime(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: