def image_info(identifier):
    """
        Return the info.json, with the correct HTTP status code,
        and decorated with the right auth services

        Handle CORS explicitly for clarity
    """
    print("METHOD:", request.method)
    if request.method == 'OPTIONS':
        print('CORS preflight request for', identifier)
        return preflight()

    print('info.json request for', identifier)
    policy = AUTH_POLICY[identifier]
    uri = "%simg/%s" % (request.url_root, identifier)
    info = web.info(uri, resolve(identifier))
    decorate_info(info, policy, identifier)

    if authorise_info_request(identifier):
        resp = make_acao_response(jsonify(info), 200)
        if not policy.get('open'):
            resp.headers[
                'Cache-Control'] = 'no-cache, no-store, must-revalidate'
        return resp

    print('The user is not authed for this resource')
    degraded_version = policy.get('degraded', None)
    if degraded_version:
        redirect_to = "%simg/%s/info.json" % (request.url_root,
                                              degraded_version)
        print('a degraded version is available at', redirect_to)
        return make_acao_response(redirect(redirect_to, code=302))

    return make_acao_response(jsonify(info), 401)
Beispiel #2
0
def info(identifier):
    try:
        path, mediatype = ia_resolver(identifier)
    except ValueError:
        abort(404)
    try:
        domain = '%siiif/%s' % (request.url_root, identifier)
        info = web.info(domain, path)
        return ldjsonify(info)
    except:
        abort(400)  # , "Invalid item, may actually be collection")
Beispiel #3
0
def view(identifier):
    domain = request.args.get('domain', request.url_root)
    uri = '%s%s' % (domain, identifier)
    try:
        path, mediatype = ia_resolver(identifier)
    except ValueError:
        abort(404)
    if mediatype == 'image' or '$' in identifier:
        return render_template('viewer.html', domain=domain,
                               info=web.info(uri, path))
    return render_template('reader.html', domain=request.base_url)
Beispiel #4
0
def info(identifier):
    try:
        path, mediatype = ia_resolver(identifier)
    except ValueError:
        abort(404)
    try:
        domain = '%s%s' % (purify_domain(request.url_root), identifier)
        info = web.info(domain, path)
        return ldjsonify(info)
    except:
        abort(400)  # , "Invalid item, may actually be collection")
def view(identifier):
    domain = purify_domain(request.args.get('domain', request.url_root))
    uri = '%s%s' % (domain, identifier)
    page = request.args.get('page', None)
    citation = request.args.get('citation', None)

    try:
        path, mediatype = ia_resolver(identifier)
    except ValueError:
        abort(404)
    if mediatype == 'image' or '$' in identifier:
        return render_template('viewer.html', domain=domain,
                               info=web.info(uri, path))
    return render_template('reader.html', domain=request.base_url, page=page, citation=citation)
Beispiel #6
0
def create_manifest(identifier, domain=None):
    manifest = {
        '@context': CONTEXT,
        '@id': '%s%s/manifest.json' % (domain, identifier),
        '@type': 'sc:Manifest',
        'logo': 'http://tinyurl.com/ou7efql',
            'sequences': [
                {
                    '@id': '%s%s/canvas/default' % (domain, identifier),
                    '@type': 'sc:Sequence',
                    '@context': CONTEXT,
                    'label': 'default',
                    'canvases': []
                }
            ],
        'viewingHint': 'paged',
    }
    path = os.path.join(media_root, identifier)
    metadata = requests.get('%s/metadata/%s' % (ARCHIVE, identifier)).json()
    mediatype = metadata['metadata']['mediatype']
    manifest['label'] = metadata['metadata']['title']

    if mediatype.lower() == 'image':
        path, mediatype = ia_resolver(identifier)
        info = web.info(domain, path)
        manifest['sequences'][0]['canvases'].append(
            manifest_page(
                identifier="%s%s" % (domain, identifier),
                label=metadata['metadata']['title'],
                width=info['width'],
                height=info['height']
            )
        )

    elif mediatype.lower() == 'texts':
        subPrefix = metadata['dir']
        server = metadata.get('server', ARCHIVE)

        r = requests.get(bookdata % server, params={
            'server': server,
            'itemPath': subPrefix,
            'itemId': identifier
        })
        data = r.json()

        manifest.update({
            'label': data['title'],
            'thumbnail': {
                '@id': data['previewImage']
            },
        })

        for page in range(1, len(data.get('leafNums', []))):
            manifest['sequences'][0]['canvases'].append(
                manifest_page(
                    identifier = "%s%s$%s" % (domain, identifier, page),
                    label=data['pageNums'][page],
                    width=data['pageWidths'][page],
                    height=data['pageHeights'][page]
                )
            )
    return manifest
