🐕
REST API を用いたOmeka S への画像登録
概要
プロキシ環境下で、REST API を用いてOmeka S に画像ファイルを1件ずつPOSTして登録する処理を実装しました。
Omeka S のREST APIを操作するクライアントとして、omeka_s_tools また omeka_s_tools2 がありますが、プロキシに阻まれて活用できませんでした。そのため、Pythonのrequestsライブラリを使ってAPIを叩く方法で実装しました。
ほぼ同様の内容がOmekaのフォーラムにありますが、日本語で読める情報として少しでも参考になればと思います。
実装
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]"と命名してリクエストに含めてください。
参考:公式ドキュメント
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