Skip to content

Instantly share code, notes, and snippets.

@NegatioN
Created August 2, 2022 17:08
Show Gist options
  • Save NegatioN/a24933b9e800ab54c71a48770f065714 to your computer and use it in GitHub Desktop.
Save NegatioN/a24933b9e800ab54c71a48770f065714 to your computer and use it in GitHub Desktop.
Delete all but one of jpgs taken at the same second
from PIL import Image, ExifTags
from collections import defaultdict
from datetime import datetime
import os
from tqdm import tqdm
from glob import glob
import sys
glob_string = sys.argv[1]
print(f'Searching in globstring: {glob_string}')
all_data = {}
for filename in tqdm(glob(glob_string, recursive=True)):
if not os.path.isdir(filename):
img = Image.open(filename)
exif = { ExifTags.TAGS[k]: v for k, v in img.getexif().items() if k in ExifTags.TAGS }
all_data[filename] = exif
def date_func(x): return datetime.strptime(x['DateTime'], '%Y:%m:%d %H:%M:%S') if x.get('DateTime', None) else None
overlapping_images = defaultdict(list)
for f, x in all_data.items():
try:
v = date_func(x)
if v:
overlapping_images[v].append(f)
except:
print(f'Could not parse date {x}')
keepers = []
all_files = set()
for k,v in overlapping_images.items():
all_files.update(set(v))
if len(v) > 1:
m_ind = 0
max_size = 0
for i, vv in enumerate(v):
if 'original' in vv.lower():
keepers.append(vv)
break
if 'cov.' in vv.lower() and 'photolibrary' in vv.lower():
keepers.extend([xx for xx in v if 'photolibrary' in xx.lower()])
break
else:
largest_image = list(sorted(v, key=lambda x: os.stat(x).st_size))[-1]
keepers.append(largest_image)
keepers = set(keepers)
files_to_delete = all_files.difference(keepers)
print(len(files_to_delete))
for x in tqdm(files_to_delete):
os.remove(x)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment