add xbmcgui.DialogProgressBG() to display current sync progress

This commit is contained in:
faush01 2015-03-16 13:32:45 +11:00
parent f0fb4e3c96
commit f587905d91
2 changed files with 218 additions and 131 deletions

View file

@ -35,98 +35,154 @@ class LibrarySync():
WINDOW = xbmcgui.Window( 10000 ) WINDOW = xbmcgui.Window( 10000 )
WINDOW.setProperty("librarysync", "busy") WINDOW.setProperty("librarysync", "busy")
updateNeeded = False pDialog = None
#process full movies sync try:
allMovies = list()
movieData = self.getMovies(True)
if(movieData == None): pDialog = xbmcgui.DialogProgressBG()
return False if(pDialog != None):
pDialog.create('Sync DB', 'Sync DB')
for item in movieData: updateNeeded = False
if not item.get('IsFolder'):
kodiItem = self.getKodiMovie(item["Id"])
allMovies.append(item["Id"])
if kodiItem == None:
self.addMovieToKodiLibrary(item)
updateNeeded = True
else:
self.updateMovieToKodiLibrary(item, kodiItem)
#process full tv shows sync #process full movies sync
allTVShows = list() allMovies = list()
allEpisodes = list() movieData = self.getMovies(True)
tvShowData = self.getTVShows(True)
if (tvShowData == None): if(movieData == None):
return return False
for item in tvShowData:
if item.get('IsFolder'): if(pDialog != None):
kodiItem = self.getKodiTVShow(item["Id"]) pDialog.update(0, "Sync DB : Processing Movies")
allTVShows.append(item["Id"]) total = len(movieData) + 1
if kodiItem == None: count = 1
self.addTVShowToKodiLibrary(item)
updateNeeded = True for item in movieData:
else: if not item.get('IsFolder'):
self.updateTVShowToKodiLibrary(item, kodiItem) kodiItem = self.getKodiMovie(item["Id"])
allMovies.append(item["Id"])
progMessage = "Processing"
if kodiItem == None:
self.addMovieToKodiLibrary(item)
updateNeeded = True
progMessage = "Adding"
else:
self.updateMovieToKodiLibrary(item, kodiItem)
progMessage = "Updating"
# update progress bar
if(pDialog != None):
percentage = int(((float(count) / float(total)) * 100))
pDialog.update(percentage, message=progMessage + " Movie: " + str(count))
count += 1
#process full tv shows sync
allTVShows = list()
allEpisodes = list()
tvShowData = self.getTVShows(True)
if (tvShowData == None):
return
if(pDialog != None):
pDialog.update(0, "Sync DB : Processing TV Shows")
total = len(tvShowData) + 1
count = 0
for item in tvShowData:
if item.get('IsFolder'):
kodiItem = self.getKodiTVShow(item["Id"])
allTVShows.append(item["Id"])
progMessage = "Processing"
if kodiItem == None:
self.addTVShowToKodiLibrary(item)
updateNeeded = True
progMessage = "Adding"
else:
self.updateTVShowToKodiLibrary(item, kodiItem)
progMessage = "Updating"
# update progress bar
if(pDialog != None):
percentage = int(((float(count) / float(total)) * 100))
pDialog.update(percentage, message=progMessage + " Tv Show: " + str(count))
count += 1
#process episodes (will only be possible when tv show is scanned to library) #process episodes (will only be possible when tv show is scanned to library)
#TODO --> maybe pull full info only when needed ? #TODO --> maybe pull full info only when needed ?
allEpisodes = list() allEpisodes = list()
for tvshow in allTVShows: for tvshow in allTVShows:
episodeData = self.getEpisodes(tvshow,True) episodeData = self.getEpisodes(tvshow,True)
kodiEpisodes = self.getKodiEpisodes(tvshow) kodiEpisodes = self.getKodiEpisodes(tvshow)
#we have to compare the lists somehow if(pDialog != None):
for item in episodeData: pDialog.update(0, "Sync DB : Processing Episodes")
xbmc.sleep(150) # sleep to not overload system --> can this be replaced by moving the sync to a different thread ? total = len(episodeData) + 1
comparestring1 = str(item.get("ParentIndexNumber")) + "-" + str(item.get("IndexNumber")) count = 0
matchFound = False
if kodiEpisodes != None:
for KodiItem in kodiEpisodes:
allEpisodes.append(KodiItem["episodeid"]) #we have to compare the lists somehow
comparestring2 = str(KodiItem["season"]) + "-" + str(KodiItem["episode"]) for item in episodeData:
if comparestring1 == comparestring2: #xbmc.sleep(150) # sleep to not overload system --> can this be replaced by moving the sync to a different thread ?
#match found - update episode comparestring1 = str(item.get("ParentIndexNumber")) + "-" + str(item.get("IndexNumber"))
self.updateEpisodeToKodiLibrary(item,KodiItem,tvshow) matchFound = False
matchFound = True progMessage = "Processing"
if kodiEpisodes != None:
for KodiItem in kodiEpisodes:
if not matchFound: allEpisodes.append(KodiItem["episodeid"])
#no match so we have to create it comparestring2 = str(KodiItem["season"]) + "-" + str(KodiItem["episode"])
print "episode not found...creating it: " if comparestring1 == comparestring2:
self.addEpisodeToKodiLibrary(item,tvshow) #match found - update episode
updateNeeded = True self.updateEpisodeToKodiLibrary(item,KodiItem,tvshow)
matchFound = True
progMessage = "Updating"
if not matchFound:
#no match so we have to create it
print "episode not found...creating it: "
self.addEpisodeToKodiLibrary(item,tvshow)
updateNeeded = True
progMessage = "Adding"
# process deletes # update progress bar
# TODO --> process deletes for episodes !!! if(pDialog != None):
cleanNeeded = False percentage = int(((float(count) / float(total)) * 100))
allLocaldirs, filesMovies = xbmcvfs.listdir(movieLibrary) pDialog.update(percentage, message=progMessage + " Episode: " + str(count))
allMB3Movies = set(allMovies) count += 1
for dir in allLocaldirs:
if not dir in allMB3Movies:
self.deleteMovieFromKodiLibrary(dir)
cleanneeded = True
allLocaldirs, filesTVShows = xbmcvfs.listdir(tvLibrary) # process deletes
allMB3TVShows = set(allTVShows) # TODO --> process deletes for episodes !!!
for dir in allLocaldirs: if(pDialog != None):
if not dir in allMB3TVShows: pDialog.update(0, message="Removing Deleted Items")
self.deleteTVShowFromKodiLibrary(dir)
cleanneeded = True
if cleanNeeded: cleanNeeded = False
xbmc.executebuiltin("CleanLibrary(video)") allLocaldirs, filesMovies = xbmcvfs.listdir(movieLibrary)
allMB3Movies = set(allMovies)
for dir in allLocaldirs:
if not dir in allMB3Movies:
self.deleteMovieFromKodiLibrary(dir)
cleanneeded = True
if updateNeeded: allLocaldirs, filesTVShows = xbmcvfs.listdir(tvLibrary)
xbmc.executebuiltin("UpdateLibrary(video)") allMB3TVShows = set(allTVShows)
for dir in allLocaldirs:
if not dir in allMB3TVShows:
self.deleteTVShowFromKodiLibrary(dir)
cleanneeded = True
WINDOW.clearProperty("librarysync") if cleanNeeded:
xbmc.executebuiltin("CleanLibrary(video)")
if updateNeeded:
xbmc.executebuiltin("UpdateLibrary(video)")
finally:
WINDOW.clearProperty("librarysync")
if(pDialog != None):
pDialog.close()
return True return True
@ -135,54 +191,83 @@ class LibrarySync():
WINDOW = xbmcgui.Window( 10000 ) WINDOW = xbmcgui.Window( 10000 )
WINDOW.setProperty("librarysync", "busy") WINDOW.setProperty("librarysync", "busy")
pDialog = None
#process movies try:
movieData = self.getMovies(False)
if(movieData == None):
return False
for item in movieData: pDialog = xbmcgui.DialogProgressBG()
if not item.get('IsFolder'): if(pDialog != None):
kodiItem = self.getKodiMovie(item["Id"]) pDialog.create('Sync PlayCounts', 'Sync PlayCounts')
userData=API().getUserData(item)
timeInfo = API().getTimeInfo(item)
if kodiItem != None:
if kodiItem['playcount'] != int(userData.get("PlayCount")):
xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.SetMovieDetails", "params": { "movieid": %i, "playcount": %i}, "id": 1 }' %(kodiItem['movieid'], int(userData.get("PlayCount"))))
kodiresume = int(round(kodiItem['resume'].get("position"))) #process movies
resume = int(round(float(timeInfo.get("ResumeTime"))))*60 movieData = self.getMovies(False)
total = int(round(float(timeInfo.get("TotalTime"))))*60 if(movieData == None):
if kodiresume != resume:
self.setKodiResumePoint(kodiItem['movieid'],resume,total,"movie")
#process Tv shows
tvshowData = self.getTVShows(False)
if (tvshowData == None):
return False
for item in tvshowData:
episodeData = self.getEpisodes(item["Id"], False)
if (episodeData == None):
return False return False
for episode in episodeData: if(pDialog != None):
kodiItem = self.getKodiEpisodeByMbItem(episode) pDialog.update(0, "Sync PlayCounts: Processing Movies")
userData=API().getUserData(episode) totalCount = len(movieData) + 1
timeInfo = API().getTimeInfo(episode) count = 1
if kodiItem != None:
if kodiItem['playcount'] != int(userData.get("PlayCount")):
xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.SetEpisodeDetails", "params": { "episodeid": %i, "playcount": %i}, "id": 1 }' %(kodiItem['episodeid'], int(userData.get("PlayCount"))))
kodiresume = int(round(kodiItem['resume'].get("position"))) for item in movieData:
resume = int(round(float(timeInfo.get("ResumeTime"))))*60 if not item.get('IsFolder'):
total = int(round(float(timeInfo.get("TotalTime"))))*60 kodiItem = self.getKodiMovie(item["Id"])
if kodiresume != resume: userData=API().getUserData(item)
self.setKodiResumePoint(kodiItem['episodeid'],resume,total,"episode") timeInfo = API().getTimeInfo(item)
if kodiItem != None:
if kodiItem['playcount'] != int(userData.get("PlayCount")):
xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.SetMovieDetails", "params": { "movieid": %i, "playcount": %i}, "id": 1 }' %(kodiItem['movieid'], int(userData.get("PlayCount"))))
kodiresume = int(round(kodiItem['resume'].get("position")))
resume = int(round(float(timeInfo.get("ResumeTime"))))*60
total = int(round(float(timeInfo.get("TotalTime"))))*60
if kodiresume != resume:
self.setKodiResumePoint(kodiItem['movieid'],resume,total,"movie")
WINDOW.clearProperty("librarysync") # update progress bar
if(pDialog != None):
percentage = int(((float(count) / float(totalCount)) * 100))
pDialog.update(percentage, message="Updating Movie: " + str(count))
count += 1
#process Tv shows
tvshowData = self.getTVShows(False)
if (tvshowData == None):
return False
if(pDialog != None):
pDialog.update(0, "Sync PlayCounts: Processing Episodes")
totalCount = len(movieData) + 1
count = 1
for item in tvshowData:
episodeData = self.getEpisodes(item["Id"], False)
if (episodeData != None):
for episode in episodeData:
kodiItem = self.getKodiEpisodeByMbItem(episode)
userData=API().getUserData(episode)
timeInfo = API().getTimeInfo(episode)
if kodiItem != None:
if kodiItem['playcount'] != int(userData.get("PlayCount")):
xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.SetEpisodeDetails", "params": { "episodeid": %i, "playcount": %i}, "id": 1 }' %(kodiItem['episodeid'], int(userData.get("PlayCount"))))
kodiresume = int(round(kodiItem['resume'].get("position")))
resume = int(round(float(timeInfo.get("ResumeTime"))))*60
total = int(round(float(timeInfo.get("TotalTime"))))*60
if kodiresume != resume:
self.setKodiResumePoint(kodiItem['episodeid'],resume,total,"episode")
# update progress bar
if(pDialog != None):
percentage = int(((float(count) / float(totalCount)) * 100))
pDialog.update(percentage, message="Updating Episode: " + str(count))
count += 1
finally:
WINDOW.clearProperty("librarysync")
if(pDialog != None):
pDialog.close()
return True return True

