mirror of
https://github.com/jellyfin/jellyfin-mpv-shim.git
synced 2025-02-21 07:01:32 +00:00
Separate transcode sessions from regular sessions. Ensure transcode sessions are terminated properly.
This commit is contained in:
parent
d8fed05960
commit
8494ad7f60
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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",
|
||||
|
Loading…
x
Reference in New Issue
Block a user