Source code for flexget.plugins.services.pogcal_acquired

import re
from datetime import datetime

from loguru import logger
from sqlalchemy import Column, Integer, Unicode

from flexget import plugin
from flexget.db_schema import versioned_base
from flexget.event import event
from flexget.utils import requests
from flexget.utils.parsers.generic import name_to_re
from flexget.utils.soup import get_soup

logger = logger.bind(name='pogcal_acquired')
Base = versioned_base('pogcal_acquired', 0)
session = requests.Session(max_retries=3)


[docs] class PogcalShow(Base): __tablename__ = 'pogcal_shows' id = Column(Integer, primary_key=True, autoincrement=False, nullable=False) name = Column(Unicode)
[docs] class PogcalAcquired: schema = { 'type': 'object', 'properties': {'username': {'type': 'string'}, 'password': {'type': 'string'}}, 'required': ['username', 'password'], 'additionalProperties': False, }
[docs] @plugin.priority(plugin.PRIORITY_LAST) def on_task_output(self, task, config): if not task.accepted and not task.options.test: return try: result = session.post( 'http://www.pogdesign.co.uk/cat/login', data={ 'username': config['username'], 'password': config['password'], 'sub_login': 'Account Login', }, ) except requests.RequestException as e: logger.error('Error logging in to pog calendar: {}', e) return if 'logout' not in result.text: logger.error('Username/password for pogdesign calendar appear to be incorrect.') return if task.options.test: logger.verbose('Successfully logged in to pogdesign calendar.') for entry in task.accepted: if not entry.get('series_name') or entry.get('series_id_type') != 'ep': continue show_id = self.find_show_id(entry['series_name'], task.session) if not show_id: logger.debug('Could not find pogdesign calendar id for `{}`', entry['series_name']) continue if task.options.test: logger.verbose( 'Would mark {} {} in pogdesign calenadar.', entry['series_name'], entry['series_id'], ) continue logger.verbose( 'Marking {} {} in pogdesign calenadar.', entry['series_name'], entry['series_id'], ) shid = '{}-{}-{}/{}-{}'.format( show_id, entry['series_season'], entry['series_episode'], datetime.now().month, datetime.now().year, ) try: session.post( 'http://www.pogdesign.co.uk/cat/watchhandle', data={'watched': 'adding', 'shid': shid}, ) except requests.RequestException as e: logger.error( 'Error marking {} {} in pogdesign calendar: {}', entry['series_name'], entry['series_id'], e, )
[docs] def find_show_id(self, show_name, db_sess): # Check if we have this show id cached show_name = show_name.lower() db_show = db_sess.query(PogcalShow).filter(PogcalShow.name == show_name).first() if db_show: return db_show.id try: page = session.get('http://www.pogdesign.co.uk/cat/showselect.php') except requests.RequestException as e: logger.error('Error looking up show show list from pogdesign calendar: {}', e) return None # Try to find the show id from pogdesign show list show_re = name_to_re(show_name) soup = get_soup(page.content) search = re.compile(show_re, flags=re.IGNORECASE) show = soup.find(text=search) if show: id = int(show.find_previous('input')['value']) db_sess.add(PogcalShow(id=id, name=show_name)) return id logger.verbose('Could not find pogdesign calendar id for show `{}`', show_re) return None
[docs] @event('plugin.register') def register_plugin(): plugin.register(PogcalAcquired, 'pogcal_acquired', api_ver=2)