Compare commits

..

4 Commits

Author SHA1 Message Date
c936756f7d update README.md 2025-02-11 17:33:12 -08:00
f0d0d1479c update app/photo_routes/scripts/get_exif_data.py to account
for new exif data type of IFDRational, instead of tuple for
some exif attributes
2025-02-10 16:27:51 -08:00
7997202d77 fix style app/photo_routes/scripts/process_uploaded_photo.py 2025-02-09 18:08:03 -08:00
533a82f314 fix style app/photo_routes/scripts/get_exif_data.py 2025-02-09 17:51:25 -08:00
3 changed files with 105 additions and 27 deletions

View File

@ -85,3 +85,6 @@ For 2fa, you can use an authenticator application such as
2. install certbot and get certs for each of the two subdomains 2. install certbot and get certs for each of the two subdomains
2. install service file in `/etc/systemd/system` 2. install service file in `/etc/systemd/system`
2. enable and start systemd service 2. enable and start systemd service
## Debian 12 Upgrade
2. wtforms.validators now requires `python3-wtforms-components` for the email validator

View File

@ -26,15 +26,34 @@ def get_exif(img_raw, exif_data):
if v == "Software": if v == "Software":
exif_data['Software'] = exifdata[k] exif_data['Software'] = exifdata[k]
if v == "DateTime": if v == "DateTime":
exif_data['DateTime'] = datetime.strptime(exifdata[k], date_format) exif_data['DateTime'] = datetime.strptime(
exifdata[k],
date_format,
)
if v == "DateTimeOriginal": if v == "DateTimeOriginal":
exif_data['DateTimeOriginal'] = datetime.strptime(exifdata[k], date_format) exif_data['DateTimeOriginal'] = datetime.strptime(
exifdata[k],
date_format,
)
if v == "DateTimeDigitized": if v == "DateTimeDigitized":
exif_data['DateTimeDigitized'] = datetime.strptime(exifdata[k], date_format) exif_data['DateTimeDigitized'] = datetime.strptime(
exifdata[k],
date_format,
)
if v == "FNumber": if v == "FNumber":
exif_data['fnumber'] = round(exifdata[k][0] / exifdata[k][1], 1) if type(exifdata[k]) == tuple:
x, y = exifdata[k][0], exifdata[k][1]
else:
x = exifdata[k].numerator
y = exifdata[k].denominator
exif_data['fnumber'] = round(x / y, 1)
if v == "DigitalZoomRatio": if v == "DigitalZoomRatio":
exif_data['DigitalZoomRatio'] = round(exifdata[k][0] / exifdata[k][1], 2) if type(exifdata[k]) == tuple:
x, y = exifdata[k][0], exifdata[k][1]
else:
x = exifdata[k].numerator
y = exifdata[k].denominator
exif_data['DigitalZoomRatio'] = round(x / y, 2)
if v == "TimeZoneOffset": if v == "TimeZoneOffset":
exif_data['TimeZoneOffset'] = exifdata[k] exif_data['TimeZoneOffset'] = exifdata[k]
if v == "GPSInfo": if v == "GPSInfo":
@ -42,35 +61,66 @@ def get_exif(img_raw, exif_data):
for h, i in GPSTAGS.items(): for h, i in GPSTAGS.items():
if h in exifdata[k]: if h in exifdata[k]:
if i == 'GPSAltitudeRef': if i == 'GPSAltitudeRef':
gpsinfo['GPSAltitudeRef'] = int.from_bytes(exifdata[k][h], "big") gpsinfo['GPSAltitudeRef'] = int.from_bytes(
exifdata[k][h],
"big",
)
if i == 'GPSAltitude': if i == 'GPSAltitude':
gpsinfo['GPSAltitude'] = round(exifdata[k][h][0] / exifdata[k][h][1], 3) if type(exifdata[k][h]) == tuple:
x = exifdata[k][h][0]
y = exifdata[k][h][1]
else:
x = exifdata[k][h].numerator
y = exifdata[k][h].denominator
gpsinfo['GPSAltitude'] = round(x / y, 3)
if i == 'GPSLatitudeRef': if i == 'GPSLatitudeRef':
gpsinfo['GPSLatitudeRef'] = exifdata[k][h] gpsinfo['GPSLatitudeRef'] = exifdata[k][h]
if i == 'GPSLatitude': if i == 'GPSLatitude':
gpsinfo['GPSLatitude'] = calc_coordinate(exifdata[k][h]) gpsinfo['GPSLatitude'] = calc_coordinate(
exifdata[k][h],
)
if i == 'GPSLongitudeRef': if i == 'GPSLongitudeRef':
gpsinfo['GPSLongitudeRef'] = exifdata[k][h] gpsinfo['GPSLongitudeRef'] = exifdata[k][h]
if i == 'GPSLongitude': if i == 'GPSLongitude':
gpsinfo['GPSLongitude'] = calc_coordinate(exifdata[k][h]) gpsinfo['GPSLongitude'] = calc_coordinate(
exifdata[k][h],
)
update_gpsinfo(gpsinfo, exif_data) update_gpsinfo(gpsinfo, exif_data)
def update_gpsinfo(gpsinfo, exif_data): def update_gpsinfo(gpsinfo, exif_data):
if 'GPSAltitudeRef' in gpsinfo and 'GPSLatitude' in gpsinfo: if 'GPSAltitudeRef' in gpsinfo and 'GPSLatitude' in gpsinfo:
exif_data['GPSAltitude'] = gpsinfo['GPSAltitude'] exif_data['GPSAltitude'] = gpsinfo['GPSAltitude']
exif_data['GPSAboveSeaLevel'] = False if gpsinfo['GPSAltitudeRef'] != 0 else True exif_data['GPSAboveSeaLevel'] = False
if gpsinfo['GPSAltitudeRef'] == 0:
exif_data['GPSAboveSeaLevel'] = True
if 'GPSLatitudeRef' in gpsinfo and 'GPSLatitude' in gpsinfo: if 'GPSLatitudeRef' in gpsinfo and 'GPSLatitude' in gpsinfo:
exif_data['GPSLatitude'] = gpsinfo['GPSLatitude'] if gpsinfo['GPSLatitudeRef'] != 'S' else 0 - gpsinfo['GPSLatitude'] if gpsinfo['GPSLatitudeRef'] != 'S':
exif_data['GPSLatitude'] = gpsinfo['GPSLatitude']
else:
exif_data['GPSLatitude'] = 0 - gpsinfo['GPSLatitude']
if 'GPSLongitudeRef' in gpsinfo and 'GPSLongitude' in gpsinfo: if 'GPSLongitudeRef' in gpsinfo and 'GPSLongitude' in gpsinfo:
exif_data['GPSLongitude'] = gpsinfo['GPSLongitude'] if gpsinfo['GPSLongitudeRef'] != 'W' else 0 - gpsinfo['GPSLongitude'] if gpsinfo['GPSLongitudeRef'] != 'W':
exif_data['GPSLongitude'] = gpsinfo['GPSLongitude']
else:
exif_data['GPSLongitude'] = 0 - gpsinfo['GPSLongitude']
def calc_coordinate(x): def calc_coordinate(x):
degrees = x[0][0] / x[0][1] if type(x[0]) == tuple:
minutes = x[1][0] / x[1][1] degrees = x[0][0] / x[0][1]
seconds = x[2][0] / x[2][1] else:
return round(degrees + minutes / 60 + seconds / 3600, 5) degrees = x[0].numerator / x[0].denominator
if type(x[1]) == tuple:
minutes = x[1][0] / x[1][1]
else:
minutes = x[1].numerator / x[1].denominator
if type(x[2]) == tuple:
seconds = x[2][0] / x[2][1]
else:
seconds = x[2].numerator / x[2].denominator
result = round(degrees + minutes / 60 + seconds / 3600, 5)
return result
def get_dimensions_and_format(photo, exif_data): def get_dimensions_and_format(photo, exif_data):