Beispiel #7
0
def create_manifest(identifier, domain=None):
    manifest = {
        '@context': CONTEXT,
        '@id': '%s%s/manifest.json' % (domain, identifier),
        '@type': 'sc:Manifest',
        'logo': 'http://tinyurl.com/ou7efql',
            'sequences': [
                {
                    '@id': '%s%s/canvas/default' % (domain, identifier),
                    '@type': 'sc:Sequence',
                    '@context': CONTEXT,
                    'label': 'default',
                    'canvases': []
                }
            ],
        'viewingHint': 'paged',
        'attribution': "The Internet Archive",
        'seeAlso': '%s/metadata/%s' % (ARCHIVE, identifier)
    }
    path = os.path.join(media_root, identifier)
    resp = requests.get('%s/metadata/%s' % (ARCHIVE, identifier)).json()
    metadata = resp.get("metadata", {})

    mediatype = metadata.get("mediatype")

    if 'title' in metadata:
        manifest['label'] = metadata['title']
    if 'identifier-access' in metadata:
        manifest['related'] = metadata['identifier-access']
    if 'description' in metadata:
        manifest['description'] = coerce_list(metadata['description'])

    manifest['metadata'] = [{"label": field, "value": coerce_list(metadata[field])}
                            for field in METADATA_FIELDS if metadata.get(field)]

    if mediatype.lower() == 'image':
        path, mediatype = ia_resolver(identifier)
        info = web.info(domain, path)
        manifest['sequences'][0]['canvases'].append(
            manifest_page(
                identifier="%s%s" % (domain, identifier),
                label=metadata['title'],
                width=info['width'],
                height=info['height']
            )
        )

    elif mediatype.lower() == 'texts':
        subPrefix = resp['dir']
        server = resp.get('server', ARCHIVE)

        r = requests.get(bookdata % server, params={
            'server': server,
            'itemPath': subPrefix,
            'itemId': identifier
        })
        data = r.json()

        manifest.update({
            'label': data['title'],
            'thumbnail': {
                '@id': data['previewImage']
            },
        })

        for page in range(1, len(data.get('leafNums', []))):
            manifest['sequences'][0]['canvases'].append(
                manifest_page(
                    identifier = "%s%s$%s" % (domain, identifier, page),
                    label=data['pageNums'][page],
                    width=data['pageWidths'][page],
                    height=data['pageHeights'][page]
                )
            )
    return manifest
def create_manifest(identifier, domain=None):
    manifest = {
        "@context": CONTEXT,
        "@id": "%s%s/manifest.json" % (domain, identifier),
        "@type": "sc:Manifest",
        "logo": "https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcReMN4l9cgu_qb1OwflFeyfHcjp8aUfVNSJ9ynk2IfuHwW1I4mDSw",
        "sequences": [
            {
                "@id": "%s%s/canvas/default" % (domain, identifier),
                "@type": "sc:Sequence",
                "@context": CONTEXT,
                "label": "default",
                "canvases": [],
            }
        ],
        "viewingHint": "paged",
        "attribution": "The Internet Archive",
        "seeAlso": "%s/metadata/%s" % (ARCHIVE, identifier),
    }
    path = os.path.join(media_root, identifier)
    resp = requests.get("%s/metadata/%s" % (ARCHIVE, identifier)).json()
    metadata = resp.get("metadata", {})

    mediatype = metadata.get("mediatype")

    if "title" in metadata:
        manifest["label"] = metadata["title"]
    if "identifier-access" in metadata:
        manifest["related"] = metadata["identifier-access"]
    if "description" in metadata:
        manifest["description"] = coerce_list(metadata["description"])

    manifest["metadata"] = [
        {"label": field, "value": coerce_list(metadata[field])} for field in METADATA_FIELDS if metadata.get(field)
    ]

    if mediatype.lower() == "image":
        path, mediatype = ia_resolver(identifier)
        info = web.info(domain, path)
        manifest["sequences"][0]["canvases"].append(
            manifest_page(
                identifier="%s%s" % (domain, identifier),
                label=metadata["title"],
                width=info["width"],
                height=info["height"],
            )
        )

    elif mediatype.lower() == "texts":
        subPrefix = resp["dir"]
        server = resp.get("server", ARCHIVE)

        # XXX Use https://api.archivelab.org/books/:id/metadata API

        r = requests.get(bookdata % server, params={"server": server, "itemPath": subPrefix, "itemId": identifier})
        data = r.json()

        manifest.update({"label": data["title"], "thumbnail": {"@id": data["previewImage"]}})

        for page in range(1, len(data.get("leafNums", []))):
            manifest["sequences"][0]["canvases"].append(
                manifest_page(
                    identifier="%s%s$%s" % (domain, identifier, page),
                    label=data["pageNums"][page],
                    width=data["pageWidths"][page],
                    height=data["pageHeights"][page],
                )
            )
    return manifest
