diff --git a/data/www/templates/channels.html b/data/www/templates/channels.html index 5a49898..77a0ff7 100644 --- a/data/www/templates/channels.html +++ b/data/www/templates/channels.html @@ -4,6 +4,24 @@

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

+
+

Note: This may take some time.

+
+
+ + + + + + + + {% for key in list(channels_dict.keys()) %} + + + + + {% endfor %} +
{{ key }}{{ channels_dict[key] }}
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
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 %}
Channel 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/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/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/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..1f4213b 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, list=list) 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: