hugnoteでダウンロードした写真ファイルは、EXIFの撮影日が消去されているので、写真アプリなどに入れたとき、実際に撮影された日にその写真が現れない問題を解決する方法です。
- 撮影日はダウンロードページのUIにしか情報がないため、ChromeのコンソールでDOMから撮影日とファイル名のデータをスクレイピングする。
- そのデータから得られた撮影日を
exiftool
を使って写真ファイルにセットする。
Chromeコンソールを開き、各ページごとに下記スクリプトを実行する。
console.log(JSON.stringify($('.card_content').map(function () {
const [,id1, id2] = $(this).find('h5').text().match(/ID: (\d+)-(\d+)\n/)
const id = id1+id2
const date = $(this).find('h5:contains("撮影日")').text().match(/\d{4}\/\d{2}\/\d{2}/)[0].replace(/\//g, '-')
return {id, date}
}).get(), null, ''))
コンソールに出力されたJSONをコピーしてためていく。
[{"id": ..., "date": ....}, ...]
各ページごとに1つのJSONデータが得られてるので、これを一括処理しやすいようにひとつの配列にする。
const data = [].concat(
[{"id": ..., "date": ....}, ...],
[{"id": ..., "date": ....}, ...],
[{"id": ..., "date": ....}, ...],
)
console.log(JSON.stringify(data))
brew install exiftool
でexiftoolをインストールしておく。
PHPで下記コードを実行する。
<?php
$data = '[{"id": ..., "date": ....}, ...]'; // ここに前のステップで得られたJSONをいれる
$data = json_decode($data, true);
$files = glob('/path/to/photos/*.jpg'); // ここを適切なパスにする
$set = [];
foreach ($files as $filename) {
$found = false;
foreach ($data as $datum) {
if (strpos($filename, $datum['id']) !== false) {
$set[] = ['filename' => $filename, 'date' => $datum['date']];
$found = true;
continue;
}
}
if ($found === false) {
echo "data not found $filename\n";
die();
}
}
foreach ($set as $data) {
run("exiftool -AllDates='$data[date] 12:00:00' $data[filename]");
run("exiftool \"-FileModifyDate<DateTimeOriginal\" $data[filename]");
run("exiftool -time:all -a -s $data[filename]");
echo "\n";
}
function run($command) {
echo "\$ $command";
passthru($command);
echo "\n";
}