flexget.plugins.filter_imdb_rated
Covered: 35 lines
Missed: 55 lines
Skipped 50 lines
Percent: 38 %
  1
import logging
  2
from flexget.plugin import register_plugin, PluginError, get_plugin_by_name
  3
from BeautifulSoup import BeautifulSoup
  4
from flexget.manager import Base
  5
from sqlalchemy import Column, Integer, Float, String, DateTime
  6
import re
  7
import datetime
  8
from flexget.utils.tools import urlopener
 10
log = logging.getLogger('imdb_rated')
 13
class ImdbRated(Base):
 15
    __tablename__ = 'imdb_rated'
 17
    id = Column(Integer, primary_key=True)
 18
    url = Column(String)
 19
    imdb_url = Column(String)
 20
    score = Column(Float)
 21
    added = Column(DateTime)
 23
    def __init__(self, url, imdb_url):
 24
        self.url = url
 25
        self.imdb_url = imdb_url
 26
        self.added = datetime.datetime.now()
 28
    def __str__(self):
 29
        return '<ImdbRated(%s at %s)>' % (self.imdb_url, self.url)
 32
class FilterImdbRated(object):
 33
    """
 34
        Reject already voted entries based on user imdb vote history.
 36
        Example:
 38
        imdb_rated: http://www.imdb.com/mymovies/list?l=<YOUR USER ID>
 40
        Reverse, reject unvoted:
 42
        Example:
 44
        imdb_rated:
 45
          url: http://www.imdb.com/mymovies/list?l=<YOUR USER ID>
 46
          reverse: yes
 48
        Note: in theory this should work with any other page containing imdb urls.
 49
    """
 51
    def validator(self):
 52
        from flexget import validator
 53
        root = validator.factory()
 54
        root.accept('url')
 55
        complex = root.accept('dict')
 56
        complex.accept('url', key='url')
 57
        complex.accept('boolean', key='reverse')
 58
        return root
 60
    def update_rated(self, feed, config):
 61
        """Update my movies list"""
 63
        next_time = feed.simple_persistence.setdefault('next_time', datetime.datetime.min)
 64
        log.debug('next_time: %s' % next_time)
 65
        if not datetime.datetime.now() > next_time:
 66
            return
 67
        feed.simple_persistence.set('next_time', datetime.datetime.now() + datetime.timedelta(hours=4))
 68
        log.debug('updating my movies from %s' % config['url'])
 70
        massage = []
 77
        massage.append((re.compile('"}'), lambda match: '"'))
 82
        massage.append((re.compile('/\'""'), lambda match: '/\'"'))
 87
        massage.append((re.compile('amazon-affiliates""'), lambda match: 'amazon-affiliates"'))
 89
        data = urlopener(config['url'], log)
 90
        soup = BeautifulSoup(data, markupMassage=massage)
 92
        count = 0
 93
        for a_imdb_link in soup.findAll('a', attrs={'href': re.compile(r'/title/tt\d+')}):
 94
            imdb_url = 'http://www.imdb.com%s' % a_imdb_link.get('href')
 96
            if not feed.session.query(ImdbRated).filter(ImdbRated.url == config['url']).\
 97
                                                 filter(ImdbRated.imdb_url == imdb_url).first():
 98
                rated = ImdbRated(config['url'], imdb_url)
 99
                feed.session.add(rated)
100
                log.debug('adding %s' % rated)
101
                count += 1
103
        if count > 0:
104
            log.info('Added %s new movies' % count)
106
    def on_feed_filter(self, feed):
107
        config = feed.config['imdb_rated']
108
        if isinstance(config, basestring):
109
            config = {'url': feed.config['imdb_rated']}
111
        self.update_rated(feed, config)
112
        for entry in feed.entries:
115
            if not 'imdb_url' in entry:
116
                try:
117
                    get_plugin_by_name('imdb_lookup').instance.lookup(feed, entry)
118
                except PluginError:
119
                    pass # ignore imdb lookup failures
122
            if not 'imdb_url' in entry:
123
                continue
125
            is_rated = feed.session.query(ImdbRated).\
126
                       filter(ImdbRated.url == config['url']).\
127
                       filter(ImdbRated.imdb_url == entry['imdb_url']).first() is not None
129
            if config.get('reverse', False):
131
                if not is_rated:
132
                    feed.reject(entry, 'imdb rated reverse')
133
            else:
135
                if is_rated:
136
                    feed.reject(entry, 'imdb rated')
139
register_plugin(FilterImdbRated, 'imdb_rated')