- Added centralized, self-learning GeoService (ZIP, City, Street) - Implemented Hybrid Address Management (Centralized table + Denormalized fields) - Fixed Gamification logic (PointsLedger field names & filtering) - Added address autocomplete and two-tier (Free/Premium) search API - Synchronized UserStats and PointsLedger schemas
53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
from PIL import Image
|
|
from PIL.ExifTags import TAGS, GPSTAGS
|
|
import logging
|
|
from typing import Tuple, Optional
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class MediaService:
|
|
@staticmethod
|
|
def _get_if_exist(data, key):
|
|
if key in data:
|
|
return data[key]
|
|
return None
|
|
|
|
@staticmethod
|
|
def _convert_to_degrees(value) -> float:
|
|
"""EXIF koordináták (fok, perc, másodperc) konvertálása tizedes fokká."""
|
|
d = float(value[0])
|
|
m = float(value[1])
|
|
s = float(value[2])
|
|
return d + (m / 60.0) + (s / 3600.0)
|
|
|
|
@classmethod
|
|
def extract_gps_info(cls, file_path: str) -> Optional[Tuple[float, float]]:
|
|
"""Kiolvassa a GPS koordinátákat a képből."""
|
|
try:
|
|
image = Image.open(file_path)
|
|
exif_data = image._getexif()
|
|
if not exif_data:
|
|
return None
|
|
|
|
gps_info = {}
|
|
for tag, value in exif_data.items():
|
|
decoded = TAGS.get(tag, tag)
|
|
if decoded == "GPSInfo":
|
|
for t in value:
|
|
sub_decoded = GPSTAGS.get(t, t)
|
|
gps_info[sub_decoded] = value[t]
|
|
|
|
if gps_info:
|
|
lat = cls._convert_to_degrees(gps_info['GPSLatitude'])
|
|
if gps_info['GPSLatitudeRef'] != "N":
|
|
lat = 0 - lat
|
|
|
|
lon = cls._convert_to_degrees(gps_info['GPSLongitude'])
|
|
if gps_info['GPSLongitudeRef'] != "E":
|
|
lon = 0 - lon
|
|
|
|
return lat, lon
|
|
except Exception as e:
|
|
logger.warning(f"Nem sikerült kiolvasni az EXIF adatokat: {e}")
|
|
return None
|
|
return None |