Source code for flexget.components.series.internal_estimator
from datetime import timedelta
from loguru import logger
from sqlalchemy import desc, func
from flexget import plugin
from flexget.event import event
from flexget.manager import Session
from flexget.utils.tools import multiply_timedelta
from . import db
logger = logger.bind(name='est_series_internal')
[docs]
class EstimatesSeriesInternal:
[docs]
@plugin.priority(0) # Should always be last priority
def estimate(self, entry):
if not all(field in entry for field in ['series_name', 'series_season', 'series_episode']):
return None
with Session() as session:
series = (
session.query(db.Series).filter(db.Series.name == entry['series_name']).first()
)
if not series:
return None
episodes = (
session
.query(db.Episode)
.join(db.Episode.series)
.filter(db.Episode.season.is_not(None))
.filter(db.Series.id == series.id)
.filter(db.Episode.season == func.max(db.Episode.season).select())
.order_by(desc(db.Episode.number))
.limit(2)
.all()
)
if len(episodes) < 2:
return None
# If last two eps were not contiguous, don't guess
if episodes[0].number != episodes[1].number + 1:
return None
# If first_seen in None, return
if episodes[0].first_seen is None or episodes[1].first_seen is None:
return None
last_diff = episodes[0].first_seen - episodes[1].first_seen
# If last eps were grabbed close together, we might be catching up, don't guess
# Or, if last eps were too far apart, don't guess
# TODO: What range?
if last_diff < timedelta(days=2) or last_diff > timedelta(days=10):
return None
# Estimate next season somewhat more than a normal episode break
if entry['series_season'] > episodes[0].season:
# TODO: How big should this be?
return episodes[0].first_seen + multiply_timedelta(last_diff, 2)
# Estimate next episode comes out about same length as last ep span, with a little leeway
return episodes[0].first_seen + multiply_timedelta(last_diff, 0.9)
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(
EstimatesSeriesInternal, 'est_series_internal', interfaces=['estimate_release'], api_ver=2
)