Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save suin/3038cfd14aee11923feecafe446cea53 to your computer and use it in GitHub Desktop.
Save suin/3038cfd14aee11923feecafe446cea53 to your computer and use it in GitHub Desktop.
hugnoteの写真にEXIF撮影日を復元する方法

hugnoteでダウンロードした写真ファイルは、EXIFの撮影日が消去されているので、写真アプリなどに入れたとき、実際に撮影された日にその写真が現れない問題を解決する方法です。

復元手順

  1. 撮影日はダウンロードページのUIにしか情報がないため、ChromeのコンソールでDOMから撮影日とファイル名のデータをスクレイピングする。
  2. そのデータから得られた撮影日を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": ....}, ...]

JSONデータを結合する

各ページごとに1つのJSONデータが得られてるので、これを一括処理しやすいようにひとつの配列にする。

const data = [].concat(
	[{"id": ..., "date": ....}, ...],
	[{"id": ..., "date": ....}, ...],
	[{"id": ..., "date": ....}, ...],
)
console.log(JSON.stringify(data))

exiftoolで撮影日をセットする

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";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment