def __addMoviesToKodiWatched(self, traktMovies, kodiMovies, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('kodi_movie_playcount') and not self.sync.IsCanceled(): updateKodiTraktMovies = copy.deepcopy(traktMovies) updateKodiKodiMovies = copy.deepcopy(kodiMovies) kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies, updateKodiKodiMovies, kodiUtilities.getSettingAsBool( "scrobble_fallback"), watched=True, restrict=True) if len(kodiMoviesToUpdate) == 0: self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32088)) logger.debug("[Movies Sync] Kodi movie playcount is up to date.") return titles = ", ".join(["%s" % (m['title']) for m in kodiMoviesToUpdate]) logger.debug("[Movies Sync] %i movie(s) playcount will be updated in Kodi" % len(kodiMoviesToUpdate)) logger.debug("[Movies Sync] Movies to add: %s" % titles) self.sync.UpdateProgress(fromPercent, line2=kodiUtilities.getString(32065) % len(kodiMoviesToUpdate)) # split movie list into chunks of 50 chunksize = 50 chunked_movies = utilities.chunks([{"jsonrpc": "2.0", "method": "VideoLibrary.SetMovieDetails", "params": {"movieid": kodiMoviesToUpdate[i]['movieid'], "playcount": kodiMoviesToUpdate[i]['plays'], "lastplayed": utilities.convertUtcToDateTime(kodiMoviesToUpdate[i]['last_watched_at'])}, "id": i} for i in range(len(kodiMoviesToUpdate))], chunksize) i = 0 x = float(len(kodiMoviesToUpdate)) for chunk in chunked_movies: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=kodiUtilities.getString(32089) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32090) % len(kodiMoviesToUpdate))
def __syncEpisodeRatings(self, traktShows, kodiShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_sync_ratings') and traktShows and not self.sync.IsCanceled(): updateKodiTraktShows = copy.deepcopy(traktShows) updateKodiKodiShows = copy.deepcopy(kodiShows) traktShowsToUpdate = utilities.compareEpisodes( updateKodiKodiShows, updateKodiTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback"), rating=True) if len(traktShowsToUpdate['shows']) == 0: self.sync.UpdateProgress( toPercent, line1='', line2=kodiUtilities.getString(32181)) logger.debug( "[Episodes Sync] Trakt episode ratings are up to date.") else: logger.debug("[Episodes Sync] %i show(s) will have episode ratings added on Trakt" % len( traktShowsToUpdate['shows'])) self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString( 32182) % len(traktShowsToUpdate['shows'])) self.sync.traktapi.addRating(traktShowsToUpdate) kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, kodiUtilities.getSettingAsBool( "scrobble_fallback"), restrict=True, rating=True) if len(kodiShowsUpdate['shows']) == 0: self.sync.UpdateProgress( toPercent, line1='', line2=kodiUtilities.getString(32173)) logger.debug( "[Episodes Sync] Kodi episode ratings are up to date.") else: logger.debug("[Episodes Sync] %i show(s) will have episode ratings added in Kodi" % len( kodiShowsUpdate['shows'])) for s in ["%s" % self.__getShowAsString(s, short=True) for s in kodiShowsUpdate['shows']]: logger.debug("[Episodes Sync] Episodes updated: %s" % s) episodes = [] for show in kodiShowsUpdate['shows']: for season in show['seasons']: for episode in season['episodes']: episodes.append( {'episodeid': episode['ids']['episodeid'], 'rating': episode['rating']}) # split episode list into chunks of 50 chunksize = 50 chunked_episodes = utilities.chunks([{"jsonrpc": "2.0", "id": i, "method": "VideoLibrary.SetEpisodeDetails", "params": {"episodeid": episodes[i]['episodeid'], "userrating": episodes[i]['rating']}} for i in range(len(episodes))], chunksize) i = 0 x = float(len(episodes)) for chunk in chunked_episodes: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line1='', line2=kodiUtilities.getString( 32174) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress( toPercent, line2=kodiUtilities.getString(32175) % len(episodes))
def __addMovieProgressToKodi(self, traktMovies, kodiMovies, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_movie_playback') and traktMovies and not self.sync.IsCanceled(): updateKodiTraktMovies = copy.deepcopy(traktMovies) updateKodiKodiMovies = copy.deepcopy(kodiMovies) kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies['movies'], updateKodiKodiMovies, kodiUtilities.getSettingAsBool("scrobble_fallback"), restrict=True, playback=True) if len(kodiMoviesToUpdate) == 0: self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32125)) logger.debug("[Movies Sync] Kodi movie playbacks are up to date.") return logger.debug("[Movies Sync] %i movie(s) playbacks will be updated in Kodi" % len(kodiMoviesToUpdate)) self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString(32126) % len(kodiMoviesToUpdate)) # need to calculate the progress in int from progress in percent from Trakt # split movie list into chunks of 50 chunksize = 50 chunked_movies = utilities.chunks([{"jsonrpc": "2.0", "id": i, "method": "VideoLibrary.SetMovieDetails", "params": {"movieid": kodiMoviesToUpdate[i]['movieid'], "resume": {"position": kodiMoviesToUpdate[i]['runtime'] / 100.0 * kodiMoviesToUpdate[i]['progress'], "total": kodiMoviesToUpdate[i]['runtime']}}} for i in range(len(kodiMoviesToUpdate))], chunksize) i = 0 x = float(len(kodiMoviesToUpdate)) for chunk in chunked_movies: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=kodiUtilities.getString(32127) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32128) % len(kodiMoviesToUpdate))
def __syncShowsRatings(self, traktShows, kodiShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_sync_ratings') and traktShows and not self.sync.IsCanceled(): updateKodiTraktShows = copy.deepcopy(traktShows) updateKodiKodiShows = copy.deepcopy(kodiShows) traktShowsToUpdate = utilities.compareShows( updateKodiKodiShows, updateKodiTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback"), rating=True) if len(traktShowsToUpdate['shows']) == 0: self.sync.UpdateProgress( toPercent, line1='', line2=kodiUtilities.getString(32181)) logger.debug( "[Episodes Sync] Trakt show ratings are up to date.") else: logger.debug("[Episodes Sync] %i show(s) will have show ratings added on Trakt" % len( traktShowsToUpdate['shows'])) self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString( 32182) % len(traktShowsToUpdate['shows'])) self.sync.traktapi.addRating(traktShowsToUpdate) # needs to be restricted, because we can't add a rating to an episode which is not in our Kodi collection kodiShowsUpdate = utilities.compareShows(updateKodiTraktShows, updateKodiKodiShows, kodiUtilities.getSettingAsBool( "scrobble_fallback"), rating=True, restrict=True) if len(kodiShowsUpdate['shows']) == 0: self.sync.UpdateProgress( toPercent, line1='', line2=kodiUtilities.getString(32176)) logger.debug( "[Episodes Sync] Kodi show ratings are up to date.") else: logger.debug("[Episodes Sync] %i show(s) will have show ratings added in Kodi" % len( kodiShowsUpdate['shows'])) shows = [] for show in kodiShowsUpdate['shows']: shows.append( {'tvshowid': show['tvshowid'], 'rating': show['rating']}) # split episode list into chunks of 50 chunksize = 50 chunked_episodes = utilities.chunks([{"jsonrpc": "2.0", "id": i, "method": "VideoLibrary.SetTVShowDetails", "params": {"tvshowid": shows[i]['tvshowid'], "userrating": shows[i]['rating']}} for i in range(len(shows))], chunksize) i = 0 x = float(len(shows)) for chunk in chunked_episodes: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line1='', line2=kodiUtilities.getString( 32177) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress( toPercent, line2=kodiUtilities.getString(32178) % len(shows))
def __addMoviesToTraktWatched(self, kodiMovies, traktMovies, fromPercent, toPercent): if kodiUtilities.getSettingAsBool( 'trakt_movie_playcount') and not self.sync.IsCanceled(): updateTraktTraktMovies = copy.deepcopy(traktMovies) updateTraktKodiMovies = copy.deepcopy(kodiMovies) traktMoviesToUpdate = utilities.compareMovies( updateTraktKodiMovies, updateTraktTraktMovies, watched=True) utilities.sanitizeMovies(traktMoviesToUpdate) if len(traktMoviesToUpdate) == 0: self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32086)) logger.debug( "[Movies Sync] Trakt.tv movie playcount is up to date") return titles = ", ".join( ["%s" % (m['title']) for m in traktMoviesToUpdate]) logger.debug( "[Movies Sync] %i movie(s) playcount will be updated on Trakt.tv" % len(traktMoviesToUpdate)) logger.debug("[Movies Sync] Movies updated: %s" % titles) self.sync.UpdateProgress(fromPercent, line2=kodiUtilities.getString(32064) % len(traktMoviesToUpdate)) # Send request to update playcounts on Trakt.tv chunksize = 200 chunked_movies = utilities.chunks( [movie for movie in traktMoviesToUpdate], chunksize) errorcount = 0 i = 0 x = float(len(traktMoviesToUpdate)) for chunk in chunked_movies: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent - fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=kodiUtilities.getString(32093) % ((i) * chunksize if (i) * chunksize < x else x, x)) params = {'movies': chunk} # logger.debug("moviechunk: %s" % params) try: self.sync.traktapi.addToHistory(params) except Exception as ex: message = utilities.createError(ex) logging.fatal(message) errorcount += 1 logger.debug("[Movies Sync] Movies updated: %d error(s)" % errorcount) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32087) % len(traktMoviesToUpdate))
def __syncMovieRatings(self, traktMovies, kodiMovies, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_sync_ratings') and traktMovies and not self.sync.IsCanceled(): updateKodiTraktMovies = copy.deepcopy(traktMovies) updateKodiKodiMovies = copy.deepcopy(kodiMovies) traktMoviesToUpdate = utilities.compareMovies( updateKodiKodiMovies, updateKodiTraktMovies, kodiUtilities.getSettingAsBool("scrobble_fallback"), rating=True) if len(traktMoviesToUpdate) == 0: self.sync.UpdateProgress( toPercent, line1='', line2=kodiUtilities.getString(32179)) logger.debug( "[Movies Sync] Trakt movie ratings are up to date.") else: logger.debug("[Movies Sync] %i movie(s) ratings will be updated on Trakt" % len( traktMoviesToUpdate)) self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString( 32180) % len(traktMoviesToUpdate)) moviesRatings = {'movies': traktMoviesToUpdate} self.sync.traktapi.addRating(moviesRatings) kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies, updateKodiKodiMovies, kodiUtilities.getSettingAsBool( "scrobble_fallback"), restrict=True, rating=True) if len(kodiMoviesToUpdate) == 0: self.sync.UpdateProgress( toPercent, line1='', line2=kodiUtilities.getString(32169)) logger.debug( "[Movies Sync] Kodi movie ratings are up to date.") else: logger.debug("[Movies Sync] %i movie(s) ratings will be updated in Kodi" % len( kodiMoviesToUpdate)) self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString( 32170) % len(kodiMoviesToUpdate)) # split movie list into chunks of 50 chunksize = 50 chunked_movies = utilities.chunks([{"jsonrpc": "2.0", "id": i, "method": "VideoLibrary.SetMovieDetails", "params": {"movieid": kodiMoviesToUpdate[i]['movieid'], "userrating": kodiMoviesToUpdate[i]['rating']}} for i in range(len(kodiMoviesToUpdate))], chunksize) i = 0 x = float(len(kodiMoviesToUpdate)) for chunk in chunked_movies: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=kodiUtilities.getString( 32171) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString( 32172) % len(kodiMoviesToUpdate))
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 __syncEpisodeRatings(self, traktShows, kodiShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_sync_ratings') and traktShows and not self.sync.IsCanceled(): updateKodiTraktShows = copy.deepcopy(traktShows) updateKodiKodiShows = copy.deepcopy(kodiShows) traktShowsToUpdate = utilities.compareEpisodes( updateKodiKodiShows, updateKodiTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback"), rating=True) if len(traktShowsToUpdate['shows']) == 0: self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32181)) logger.debug("[Episodes Sync] Trakt episode ratings are up to date.") else: logger.debug("[Episodes Sync] %i show(s) will have episode ratings added on Trakt" % len(traktShowsToUpdate['shows'])) self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString(32182) % len(traktShowsToUpdate['shows'])) self.sync.traktapi.addRating(traktShowsToUpdate) kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, kodiUtilities.getSettingAsBool( "scrobble_fallback"), restrict=True, rating=True) if len(kodiShowsUpdate['shows']) == 0: self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32173)) logger.debug("[Episodes Sync] Kodi episode ratings are up to date.") else: logger.debug("[Episodes Sync] %i show(s) will have episode ratings added in Kodi" % len(kodiShowsUpdate['shows'])) for s in ["%s" % self.__getShowAsString(s, short=True) for s in kodiShowsUpdate['shows']]: logger.debug("[Episodes Sync] Episodes updated: %s" % s) episodes = [] for show in kodiShowsUpdate['shows']: for season in show['seasons']: for episode in season['episodes']: episodes.append({'episodeid': episode['ids']['episodeid'], 'rating': episode['rating']}) # split episode list into chunks of 50 chunksize = 50 chunked_episodes = utilities.chunks([{"jsonrpc": "2.0", "id": i, "method": "VideoLibrary.SetEpisodeDetails", "params": {"episodeid": episodes[i]['episodeid'], "userrating": episodes[i]['rating']}} for i in range(len(episodes))], chunksize) i = 0 x = float(len(episodes)) for chunk in chunked_episodes: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line1='', line2=kodiUtilities.getString(32174) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32175) % len(episodes))
def __addEpisodeProgressToKodi(self, traktShows, kodiShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_episode_playback') and traktShows and not self.sync.IsCanceled(): updateKodiTraktShows = copy.deepcopy(traktShows) updateKodiKodiShows = copy.deepcopy(kodiShows) kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, kodiUtilities.getSettingAsBool( "scrobble_fallback"), restrict=True, playback=True) if len(kodiShowsUpdate['shows']) == 0: self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString( 1441), line2=kodiUtilities.getString(32129)) logger.debug( "[Episodes Sync] Kodi episode progress is up to date.") return logger.debug("[Episodes Sync] %i show(s) shows are missing progress in Kodi" % len( kodiShowsUpdate['shows'])) for s in ["%s" % self.__getShowAsString(s, short=True) for s in kodiShowsUpdate['shows']]: logger.debug("[Episodes Sync] Episodes updated: %s" % s) episodes = [] for show in kodiShowsUpdate['shows']: for season in show['seasons']: for episode in season['episodes']: # If library item doesn't have a runtime set get it from # Trakt to avoid later using 0 in runtime * progress_pct. if not episode['runtime']: episode['runtime'] = self.sync.traktapi.getEpisodeSummary( show['ids']['trakt'], season['number'], episode['number'], extended='full').runtime episodes.append( {'episodeid': episode['ids']['episodeid'], 'progress': episode['progress'], 'runtime': episode['runtime']}) # need to calculate the progress in int from progress in percent from Trakt # split episode list into chunks of 50 chunksize = 50 chunked_episodes = utilities.chunks([{"jsonrpc": "2.0", "id": i, "method": "VideoLibrary.SetEpisodeDetails", "params": {"episodeid": episode['episodeid'], "resume": { "position": episode['runtime'] / 100.0 * episode['progress'], "total": episode['runtime']}}} for episode in episodes if episode['runtime'] > 0], chunksize) i = 0 x = float(len(episodes)) 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( 32130) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress( toPercent, line2=kodiUtilities.getString(32131) % len(episodes))
def __addEpisodesToKodiWatched(self, traktShows, kodiShows, kodiShowsCollected, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('kodi_episode_playcount') and not self.sync.IsCanceled(): updateKodiTraktShows = copy.deepcopy(traktShows) updateKodiKodiShows = copy.deepcopy(kodiShows) kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, kodiUtilities.getSettingAsBool( "scrobble_fallback"), watched=True, restrict=True, collected=kodiShowsCollected) if len(kodiShowsUpdate['shows']) == 0: self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString( 32074), line2=kodiUtilities.getString(32107)) logger.debug( "[Episodes Sync] Kodi episode playcounts are up to date.") return logger.debug("[Episodes Sync] %i show(s) shows are missing playcounts on Kodi" % len( kodiShowsUpdate['shows'])) for s in ["%s" % self.__getShowAsString(s, short=True) for s in kodiShowsUpdate['shows']]: logger.debug("[Episodes Sync] Episodes updated: %s" % s) # logger.debug("kodiShowsUpdate: %s" % kodiShowsUpdate) episodes = [] for show in kodiShowsUpdate['shows']: for season in show['seasons']: for episode in season['episodes']: episodes.append({'episodeid': episode['ids']['episodeid'], 'playcount': episode['plays'], "lastplayed": utilities.convertUtcToDateTime(episode['last_watched_at'])}) # split episode list into chunks of 50 chunksize = 50 chunked_episodes = utilities.chunks( [{"jsonrpc": "2.0", "method": "VideoLibrary.SetEpisodeDetails", "params": episodes[i], "id": i} for i in range(len(episodes))], chunksize) i = 0 x = float(len(episodes)) 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( 32108) % ((i) * chunksize if (i) * chunksize < x else x, x)) logger.debug("[Episodes Sync] chunk %s" % str(chunk)) result = kodiUtilities.kodiJsonRequest(chunk) logger.debug("[Episodes Sync] result %s" % str(result)) self.sync.UpdateProgress( toPercent, line2=kodiUtilities.getString(32109) % len(episodes))
def __syncShowsRatings(self, traktShows, kodiShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_sync_ratings') and traktShows and not self.sync.IsCanceled(): updateKodiTraktShows = copy.deepcopy(traktShows) updateKodiKodiShows = copy.deepcopy(kodiShows) traktShowsToUpdate = self.__compareShows(updateKodiKodiShows, updateKodiTraktShows, rating=True) if len(traktShowsToUpdate['shows']) == 0: self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32181)) logger.debug("[Episodes Sync] Trakt show ratings are up to date.") else: logger.debug("[Episodes Sync] %i show(s) will have show ratings added on Trakt" % len(traktShowsToUpdate['shows'])) self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString(32182) % len(traktShowsToUpdate['shows'])) self.sync.traktapi.addRating(traktShowsToUpdate) # needs to be restricted, because we can't add a rating to an episode which is not in our Kodi collection kodiShowsUpdate = self.__compareShows(updateKodiTraktShows, updateKodiKodiShows, rating=True, restrict = True) if len(kodiShowsUpdate['shows']) == 0: self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32176)) logger.debug("[Episodes Sync] Kodi show ratings are up to date.") else: logger.debug("[Episodes Sync] %i show(s) will have show ratings added in Kodi" % len(kodiShowsUpdate['shows'])) shows = [] for show in kodiShowsUpdate['shows']: shows.append({'tvshowid': show['tvshowid'], 'rating': show['rating']}) # split episode list into chunks of 50 chunksize = 50 chunked_episodes = utilities.chunks([{"jsonrpc": "2.0", "id": i, "method": "VideoLibrary.SetTVShowDetails", "params": {"tvshowid": shows[i]['tvshowid'], "userrating": shows[i]['rating']}} for i in range(len(shows))], chunksize) i = 0 x = float(len(shows)) for chunk in chunked_episodes: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line1='', line2=kodiUtilities.getString(32177) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32178) % len(shows))
def __syncMovieRatings(self, traktMovies, kodiMovies, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_sync_ratings') and traktMovies and not self.sync.IsCanceled(): updateKodiTraktMovies = copy.deepcopy(traktMovies) updateKodiKodiMovies = copy.deepcopy(kodiMovies) traktMoviesToUpdate = utilities.compareMovies(updateKodiKodiMovies, updateKodiTraktMovies, kodiUtilities.getSettingAsBool("scrobble_fallback"), rating=True) if len(traktMoviesToUpdate) == 0: self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32179)) logger.debug("[Movies Sync] Trakt movie ratings are up to date.") else: logger.debug("[Movies Sync] %i movie(s) ratings will be updated on Trakt" % len(traktMoviesToUpdate)) self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString(32180) % len(traktMoviesToUpdate)) moviesRatings = {'movies': traktMoviesToUpdate} self.sync.traktapi.addRating(moviesRatings) kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies, updateKodiKodiMovies, kodiUtilities.getSettingAsBool( "scrobble_fallback"), restrict=True, rating=True) if len(kodiMoviesToUpdate) == 0: self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32169)) logger.debug("[Movies Sync] Kodi movie ratings are up to date.") else: logger.debug("[Movies Sync] %i movie(s) ratings will be updated in Kodi" % len(kodiMoviesToUpdate)) self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString(32170) % len(kodiMoviesToUpdate)) # split movie list into chunks of 50 chunksize = 50 chunked_movies = utilities.chunks([{"jsonrpc": "2.0", "id": i, "method": "VideoLibrary.SetMovieDetails", "params": {"movieid": kodiMoviesToUpdate[i]['movieid'], "userrating": kodiMoviesToUpdate[i]['rating']}} for i in range(len(kodiMoviesToUpdate))], chunksize) i = 0 x = float(len(kodiMoviesToUpdate)) for chunk in chunked_movies: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=kodiUtilities.getString(32171) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32172) % len(kodiMoviesToUpdate))
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 __addMoviesToKodiWatched(self, traktMovies, kodiMovies, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('kodi_movie_playcount') and not self.sync.IsCanceled(): updateKodiTraktMovies = copy.deepcopy(traktMovies) updateKodiKodiMovies = copy.deepcopy(kodiMovies) kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies, updateKodiKodiMovies, kodiUtilities.getSettingAsBool( "scrobble_fallback"), watched=True, restrict=True) if len(kodiMoviesToUpdate) == 0: self.sync.UpdateProgress( toPercent, line2=kodiUtilities.getString(32088)) logger.debug( "[Movies Sync] Kodi movie playcount is up to date.") return titles = ", ".join(["%s" % (m['title']) for m in kodiMoviesToUpdate]) logger.debug("[Movies Sync] %i movie(s) playcount will be updated in Kodi" % len( kodiMoviesToUpdate)) logger.debug("[Movies Sync] Movies to add: %s" % titles) self.sync.UpdateProgress(fromPercent, line2=kodiUtilities.getString( 32065) % len(kodiMoviesToUpdate)) # split movie list into chunks of 50 chunksize = 50 chunked_movies = utilities.chunks([{"jsonrpc": "2.0", "method": "VideoLibrary.SetMovieDetails", "params": {"movieid": kodiMoviesToUpdate[i]['movieid'], "playcount": kodiMoviesToUpdate[i] ['plays'], "lastplayed": utilities.convertUtcToDateTime(kodiMoviesToUpdate[i]['last_watched_at'])}, "id": i} for i in range(len(kodiMoviesToUpdate))], chunksize) i = 0 x = float(len(kodiMoviesToUpdate)) for chunk in chunked_movies: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=kodiUtilities.getString( 32089) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString( 32090) % len(kodiMoviesToUpdate))
def __addMoviesToTraktWatched(self, kodiMovies, traktMovies, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_movie_playcount') and not self.sync.IsCanceled(): updateTraktTraktMovies = copy.deepcopy(traktMovies) updateTraktKodiMovies = copy.deepcopy(kodiMovies) traktMoviesToUpdate = utilities.compareMovies(updateTraktKodiMovies, updateTraktTraktMovies, kodiUtilities.getSettingAsBool("scrobble_fallback"), watched=True) utilities.sanitizeMovies(traktMoviesToUpdate) if len(traktMoviesToUpdate) == 0: self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32086)) logger.debug("[Movies Sync] Trakt.tv movie playcount is up to date") return titles = ", ".join(["%s" % (m['title']) for m in traktMoviesToUpdate]) logger.debug("[Movies Sync] %i movie(s) playcount will be updated on Trakt.tv" % len(traktMoviesToUpdate)) logger.debug("[Movies Sync] Movies updated: %s" % titles) self.sync.UpdateProgress(fromPercent, line2=kodiUtilities.getString(32064) % len(traktMoviesToUpdate)) # Send request to update playcounts on Trakt.tv chunksize = 200 chunked_movies = utilities.chunks([movie for movie in traktMoviesToUpdate], chunksize) errorcount = 0 i = 0 x = float(len(traktMoviesToUpdate)) for chunk in chunked_movies: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=kodiUtilities.getString(32093) % ((i) * chunksize if (i) * chunksize < x else x, x)) params = {'movies': chunk} # logger.debug("moviechunk: %s" % params) try: self.sync.traktapi.addToHistory(params) except Exception as ex: message = utilities.createError(ex) logging.fatal(message) errorcount += 1 logger.debug("[Movies Sync] Movies updated: %d error(s)" % errorcount) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32087) % len(traktMoviesToUpdate))
def __addEpisodesToKodiWatched(self, traktShows, kodiShows, kodiShowsCollected, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('kodi_episode_playcount') and not self.sync.IsCanceled(): updateKodiTraktShows = copy.deepcopy(traktShows) updateKodiKodiShows = copy.deepcopy(kodiShows) kodiShowsUpdate = self.__compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, watched=True, restrict=True, collected=kodiShowsCollected) if len(kodiShowsUpdate['shows']) == 0: self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString(32074), line2=kodiUtilities.getString(32107)) logger.debug("[Episodes Sync] Kodi episode playcounts are up to date.") return logger.debug("[Episodes Sync] %i show(s) shows are missing playcounts on Kodi" % len(kodiShowsUpdate['shows'])) for s in ["%s" % self.__getShowAsString(s, short=True) for s in kodiShowsUpdate['shows']]: logger.debug("[Episodes Sync] Episodes updated: %s" % s) # logger.debug("kodiShowsUpdate: %s" % kodiShowsUpdate) episodes = [] for show in kodiShowsUpdate['shows']: for season in show['seasons']: for episode in season['episodes']: episodes.append({'episodeid': episode['ids']['episodeid'], 'playcount': episode['plays'], "lastplayed": utilities.convertUtcToDateTime(episode['last_watched_at'])}) # split episode list into chunks of 50 chunksize = 50 chunked_episodes = utilities.chunks([{"jsonrpc": "2.0", "method": "VideoLibrary.SetEpisodeDetails", "params": episodes[i], "id": i} for i in range(len(episodes))], chunksize) i = 0 x = float(len(episodes)) 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(32108) % ((i) * chunksize if (i) * chunksize < x else x, x)) logger.debug("[Episodes Sync] chunk %s" % str(chunk)) result = kodiUtilities.kodiJsonRequest(chunk) logger.debug("[Episodes Sync] result %s" % str(result)) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32109) % len(episodes))
def __addEpisodeProgressToKodi(self, traktShows, kodiShows, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_episode_playback') and traktShows and not self.sync.IsCanceled(): updateKodiTraktShows = copy.deepcopy(traktShows) updateKodiKodiShows = copy.deepcopy(kodiShows) kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, kodiUtilities.getSettingAsBool( "scrobble_fallback"), restrict=True, playback=True) if len(kodiShowsUpdate['shows']) == 0: self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString(1441), line2=kodiUtilities.getString(32129)) logger.debug("[Episodes Sync] Kodi episode playbacks are up to date.") return logger.debug("[Episodes Sync] %i show(s) shows are missing playbacks on Kodi" % len(kodiShowsUpdate['shows'])) for s in ["%s" % self.__getShowAsString(s, short=True) for s in kodiShowsUpdate['shows']]: logger.debug("[Episodes Sync] Episodes updated: %s" % s) episodes = [] for show in kodiShowsUpdate['shows']: for season in show['seasons']: for episode in season['episodes']: episodes.append({'episodeid': episode['ids']['episodeid'], 'progress': episode['progress'], 'runtime': episode['runtime']}) # need to calculate the progress in int from progress in percent from Trakt # split episode list into chunks of 50 chunksize = 50 chunked_episodes = utilities.chunks([{"jsonrpc": "2.0", "id": i, "method": "VideoLibrary.SetEpisodeDetails", "params": {"episodeid":episodes[i]['episodeid'], "resume": {"position": episodes[i]['runtime'] / 100.0 * episodes[i]['progress'], "total": episodes[i]['runtime']}}} for i in range(len(episodes))], chunksize) i = 0 x = float(len(episodes)) 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(32130) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32131) % len(episodes))
def __addMovieProgressToKodi(self, traktMovies, kodiMovies, fromPercent, toPercent): if kodiUtilities.getSettingAsBool('trakt_movie_playback') and traktMovies and not self.sync.IsCanceled(): updateKodiTraktMovies = copy.deepcopy(traktMovies) updateKodiKodiMovies = copy.deepcopy(kodiMovies) kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies['movies'], updateKodiKodiMovies, kodiUtilities.getSettingAsBool( "scrobble_fallback"), restrict=True, playback=True) if len(kodiMoviesToUpdate) == 0: self.sync.UpdateProgress( toPercent, line1='', line2=kodiUtilities.getString(32125)) logger.debug( "[Movies Sync] Kodi movie progress is up to date.") return logger.debug("[Movies Sync] %i movie(s) progress will be updated in Kodi" % len( kodiMoviesToUpdate)) self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString( 32126) % len(kodiMoviesToUpdate)) # need to calculate the progress in int from progress in percent from Trakt # split movie list into chunks of 50 chunksize = 50 chunked_movies = utilities.chunks([{"jsonrpc": "2.0", "id": i, "method": "VideoLibrary.SetMovieDetails", "params": {"movieid": kodiMoviesToUpdate[i]['movieid'], "resume": { "position": kodiMoviesToUpdate[i]['runtime'] / 100.0 * kodiMoviesToUpdate[i]['progress'], "total": kodiMoviesToUpdate[i]['runtime']}}} for i in range(len(kodiMoviesToUpdate)) if kodiMoviesToUpdate[i]['runtime'] > 0], chunksize) i = 0 x = float(len(kodiMoviesToUpdate)) for chunk in chunked_movies: if self.sync.IsCanceled(): return i += 1 y = ((i / x) * (toPercent-fromPercent)) + fromPercent self.sync.UpdateProgress(int(y), line2=kodiUtilities.getString( 32127) % ((i) * chunksize if (i) * chunksize < x else x, x)) kodiUtilities.kodiJsonRequest(chunk) self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString( 32128) % len(kodiMoviesToUpdate))
def test_chunks(): movies = load_params_from_json('tests/fixtures/movies.json') assert len(utilities.chunks(movies, 1)) == 3