2015-03-17 19:02:42 +00:00
#################################################################################################
# WriteKodiDB
#################################################################################################
import xbmc
import xbmcgui
import xbmcaddon
import xbmcvfs
import json
import urllib
import sqlite3
import os
from DownloadUtils import DownloadUtils
2015-03-28 16:42:38 +00:00
from PlayUtils import PlayUtils
2015-03-17 19:02:42 +00:00
from CreateFiles import CreateFiles
2015-03-17 20:18:27 +00:00
from ReadKodiDB import ReadKodiDB
2015-03-20 15:58:46 +00:00
from ReadEmbyDB import ReadEmbyDB
2015-03-17 19:02:42 +00:00
from API import API
import Utils as utils
2015-03-25 17:37:21 +00:00
addon = xbmcaddon . Addon ( id = ' plugin.video.emby ' )
2015-03-17 19:02:42 +00:00
addondir = xbmc . translatePath ( addon . getAddonInfo ( ' profile ' ) )
dataPath = os . path . join ( addondir , " library " )
movieLibrary = os . path . join ( dataPath , ' movies ' )
tvLibrary = os . path . join ( dataPath , ' tvshows ' )
2015-03-21 13:31:30 +00:00
musicvideoLibrary = os . path . join ( dataPath , ' musicvideos ' )
2015-03-19 10:13:49 +00:00
sleepVal = 20
2015-03-17 19:02:42 +00:00
2015-03-18 02:45:15 +00:00
class WriteKodiDB ( ) :
def updatePlayCountFromKodi ( self , id , type , playcount = 0 ) :
#when user marks item watched from kodi interface update this in MB3
2015-03-19 10:13:49 +00:00
xbmc . sleep ( sleepVal )
2015-03-29 02:34:59 +00:00
utils . logMsg ( " MB3 Sync " , " updatePlayCountFromKodi Called " )
2015-03-17 19:02:42 +00:00
2015-03-29 02:34:59 +00:00
mb3Id = ReadKodiDB ( ) . getEmbyIdByKodiId ( id , type )
2015-03-17 19:02:42 +00:00
2015-03-18 02:45:15 +00:00
if ( mb3Id != None ) :
2015-03-25 17:37:21 +00:00
addon = xbmcaddon . Addon ( id = ' plugin.video.emby ' )
2015-03-18 02:45:15 +00:00
port = addon . getSetting ( ' port ' )
host = addon . getSetting ( ' ipaddress ' )
server = host + " : " + port
downloadUtils = DownloadUtils ( )
userid = downloadUtils . getUserId ( )
watchedurl = ' http:// ' + server + ' /mediabrowser/Users/ ' + userid + ' /PlayedItems/ ' + mb3Id
utils . logMsg ( " MB3 Sync " , " watchedurl --> " + watchedurl )
if playcount != 0 :
downloadUtils . downloadUrl ( watchedurl , postBody = " " , type = " POST " )
else :
downloadUtils . downloadUrl ( watchedurl , type = " DELETE " )
2015-03-17 19:02:42 +00:00
2015-03-20 23:33:04 +00:00
def updateMovieToKodiLibrary_Batched ( self , MBitem , KodiItem ) :
2015-03-25 17:37:21 +00:00
addon = xbmcaddon . Addon ( id = ' plugin.video.emby ' )
2015-03-20 23:33:04 +00:00
port = addon . getSetting ( ' port ' )
host = addon . getSetting ( ' ipaddress ' )
server = host + " : " + port
downloadUtils = DownloadUtils ( )
userid = downloadUtils . getUserId ( )
timeInfo = API ( ) . getTimeInfo ( MBitem )
userData = API ( ) . getUserData ( MBitem )
people = API ( ) . getPeople ( MBitem )
genre = API ( ) . getGenre ( MBitem )
studios = API ( ) . getStudios ( MBitem )
mediaStreams = API ( ) . getMediaStreams ( MBitem )
thumbPath = API ( ) . getArtwork ( MBitem , " Primary " )
params = list ( )
self . getArtworkParam_Batched ( KodiItem , MBitem , params )
2015-03-28 16:42:38 +00:00
#set Filename
playurl = PlayUtils ( ) . getPlayUrl ( server , MBitem [ " Id " ] , MBitem )
2015-03-31 21:21:51 +00:00
docleanup = self . setKodiFilename ( KodiItem [ " movieid " ] , KodiItem [ " file " ] , playurl , " movie " )
#if the path has been set directly in the DB, cleanup the locally created files to import the media-item into the Kodi DB to prevent Kodi from scanning it again.
if docleanup :
itemPath = os . path . join ( movieLibrary , MBitem [ " Id " ] )
utils . removeDirectory ( os . path . join ( movieLibrary , MBitem [ " Id " ] + os . sep ) )
2015-03-28 16:42:38 +00:00
2015-03-20 23:33:04 +00:00
#update common properties
duration = ( int ( timeInfo . get ( ' Duration ' ) ) * 60 )
self . getPropertyParam_Batched ( KodiItem , " runtime " , duration , params )
self . getPropertyParam_Batched ( KodiItem , " year " , MBitem . get ( " ProductionYear " ) , params )
self . getPropertyParam_Batched ( KodiItem , " mpaa " , MBitem . get ( " OfficialRating " ) , params )
2015-03-24 20:03:07 +00:00
self . getPropertyParam_Batched ( KodiItem , " lastplayed " , userData . get ( " LastPlayedDate " ) , params )
2015-03-20 23:33:04 +00:00
self . getPropertyParamArray_Batched ( KodiItem , " tag " , MBitem . get ( " Tag " ) , params )
if MBitem . get ( " CriticRating " ) != None :
self . getPropertyParam_Batched ( KodiItem , " rating " , int ( MBitem . get ( " CriticRating " ) ) / 10 , params )
self . getPropertyParam_Batched ( KodiItem , " plotoutline " , MBitem . get ( " ShortOverview " ) , params )
self . getPropertyParam_Batched ( KodiItem , " set " , MBitem . get ( " TmdbCollectionName " ) , params )
self . getPropertyParam_Batched ( KodiItem , " sorttitle " , MBitem . get ( " SortName " ) , params )
if MBitem . get ( " ProviderIds " ) != None :
if MBitem . get ( " ProviderIds " ) . get ( " Imdb " ) != None :
self . getPropertyParam_Batched ( KodiItem , " imdbnumber " , MBitem . get ( " ProviderIds " ) . get ( " Imdb " ) , params )
# FIXME --> Taglines not returned by MB3 server !?
if MBitem . get ( " TagLines " ) != None :
self . getPropertyParam_Batched ( KodiItem , " tagline " , MBitem . get ( " TagLines " ) [ 0 ] , params )
self . getPropertyParamArray_Batched ( KodiItem , " writer " , people . get ( " Writer " ) , params )
self . getPropertyParamArray_Batched ( KodiItem , " director " , people . get ( " Director " ) , params )
self . getPropertyParamArray_Batched ( KodiItem , " genre " , MBitem . get ( " Genres " ) , params )
if ( studios != None ) :
for x in range ( 0 , len ( studios ) ) :
studios [ x ] = studios [ x ] . replace ( " / " , " & " )
self . getPropertyParamArray_Batched ( KodiItem , " studio " , studios , params )
# FIXME --> ProductionLocations not returned by MB3 server !?
self . getPropertyParamArray_Batched ( KodiItem , " country " , MBitem . get ( " ProductionLocations " ) , params )
#trailer link
trailerUrl = None
if MBitem . get ( " LocalTrailerCount " ) != None and MBitem . get ( " LocalTrailerCount " ) > 0 :
itemTrailerUrl = " http:// " + server + " /mediabrowser/Users/ " + userid + " /Items/ " + MBitem . get ( " Id " ) + " /LocalTrailers?format=json "
2015-03-25 12:48:29 +00:00
jsonData = downloadUtils . downloadUrl ( itemTrailerUrl , suppress = False , popup = 0 )
2015-03-20 23:33:04 +00:00
if ( jsonData != " " ) :
trailerItem = json . loads ( jsonData )
2015-03-22 14:51:03 +00:00
if trailerItem [ 0 ] . get ( " LocationType " ) == " FileSystem " :
2015-03-25 17:37:21 +00:00
trailerUrl = " plugin://plugin.video.emby/?id= " + trailerItem [ 0 ] . get ( " Id " ) + ' &mode=play '
2015-03-22 14:51:03 +00:00
self . getPropertyParam_Batched ( KodiItem , " trailer " , trailerUrl , params )
2015-03-20 23:33:04 +00:00
changes = False
# if there were movies changes then send the update via JSONRPC
if ( len ( params ) > 0 ) :
changes | = True
2015-03-21 03:15:34 +00:00
utils . logMsg ( " UpdateMovieParams " , str ( params ) , level = 2 )
2015-03-20 23:33:04 +00:00
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMovieDetails " , " params " : { " movieid " : %i , %s }, " id " : 1 } '
paramString = " "
paramLen = len ( params )
for x in range ( 0 , paramLen ) :
param = params [ x ]
paramString + = param
if ( x < paramLen - 1 ) :
paramString + = " , "
jsoncommand = jsoncommand % ( KodiItem [ ' movieid ' ] , paramString )
2015-03-21 03:15:34 +00:00
utils . logMsg ( " executeJSONRPC : " , jsoncommand , level = 2 )
2015-03-20 23:33:04 +00:00
xbmc . sleep ( sleepVal )
2015-04-01 03:17:46 +00:00
result = xbmc . executeJSONRPC ( jsoncommand . encode ( " utf-8 " ) )
2015-03-20 23:33:04 +00:00
#add actors
changes | = self . AddActorsToMedia ( KodiItem , MBitem . get ( " People " ) , " movie " )
2015-03-25 09:59:23 +00:00
#add theme music
if addon . getSetting ( " syncThemeMusic " ) == " true " :
CreateFiles ( ) . copyThemeMusic ( MBitem )
2015-03-25 14:00:08 +00:00
#add extra fanart
if addon . getSetting ( " syncExtraFanart " ) == " true " :
CreateFiles ( ) . copyExtraFanart ( MBitem )
2015-03-25 09:59:23 +00:00
2015-03-20 23:33:04 +00:00
if ( changes ) :
utils . logMsg ( " Updated item to Kodi Library " , MBitem [ " Id " ] + " - " + MBitem [ " Name " ] , level = 0 )
2015-03-23 03:54:07 +00:00
return changes
2015-03-21 13:31:30 +00:00
def updateMusicVideoToKodiLibrary_Batched ( self , MBitem , KodiItem ) :
2015-03-25 17:37:21 +00:00
addon = xbmcaddon . Addon ( id = ' plugin.video.emby ' )
2015-03-21 13:31:30 +00:00
port = addon . getSetting ( ' port ' )
host = addon . getSetting ( ' ipaddress ' )
server = host + " : " + port
downloadUtils = DownloadUtils ( )
userid = downloadUtils . getUserId ( )
timeInfo = API ( ) . getTimeInfo ( MBitem )
userData = API ( ) . getUserData ( MBitem )
people = API ( ) . getPeople ( MBitem )
genre = API ( ) . getGenre ( MBitem )
studios = API ( ) . getStudios ( MBitem )
mediaStreams = API ( ) . getMediaStreams ( MBitem )
thumbPath = API ( ) . getArtwork ( MBitem , " Primary " )
2015-03-20 23:33:04 +00:00
2015-03-21 13:31:30 +00:00
params = list ( )
self . getArtworkParam_Batched ( KodiItem , MBitem , params )
#update common properties
duration = ( int ( timeInfo . get ( ' Duration ' ) ) * 60 )
self . getPropertyParam_Batched ( KodiItem , " runtime " , duration , params )
self . getPropertyParam_Batched ( KodiItem , " year " , MBitem . get ( " ProductionYear " ) , params )
self . getPropertyParamArray_Batched ( KodiItem , " director " , people . get ( " Director " ) , params )
self . getPropertyParamArray_Batched ( KodiItem , " genre " , MBitem . get ( " Genres " ) , params )
self . getPropertyParamArray_Batched ( KodiItem , " artist " , MBitem . get ( " Artist " ) , params )
self . getPropertyParamArray_Batched ( KodiItem , " album " , MBitem . get ( " Album " ) , params )
2015-03-24 20:03:07 +00:00
self . getPropertyParam_Batched ( KodiItem , " lastplayed " , userData . get ( " LastPlayedDate " ) , params )
2015-03-21 13:31:30 +00:00
if ( studios != None ) :
for x in range ( 0 , len ( studios ) ) :
studios [ x ] = studios [ x ] . replace ( " / " , " & " )
self . getPropertyParamArray_Batched ( KodiItem , " studio " , studios , params )
changes = False
# if there were movies changes then send the update via JSONRPC
if ( len ( params ) > 0 ) :
changes | = True
utils . logMsg ( " UpdateMovieParams " , str ( params ) , level = 2 )
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMusicVideoDetails " , " params " : { " musicvideoid " : %i , %s }, " id " : 1 } '
paramString = " "
paramLen = len ( params )
for x in range ( 0 , paramLen ) :
param = params [ x ]
paramString + = param
if ( x < paramLen - 1 ) :
paramString + = " , "
jsoncommand = jsoncommand % ( KodiItem [ ' musicvideoid ' ] , paramString )
utils . logMsg ( " executeJSONRPC : " , jsoncommand , level = 2 )
xbmc . sleep ( sleepVal )
2015-04-01 03:17:46 +00:00
result = xbmc . executeJSONRPC ( jsoncommand . encode ( " utf-8 " ) )
2015-03-21 13:31:30 +00:00
CreateFiles ( ) . createSTRM ( MBitem )
CreateFiles ( ) . createNFO ( MBitem )
if ( changes ) :
utils . logMsg ( " Updated musicvideo to Kodi Library " , MBitem [ " Id " ] + " - " + MBitem [ " Name " ] , level = 0 )
2015-03-20 23:33:04 +00:00
def updateMovieToKodiLibrary ( self , MBitem , KodiItem ) :
2015-03-17 19:02:42 +00:00
2015-03-25 17:37:21 +00:00
addon = xbmcaddon . Addon ( id = ' plugin.video.emby ' )
2015-03-17 19:02:42 +00:00
port = addon . getSetting ( ' port ' )
host = addon . getSetting ( ' ipaddress ' )
server = host + " : " + port
downloadUtils = DownloadUtils ( )
userid = downloadUtils . getUserId ( )
timeInfo = API ( ) . getTimeInfo ( MBitem )
userData = API ( ) . getUserData ( MBitem )
people = API ( ) . getPeople ( MBitem )
genre = API ( ) . getGenre ( MBitem )
studios = API ( ) . getStudios ( MBitem )
mediaStreams = API ( ) . getMediaStreams ( MBitem )
thumbPath = API ( ) . getArtwork ( MBitem , " Primary " )
changes = False
2015-03-20 11:39:26 +00:00
#update/check all artwork
changes | = self . updateArtWork ( KodiItem , MBitem )
2015-03-19 23:48:59 +00:00
2015-03-17 19:02:42 +00:00
#update common properties
duration = ( int ( timeInfo . get ( ' Duration ' ) ) * 60 )
2015-03-19 23:48:59 +00:00
changes | = self . updateProperty ( KodiItem , " runtime " , duration , " movie " )
changes | = self . updateProperty ( KodiItem , " year " , MBitem . get ( " ProductionYear " ) , " movie " )
changes | = self . updateProperty ( KodiItem , " mpaa " , MBitem . get ( " OfficialRating " ) , " movie " )
2015-03-24 20:03:07 +00:00
changes | = self . updateProperty ( KodiItem , " lastplayed " , MBitem . get ( " LastPlayedDate " ) , " movie " )
2015-03-19 23:48:59 +00:00
changes | = self . updatePropertyArray ( KodiItem , " tag " , MBitem . get ( " Tag " ) , " movie " )
2015-03-17 19:02:42 +00:00
if MBitem . get ( " CriticRating " ) != None :
2015-03-19 23:48:59 +00:00
changes | = self . updateProperty ( KodiItem , " rating " , int ( MBitem . get ( " CriticRating " ) ) / 10 , " movie " )
changes | = self . updateProperty ( KodiItem , " plotoutline " , MBitem . get ( " ShortOverview " ) , " movie " )
changes | = self . updateProperty ( KodiItem , " set " , MBitem . get ( " TmdbCollectionName " ) , " movie " )
changes | = self . updateProperty ( KodiItem , " sorttitle " , MBitem . get ( " SortName " ) , " movie " )
2015-03-17 19:02:42 +00:00
if MBitem . get ( " ProviderIds " ) != None :
if MBitem . get ( " ProviderIds " ) . get ( " Imdb " ) != None :
2015-03-19 23:48:59 +00:00
changes | = self . updateProperty ( KodiItem , " imdbnumber " , MBitem . get ( " ProviderIds " ) . get ( " Imdb " ) , " movie " )
2015-03-17 19:02:42 +00:00
# FIXME --> Taglines not returned by MB3 server !?
if MBitem . get ( " TagLines " ) != None :
2015-03-19 23:48:59 +00:00
changes | = self . updateProperty ( KodiItem , " tagline " , MBitem . get ( " TagLines " ) [ 0 ] , " movie " )
2015-03-18 05:05:21 +00:00
2015-03-19 23:48:59 +00:00
changes | = self . updatePropertyArray ( KodiItem , " writer " , people . get ( " Writer " ) , " movie " )
changes | = self . updatePropertyArray ( KodiItem , " director " , people . get ( " Director " ) , " movie " )
changes | = self . updatePropertyArray ( KodiItem , " genre " , MBitem . get ( " Genres " ) , " movie " )
2015-03-18 05:05:21 +00:00
if ( studios != None ) :
for x in range ( 0 , len ( studios ) ) :
studios [ x ] = studios [ x ] . replace ( " / " , " & " )
2015-03-19 23:48:59 +00:00
changes | = self . updatePropertyArray ( KodiItem , " studio " , studios , " movie " )
2015-03-18 05:05:21 +00:00
2015-03-17 19:02:42 +00:00
# FIXME --> ProductionLocations not returned by MB3 server !?
2015-03-19 23:48:59 +00:00
changes | = self . updatePropertyArray ( KodiItem , " country " , MBitem . get ( " ProductionLocations " ) , " movie " )
2015-03-17 19:02:42 +00:00
#trailer link
trailerUrl = None
if MBitem . get ( " LocalTrailerCount " ) != None and MBitem . get ( " LocalTrailerCount " ) > 0 :
itemTrailerUrl = " http:// " + server + " /mediabrowser/Users/ " + userid + " /Items/ " + MBitem . get ( " Id " ) + " /LocalTrailers?format=json "
2015-03-25 12:48:29 +00:00
jsonData = downloadUtils . downloadUrl ( itemTrailerUrl , suppress = False , popup = 0 )
2015-03-17 19:02:42 +00:00
if ( jsonData != " " ) :
trailerItem = json . loads ( jsonData )
2015-03-25 17:37:21 +00:00
trailerUrl = " plugin://plugin.video.emby/?id= " + trailerItem [ 0 ] . get ( " Id " ) + ' &mode=play '
2015-03-19 23:48:59 +00:00
changes | = self . updateProperty ( KodiItem , " trailer " , trailerUrl , " movie " )
2015-03-17 19:02:42 +00:00
#add actors
2015-03-19 23:48:59 +00:00
changes | = self . AddActorsToMedia ( KodiItem , MBitem . get ( " People " ) , " movie " )
2015-03-17 19:02:42 +00:00
2015-03-28 16:42:38 +00:00
#set Filename
playurl = PlayUtils ( ) . getPlayUrl ( server , MBitem [ " Id " ] , MBitem )
2015-03-29 16:20:02 +00:00
self . setKodiFilename ( KodiItem [ " movieid " ] , KodiItem [ " file " ] , playurl , " movie " )
2015-03-28 16:42:38 +00:00
2015-03-17 19:02:42 +00:00
2015-03-25 09:59:23 +00:00
#add theme music
if addon . getSetting ( " syncThemeMusic " ) == " true " :
CreateFiles ( ) . copyThemeMusic ( MBitem )
2015-03-25 14:00:08 +00:00
#add extra fanart
if addon . getSetting ( " syncExtraFanart " ) == " true " :
CreateFiles ( ) . copyExtraFanart ( MBitem )
2015-03-25 09:59:23 +00:00
2015-03-17 19:02:42 +00:00
if changes :
utils . logMsg ( " Updated item to Kodi Library " , MBitem [ " Id " ] + " - " + MBitem [ " Name " ] )
def updateTVShowToKodiLibrary ( self , MBitem , KodiItem ) :
2015-03-25 17:37:21 +00:00
addon = xbmcaddon . Addon ( id = ' plugin.video.emby ' )
2015-03-17 19:02:42 +00:00
port = addon . getSetting ( ' port ' )
host = addon . getSetting ( ' ipaddress ' )
server = host + " : " + port
downloadUtils = DownloadUtils ( )
timeInfo = API ( ) . getTimeInfo ( MBitem )
userData = API ( ) . getUserData ( MBitem )
people = API ( ) . getPeople ( MBitem )
genre = API ( ) . getGenre ( MBitem )
studios = API ( ) . getStudios ( MBitem )
mediaStreams = API ( ) . getMediaStreams ( MBitem )
thumbPath = API ( ) . getArtwork ( MBitem , " Primary " )
changes = False
2015-03-29 16:20:02 +00:00
#set Filename
playurl = PlayUtils ( ) . getPlayUrl ( server , MBitem [ " Id " ] , MBitem )
#make sure that the path always ends with a slash
playurl = playurl + " / "
2015-03-31 21:21:51 +00:00
docleanup = self . setKodiFilename ( KodiItem [ " tvshowid " ] , KodiItem [ " file " ] , playurl , " tvshow " )
#if the path has been set directly in the DB, cleanup the locally created nfo file to import the tvshow into the Kodi DB to prevent Kodi from scanning it again.
2015-03-31 21:28:05 +00:00
nfoPath = os . path . join ( tvLibrary , MBitem [ " Id " ] , " tvshow.nfo " )
if xbmcvfs . exists ( nfoPath ) :
2015-03-31 22:33:10 +00:00
xbmcvfs . delete ( nfoPath )
2015-03-29 16:20:02 +00:00
2015-03-20 11:39:26 +00:00
#update/check all artwork
changes | = self . updateArtWork ( KodiItem , MBitem )
2015-03-17 19:02:42 +00:00
#update common properties
if MBitem . get ( " PremiereDate " ) != None :
premieredatelist = ( MBitem . get ( " PremiereDate " ) ) . split ( " T " )
premieredate = premieredatelist [ 0 ]
2015-03-20 00:21:43 +00:00
changes | = self . updateProperty ( KodiItem , " premiered " , premieredate , " tvshow " )
2015-03-17 19:02:42 +00:00
2015-03-20 00:21:43 +00:00
changes | = self . updateProperty ( KodiItem , " mpaa " , MBitem . get ( " OfficialRating " ) , " tvshow " )
2015-03-24 20:03:07 +00:00
changes | = self . updateProperty ( KodiItem , " lastplayed " , MBitem . get ( " LastPlayedDate " ) , " tvshow " )
2015-03-17 19:02:42 +00:00
if MBitem . get ( " CriticRating " ) != None :
2015-03-20 00:21:43 +00:00
changes | = self . updateProperty ( KodiItem , " rating " , int ( MBitem . get ( " CriticRating " ) ) / 10 , " tvshow " )
2015-03-17 19:02:42 +00:00
2015-03-20 00:21:43 +00:00
changes | = self . updateProperty ( KodiItem , " sorttitle " , MBitem . get ( " SortName " ) , " tvshow " )
2015-03-17 19:02:42 +00:00
if MBitem . get ( " ProviderIds " ) != None :
if MBitem . get ( " ProviderIds " ) . get ( " Imdb " ) != None :
2015-03-20 00:21:43 +00:00
changes | = self . updateProperty ( KodiItem , " imdbnumber " , MBitem . get ( " ProviderIds " ) . get ( " Imdb " ) , " tvshow " )
2015-03-17 19:02:42 +00:00
2015-03-20 00:21:43 +00:00
changes | = self . updatePropertyArray ( KodiItem , " genre " , MBitem . get ( " Genres " ) , " tvshow " )
2015-03-18 05:05:21 +00:00
if ( studios != None ) :
for x in range ( 0 , len ( studios ) ) :
studios [ x ] = studios [ x ] . replace ( " / " , " & " )
2015-03-20 00:21:43 +00:00
changes | = self . updatePropertyArray ( KodiItem , " studio " , studios , " tvshow " )
2015-03-17 19:02:42 +00:00
# FIXME --> ProductionLocations not returned by MB3 server !?
2015-03-20 00:21:43 +00:00
changes | = self . updatePropertyArray ( KodiItem , " country " , MBitem . get ( " ProductionLocations " ) , " tvshow " )
2015-03-17 19:02:42 +00:00
#add actors
2015-03-20 00:21:43 +00:00
changes | = self . AddActorsToMedia ( KodiItem , MBitem . get ( " People " ) , " tvshow " )
2015-03-17 19:02:42 +00:00
2015-03-20 15:58:46 +00:00
#update season artwork
self . updateSeasonArtwork ( MBitem , KodiItem )
2015-03-31 22:33:10 +00:00
#CreateFiles().createNFO(MBitem)
2015-03-17 19:02:42 +00:00
2015-03-25 09:59:23 +00:00
#add theme music
if addon . getSetting ( " syncThemeMusic " ) == " true " :
CreateFiles ( ) . copyThemeMusic ( MBitem )
2015-03-25 14:00:08 +00:00
#add extra fanart
if addon . getSetting ( " syncExtraFanart " ) == " true " :
CreateFiles ( ) . copyExtraFanart ( MBitem )
2015-03-17 19:02:42 +00:00
if changes :
utils . logMsg ( " Updated item to Kodi Library " , MBitem [ " Id " ] + " - " + MBitem [ " Name " ] )
2015-03-23 03:54:07 +00:00
return changes
2015-03-20 11:39:26 +00:00
2015-03-19 08:44:25 +00:00
def updateEpisodeToKodiLibrary ( self , MBitem , KodiItem ) :
2015-03-17 19:02:42 +00:00
2015-03-25 17:37:21 +00:00
addon = xbmcaddon . Addon ( id = ' plugin.video.emby ' )
2015-03-17 19:02:42 +00:00
port = addon . getSetting ( ' port ' )
host = addon . getSetting ( ' ipaddress ' )
server = host + " : " + port
downloadUtils = DownloadUtils ( )
userid = downloadUtils . getUserId ( )
timeInfo = API ( ) . getTimeInfo ( MBitem )
people = API ( ) . getPeople ( MBitem )
genre = API ( ) . getGenre ( MBitem )
studios = API ( ) . getStudios ( MBitem )
mediaStreams = API ( ) . getMediaStreams ( MBitem )
userData = API ( ) . getUserData ( MBitem )
thumbPath = API ( ) . getArtwork ( MBitem , " Primary " )
changes = False
2015-03-20 11:39:26 +00:00
#update/check all artwork
changes | = self . updateArtWork ( KodiItem , MBitem )
2015-03-17 19:02:42 +00:00
2015-03-29 22:43:53 +00:00
#set Filename (also submit strmfilepath to rename that if path has changed to original location)
2015-03-28 16:42:38 +00:00
playurl = PlayUtils ( ) . getPlayUrl ( server , MBitem [ " Id " ] , MBitem )
2015-03-31 21:21:51 +00:00
docleanup = self . setKodiFilename ( KodiItem [ " episodeid " ] , KodiItem [ " file " ] , playurl , " episode " )
2015-03-17 19:02:42 +00:00
2015-03-31 21:21:51 +00:00
#if the path has been set directly in the DB, cleanup the locally created files to import the media-item into the Kodi DB to prevent Kodi from scanning it again.
if docleanup :
path = os . path . join ( tvLibrary , MBitem [ " SeriesId " ] + os . sep )
if xbmcvfs . exists ( path ) :
allDirs , allFiles = xbmcvfs . listdir ( path )
for file in allFiles :
if MBitem [ " Id " ] in file :
xbmcvfs . delete ( os . path . join ( path , file ) )
2015-03-17 19:02:42 +00:00
#update common properties
duration = ( int ( timeInfo . get ( ' Duration ' ) ) * 60 )
2015-03-20 00:21:43 +00:00
changes | = self . updateProperty ( KodiItem , " runtime " , duration , " episode " )
2015-03-24 20:03:07 +00:00
changes | = self . updateProperty ( KodiItem , " lastplayed " , userData . get ( " LastPlayedDate " ) , " episode " )
2015-03-17 19:02:42 +00:00
if MBitem . get ( " PremiereDate " ) != None :
premieredatelist = ( MBitem . get ( " PremiereDate " ) ) . split ( " T " )
premieredate = premieredatelist [ 0 ]
premieretime = premieredatelist [ 1 ] . split ( " . " ) [ 0 ]
firstaired = premieredate + " " + premieretime
# for Helix we use the whole time string, for kodi 15 we have to change to only the datestring
# see: http://forum.kodi.tv/showthread.php?tid=218743
if KodiItem [ " firstaired " ] != premieredate :
self . updateProperty ( KodiItem , " firstaired " , firstaired , " episode " )
if MBitem . get ( " CriticRating " ) != None :
2015-03-20 00:21:43 +00:00
changes | = self . updateProperty ( KodiItem , " rating " , int ( MBitem . get ( " CriticRating " ) ) / 10 , " episode " )
2015-03-17 19:02:42 +00:00
2015-03-20 00:21:43 +00:00
changes | = self . updatePropertyArray ( KodiItem , " writer " , people . get ( " Writer " ) , " episode " )
2015-03-17 19:02:42 +00:00
#add actors
2015-03-20 00:21:43 +00:00
changes | = self . AddActorsToMedia ( KodiItem , MBitem . get ( " People " ) , " episode " )
2015-03-17 19:02:42 +00:00
if changes :
utils . logMsg ( " Updated item to Kodi Library " , MBitem [ " Id " ] + " - " + MBitem [ " Name " ] )
2015-03-23 03:54:07 +00:00
return changes
2015-03-20 23:33:04 +00:00
def getArtworkParam_Batched ( self , KodiItem , MBitem , params ) :
'''
item_type = str ( MBitem . get ( " Type " ) )
if item_type == " Series " :
id = KodiItem [ ' tvshowid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetTVShowDetails " , " params " : { " tvshowid " : %i , " art " : %s }, " id " : 1 } '
elif item_type == " Episode " :
# episodes don't have any artwork - they derrive this from the tv show
return False
elif item_type == " MusicVideo " :
id = KodiItem [ ' musicvideoid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMusicVideoDetails " , " params " : { musicvideoid " : %i , " art " : %s }, " id " : 1 } '
elif item_type == " Movie " :
id = KodiItem [ ' movieid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMovieDetails " , " params " : { " movieid " : %i , " art " : %s }, " id " : 1 } '
'''
#update artwork
changes = False
artwork = { }
artwork [ " poster " ] = API ( ) . getArtwork ( MBitem , " Primary " )
artwork [ " banner " ] = API ( ) . getArtwork ( MBitem , " Banner " )
artwork [ " clearlogo " ] = API ( ) . getArtwork ( MBitem , " Logo " )
artwork [ " clearart " ] = API ( ) . getArtwork ( MBitem , " Art " )
artwork [ " landscape " ] = API ( ) . getArtwork ( MBitem , " Thumb " )
artwork [ " discart " ] = API ( ) . getArtwork ( MBitem , " Disc " )
artwork [ " fanart " ] = API ( ) . getArtwork ( MBitem , " Backdrop " )
for art in artwork :
if artwork . get ( art ) != " " :
if KodiItem [ " art " ] . has_key ( art ) :
curValue = urllib . unquote ( KodiItem [ ' art ' ] [ art ] ) . decode ( ' utf8 ' )
if not artwork . get ( art ) in curValue :
KodiItem [ " art " ] [ art ] = artwork . get ( art )
changes = True
else :
KodiItem [ " art " ] [ art ] = artwork . get ( art )
changes = True
if len ( KodiItem [ " art " ] ) == 0 :
changes = False
if changes :
json_array = json . dumps ( KodiItem [ " art " ] )
params . append ( " \" art \" : " + json_array )
#result = xbmc.executeJSONRPC(jsoncommand %(id, json_array))
return changes
2015-03-17 19:02:42 +00:00
# adds or updates artwork to the given Kodi file in database
2015-03-20 11:39:26 +00:00
def updateArtWork ( self , KodiItem , MBitem ) :
item_type = str ( MBitem . get ( " Type " ) )
if item_type == " Series " :
2015-03-17 19:02:42 +00:00
id = KodiItem [ ' tvshowid ' ]
2015-03-20 11:39:26 +00:00
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetTVShowDetails " , " params " : { " tvshowid " : %i , " art " : %s }, " id " : 1 } '
elif item_type == " Episode " :
2015-03-20 13:37:34 +00:00
# episodes don't have any artwork - they derrive this from the tv show
return False
2015-03-20 11:39:26 +00:00
elif item_type == " MusicVideo " :
2015-03-17 19:02:42 +00:00
id = KodiItem [ ' musicvideoid ' ]
2015-03-20 11:39:26 +00:00
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMusicVideoDetails " , " params " : { musicvideoid " : %i , " art " : %s }, " id " : 1 } '
elif item_type == " Movie " :
2015-03-17 19:02:42 +00:00
id = KodiItem [ ' movieid ' ]
2015-03-20 11:39:26 +00:00
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMovieDetails " , " params " : { " movieid " : %i , " art " : %s }, " id " : 1 } '
2015-03-20 11:53:02 +00:00
2015-03-20 11:39:26 +00:00
#update artwork
2015-03-17 19:02:42 +00:00
changes = False
2015-03-20 11:39:26 +00:00
artwork = { }
artwork [ " poster " ] = API ( ) . getArtwork ( MBitem , " Primary " )
2015-03-20 15:16:39 +00:00
artwork [ " banner " ] = API ( ) . getArtwork ( MBitem , " Banner " )
2015-03-20 11:39:26 +00:00
artwork [ " clearlogo " ] = API ( ) . getArtwork ( MBitem , " Logo " )
artwork [ " clearart " ] = API ( ) . getArtwork ( MBitem , " Art " )
artwork [ " landscape " ] = API ( ) . getArtwork ( MBitem , " Thumb " )
artwork [ " discart " ] = API ( ) . getArtwork ( MBitem , " Disc " )
artwork [ " fanart " ] = API ( ) . getArtwork ( MBitem , " Backdrop " )
for art in artwork :
2015-03-20 11:53:02 +00:00
if artwork . get ( art ) != " " :
2015-03-20 11:39:26 +00:00
if KodiItem [ " art " ] . has_key ( art ) :
2015-03-20 11:53:02 +00:00
curValue = urllib . unquote ( KodiItem [ ' art ' ] [ art ] ) . decode ( ' utf8 ' )
if not artwork . get ( art ) in curValue :
2015-03-20 11:39:26 +00:00
KodiItem [ " art " ] [ art ] = artwork . get ( art )
changes = True
else :
KodiItem [ " art " ] [ art ] = artwork . get ( art )
changes = True
if len ( KodiItem [ " art " ] ) == 0 :
changes = False
if changes :
json_array = json . dumps ( KodiItem [ " art " ] )
result = xbmc . executeJSONRPC ( jsoncommand % ( id , json_array ) )
2015-03-17 19:02:42 +00:00
return changes
2015-03-20 23:33:04 +00:00
def getPropertyParam_Batched ( self , KodiItem , propertyName , propertyValue , params , forced = False ) :
'''
if fileType == " tvshow " :
id = KodiItem [ ' tvshowid ' ]
jsoncommand_i = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetTVShowDetails " , " params " : { " tvshowid " : %i , " %s " : %i }, " id " : 1 } '
jsoncommand_s = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetTVShowDetails " , " params " : { " tvshowid " : %i , " %s " : " %s " }, " id " : 1 } '
elif fileType == " episode " :
id = KodiItem [ ' episodeid ' ]
jsoncommand_i = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetEpisodeDetails " , " params " : { " episodeid " : %i , " %s " : %i }, " id " : 1 } '
jsoncommand_s = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetEpisodeDetails " , " params " : { " episodeid " : %i , " %s " : " %s " }, " id " : 1 } '
elif fileType == " musicvideo " :
id = KodiItem [ ' musicvideoid ' ]
jsoncommand_i = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMusicVideoDetails " , " params " : { " musicvideoid " : %i , " %s " : %i }, " id " : 1 } '
jsoncommand_s = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMusicVideoDetails " , " params " : { " musicvideoid " : %i , " %s " : " %s " }, " id " : 1 } '
elif fileType == " movie " :
id = KodiItem [ ' movieid ' ]
jsoncommand_i = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMovieDetails " , " params " : { " movieid " : %i , " %s " : %i }, " id " : 1 } '
jsoncommand_s = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMovieDetails " , " params " : { " movieid " : %i , " %s " : " %s " }, " id " : 1 } '
'''
changes = False
if ( ( propertyValue != KodiItem [ propertyName ] ) or forced ) :
if propertyValue != None :
if type ( propertyValue ) is int :
#xbmc.sleep(sleepVal)
utils . logMsg ( " MB3 Sync " , " updating property... " + str ( propertyName ) )
utils . logMsg ( " MB3 Sync " , " kodi value: " + str ( KodiItem [ propertyName ] ) + " MB value: " + str ( propertyValue ) )
params . append ( " \" " + propertyName + " \" : " + str ( propertyValue ) )
#xbmc.executeJSONRPC(jsoncommand_i %(id, propertyName, propertyValue))
changes = True
else :
#xbmc.sleep(sleepVal)
utils . logMsg ( " MB3 Sync " , " updating property... " + str ( propertyName ) )
utils . logMsg ( " MB3 Sync " , " kodi value: " + KodiItem [ propertyName ] + " MB value: " + propertyValue )
2015-04-01 03:17:46 +00:00
params . append ( " \" " + propertyName + " \" : \" " + propertyValue + " \" " )
2015-03-20 23:33:04 +00:00
#xbmc.executeJSONRPC(jsoncommand_s %(id, propertyName, propertyValue.encode('utf-8')))
changes = True
return changes
2015-03-17 19:02:42 +00:00
# adds or updates the given property on the videofile in Kodi database
2015-03-19 23:24:29 +00:00
def updateProperty ( self , KodiItem , propertyName , propertyValue , fileType , forced = False ) :
2015-03-17 19:02:42 +00:00
if fileType == " tvshow " :
id = KodiItem [ ' tvshowid ' ]
jsoncommand_i = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetTVShowDetails " , " params " : { " tvshowid " : %i , " %s " : %i }, " id " : 1 } '
jsoncommand_s = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetTVShowDetails " , " params " : { " tvshowid " : %i , " %s " : " %s " }, " id " : 1 } '
elif fileType == " episode " :
id = KodiItem [ ' episodeid ' ]
jsoncommand_i = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetEpisodeDetails " , " params " : { " episodeid " : %i , " %s " : %i }, " id " : 1 } '
jsoncommand_s = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetEpisodeDetails " , " params " : { " episodeid " : %i , " %s " : " %s " }, " id " : 1 } '
elif fileType == " musicvideo " :
id = KodiItem [ ' musicvideoid ' ]
jsoncommand_i = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMusicVideoDetails " , " params " : { " musicvideoid " : %i , " %s " : %i }, " id " : 1 } '
jsoncommand_s = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMusicVideoDetails " , " params " : { " musicvideoid " : %i , " %s " : " %s " }, " id " : 1 } '
elif fileType == " movie " :
id = KodiItem [ ' movieid ' ]
jsoncommand_i = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMovieDetails " , " params " : { " movieid " : %i , " %s " : %i }, " id " : 1 } '
jsoncommand_s = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMovieDetails " , " params " : { " movieid " : %i , " %s " : " %s " }, " id " : 1 } '
changes = False
2015-03-19 23:24:29 +00:00
if ( ( propertyValue != KodiItem [ propertyName ] ) or forced ) :
2015-03-17 19:02:42 +00:00
if propertyValue != None :
if type ( propertyValue ) is int :
xbmc . sleep ( sleepVal )
utils . logMsg ( " MB3 Sync " , " updating property... " + str ( propertyName ) )
utils . logMsg ( " MB3 Sync " , " kodi value: " + str ( KodiItem [ propertyName ] ) + " MB value: " + str ( propertyValue ) )
xbmc . executeJSONRPC ( jsoncommand_i % ( id , propertyName , propertyValue ) )
changes = True
else :
xbmc . sleep ( sleepVal )
utils . logMsg ( " MB3 Sync " , " updating property... " + str ( propertyName ) )
utils . logMsg ( " MB3 Sync " , " kodi value: " + KodiItem [ propertyName ] + " MB value: " + propertyValue )
xbmc . executeJSONRPC ( jsoncommand_s % ( id , propertyName , propertyValue . encode ( ' utf-8 ' ) ) )
changes = True
return changes
2015-03-20 23:33:04 +00:00
def getPropertyParamArray_Batched ( self , KodiItem , propertyName , propertyCollection , params ) :
'''
if fileType == " tvshow " :
id = KodiItem [ ' tvshowid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetTVShowDetails " , " params " : { " tvshowid " : %i , " %s " : %s }, " id " : 1 } '
elif fileType == " episode " :
id = KodiItem [ ' episodeid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetEpisodeDetails " , " params " : { " episodeid " : %i , " %s " : %s }, " id " : 1 } '
elif fileType == " musicvideo " :
id = KodiItem [ ' musicvideoid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMusicVideoDetails " , " params " : { " musicvideoid " : %i , " %s " : %s }, " id " : 1 } '
elif fileType == " movie " :
id = KodiItem [ ' movieid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMovieDetails " , " params " : { " movieid " : %i , " %s " : %s }, " id " : 1 } '
'''
pendingChanges = False
if propertyCollection != None :
currentvalues = set ( KodiItem [ propertyName ] )
for item in propertyCollection :
if not item in currentvalues :
pendingChanges = True
json_array = json . dumps ( propertyCollection )
if pendingChanges :
#xbmc.sleep(sleepVal)
utils . logMsg ( " MB3 Sync " , " updating propertyarray... Name: " + str ( propertyName ) + " Current: " + str ( currentvalues ) + " New: " + str ( json_array ) )
params . append ( " \" " + propertyName + " \" : " + json_array )
#xbmc.executeJSONRPC(jsoncommand %(id,propertyName,json_array))
return pendingChanges
2015-03-17 19:02:42 +00:00
# adds or updates the property-array on the videofile in Kodi database
def updatePropertyArray ( self , KodiItem , propertyName , propertyCollection , fileType ) :
if fileType == " tvshow " :
id = KodiItem [ ' tvshowid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetTVShowDetails " , " params " : { " tvshowid " : %i , " %s " : %s }, " id " : 1 } '
elif fileType == " episode " :
id = KodiItem [ ' episodeid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetEpisodeDetails " , " params " : { " episodeid " : %i , " %s " : %s }, " id " : 1 } '
elif fileType == " musicvideo " :
id = KodiItem [ ' musicvideoid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMusicVideoDetails " , " params " : { " musicvideoid " : %i , " %s " : %s }, " id " : 1 } '
elif fileType == " movie " :
id = KodiItem [ ' movieid ' ]
jsoncommand = ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.SetMovieDetails " , " params " : { " movieid " : %i , " %s " : %s }, " id " : 1 } '
2015-03-18 05:05:21 +00:00
2015-03-17 19:02:42 +00:00
pendingChanges = False
2015-03-18 05:05:21 +00:00
if propertyCollection != None :
2015-03-17 19:02:42 +00:00
currentvalues = set ( KodiItem [ propertyName ] )
for item in propertyCollection :
if not item in currentvalues :
pendingChanges = True
json_array = json . dumps ( propertyCollection )
if pendingChanges :
xbmc . sleep ( sleepVal )
utils . logMsg ( " MB3 Sync " , " updating propertyarray... Name: " + str ( propertyName ) + " Current: " + str ( currentvalues ) + " New: " + str ( json_array ) )
xbmc . executeJSONRPC ( jsoncommand % ( id , propertyName , json_array ) )
return pendingChanges
def addMovieToKodiLibrary ( self , item ) :
itemPath = os . path . join ( movieLibrary , item [ " Id " ] )
strmFile = os . path . join ( itemPath , item [ " Id " ] + " .strm " )
changes = False
#create path if not exists
if not xbmcvfs . exists ( itemPath + os . sep ) :
xbmcvfs . mkdir ( itemPath )
#create nfo file
changes = CreateFiles ( ) . createNFO ( item )
# create strm file
2015-03-19 23:48:59 +00:00
changes | = CreateFiles ( ) . createSTRM ( item )
2015-03-17 19:02:42 +00:00
if changes :
utils . logMsg ( " MB3 Sync " , " Added movie to Kodi Library " , item [ " Id " ] + " - " + item [ " Name " ] )
2015-03-21 13:31:30 +00:00
def addMusicVideoToKodiLibrary ( self , item ) :
itemPath = os . path . join ( musicvideoLibrary , item [ " Id " ] )
strmFile = os . path . join ( itemPath , item [ " Id " ] + " .strm " )
changes = False
#create path if not exists
if not xbmcvfs . exists ( itemPath + os . sep ) :
xbmcvfs . mkdir ( itemPath )
#create nfo file
changes = CreateFiles ( ) . createNFO ( item )
# create strm file
changes | = CreateFiles ( ) . createSTRM ( item )
if changes :
utils . logMsg ( " MB3 Sync " , " Added musicvideo to Kodi Library " , item [ " Id " ] + " - " + item [ " Name " ] )
2015-03-19 08:44:25 +00:00
def addEpisodeToKodiLibrary ( self , item ) :
2015-03-17 19:02:42 +00:00
changes = False
#create nfo file
2015-03-19 08:44:25 +00:00
changes = CreateFiles ( ) . createNFO ( item )
2015-03-17 19:02:42 +00:00
# create strm file
2015-03-19 23:48:59 +00:00
changes | = CreateFiles ( ) . createSTRM ( item )
2015-03-17 19:02:42 +00:00
if changes :
utils . logMsg ( " MB3 Sync " , " Added episode to Kodi Library " , item [ " Id " ] + " - " + item [ " Name " ] )
def deleteMovieFromKodiLibrary ( self , id ) :
kodiItem = ReadKodiDB ( ) . getKodiMovie ( id )
utils . logMsg ( " deleting movie from Kodi library " , id )
if kodiItem != None :
xbmc . executeJSONRPC ( ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.RemoveMovie " , " params " : { " movieid " : %i }, " id " : 1 } ' % ( kodiItem [ " movieid " ] ) )
2015-03-31 21:21:51 +00:00
path = os . path . join ( movieLibrary , id + os . sep )
utils . removeDirectory ( path )
2015-03-21 13:31:30 +00:00
def deleteMusicVideoFromKodiLibrary ( self , id ) :
utils . logMsg ( " deleting musicvideo from Kodi library " , id )
kodiItem = ReadKodiDB ( ) . getKodiMusicVideo ( id )
if kodiItem != None :
xbmc . executeJSONRPC ( ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.RemoveMusicVideo " , " params " : { " musicvideoid " : %i }, " id " : 1 } ' % ( kodiItem [ " musicvideoid " ] ) )
2015-03-21 10:32:21 +00:00
2015-03-21 13:31:30 +00:00
path = os . path . join ( musicvideoLibrary , id )
allDirs , allFiles = xbmcvfs . listdir ( path )
for dir in allDirs :
xbmcvfs . rmdir ( os . path . join ( path , dir ) )
for file in allFiles :
xbmcvfs . delete ( os . path . join ( path , file ) )
xbmcvfs . rmdir ( path )
2015-03-21 11:33:59 +00:00
def deleteEpisodeFromKodiLibrary ( self , episodeid , tvshowid ) :
2015-03-20 19:29:50 +00:00
utils . logMsg ( " deleting episode from Kodi library " , episodeid )
2015-03-21 11:33:59 +00:00
episode = ReadKodiDB ( ) . getKodiEpisodeByMbItem ( episodeid , tvshowid )
if episode != None :
2015-03-28 16:14:52 +00:00
WINDOW = xbmcgui . Window ( 10000 )
WINDOW . setProperty ( " suspendDeletes " , " True " )
2015-03-21 11:33:59 +00:00
xbmc . executeJSONRPC ( ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.RemoveEpisode " , " params " : { " episodeid " : %i }, " id " : 1 } ' % ( episode [ " episodeid " ] ) )
2015-03-29 21:37:02 +00:00
itemPath = os . path . join ( tvLibrary , tvshowid )
allDirs , allFiles = xbmcvfs . listdir ( itemPath )
for file in allFiles :
if episodeid in file :
xbmcvfs . delete ( file )
2015-03-28 16:14:52 +00:00
while WINDOW . getProperty ( " suspendDeletes " ) == " True " :
xbmc . sleep ( 100 )
2015-03-29 20:13:11 +00:00
utils . logMsg ( " episode deleted succesfully! " , episodeid )
else :
2015-03-29 22:43:53 +00:00
utils . logMsg ( " episode not found in kodi DB " , episodeid )
2015-03-29 20:13:11 +00:00
2015-03-17 19:02:42 +00:00
def addTVShowToKodiLibrary ( self , item ) :
itemPath = os . path . join ( tvLibrary , item [ " Id " ] )
changes = False
#create path if not exists
if not xbmcvfs . exists ( itemPath + os . sep ) :
xbmcvfs . mkdir ( itemPath )
#create nfo file
changes = CreateFiles ( ) . createNFO ( item )
if changes :
utils . logMsg ( " Added TV Show to Kodi Library " , item [ " Id " ] + " - " + item [ " Name " ] )
def deleteTVShowFromKodiLibrary ( self , id ) :
2015-03-19 10:13:49 +00:00
xbmc . sleep ( sleepVal )
2015-03-17 19:02:42 +00:00
kodiItem = ReadKodiDB ( ) . getKodiTVShow ( id )
utils . logMsg ( " deleting tvshow from Kodi library " , id )
2015-03-21 10:32:21 +00:00
2015-03-17 19:02:42 +00:00
if kodiItem != None :
xbmc . executeJSONRPC ( ' { " jsonrpc " : " 2.0 " , " method " : " VideoLibrary.RemoveTVShow " , " params " : { " tvshowid " : %i }, " id " : 1 } ' % ( kodiItem [ " tvshowid " ] ) )
2015-03-21 10:32:21 +00:00
2015-03-31 21:21:51 +00:00
path = os . path . join ( tvLibrary , id + os . sep )
utils . removeDirectory ( path )
2015-03-20 15:16:39 +00:00
2015-03-20 15:58:46 +00:00
def updateSeasonArtwork ( self , MBitem , KodiItem ) :
#use sqlite to set the season artwork because no method in API available for this
#season poster and banner are set by the nfo. landscape image is filled by this method
#if wanted this feature can be extended to also update the other artwork
tvshowid = KodiItem [ " tvshowid " ]
2015-03-26 21:35:11 +00:00
connection = utils . KodiSQL ( )
2015-03-20 15:58:46 +00:00
cursor = connection . cursor ( )
2015-03-20 15:16:39 +00:00
2015-03-20 15:58:46 +00:00
seasonData = ReadEmbyDB ( ) . getTVShowSeasons ( MBitem [ " Id " ] )
if seasonData != None :
for season in seasonData :
if season . has_key ( " IndexNumber " ) :
MB3landscape = API ( ) . getArtwork ( season , " Thumb " )
if MB3landscape != " " :
cursor . execute ( " SELECT idSeason as seasonid FROM seasons WHERE idShow = ? and season = ? " , ( tvshowid , season [ " IndexNumber " ] ) )
result = cursor . fetchone ( )
if result != None :
seasonid = result [ 0 ]
cursor . execute ( " SELECT art_id as art_id FROM art WHERE media_id = ? and media_type = ? and type = ? " , ( seasonid , " season " , " landscape " ) )
result = cursor . fetchone ( )
if result == None :
sql = " INSERT into art(media_id, media_type, type, url) values(?, ?, ?, ?) "
cursor . execute ( sql , ( seasonid , " season " , " landscape " , MB3landscape ) )
connection . commit ( )
2015-03-21 13:31:30 +00:00
cursor . close ( )
2015-03-20 15:16:39 +00:00
2015-03-17 19:02:42 +00:00
def setKodiResumePoint ( self , id , resume_seconds , total_seconds , fileType ) :
#use sqlite to set the resume point while json api doesn't support this yet
#todo --> submit PR to kodi team to get this added to the jsonrpc api
utils . logMsg ( " MB3 Sync " , " setting resume point in kodi db... " + fileType + " : " + str ( id ) )
2015-03-19 10:13:49 +00:00
xbmc . sleep ( sleepVal )
2015-03-26 21:35:11 +00:00
connection = utils . KodiSQL ( )
2015-03-17 19:02:42 +00:00
cursor = connection . cursor ( )
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 ( " delete FROM bookmark WHERE idFile = ? " , ( fileid , ) )
cursor . execute ( " select coalesce(max(idBookmark),0) as bookmarkId from bookmark " )
bookmarkId = cursor . fetchone ( ) [ 0 ]
bookmarkId = bookmarkId + 1
bookmarksql = " insert into bookmark(idBookmark, idFile, timeInSeconds, totalTimeInSeconds, thumbNailImage, player, playerState, type) values(?, ?, ?, ?, ?, ?, ?, ?) "
cursor . execute ( bookmarksql , ( bookmarkId , fileid , resume_seconds , total_seconds , None , " DVDPlayer " , None , 1 ) )
connection . commit ( )
cursor . close ( )
2015-03-31 21:21:51 +00:00
def setKodiFilename ( self , id , oldFileName , newFileName , fileType ) :
2015-03-28 16:42:38 +00:00
#use sqlite to set the filename in DB -- needed to avoid problems with resumepoints etc
2015-03-31 21:21:51 +00:00
#return True if any action is performed, False if no action is performed
2015-03-28 16:42:38 +00:00
#todo --> submit PR to kodi team to get this added to the jsonrpc api
2015-03-28 18:04:32 +00:00
#todo --> extend support for musicvideos
2015-03-28 16:42:38 +00:00
2015-03-31 21:21:51 +00:00
actionPerformed = False
2015-03-29 16:20:02 +00:00
oldFileName = utils . convertEncoding ( oldFileName )
newFileName = utils . convertEncoding ( newFileName )
2015-03-28 16:42:38 +00:00
2015-03-29 16:20:02 +00:00
# only perform changes if the path actually differs
if oldFileName != newFileName :
2015-03-31 21:21:51 +00:00
xbmc . sleep ( sleepVal )
connection = utils . KodiSQL ( )
cursor = connection . cursor ( )
utils . logMsg ( " MB3 Sync " , " setting filename in kodi db... " + fileType + " : " + str ( id ) )
utils . logMsg ( " MB3 Sync " , " old filename --> " + oldFileName )
utils . logMsg ( " MB3 Sync " , " new filename --> " + newFileName )
if fileType == " tvshow " and not newFileName . startswith ( " http " ) :
#for tvshows we only store the path in DB
cursor . execute ( " SELECT idPath as pathid FROM tvshowlinkpath WHERE idShow = ? " , ( id , ) )
result = cursor . fetchone ( )
pathid = result [ 0 ]
cursor . execute ( " UPDATE path SET strPath = ?, noUpdate = ?, idParentPath = ? WHERE idPath = ? " , ( newFileName , 1 , None , pathid ) )
else :
# we need to store both the path and the filename seperately in the kodi db so we split them up
if " \\ " in newFileName :
filename = newFileName . rsplit ( " \\ " , 1 ) [ - 1 ]
path = newFileName . replace ( filename , " " )
elif " / " in newFileName :
filename = newFileName . rsplit ( " / " , 1 ) [ - 1 ]
path = newFileName . replace ( filename , " " )
2015-03-29 16:20:02 +00:00
2015-03-31 21:21:51 +00:00
#if we want to use transcoding/play from stream we pass on the complete http path
#in this case both the path and filename are set to the addonpath
if newFileName . startswith ( " http " ) :
path = newFileName
2015-03-29 16:20:02 +00:00
2015-03-31 21:21:51 +00:00
######### PROCESS EPISODE ############
if fileType == " episode " :
2015-03-29 16:20:02 +00:00
2015-03-31 21:21:51 +00:00
#create the path - return id if already exists
2015-03-29 16:20:02 +00:00
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, strContent, strScraper, noUpdate) values(?, ?, ?, ?, ?) "
2015-03-31 21:21:51 +00:00
cursor . execute ( pathsql , ( pathid , path , None , None , 1 ) )
#get the file and the current path id
cursor . execute ( " SELECT idFile as fileid FROM episode WHERE idEpisode = ? " , ( id , ) )
result = cursor . fetchone ( )
fileid = result [ 0 ]
cursor . execute ( " SELECT idPath as curpathid FROM files WHERE idFile = ? " , ( fileid , ) )
result = cursor . fetchone ( )
curpathid = result [ 0 ]
#set the new path and filename to the episode
cursor . execute ( " UPDATE files SET idPath = ?, strFilename = ? WHERE idFile = ? " , ( pathid , filename , fileid ) )
2015-03-29 16:20:02 +00:00
2015-03-31 21:21:51 +00:00
######### PROCESS MOVIE ############
if fileType == " movie " :
cursor . execute ( " SELECT idFile as fileid FROM movie WHERE idMovie = ? " , ( id , ) )
result = cursor . fetchone ( )
fileid = result [ 0 ]
#write the new filename to the DB
2015-03-29 16:20:02 +00:00
cursor . execute ( " UPDATE files SET strFilename = ? WHERE idFile = ? " , ( filename , fileid ) )
2015-03-31 21:21:51 +00:00
#set the new path
cursor . execute ( " SELECT idPath as pathid FROM files WHERE idFile = ? " , ( fileid , ) )
result = cursor . fetchone ( )
pathid = result [ 0 ]
cursor . execute ( " UPDATE path SET strPath = ?, strContent = ?, strScraper = ?, noUpdate = ?, idParentPath = ? WHERE idPath = ? " , ( path , " movies " , " metadata.local " , 1 , None , pathid ) )
2015-03-29 22:43:53 +00:00
2015-03-31 21:21:51 +00:00
try :
connection . commit ( )
actionPerformed = True
except :
utils . logMsg ( " MB3 Sync " , " Error setting filename in kodi db for: " + fileType + " : " + str ( id ) )
actionPerformed = False
finally :
cursor . close ( )
return actionPerformed
2015-03-28 16:42:38 +00:00
2015-03-17 19:02:42 +00:00
def AddActorsToMedia ( self , KodiItem , people , mediatype ) :
#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
2015-03-20 00:21:43 +00:00
2015-03-17 19:02:42 +00:00
downloadUtils = DownloadUtils ( )
if mediatype == " movie " :
id = KodiItem [ " movieid " ]
if mediatype == " tvshow " :
id = KodiItem [ " tvshowid " ]
if mediatype == " episode " :
id = KodiItem [ " episodeid " ]
currentcast = list ( )
if KodiItem [ " cast " ] != None :
for cast in KodiItem [ " cast " ] :
currentcast . append ( cast [ " name " ] )
2015-03-19 23:48:59 +00:00
2015-03-20 00:21:43 +00:00
needsUpdate = False
2015-03-17 19:02:42 +00:00
if ( people != None ) :
for person in people :
if ( person . get ( " Type " ) == " Actor " ) :
if person . get ( " Name " ) not in currentcast :
2015-03-20 00:21:43 +00:00
needsUpdate = True
break
if ( needsUpdate == False ) :
return False
utils . logMsg ( " AddActorsToMedia " , " List needs updating " )
xbmc . sleep ( sleepVal )
2015-03-26 21:35:11 +00:00
connection = utils . KodiSQL ( )
2015-03-20 00:21:43 +00:00
cursor = connection . cursor ( )
if ( people != None ) :
for person in people :
if ( person . get ( " Type " ) == " Actor " ) :
if person . get ( " Name " ) not in currentcast :
utils . logMsg ( " AddActorsToMedia " , " Processing : " + person . get ( " Name " ) )
2015-03-17 19:02:42 +00:00
Name = person . get ( " Name " )
Role = person . get ( " Role " )
actorid = None
Thumb = downloadUtils . imageUrl ( person . get ( " Id " ) , " Primary " , 0 , 400 , 400 )
cursor . execute ( " SELECT idActor as actorid FROM actors WHERE strActor = ? " , ( Name , ) )
result = cursor . fetchone ( )
if result != None :
actorid = result [ 0 ]
if actorid == None :
cursor . execute ( " select coalesce(max(idActor),0) as actorid from actors " )
actorid = cursor . fetchone ( ) [ 0 ]
actorid = actorid + 1
peoplesql = " insert into actors(idActor, strActor, strThumb) values(?, ?, ?) "
cursor . execute ( peoplesql , ( actorid , Name , Thumb ) )
if mediatype == " movie " :
peoplesql = " INSERT OR REPLACE into actorlinkmovie(idActor, idMovie, strRole, iOrder) values(?, ?, ?, ?) "
if mediatype == " tvshow " :
peoplesql = " INSERT OR REPLACE into actorlinktvshow(idActor, idShow, strRole, iOrder) values(?, ?, ?, ?) "
if mediatype == " episode " :
peoplesql = " INSERT OR REPLACE into actorlinkepisode(idActor, idEpisode, strRole, iOrder) values(?, ?, ?, ?) "
cursor . execute ( peoplesql , ( actorid , id , Role , None ) )
connection . commit ( )
cursor . close ( )
2015-03-20 00:21:43 +00:00
return True
2015-03-24 16:47:26 +00:00
def addBoxsetToKodiLibrary ( self , boxset ) :
#use sqlite to set add the set
2015-03-26 21:35:11 +00:00
connection = utils . KodiSQL ( )
2015-03-24 16:47:26 +00:00
cursor = connection . cursor ( )
strSet = boxset [ " Name " ]
# check if exists
cursor . execute ( " SELECT idSet FROM sets WHERE strSet = ? " , ( strSet , ) )
result = cursor . fetchone ( )
setid = None
if result != None :
setid = result [ 0 ]
currentsetartsql = " SELECT type, url FROM art where media_type = ? and media_id = ? and url != ' ' "
cursor . execute ( currentsetartsql , ( " set " , setid ) )
existing_type_map = { }
rows = cursor . fetchall ( )
for row in rows :
existing_type_map [ row [ 0 ] ] = row [ 1 ]
artwork = { }
artwork [ " poster " ] = API ( ) . getArtwork ( boxset , " Primary " )
artwork [ " banner " ] = API ( ) . getArtwork ( boxset , " Banner " )
artwork [ " clearlogo " ] = API ( ) . getArtwork ( boxset , " Logo " )
artwork [ " clearart " ] = API ( ) . getArtwork ( boxset , " Art " )
artwork [ " landscape " ] = API ( ) . getArtwork ( boxset , " Thumb " )
artwork [ " discart " ] = API ( ) . getArtwork ( boxset , " Disc " )
artwork [ " fanart " ] = API ( ) . getArtwork ( boxset , " Backdrop " )
2015-03-24 18:58:13 +00:00
art_types = [ ' poster ' , ' fanart ' , ' landscape ' , ' clearlogo ' , ' clearart ' , ' banner ' , ' discart ' ]
2015-03-24 16:47:26 +00:00
for update_type in art_types :
if ( update_type in existing_type_map ) :
if ( existing_type_map [ update_type ] != artwork [ update_type ] ) and artwork [ update_type ] != ' ' :
setupdateartsql = " UPDATE art SET url = ? where media_type = ? and media_id = ? and type = ? "
cursor . execute ( setupdateartsql , ( artwork [ update_type ] , " set " , setid , update_type ) )
elif artwork [ update_type ] != ' ' :
setartsql = " INSERT INTO art(media_id, media_type, type, url) VALUES(?,?,?,?) "
cursor . execute ( setartsql , ( setid , " set " , update_type , artwork [ update_type ] ) )
if setid == None :
# insert not exists
setssql = " INSERT INTO sets (idSet, strSet) values(?, ?) "
cursor . execute ( setssql , ( None , strSet ) )
#if OK:
result = cursor . fetchone ( )
if result != None :
setid = result [ 0 ]
connection . commit ( )
cursor . close ( )
return True
def updateBoxsetToKodiLibrary ( self , boxsetmovie , boxset ) :
strSet = boxset [ " Name " ]
kodiMovie = ReadKodiDB ( ) . getKodiMovie ( boxsetmovie [ " Id " ] )
2015-03-24 22:39:19 +00:00
if kodiMovie != None :
WriteKodiDB ( ) . updateProperty ( kodiMovie , " set " , strSet , " movie " , True )