esmero / archipelago-deployment

Archipelago Commons Docker Deployment Repository
33 stars 15 forks source link

Updates to the IIIF Collection Manifest Template #267

Closed alliomeria closed 3 weeks ago

alliomeria commented 1 month ago

What's needed?

Changes need to be applied:

Per @DiegoPino:

 {#
Updated 06/13/2024 for 1.4.0

Uses metadata exposed endpoint Route to generate URL so Aliases don't break it

This Template generates IIIF 3.0 API Manifest for Collections using a Drupal Views
JSON to be used by a Drupal Views (REST) to generate a simpler to parse/join listing of Canvases
For a Collection Manifest Manifest

Structures passed from Archipelago are
- node
  The full Node entity
- data
  The Full JSON Structure converted in an Array
- iiif_server
  The publicly available IIIF Server (Global Setting)

Since JSON was decoded into the 'data' values are valid PHP but could not
be valid JSON when outputting. So We use data.description|json_encode|raw
Without Double quotes.
#}
{% set Webserverurl =  url('<front>')|render|replace({':8001/':''}) ~ ':8183/iiif/2/' %}
{% set IIIFserverurl = iiif_server ? iiif_server ~ '/': Webserverurl %}
{% set currenturl = url('<current>')|render %}
{% set nodeid = 1 %} 
{% if node.id %}
{# this is needed to the View Argument can conform to the format even when no node exists when saving the template #}
  {% set nodeid = node.id %}
  {% set nodeurl = url('entity.node.canonical', {'node': node.id}, {'absolute': true}) %}
{% else %}
  {% set nodeid = 1 %} 
  {% set nodeurl = currenturl %}
{% endif%}
{% set len = language.getId() ? language.getId() : "en" %}
{% set computed_rights = "http://rightsstatements.org/vocab/InC-EDU/1.0/" %}
{% if data.rights|length > 0 or data.rights_statements|length > 0 %}
    {% if data.rights|length > 0 %} 
        {% set computed_rights = data.rights %}
    {% endif %}
{% elseif data.rights_statements|length > 0 %}
    {% if data.rights_statements in ['In Copyright'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/InC/1.0/" %}
    {% endif %}
    {% if data.rights_statements in ['In Copyright - EU Orphan Work'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/InC-OW-EU/1.0/" %}
    {% endif %}
    {% if data.rights_statements in ['In Copyright - Educational Use Permitted'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/InC-EDU/1.0/" %}
    {% endif %}
    {% if data.rights_statements in ['In Copyright - Non-Commercial Use Permitted'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/InC-NC/1.0/" %}
    {% endif %}
    {% if data.rights_statements in ['In Copyright - Rights-holder(s) Unlocatable or Unidentifiable'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/InC-RUU/1.0/" %}
    {% endif %}
    {% if data.rights_statements in ['No Copyright - Contractual Restrictions'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/NoC-CR/1.0/" %}
    {% endif %} 
    {% if data.rights_statements in ['No Copyright - Non-Commercial Use Only'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/NoC-NC/1.0/" %}
    {% endif %}
    {% if data.rights_statements in ['No Copyright - Other Known Legal Restrictions'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/NoC-OKLR/1.0/" %}
    {% endif %}
    {% if data.rights_statements in ['No Copyright - United States'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/NoC-US/1.0/" %}
    {% endif %} 
    {% if data.rights_statements in ['Copyright Not Evaluated'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/CNE/1.0/" %}
    {% endif %}
    {% if data.rights_statements in ['Copyright Undetermined'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/UND/1.0/" %}
    {% endif %}
    {% if data.rights_statements in ['No Known Copyright'] %} 
        {% set computed_rights = "http://rightsstatements.org/vocab/NKC/1.0/" %}
    {% endif %}
{% endif %}
{
{# Top Object Metadata #}
"@context": [
  "http://www.w3.org/ns/anno.jsonld",
  "http://iiif.io/api/presentation/3/context.json"
],
"type": "Collection",
"id": "{{ currenturl }}",
"label": {
"{{ len }}": [
{{ node.label|json_encode|raw }}
]
},
"requiredStatement": {
"label": { "en": [ "Attribution" ] },
"value": { "en": [ "Provided by Archipelago Deployment" ] }
},
"rights": {{ computed_rights|json_encode|raw }},
"metadata": [
{% for agent in attribute(data, 'edm_agent') %}
    {
    "label": {
    "{{ len }}": [
    {{ agent.role_label|json_encode|raw }}
    ]
    },
    "value": {
    "{{ len }}": [
    {{ agent.name_label|json_encode|raw }}
    ]
    }
    },
{% endfor %}
{
"label": {
"{{ len }}": [
"description"
]
},
"value": {
"{{ len }}": [
{{ data.description|json_encode|raw }}
]
}
},
{
"label": {
"{{ len }}": [
"navDate"
]
},
"value":  {
"{{ len }}": [
"{{ node.getChangedTime|date("F jS \\a\\t g:ia") }}"
]
}
},
{
"label": {
"{{ len }}": [
"license"
]
},
"value": {
"{{ len }}": [
{{ computed_rights|json_encode|raw }}
]
}
}
],
{% if attribute(data, 'memberof') %}
    {% set currentnode = 'node/' ~ data.memberof %}
    "within": "{{ url(currentnode) }}",
{% else %}
    {% set currentnode = '<current>' %}
{% endif %}
{# fetch all children using a View and attach them as Items #}
  "items": [
{% set collection_view = drupal_view('data_collection_manifest','children_ismemberof_manifest_rest', nodeid)|render %}
{% set collection_items = collection_view|sbf_json_decode %}
{% for items in collection_items %}
{# canvas|json_encode #}
    {
    {% if 'CreativeWorkSeries' in items['ado_type']|split(',') %}
        "id": "{{ url('format_strawberryfield.metadatadisplay_caster', {'node': items['uuid'],'metadataexposeconfig_entity':'iiifmanifest3cws', 
        'format':'default.jsonld'}, {'absolute': true, 'alias': true}) }}",
        "type": "Manifest",
     {% elseif 'Collection' in items['ado_type']|split(',') %}
        "id": "{{ url('format_strawberryfield.metadatadisplay_caster', {'node': items['uuid'], 'metadataexposeconfig_entity':'iiifmanifest3collection', 
        'format':'default.jsonld'}, {'absolute': true, 'alias': true}) }}",
        "type": "Collection",
    {% else %}
         "id": "{{ url('format_strawberryfield.metadatadisplay_caster', {'node': items['uuid'], 'metadataexposeconfig_entity':'iiifmanifest', 
        'format':'default.jsonld'}, {'absolute': true, 'alias': true}) }}",
        "type": "Manifest",
    {% endif %}
       "label": { "{{len}}": [ "{{ items['label'] }}" ] },
       {{ items['thumbnail']|raw }}
    }
    {{ not loop.last ? ',' : '' }}
{% endfor %}
  ]
}
DiegoPino commented 1 month ago

Such a profesh issue (format too!) @alliomeria . Thanks so much!

alliomeria commented 4 weeks ago

👀 @DiegoPino

alliomeria commented 3 weeks ago

Resolved by https://github.com/esmero/archipelago-deployment/pull/271