🐕

REST API を用いたOmeka S への画像登録

2024/01/05に公開

概要

プロキシ環境下で、REST API を用いてOmeka S に画像ファイルを1件ずつPOSTして登録する処理を実装しました。

Omeka S のREST APIを操作するクライアントとして、omeka_s_tools また omeka_s_tools2 がありますが、プロキシに阻まれて活用できませんでした。そのため、Pythonのrequestsライブラリを使ってAPIを叩く方法で実装しました。

https://github.com/wragge/omeka_s_tools
https://github.com/nakamura196/omeka_s_tools2

ほぼ同様の内容がOmekaのフォーラムにありますが、日本語で読める情報として少しでも参考になればと思います。

https://forum.omeka.org/t/file-upload-via-rest-api/3603
https://forum.omeka.org/t/file-upload-using-rest-api-and-python-requests/10533/2

実装

csvファイル作成

画像登録用のcsvファイルを作成します。item_idにはメディアを登録する対象となるアイテムのInternal id (o:id)を指定します。media_fileにはメディアとして登録したいファイルのパスを指定します。

item_id media_file
3075 /path/to/media/file.jpg

実際に作成するcsvファイルにはヘッダが無いものとして、下記のPythonスクリプトを作っています。

Pythonスクリプトファイル作成

次に、REST APIを叩くPythonスクリプトファイルを用意します。

Omeka S のREST API では、ファイルをアップロードする方法として、Content-Typeがmultipart/form-dataのHTTPリクエストをサポートしています。アップロードするファイルのメタデータをまとめたJSONは"data"、ファイル本体は"file[index]"と命名してリクエストに含めてください。

参考:公式ドキュメント
https://omeka.org/s/docs/developer/api/rest_api/#upload-files

mediaUpload.py
import os
import json
import requests
import csv
from pathlib import Path

def add_media_to_item(item_id, media_file):
    files = {}
    payload = {}
    path = Path(media_file)
    file_data = {
        'o:ingester': 'upload',
        'file_index': '0',
        'o:source': path.name,
        'o:item': {'o:id': item_id},
    }
    payload.update(file_data)
    params = {
        "key_identity": "APIキー文字列",
        "key_credential": "APIキークレデンシャル文字列"
    }
    files = [
        ('data', (None, json.dumps(payload), 'application/json')), 
        ('file[0]', (path.name, open(path, 'rb'), 'image'))
    ]
    url = "http://Omeka S が動いているサーバのドメイン/api/media"
    requests.post(url, params=params, files=files)
    
csv_file_name = input()
with open(csv_file_name, encoding='utf8') as f:
    csvreader = csv.reader(f)
    for row in csvreader:
        add_media_to_item(row[0], row[1])

実行

画像登録用csvファイルのパスは標準入力で受け取ります。

$ python mediaUpload.py
mediaUpload.csv

Discussion