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.

112 lines
3.5 KiB

14 years ago
from couchpotato import get_session
from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.encoding import tryUrlencode
14 years ago
from couchpotato.core.helpers.request import jsonified, getParams
14 years ago
from couchpotato.core.logger import CPLog
from couchpotato.core.providers.movie.base import MovieProvider
14 years ago
from couchpotato.core.settings.model import Movie
14 years ago
from flask.helpers import json
import time
import traceback
14 years ago
log = CPLog(__name__)
class CouchPotatoApi(MovieProvider):
urls = {
'search': 'https://couchpota.to/api/search/%s/',
'info': 'https://couchpota.to/api/info/%s/',
'eta': 'https://couchpota.to/api/eta/%s/',
'suggest': 'https://couchpota.to/api/suggest/%s/%s/',
}
http_time_between_calls = 0
api_version = 1
14 years ago
def __init__(self):
#addApiView('movie.suggest', self.suggestView)
14 years ago
addEvent('movie.info', self.getInfo, priority = 1)
addEvent('movie.search', self.search, priority = 1)
addEvent('movie.release_date', self.getReleaseDate)
def search(self, q, limit = 12):
cache_key = 'cpapi.cache.%s' % q
cached = self.getCache(cache_key, self.urls['search'] % tryUrlencode(q), timeout = 3, headers = self.getRequestHeaders())
if cached:
try:
movies = json.loads(cached)
return movies
except:
log.error('Failed parsing search results: %s', traceback.format_exc())
return []
def getInfo(self, identifier = None):
if not identifier:
return
cache_key = 'cpapi.cache.info.%s' % identifier
cached = self.getCache(cache_key, self.urls['info'] % identifier, timeout = 3, headers = self.getRequestHeaders())
if cached:
try:
movie = json.loads(cached)
return movie
except:
log.error('Failed parsing info results: %s', traceback.format_exc())
return {}
def getReleaseDate(self, identifier = None):
14 years ago
if identifier is None: return {}
14 years ago
try:
data = self.urlopen(self.urls['eta'] % identifier, headers = self.getRequestHeaders())
14 years ago
dates = json.loads(data)
log.debug('Found ETA for %s: %s', (identifier, dates))
return dates
14 years ago
except Exception, e:
log.error('Error getting ETA for %s: %s', (identifier, e))
14 years ago
return {}
14 years ago
def suggest(self, movies = [], ignore = []):
try:
data = self.urlopen(self.urls['suggest'] % (','.join(movies), ','.join(ignore)))
14 years ago
suggestions = json.loads(data)
log.info('Found Suggestions for %s', (suggestions))
14 years ago
except Exception, e:
log.error('Error getting suggestions for %s: %s', (movies, e))
14 years ago
return suggestions
def suggestView(self):
params = getParams()
movies = params.get('movies')
ignore = params.get('ignore', [])
if not movies:
db = get_session()
active_movies = db.query(Movie).filter(Movie.status.has(identifier = 'active')).all()
movies = [x.library.identifier for x in active_movies]
14 years ago
suggestions = self.suggest(movies, ignore)
return jsonified({
'success': True,
'count': len(suggestions),
'suggestions': suggestions
})
def getRequestHeaders(self):
return {
'X-CP-Version': fireEvent('app.version', single = True),
'X-CP-API': self.api_version,
'X-CP-Time': time.time(),
}