diff --git a/oml/item/api.py b/oml/item/api.py index 7cfcfdf..117d591 100644 --- a/oml/item/api.py +++ b/oml/item/api.py @@ -16,7 +16,8 @@ import settings import state from websocket import trigger_event -import meta +#import meta +import metaremote as meta import utils diff --git a/oml/item/models.py b/oml/item/models.py index 49460bf..edddf08 100644 --- a/oml/item/models.py +++ b/oml/item/models.py @@ -23,7 +23,9 @@ from settings import db, config from person import get_sort_name import media -import meta + +#import meta +import metaremote as meta import state import utils diff --git a/oml/metaremote.py b/oml/metaremote.py new file mode 100644 index 0000000..7330919 --- /dev/null +++ b/oml/metaremote.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# vi:si:et:sw=4:sts=4:ts=4 +from __future__ import division + +import json +from ox.cache import read_url +from urllib import urlencode + +import logging +logger = logging.getLogger('metaremote') + +def request(action, data): + data = urlencode({ + 'action': action, + 'data': json.dumps(data) + }) + url = 'http://meta.openmedialibrary.com/api/' + try: + return json.loads(read_url(url, data))['data'] + except: + return {} + +def find(query): + logger.debug('find %s', query) + return request('findMetadata', {'query': query})['items'] + +def lookup(key, value): + logger.debug('lookup %s %s', key, value) + return request('getMetadata', {key: value}) diff --git a/oml/metaserver.py b/oml/metaserver.py new file mode 100644 index 0000000..7bca3cb --- /dev/null +++ b/oml/metaserver.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# vi:si:et:sw=4:sts=4:ts=4 + +import os +import sys + +from tornado.web import Application +from tornado.httpserver import HTTPServer +from tornado.ioloop import IOLoop +from flask import Flask + +import oxtornado +from oxtornado import actions + +import meta +import utils + +import logging +logger = logging.getLogger('metaoml') +logging.basicConfig(level=logging.DEBUG) + +def findMetadata(data): + ''' + takes { + query: string, + } + returns { + items: [{ + key: value + }] + } + key is one of the supported identifiers: isbn10, isbn13... + ''' + response = {} + logger.debug('findMetadata %s', data) + response['items'] = meta.find(data['query']) + return response +actions.register(findMetadata) + +def getMetadata(data): + ''' + takes { + key: value + includeEdits: boolean + } + key can be one of the supported identifiers: isbn10, isbn13, oclc, olid,... + ''' + logger.debug('getMetadata %s', data) + if 'includeEdits' in data: + include_edits = data.pop('includeEdits') + else: + include_edits = False + key, value = data.iteritems().next() + if key == 'isbn': + value = utils.normalize_isbn(value) + response = meta.lookup(key, value) + if response: + response['primaryid'] = [key, value] + return response +actions.register(getMetadata) + +def run(): + root_dir = os.path.normpath(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..')) + + options = { + 'debug': True + } + app = Flask('metaoml') + + handlers = [ + (r'/api/', oxtornado.ApiHandler, dict(app=app)), + ] + + http_server = HTTPServer(Application(handlers, **options)) + + port = 9855 + address = '' + http_server.listen(port, '') + + + main = IOLoop.instance() + + if ':' in address: + host = '[%s]' % address + elif not address: + host = '[::1]' + else: + host = address + url = 'http://%s:%s/' % (host, port) + print url + main.start() + +if __name__ == '__main__': + run() diff --git a/oml/oxtornado.py b/oml/oxtornado.py index 2a12d8d..f71e47f 100644 --- a/oml/oxtornado.py +++ b/oml/oxtornado.py @@ -87,7 +87,11 @@ def api_task(app, request, callback): f = actions.get(action) if f: with app.app_context(): - response = f(data) + try: + response = f(data) + except: + logger.debug('FAILED %s %s', action, data, exc_info=1) + response = json_response(status=500, text='%s failed' % action) else: response = json_response(status=400, text='Unknown action %s' % action) callback(response) diff --git a/oml/settings.py b/oml/settings.py index 462ba1b..9fddf29 100644 --- a/oml/settings.py +++ b/oml/settings.py @@ -44,7 +44,7 @@ server_defaults = { 'extract_text': True, 'localnode_discovery': True, 'directory_service': 'http://[2a01:4f8:120:3201::3]:25519', - 'lookup_service': 'http://data.openmedialibrary.com', + 'meta_service': 'http://meta.openmedialibrary.com/api/', } for key in server_defaults: