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
8
from flexget.utils.tools import urlopener
10
log = logging.getLogger('imdb_rated')
15
__tablename__ = 'imdb_rated'
17
id = Column(Integer, primary_key=True)
19
imdb_url = Column(String)
21
added = Column(DateTime)
23
def __init__(self, url, imdb_url):
25
self.imdb_url = imdb_url
26
self.added = datetime.datetime.now()
29
return '<ImdbRated(%s at %s)>' % (self.imdb_url, self.url)
32
class FilterImdbRated(object):
34
Reject already voted entries based on user imdb vote history.
38
imdb_rated: http://www.imdb.com/mymovies/list?l=<YOUR USER ID>
40
Reverse, reject unvoted:
45
url: http://www.imdb.com/mymovies/list?l=<YOUR USER ID>
48
Note: in theory this should work with any other page containing imdb urls.
52
from flexget import validator
53
root = validator.factory()
55
complex = root.accept('dict')
56
complex.accept('url', key='url')
57
complex.accept('boolean', key='reverse')
60
def update_rated(self, feed, config):
61
"""Update my movies list"""
62
# set first last_time into past so we trigger update on first run
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:
67
feed.simple_persistence['next_time'] = datetime.datetime.now() + datetime.timedelta(hours=4)
68
log.debug('updating my movies from %s' % config['url'])
72
# fix imdb html, just enough to pass parser
74
# <td class=list bgcolor="#CCCCCC"} colspan="4">
77
massage.append((re.compile('"}'), lambda match: '"'))
79
# onclick="(new Image()).src='/rg/home/navbar/images/b.gif?link=/'"">IMDb</a>
80
# ^ are you even trying?
82
massage.append((re.compile('/\'""'), lambda match: '/\'"'))
84
# <table class="footer" id="amazon-affiliates"">
85
# ^ ffs, I don't think they are even trying ...
87
massage.append((re.compile('amazon-affiliates""'), lambda match: 'amazon-affiliates"'))
89
data = urlopener(config['url'], log)
90
soup = BeautifulSoup(data, markupMassage=massage)
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)
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:
117
# if no imdb_url perform lookup
118
if not 'imdb_url' in entry:
120
get_plugin_by_name('imdb_lookup').instance.lookup(entry)
122
pass # ignore imdb lookup failures
124
# ignore entries without imdb_url
125
if not 'imdb_url' in entry:
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):
133
# reversed, reject unrated
135
feed.reject(entry, 'imdb rated reverse')
137
# normal mode, reject rated
139
feed.reject(entry, 'imdb rated')
142
register_plugin(FilterImdbRated, 'imdb_rated')