-
Notifications
You must be signed in to change notification settings - Fork 29
/
_openl.py
72 lines (62 loc) · 2.24 KB
/
_openl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# -*- coding: utf-8 -*-
"""Query the openlibrary.org service for metadata."""
import logging
import re
from .dev import stdmeta
from .dev._bouth23 import u
from .dev._exceptions import RecordMappingError
from .dev.webquery import query as wquery
UA = 'isbnlib (gzip)'
SERVICE_URL = ('http://openlibrary.org/api/books?bibkeys='
'ISBN:{isbn}&format=json&jscmd=data')
LOGGER = logging.getLogger(__name__)
# pylint: disable=broad-except
def _mapper(isbn, records):
"""Map canonical <- records."""
# canonical:
# -> ISBN-13, Title, Authors, Publisher, Year, Language
try:
# mapping: canonical <- records
canonical = {}
canonical['ISBN-13'] = u(isbn)
title = records.get('title', u('')).replace(' :', ':')
subtitle = records.get('subtitle', u(''))
title = title + ' - ' + subtitle if subtitle else title
canonical['Title'] = title
canonical['Authors'] = [
a['name'] for a in records.get('authors', ({
'name': u(''),
}, ))
]
canonical['Publisher'] = records.get('publishers', [
{
'name': u(''),
},
])[0]['name']
canonical['Year'] = u('')
strdate = records.get('publish_date', u(''))
if strdate: # pragma: no cover
match = re.search(r'\d{4}', strdate)
if match:
canonical['Year'] = match.group(0)
except Exception: # pragma: no cover
LOGGER.debug('RecordMappingError for %s with data %s', isbn, records)
raise RecordMappingError(isbn)
# call stdmeta for extra cleanning and validation
return stdmeta(canonical)
# pylint: disable=broad-except
def _records(isbn, data):
"""Classify (canonically) the parsed data."""
try:
# put the selected data in records
records = data['ISBN:%s' % isbn]
except Exception: # pragma: no cover
# don't raise exception!
LOGGER.debug('No data from "openl" for isbn %s', isbn)
return {}
# map canonical <- records
return _mapper(isbn, records)
def query(isbn):
"""Query the openlibrary.org service for metadata."""
data = wquery(SERVICE_URL.format(isbn=isbn), user_agent=UA)
return _records(isbn, data)