mirror of
https://github.com/jellyfin/jellyfin-kodi.git
synced 2024-12-24 17:56:11 +00:00
added musicvideo supporr
This commit is contained in:
parent
3d77a9dd3a
commit
96e50a3d1e
4 changed files with 209 additions and 13 deletions
|
@ -67,11 +67,17 @@ class LibrarySync():
|
||||||
self.MoviesFullSync(connection,cursor,pDialog)
|
self.MoviesFullSync(connection,cursor,pDialog)
|
||||||
|
|
||||||
if (self.ShouldStop()):
|
if (self.ShouldStop()):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
#sync Tvshows and episodes
|
#sync Tvshows and episodes
|
||||||
self.TvShowsFullSync(connection,cursor,pDialog)
|
self.TvShowsFullSync(connection,cursor,pDialog)
|
||||||
|
|
||||||
|
if (self.ShouldStop()):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# sync musicvideos
|
||||||
|
self.MusicVideosFullSync(connection,cursor,pDialog)
|
||||||
|
|
||||||
# set the install done setting
|
# set the install done setting
|
||||||
if(syncInstallRunDone == False and completed):
|
if(syncInstallRunDone == False and completed):
|
||||||
addon = xbmcaddon.Addon(id='plugin.video.emby') #force a new instance of the addon
|
addon = xbmcaddon.Addon(id='plugin.video.emby') #force a new instance of the addon
|
||||||
|
@ -143,7 +149,52 @@ class LibrarySync():
|
||||||
WINDOW.setProperty(kodiId,"deleted")
|
WINDOW.setProperty(kodiId,"deleted")
|
||||||
WriteKodiDB().deleteItemFromKodiLibrary(kodiId, connection, cursor)
|
WriteKodiDB().deleteItemFromKodiLibrary(kodiId, connection, cursor)
|
||||||
|
|
||||||
|
def MusicVideosFullSync(self,connection,cursor, pDialog):
|
||||||
|
|
||||||
|
allKodiMusicvideoIds = list()
|
||||||
|
allEmbyMusicvideoIds = list()
|
||||||
|
|
||||||
|
allEmbyMusicvideos = ReadEmbyDB().getMusicVideos()
|
||||||
|
allKodiMusicvideos = ReadKodiDB().getKodiMusicVideos(connection, cursor)
|
||||||
|
|
||||||
|
for kodivideo in allKodiMusicvideos:
|
||||||
|
allKodiMusicvideoIds.append(kodivideo[1])
|
||||||
|
|
||||||
|
total = len(allEmbyMusicvideos) + 1
|
||||||
|
count = 1
|
||||||
|
|
||||||
|
#### PROCESS ADDS AND UPDATES ###
|
||||||
|
for item in allEmbyMusicvideos:
|
||||||
|
|
||||||
|
if (self.ShouldStop()):
|
||||||
|
return False
|
||||||
|
|
||||||
|
if not item.get('IsFolder'):
|
||||||
|
allEmbyMusicvideoIds.append(item["Id"])
|
||||||
|
|
||||||
|
if(pDialog != None):
|
||||||
|
progressTitle = "Processing MusicVideos (" + str(count) + " of " + str(total) + ")"
|
||||||
|
pDialog.update(0, "Emby for Kodi - Running Sync", progressTitle)
|
||||||
|
count += 1
|
||||||
|
|
||||||
|
kodiVideo = None
|
||||||
|
for kodivideo in allKodiMusicvideos:
|
||||||
|
if kodivideo[1] == item["Id"]:
|
||||||
|
kodiVideo = kodivideo
|
||||||
|
|
||||||
|
if kodiVideo == None:
|
||||||
|
WriteKodiDB().addOrUpdateMusicVideoToKodiLibrary(item["Id"],connection, cursor)
|
||||||
|
else:
|
||||||
|
if kodiVideo[2] != API().getChecksum(item):
|
||||||
|
WriteKodiDB().addOrUpdateMusicVideoToKodiLibrary(item["Id"],connection, cursor)
|
||||||
|
|
||||||
|
#### PROCESS DELETES #####
|
||||||
|
allEmbyMusicvideoIds = set(allEmbyMusicvideoIds)
|
||||||
|
for kodiId in allKodiMusicvideoIds:
|
||||||
|
if not kodiId in allEmbyMusicvideoIds:
|
||||||
|
WINDOW.setProperty(kodiId,"deleted")
|
||||||
|
WriteKodiDB().deleteItemFromKodiLibrary(kodiId, connection, cursor)
|
||||||
|
|
||||||
def TvShowsFullSync(self,connection,cursor,pDialog):
|
def TvShowsFullSync(self,connection,cursor,pDialog):
|
||||||
|
|
||||||
views = ReadEmbyDB().getCollections("tvshows")
|
views = ReadEmbyDB().getCollections("tvshows")
|
||||||
|
@ -200,7 +251,6 @@ class LibrarySync():
|
||||||
if not kodiId in allEmbyTvShowIds:
|
if not kodiId in allEmbyTvShowIds:
|
||||||
WINDOW.setProperty(kodiId,"deleted")
|
WINDOW.setProperty(kodiId,"deleted")
|
||||||
WriteKodiDB().deleteItemFromKodiLibrary(kodiId, connection, cursor)
|
WriteKodiDB().deleteItemFromKodiLibrary(kodiId, connection, cursor)
|
||||||
|
|
||||||
|
|
||||||
def EpisodesFullSync(self,connection,cursor,showId):
|
def EpisodesFullSync(self,connection,cursor,showId):
|
||||||
|
|
||||||
|
@ -250,7 +300,6 @@ class LibrarySync():
|
||||||
WINDOW.setProperty(kodiId,"deleted")
|
WINDOW.setProperty(kodiId,"deleted")
|
||||||
WriteKodiDB().deleteItemFromKodiLibrary(kodiId, connection, cursor)
|
WriteKodiDB().deleteItemFromKodiLibrary(kodiId, connection, cursor)
|
||||||
|
|
||||||
|
|
||||||
def IncrementalSync(self, itemList):
|
def IncrementalSync(self, itemList):
|
||||||
#this will only perform sync for items received by the websocket
|
#this will only perform sync for items received by the websocket
|
||||||
addon = xbmcaddon.Addon(id='plugin.video.emby')
|
addon = xbmcaddon.Addon(id='plugin.video.emby')
|
||||||
|
@ -300,6 +349,13 @@ class LibrarySync():
|
||||||
|
|
||||||
if kodi_show_id:
|
if kodi_show_id:
|
||||||
WriteKodiDB().addOrUpdateEpisodeToKodiLibrary(MBitem["Id"], kodi_show_id, connection, cursor)
|
WriteKodiDB().addOrUpdateEpisodeToKodiLibrary(MBitem["Id"], kodi_show_id, connection, cursor)
|
||||||
|
|
||||||
|
#### PROCESS MUSICVIDEOS ####
|
||||||
|
allEmbyMusicvideos = ReadEmbyDB().getMusicVideos(itemList)
|
||||||
|
for item in allEmbyMusicvideos:
|
||||||
|
if not item.get('IsFolder'):
|
||||||
|
WriteKodiDB().addOrUpdateMusicVideoToKodiLibrary(item["Id"],connection, cursor)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
cursor.close()
|
cursor.close()
|
||||||
xbmc.executebuiltin("UpdateLibrary(video)")
|
xbmc.executebuiltin("UpdateLibrary(video)")
|
||||||
|
|
|
@ -40,7 +40,7 @@ class ReadEmbyDB():
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def getMusicVideos(self, id, itemList = []):
|
def getMusicVideos(self, itemList = []):
|
||||||
|
|
||||||
result = None
|
result = None
|
||||||
doUtils = DownloadUtils()
|
doUtils = DownloadUtils()
|
||||||
|
|
|
@ -24,7 +24,14 @@ class ReadKodiDB():
|
||||||
allmovies = cursor.fetchall()
|
allmovies = cursor.fetchall()
|
||||||
#this will return a list with tuples of all items returned from the database
|
#this will return a list with tuples of all items returned from the database
|
||||||
return allmovies
|
return allmovies
|
||||||
|
|
||||||
|
def getKodiMusicVideos(self, connection, cursor):
|
||||||
|
#returns all musicvideos in Kodi db
|
||||||
|
cursor.execute("SELECT kodi_id, emby_id, checksum FROM emby WHERE media_type='musicvideo'")
|
||||||
|
allvideos = cursor.fetchall()
|
||||||
|
#this will return a list with tuples of all items returned from the database
|
||||||
|
return allvideos
|
||||||
|
|
||||||
def getKodiTvShows(self, connection, cursor):
|
def getKodiTvShows(self, connection, cursor):
|
||||||
cursor.execute("SELECT kodi_id, emby_id, checksum FROM emby WHERE media_type='tvshow'")
|
cursor.execute("SELECT kodi_id, emby_id, checksum FROM emby WHERE media_type='tvshow'")
|
||||||
allshows = cursor.fetchall()
|
allshows = cursor.fetchall()
|
||||||
|
|
|
@ -203,6 +203,142 @@ class WriteKodiDB():
|
||||||
connection.commit()
|
connection.commit()
|
||||||
return movieid
|
return movieid
|
||||||
|
|
||||||
|
def addOrUpdateMusicVideoToKodiLibrary( self, embyId ,connection, cursor):
|
||||||
|
|
||||||
|
addon = xbmcaddon.Addon(id='plugin.video.emby')
|
||||||
|
WINDOW = xbmcgui.Window(10000)
|
||||||
|
username = WINDOW.getProperty('currUser')
|
||||||
|
userid = WINDOW.getProperty('userId%s' % username)
|
||||||
|
server = WINDOW.getProperty('server%s' % username)
|
||||||
|
downloadUtils = DownloadUtils()
|
||||||
|
|
||||||
|
MBitem = ReadEmbyDB().getFullItem(embyId)
|
||||||
|
|
||||||
|
# If the item already exist in the local Kodi DB we'll perform a full item update
|
||||||
|
# If the item doesn't exist, we'll add it to the database
|
||||||
|
|
||||||
|
cursor.execute("SELECT kodi_id FROM emby WHERE emby_id = ?",(MBitem["Id"],))
|
||||||
|
result = cursor.fetchone()
|
||||||
|
if result != None:
|
||||||
|
idMVideo = result[0]
|
||||||
|
else:
|
||||||
|
idMVideo = None
|
||||||
|
|
||||||
|
timeInfo = API().getTimeInfo(MBitem)
|
||||||
|
userData=API().getUserData(MBitem)
|
||||||
|
people = API().getPeople(MBitem)
|
||||||
|
|
||||||
|
#### The video details #########
|
||||||
|
runtime = int(timeInfo.get('Duration'))*60
|
||||||
|
plot = utils.convertEncoding(API().getOverview(MBitem))
|
||||||
|
title = utils.convertEncoding(MBitem["Name"])
|
||||||
|
year = MBitem.get("ProductionYear")
|
||||||
|
genres = MBitem.get("Genres")
|
||||||
|
genre = " / ".join(genres)
|
||||||
|
studios = API().getStudios(MBitem)
|
||||||
|
studio = " / ".join(studios)
|
||||||
|
director = " / ".join(people.get("Director"))
|
||||||
|
artist = MBitem.get("Artist")
|
||||||
|
album = MBitem.get("Album")
|
||||||
|
track = MBitem.get("Track")
|
||||||
|
|
||||||
|
if MBitem.get("DateCreated") != None:
|
||||||
|
dateadded = MBitem["DateCreated"].replace("T"," ")
|
||||||
|
dateadded = dateadded.replace(".0000000Z","")
|
||||||
|
else:
|
||||||
|
dateadded = None
|
||||||
|
|
||||||
|
playcount = 0
|
||||||
|
if userData.get("PlayCount") == "1":
|
||||||
|
playcount = 1
|
||||||
|
|
||||||
|
#### ADD OR UPDATE THE FILE AND PATH ###########
|
||||||
|
#### NOTE THAT LASTPLAYED AND PLAYCOUNT ARE STORED AT THE FILE ENTRY
|
||||||
|
path = "plugin://plugin.video.emby/musicvideos/"
|
||||||
|
filename = "plugin://plugin.video.emby/musicvideos/?id=%s&mode=play" % MBitem["Id"]
|
||||||
|
|
||||||
|
#create the path
|
||||||
|
cursor.execute("SELECT idPath as pathid FROM path WHERE strPath = ?",(path,))
|
||||||
|
result = cursor.fetchone()
|
||||||
|
if result != None:
|
||||||
|
pathid = result[0]
|
||||||
|
else:
|
||||||
|
cursor.execute("select coalesce(max(idPath),0) as pathid from path")
|
||||||
|
pathid = cursor.fetchone()[0]
|
||||||
|
pathid = pathid + 1
|
||||||
|
pathsql = "insert into path(idPath, strPath, strContent, strScraper, noUpdate) values(?, ?, ?, ?, ?)"
|
||||||
|
cursor.execute(pathsql, (pathid,path,"musicvideos","metadata.local",1))
|
||||||
|
|
||||||
|
#create the file if not exists
|
||||||
|
cursor.execute("SELECT idFile as fileid FROM files WHERE strFilename = ? and idPath = ?",(filename,pathid,))
|
||||||
|
result = cursor.fetchone()
|
||||||
|
if result != None:
|
||||||
|
fileid = result[0]
|
||||||
|
if result == None:
|
||||||
|
cursor.execute("select coalesce(max(idFile),0) as fileid from files")
|
||||||
|
fileid = cursor.fetchone()[0]
|
||||||
|
fileid = fileid + 1
|
||||||
|
pathsql="insert into files(idFile, idPath, strFilename, playCount, lastPlayed, dateAdded) values(?, ?, ?, ?, ?, ?)"
|
||||||
|
cursor.execute(pathsql, (fileid,pathid,filename,playcount,userData.get("LastPlayedDate"),dateadded))
|
||||||
|
else:
|
||||||
|
pathsql="update files SET playCount = ?, lastPlayed = ? WHERE idFile = ?"
|
||||||
|
cursor.execute(pathsql, (playcount,userData.get("LastPlayedDate"), fileid))
|
||||||
|
|
||||||
|
##### ADD THE VIDEO ############
|
||||||
|
if idMVideo == None:
|
||||||
|
|
||||||
|
utils.logMsg("ADD musicvideo to Kodi library","Id: %s - Title: %s" % (embyId, title))
|
||||||
|
|
||||||
|
#create the video
|
||||||
|
cursor.execute("select coalesce(max(idMVideo),0) as idMVideo from musicvideo")
|
||||||
|
idMVideo = cursor.fetchone()[0]
|
||||||
|
idMVideo = idMVideo + 1
|
||||||
|
pathsql="insert into musicvideo(idMVideo, idFile, c00, c04, c05, c06, c07, c08, c09, c10, c11, c12) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
||||||
|
cursor.execute(pathsql, (idMVideo, fileid, title, runtime, director, studio, year, plot, album, artist, genre, track))
|
||||||
|
|
||||||
|
#create the reference in emby table
|
||||||
|
pathsql = "INSERT into emby(emby_id, kodi_id, media_type, checksum) values(?, ?, ?, ?)"
|
||||||
|
cursor.execute(pathsql, (MBitem["Id"], idMVideo, "musicvideo", API().getChecksum(MBitem)))
|
||||||
|
|
||||||
|
#add streamdetails
|
||||||
|
self.AddStreamDetailsToMedia(API().getMediaStreams(MBitem), fileid, cursor)
|
||||||
|
|
||||||
|
#### UPDATE THE VIDEO #####
|
||||||
|
else:
|
||||||
|
utils.logMsg("UPDATE musicvideo to Kodi library","Id: %s - Title: %s" % (embyId, title))
|
||||||
|
pathsql="update musicvideo SET c00 = ?, c04 = ?, c05 = ?, c06 = ?, c07 = ?, c08 = ?, c09 = ?, c10 = ?, c11 = ?, c12 = ? WHERE idMVideo = ?"
|
||||||
|
cursor.execute(pathsql, (title, runtime, director, studio, year, plot, album, artist, genre, track, idMVideo))
|
||||||
|
|
||||||
|
#update the checksum in emby table
|
||||||
|
cursor.execute("UPDATE emby SET checksum = ? WHERE emby_id = ?", (API().getChecksum(MBitem),MBitem["Id"]))
|
||||||
|
|
||||||
|
#update or insert actors
|
||||||
|
self.AddPeopleToMedia(idMVideo,MBitem.get("People"),"musicvideo", connection, cursor)
|
||||||
|
|
||||||
|
#update artwork
|
||||||
|
self.addOrUpdateArt(API().getArtwork(MBitem, "Primary"), idMVideo, "musicvideo", "thumb", cursor)
|
||||||
|
self.addOrUpdateArt(API().getArtwork(MBitem, "Primary"), idMVideo, "musicvideo", "poster", cursor)
|
||||||
|
self.addOrUpdateArt(API().getArtwork(MBitem, "Banner"), idMVideo, "musicvideo", "banner", cursor)
|
||||||
|
self.addOrUpdateArt(API().getArtwork(MBitem, "Logo"), idMVideo, "musicvideo", "clearlogo", cursor)
|
||||||
|
self.addOrUpdateArt(API().getArtwork(MBitem, "Art"), idMVideo, "musicvideo", "clearart", cursor)
|
||||||
|
self.addOrUpdateArt(API().getArtwork(MBitem, "Thumb"), idMVideo, "musicvideo", "landscape", cursor)
|
||||||
|
self.addOrUpdateArt(API().getArtwork(MBitem, "Disc"), idMVideo, "musicvideo", "discart", cursor)
|
||||||
|
self.addOrUpdateArt(API().getArtwork(MBitem, "Backdrop"), idMVideo, "musicvideo", "fanart", cursor)
|
||||||
|
|
||||||
|
#update genres
|
||||||
|
self.AddGenresToMedia(idMVideo, genres, "musicvideo", cursor)
|
||||||
|
|
||||||
|
#update studios
|
||||||
|
self.AddStudiosToMedia(idMVideo, studios, "musicvideo", cursor)
|
||||||
|
|
||||||
|
#set resume point
|
||||||
|
resume = int(round(float(timeInfo.get("ResumeTime"))))*60
|
||||||
|
total = int(round(float(timeInfo.get("TotalTime"))))*60
|
||||||
|
self.setKodiResumePoint(fileid, resume, total, cursor)
|
||||||
|
|
||||||
|
#commit changes and return the id
|
||||||
|
connection.commit()
|
||||||
|
|
||||||
def addOrUpdateTvShowToKodiLibrary( self, embyId, connection, cursor, viewTag ):
|
def addOrUpdateTvShowToKodiLibrary( self, embyId, connection, cursor, viewTag ):
|
||||||
|
|
||||||
addon = xbmcaddon.Addon(id='plugin.video.emby')
|
addon = xbmcaddon.Addon(id='plugin.video.emby')
|
||||||
|
@ -739,9 +875,9 @@ class WriteKodiDB():
|
||||||
genre_id = genre_id + 1
|
genre_id = genre_id + 1
|
||||||
sql="insert into genre(genre_id, name) values(?, ?)"
|
sql="insert into genre(genre_id, name) values(?, ?)"
|
||||||
cursor.execute(sql, (genre_id,genre))
|
cursor.execute(sql, (genre_id,genre))
|
||||||
|
utils.logMsg("AddGenresToMedia", "Processing : " + genre)
|
||||||
|
|
||||||
#assign genre to item
|
#assign genre to item
|
||||||
utils.logMsg("AddGenresToMedia", "Processing : " + genre)
|
|
||||||
sql="INSERT OR REPLACE into genre_link(genre_id, media_id, media_type) values(?, ?, ?)"
|
sql="INSERT OR REPLACE into genre_link(genre_id, media_id, media_type) values(?, ?, ?)"
|
||||||
cursor.execute(sql, (genre_id, id, mediatype))
|
cursor.execute(sql, (genre_id, id, mediatype))
|
||||||
|
|
||||||
|
@ -760,7 +896,6 @@ class WriteKodiDB():
|
||||||
cursor.execute(sql, (idGenre,genre))
|
cursor.execute(sql, (idGenre,genre))
|
||||||
|
|
||||||
#assign genre to item
|
#assign genre to item
|
||||||
utils.logMsg("AddGenresToMedia", "Processing : " + genre)
|
|
||||||
if mediatype == "movie":
|
if mediatype == "movie":
|
||||||
sql="INSERT OR REPLACE into genrelinkmovie(idGenre, idMovie) values(?, ?)"
|
sql="INSERT OR REPLACE into genrelinkmovie(idGenre, idMovie) values(?, ?)"
|
||||||
if mediatype == "tvshow":
|
if mediatype == "tvshow":
|
||||||
|
@ -792,9 +927,9 @@ class WriteKodiDB():
|
||||||
studio_id = studio_id + 1
|
studio_id = studio_id + 1
|
||||||
sql="insert into studio(studio_id, name) values(?, ?)"
|
sql="insert into studio(studio_id, name) values(?, ?)"
|
||||||
cursor.execute(sql, (studio_id,studio))
|
cursor.execute(sql, (studio_id,studio))
|
||||||
|
utils.logMsg("AddstudiosToMedia", "Processing : " + studio)
|
||||||
|
|
||||||
#assign studio to item
|
#assign studio to item
|
||||||
utils.logMsg("AddstudiosToMedia", "Processing : " + studio)
|
|
||||||
sql="INSERT OR REPLACE into studio_link(studio_id, media_id, media_type) values(?, ?, ?)"
|
sql="INSERT OR REPLACE into studio_link(studio_id, media_id, media_type) values(?, ?, ?)"
|
||||||
cursor.execute(sql, (studio_id, id, mediatype))
|
cursor.execute(sql, (studio_id, id, mediatype))
|
||||||
|
|
||||||
|
@ -813,7 +948,6 @@ class WriteKodiDB():
|
||||||
cursor.execute(sql, (idstudio,studio))
|
cursor.execute(sql, (idstudio,studio))
|
||||||
|
|
||||||
#assign studio to item
|
#assign studio to item
|
||||||
utils.logMsg("AddstudiosToMedia", "Processing : " + studio)
|
|
||||||
if mediatype == "movie":
|
if mediatype == "movie":
|
||||||
sql="INSERT OR REPLACE into studiolinkmovie(idstudio, idMovie) values(?, ?)"
|
sql="INSERT OR REPLACE into studiolinkmovie(idstudio, idMovie) values(?, ?)"
|
||||||
if mediatype == "tvshow":
|
if mediatype == "tvshow":
|
||||||
|
@ -843,9 +977,9 @@ class WriteKodiDB():
|
||||||
tag_id = tag_id + 1
|
tag_id = tag_id + 1
|
||||||
sql="insert into tag(tag_id, name) values(?, ?)"
|
sql="insert into tag(tag_id, name) values(?, ?)"
|
||||||
cursor.execute(sql, (tag_id,tag))
|
cursor.execute(sql, (tag_id,tag))
|
||||||
|
utils.logMsg("AddTagToMedia", "Adding tag: " + tag)
|
||||||
|
|
||||||
#assign tag to item
|
#assign tag to item
|
||||||
utils.logMsg("AddTagToMedia", "Processing : " + tag)
|
|
||||||
sql="INSERT OR REPLACE into tag_link(tag_id, media_id, media_type) values(?, ?, ?)"
|
sql="INSERT OR REPLACE into tag_link(tag_id, media_id, media_type) values(?, ?, ?)"
|
||||||
cursor.execute(sql, (tag_id, id, mediatype))
|
cursor.execute(sql, (tag_id, id, mediatype))
|
||||||
|
|
||||||
|
@ -864,7 +998,6 @@ class WriteKodiDB():
|
||||||
cursor.execute(sql, (idTag,tag))
|
cursor.execute(sql, (idTag,tag))
|
||||||
|
|
||||||
#assign tag to item
|
#assign tag to item
|
||||||
utils.logMsg("AddTagToMedia", "Processing : " + tag)
|
|
||||||
sql="INSERT OR REPLACE into taglinks(idTag, idMedia, media_type) values(?, ?, ?)"
|
sql="INSERT OR REPLACE into taglinks(idTag, idMedia, media_type) values(?, ?, ?)"
|
||||||
cursor.execute(sql, (idTag, id, mediatype))
|
cursor.execute(sql, (idTag, id, mediatype))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue