def __deleteEpisodesFromTraktCollection(self, traktShows, kodiShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('clean_trakt_episodes') and not self.sync.IsCanceled(): removeTraktShows = copy.deepcopy(traktShows) removeKodiShows = copy.deepcopy(kodiShows) traktShowsRemove = utilities.compareEpisodes( removeTraktShows, removeKodiShows, kodiUtilities.getSettingAsBool("scrobble_fallback")) utilities.sanitizeShows(traktShowsRemove) if len(traktShowsRemove['shows']) == 0: self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString( 32077), line2=kodiUtilities.getString(32110)) logger.debug( '[Episodes Sync] Trakt.tv episode collection is clean, no episodes to remove.') return logger.debug("[Episodes Sync] %i show(s) will have episodes removed from Trakt.tv collection." % len( traktShowsRemove['shows'])) for show in traktShowsRemove['shows']: logger.debug("[Episodes Sync] Episodes removed: %s" % self.__getShowAsString(show, short=True)) self.sync.UpdateProgress(fromPercent, line1=kodiUtilities.getString( 32077), line2=kodiUtilities.getString(32111) % utilities.countEpisodes(traktShowsRemove)) logger.debug("[traktRemoveEpisodes] Shows to remove %s" % traktShowsRemove) try: self.sync.traktapi.removeFromCollection(traktShowsRemove) except Exception as ex: message = utilities.createError(ex) logging.fatal(message) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString( 32112) % utilities.countEpisodes(traktShowsRemove))
def __addEpisodesToTraktCollection(self, kodiShows, traktShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('add_episodes_to_trakt') and not self.sync.IsCanceled(): addTraktShows = copy.deepcopy(traktShows) addKodiShows = copy.deepcopy(kodiShows) tmpTraktShowsAdd = utilities.compareEpisodes( addKodiShows, addTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback")) traktShowsAdd = copy.deepcopy(tmpTraktShowsAdd) utilities.sanitizeShows(traktShowsAdd) # logger.debug("traktShowsAdd %s" % traktShowsAdd) if len(traktShowsAdd['shows']) == 0: self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString( 32068), line2=kodiUtilities.getString(32104)) logger.debug( "[Episodes Sync] Trakt.tv episode collection is up to date.") return logger.debug("[Episodes Sync] %i show(s) have episodes (%d) to be added to your Trakt.tv collection." % ( len(traktShowsAdd['shows']), utilities.countEpisodes(traktShowsAdd))) for show in traktShowsAdd['shows']: logger.debug("[Episodes Sync] Episodes added: %s" % self.__getShowAsString(show, short=True)) self.sync.UpdateProgress(fromPercent, line1=kodiUtilities.getString( 32068), line2=kodiUtilities.getString(32067) % (len(traktShowsAdd['shows']))) # split episode list into chunks of 50 chunksize = 1 chunked_episodes = utilities.chunks( traktShowsAdd['shows'], chunksize) errorcount = 0 i = 0 x = float(len(traktShowsAdd['shows'])) for chunk in chunked_episodes: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=kodiUtilities.getString( 32069) % ((i) * chunksize if (i) * chunksize < x else x, x)) request = {'shows': chunk} logger.debug("[traktAddEpisodes] Shows to add %s" % request) try: self.sync.traktapi.addToCollection(request) except Exception as ex: message = utilities.createError(ex) logging.fatal(message) errorcount += 1 logger.debug( "[traktAddEpisodes] Finished with %d error(s)" % errorcount) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString( 32105) % utilities.countEpisodes(traktShowsAdd))
def __addEpisodesToTraktWatched(self, kodiShows, traktShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_episode_playcount') and not self.sync.IsCanceled(): updateTraktTraktShows = copy.deepcopy(traktShows) updateTraktKodiShows = copy.deepcopy(kodiShows) traktShowsUpdate = utilities.compareEpisodes( updateTraktKodiShows, updateTraktTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback"), watched=True) utilities.sanitizeShows(traktShowsUpdate) # logger.debug("traktShowsUpdate %s" % traktShowsUpdate) if len(traktShowsUpdate['shows']) == 0: self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString( 32071), line2=kodiUtilities.getString(32106)) logger.debug( "[Episodes Sync] Trakt.tv episode playcounts are up to date.") return logger.debug("[Episodes Sync] %i show(s) are missing playcounts on Trakt.tv" % len( traktShowsUpdate['shows'])) for show in traktShowsUpdate['shows']: logger.debug("[Episodes Sync] Episodes updated: %s" % self.__getShowAsString(show, short=True)) self.sync.UpdateProgress(fromPercent, line1=kodiUtilities.getString( 32071), line2=kodiUtilities.getString(32070) % (len(traktShowsUpdate['shows']))) errorcount = 0 i = 0 x = float(len(traktShowsUpdate['shows'])) for show in traktShowsUpdate['shows']: if self.sync.IsCanceled(): return epCount = utilities.countEpisodes([show]) title = show['title'] i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress( int(y), line2=title, line3=kodiUtilities.getString(32073) % epCount) s = {'shows': [show]} logger.debug("[traktUpdateEpisodes] Shows to update %s" % s) try: self.sync.traktapi.addToHistory(s) except Exception as ex: message = utilities.createError(ex) logging.fatal(message) errorcount += 1 logger.debug( "[traktUpdateEpisodes] Finished with %d error(s)" % errorcount) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString( 32072) % (len(traktShowsUpdate['shows'])), line3=" ")
def __addEpisodesToTraktWatched(self, kodiShows, traktShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_episode_playcount') and not self.sync.IsCanceled(): updateTraktTraktShows = copy.deepcopy(traktShows) updateTraktKodiShows = copy.deepcopy(kodiShows) traktShowsUpdate = utilities.compareEpisodes( updateTraktKodiShows, updateTraktTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback"), watched=True) utilities.sanitizeShows(traktShowsUpdate) # logger.debug("traktShowsUpdate %s" % traktShowsUpdate) if len(traktShowsUpdate['shows']) == 0: self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString(32071), line2=kodiUtilities.getString(32106)) logger.debug("[Episodes Sync] Trakt.tv episode playcounts are up to date.") return logger.debug("[Episodes Sync] %i show(s) are missing playcounts on Trakt.tv" % len(traktShowsUpdate['shows'])) for show in traktShowsUpdate['shows']: logger.debug("[Episodes Sync] Episodes updated: %s" % self.__getShowAsString(show, short=True)) self.sync.UpdateProgress(fromPercent, line1=kodiUtilities.getString(32071), line2=kodiUtilities.getString(32070) % (len(traktShowsUpdate['shows']))) errorcount = 0 i = 0 x = float(len(traktShowsUpdate['shows'])) for show in traktShowsUpdate['shows']: if self.sync.IsCanceled(): return epCount = utilities.countEpisodes([show]) title = show['title'].encode('utf-8', 'ignore') i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=title, line3=kodiUtilities.getString(32073) % epCount) s = {'shows': [show]} logger.debug("[traktUpdateEpisodes] Shows to update %s" % s) try: self.sync.traktapi.addToHistory(s) except Exception as ex: message = utilities.createError(ex) logging.fatal(message) errorcount += 1 logger.debug("[traktUpdateEpisodes] Finished with %d error(s)" % errorcount) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32072) % (len(traktShowsUpdate['shows'])), line3=" ")
def __init__(self, sync, progress): self.sync = sync if not self.sync.show_progress and self.sync.sync_on_update and self.sync.notify and self.sync.notify_during_playback: kodiUtilities.notification( '%s %s' % (kodiUtilities.getString(32045), kodiUtilities.getString(32050)), kodiUtilities.getString(32061)) # Sync started if self.sync.show_progress and not self.sync.run_silent: progress.create("%s %s" % (kodiUtilities.getString(32045), kodiUtilities.getString(32050)), line1=" ", line2=" ", line3=" ") kodiShowsCollected, kodiShowsWatched = self.__kodiLoadShows() if not isinstance(kodiShowsCollected, list) and not kodiShowsCollected: logger.debug( "[Episodes Sync] Kodi collected show list is empty, aborting tv show Sync." ) if self.sync.show_progress and not self.sync.run_silent: progress.close() return if not isinstance(kodiShowsWatched, list) and not kodiShowsWatched: logger.debug( "[Episodes Sync] Kodi watched show list is empty, aborting tv show Sync." ) if self.sync.show_progress and not self.sync.run_silent: progress.close() return traktShowsCollected, traktShowsWatched, traktShowsRated, traktEpisodesRated = self.__traktLoadShows( ) if not traktShowsCollected: logger.debug( "[Episodes Sync] Error getting Trakt.tv collected show list, aborting tv show sync." ) if self.sync.show_progress and not self.sync.run_silent: progress.close() return if not traktShowsWatched: logger.debug( "[Episodes Sync] Error getting Trakt.tv watched show list, aborting tv show sync." ) if self.sync.show_progress and not self.sync.run_silent: progress.close() return traktShowsProgress = self.__traktLoadShowsPlaybackProgress(25, 36) self.__addEpisodesToTraktCollection(kodiShowsCollected, traktShowsCollected, 37, 47) self.__deleteEpisodesFromTraktCollection(traktShowsCollected, kodiShowsCollected, 48, 58) self.__addEpisodesToTraktWatched(kodiShowsWatched, traktShowsWatched, 59, 69) self.__addEpisodesToKodiWatched(traktShowsWatched, kodiShowsWatched, kodiShowsCollected, 70, 80) self.__addEpisodeProgressToKodi(traktShowsProgress, kodiShowsCollected, 81, 91) self.__syncShowsRatings(traktShowsRated, kodiShowsCollected, 92, 95) self.__syncEpisodeRatings(traktEpisodesRated, kodiShowsCollected, 96, 99) if not self.sync.show_progress and self.sync.sync_on_update and self.sync.notify and self.sync.notify_during_playback: kodiUtilities.notification( '%s %s' % (kodiUtilities.getString(32045), kodiUtilities.getString(32050)), kodiUtilities.getString(32062)) # Sync complete if self.sync.show_progress and not self.sync.run_silent: self.sync.UpdateProgress(100, line1=" ", line2=kodiUtilities.getString(32075), line3=" ") progress.close() logger.debug( "[Episodes Sync] Shows on Trakt.tv (%d), shows in Kodi (%d)." % (len(traktShowsCollected['shows']), len( kodiShowsCollected['shows']))) logger.debug( "[Episodes Sync] Episodes on Trakt.tv (%d), episodes in Kodi (%d)." % (utilities.countEpisodes(traktShowsCollected), utilities.countEpisodes(kodiShowsCollected))) logger.debug("[Episodes Sync] Complete.")
def test_countEpisodes2(): data1 = load_params_from_json( 'tests/fixtures/compare_shows_remote_batman_episode.json') assert utilities.countEpisodes(data1) == 5
def test_countEpisodes1(): data1 = load_params_from_json( 'tests/fixtures/compare_shows_local_batman.json') assert utilities.countEpisodes(data1) == 6
def __deleteEpisodesFromTraktCollection(self, traktShows, kodiShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('clean_trakt_episodes') and not self.sync.IsCanceled(): removeTraktShows = copy.deepcopy(traktShows) removeKodiShows = copy.deepcopy(kodiShows) traktShowsRemove = utilities.compareEpisodes( removeTraktShows, removeKodiShows, kodiUtilities.getSettingAsBool("scrobble_fallback")) utilities.sanitizeShows(traktShowsRemove) if len(traktShowsRemove['shows']) == 0: self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString(32077), line2=kodiUtilities.getString(32110)) logger.debug('[Episodes Sync] Trakt.tv episode collection is clean, no episodes to remove.') return logger.debug("[Episodes Sync] %i show(s) will have episodes removed from Trakt.tv collection." % len(traktShowsRemove['shows'])) for show in traktShowsRemove['shows']: logger.debug("[Episodes Sync] Episodes removed: %s" % self.__getShowAsString(show, short=True)) self.sync.UpdateProgress(fromPercent, line1=kodiUtilities.getString(32077), line2=kodiUtilities.getString(32111) % utilities.countEpisodes(traktShowsRemove)) logger.debug("[traktRemoveEpisodes] Shows to remove %s" % traktShowsRemove) try: self.sync.traktapi.removeFromCollection(traktShowsRemove) except Exception as ex: message = utilities.createError(ex) logging.fatal(message) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32112) % utilities.countEpisodes(traktShowsRemove))
def __addEpisodesToTraktCollection(self, kodiShows, traktShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('add_episodes_to_trakt') and not self.sync.IsCanceled(): addTraktShows = copy.deepcopy(traktShows) addKodiShows = copy.deepcopy(kodiShows) tmpTraktShowsAdd = utilities.compareEpisodes( addKodiShows, addTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback")) traktShowsAdd = copy.deepcopy(tmpTraktShowsAdd) utilities.sanitizeShows(traktShowsAdd) # logger.debug("traktShowsAdd %s" % traktShowsAdd) if len(traktShowsAdd['shows']) == 0: self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString(32068), line2=kodiUtilities.getString(32104)) logger.debug("[Episodes Sync] Trakt.tv episode collection is up to date.") return logger.debug("[Episodes Sync] %i show(s) have episodes (%d) to be added to your Trakt.tv collection." % (len(traktShowsAdd['shows']), utilities.countEpisodes(traktShowsAdd))) for show in traktShowsAdd['shows']: logger.debug("[Episodes Sync] Episodes added: %s" % self.__getShowAsString(show, short=True)) self.sync.UpdateProgress(fromPercent, line1=kodiUtilities.getString(32068), line2=kodiUtilities.getString(32067) % (len(traktShowsAdd['shows']))) # split episode list into chunks of 50 chunksize = 1 chunked_episodes = utilities.chunks(traktShowsAdd['shows'], chunksize) errorcount = 0 i = 0 x = float(len(traktShowsAdd['shows'])) for chunk in chunked_episodes: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=kodiUtilities.getString(32069) % ((i) * chunksize if (i) * chunksize < x else x, x)) request = {'shows': chunk} logger.debug("[traktAddEpisodes] Shows to add %s" % request) try: self.sync.traktapi.addToCollection(request) except Exception as ex: message = utilities.createError(ex) logging.fatal(message) errorcount += 1 logger.debug("[traktAddEpisodes] Finished with %d error(s)" % errorcount) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32105) % utilities.countEpisodes(traktShowsAdd))
def __init__(self, sync, progress): self.sync = sync if not self.sync.show_progress and self.sync.sync_on_update and self.sync.notify and self.sync.notify_during_playback: kodiUtilities.notification('%s %s' % (kodiUtilities.getString(32045), kodiUtilities.getString(32050)), kodiUtilities.getString(32061)) # Sync started if self.sync.show_progress and not self.sync.run_silent: progress.create("%s %s" % (kodiUtilities.getString(32045), kodiUtilities.getString(32050)), line1=" ", line2=" ", line3=" ") kodiShowsCollected, kodiShowsWatched = self.__kodiLoadShows() if not isinstance(kodiShowsCollected, list) and not kodiShowsCollected: logger.debug("[Episodes Sync] Kodi collected show list is empty, aborting tv show Sync.") if self.sync.show_progress and not self.sync.run_silent: progress.close() return if not isinstance(kodiShowsWatched, list) and not kodiShowsWatched: logger.debug("[Episodes Sync] Kodi watched show list is empty, aborting tv show Sync.") if self.sync.show_progress and not self.sync.run_silent: progress.close() return traktShowsCollected, traktShowsWatched, traktShowsRated, traktEpisodesRated = self.__traktLoadShows() if not traktShowsCollected: logger.debug("[Episodes Sync] Error getting Trakt.tv collected show list, aborting tv show sync.") if self.sync.show_progress and not self.sync.run_silent: progress.close() return if not traktShowsWatched: logger.debug("[Episodes Sync] Error getting Trakt.tv watched show list, aborting tv show sync.") if self.sync.show_progress and not self.sync.run_silent: progress.close() return traktShowsProgress = self.__traktLoadShowsPlaybackProgress(25, 36) self.__addEpisodesToTraktCollection(kodiShowsCollected, traktShowsCollected, 37, 47) self.__deleteEpisodesFromTraktCollection(traktShowsCollected, kodiShowsCollected, 48, 58) self.__addEpisodesToTraktWatched(kodiShowsWatched, traktShowsWatched, 59, 69) self.__addEpisodesToKodiWatched(traktShowsWatched, kodiShowsWatched, kodiShowsCollected, 70, 80) self.__addEpisodeProgressToKodi(traktShowsProgress, kodiShowsCollected, 81, 91) self.__syncShowsRatings(traktShowsRated, kodiShowsCollected, 92, 95) self.__syncEpisodeRatings(traktEpisodesRated, kodiShowsCollected, 96, 99) if not self.sync.show_progress and self.sync.sync_on_update and self.sync.notify and self.sync.notify_during_playback: kodiUtilities.notification('%s %s' % (kodiUtilities.getString(32045), kodiUtilities.getString(32050)), kodiUtilities.getString(32062)) # Sync complete if self.sync.show_progress and not self.sync.run_silent: self.sync.UpdateProgress(100, line1=" ", line2=kodiUtilities.getString(32075), line3=" ") progress.close() logger.debug("[Episodes Sync] Shows on Trakt.tv (%d), shows in Kodi (%d)." % (len(traktShowsCollected['shows']), len(kodiShowsCollected['shows']))) logger.debug("[Episodes Sync] Episodes on Trakt.tv (%d), episodes in Kodi (%d)." % (utilities.countEpisodes(traktShowsCollected), utilities.countEpisodes(kodiShowsCollected))) logger.debug("[Episodes Sync] Complete.")