Separate transcode sessions from regular sessions. Ensure transcode sessions are terminated properly.

This commit is contained in:
Ian Walton 2020-01-06 04:07:35 -05:00
parent d8fed05960
commit 8494ad7f60
3 changed files with 29 additions and 14 deletions

View File

@ -10,7 +10,7 @@ except:
import xml.etree.ElementTree as et
from .conf import settings
from .utils import get_plex_url, safe_urlopen, is_local_domain, get_session, reset_session, sanitize_msg
from .utils import get_plex_url, safe_urlopen, is_local_domain, get_transcode_session, clear_transcode_session, sanitize_msg
log = logging.getLogger('media')
@ -216,7 +216,7 @@ class Video(object):
args = {
"hasMDE": "1",
"path": self.node.get("key"),
"session": get_session(self.parent.path.hostname),
"session": get_transcode_session(self.parent.path.hostname),
"protocol": "hls",
"directPlay": request_direct_play,
"directStream": "1",
@ -255,11 +255,21 @@ class Video(object):
log.error("Server reports that file cannot be streamed.")
return False
def terminate_transcode(self):
if get_transcode_session(self.parent.path.hostname, False):
if self.is_transcode:
url = "/video/:/transcode/universal/stop"
args = {
"session": get_transcode_session(self.parent.path.hostname),
}
safe_urlopen(urllib.parse.urljoin(self.parent.server_url, url), args)
clear_transcode_session(self.parent.path.hostname)
def get_playback_url(self, direct_play=None, offset=0, video_bitrate=None, force_transcode=False, force_bitrate=False):
"""
Returns the URL to use for the trancoded file.
"""
reset_session(self.parent.path.hostname)
self.terminate_transcode()
if self.trs_ovr:
video_bitrate, force_transcode, force_bitrate = self.trs_ovr
@ -283,7 +293,7 @@ class Video(object):
url = "/video/:/transcode/universal/start.m3u8"
args = {
"path": self.node.get("key"),
"session": get_session(self.parent.path.hostname),
"session": get_transcode_session(self.parent.path.hostname),
"protocol": "hls",
"directPlay": "0",
"directStream": "1",

View File

@ -213,6 +213,7 @@ class PlayerManager(object):
log.debug("PlayerManager::stop stopping playback of %s" % self._video)
self._video.terminate_transcode()
self._video = None
self._player.command("stop")
self._player.pause = False

View File

@ -15,6 +15,7 @@ PLEX_TOKEN_RE = re.compile("(token|X-Plex-Token)=[^&]*")
log = logging.getLogger("utils")
plex_eph_tokens = {}
plex_sessions = {}
plex_transcode_sessions = {}
class Timer(object):
def __init__(self):
@ -50,17 +51,24 @@ def synchronous(tlockname):
def upd_token(domain, token):
plex_eph_tokens[domain] = token
def get_transcode_session(domain, create=True):
if domain not in plex_transcode_sessions:
if not create:
return
session = str(uuid.uuid4())
plex_transcode_sessions[domain] = session
return plex_transcode_sessions[domain]
def clear_transcode_session(domain):
if domain in plex_transcode_sessions:
del plex_transcode_sessions[domain]
def get_session(domain):
if domain not in plex_sessions:
session = str(uuid.uuid4())
plex_sessions[domain] = session
return plex_sessions[domain]
def reset_session(domain):
session = str(uuid.uuid4())
plex_sessions[domain] = session
return session
def get_plex_url(url, data=None, quiet=False):
if not data:
data = {}
@ -78,11 +86,6 @@ def get_plex_url(url, data=None, quiet=False):
else:
log.error("get_plex_url No token for: %s" % domain)
if domain in plex_sessions:
data.update({
"X-Plex-Session-Identifier": plex_sessions[domain]
})
data.update({
"X-Plex-Version": "2.0",
"X-Plex-Client-Identifier": settings.client_uuid,
@ -90,6 +93,7 @@ def get_plex_url(url, data=None, quiet=False):
"X-Plex-Device-Name": settings.player_name,
"X-Plex-Model": "RaspberryPI",
"X-Plex-Device": "RaspberryPI",
"X-Plex-Session-Identifier": get_session(domain),
# Lies
"X-Plex-Product": "Plex MPV Shim",