コード例 #1
0
    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)
コード例 #2
0
 def delete_logfile(filepath):
     if os.path.exists(filepath):
         if sickbeard.TRASH_ROTATE_LOGS:
             send2trash(filepath)
         else:
             sickbeard.helpers.remove_file_failed(filepath)
コード例 #3
0
    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')