はてなブログ + Google Photos (というか Lightroom Classic の現像のカスタムファイル名) で、写真の exif を表示する

Google Photos のオリジナルデータには exif の情報が入っているので、こいつを exif-js でパースして表示、と思ったけどそもそも CORS 的に無理だった。

なので割と力業で表示させてみた。こんな感じで exif を表示してる。

やり方

Lightroom Classic のファイル書き出しで、カスタムファイル名にゴリっと必要そうな exif をいれちゃう。これでファイル名が長い jpg ファイルができあがる。なお私の環境だと、カスタムファイル名でカスタムテキストや、テンプレート以外の文字列を埋め込むと、高確率で Lightroom が落ちたり、意図したファイル名にならなかったりした。

f:id:secondlife:20190403201832p:plain

少なくとも、Windows 環境(NTFS) + Windows の Google バックアップと同期 だと、意図したファイル名で Google Photos にアップロードされる。

はてなブログ側は、このファイル名を読み取って適当に HTML に挿入する JS をフッタなどに埋め込む。これで、このエントリーのような表示になる。力業で全然美しい方法では無い…。

document.addEventListener('DOMContentLoaded', function() {
  jQuery('img.magnifiable').each(function(_, e) {
    var filename = e.src.replace(/.*\//, '').replace(/\.*/, '');
    // YYYYMMDD__exif1__exif2__exif3 な lightroom から出力したファイル名。カスタムテキストは __ をセットしてセパレータに。
    var regexp = /^\d{8}__(.*)\.[^.]+$/;
    var matches = filename.match(regexp)
    if (matches) {
      var exif = decodeURI(decodeURIComponent(matches[1]))
        .replace(/__/g, ', ')
        .replace(/\+/g, ' ')
        .replace(/1-(\d+)\s/, '1/$1')
        .replace(' mm,', 'mm,')
        .replace(/ ISO (\d+)/, ' ISO$1')
        .replace(/\s\(f\s-\s(.+?)\)/, ', F$1');

      var exifElement = jQuery('<div/>', {
        text: exif,
        style: 'text-align: right; color: #AAAAAA; font-size: 80%; margin: -5px 5px 0 0;'
      });
      jQuery(e).parent().parent().append(exifElement);
    }
  });
});