use native kodi playback instead of setresolvedurl workaround

This commit is contained in:
Marcel van der Veldt 2015-03-28 17:42:38 +01:00
parent b440331f2f
commit db5e826f21
4 changed files with 169 additions and 11 deletions

View file

@ -59,9 +59,12 @@ class CreateFiles():
xbmcvfs.mkdir(itemPath) xbmcvfs.mkdir(itemPath)
text_file = open(strmFile, "w") text_file = open(strmFile, "w")
playUrl = "plugin://plugin.video.emby/?id=" + item["Id"] + '&mode=play' port = addon.getSetting('port')
host = addon.getSetting('ipaddress')
server = host + ":" + port
playurl = PlayUtils().getPlayUrl(server, item["Id"], item)
text_file.writelines(playUrl) text_file.writelines(playurl)
text_file.close() text_file.close()
#set timestamp on file - this will make sure that the dateadded field is properly set #set timestamp on file - this will make sure that the dateadded field is properly set
@ -116,7 +119,7 @@ class CreateFiles():
root = Element(rootelement) root = Element(rootelement)
SubElement(root, "id").text = item["Id"] SubElement(root, "id").text = item["Id"]
SubElement(root, "uniqueid").text = item["Id"] SubElement(root, "uniqueid").text = item["Id"]
if item.get("Tag") != None: if item.get("Tag") != None:
for tag in item.get("Tag"): for tag in item.get("Tag"):
SubElement(root, "tag").text = tag SubElement(root, "tag").text = tag
@ -149,7 +152,7 @@ class CreateFiles():
SubElement(root, "album").text = item["Album"] SubElement(root, "album").text = item["Album"]
if item.has_key("Artist"): if item.has_key("Artist"):
SubElement(root, "artist").text = item["Artist"][0] SubElement(root, "artist").text = utils.convertEncoding(item["Artist"][0])
if item.has_key("OfficialRating"): if item.has_key("OfficialRating"):
SubElement(root, "mpaa").text = item["OfficialRating"] SubElement(root, "mpaa").text = item["OfficialRating"]

View file

@ -10,6 +10,8 @@ import json
import Utils as utils import Utils as utils
from WriteKodiDB import WriteKodiDB from WriteKodiDB import WriteKodiDB
from ReadKodiDB import ReadKodiDB
from PlayUtils import PlayUtils
from DownloadUtils import DownloadUtils from DownloadUtils import DownloadUtils
class Kodi_Monitor(xbmc.Monitor): class Kodi_Monitor(xbmc.Monitor):
@ -26,6 +28,62 @@ class Kodi_Monitor(xbmc.Monitor):
port = addon.getSetting('port') port = addon.getSetting('port')
host = addon.getSetting('ipaddress') host = addon.getSetting('ipaddress')
server = host + ":" + port server = host + ":" + port
downloadUtils = DownloadUtils()
#player started playing an item -
if "Playlist.OnAdd" in method:
print "playlist onadd is called"
jsondata = json.loads(data)
if jsondata != None:
if jsondata.has_key("item"):
if jsondata.get("item").has_key("id") and jsondata.get("item").has_key("type"):
id = jsondata.get("item").get("id")
type = jsondata.get("item").get("type")
embyid = ReadKodiDB().getEmbyIdByKodiId(id,type)
if embyid != None:
WINDOW = xbmcgui.Window( 10000 )
userid = downloadUtils.getUserId()
jsonData = downloadUtils.downloadUrl("http://" + server + "/mediabrowser/Users/" + userid + "/Items/" + embyid + "?format=json&ImageTypeLimit=1", suppress=False, popup=1 )
result = json.loads(jsonData)
userData = result.get("UserData")
playurl = PlayUtils().getPlayUrl(server, embyid, result)
watchedurl = 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + embyid
positionurl = 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayingItems/' + embyid
deleteurl = 'http://' + server + '/mediabrowser/Items/' + embyid
# set the current playing info
WINDOW.setProperty(playurl+"watchedurl", watchedurl)
WINDOW.setProperty(playurl+"positionurl", positionurl)
WINDOW.setProperty(playurl+"deleteurl", "")
WINDOW.setProperty(playurl+"deleteurl", deleteurl)
if result.get("Type")=="Episode":
WINDOW.setProperty(playurl+"refresh_id", result.get("SeriesId"))
else:
WINDOW.setProperty(playurl+"refresh_id", embyid)
WINDOW.setProperty(playurl+"runtimeticks", str(result.get("RunTimeTicks")))
WINDOW.setProperty(playurl+"type", result.get("Type"))
WINDOW.setProperty(playurl+"item_id", embyid)
if PlayUtils().isDirectPlay(result) == True:
playMethod = "DirectPlay"
else:
playMethod = "Transcode"
WINDOW.setProperty(playurl+"playmethod", playMethod)
mediaSources = result.get("MediaSources")
if(mediaSources != None):
if mediaSources[0].get('DefaultAudioStreamIndex') != None:
WINDOW.setProperty(playurl+"AudioStreamIndex", str(mediaSources[0].get('DefaultAudioStreamIndex')))
if mediaSources[0].get('DefaultSubtitleStreamIndex') != None:
WINDOW.setProperty(playurl+"SubtitleStreamIndex", str(mediaSources[0].get('DefaultSubtitleStreamIndex')))
if method == "VideoLibrary.OnUpdate": if method == "VideoLibrary.OnUpdate":
jsondata = json.loads(data) jsondata = json.loads(data)

