flexget.plugins.module_interval
Covered: 34 lines
Missed: 7 lines
Skipped 12 lines
Percent: 82 %
 1
import logging
 2
import datetime
 3
from flexget.plugin import *
 5
log = logging.getLogger('interval')
 8
class PluginInterval:
10
    """
11
        Allows specifying minimum interval for feed execution.
13
        Format: [n] [minutes|hours|days|months]
15
        Example:
17
        interval: 7 days
18
    """
20
    def validator(self):
21
        from flexget import validator
22
        root = validator.factory('regexp_match')
23
        root.accept('\d+ (minutes|hours|days|weeks)')
24
        return root
26
    def on_feed_start(self, feed):
27
        if feed.manager.options.interval_ignore or feed.manager.options.learn:
28
            log.info('Ignoring feed %s interval' % feed.name)
29
            return
30
        last_time = feed.simple_persistence.setdefault('last_time', datetime.datetime.now())
31
        log.debug('last_time: %s' % repr(last_time))
32
        amount, unit = feed.config.get('interval').split(' ')
33
        log.debug('amount: %s unit: %s' % (repr(amount), repr(unit)))
34
        params = {unit: int(amount)}
35
        try:
36
            next_time = last_time + datetime.timedelta(**params)
37
        except TypeError:
38
            raise PluginWarning('Invalid time format', log)
39
        log.debug('next_time: %s' % repr(next_time))
40
        if datetime.datetime.now() < next_time:
41
            log.debug('interval not met')
42
            feed.verbose_progress('Interval %s not met on feed %s. Use --now to override.' % (feed.config.get('interval'), feed.name), log)
44
            feed.session.commit()
45
            feed.abort(silent=True)
46
        else:
47
            log.debug('interval passed')
48
            feed.simple_persistence.set('last_time', datetime.datetime.now())
50
register_plugin(PluginInterval, 'interval')
51
register_parser_option('--now', action='store_true', dest='interval_ignore', default=False,
52
                       help='Ignore interval(s)')