動機
長年運用している自前の写真管理システムがあるのですが、最近は旅行などのイベント写真限定の活用となっています。スマホで気軽に写真を撮れるようになったため、日常写真まで含めると管理が追い付かなくなったからです。しかしながら、日常写真も何かしら残しておきたい気持ちもあり、今回の簡易写真整理システムを作ろうと思い立ちました。
要件定義
最低限の要素で管理できれば良いので、年月単位で写真を管理することにしました。システムへの登録は手間なく行いたいので、EXIF情報を元に自動的に撮影日時を抽出して、所定のディレクトリに格納します。そして基本的にラベリングはしないつもりですが、何かしら特記したい場合があるかもしれないので、コメントを付与できる形式にしておきます。
そしてなるべく手軽な感じにしたいので、mysqlのようにデータ本体がWebサーバ外のデータベースに格納されるような形式は避けたいです。データ本体が今回のシステムのディレクトリ配下に存在する形が望ましいです。なので、sqlite3を使うことにしました。
使用言語はPythonにします。Light weight Languageとして長らくPerlを使ってきましたが、さすがに最近は軸足をPythonに移しました。外から持ってきたシステムはPHPで動いているものが多いのですが、自分で書く場合は基本的にPythonにしています。以前はPHPやRubyも触っていましたが、機械学習との絡みからPythonに集中しました。
設計
必要なモジュールは以下となります。上から3つをライブラリとして1ファイルで用意し、下の2つをそれぞれ個別のファイルとしました。
- 写真ファイルを扱うクラス
- EXIF情報を抽出する
- 年月に基づくディレクトリへファイル移動する
- データベース機能を扱うクラス
- insert, update, delete, select
- 管理機能を扱うクラス
- 新規に写真を取り込む
- 登録済写真のコメントを編集する
- 登録済写真を削除する
- 指定日付範囲の登録済写真リストを返す
- 管理者機能を扱うクラス
- コマンドラインの引数指定を解釈して、管理機能を呼び出す
- 閲覧者機能を扱うクラス
- 年月指定のインターフェイスを提供する
- 管理機能を呼び出して、指定した年月の写真リストを表示する
データベース設計は、シンプルにidとcommentの2カラムにしました。idを”YYYYMMDDhhmmss”というフォーマットにすることで、idから撮影日時を把握し、さらに写真ファイルのURLまで特定できるようになっています。”YYYYMMDDhhmmss”は14桁の10進数ですが、sqlite3のINTEGER型は64bitなので、INTEGER型にしています。キーは何となくSTRING型ではなくINTEGER型にしておきたいです。
運用
既にサーバ上に展開して一部の写真を登録していますが、そんなに積極的には運用していないです。気が向いた時に、少しずつ登録していくつもりです。なお写真の縮小処理でEXIF情報を維持するために、縮小専用から縮小革命に乗り換えました。
最後に
このシステム自体を作ろうと思ったのは、かなり昔です。なかなか手が付かずに先延ばしにしてきた結果、当初ほどの需要もなくなってきました。それでも今回作り上げたのは、このままの放置が奥歯にものが挟まったような感じで気持ち悪かったからです。趣味プログラミング自体なかなかやらなくなってしまったので、ごく簡易なものとはいえ今回作り上げることができて良かったです。