67 lines
1.9 KiB
Python
67 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# vi:si:et:sw=4:sts=4:ts=4
|
|
from __future__ import division
|
|
|
|
from ox.cache import read_url
|
|
import json
|
|
|
|
from utils import normalize_isbn
|
|
from marc_countries import COUNTRIES
|
|
|
|
def find(query):
|
|
url = 'https://openlibrary.org/search.json?q=%s' % query
|
|
data = json.loads(read_url(url))
|
|
return data
|
|
|
|
def authors(authors):
|
|
return resolve_names(authors)
|
|
|
|
def resolve_names(objects, key='name'):
|
|
r = []
|
|
for o in objects:
|
|
url = 'https://openlibrary.org%s.json' % o['key']
|
|
data = json.loads(read_url(url))
|
|
r.append(data[key])
|
|
return r
|
|
|
|
def languages(languages):
|
|
return resolve_names(languages)
|
|
|
|
def info(id):
|
|
data = {}
|
|
url = 'https://openlibrary.org/books/%s.json' % id
|
|
info = json.loads(read_url(url))
|
|
keys = {
|
|
'title': 'title',
|
|
'authors': 'author',
|
|
'publishers': 'publisher',
|
|
'languages': 'language',
|
|
'publish_places': 'place',
|
|
'publish_country': 'country',
|
|
'covers': 'cover',
|
|
'isbn_10': 'isbn10',
|
|
'isbn_13': 'isbn13',
|
|
'lccn': 'lccn',
|
|
'oclc_numbers': 'oclc',
|
|
'dewey_decimal_class': 'classification',
|
|
'number_of_pages': 'pages',
|
|
}
|
|
for key in keys:
|
|
if key in info:
|
|
value = info[key]
|
|
if key == 'authors':
|
|
value = authors(value)
|
|
elif key == 'publish_country':
|
|
value = COUNTRIES.get(value, value)
|
|
elif key == 'covers':
|
|
value = 'https://covers.openlibrary.org/b/id/%s.jpg' % value[0]
|
|
value = COUNTRIES.get(value, value)
|
|
elif key == 'languages':
|
|
value = languages(value)
|
|
elif isinstance(value, list) and key not in ('publish_places'):
|
|
value = value[0]
|
|
if key in ('isbn_10', 'isbn_13'):
|
|
value = normalize_isbn(value)
|
|
data[keys[key]] = value
|
|
return data
|
|
|