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):
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')
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))
28
# Avoid confusion by printing a reject message to info log, as
29
# download plugin has already printed a downloading message.
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)
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)
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')
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)
56
feed.reject(entry, 'no size available from downloaded file', remember=True)
58
if len(feed.rejected) > num_rejected:
59
# Since we are rejecting after the filter event,
60
# re-run this feed to see if there is an alternate entry to accept
64
register_plugin(FilterContentSize, 'content_size')