Flickrからダウンロードした写真をGoogle photoにアップしたい。
Flickrからバックアップした写真のEXIFデータは正しく日付が割り当てられていないようだったので、以下のスクリプトで一括更新する。
import os import re import piexif from PIL import Image def extract_datetime_from_filename(filename): match = re.search(r"img_(\d{8})_(\d{6})", filename, re.IGNORECASE) if match: date_part = match.group(1) # YYYYMMDD time_part = match.group(2) # HHMMSS formatted_datetime = ( f"{date_part[:4]}:{date_part[4:6]}:{date_part[6:]} " f"{time_part[:2]}:{time_part[2:4]}:{time_part[4:]}" ) return formatted_datetime return None def update_exif_datetime(image_path): filename = os.path.basename(image_path) datetime_original = extract_datetime_from_filename(filename) if not datetime_original: print(f"Failed to extract date/time from filename: {filename}") return try: image = Image.open(image_path) if image.info.get("exif",b"")==b"": exif_dict = {"0th": {}, "Exif": {}, "GPS": {}, "Interop": {}, "1st": {}, "thumbnail": None} else: exif_dict = piexif.load(image.info.get("exif", b"")) exif_dict["Exif"][piexif.ExifIFD.DateTimeOriginal] = datetime_original.encode("utf-8") exif_dict["Exif"][piexif.ExifIFD.DateTimeDigitized] = datetime_original.encode("utf-8") exif_bytes = piexif.dump(exif_dict) image.save(image_path, "jpeg", exif=exif_bytes) print(f"Updated EXIF DateTimeOriginal to {datetime_original} for {filename}") except Exception as e: print(f"Error updating EXIF for {filename}: {e}") # 使用例 import glob import os import subprocess files = glob.glob('./*') for image_path in files: #image_path = "img_20161119_143550_31237835410_o.jpg" #image_path = "img_20160509_143550_31237835410_o.jpg" update_exif_datetime(image_path) |
動画の場合
import re import subprocess def extract_datetime_from_filename(filename): """ ファイル名から日付と時刻を抽出する関数 """ match = re.search(r'vid_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})', filename) if match: year, month, day, hour, minute, second = match.groups() return f"{year}:{month}:{day} {hour}:{minute}:{second}" return None def update_exif_metadata(file_name, date_str): """ ExifToolを使用してMP4のメタデータを更新する関数 """ subprocess.run([ "exiftool", "-AllDates=" + date_str, # すべての日付を更新 "-CreateDate=" + date_str, # 作成日 "-ModifyDate=" + date_str, # 修正日 "-overwrite_original", # 元ファイルを上書き file_name ]) print(f"ファイル '{file_name}' のメタデータを {date_str} に更新しました。") # メイン処理 import glob import os import subprocess files = glob.glob('./*') for file_name in files: #file_name = "vid_20160514_131310mp4_27756463831.mp4" # ここに対象のMP4ファイル名を入れる date_str = extract_datetime_from_filename(file_name) if date_str: update_exif_metadata(file_name, date_str) else: print("ファイル名から日時を抽出できませんでした。")