Source code for flexget.plugins.operate.version_checker
from datetime import datetime
from loguru import logger
from sqlalchemy import Column, DateTime
from flexget import db_schema, plugin
from flexget.event import event
from flexget.manager import Session
from flexget.utils.tools import get_current_flexget_version, get_latest_flexget_version_number
logger = logger.bind(name='version_checker')
Base = db_schema.versioned_base('version_checker', 0)
[docs]
class LastVersionCheck(Base):
__tablename__ = 'last_version_check'
last_check_time = Column(DateTime, primary_key=True)
def __init__(self):
self.update()
[docs]
def update(self):
self.last_check_time = datetime.now()
schema = {
'oneOf': [
{'type': 'boolean'},
{'type': 'string', 'enum': ['always', 'by_interval']},
{
'type': 'object',
'properties': {
'lookup': {'type': 'string', 'enum': ['always', 'by_interval']},
'check_for_dev_version': {'type': 'boolean'},
'interval': {'type': 'integer'},
},
'additionalProperties': False,
},
]
}
[docs]
class VersionChecker:
"""A plugin that checks whether user is running the latest flexget version and place a log warning if not.
Check via interval to avoid hammering, default is 1 day.
Can accept boolean or ['always', 'by_interval'] in config.
Can also accept object. If check_for_dev_version option is True, version will be checked even if current release
is dev, otherwise, it will be skipped.
"""
[docs]
def prepare_config(self, config):
if isinstance(config, bool) and config is True:
config = {'lookup': 'by_interval'}
elif isinstance(config, str):
config = {'lookup': config}
config.setdefault('lookup', 'by_interval')
config.setdefault('interval', 1)
config.setdefault('check_for_dev_version', False)
return config
[docs]
def on_task_start(self, task, config):
if not config:
return
config = self.prepare_config(config)
current_version = get_current_flexget_version()
if config.get('check_for_dev_version') is False and current_version.endswith('dev'):
logger.debug('dev version detected, skipping check')
return
always_check = bool(config.get('lookup') == 'always')
interval = config.get('interval')
session = Session()
last_check = session.query(LastVersionCheck).first()
if not always_check:
if last_check:
time_dif = datetime.now() - last_check.last_check_time
should_poll = time_dif.days > interval
else:
should_poll = True
if not should_poll:
logger.debug('version check interval not met, skipping check')
return
latest_version = get_latest_flexget_version_number()
if not latest_version:
logger.warning('Could not get latest version of flexget')
return
if latest_version != current_version:
logger.warning(
'You are not running latest Flexget Version. Current is {} and latest is {}',
current_version,
latest_version,
)
if last_check:
logger.debug('updating last check time')
last_check.update()
else:
last_check = LastVersionCheck()
logger.debug('creating instance of last version check in DB')
session.add(last_check)
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(VersionChecker, 'version_checker', api_ver=2)