Source code for couchpotato.core.media.movie.providers.automation.trakt.main

import json
import traceback
import time

from couchpotato import Env, fireEvent
from couchpotato.api import addApiView
from couchpotato.core.event import addEvent
from couchpotato.core.helpers.variable import cleanHost
from couchpotato.core.logger import CPLog
from couchpotato.core.media._base.providers.base import Provider
from couchpotato.core.media.movie.providers.automation.base import Automation


log = CPLog(__name__)


[docs]class TraktBase(Provider):
client_id = '8a54ed7b5e1b56d874642770ad2e8b73e2d09d6e993c3a92b1e89690bb1c9014' api_url = 'https://api-v2launch.trakt.tv/' def call(self, method_url, post_data = None): headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer %s' % self.conf('automation_oauth_token'), 'trakt-api-version': 2, 'trakt-api-key': self.client_id, } if post_data: post_data = json.dumps(post_data) data = self.getJsonData(self.api_url + method_url, data = post_data or {}, headers = headers) return data if data else []
[docs]class Trakt(Automation, TraktBase):
urls = { 'watchlist': 'sync/watchlist/movies/', 'oauth': 'https://api.couchpota.to/authorize/trakt/', 'refresh_token': 'https://api.couchpota.to/authorize/trakt_refresh/', } def __init__(self): super(Trakt, self).__init__() addApiView('automation.trakt.auth_url', self.getAuthorizationUrl) addApiView('automation.trakt.credentials', self.getCredentials) fireEvent('schedule.interval', 'updater.check', self.refreshToken, hours = 24) addEvent('app.load', self.refreshToken) def refreshToken(self): token = self.conf('automation_oauth_token') refresh_token = self.conf('automation_oauth_refresh') if token and refresh_token: prop_name = 'last_trakt_refresh' last_refresh = int(Env.prop(prop_name, default = 0)) if last_refresh < time.time()-4838400: # refresh every 8 weeks log.debug('Refreshing trakt token') url = self.urls['refresh_token'] + '?token=' + self.conf('automation_oauth_refresh') data = fireEvent('cp.api_call', url, cache_timeout = 0, single = True) if data and 'oauth' in data and 'refresh' in data: log.debug('Oauth refresh: %s', data) self.conf('automation_oauth_token', value = data.get('oauth')) self.conf('automation_oauth_refresh', value = data.get('refresh')) Env.prop(prop_name, value = int(time.time())) else: log.error('Failed refreshing Trakt token, please re-register in settings') elif token and not refresh_token: log.error('Refresh token is missing, please re-register Trakt for autorefresh of the token in the future') def getIMDBids(self): movies = [] for movie in self.getWatchlist(): movies.append(movie.get('movie').get('ids').get('imdb')) return movies def getWatchlist(self): return self.call(self.urls['watchlist']) def getAuthorizationUrl(self, host = None, **kwargs): callback_url = cleanHost(host) + '%sautomation.trakt.credentials/' % (Env.get('api_base').lstrip('/')) log.debug('callback_url is %s', callback_url) target_url = self.urls['oauth'] + "?target=" + callback_url log.debug('target_url is %s', target_url) return { 'success': True, 'url': target_url, } def getCredentials(self, **kwargs): try: oauth_token = kwargs.get('oauth') refresh_token = kwargs.get('refresh') log.debug('oauth_token is: %s', oauth_token) self.conf('automation_oauth_token', value = oauth_token) self.conf('automation_oauth_refresh', value = refresh_token) Env.prop('last_trakt_refresh', value = int(time.time())) except: log.error('Failed setting trakt token: %s', traceback.format_exc()) return 'redirect', Env.get('web_base') + 'settings/automation/'