👻

Pythonを使ってOmeka Sにメディアをアップロードする方法

に公開

概要

Pythonを使ってOmeka Sにメディアをアップロードする方法の備忘録です。

準備

環境変数を用意します。

.env
OMEKA_S_BASE_URL=https://dev.omeka.org/omeka-s-sandbox # 例
OMEKA_S_KEY_IDENTITY=
OMEKA_S_KEY_CREDENTIAL=

初期化します。

import requests
from dotenv import load_dotenv
import os

def __init__(self):

        load_dotenv(verbose=True, override=True)

        OMEKA_S_BASE_URL = os.environ.get("OMEKA_S_BASE_URL")
        self.omeka_s_base_url = OMEKA_S_BASE_URL

        self.items_url = f"{OMEKA_S_BASE_URL}/api/items"

        self.media_url = f"{OMEKA_S_BASE_URL}/api/media"

        self.params = {
            "key_identity": os.environ.get("OMEKA_S_KEY_IDENTITY"),
            "key_credential": os.environ.get("OMEKA_S_KEY_CREDENTIAL")
        }

ローカルファイルをアップロードする

def upload_media(self, path, item_id):
        files = {}
        payload = {}

        file_data = {
            'o:ingester': 'upload',
            'file_index': '0',
            'o:source': path.name,
            'o:item': {'o:id': item_id}
        }
        payload.update(file_data)
        params = self.params
        files = [
            ('data', (None, json.dumps(payload), 'application/json')), 
            ('file[0]', (path.name, open(path, 'rb'), 'image'))
        ]


        media_response = requests.post(
            self.media_url,
            params=params, files=files
        )

        # レスポンスを確認
        if media_response.status_code == 200:
            return media_response.json()["o:id"]
        else:
            return None

IIIF画像をアップロードする

以下のようなIIIF画像のURLを指定して登録します。

https://dl.ndl.go.jp/api/iiif/1288277/R0000030/info.json

def upload_media(self, iiif_url, item_id):
        payload = {
                'o:ingester': 'iiif',
                'file_index': '0',
                'o:source': iiif_url,
                'o:item': {'o:id': item_id},
            }


        media_response = requests.post(
                self.media_url,
                params=self.params,
                headers={'Content-Type': 'application/json'},
                data=json.dumps(payload)
        )

        # レスポンスを確認
        if media_response.status_code == 200:
            return media_response.json()["o:id"]
        else:
            return None

まとめ

Omeka Sへの画像登録にあたり、参考になりましたら幸いです。

Discussion