見出し画像

Lightroomのカタログファイルをデータベースとして読む(2)

Lightroomのカタログから以下のようなテーブル情報を取得します。

カタログファイルから得られる情報

注意事項

これからPython、SQLでカタログ(.lrcat)にアクセスしますが、Adobeが想定していない使い方になりますのでカタログを破損する可能性があります。
カタログはコピーをとって、コピーに対してアクセスすることを推奨します。(基本ここではSELECT文しか使わないのでカタログを壊すような操作はないはずですが、考慮できていない要素がないとも言い切れないため)

lrcatにアクセス

lrcatには多くのテーブルがありますが、主に使うのは以下4つのテーブルです

  • Adobe_images:写真に関する基本的な情報

  • AgLibraryFile:写真ファイルのパス

  • AgHarvestedExifMetaData:Exif情報(撮影設定情報)

  • AgHarvestedIptcMetaData:IPTC情報(市区町村など)

lrcatからテーブルデータを取ってくる最小コードは以下の通りです。
Adobe_imagesのデータをそのままとってきています。

import pandas as pd
import sqlite3

db_path = 'path_to_catalog/hoge.lrcat'
con = sqlite3.connect(db_path)

query = """
select * from Adobe_images;
"""
df = pd.read_sql(query,con=con)

クエリのイメージ

複数の情報をまとめて取得したいので、前述の4つのテーブルをJOINします。また、ファイルのパスやカメラ名、レンズ名、市区町村など文字列で入る項目は、直接文字列が入っているわけではなくidが入っており、対応するテーブルとJOINすることで、文字列に置き換えています。

各テーブルidを該当する名前に置き換えてから
この4種のテーブルをJOIN

クエリは長くなるので、Githubに上げました。

変換が必要な項目

aperture, shutterSpeedは、いずれもAPEX値という単位で入っており、適切に変換するとそれぞれF値、露光時間に変換することができます。
あまり式の中身まで追ってないですが、以下のコードを参考にしました。

https://github.com/fdenivac/Lightroom-SQL-tools/blob/e57c0fc21f426d163df21a8c078d76f21ff1975e/lrtools/display.py 

# 参考:https://github.com/fdenivac/Lightroom-SQL-tools/blob/e57c0fc21f426d163df21a8c078d76f21ff1975e/lrtools/display.py
def conv_to_f_number(aperture):
    if round(2**(aperture/2),1)*10%10==0:
        return 'F%.0f' % 2**(aperture/2)
    return 'F%.1f' % 2**(aperture/2)
def conv_to_exposure_time(shutterSpeed):
    if 2**shutterSpeed > 1:
        return '1/%.0f'  % (2**shutterSpeed)
    return '%.0f' % (1/2**shutterSpeed)

まとめ

SQLクエリ

Pythoスクリプト

import pandas as pd
import numpy as np
from pathlib import Path
import sqlite3

db_path = 'path_to_catalog/hoge.lrcat'
con = sqlite3.connect(db_path)

with open('get_photo_info.sql') as f:
    query = f.read()

def conv_to_f_number(aperture):
    if pd.isna(aperture):
        return np.nan
    if round(2**(aperture/2),1)*10%10==0:
        return 'F%.0f' % 2**(aperture/2)
    return 'F%.1f' % 2**(aperture/2)

def conv_to_exposure_time(shutterSpeed):
    if pd.isna(shutterSpeed):
        return np.nan
    if 2**shutterSpeed > 1:
        return '1/%.0f'  % (2**shutterSpeed)
    return '%.0f' % (1/2**shutterSpeed)

df_lr = pd.read_sql(query,con=con)
df_lr["fNumber"] = df_lr["aperture"].map(conv_to_f_number)
df_lr["shutterSpeed"]=df_lr["shutterSpeed"].map(conv_to_exposure_time)
df_lr["full_path"] = df_lr.apply(lambda x:Path(x["rootFolder"])/x["pathFromRoot"]/x["idx_filename"],axis=1)

これで冒頭示したようなテーブル情報が得られます。

次回は、このデータの可視化例について紹介します。


いいなと思ったら応援しよう!

この記事が参加している募集