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 @@
Note: This may take some time.
+| + | + | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ key }} | +{{ channels_dict[key] }} | +
| Play | 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 @@
|---|
| 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 @@ | Channel | Method | Time Active | +Total Downloaded | Options | {{ tuner_dict["channel_number"] }} | {{ tuner_dict["method"] }} | {{ tuner_dict["play_duration"] }} | +{{ tuner_dict["downloaded"] }} | {% else %}N/A | N/A | N/A | +N/A | {% endif %}
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:
|
|---|