def blob_exif(blob_key): '''Extract EXIF data from the blob data.''' keys = ( ('make', 'Make', '?'), ('model', 'Model', '?'), ('datetime', 'DateTimeDigitized', '1990:01:01 00:00:00'), ('iso', 'ISOSpeedRatings', 0), ('focal_length', 'FocalLength', 0), ('lens', 'Lens', '?'), ('exposure_time', 'ExposureTime', 1), ('exposure_time1', 'ExposureTime', 1.0), ('aperture', ['ApertureValue', 'MaxApertureValue'], 0.0), ('copyright', 'Copyright', '') ) data = {} im = Image(blob_key=blob_key) im.rotate(0) im.execute_transforms(parse_source_metadata=True) exif = im.get_original_metadata() logging.info(exif) for key, key_exif, default in keys: if key == 'datetime': dt = exif.get(key_exif, default) data[key] = datetime.datetime.strptime(dt, '%Y:%m:%d %H:%M:%S') elif key == 'focal_length': data[key] = int(exif.get(key_exif, default)) elif key == 'exposure_time': t = exif.get(key_exif, default) if t == 0: data[key] = t else: data[key] = int(round(1 / t)) elif key == 'aperture': app, max_app = key_exif aperture = exif.get(app, None) aperture = exif.get(max_app, default) if not aperture else aperture data[key] = aperture else: data[key] = exif.get(key_exif, default) return data
def get(self): url = "http://eatingstats.tumblr.com/tagged/beer/rss" d = feedparser.parse(url) articles = [] lastbeer = None lastbeerPic = "" beers = [] promile = 0 self.response.out.write("<!--") for row in d.entries: article = row['description'].encode('utf-8'); pictureUrl = re.search("(?P<url>https?://[^\s\"]+)", article).group("url") result = urlfetch.fetch(pictureUrl) if result.status_code == 200: img = Image(image_data=result.content); img.rotate(0) img.execute_transforms(parse_source_metadata=True) meta = img.get_original_metadata() self.response.out.write(meta) if 'DateCreated' in meta: #date like 2012:07:18 17:35:56 date = time.strptime(meta['DateCreated'], "%Y:%m:%d %H:%M:%S") else: #fetching the tiem from the image metadata failed. so we take the published #date from the rss feed date = row.published_parsed self.response.out.write(date) if lastbeer == None: lastbeer = date lastbeerPic = pictureUrl promile += alcoholBeer / (0.7*weightPhil) else: delta = abs(time.mktime(lastbeer) - time.mktime(date)) self.response.out.write("since the last beer: "+str(delta)) if delta > 12 * 60 * 60: break; promile += alcoholBeer / (0.7*weightPhil) if delta > 2 * 60 * 60: timeToReduceAlcohol = (delta - 2 * 60 * 60) #for two hours there will be no reduction of blood alcohol content reducedAlcoholByHourInGram = 0.1 * weightPhil reducedAlcoholSinceLastBeer = delta/3600 * reducedAlcoholByHourInGram * 0.08 if reducedAlcoholSinceLastBeer < alcoholBeer / (0.7*weightPhil): promile += alcoholBeer / (0.7*weightPhil) - reducedAlcoholSinceLastBeer self.response.out.write("current promille: "+str(promile)) beers.append(date) articles.append(pictureUrl) self.response.out.write("-->") word = "" for k,v in sorted(promilToWords.items()): if k > promile * 10 : word = v break self.response.out.write("<center><h1>Phil "+word+"!</h1>") self.response.out.write("<p>"+time.strftime('At the %d, %b %Y',beers[0])+" with "+str(round(promile/10, 4))+" percent <a href=\"http://en.wikipedia.org/wiki/Blood_alcohol_content\">blood alcohol content.</a></p>") self.response.out.write("<br /><img src=\""+lastbeerPic+"\" alt=\"last beer of phil\" /></center>") self.response.out.write("<a href=\"https://github.com/leobuettiker/whenwasphildrunk\"><img style=\"position: absolute; top: 0; right: 0; border: 0;\" src=\"https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png\" alt=\"Fork me on GitHub\"></a>")