mirror of
https://github.com/jellyfin/jellyfin-kodi.git
synced 2024-11-10 04:06:11 +00:00
Revert "more optimizations to new playback code"
This reverts commit dcb7fd42fa
.
This commit is contained in:
parent
dcb7fd42fa
commit
74a869dff8
2 changed files with 36 additions and 60 deletions
|
@ -37,39 +37,32 @@ class PlayUtils():
|
||||||
'''
|
'''
|
||||||
New style to retrieve the best playback method based on sending the profile to the server
|
New style to retrieve the best playback method based on sending the profile to the server
|
||||||
Based on capabilities the correct path is returned, including livestreams that need to be opened by the server
|
Based on capabilities the correct path is returned, including livestreams that need to be opened by the server
|
||||||
|
TODO: Close livestream if needed (RequiresClosing in livestream source)
|
||||||
'''
|
'''
|
||||||
playurl = None
|
playurl = None
|
||||||
pbinfo = self.getPlaybackInfo()
|
pbinfo = self.getPlaybackInfo()
|
||||||
if pbinfo:
|
if pbinfo:
|
||||||
xbmc.log("getPlayUrl pbinfo: %s" %(pbinfo))#debug
|
xbmc.log("getPlayUrl pbinfo: %s" %(pbinfo))
|
||||||
|
|
||||||
if pbinfo["SupportsDirectPlay"]:
|
if pbinfo["Protocol"] == "SupportsDirectPlay":
|
||||||
playmethod = "DirectPlay"
|
playmethod = "DirectPlay"
|
||||||
playurl = pbinfo["Path"]
|
elif pbinfo["Protocol"] == "SupportsDirectStream":
|
||||||
|
|
||||||
elif pbinfo["SupportsDirectStream"]:
|
|
||||||
playmethod = "DirectStream"
|
playmethod = "DirectStream"
|
||||||
playurl = self.directStream()
|
elif pbinfo.get('LiveStreamId'):
|
||||||
|
playmethod = "LiveStream"
|
||||||
else:
|
else:
|
||||||
playmethod = "Transcode"
|
playmethod = "Transcode"
|
||||||
if pbinfo.get("TranscodingUrl"):
|
|
||||||
playurl = self.server + pbinfo["TranscodingUrl"]
|
|
||||||
else:
|
|
||||||
playurl = self.transcoding()
|
|
||||||
|
|
||||||
xbmc.log("getPlayUrl playmethod: %s - playurl: %s" %(playmethod, playurl))#debug
|
playurl = pbinfo["Path"]
|
||||||
|
xbmc.log("getPlayUrl playmethod: %s - playurl: %s" %(playmethod, playurl))
|
||||||
window('emby_%s.playmethod' % playurl, value=playmethod)
|
window('emby_%s.playmethod' % playurl, value=playmethod)
|
||||||
if pbinfo["RequiresClosing"] and pbinfo.get('LiveStreamId'):
|
if pbinfo["RequiresClosing"] and pbinfo.get('LiveStreamId'):
|
||||||
window('emby_%s.livestreamid' % playurl, value=pbinfo["LiveStreamId"])
|
window('emby_%s.livestreamid' % playurl, value=pbinfo["LiveStreamId"])
|
||||||
|
|
||||||
return playurl
|
return playurl
|
||||||
|
|
||||||
def getPlayUrl(self):
|
|
||||||
|
|
||||||
#TEMP !
|
def getPlayUrl(self):
|
||||||
if settings('experimentalPlayback') == "true":
|
|
||||||
return self.getPlayUrlNew()
|
|
||||||
|
|
||||||
playurl = None
|
playurl = None
|
||||||
|
|
||||||
|
@ -462,51 +455,37 @@ class PlayUtils():
|
||||||
"LiveStreamId": None
|
"LiveStreamId": None
|
||||||
}
|
}
|
||||||
pbinfo = self.doUtils(url, postBody=body, action_type="POST")
|
pbinfo = self.doUtils(url, postBody=body, action_type="POST")
|
||||||
xbmc.log("getPlaybackInfo: %s" %pbinfo)#debug
|
xbmc.log("getPlaybackInfo: %s" %pbinfo)
|
||||||
mediaSource = self.getOptimalMediaSource(pbinfo["MediaSources"])
|
mediaSource = self.getOptimalMediaSource(pbinfo["MediaSources"])
|
||||||
if mediaSource and mediaSource["RequiresOpening"]:
|
if mediaSource and mediaSource["RequiresOpening"]:
|
||||||
mediaSource = self.getLiveStream(pbinfo["PlaySessionId"], mediaSource)
|
mediaSource = self.getLiveStream(pbinfo["PlaySessionId"], mediaSource)
|
||||||
|
|
||||||
|
|
||||||
return mediaSource
|
return mediaSource
|
||||||
|
|
||||||
def getOptimalMediaSource(self, mediasources):
|
def getOptimalMediaSource(self, mediasources):
|
||||||
'''
|
'''
|
||||||
Select the best possible mediasource for playback
|
Select the best possible mediasource for playback
|
||||||
We select the best stream based on a score
|
Because we posted our deviceprofile to the server,
|
||||||
TODO: Incorporate user preferences for best stream selection
|
only streams will be returned that can actually be played by this client so no need to check bitrates etc.
|
||||||
'''
|
'''
|
||||||
|
preferredStreamOrder = ["SupportsDirectPlay","SupportsDirectStream","SupportsTranscoding"]
|
||||||
bestSource = {}
|
bestSource = {}
|
||||||
lastScore = 0
|
for prefstream in preferredStreamOrder:
|
||||||
for mediasource in mediasources:
|
for source in mediasources:
|
||||||
score = 0
|
if source[prefstream] == True:
|
||||||
#transform filepath to kodi compliant
|
if prefstream == "SupportsDirectPlay":
|
||||||
if mediasource["Protocol"] == "File":
|
#always prefer direct play
|
||||||
mediasource["Path"] = self.transformFilePath(mediasource["Path"])
|
alt_playurl = self.checkDirectPlayPath(source["Path"])
|
||||||
|
if alt_playurl:
|
||||||
#The bitrate and video dimension is an important quality argument so also base our score on that
|
bestSource = source
|
||||||
score += mediasource.get("Bitrate",0)
|
source["Path"] = alt_playurl
|
||||||
for stream in mediasource["MediaStreams"]:
|
elif bestSource.get("BitRate",0) < source.get("Bitrate",0):
|
||||||
if stream["Type"] == "Video" and stream.get("Width"):
|
#prefer stream with highest bitrate for http sources
|
||||||
#some streams report high bitrate but have no video width so stream with video width has highest score
|
bestSource = source
|
||||||
#this is especially true for videos in channels, like trailers
|
elif not source.get("Bitrate") and source.get("RequiresOpening"):
|
||||||
score += stream["Width"] * 10000
|
#livestream
|
||||||
|
bestSource = source
|
||||||
#directplay has the highest score
|
xbmc.log("getOptimalMediaSource: %s" %bestSource)
|
||||||
if mediasource["SupportsDirectPlay"] and self.supportsDirectPlay(mediasource):
|
|
||||||
score += 100000000
|
|
||||||
|
|
||||||
#directstream also scores well, the transcode option has no points as its a last resort
|
|
||||||
if mediasource["SupportsDirectStream"]:
|
|
||||||
score += 5000000
|
|
||||||
|
|
||||||
#TODO: If our user has any specific preferences we can alter the score
|
|
||||||
# For now we just select the highest quality as our prefered score
|
|
||||||
if score >= lastScore:
|
|
||||||
lastScore = score
|
|
||||||
bestSource = mediasource
|
|
||||||
|
|
||||||
xbmc.log("getOptimalMediaSource: %s" %bestSource)#debug
|
|
||||||
return bestSource
|
return bestSource
|
||||||
|
|
||||||
def getLiveStream(self, playSessionId, mediaSource):
|
def getLiveStream(self, playSessionId, mediaSource):
|
||||||
|
@ -522,12 +501,11 @@ class PlayUtils():
|
||||||
"SubtitleStreamIndex": None #TODO
|
"SubtitleStreamIndex": None #TODO
|
||||||
}
|
}
|
||||||
streaminfo = self.doUtils(url, postBody=body, action_type="POST")
|
streaminfo = self.doUtils(url, postBody=body, action_type="POST")
|
||||||
xbmc.log("getLiveStream: %s" %streaminfo)#debug
|
xbmc.log("getLiveStream: %s" %streaminfo)
|
||||||
streaminfo["MediaSource"]["SupportsDirectPlay"] = self.supportsDirectPlay(streaminfo["MediaSource"])
|
|
||||||
return streaminfo["MediaSource"]
|
return streaminfo["MediaSource"]
|
||||||
|
|
||||||
def transformFilePath(self, playurl):
|
def checkDirectPlayPath(self, playurl):
|
||||||
#Transform filepath to Kodi compatible path
|
|
||||||
if self.item.get('VideoType'):
|
if self.item.get('VideoType'):
|
||||||
# Specific format modification
|
# Specific format modification
|
||||||
if self.item['VideoType'] == "Dvd":
|
if self.item['VideoType'] == "Dvd":
|
||||||
|
@ -540,11 +518,10 @@ class PlayUtils():
|
||||||
playurl = playurl.replace("\\\\", "smb://")
|
playurl = playurl.replace("\\\\", "smb://")
|
||||||
playurl = playurl.replace("\\", "/")
|
playurl = playurl.replace("\\", "/")
|
||||||
|
|
||||||
|
if xbmcvfs.exists(playurl):
|
||||||
return playurl
|
return playurl
|
||||||
|
else:
|
||||||
def supportsDirectPlay(self, mediasource):
|
return None
|
||||||
#Figure out if the path can be directly played as the bool returned from the server response is not 100% reliable
|
|
||||||
return xbmcvfs.exists(mediasource["Path"])
|
|
||||||
|
|
||||||
def getDeviceProfile(self):
|
def getDeviceProfile(self):
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -81,6 +81,5 @@
|
||||||
<setting label="30535" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=deviceid)" />
|
<setting label="30535" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=deviceid)" />
|
||||||
<setting label="33093" type="folder" id="backupPath" option="writeable" />
|
<setting label="33093" type="folder" id="backupPath" option="writeable" />
|
||||||
<setting label="33092" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=backup)" visible="!eq(-1,)" option="close" />
|
<setting label="33092" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=backup)" visible="!eq(-1,)" option="close" />
|
||||||
<setting id="experimentalPlayback" type="bool" label="Enable new experimental playback" default="false" />
|
|
||||||
</category>
|
</category>
|
||||||
</settings>
|
</settings>
|
||||||
|
|
Loading…
Reference in a new issue