def test_notify(self, username, blacklist_name=None): """ Sends a test notification to trakt with the given authentication info and returns a boolean representing success. api: The api string to use username: The username to use blacklist_name: slug of trakt list used to hide not interested show Returns: True if the request succeeded, False otherwise """ try: trakt_api = TraktAPI(sickrage.srCore.srConfig.SSL_VERIFY, sickrage.srCore.srConfig.TRAKT_TIMEOUT) trakt_api.validateAccount() if blacklist_name and blacklist_name is not None: trakt_lists = trakt_api.traktRequest("users/" + username + "/lists") found = False for trakt_list in trakt_lists: if (trakt_list['ids']['slug'] == blacklist_name): return "Test notice sent successfully to Trakt" if not found: return "Trakt blacklist doesn't exists" else: return "Test notice sent successfully to Trakt" except (traktException, traktAuthException, traktServerBusy) as e: sickrage.srCore.srLogger.warning("Could not connect to Trakt service: %s" % e) return "Test notice failed to Trakt: %s" % e
def run(self, force=False): if self.amActive: return self.amActive = True # set thread name threading.currentThread().setName(self.name) # init trakt api self.trakt_api = TraktAPI(sickrage.srCore.srConfig.SSL_VERIFY, sickrage.srCore.srConfig.TRAKT_TIMEOUT) # add shows from tv watchlist if sickrage.srCore.srConfig.TRAKT_SYNC_WATCHLIST: self.todoWanted = [] # its about to all get re-added if len(sickrage.srCore.srConfig.ROOT_DIRS.split('|')) < 2: sickrage.srCore.srLogger.warning("No default root directory") return try: self.syncWatchlist() except Exception: sickrage.srCore.srLogger.debug(traceback.format_exc()) try: # sync tv library with sickrage library self.syncLibrary() except Exception: sickrage.srCore.srLogger.debug(traceback.format_exc()) self.amActive = False
def __init__(self, *args, **kwargs): self.name = "TRAKTSEARCHER" self.trakt_api = TraktAPI(sickrage.SSL_VERIFY, sickrage.TRAKT_TIMEOUT) self.todoBacklog = [] self.todoWanted = [] self.ShowWatchlist = {} self.EpisodeWatchlist = {} self.Collectionlist = {} self.amActive = False
def update_library(self, ep_obj): """ Sends a request to trakt indicating that the given episode is part of our library. ep_obj: The TVEpisode object to add to trakt """ trakt_id = srIndexerApi(ep_obj.show.indexer).config['trakt_id'] trakt_api = TraktAPI(sickrage.srCore.srConfig.SSL_VERIFY, sickrage.srCore.srConfig.TRAKT_TIMEOUT) if sickrage.srCore.srConfig.USE_TRAKT: try: # URL parameters data = { 'shows': [{ 'title': ep_obj.show.name, 'year': ep_obj.show.startyear, 'ids': {}, }] } if trakt_id == 'tvdb_id': data['shows'][0]['ids']['tvdb'] = ep_obj.show.indexerid else: data['shows'][0]['ids']['tvrage'] = ep_obj.show.indexerid if sickrage.srCore.srConfig.TRAKT_SYNC_WATCHLIST: if sickrage.srCore.srConfig.TRAKT_REMOVE_SERIESLIST: trakt_api.traktRequest("sync/watchlist/remove", data, method='POST') # Add Season and Episode + Related Episodes data['shows'][0]['seasons'] = [{ 'number': ep_obj.season, 'episodes': [] }] for relEp_Obj in [ep_obj] + ep_obj.relatedEps: data['shows'][0]['seasons'][0]['episodes'].append( {'number': relEp_Obj.episode}) if sickrage.srCore.srConfig.TRAKT_SYNC_WATCHLIST: if sickrage.srCore.srConfig.TRAKT_REMOVE_WATCHLIST: trakt_api.traktRequest("sync/watchlist/remove", data, method='POST') # update library trakt_api.traktRequest("sync/collection", data, method='POST') except (traktException, traktAuthException, traktServerBusy) as e: sickrage.srCore.srLogger.warning( "Could not connect to Trakt service: %s" % e)
def run(self): sickrage.srCore.srLogger.info("Started adding show {}".format( self.show_name)) index_name = srIndexerApi(self.indexer).name # make sure the Indexer IDs are valid try: lINDEXER_API_PARMS = srIndexerApi(self.indexer).api_params.copy() if self.lang: lINDEXER_API_PARMS['language'] = self.lang sickrage.srCore.srLogger.info("{}: {}".format( index_name, repr(lINDEXER_API_PARMS))) t = srIndexerApi(self.indexer).indexer(**lINDEXER_API_PARMS) s = t[self.indexer_id] if not s: return self._finishEarly() # this usually only happens if they have an NFO in their show dir which gave us a Indexer ID that has no proper english version of the show if not getattr(s, 'seriesname'): sickrage.srCore.srLogger.error( "Show in {} has no name on {}, probably the wrong language used to search with" .format(self.showDir, index_name)) sickrage.srCore.srNotifications.error( "Unable to add show", "Show in {} has no name on {}, probably the wrong language. Delete .nfo and add manually in the correct language" .format(self.showDir, index_name)) return self._finishEarly() # if the show has no episodes/seasons if not len(s): sickrage.srCore.srLogger.error( "Show " + str(s['seriesname']) + " is on " + str(srIndexerApi(self.indexer).name) + " but contains no season/episode data.") sickrage.srCore.srNotifications.error( "Unable to add show", "Show " + str(s['seriesname']) + " is on " + str(srIndexerApi(self.indexer).name) + " but contains no season/episode data.") return self._finishEarly() except Exception as e: sickrage.srCore.srLogger.error( "{}: Error while loading information from indexer {}. Error: {}" .format(self.indexer_id, index_name, e.message)) sickrage.srCore.srNotifications.error( "Unable to add show", "Unable to look up the show in {} on {} using ID {}, not using the NFO. Delete .nfo and try adding manually again." .format(self.showDir, index_name, self.indexer_id)) if sickrage.srCore.srConfig.USE_TRAKT: trakt_id = srIndexerApi(self.indexer).config['trakt_id'] trakt_api = TraktAPI(sickrage.srCore.srConfig.SSL_VERIFY, sickrage.srCore.srConfig.TRAKT_TIMEOUT) title = self.showDir.split("/")[-1] data = {'shows': [{'title': title, 'ids': {}}]} if trakt_id == 'tvdb_id': data['shows'][0]['ids']['tvdb'] = self.indexer_id else: data['shows'][0]['ids']['tvrage'] = self.indexer_id trakt_api.traktRequest("sync/watchlist/remove", data, method='POST') return self._finishEarly() try: self.show = TVShow(self.indexer, self.indexer_id, self.lang) self.show.loadFromIndexer() # set up initial values self.show.location = self.showDir self.show.subtitles = self.subtitles or sickrage.srCore.srConfig.SUBTITLES_DEFAULT self.show.quality = self.quality or sickrage.srCore.srConfig.QUALITY_DEFAULT self.show.flatten_folders = self.flatten_folders or sickrage.srCore.srConfig.FLATTEN_FOLDERS_DEFAULT self.show.anime = self.anime or sickrage.srCore.srConfig.ANIME_DEFAULT self.show.scene = self.scene or sickrage.srCore.srConfig.SCENE_DEFAULT self.show.archive_firstmatch = self.archive or sickrage.srCore.srConfig.ARCHIVE_DEFAULT self.show.paused = self.paused or False # set up default new/missing episode status sickrage.srCore.srLogger.info( "Setting all current episodes to the specified default status: " + str(self.default_status)) self.show.default_ep_status = self.default_status if self.show.anime: self.show.release_groups = BlackAndWhiteList( self.show.indexerid) if self.blacklist: self.show.release_groups.set_black_keywords(self.blacklist) if self.whitelist: self.show.release_groups.set_white_keywords(self.whitelist) # # be smartish about this # if self.show.genre and "talk show" in self.show.genre.lower(): # self.show.air_by_date = 1 # if self.show.genre and "documentary" in self.show.genre.lower(): # self.show.air_by_date = 0 # if self.show.classification and "sports" in self.show.classification.lower(): # self.show.sports = 1 except indexer_exception as e: sickrage.srCore.srLogger.error( "Unable to add show due to an error with " + srIndexerApi(self.indexer).name + ": {}".format(e.message)) if self.show: sickrage.srCore.srNotifications.error( "Unable to add " + str(self.show.name) + " due to an error with " + srIndexerApi(self.indexer).name + "") else: sickrage.srCore.srNotifications.error( "Unable to add show due to an error with " + srIndexerApi(self.indexer).name + "") return self._finishEarly() except MultipleShowObjectsException: sickrage.srCore.srLogger.warning( "The show in " + self.showDir + " is already in your show list, skipping") sickrage.srCore.srNotifications.error( 'Show skipped', "The show in " + self.showDir + " is already in your show list") return self._finishEarly() except Exception as e: sickrage.srCore.srLogger.error( "Error trying to add show: {}".format(e.message)) sickrage.srCore.srLogger.debug(traceback.format_exc()) raise self._finishEarly() try: sickrage.srCore.srLogger.debug( "Attempting to retrieve show info from IMDb") self.show.loadIMDbInfo() except Exception as e: sickrage.srCore.srLogger.error( "Error loading IMDb info: {}".format(e.message)) # Load XEM data to DB for show xem_refresh(self.show.indexerid, self.show.indexer, force=True) # check if show has XEM mapping so we can determin if searches should go by scene numbering or indexer numbering. if not self.scene and get_xem_numbering_for_show( self.show.indexerid, self.show.indexer): self.show.scene = 1 try: self.show.saveToDB() except Exception as e: sickrage.srCore.srLogger.error( "Error saving the show to the database: {}".format(e.message)) sickrage.srCore.srLogger.debug(traceback.format_exc()) raise self._finishEarly() # add it to the show list sickrage.srCore.SHOWLIST.append(self.show) try: self.show.loadEpisodesFromIndexer() except Exception as e: sickrage.srCore.srLogger.error( "Error with " + srIndexerApi(self.show.indexer).name + ", not creating episode list: {}".format(e.message)) sickrage.srCore.srLogger.debug(traceback.format_exc()) try: self.show.loadEpisodesFromDir() except Exception as e: sickrage.srCore.srLogger.debug( "Error searching dir for episodes: {}".format(e.message)) sickrage.srCore.srLogger.debug(traceback.format_exc()) # if they set default ep status to WANTED then run the backlog to search for episodes if self.show.default_ep_status == WANTED: sickrage.srCore.srLogger.info( "Launching backlog for this show since its episodes are WANTED" ) sickrage.srCore.BACKLOGSEARCHER.searchBacklog([self.show]) self.show.writeMetadata() self.show.updateMetadata() self.show.populateCache() if sickrage.srCore.srConfig.USE_TRAKT: # if there are specific episodes that need to be added by trakt sickrage.srCore.TRAKTSEARCHER.manageNewShow(self.show) # add show to trakt.tv library if sickrage.srCore.srConfig.TRAKT_SYNC: sickrage.srCore.TRAKTSEARCHER.addShowToTraktLibrary(self.show) if sickrage.srCore.srConfig.TRAKT_SYNC_WATCHLIST: sickrage.srCore.srLogger.info("update watchlist") sickrage.srCore.notifiersDict.trakt_notifier.update_watchlist( show_obj=self.show) # After initial add, set to default_status_after. sickrage.srCore.srLogger.info( "Setting all future episodes to the specified default status: " + str(self.default_status_after)) self.show.default_ep_status = self.default_status_after self.show.saveToDB() sickrage.srCore.NAMECACHE.build(self.show) self.finish() sickrage.srCore.srLogger.info("Finished adding show {}".format( self.showDir))
def update_watchlist(self, show_obj=None, s=None, e=None, data_show=None, data_episode=None, update="add"): """ Sends a request to trakt indicating that the given episode is part of our library. show_obj: The TVShow object to add to trakt s: season number e: episode number data_show: structured object of shows traktv type data_episode: structured object of episodes traktv type update: type o action add or remove """ trakt_api = TraktAPI(sickrage.srCore.srConfig.SSL_VERIFY, sickrage.srCore.srConfig.TRAKT_TIMEOUT) if sickrage.srCore.srConfig.USE_TRAKT: data = {} try: # URL parameters if show_obj is not None: trakt_id = srIndexerApi(show_obj.indexer).config['trakt_id'] data = { 'shows': [ { 'title': show_obj.name, 'year': show_obj.startyear, 'ids': {}, } ] } if trakt_id == 'tvdb_id': data['shows'][0]['ids']['tvdb'] = show_obj.indexerid else: data['shows'][0]['ids']['tvrage'] = show_obj.indexerid elif data_show is not None: data.update(data_show) else: sickrage.srCore.srLogger.warning( "there's a coding problem contact developer. It's needed to be provided at lest one of the two: data_show or show_obj") return False if data_episode is not None: data['shows'][0].update(data_episode) elif s is not None: # traktv URL parameters season = { 'season': [ { 'number': s, } ] } if e is not None: # traktv URL parameters episode = { 'episodes': [ { 'number': e } ] } season['season'][0].update(episode) data['shows'][0].update(season) trakt_url = "sync/watchlist" if update == "remove": trakt_url += "/remove" trakt_api.traktRequest(trakt_url, data, method='POST') except (traktException, traktAuthException, traktServerBusy) as e: sickrage.srCore.srLogger.warning("Could not connect to Trakt service: %s" % e) return False return True
def trakt_api(self): return TraktAPI(sickrage.srCore.srConfig.SSL_VERIFY, sickrage.srCore.srConfig.TRAKT_TIMEOUT)