From 5c66f2594e2a548bd93f39d72bcafb4d41fd29fd Mon Sep 17 00:00:00 2001 From: deathbybadaid Date: Tue, 5 Jan 2021 11:06:14 -0500 Subject: [PATCH] Improve Tuner Grabbing and closing --- fHDHR/device/tuners/__init__.py | 2 +- fHDHR/device/tuners/tuner.py | 14 ++++++++------ fHDHR_web/__init__.py | 10 ++++++++++ fHDHR_web/api/tuners.py | 13 +++++++++---- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/fHDHR/device/tuners/__init__.py b/fHDHR/device/tuners/__init__.py index 86b651f..1b8cf94 100644 --- a/fHDHR/device/tuners/__init__.py +++ b/fHDHR/device/tuners/__init__.py @@ -53,7 +53,7 @@ class Tuners(): return tuner_number - def first_available(self, channel_number): + def first_available(self, channel_number, dograb=True): if not self.available_tuner_count(): raise TunerError("805 - All Tuners In Use") diff --git a/fHDHR/device/tuners/tuner.py b/fHDHR/device/tuners/tuner.py index d1aa593..87dc9da 100644 --- a/fHDHR/device/tuners/tuner.py +++ b/fHDHR/device/tuners/tuner.py @@ -21,8 +21,8 @@ class Tuner(): self.chanscan_url = "%s/api/channels?method=scan" % (self.fhdhr.api.base) self.close_url = "%s/api/tuners?method=close&tuner=%s" % (self.fhdhr.api.base, str(self.number)) - def channel_scan(self): - if self.tuner_lock.locked(): + def channel_scan(self, grabbed=False): + if self.tuner_lock.locked() and not grabbed: self.fhdhr.logger.error("Tuner #%s is not available." % str(self.number)) raise TunerError("804 - Tuner In Use") @@ -30,7 +30,8 @@ class Tuner(): self.fhdhr.logger.info("Channel Scan Already In Progress!") else: - self.tuner_lock.acquire() + if not grabbed: + self.tuner_lock.acquire() self.status["status"] = "Scanning" self.fhdhr.logger.info("Tuner #%s Performing Channel Scan." % str(self.number)) @@ -42,9 +43,10 @@ class Tuner(): chanscan.start() def runscan(self): - self.fhdhr.web.session.get(self.chanscan_url) + self.fhdhr.api.client.get(self.chanscan_url) self.fhdhr.logger.info("Requested Channel Scan Complete.") - self.fhdhr.web.session.get(self.close_url) + self.close() + self.fhdhr.api.client.get(self.close_url) def add_downloaded_size(self, bytes_count): if "downloaded" in list(self.status.keys()): @@ -63,7 +65,7 @@ class Tuner(): self.set_off_status() if self.tuner_lock.locked(): self.tuner_lock.release() - self.fhdhr.logger.info("Tuner #" + str(self.number) + " Released.") + self.fhdhr.logger.info("Tuner #" + str(self.number) + " Released.") def get_status(self): current_status = self.status.copy() diff --git a/fHDHR_web/__init__.py b/fHDHR_web/__init__.py index 9c31486..a63cb6b 100644 --- a/fHDHR_web/__init__.py +++ b/fHDHR_web/__init__.py @@ -77,9 +77,19 @@ class fHDHR_HTTP_Server(): session["deviceauth"] = self.detect_plexmediaserver(request) + session["tuner_used"] = None + self.fhdhr.logger.debug("Client %s requested %s Opening" % (request.method, request.path)) def after_request(self, response): + + # Close Tuner if it was in use, and did not close already + if session["tuner_used"] is not None: + tuner = self.fhdhr.device.tuners.tuners[str(session["tuner_used"])] + if tuner.tuner_lock.locked(): + self.fhdhr.logger.info("Shutting down Tuner #" + str(self.number) + " after Request.") + tuner.close() + self.fhdhr.logger.debug("Client %s requested %s Closing" % (request.method, request.path)) return response diff --git a/fHDHR_web/api/tuners.py b/fHDHR_web/api/tuners.py index 4a73d66..1c2cc70 100644 --- a/fHDHR_web/api/tuners.py +++ b/fHDHR_web/api/tuners.py @@ -1,4 +1,4 @@ -from flask import Response, request, redirect, abort, stream_with_context +from flask import Response, request, redirect, abort, stream_with_context, session import urllib.parse import uuid import json @@ -80,6 +80,7 @@ class Tuners(): 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: @@ -95,6 +96,7 @@ class Tuners(): self.fhdhr.logger.info("Tuner #" + str(tunernum) + " to be used for stream.") tuner.set_status(stream_args) + session["tuner_used"] = tunernum if stream_args["method"] == "direct": return Response(tuner.get_stream(stream_args, tuner), content_type=stream_args["content_type"], direct_passthrough=True) @@ -106,16 +108,19 @@ class Tuners(): if not tuner_number or str(tuner_number) not in list(self.fhdhr.device.tuners.tuners.keys()): return "%s Invalid tuner" % str(tuner_number) + session["tuner_used"] = 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() + tunernum = self.fhdhr.device.tuners.first_available(None) else: - tuner = self.fhdhr.device.tuners.tuners[str(tuner_number)] - tuner.channel_scan() + tunernum = self.fhdhr.device.tuners.tuner_grab(tuner_number, None) + tuner = self.fhdhr.device.tuners.tuners[str(tunernum)] + tuner.channel_scan(grabbed=True) elif method == "status":