from typing import Union
from IPython.display import HTML
from PIL import Image
from dhlab.api.nb_search_api import iiif_manifest, super_search, total_search, load_picture
[docs]
def pages(urn, scale=800):
a = iiif_manifest(urn)
return [page['images'][0]['resource']['@id'].replace(f"full/full/", "full/0,{s}/") for page in
a['sequences'][0]['canvases']]
[docs]
def get_url(urn, page=1, part=200):
# urn as digit
urn = "URN:NBN:no-nb_digibok_" + urn + '_{0:04d}'.format(page)
print(urn)
url = f"https://www.nb.no/services/image/resolver/{urn}/full/0,{part}/native.jpg"
return url
[docs]
def page_urn(urn, page=1):
# urn as digit
return "URN:NBN:no-nb_digibok_" + urn + '_{0:04d}'.format(page)
[docs]
def find_urls(term, number=50, page=0, mediatype='bilder'):
"""generates urls from super_search for pictures"""
x = super_search(term, number, page, mediatype=mediatype)
try:
urls = [
f['_links']['thumbnail_custom']['href']
for f in x['_embedded']['items']
if f['accessInfo']['accessAllowedFrom'] == 'EVERYWHERE'
and 'thumbnail_custom' in f['_links']
]
except:
urls = []
return urls
[docs]
def find_urls2(term, number=50, page=0):
"""generates urls from super_search for pictures"""
x = super_search(term, number, page)
try:
urls = [
f['_links']['thumbnail_custom']['href']
for f in x['_embedded']['mediaTypeResults'][0]['result']['_embedded']['items']
if f['accessInfo']['accessAllowedFrom'] == 'EVERYWHERE'
and 'thumbnail_custom' in f['_links']
]
except:
urls = [' ... hmm ...']
return urls
[docs]
def get_picture_from_urn(urn: Union[int, str], width: int = 0, height: int = 300):
"""Fetch the Image object with its URN identifier.
:meta private:
:param urn: The uniform resource name number
:param width: Resolution width of the image.
:param height: Resolution height of the image.
:return: An :py:class:`~PIL.Image.Image` object.
"""
meta = iiif_manifest(urn)
if 'error' not in meta:
if width == 0 and height == 0:
url = f"https://www.nb.no/services/image/resolver/{urn}/full/full/0/native.jpg"
else:
url = f"https://www.nb.no/services/image/resolver/{urn}/full/{width},{height}/0/native.jpg"
# print(url)
return Image.open(load_picture(url))
[docs]
def get_picture_from_url(url, width=0, height=300):
return Image.open(
load_picture(
url.format(width=width, height=height)
)
)
[docs]
def find_urns(term):
"""From result of super_search, to be fed into iiif_manifest"""
ss = super_search(term)
urns = [
f['metadata']['identifiers']['urn']
for f in ss['_embedded']['mediaTypeResults'][0]['result']['_embedded']['items']
if 'urn' in f['metadata']['identifiers']
]
return urns
[docs]
def total_urls(number=50, page=0):
"""find urls sequentially """
x = total_search(number, page)
try:
urls = [
f['_links']['thumbnail_custom']['href']
for f in x['_embedded']['items']
if f['accessInfo']['accessAllowedFrom'] == 'EVERYWHERE'
and 'thumbnail_custom' in f['_links']
]
except:
urls = []
return urls
[docs]
def json2html(meta):
items = ["<dt>{key}</dt><dd>{val}</dd>".format(key=key, val=meta[key]) for key in meta]
result = "<dl>{items}</dl>".format(items=' '.join(items))
return result
[docs]
def display_finds(r):
"""A list of urls in r is displayed as HTML"""
rows = ["<tr><td><img src='{row}'</td><td>{meta}</td></tr>".format(row=row, meta=json2html(
get_metadata_from_url(row))).format(width=0, height=200) for row in r]
return HTML("""<html><head></head>
<body>
<table>
{rows}
</table>
</body>
</html>
""".format(rows=' '.join(rows)))