flexget.plugins.filter.imdb_rated
Covered: 36 lines
Missed: 55 lines
Skipped 52 lines
Percent: 39 %
  1
import logging
  2
from flexget.plugin import register_plugin, PluginWarning, 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['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
        raise PluginWarning('This plugin no longer works with the imdb, replacement will be implemented soon')
110
        config = feed.config['imdb_rated']
111
        if isinstance(config, basestring):
112
            config = {'url': feed.config['imdb_rated']}
114
        self.update_rated(feed, config)
115
        for entry in feed.entries:
118
            if not 'imdb_url' in entry:
119
                try:
120
                    get_plugin_by_name('imdb_lookup').instance.lookup(entry)
121
                except PluginError:
122
                    pass # ignore imdb lookup failures
125
            if not 'imdb_url' in entry:
126
                continue
128
            is_rated = feed.session.query(ImdbRated).\
129
                       filter(ImdbRated.url == config['url']).\
130
                       filter(ImdbRated.imdb_url == entry['imdb_url']).first() is not None
132
            if config.get('reverse', False):
134
                if not is_rated:
135
                    feed.reject(entry, 'imdb rated reverse')
136
            else:
138
                if is_rated:
139
                    feed.reject(entry, 'imdb rated')
142
register_plugin(FilterImdbRated, 'imdb_rated')