More cleanup of librarysync
This commit is contained in:
parent
5334a38754
commit
c451a236e7
1 changed files with 1 additions and 481 deletions
|
@ -202,16 +202,8 @@ class ThreadedShowSyncInfo(threading.Thread):
|
||||||
@utils.ThreadMethodsAdditionalStop('emby_shouldStop')
|
@utils.ThreadMethodsAdditionalStop('emby_shouldStop')
|
||||||
@utils.ThreadMethods
|
@utils.ThreadMethods
|
||||||
class LibrarySync(threading.Thread):
|
class LibrarySync(threading.Thread):
|
||||||
|
# Borg, even though it's planned to only have 1 instance up and running!
|
||||||
_shared_state = {}
|
_shared_state = {}
|
||||||
|
|
||||||
# Track websocketclient updates
|
|
||||||
addedItems = []
|
|
||||||
updateItems = []
|
|
||||||
userdataItems = []
|
|
||||||
removeItems = []
|
|
||||||
forceLibraryUpdate = False
|
|
||||||
refresh_views = False
|
|
||||||
# How long should we look into the past for fast syncing items (in s)
|
# How long should we look into the past for fast syncing items (in s)
|
||||||
syncPast = 30
|
syncPast = 30
|
||||||
|
|
||||||
|
@ -1148,475 +1140,3 @@ class LibrarySync(threading.Thread):
|
||||||
count += 1
|
count += 1
|
||||||
|
|
||||||
self.logMsg("###===--- LibrarySync Stopped ---===###", 0)
|
self.logMsg("###===--- LibrarySync Stopped ---===###", 0)
|
||||||
|
|
||||||
|
|
||||||
class ManualSync(LibrarySync):
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
|
|
||||||
LibrarySync.__init__(self)
|
|
||||||
self.fullSync(manualrun=True)
|
|
||||||
|
|
||||||
|
|
||||||
def movies(self, embycursor, kodicursor, pdialog):
|
|
||||||
# Get movies from emby
|
|
||||||
emby = self.emby
|
|
||||||
emby_db = embydb.Embydb_Functions(embycursor)
|
|
||||||
movies = itemtypes.Movies(embycursor, kodicursor)
|
|
||||||
|
|
||||||
views = emby_db.getView_byType('movies')
|
|
||||||
views += emby_db.getView_byType('mixed')
|
|
||||||
self.logMsg("Media folders: %s" % views, 1)
|
|
||||||
|
|
||||||
# Pull the list of movies and boxsets in Kodi
|
|
||||||
try:
|
|
||||||
all_kodimovies = dict(emby_db.getChecksum('Movie'))
|
|
||||||
except ValueError:
|
|
||||||
all_kodimovies = {}
|
|
||||||
|
|
||||||
try:
|
|
||||||
all_kodisets = dict(emby_db.getChecksum('BoxSet'))
|
|
||||||
except ValueError:
|
|
||||||
all_kodisets = {}
|
|
||||||
|
|
||||||
all_embymoviesIds = set()
|
|
||||||
all_embyboxsetsIds = set()
|
|
||||||
updatelist = []
|
|
||||||
|
|
||||||
##### PROCESS MOVIES #####
|
|
||||||
for view in views:
|
|
||||||
|
|
||||||
if self.threadStopped():
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Get items per view
|
|
||||||
viewId = view['id']
|
|
||||||
viewName = view['name']
|
|
||||||
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(
|
|
||||||
heading="Emby for Kodi",
|
|
||||||
message="Comparing movies from view: %s..." % viewName)
|
|
||||||
|
|
||||||
all_embymovies = emby.getMovies(viewId, basic=True, dialog=pdialog)
|
|
||||||
for embymovie in all_embymovies['Items']:
|
|
||||||
|
|
||||||
if self.threadStopped():
|
|
||||||
return False
|
|
||||||
|
|
||||||
API = api.API(embymovie)
|
|
||||||
itemid = embymovie['Id']
|
|
||||||
all_embymoviesIds.add(itemid)
|
|
||||||
|
|
||||||
|
|
||||||
if all_kodimovies.get(itemid) != API.getChecksum():
|
|
||||||
# Only update if movie is not in Kodi or checksum is different
|
|
||||||
updatelist.append(itemid)
|
|
||||||
|
|
||||||
self.logMsg("Movies to update for %s: %s" % (viewName, updatelist), 1)
|
|
||||||
embymovies = emby.getFullItems(updatelist)
|
|
||||||
total = len(updatelist)
|
|
||||||
del updatelist[:]
|
|
||||||
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(heading="Processing %s / %s items" % (viewName, total))
|
|
||||||
|
|
||||||
count = 0
|
|
||||||
for embymovie in embymovies:
|
|
||||||
# Process individual movies
|
|
||||||
if self.threadStopped():
|
|
||||||
return False
|
|
||||||
|
|
||||||
title = embymovie['Name']
|
|
||||||
if pdialog:
|
|
||||||
percentage = int((float(count) / float(total))*100)
|
|
||||||
pdialog.update(percentage, message=title)
|
|
||||||
count += 1
|
|
||||||
movies.add_update(embymovie, viewName, viewId)
|
|
||||||
|
|
||||||
##### PROCESS BOXSETS #####
|
|
||||||
|
|
||||||
boxsets = emby.getBoxset(dialog=pdialog)
|
|
||||||
embyboxsets = []
|
|
||||||
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(
|
|
||||||
heading="Emby for Kodi",
|
|
||||||
message="Comparing boxsets...")
|
|
||||||
|
|
||||||
for boxset in boxsets['Items']:
|
|
||||||
|
|
||||||
if self.threadStopped():
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Boxset has no real userdata, so using etag to compare
|
|
||||||
checksum = boxset['Etag']
|
|
||||||
itemid = boxset['Id']
|
|
||||||
all_embyboxsetsIds.add(itemid)
|
|
||||||
|
|
||||||
if all_kodisets.get(itemid) != checksum:
|
|
||||||
# Only update if boxset is not in Kodi or checksum is different
|
|
||||||
updatelist.append(itemid)
|
|
||||||
embyboxsets.append(boxset)
|
|
||||||
|
|
||||||
self.logMsg("Boxsets to update: %s" % updatelist, 1)
|
|
||||||
total = len(updatelist)
|
|
||||||
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(heading="Processing Boxsets / %s items" % total)
|
|
||||||
|
|
||||||
count = 0
|
|
||||||
for boxset in embyboxsets:
|
|
||||||
# Process individual boxset
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
title = boxset['Name']
|
|
||||||
if pdialog:
|
|
||||||
percentage = int((float(count) / float(total))*100)
|
|
||||||
pdialog.update(percentage, message=title)
|
|
||||||
count += 1
|
|
||||||
movies.add_updateBoxset(boxset)
|
|
||||||
|
|
||||||
##### PROCESS DELETES #####
|
|
||||||
|
|
||||||
for kodimovie in all_kodimovies:
|
|
||||||
if kodimovie not in all_embymoviesIds:
|
|
||||||
movies.remove(kodimovie)
|
|
||||||
else:
|
|
||||||
self.logMsg("Movies compare finished.", 1)
|
|
||||||
|
|
||||||
for boxset in all_kodisets:
|
|
||||||
if boxset not in all_embyboxsetsIds:
|
|
||||||
movies.remove(boxset)
|
|
||||||
else:
|
|
||||||
self.logMsg("Boxsets compare finished.", 1)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def musicvideos(self, embycursor, kodicursor, pdialog):
|
|
||||||
# Get musicvideos from emby
|
|
||||||
emby = self.emby
|
|
||||||
emby_db = embydb.Embydb_Functions(embycursor)
|
|
||||||
mvideos = itemtypes.MusicVideos(embycursor, kodicursor)
|
|
||||||
|
|
||||||
views = emby_db.getView_byType('musicvideos')
|
|
||||||
self.logMsg("Media folders: %s" % views, 1)
|
|
||||||
|
|
||||||
# Pull the list of musicvideos in Kodi
|
|
||||||
try:
|
|
||||||
all_kodimvideos = dict(emby_db.getChecksum('MusicVideo'))
|
|
||||||
except ValueError:
|
|
||||||
all_kodimvideos = {}
|
|
||||||
|
|
||||||
all_embymvideosIds = set()
|
|
||||||
updatelist = []
|
|
||||||
|
|
||||||
for view in views:
|
|
||||||
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Get items per view
|
|
||||||
viewId = view['id']
|
|
||||||
viewName = view['name']
|
|
||||||
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(
|
|
||||||
heading="Emby for Kodi",
|
|
||||||
message="Comparing musicvideos from view: %s..." % viewName)
|
|
||||||
|
|
||||||
all_embymvideos = emby.getMusicVideos(viewId, basic=True, dialog=pdialog)
|
|
||||||
for embymvideo in all_embymvideos['Items']:
|
|
||||||
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
API = api.API(embymvideo)
|
|
||||||
itemid = embymvideo['Id']
|
|
||||||
all_embymvideosIds.add(itemid)
|
|
||||||
|
|
||||||
|
|
||||||
if all_kodimvideos.get(itemid) != API.getChecksum():
|
|
||||||
# Only update if musicvideo is not in Kodi or checksum is different
|
|
||||||
updatelist.append(itemid)
|
|
||||||
|
|
||||||
self.logMsg("MusicVideos to update for %s: %s" % (viewName, updatelist), 1)
|
|
||||||
embymvideos = emby.getFullItems(updatelist)
|
|
||||||
total = len(updatelist)
|
|
||||||
del updatelist[:]
|
|
||||||
|
|
||||||
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(heading="Processing %s / %s items" % (viewName, total))
|
|
||||||
|
|
||||||
count = 0
|
|
||||||
for embymvideo in embymvideos:
|
|
||||||
# Process individual musicvideo
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
title = embymvideo['Name']
|
|
||||||
if pdialog:
|
|
||||||
percentage = int((float(count) / float(total))*100)
|
|
||||||
pdialog.update(percentage, message=title)
|
|
||||||
count += 1
|
|
||||||
mvideos.add_update(embymvideo, viewName, viewId)
|
|
||||||
|
|
||||||
##### PROCESS DELETES #####
|
|
||||||
|
|
||||||
for kodimvideo in all_kodimvideos:
|
|
||||||
if kodimvideo not in all_embymvideosIds:
|
|
||||||
mvideos.remove(kodimvideo)
|
|
||||||
else:
|
|
||||||
self.logMsg("MusicVideos compare finished.", 1)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def tvshows(self, embycursor, kodicursor, pdialog):
|
|
||||||
# Get shows from emby
|
|
||||||
emby = self.emby
|
|
||||||
emby_db = embydb.Embydb_Functions(embycursor)
|
|
||||||
tvshows = itemtypes.TVShows(embycursor, kodicursor)
|
|
||||||
|
|
||||||
views = emby_db.getView_byType('tvshows')
|
|
||||||
views += emby_db.getView_byType('mixed')
|
|
||||||
self.logMsg("Media folders: %s" % views, 1)
|
|
||||||
|
|
||||||
# Pull the list of tvshows and episodes in Kodi
|
|
||||||
try:
|
|
||||||
all_koditvshows = dict(emby_db.getChecksum('Series'))
|
|
||||||
except ValueError:
|
|
||||||
all_koditvshows = {}
|
|
||||||
|
|
||||||
try:
|
|
||||||
all_kodiepisodes = dict(emby_db.getChecksum('Episode'))
|
|
||||||
except ValueError:
|
|
||||||
all_kodiepisodes = {}
|
|
||||||
|
|
||||||
all_embytvshowsIds = set()
|
|
||||||
all_embyepisodesIds = set()
|
|
||||||
updatelist = []
|
|
||||||
|
|
||||||
|
|
||||||
for view in views:
|
|
||||||
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Get items per view
|
|
||||||
viewId = view['id']
|
|
||||||
viewName = view['name']
|
|
||||||
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(
|
|
||||||
heading="Emby for Kodi",
|
|
||||||
message="Comparing tvshows from view: %s..." % viewName)
|
|
||||||
|
|
||||||
all_embytvshows = emby.getShows(viewId, basic=True, dialog=pdialog)
|
|
||||||
for embytvshow in all_embytvshows['Items']:
|
|
||||||
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
API = api.API(embytvshow)
|
|
||||||
itemid = embytvshow['Id']
|
|
||||||
all_embytvshowsIds.add(itemid)
|
|
||||||
|
|
||||||
|
|
||||||
if all_koditvshows.get(itemid) != API.getChecksum():
|
|
||||||
# Only update if movie is not in Kodi or checksum is different
|
|
||||||
updatelist.append(itemid)
|
|
||||||
|
|
||||||
self.logMsg("TVShows to update for %s: %s" % (viewName, updatelist), 1)
|
|
||||||
embytvshows = emby.getFullItems(updatelist)
|
|
||||||
total = len(updatelist)
|
|
||||||
del updatelist[:]
|
|
||||||
|
|
||||||
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(heading="Processing %s / %s items" % (viewName, total))
|
|
||||||
|
|
||||||
count = 0
|
|
||||||
for embytvshow in embytvshows:
|
|
||||||
# Process individual show
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
itemid = embytvshow['Id']
|
|
||||||
title = embytvshow['Name']
|
|
||||||
if pdialog:
|
|
||||||
percentage = int((float(count) / float(total))*100)
|
|
||||||
pdialog.update(percentage, message=title)
|
|
||||||
count += 1
|
|
||||||
tvshows.add_update(embytvshow, viewName, viewId)
|
|
||||||
|
|
||||||
else:
|
|
||||||
# Get all episodes in view
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(
|
|
||||||
heading="Emby for Kodi",
|
|
||||||
message="Comparing episodes from view: %s..." % viewName)
|
|
||||||
|
|
||||||
all_embyepisodes = emby.getEpisodes(viewId, basic=True, dialog=pdialog)
|
|
||||||
for embyepisode in all_embyepisodes['Items']:
|
|
||||||
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
API = api.API(embyepisode)
|
|
||||||
itemid = embyepisode['Id']
|
|
||||||
all_embyepisodesIds.add(itemid)
|
|
||||||
|
|
||||||
if all_kodiepisodes.get(itemid) != API.getChecksum():
|
|
||||||
# Only update if movie is not in Kodi or checksum is different
|
|
||||||
updatelist.append(itemid)
|
|
||||||
|
|
||||||
self.logMsg("Episodes to update for %s: %s" % (viewName, updatelist), 1)
|
|
||||||
embyepisodes = emby.getFullItems(updatelist)
|
|
||||||
total = len(updatelist)
|
|
||||||
del updatelist[:]
|
|
||||||
|
|
||||||
count = 0
|
|
||||||
for episode in embyepisodes:
|
|
||||||
|
|
||||||
# Process individual episode
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
title = episode['SeriesName']
|
|
||||||
episodetitle = episode['Name']
|
|
||||||
if pdialog:
|
|
||||||
percentage = int((float(count) / float(total))*100)
|
|
||||||
pdialog.update(percentage, message="%s - %s" % (title, episodetitle))
|
|
||||||
count += 1
|
|
||||||
tvshows.add_updateEpisode(episode)
|
|
||||||
|
|
||||||
##### PROCESS DELETES #####
|
|
||||||
|
|
||||||
for koditvshow in all_koditvshows:
|
|
||||||
if koditvshow not in all_embytvshowsIds:
|
|
||||||
tvshows.remove(koditvshow)
|
|
||||||
else:
|
|
||||||
self.logMsg("TVShows compare finished.", 1)
|
|
||||||
|
|
||||||
for kodiepisode in all_kodiepisodes:
|
|
||||||
if kodiepisode not in all_embyepisodesIds:
|
|
||||||
tvshows.remove(kodiepisode)
|
|
||||||
else:
|
|
||||||
self.logMsg("Episodes compare finished.", 1)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def music(self, embycursor, kodicursor, pdialog):
|
|
||||||
# Get music from emby
|
|
||||||
emby = self.emby
|
|
||||||
emby_db = embydb.Embydb_Functions(embycursor)
|
|
||||||
music = itemtypes.Music(embycursor, kodicursor)
|
|
||||||
|
|
||||||
# Pull the list of artists, albums, songs
|
|
||||||
try:
|
|
||||||
all_kodiartists = dict(emby_db.getChecksum('MusicArtist'))
|
|
||||||
except ValueError:
|
|
||||||
all_kodiartists = {}
|
|
||||||
|
|
||||||
try:
|
|
||||||
all_kodialbums = dict(emby_db.getChecksum('MusicAlbum'))
|
|
||||||
except ValueError:
|
|
||||||
all_kodialbums = {}
|
|
||||||
|
|
||||||
try:
|
|
||||||
all_kodisongs = dict(emby_db.getChecksum('Audio'))
|
|
||||||
except ValueError:
|
|
||||||
all_kodisongs = {}
|
|
||||||
|
|
||||||
all_embyartistsIds = set()
|
|
||||||
all_embyalbumsIds = set()
|
|
||||||
all_embysongsIds = set()
|
|
||||||
updatelist = []
|
|
||||||
|
|
||||||
process = {
|
|
||||||
|
|
||||||
'artists': [emby.getArtists, music.add_updateArtist],
|
|
||||||
'albums': [emby.getAlbums, music.add_updateAlbum],
|
|
||||||
'songs': [emby.getSongs, music.add_updateSong]
|
|
||||||
}
|
|
||||||
types = ['artists', 'albums', 'songs']
|
|
||||||
for type in types:
|
|
||||||
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(
|
|
||||||
heading="Emby for Kodi",
|
|
||||||
message="Comparing %s..." % type)
|
|
||||||
|
|
||||||
if type != "artists":
|
|
||||||
all_embyitems = process[type][0](basic=True, dialog=pdialog)
|
|
||||||
else:
|
|
||||||
all_embyitems = process[type][0](dialog=pdialog)
|
|
||||||
for embyitem in all_embyitems['Items']:
|
|
||||||
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
API = api.API(embyitem)
|
|
||||||
itemid = embyitem['Id']
|
|
||||||
if type == "artists":
|
|
||||||
all_embyartistsIds.add(itemid)
|
|
||||||
if all_kodiartists.get(itemid) != API.getChecksum():
|
|
||||||
# Only update if artist is not in Kodi or checksum is different
|
|
||||||
updatelist.append(itemid)
|
|
||||||
elif type == "albums":
|
|
||||||
all_embyalbumsIds.add(itemid)
|
|
||||||
if all_kodialbums.get(itemid) != API.getChecksum():
|
|
||||||
# Only update if album is not in Kodi or checksum is different
|
|
||||||
updatelist.append(itemid)
|
|
||||||
else:
|
|
||||||
all_embysongsIds.add(itemid)
|
|
||||||
if all_kodisongs.get(itemid) != API.getChecksum():
|
|
||||||
# Only update if songs is not in Kodi or checksum is different
|
|
||||||
updatelist.append(itemid)
|
|
||||||
|
|
||||||
self.logMsg("%s to update: %s" % (type, updatelist), 1)
|
|
||||||
embyitems = emby.getFullItems(updatelist)
|
|
||||||
total = len(updatelist)
|
|
||||||
del updatelist[:]
|
|
||||||
|
|
||||||
if pdialog:
|
|
||||||
pdialog.update(heading="Processing %s / %s items" % (type, total))
|
|
||||||
|
|
||||||
count = 0
|
|
||||||
for embyitem in embyitems:
|
|
||||||
# Process individual item
|
|
||||||
if self.shouldStop():
|
|
||||||
return False
|
|
||||||
|
|
||||||
title = embyitem['Name']
|
|
||||||
if pdialog:
|
|
||||||
percentage = int((float(count) / float(total))*100)
|
|
||||||
pdialog.update(percentage, message=title)
|
|
||||||
count += 1
|
|
||||||
|
|
||||||
process[type][1](embyitem)
|
|
||||||
|
|
||||||
##### PROCESS DELETES #####
|
|
||||||
|
|
||||||
for kodiartist in all_kodiartists:
|
|
||||||
if kodiartist not in all_embyartistsIds and all_kodiartists[kodiartist] is not None:
|
|
||||||
music.remove(kodiartist)
|
|
||||||
else:
|
|
||||||
self.logMsg("Artist compare finished.", 1)
|
|
||||||
|
|
||||||
for kodialbum in all_kodialbums:
|
|
||||||
if kodialbum not in all_embyalbumsIds:
|
|
||||||
music.remove(kodialbum)
|
|
||||||
else:
|
|
||||||
self.logMsg("Albums compare finished.", 1)
|
|
||||||
|
|
||||||
for kodisong in all_kodisongs:
|
|
||||||
if kodisong not in all_embysongsIds:
|
|
||||||
music.remove(kodisong)
|
|
||||||
else:
|
|
||||||
self.logMsg("Songs compare finished.", 1)
|
|
||||||
|
|
||||||
return True
|
|
Loading…
Reference in a new issue