Revert "more optimizations to new playback code"

This reverts commit dcb7fd42fa.
This commit is contained in:
angelblue05 2016-09-29 14:36:26 -05:00
parent dcb7fd42fa
commit 74a869dff8
2 changed files with 36 additions and 60 deletions

View File

@ -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("\\", "/")
return playurl if xbmcvfs.exists(playurl):
return playurl
def supportsDirectPlay(self, mediasource): else:
#Figure out if the path can be directly played as the bool returned from the server response is not 100% reliable return None
return xbmcvfs.exists(mediasource["Path"])
def getDeviceProfile(self): def getDeviceProfile(self):
return { return {

View File

@ -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>