Beispiel #9
0
def create_manifest(identifier, domain=None, page=None):
    path = os.path.join(media_root, identifier)
    resp = requests.get('%s/metadata/%s' % (ARCHIVE, identifier)).json()
    metadata = resp.get("metadata", {})

    manifest = {
        '@context':
        PRZ_CTX,
        '@id':
        '%s%s/manifest.json' % (domain, identifier),
        '@type':
        'sc:Manifest',
        'description':
        metadata.get('description', ''),
        'logo':
        'https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcReMN4l9cgu_qb1OwflFeyfHcjp8aUfVNSJ9ynk2IfuHwW1I4mDSw',
        'sequences': [{
            '@id': '%s%s/canvas/default' % (domain, identifier),
            '@type': 'sc:Sequence',
            '@context': IMG_CTX,
            'label': 'default',
            'canvases': []
        }],
        'viewingHint':
        'paged',
        'attribution':
        "The Internet Archive",
        'seeAlso':
        '%s/metadata/%s' % (ARCHIVE, identifier)
    }

    mediatype = metadata.get("mediatype")

    if 'title' in metadata:
        manifest['label'] = metadata['title']
    if 'identifier-access' in metadata:
        manifest['related'] = metadata['identifier-access']
    if 'description' in metadata:
        manifest['description'] = coerce_list(metadata['description'])

    manifest['metadata'] = [{
        "label": field,
        "value": coerce_list(metadata[field])
    } for field in METADATA_FIELDS if metadata.get(field)]

    if page and mediatype is None:
        mediatype = 'image'

    if "$" not in identifier:
        filepath = None
    else:
        identifier, filepath = identifier.split("$", 1)
        filepath = filepath.replace("$", os.sep)

    if mediatype.lower() == 'image' or (filepath
                                        and mediatype.lower() != 'texts'):
        path, mediatype = ia_resolver(identifier)
        info = web.info(domain, path)
        manifest['sequences'][0]['canvases'].append(
            manifest_page(identifier="%s%s" % (domain, identifier),
                          label=metadata['title'],
                          width=info['width'],
                          height=info['height'],
                          metadata=metadata))

    elif mediatype.lower() == 'texts':
        subPrefix = resp['dir']
        server = resp.get('server', ARCHIVE)

        # XXX Use https://api.archivelab.org/books/:id/metadata API

        r = requests.get(bookdata % server,
                         params={
                             'server': server,
                             'itemPath': subPrefix,
                             'itemId': identifier
                         })
        data = r.json()

        manifest.update({
            'label': data['title'],
            'thumbnail': {
                '@id': data['previewImage']
            },
        })

        if page:
            manifest['sequences'][0]['canvases'].append(
                manifest_page(identifier="%s%s$%s" %
                              (domain, identifier, page),
                              label=data['pageNums'][page],
                              width=data['pageWidths'][page],
                              height=data['pageHeights'][page]))
            return manifest

        for page in range(0, len(data.get('leafNums', []))):
            manifest['sequences'][0]['canvases'].append(
                manifest_page(identifier="%s%s$%s" %
                              (domain, identifier, page),
                              label=data['pageNums'][page],
                              width=data['pageWidths'][page],
                              height=data['pageHeights'][page]))
    return manifest
Beispiel #10
0
def view(identifier, quality="default", fmt="jpg"):
    uri = '%s%s' % (request.url_root, identifier)
    return render_template('viewer.html',
                           info=web.info(uri, resolve(identifier)))
Beispiel #11
0
def image_info(identifier):
    try:
        uri = "%s%s" % (request.url_root, identifier)
        return jsonify(web.info(uri, resolve(identifier)))
    except:
        abort(400)
Beispiel #12
0
def view(identifier, quality="default", fmt="jpg"):
    uri = '%s%s' % (request.url_root, identifier)
    return render_template('viewer.html', info=web.info(uri, resolve(identifier)))
Beispiel #13
0
def image_info(identifier):
    try:
        uri = "%s%s" % (request.url_root, identifier)
        return jsonify(web.info(uri, resolve(identifier)))
    except:
        abort(400)
Beispiel #14
0
def info(identifier):
    """get info about the image and return a json blob. Need to drop URL root in"""
    return jsonify(
        web.info("%s%s" % (request.url_root, identifier), resolve(identifier)))
Beispiel #15
0
def info(identifier):
    return jsonify(web.info(request.url, resolve(identifier), identifier))