You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
4.5 KiB

13 years ago
from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.encoding import tryUrlencode
from couchpotato.core.helpers.variable import tryInt, tryFloat, splitString
14 years ago
from couchpotato.core.logger import CPLog
from couchpotato.core.providers.info.base import MovieProvider
13 years ago
import json
import re
13 years ago
import traceback
14 years ago
log = CPLog(__name__)
13 years ago
class OMDBAPI(MovieProvider):
14 years ago
urls = {
13 years ago
'search': 'http://www.omdbapi.com/?%s',
'info': 'http://www.omdbapi.com/?i=%s',
14 years ago
}
http_time_between_calls = 0
14 years ago
def __init__(self):
addEvent('info.search', self.search)
addEvent('movie.search', self.search)
addEvent('movie.info', self.getInfo)
14 years ago
def search(self, q, limit = 12):
13 years ago
name_year = fireEvent('scanner.name_year', q, single = True)
14 years ago
if not name_year or (name_year and not name_year.get('name')):
name_year = {
'name': q
}
13 years ago
cache_key = 'omdbapi.cache.%s' % q
cached = self.getCache(cache_key, self.urls['search'] % tryUrlencode({'t': name_year.get('name'), 'y': name_year.get('year', '')}), timeout = 3)
14 years ago
if cached:
result = self.parseMovie(cached)
if result.get('titles') and len(result.get('titles')) > 0:
log.info('Found: %s', result['titles'][0] + ' (' + str(result['year']) + ')')
return [result]
return []
14 years ago
return []
14 years ago
def getInfo(self, identifier = None, **kwargs):
14 years ago
if not identifier:
return {}
13 years ago
cache_key = 'omdbapi.cache.%s' % identifier
cached = self.getCache(cache_key, self.urls['info'] % identifier, timeout = 3)
14 years ago
if cached:
result = self.parseMovie(cached)
if result.get('titles') and len(result.get('titles')) > 0:
log.info('Found: %s', result['titles'][0] + ' (' + str(result['year']) + ')')
return result
14 years ago
return {}
14 years ago
def parseMovie(self, movie):
13 years ago
movie_data = {}
14 years ago
try:
13 years ago
try:
if isinstance(movie, (str, unicode)):
movie = json.loads(movie)
except ValueError:
log.info('No proper json to decode')
return movie_data
13 years ago
if movie.get('Response') == 'Parse Error' or movie.get('Response') == 'False':
return movie_data
tmp_movie = movie.copy()
for key in tmp_movie:
if tmp_movie.get(key).lower() == 'n/a':
del movie[key]
# Ignore series from omdbapi for now, should we use this in the future?
if movie.get('Type') == "series":
return
year = tryInt(movie.get('Year', ''))
13 years ago
movie_data = {
'type': 'movie',
'via_imdb': True,
'titles': [movie.get('Title')] if movie.get('Title') else [],
'original_title': movie.get('Title'),
13 years ago
'images': {
'poster': [movie.get('Poster', '')] if movie.get('Poster') and len(movie.get('Poster', '')) > 4 else [],
13 years ago
},
'rating': {
'imdb': (tryFloat(movie.get('imdbRating', 0)), tryInt(movie.get('imdbVotes', '').replace(',', ''))),
#'rotten': (tryFloat(movie.get('tomatoRating', 0)), tryInt(movie.get('tomatoReviews', '').replace(',', ''))),
13 years ago
},
'imdb': str(movie.get('imdbID', '')),
'mpaa': str(movie.get('Rated', '')),
'runtime': self.runtimeToMinutes(movie.get('Runtime', '')),
'released': movie.get('Released'),
12 years ago
'year': year if isinstance(year, int) else None,
'plot': movie.get('Plot'),
'genres': splitString(movie.get('Genre', '')),
'directors': splitString(movie.get('Director', '')),
'writers': splitString(movie.get('Writer', '')),
'actors': splitString(movie.get('Actors', '')),
13 years ago
}
movie_data = dict((k, v) for k, v in movie_data.iteritems() if v)
14 years ago
except:
log.error('Failed parsing IMDB API json: %s', traceback.format_exc())
14 years ago
return movie_data
def runtimeToMinutes(self, runtime_str):
runtime = 0
regex = '(\d*.?\d+).(h|hr|hrs|mins|min)+'
matches = re.findall(regex, runtime_str)
for match in matches:
nr, size = match
runtime += tryInt(nr) * (60 if 'h' is str(size)[0] else 1)
return runtime