Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,408 changes: 0 additions & 1,408 deletions iiify/resolver.py

This file was deleted.

425 changes: 425 additions & 0 deletions iiify/resolver/__init__.py

Large diffs are not rendered by default.

92 changes: 92 additions & 0 deletions iiify/resolver/audio.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
from iiif_prezi3 import Canvas, Annotation, AnnotationPage, AnnotationBody, Choice, CanvasRef

from .base import BaseManifestBuilder
from .constants import AUDIO_FORMATS, URI_PRIFIX
from .helpers import sortDerivatives, addWaveform
from .utils import to_mimetype


class AudioManifestBuilder(BaseManifestBuilder):
def build_canvases(self, manifest, metadata, identifier, domain, uri, page):
(originals, derivatives) = sortDerivatives(metadata)

# Make behavior "auto-advance if more than one original"
if sum(f['format'] in AUDIO_FORMATS for f in originals) > 1:
manifest.behavior = "auto-advance"

# create the canvases for each original
total_audio_files = len([f for f in originals if f['format'] in AUDIO_FORMATS])
if total_audio_files > 1:
top_range = manifest.make_range(
id=f"{URI_PRIFIX}/{identifier}/range/1",
label={"en": ["Track List"]}
)

for file in [f for f in originals if f['format'] in AUDIO_FORMATS]:
normalised_id = file['name'].rsplit(".", 1)[0]
slugged_id = normalised_id.replace(" ", "-")
c_id = f"{URI_PRIFIX}/{identifier}/{slugged_id}/canvas"
c = Canvas(id=c_id, label=normalised_id, duration=float(file['length']))

# if multiple files, also add a range
if total_audio_files > 1:
track = top_range.make_range(
id=f"{URI_PRIFIX}/{identifier}/{slugged_id}/range",
label=file.get('title', normalised_id)
)
track.add_item(
CanvasRef(
id=c_id,
type="Canvas"
)
)

# create intermediary objects
ap = AnnotationPage(id=f"{URI_PRIFIX}/{identifier}/{slugged_id}/page")
anno = Annotation(id=f"{URI_PRIFIX}/{identifier}/{slugged_id}/annotation", motivation="painting", target=c.id)

# create body based on whether there are derivatives or not:
if file['name'] in derivatives:
body = Choice(items=[])
# add the choices in order per https://github.com/ArchiveLabs/iiif.archivelab.org/issues/77#issuecomment-1499672734
for format in AUDIO_FORMATS:
if format in derivatives[file['name']]:
r = AnnotationBody(id=f"https://archive.org/download/{identifier}/{derivatives[file['name']][format]['name'].replace(' ', '%20')}",
type='Sound',
format=to_mimetype(derivatives[file['name']][format]['name'], format),
label={"none": [format]},
duration=float(file['length']))
body.items.append(r)
elif file['format'] == format:
r = AnnotationBody(
id=f"https://archive.org/download/{identifier}/{file['name'].replace(' ', '%20')}",
type='Sound',
format=to_mimetype(file['name'], format),
label={"none": [format]},
duration=float(file['length']))
body.items.append(r)

if "Spectrogram" in derivatives[file['name']]:
c.seeAlso = [{
"id": f"https://archive.org/download/{identifier}/{normalised_id.replace(' ', '%20')}_spectrogram.png",
"type": "Image",
"label": {"en": ["Spectrogram"]},
"format": "image/png"
}]

if "PNG" in derivatives[file['name']]:
# This should be the Wave form
c.accompanyingCanvas = addWaveform(identifier, slugged_id, derivatives[file['name']]["PNG"]["name"])
else:
# todo: deal with instances where there are no derivatives for whatever reason
body = AnnotationBody(
id=f"https://archive.org/download/{identifier}/{file['name'].replace(' ', '%20')}",
type='Sound',
format=to_mimetype(file['name'], file['format']),
label={"none": [file['format']]},
duration=float(file['length']))

anno.body = body
ap.add_item(anno)
c.add_item(ap)
manifest.add_item(c)
36 changes: 36 additions & 0 deletions iiify/resolver/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import json
import requests
from iiif_prezi3 import config, Manifest, AnnotationPageRef, AnnotationPageRefExtended

from .constants import ARCHIVE
from .helpers import addMetadata, addSeeAlso, addRendering, addThumbnails, addPartOfCollection


class BaseManifestBuilder:
def build(self, identifier, domain, page=None, metadata=None):
if metadata is None:
metadata = requests.get(f'{ARCHIVE}/metadata/{identifier}').json()

uri = f"{domain}{identifier}"

config.configs['helpers.auto_fields.AutoLang'].auto_lang = "none"

manifest = Manifest(id=f"{uri}/manifest.json", label=metadata["metadata"]["title"])
if 'reviews' in metadata:
reviews_as_annotations = AnnotationPageRef(__root__=AnnotationPageRefExtended(
id=f"{domain.replace('iiif/', 'iiif/3/annotations/')}{identifier}/comments.json",
type="AnnotationPage",
))
manifest.annotations = [reviews_as_annotations]

addMetadata(manifest, identifier, metadata['metadata'])
addSeeAlso(manifest, identifier, metadata['files'])
addRendering(manifest, identifier, metadata['files'])
addThumbnails(manifest, identifier, metadata['files'])
addPartOfCollection(manifest, metadata.get('metadata').get('collection', []), domain)

self.build_canvases(manifest, metadata, identifier, domain, uri, page)
return json.loads(manifest.jsonld())

def build_canvases(self, manifest, metadata, identifier, domain, uri, page):
raise NotImplementedError
16 changes: 16 additions & 0 deletions iiify/resolver/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
SCRAPE_API = 'https://archive.org/services/search/v1/scrape'
ADVANCED_SEARCH = 'https://archive.org/advancedsearch.php'
IMG_CTX = 'http://iiif.io/api/image/2/context.json'
PRZ_CTX = 'http://iiif.io/api/presentation/2/context.json'
ARCHIVE = 'https://archive.org'
IMG_SRV = 'https://iiif.archive.org/image/iiif'
METADATA_FIELDS = ("title", "volume", "publisher", "subject", "date", "contributor", "creator")
bookdata = 'https://%s/BookReader/BookReaderJSON.php'
bookreader = "https://%s/BookReader/BookReaderImages.php"
URI_PRIFIX = "https://iiif.archive.org/iiif"
MAX_SCRAPE_LIMIT = 10_000
MAX_API_LIMIT = 1_000

valid_filetypes = ['jpg', 'jpeg', 'png', 'gif', 'tif', 'jp2', 'pdf', 'tiff']
AUDIO_FORMATS = ['VBR MP3', '32Kbps MP3', '56Kbps MP3', '64Kbps MP3', '96Kbps MP3', '128Kbps MP3', 'MPEG-4 Audio', 'Flac', 'AIFF', 'Apple Lossless Audio', 'Ogg Vorbis', 'WAVE', '24bit Flac', 'Shorten']
VIDEO_FORMATS = ['MPEG4', 'h.264 HD', 'h.264 MPEG4', '512Kb MPEG4', 'HiRes MPEG4', 'MPEG2', 'h.264', 'Matroska', 'Ogg Video', 'Ogg Theora', 'WebM', 'Windows Media', 'Cinepack', 'QuickTime']
Loading