Merge branch 'refs/heads/develop'

This commit is contained in:
Ruud
2014-06-02 14:20:50 +02:00
2 changed files with 45 additions and 15 deletions
+43 -13
View File
@@ -1,3 +1,5 @@
from functools import wraps
from threading import Thread
import json import json
import threading import threading
import traceback import traceback
@@ -5,7 +7,6 @@ import urllib
from couchpotato.core.helpers.request import getParams from couchpotato.core.helpers.request import getParams
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from tornado.gen import coroutine
from tornado.web import RequestHandler, asynchronous from tornado.web import RequestHandler, asynchronous
@@ -20,6 +21,24 @@ api_docs = {}
api_docs_missing = [] api_docs_missing = []
def run_async(func):
@wraps(func)
def async_func(*args, **kwargs):
func_hl = Thread(target = func, args = args, kwargs = kwargs)
func_hl.start()
return async_func
@run_async
def run_handler(route, kwargs, callback = None):
try:
res = api[route](**kwargs)
callback(res, route)
except:
log.error('Failed doing api request "%s": %s', (route, traceback.format_exc()))
callback({'success': False, 'error': 'Failed returning results'}, route)
# NonBlock API handler # NonBlock API handler
class NonBlockHandler(RequestHandler): class NonBlockHandler(RequestHandler):
@@ -65,7 +84,7 @@ def addNonBlockApiView(route, func_tuple, docs = None, **kwargs):
# Blocking API handler # Blocking API handler
class ApiHandler(RequestHandler): class ApiHandler(RequestHandler):
@coroutine @asynchronous
def get(self, route, *args, **kwargs): def get(self, route, *args, **kwargs):
route = route.strip('/') route = route.strip('/')
if not api.get(route): if not api.get(route):
@@ -88,32 +107,43 @@ class ApiHandler(RequestHandler):
try: del kwargs['t'] try: del kwargs['t']
except: pass except: pass
# Fire api handler(s) # Add async callback handler
try: run_handler(route, kwargs, callback = self.taskFinished)
result = api[route](**kwargs)
except:
log.error('Failed doing api request "%s": %s', (route, traceback.format_exc()))
result = {'success': False, 'error': 'Failed returning results'}
except:
log.error('Failed doing api request "%s": %s', (route, traceback.format_exc()))
self.write({'success': False, 'error': 'Failed returning results'})
self.finish()
api_locks[route].release()
post = get
def taskFinished(self, result, route):
if self.request.connection.stream.closed():
return
try:
# Check JSONP callback # Check JSONP callback
jsonp_callback = self.get_argument('callback_func', default = None) jsonp_callback = self.get_argument('callback_func', default = None)
if jsonp_callback: if jsonp_callback:
self.write(str(jsonp_callback) + '(' + json.dumps(result) + ')') self.write(str(jsonp_callback) + '(' + json.dumps(result) + ')')
self.set_header("Content-Type", "text/javascript") self.set_header("Content-Type", "text/javascript")
self.finish()
elif isinstance(result, tuple) and result[0] == 'redirect': elif isinstance(result, tuple) and result[0] == 'redirect':
self.redirect(result[1]) self.redirect(result[1])
else: else:
self.write(result) self.write(result)
self.finish()
except: except:
log.error('Failed doing api request "%s": %s', (route, traceback.format_exc())) log.debug('Failed doing request, probably already closed: %s', (traceback.format_exc()))
self.write({'success': False, 'error': 'Failed returning results'}) try: self.finish({'success': False, 'error': 'Failed returning results'})
except: pass
api_locks[route].release() api_locks[route].release()
post = get
def addApiView(route, func, static = False, docs = None, **kwargs): def addApiView(route, func, static = False, docs = None, **kwargs):
+2 -2
View File
@@ -372,10 +372,10 @@ class Database(object):
m = medias[x] m = medias[x]
status = statuses.get(m['status_id']).get('identifier') status = statuses.get(m['status_id']).get('identifier')
l = libraries[m['library_id']] l = libraries.get(m['library_id'])
# Only migrate wanted movies, Skip if no identifier present # Only migrate wanted movies, Skip if no identifier present
if not getImdb(l.get('identifier')): continue if not l or not getImdb(l.get('identifier')): continue
profile_id = profile_link.get(m['profile_id']) profile_id = profile_link.get(m['profile_id'])
category_id = category_link.get(m['category_id']) category_id = category_link.get(m['category_id'])