View file

@ -23,7 +23,7 @@ class ReadKodiDB():
def getKodiMovie(self, id): def getKodiMovie(self, id):
#returns a single movie from Kodi db selected on MB item ID #returns a single movie from Kodi db selected on MB item ID
xbmc.sleep(sleepVal) xbmc.sleep(sleepVal)
json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": { "filter": {"operator": "contains", "field": "path", "value": "' + id + '"}, "properties" : ["art", "rating", "thumbnail", "resume", "runtime", "year", "genre", "cast", "trailer", "country", "studio", "set", "imdbnumber", "mpaa", "tagline", "plotoutline","plot", "sorttitle", "director", "lastplayed", "writer", "playcount", "tag", "file"], "sort": { "order": "ascending", "method": "label", "ignorearticle": true } }, "id": "libMovies"}') json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": { "filter": {"operator": "contains", "field": "imdbnumber ", "value": "' + id + '"}, "properties" : ["art", "rating", "thumbnail", "resume", "runtime", "year", "genre", "cast", "trailer", "country", "studio", "set", "imdbnumber", "mpaa", "tagline", "plotoutline","plot", "sorttitle", "director", "lastplayed", "writer", "playcount", "tag", "file"], "sort": { "order": "ascending", "method": "label", "ignorearticle": true } }, "id": "libMovies"}')
jsonobject = json.loads(json_response.decode('utf-8','replace')) jsonobject = json.loads(json_response.decode('utf-8','replace'))
movie = None movie = None
@ -35,13 +35,43 @@ class ReadKodiDB():
return movie return movie
def getEmbyIdByKodiId(self, kodiid, type):
#returns the emby id by search on kodi id
xbmc.sleep(sleepVal)
embyId = None
if type == "movie":
json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovieDetails", "params": { "movieid": %d, "properties" : ["imdbnumber","file"] }, "id": "libMovies"}' %kodiid)
if type == "episode":
json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodeDetails", "params": {"episodeid": %d, "properties": ["file","uniqueid"]}, "id": 1}' %kodiid)
if json_response != None:
jsonobject = json.loads(json_response.decode('utf-8','replace'))
if(jsonobject.has_key('result')):
result = jsonobject['result']
resulttype = type + "details"
if(result.has_key(resulttype)):
item = result[resulttype]
if type == "movie":
if item.has_key('imdbnumber'):
embyId = item['imdbnumber']
if type == "episode":
if item.has_key('uniqueid'):
if item['uniqueid'].has_key('unknown'):
embyId = item["uniqueid"]["unknown"]
return embyId
def getKodiMovies(self,fullInfo = False): def getKodiMovies(self,fullInfo = False):
#returns all movies in Kodi db inserted by MB #returns all movies in Kodi db
xbmc.sleep(sleepVal) xbmc.sleep(sleepVal)
if fullInfo: if fullInfo:
json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": { "filter": {"operator": "contains", "field": "path", "value": "plugin.video.emby"}, "properties" : ["art", "rating", "thumbnail", "resume", "runtime", "year", "genre", "cast", "trailer", "country", "lastplayed", "studio", "set", "imdbnumber", "mpaa", "tagline", "plotoutline","plot", "sorttitle", "director", "writer", "playcount", "tag", "file"] }, "id": "libMovies"}') json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": { "properties" : ["art", "rating", "thumbnail", "resume", "runtime", "year", "genre", "cast", "trailer", "country", "lastplayed", "studio", "set", "imdbnumber", "mpaa", "tagline", "plotoutline","plot", "sorttitle", "director", "writer", "playcount", "tag", "file"] }, "id": "libMovies"}')
else: else:
json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": { "filter": {"operator": "contains", "field": "path", "value": "plugin.video.emby"}, "properties" : ["resume", "playcount", "lastplayed", "file"] }, "id": "libMovies"}') json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": { "properties" : ["resume", "playcount", "imdbnumber", "lastplayed", "file"] }, "id": "libMovies"}')
jsonobject = json.loads(json_response.decode('utf-8','replace')) jsonobject = json.loads(json_response.decode('utf-8','replace'))
movies = None movies = None
@ -54,7 +84,7 @@ class ReadKodiDB():
if(movies != None and len(movies) > 0): if(movies != None and len(movies) > 0):
kodiMovieMap = {} kodiMovieMap = {}
for kodimovie in movies: for kodimovie in movies:
key = kodimovie["file"][-37:-5] #extract the id from the file name key = kodimovie["imdbnumber"] #extract the id from the imdbnumber
kodiMovieMap[key] = kodimovie kodiMovieMap[key] = kodimovie
return kodiMovieMap return kodiMovieMap

View file

