def save_thumbnail(self, ep_obj): """ Retrieves a thumbnail and saves it to the correct spot. This method should not need to be overridden by implementing classes, changing get_episode_thumb_path and _get_episode_thumb_url should suffice. ep_obj: a TVEpisode object for which to generate a thumbnail """ file_path = self.get_episode_thumb_path(ep_obj) if not file_path: sickrage.srLogger.debug("Unable to find a file path to use for this thumbnail, not generating it") return False thumb_url = self._get_episode_thumb_url(ep_obj) # if we can't find one then give up if not thumb_url: sickrage.srLogger.debug("No thumb is available for this episode, not creating a thumb") return False thumb_data = metadata_helpers.getShowImage(thumb_url) result = self._write_image(thumb_data, file_path) if not result: return False for cur_ep in [ep_obj] + ep_obj.relatedEps: cur_ep.hastbn = True return True
def save_season_banners(self, show_obj, season): """ Saves all season banners to disk for the given show. show_obj: a TVShow object for which to save the season thumbs Cycles through all seasons and saves the season banners if possible. This method should not need to be overridden by implementing classes, changing _season_banners_dict and get_season_banner_path should be good enough. """ season_dict = self._season_banners_dict(show_obj, season) result = [] # Returns a nested dictionary of season art with the season # number as primary key. It's really overkill but gives the option # to present to user via ui to pick down the road. for cur_season in season_dict: cur_season_art = season_dict[cur_season] if len(cur_season_art) == 0: continue # Just grab whatever's there for now _, season_url = cur_season_art.popitem() # @UnusedVariable season_banner_file_path = self.get_season_banner_path( show_obj, cur_season) if not season_banner_file_path: sickrage.LOGGER.debug("Path for season " + str(cur_season) + " came back blank, skipping this season") continue seasonData = metadata_helpers.getShowImage(season_url) if not seasonData: sickrage.LOGGER.debug( "No season banner data available, skipping this season") continue result = result + [ self._write_image(seasonData, season_banner_file_path) ] if result: return all(result) else: return False
def save_season_banners(self, show_obj, season): """ Saves all season banners to disk for the given show. show_obj: a TVShow object for which to save the season thumbs Cycles through all seasons and saves the season banners if possible. This method should not need to be overridden by implementing classes, changing _season_banners_dict and get_season_banner_path should be good enough. """ season_dict = self._season_banners_dict(show_obj, season) result = [] # Returns a nested dictionary of season art with the season # number as primary key. It's really overkill but gives the option # to present to user via ui to pick down the road. for cur_season in season_dict: cur_season_art = season_dict[cur_season] if len(cur_season_art) == 0: continue # Just grab whatever's there for now _, season_url = cur_season_art.popitem() # @UnusedVariable season_banner_file_path = self.get_season_banner_path(show_obj, cur_season) if not season_banner_file_path: sickrage.srLogger.debug("Path for season " + str(cur_season) + " came back blank, skipping this season") continue seasonData = metadata_helpers.getShowImage(season_url) if not seasonData: sickrage.srLogger.debug("No season banner data available, skipping this season") continue result = result + [self._write_image(seasonData, season_banner_file_path)] if result: return all(result) else: return False
def save_thumbnail(self, ep_obj): """ Retrieves a thumbnail and saves it to the correct spot. This method should not need to be overridden by implementing classes, changing get_episode_thumb_path and _get_episode_thumb_url should suffice. ep_obj: a TVEpisode object for which to generate a thumbnail """ file_path = self.get_episode_thumb_path(ep_obj) if not file_path: sickrage.LOGGER.debug( "Unable to find a file path to use for this thumbnail, not generating it" ) return False thumb_url = self._get_episode_thumb_url(ep_obj) # if we can't find one then give up if not thumb_url: sickrage.LOGGER.debug( "No thumb is available for this episode, not creating a thumb") return False thumb_data = metadata_helpers.getShowImage(thumb_url) result = self._write_image(thumb_data, file_path) if not result: return False for cur_ep in [ep_obj] + ep_obj.relatedEps: cur_ep.hastbn = True return True
def _retrieve_show_image(self, image_type, show_obj, which=None): """ Gets an image URL from theTVDB.com and TMDB.com, downloads it and returns the data. image_type: type of image to retrieve (currently supported: fanart, poster, banner) show_obj: a TVShow object to use when searching for the image which: optional, a specific numbered poster to look for Returns: the binary image data if available, or else None """ image_url = None indexer_lang = show_obj.lang try: # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere lINDEXER_API_PARMS = sickrage.srCore.INDEXER_API(show_obj.indexer).api_params.copy() lINDEXER_API_PARMS[b'banners'] = True if indexer_lang and not indexer_lang == sickrage.srConfig.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.srCore.INDEXER_API(show_obj.indexer).indexer(**lINDEXER_API_PARMS) indexer_show_obj = t[show_obj.indexerid] except (indexer_error, IOError) as e: sickrage.srLogger.warning("Unable to look up show on " + sickrage.srCore.INDEXER_API( show_obj.indexer).name + ", not downloading images: {}".format(e.message)) sickrage.srLogger.debug("Indexer " + sickrage.srCore.INDEXER_API( show_obj.indexer).name + " maybe experiencing some problems. Try again later") return None if image_type not in ('fanart', 'poster', 'banner', 'poster_thumb', 'banner_thumb'): sickrage.srLogger.error("Invalid image type " + str(image_type) + ", couldn't find it in the " + sickrage.srCore.INDEXER_API( show_obj.indexer).name + " object") return None if image_type == 'poster_thumb': if getattr(indexer_show_obj, 'poster', None): image_url = re.sub('posters', '_cache/posters', indexer_show_obj[b'poster']) if not image_url: # Try and get images from Fanart.TV image_url = self._retrieve_show_images_from_fanart(show_obj, image_type) if not image_url: # Try and get images from TMDB image_url = self._retrieve_show_images_from_tmdb(show_obj, image_type) elif image_type == 'banner_thumb': if getattr(indexer_show_obj, 'banner', None): image_url = re.sub('graphical', '_cache/graphical', indexer_show_obj[b'banner']) if not image_url: # Try and get images from Fanart.TV image_url = self._retrieve_show_images_from_fanart(show_obj, image_type) else: if getattr(indexer_show_obj, image_type, None): image_url = indexer_show_obj[image_type] if not image_url: # Try and get images from Fanart.TV image_url = self._retrieve_show_images_from_fanart(show_obj, image_type) if not image_url: # Try and get images from TMDB image_url = self._retrieve_show_images_from_tmdb(show_obj, image_type) if image_url: image_data = metadata_helpers.getShowImage(image_url, which) return image_data return None
def _retrieve_show_image(self, image_type, show_obj, which=None): """ Gets an image URL from theTVDB.com and TMDB.com, downloads it and returns the data. image_type: type of image to retrieve (currently supported: fanart, poster, banner) show_obj: a TVShow object to use when searching for the image which: optional, a specific numbered poster to look for Returns: the binary image data if available, or else None """ image_url = None indexer_lang = show_obj.lang try: # There's gotta be a better way of doing this but we don't wanna # change the language value elsewhere lINDEXER_API_PARMS = sickrage.INDEXER_API( show_obj.indexer).api_params.copy() lINDEXER_API_PARMS[b'banners'] = True if indexer_lang and not indexer_lang == sickrage.INDEXER_DEFAULT_LANGUAGE: lINDEXER_API_PARMS[b'language'] = indexer_lang if show_obj.dvdorder != 0: lINDEXER_API_PARMS[b'dvdorder'] = True t = sickrage.INDEXER_API( show_obj.indexer).indexer(**lINDEXER_API_PARMS) indexer_show_obj = t[show_obj.indexerid] except (indexer_error, IOError) as e: sickrage.LOGGER.warning( "Unable to look up show on " + sickrage.INDEXER_API(show_obj.indexer).name + ", not downloading images: {}".format(e)) sickrage.LOGGER.debug( "Indexer " + sickrage.INDEXER_API(show_obj.indexer).name + " maybe experiencing some problems. Try again later") return None if image_type not in ('fanart', 'poster', 'banner', 'poster_thumb', 'banner_thumb'): sickrage.LOGGER.error("Invalid image type " + str(image_type) + ", couldn't find it in the " + sickrage.INDEXER_API(show_obj.indexer).name + " object") return None if image_type == 'poster_thumb': if getattr(indexer_show_obj, 'poster', None): image_url = re.sub('posters', '_cache/posters', indexer_show_obj[b'poster']) if not image_url: # Try and get images from Fanart.TV image_url = self._retrieve_show_images_from_fanart( show_obj, image_type) if not image_url: # Try and get images from TMDB image_url = self._retrieve_show_images_from_tmdb( show_obj, image_type) elif image_type == 'banner_thumb': if getattr(indexer_show_obj, 'banner', None): image_url = re.sub('graphical', '_cache/graphical', indexer_show_obj[b'banner']) if not image_url: # Try and get images from Fanart.TV image_url = self._retrieve_show_images_from_fanart( show_obj, image_type) else: if getattr(indexer_show_obj, image_type, None): image_url = indexer_show_obj[image_type] if not image_url: # Try and get images from Fanart.TV image_url = self._retrieve_show_images_from_fanart( show_obj, image_type) if not image_url: # Try and get images from TMDB image_url = self._retrieve_show_images_from_tmdb( show_obj, image_type) if image_url: image_data = metadata_helpers.getShowImage(image_url, which) return image_data return None