View File

@ -10,6 +10,28 @@ from .get_exif_data import get_exif_data
def process_uploaded_photo(filename, current_user, app_config): def process_uploaded_photo(filename, current_user, app_config):
crop_photo(filename, app_config['PHOTO_SAVE_PATH']) crop_photo(filename, app_config['PHOTO_SAVE_PATH'])
exif_data = get_exif_data(filename) exif_data = get_exif_data(filename)
if 'DateTimeOriginal' in exif_data:
my_date_time_original = exif_data['DateTimeOriginal']
else:
my_date_time_original = None
if 'DateTimeDigitized' in exif_data:
my_date_time_digitized = exif_data['DateTimeDigitized']
else:
my_date_time_digitized = None
if 'DigitalZoomRatio' in exif_data:
my_digital_zoom_ratio = exif_data['DigitalZoomRatio']
else:
my_digital_zoom_ratio = None
if 'TimeZoneOffset' in exif_data:
my_timezone_offset = exif_data['TimeZoneOffset']
else:
my_timezone_offset = None
if 'GPSAboveSeaLevel' in exif_data:
my_gps_above_sealevel = exif_data['GPSAboveSeaLevel']
else:
my_gps_above_sealevel = None
conn = psycopg2.connect( conn = psycopg2.connect(
dbname=app_config['DATABASE_NAME'], dbname=app_config['DATABASE_NAME'],
user=app_config['DATABASE_USER'], user=app_config['DATABASE_USER'],
@ -19,7 +41,10 @@ def process_uploaded_photo(filename, current_user, app_config):
cur = conn.cursor() cur = conn.cursor()
cur.execute("SELECT setval('photo_id_seq', (SELECT MAX(id) FROM photo))") cur.execute("SELECT setval('photo_id_seq', (SELECT MAX(id) FROM photo))")
conn.commit() conn.commit()
cur.execute("SELECT count(id) FROM photo WHERE photo_name=%s", (filename, )) cur.execute(
"SELECT count(id) FROM photo WHERE photo_name=%s",
(filename, ),
)
if cur.fetchone()[0] == 0: if cur.fetchone()[0] == 0:
sql_statement = "INSERT INTO photo(" sql_statement = "INSERT INTO photo("
@ -84,14 +109,14 @@ def process_uploaded_photo(filename, current_user, app_config):
exif_data['Model'] if 'Model' in exif_data else None, exif_data['Model'] if 'Model' in exif_data else None,
exif_data['Software'] if 'Software' in exif_data else None, exif_data['Software'] if 'Software' in exif_data else None,
exif_data['DateTime'] if 'DateTime' in exif_data else None, exif_data['DateTime'] if 'DateTime' in exif_data else None,
exif_data['DateTimeOriginal'] if 'DateTimeOriginal' in exif_data else None, my_date_time_original,
exif_data['DateTimeDigitized'] if 'DateTimeDigitized' in exif_data else None, my_date_time_digitized,
exif_data['fnumber'] if 'fnumber' in exif_data else None, exif_data['fnumber'] if 'fnumber' in exif_data else None,
exif_data['DigitalZoomRatio'] if 'DigitalZoomRatio' in exif_data else None, my_digital_zoom_ratio,
exif_data['AspectRatio'], exif_data['AspectRatio'],
exif_data['TimeZoneOffset'] if 'TimeZoneOffset' in exif_data else None, my_timezone_offset,
exif_data['GPSAltitude'] if 'GPSAltitude' in exif_data else None, exif_data['GPSAltitude'] if 'GPSAltitude' in exif_data else None,
exif_data['GPSAboveSeaLevel'] if 'GPSAboveSeaLevel' in exif_data else None, my_gps_above_sealevel,
exif_data['GPSLatitude'] if 'GPSLatitude' in exif_data else None, exif_data['GPSLatitude'] if 'GPSLatitude' in exif_data else None,
exif_data['GPSLongitude'] if 'GPSLongitude' in exif_data else None, exif_data['GPSLongitude'] if 'GPSLongitude' in exif_data else None,
int(time() * 1000) int(time() * 1000)
@ -145,14 +170,14 @@ def process_uploaded_photo(filename, current_user, app_config):
exif_data['Model'] if 'Model' in exif_data else None, exif_data['Model'] if 'Model' in exif_data else None,
exif_data['Software'] if 'Software' in exif_data else None, exif_data['Software'] if 'Software' in exif_data else None,
exif_data['DateTime'] if 'DateTime' in exif_data else None, exif_data['DateTime'] if 'DateTime' in exif_data else None,
exif_data['DateTimeOriginal'] if 'DateTimeOriginal' in exif_data else None, my_date_time_original,
exif_data['DateTimeDigitized'] if 'DateTimeDigitized' in exif_data else None, my_date_time_digitized,
exif_data['fnumber'] if 'fnumber' in exif_data else None, exif_data['fnumber'] if 'fnumber' in exif_data else None,
exif_data['DigitalZoomRatio'] if 'DigitalZoomRatio' in exif_data else None, my_digital_zoom_ratio,
exif_data['AspectRatio'], exif_data['AspectRatio'],
exif_data['TimeZoneOffset'] if 'TimeZoneOffset' in exif_data else None, my_timezone_offset,
exif_data['GPSAltitude'] if 'GPSAltitude' in exif_data else None, exif_data['GPSAltitude'] if 'GPSAltitude' in exif_data else None,
exif_data['GPSAboveSeaLevel'] if 'GPSAboveSeaLevel' in exif_data else None, my_gps_above_sealevel,
exif_data['GPSLatitude'] if 'GPSLatitude' in exif_data else None, exif_data['GPSLatitude'] if 'GPSLatitude' in exif_data else None,
exif_data['GPSLongitude'] if 'GPSLongitude' in exif_data else None, exif_data['GPSLongitude'] if 'GPSLongitude' in exif_data else None,
int(time() * 1000), int(time() * 1000),