From 46eb6b491ba3bf3aa3aa939c9be728f93905bf4b Mon Sep 17 00:00:00 2001 From: "marco.lettere" Date: Fri, 2 Dec 2022 11:59:10 +0000 Subject: [PATCH] First share --- __main__.py | 127 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 2 files changed, 128 insertions(+) create mode 100644 __main__.py create mode 100644 requirements.txt diff --git a/__main__.py b/__main__.py new file mode 100644 index 0000000..e64b914 --- /dev/null +++ b/__main__.py @@ -0,0 +1,127 @@ +import os; +import sys; +import requests; +import json; + +from PIL import Image +from PIL.Image import Exif +from PIL.ExifTags import TAGS, GPSTAGS +from io import BytesIO + +#Get auth info from env variables +refreshtoken = os.environ["ccprefreshtoken"] +context = os.environ["ccpcontext"] +clientid = os.environ["ccpclientid"] +iam = os.environ["ccpiamurl"] + +index = int(sys.argv[1]) if len(sys.argv) > 1 else 1 +workers = int(sys.argv[2]) if len(sys.argv) > 2 else 1 + +#Auth related functions + +# You can use this login data structure while testing +#logindata = { 'grant_type' : 'password', 'client_id' : clientid, 'username' : '', 'password' : ''} +logindata = { 'grant_type' : 'refresh_token', 'client_id' : clientid, 'refresh_token' : refreshtoken } +loginheaders = { "Accept" : "application/json", "Content-Type" : "application/x-www-form-urlencoded", "X-GCube-context" : context} + +def getToken(): + resp1 = requests.post(iam, data=logindata, headers=loginheaders) + jwt = resp1.json() + return jwt["access_token"] + +token = getToken() +headers = { "Authorization" : "Bearer " + token} + +storage_url = "https://workspace-repository.dev.d4science.org/storagehub/workspace" + +# GET VRE Folder for context +print("Lookup VRE folder ....") +vrefolder_url = storage_url + "/vrefolder" +response = requests.get(vrefolder_url, headers=headers) +vrefolder_item = response.json()["item"] +vrefolder_id = vrefolder_item["id"] +print("Found %(name)s (%(id)s)" % vrefolder_item) + +# List contents +print("Looing in VRE folder for a folder named 'pictures' ....") +vrefolder_list_url = storage_url + "/items/%s/children" % vrefolder_id +response = requests.get(vrefolder_list_url, headers=headers) + +# Filter out picture folder +items = response.json()["itemlist"] +l = list(filter(lambda x: x["name"] == "pictures", items)) +if(len(l) != 1): + print("Nothing found") + exit() +picturefolder = l[0] +picturefolder_id = picturefolder["id"] +print("Found %(name)s (%(id)s)" % picturefolder) + +# list pictures +print("Looking for all pictures ...") +picture_list_url = storage_url + "/items/%s/children" % picturefolder_id +response = requests.get(picture_list_url, headers=headers) +items = response.json()["itemlist"] +items = list(filter(lambda x: x["content"]["mimeType"] in ["image/png", "image/jpg", "image/jpeg"], items)) +print("Found %d pictures." % len(items)) + +# compute start and count indexes +count = round(len(items) / workers) +start = (index - 1) * count +end = start + count +pictures = items[int(start):int(end)] +print("Treating %d pictures from %d to %d." % (count, start, end)) + +output = [] +for pic in pictures: + print("Treating picture %(name)s %(id)s" % pic) + picture_url = storage_url + "/items/%s/download" % pic["id"] + response = requests.get(picture_url, headers=headers, stream=True) + img = Image.open(BytesIO(response.content)) + exif = img.getexif() + for k,v in TAGS.items(): + if v == "GPSInfo": + gps_info = exif.get_ifd(k) + lat = lon = alt = None + latsign = lonsign = altsign = 1 + for gpsk, gpsv in gps_info.items(): + #print("\t", gpsk, GPSTAGS.get(gpsk), gpsv) + if GPSTAGS.get(gpsk) == "GPSLatitude": lat = float(gpsv[0]) + float(gpsv[1]) / 60 + float(gpsv[2]) / 3600 + if GPSTAGS.get(gpsk) == "GPSLatitudeRef": latsign = -1 if gpsv == 'S' else 1 + if GPSTAGS.get(gpsk) == "GPSLongitude": lon = float(gpsv[0]) + float(gpsv[1]) / 60 + float(gpsv[2]) / 3600 + if GPSTAGS.get(gpsk) == "GPSLongitudeRef": lonsign = -1 if gpsv == 'W' else 1 + if GPSTAGS.get(gpsk) == "GPSAltitude": alt = float(gpsv) + if GPSTAGS.get(gpsk) == "GPSAltitudeRef": altsign = -1 if gpsv == -1 else 1 + if lat != None and lon != None and alt != None: + out = {'id' : pic['id'], 'name': pic['name'], 'url' : picture_url, 'lat' : lat * latsign, 'lon': lon * lonsign, 'alt' : alt * altsign} + print("GPS found: %(lon)f,%(lat)f altitude %(alt)f" % out) + output.append(out) + else: + pass + +# refresh token +token = getToken() +headers = { "Authorization" : "Bearer " + token} + +# build kml entry and upload +for o in output: + kmloutput = ''' + + + + %(name)s + + %(lon)f,%(lat)f,%(alt)f + + + +''' % o + # Create index file + files = { + 'name': (None, '%(id)s.kml' % o), + 'description': (None, 'KML indexing of item %(name)s' % o), + 'file': ('%(id)s.kml' % o, kmloutput) + } + print("Uploading kml entry as %s " % storage_url + "/items/" + picturefolder_id + "/create/FILE") + indexentry = requests.post(storage_url + "/items/" + picturefolder_id + "/create/FILE", files=files, headers=headers) + print(indexentry) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3868fb1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pillow