def _rotate_logs(self): sb_logger = logging.getLogger('sickbeard') sub_logger = logging.getLogger('subliminal') imdb_logger = logging.getLogger('imdbpy') tornado_logger = logging.getLogger('tornado') feedcache_logger = logging.getLogger('feedcache') # delete the old handler if self.cur_handler: self.close_log() # rename or delete all the old log files for i in range(self._num_logs(), -1, -1): cur_file_name = self._log_file_name(i) try: if i >= NUM_LOGS: if sickbeard.TRASH_ROTATE_LOGS: new_name = '%s.%s' % (cur_file_name, int(time.time())) os.rename(cur_file_name, new_name) send2trash(new_name) else: os.remove(cur_file_name) else: os.rename(cur_file_name, self._log_file_name(i + 1)) except OSError: pass # the new log handler will always be on the un-numbered .log file new_file_handler = self._config_handler() self.cur_handler = new_file_handler sb_logger.addHandler(new_file_handler) sub_logger.addHandler(new_file_handler) imdb_logger.addHandler(new_file_handler) tornado_logger.addHandler(new_file_handler) feedcache_logger.addHandler(new_file_handler)
def delete_logfile(filepath): if os.path.exists(filepath): if sickbeard.TRASH_ROTATE_LOGS: send2trash(filepath) else: sickbeard.helpers.remove_file_failed(filepath)
def fill_cache(self, show_obj, force=False): """ Caches all images for the given show. Copies them from the show dir if possible, or downloads them from indexer if they aren't in the show dir. show_obj: TVShow object to cache images for """ show_id = '%s' % show_obj.indexerid # check if any images are cached need_images = { self.POSTER: not self.has_poster(show_id), self.BANNER: not self.has_banner(show_id), self.FANART: 0 < sickbeard.FANART_LIMIT and (force or not self.has_fanart(show_id + '.001.*')), # use limit? shows less than a limit of say 50 would fail to fulfill images every day # '.%03d.*' % sickbeard.FANART_LIMIT self.POSTER_THUMB: not self.has_poster_thumbnail(show_id), self.BANNER_THUMB: not self.has_banner_thumbnail(show_id) } if not any(need_images.values()): logger.log(u'%s: No new cache images needed. Done.' % show_id) return void = False if not void and need_images[self.FANART]: action = ('delete', 'trash')[sickbeard.TRASH_REMOVE_SHOW] cache_path = self.fanart_path(show_id).replace( '%s.fanart.jpg' % show_id, '') # num_images = len(fnmatch.filter(os.listdir(cache_path), '*.jpg')) for cache_dir in ek.ek(glob.glob, cache_path): if show_id in sickbeard.FANART_RATINGS: del (sickbeard.FANART_RATINGS[show_id]) logger.log( u'Attempt to %s purge cache file %s' % (action, cache_dir), logger.DEBUG) try: if sickbeard.TRASH_REMOVE_SHOW: send2trash(cache_dir) else: shutil.rmtree(cache_dir) except OSError as e: logger.log( u'Unable to %s %s: %s / %s' % (action, cache_dir, repr(e), str(e)), logger.WARNING) try: checked_files = [] crcs = [] for cur_provider in sickbeard.metadata_provider_dict.values(): # check the show dir for poster or banner images and use them needed = [] if any([need_images[self.POSTER], need_images[self.BANNER]]): needed += [[False, cur_provider.get_poster_path(show_obj)]] if need_images[self.FANART]: needed += [[True, cur_provider.get_fanart_path(show_obj)]] if 0 == len(needed): break logger.log( u'Checking for images from optional %s metadata' % cur_provider.name, logger.DEBUG) for all_meta_provs, path_file in needed: if path_file in checked_files: continue checked_files += [path_file] if ek.ek(os.path.isfile, path_file): cache_file_name = os.path.abspath(path_file) with open(cache_file_name, mode='rb') as resource: crc = '%05X' % (zlib.crc32(resource.read()) & 0xFFFFFFFF) if crc in crcs: continue crcs += [crc] cur_file_type = self.which_type(cache_file_name) if None is cur_file_type: continue logger.log( u'Checking if image %s (type %s needs metadata: %s)' % (cache_file_name, str(cur_file_type), ('No', 'Yes')[True is need_images[cur_file_type]]), logger.DEBUG) if need_images.get(cur_file_type): need_images[cur_file_type] = (( need_images[cur_file_type] + 1, 1)[isinstance( need_images[cur_file_type], bool)], False)[not all_meta_provs] if self.FANART == cur_file_type and \ (not sickbeard.FANART_LIMIT or sickbeard.FANART_LIMIT < need_images[cur_file_type]): continue logger.log( u'Caching image found in the show directory to the image cache: %s, type %s' % (cache_file_name, cur_file_type), logger.DEBUG) self._cache_image_from_file( cache_file_name, cur_file_type, '%s%s' % (show_id, ('.%03d' % need_images[cur_file_type], '')[isinstance(need_images[cur_file_type], bool)])) except exceptions.ShowDirNotFoundException: logger.log( u'Unable to search for images in show directory because it doesn\'t exist', logger.WARNING) # download missing ones from indexer for image_type, name_type in [[self.POSTER, 'Poster'], [self.BANNER, 'Banner'], [self.FANART, 'Fanart'], [self.POSTER_THUMB, 'Poster Thumb'], [self.BANNER_THUMB, 'Banner Thumb']]: max_files = (500, sickbeard.FANART_LIMIT)[self.FANART == image_type] if not max_files or max_files < need_images[image_type]: continue logger.log( u'Seeing if we still need an image of type %s: %s' % (name_type, ('No', 'Yes')[True is need_images[image_type]]), logger.DEBUG) if need_images[image_type]: file_num = (need_images[image_type] + 1, 1)[isinstance(need_images[image_type], bool)] if file_num <= max_files: self._cache_image_from_indexer(show_obj, image_type, file_num, max_files) logger.log(u'Done cache check')