flexget.plugins.filter_content_size
Covered: 50 lines
Missed: 0 lines
Skipped 15 lines
Percent: 100 %
 1
import logging
 2
from sys import maxint
 3
from sqlalchemy import Column, Integer, DateTime, Unicode, Boolean
 4
from datetime import datetime
 5
from flexget.plugin import register_plugin, priority
 6
from flexget.manager import Base
 7
from flexget.utils.log import log_once
 9
log = logging.getLogger('content_size')
12
class FilterContentSize(object):
14
    def validator(self):
15
        from flexget import validator
16
        config = validator.factory('dict')
17
        config.accept('number', key='min')
18
        config.accept('number', key='max')
19
        config.accept('boolean', key='strict')
20
        return config
22
    def process_entry(self, feed, entry):
23
        """Rejects this entry if it does not pass content_size requirements. Returns true if the entry was rejected."""
24
        config = feed.config.get('content_size', {})
25
        if 'content_size' in entry:
26
            size = entry['content_size']
27
            log.debug('%s size %s MB' % (entry['title'], size))
30
            if size < config.get('min', 0):
31
                log_once('Entry `%s` too small, rejecting' % entry['title'], log)
32
                feed.reject(entry, 'minimum size %s MB, got %s MB' % (config['min'], size), remember=True)
33
                return True
34
            if size > config.get('max', maxint):
35
                log_once('Entry `%s` too big, rejecting' % entry['title'], log)
36
                feed.reject(entry, 'maximum size %s MB, got %s MB' % (config['max'], size), remember=True)
37
                return True
39
    @priority(150)
40
    def on_feed_modify(self, feed):
41
        if feed.manager.options.test or feed.manager.options.learn:
42
            log.info('Plugin is partially disabled with --test and --learn because size information may not be available')
43
            return
45
        config = feed.config.get('content_size', {})
46
        num_rejected = len(feed.rejected)
47
        for entry in feed.accepted:
48
            if 'content_size' in entry:
49
                self.process_entry(feed, entry)
50
            elif config.get('strict', True):
51
                log.debug('Entry %s size is unknown, rejecting because of strict mode (default)' % entry['title'])
52
                log.info('No size information available for %s, rejecting' % entry['title'])
53
                if not 'file' in entry:
54
                    feed.reject(entry, 'no size available, file unavailable', remember=True)
55
                else:
56
                    feed.reject(entry, 'no size available from downloaded file', remember=True)
58
        if len(feed.rejected) > num_rejected:
61
            feed.rerun()
64
register_plugin(FilterContentSize, 'content_size')