@ -13,6 +13,7 @@ import sqlite3
import os import os
from DownloadUtils import DownloadUtils from DownloadUtils import DownloadUtils
from PlayUtils import PlayUtils
from CreateFiles import CreateFiles from CreateFiles import CreateFiles
from ReadKodiDB import ReadKodiDB from ReadKodiDB import ReadKodiDB
from ReadEmbyDB import ReadEmbyDB from ReadEmbyDB import ReadEmbyDB
@ -95,7 +96,12 @@ class WriteKodiDB():
params = list() params = list()
self.getArtworkParam_Batched(KodiItem, MBitem, params) self.getArtworkParam_Batched(KodiItem, MBitem, params)
#set Filename
playurl = PlayUtils().getPlayUrl(server, MBitem["Id"], MBitem)
if playurl != KodiItem["file"]:
self.setKodiFilename(KodiItem["movieid"], playurl, "movie")
#update common properties #update common properties
duration = (int(timeInfo.get('Duration'))*60) duration = (int(timeInfo.get('Duration'))*60)
self.getPropertyParam_Batched(KodiItem, "runtime", duration, params) self.getPropertyParam_Batched(KodiItem, "runtime", duration, params)
@ -312,6 +318,10 @@ class WriteKodiDB():
#add actors #add actors
changes |= self.AddActorsToMedia(KodiItem,MBitem.get("People"),"movie") changes |= self.AddActorsToMedia(KodiItem,MBitem.get("People"),"movie")
#set Filename
playurl = PlayUtils().getPlayUrl(server, MBitem["Id"], MBitem)
self.setKodiFilename(KodiItem["movieid"], playurl, "movie")
CreateFiles().createSTRM(MBitem) CreateFiles().createSTRM(MBitem)
CreateFiles().createNFO(MBitem) CreateFiles().createNFO(MBitem)
@ -420,6 +430,10 @@ class WriteKodiDB():
#update/check all artwork #update/check all artwork
changes |= self.updateArtWork(KodiItem,MBitem) changes |= self.updateArtWork(KodiItem,MBitem)
#set Filename
playurl = PlayUtils().getPlayUrl(server, MBitem["Id"], MBitem)
if playurl != KodiItem["file"]:
self.setKodiFilename(KodiItem["episodeid"], playurl, "episode")
#update common properties #update common properties
duration = (int(timeInfo.get('Duration'))*60) duration = (int(timeInfo.get('Duration'))*60)
@ -443,7 +457,7 @@ class WriteKodiDB():
#add actors #add actors
changes |= self.AddActorsToMedia(KodiItem,MBitem.get("People"),"episode") changes |= self.AddActorsToMedia(KodiItem,MBitem.get("People"),"episode")
CreateFiles().createNFO(MBitem) CreateFiles().createNFO(MBitem)
CreateFiles().createSTRM(MBitem) CreateFiles().createSTRM(MBitem)
@ -868,6 +882,59 @@ class WriteKodiDB():
connection.commit() connection.commit()
cursor.close() cursor.close()
def setKodiFilename(self, id, filenameAndPath, fileType):
#use sqlite to set the filename in DB -- needed to avoid problems with resumepoints etc
#todo --> submit PR to kodi team to get this added to the jsonrpc api
print "set filepath for id " + str(id) + " - " + filenameAndPath
if "\\" in filenameAndPath:
filename = filenameAndPath.rsplit("\\",1)[-1]
path = filenameAndPath.replace(filename,"")
elif "/" in filenameAndPath:
filename = filenameAndPath.rsplit("/",1)[-1]
path = filenameAndPath.replace(filename,"")
else:
filename = filenameAndPath
path = None
utils.logMsg("MB3 Sync","setting filename in kodi db..." + fileType + ": " + str(id))
xbmc.sleep(sleepVal)
connection = utils.KodiSQL()
cursor = connection.cursor( )
if path != None:
cursor.execute("SELECT idPath as pathid FROM path WHERE strPath = ?",(path,))
result = cursor.fetchone()
if result != None:
pathid = result[0]
if result == None:
cursor.execute("select coalesce(max(idPath),0) as pathid from path")
pathid = cursor.fetchone()[0]
pathid = pathid + 1
pathsql="insert into path(idPath, strPath) values(?, ?)"
cursor.execute(pathsql, (pathid,path))
if fileType == "episode":
cursor.execute("SELECT idFile as fileidid FROM episode WHERE idEpisode = ?",(id,))
result = cursor.fetchone()
fileid = result[0]
if fileType == "movie":
cursor.execute("SELECT idFile as fileidid FROM movie WHERE idMovie = ?",(id,))
result = cursor.fetchone()
fileid = result[0]
cursor.execute("UPDATE files SET strFilename = ? WHERE idFile = ?", (filename,fileid))
cursor.execute("UPDATE files SET idPath = ? WHERE idFile = ?", (pathid,fileid))
connection.commit()
cursor.close()
def AddActorsToMedia(self, KodiItem, people, mediatype): def AddActorsToMedia(self, KodiItem, people, mediatype):
#use sqlite to set add the actors while json api doesn't support this yet #use sqlite to set add the actors while json api doesn't support this yet
#todo --> submit PR to kodi team to get this added to the jsonrpc api #todo --> submit PR to kodi team to get this added to the jsonrpc api