View file

@ -84,8 +84,9 @@ class Service():
#full sync #full sync
if(cur_seconds_fullsync >= interval_FullSync): if(cur_seconds_fullsync >= interval_FullSync):
xbmc.log("Doing_Db_Sync: syncDatabase") xbmc.log("Doing_Db_Sync: syncDatabase (Started)")
worked = librarySync.syncDatabase() worked = librarySync.syncDatabase()
xbmc.log("Doing_Db_Sync: syncDatabase (Finished) " + str(worked))
if(worked): if(worked):
cur_seconds_fullsync = 0 cur_seconds_fullsync = 0
else: else:
@ -95,8 +96,9 @@ class Service():
#incremental sync #incremental sync
if(cur_seconds_incrsync >= interval_IncrementalSync): if(cur_seconds_incrsync >= interval_IncrementalSync):
xbmc.log("Doing_Db_Sync: updatePlayCounts") xbmc.log("Doing_Db_Sync: updatePlayCounts (Started)")
worked = librarySync.updatePlayCounts() worked = librarySync.updatePlayCounts()
xbmc.log("Doing_Db_Sync: updatePlayCounts (Finished) " + str(worked))
if(worked): if(worked):
cur_seconds_incrsync = 0 cur_seconds_incrsync = 0
else: else: