summaryrefslogtreecommitdiff
path: root/app/media/retriever.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/media/retriever.py')
-rw-r--r--app/media/retriever.py323
1 files changed, 0 insertions, 323 deletions
diff --git a/app/media/retriever.py b/app/media/retriever.py
deleted file mode 100644
index f5cae68..0000000
--- a/app/media/retriever.py
+++ /dev/null
@@ -1,323 +0,0 @@
-import json
-import datetime
-import os
-import io
-import urllib.request
-import urllib.parse
-import urllib.error
-
-from django.template.defaultfilters import slugify
-from django.core.exceptions import ObjectDoesNotExist
-from django.utils.encoding import force_text
-from django.conf import settings
-
-from photos.models import Photo, PhotoGallery
-
-# from https://github.com/alexis-mignon/python-flickr-api
-# terribly documented, but offers a good clean OOP approach if you're willing to figure it out...
-import flickr_api
-import flickrapi
-
-# Required PIL classes may or may not be available from the root namespace depending on the installation
-try:
- import Image
- import ImageFile
-except ImportError:
- try:
- from PIL import Image
- from PIL import ImageFile
- except ImportError:
- raise ImportError("Could not import the Python Imaging Library.")
-
-ImageFile.MAXBLOCK = 1000000
-
-EXIF_PARAMS = {
- "FNumber": 'f/2.8',
- "Make": 'Apple',
- "Model": 'iPhone',
- "ExposureTime": '',
- "ISO": '',
- "FocalLength": '',
- "LensModel": '',
- 'DateTimeOriginal': '2013:09:03 22:44:25'
-}
-
-class SyncFlickr():
-
- def __init__(self):
- self.flickr = flickrapi.FlickrAPI(settings.FLICKR_API_KEY, settings.FLICKR_API_SECRET,format='parsed-json')
-
-
- def sync_sets(self, *args, **kwargs):
- p = self.flickr.photosets.getList(user_id='85322932@N00')
- disregard = [
- 'POTD 2008',
- 'Snow Day',
- 'Wedding',
- 'Some random stuff',
- 'Lilah & Olivia',
- '6 months+',
- '6-9 months',
- '9-18 months',
- ]
- for photoset in p['photosets']['photoset']:
- if photoset['title']['_content'] in disregard:
- pass
- else:
- try:
- row = PhotoGallery.objects.get(set_id__exact=photoset['id'])
- print(('%s %s %s' % ('already have', row.set_title, 'moving on...')))
- # okay it already exists, but is it up-to-date?
- self.get_photos_in_set(photoset['id'],row)
- except ObjectDoesNotExist:
- s = PhotoGallery.objects.get_or_create(
- set_id=force_text(photoset['id']),
- set_title=force_text(photoset['title']['_content']),
- set_desc=force_text(photoset['description']['_content']),
- set_slug=slugify(force_text(photoset['title']['_content'])[:40]),
- primary=force_text(photoset['primary']),
- pub_date=datetime.datetime.fromtimestamp(float(photoset['date_create']))
- )
-
- #get_photos_in_set(photoset, s)
- #create the gallery thumbnail image:
- #photo = Photo.objects.get(flickr_id__exact=str(photoset['primary']))
- #make_gallery_thumb(photo, s)
-
-
-
- def get_photos_in_set(self, flickr_id, photoset):
- photos = self.flickr.photosets.getPhotos(photoset_id=flickr_id)
- for photo in photos['photoset']['photo']:
- try:
- p = Photo.objects.get(flickr_id__exact=str(photo['id']))
- except ObjectDoesNotExist:
- p = self.get_photo(photo['id'])
- if p.is_public:
- pass #photoset.photos.add(p)
- #slideshow_image(p, 1000, 800, 95)
- print(p)
-
- def get_photo(self, photo_id):
- photo = self.flickr.photos.getInfo(photo_id=photo_id)
- info = photo['photo']
- try:
- geo = self.flickr.photos.geo.getLocation(photo_id=photo_id)
- location, region = self.get_geo(float(geo['photo']['location']['latitude']), float(geo['photo']['location']['longitude']))
- except KeyError:
- print("no effing geodata asshat")
- exif = self.exif_handler(self.flickr.photos.getExif(photo_id=photo_id)['photo']['exif'])
- p, created = Photo.objects.get_or_create(
- title=info['title']['_content'],
- flickr_id=info['id'],
- flickr_owner=info['owner']['nsid'],
- flickr_server=info['server'],
- flickr_secret=info['secret'],
- flickr_originalsecret=info['originalsecret'],
- flickr_farm=info['farm'],
- pub_date=self.flickr_datetime_to_datetime(exif["DateTimeOriginal"].replace(':', '-', 2)),
- description=info['description']['_content'],
- exif_aperture=exif['FNumber'],
- exif_make=exif['Make'],
- exif_model=exif['Model'],
- exif_exposure=exif['ExposureTime'],
- exif_iso=exif['ISO'],
- exif_lens=exif['LensModel'],
- exif_focal_length=exif['FocalLength'],
- exif_date=self.flickr_datetime_to_datetime(exif["DateTimeOriginal"].replace(':', '-', 2)),
- lat=float(geo['photo']['location']['latitude']),
- lon=float(geo['photo']['location']['longitude']),
- region=region,
- location=location,
- )
- if created:
- for tag in info['tags']['tag']:
- p.tags.add(tag['raw'])
- p.save()
-
- local = FlickrImage()
- local.make_local_copies(p)
- #retina image:
- #slideshow_image(p, 2000, 1600, 75)
- #normal image
- print("grabbing... "+p.title)
- return p
-
-
- def sync_flickr_photos(self, *args, **kwargs):
- photos = self.flickr.people.getPhotos(user_id="85322932@N00", extras="date_upload,date_taken,geo")
- for photo in photos['photos']['photo']:
- try:
- row = Photo.objects.get(flickr_id=photo['id'], flickr_secret=photo['secret'])
- print('already have ' + photo['id'] + ' moving on')
- except ObjectDoesNotExist:
- p = self.get_photo(photo['id'])
-
-
-
- """
- ################################################
- ## Various meta data and geo helper functions ##
- ################################################
- """
-
- def exif_handler(self, data):
- converted = {}
- try:
- for t in data:
- converted[t['tag']] = t['raw']['_content']
- except:
- pass
- for k, v in list(EXIF_PARAMS.items()):
- if k not in converted:
- converted[k] = v
- return converted
-
-
- def flickr_datetime_to_datetime(self, fdt):
- from datetime import datetime
- from time import strptime
- date_parts = strptime(fdt, '%Y-%m-%d %H:%M:%S')
- return datetime(*date_parts[0:6])
-
-
- def get_geo(self, lat, lon):
- from locations.models import Location, Region
- from django.contrib.gis.geos import Point
- pnt_wkt = Point(lon, lat)
- try:
- location = Location.objects.get(geometry__contains=pnt_wkt)
- except Location.DoesNotExist:
- location = None
- try:
- region = Region.objects.get(geometry__contains=pnt_wkt)
- except Region.DoesNotExist:
- region = None
- return location, region
-
-
-
-
-
-
-class FlickrImage():
- """
- ## Photo retrieval functions to pull down images from Flickr servers ##
- """
-
- def slideshow_image(self, photo, max_width, max_height, quality):
- slide_dir = settings.IMAGES_ROOT + '/slideshow/' + photo.pub_date.strftime("%Y")
- if not os.path.isdir(slide_dir):
- os.makedirs(slide_dir)
-
- # Is it a retina image or not?
- if max_width >= 1001 or max_height >= 801:
- filename = '%s/%sx2.jpg' % (slide_dir, photo.flickr_id)
- else:
- filename = '%s/%s.jpg' % (slide_dir, photo.flickr_id)
-
- flickr_photo = photo.get_original_url()
- fname = urllib.request.urlopen(flickr_photo)
- im = io.StringIO(fname.read().decode('UTF-8')) # constructs a StringIO holding the image
- img = Image.open(im)
- cur_width, cur_height = img.size
- #if image landscape
- if cur_width > cur_height:
- new_width = max_width
- #check to make sure we aren't upsizing
- if cur_width > new_width:
- ratio = float(new_width) / cur_width
- x = (cur_width * ratio)
- y = (cur_height * ratio)
- resized = img.resize((int(x), int(y)), Image.ANTIALIAS)
- resized.save(filename, 'JPEG', quality=quality, optimize=True)
- else:
- img.save(filename)
- else:
- #image portrait
- new_height = max_height
- #check to make sure we aren't upsizing
- if cur_height > new_height:
- ratio = float(new_height) / cur_height
- x = (cur_width * ratio)
- y = (cur_height * ratio)
- resized = img.resize((int(x), int(y)), Image.ANTIALIAS)
- resized.save(filename, 'JPEG', quality=quality, optimize=True)
- else:
- img.save(filename)
- photo.slideshowimage_width = photo.get_width
- photo.slideshowimage_height = photo.get_height
- photo.slideshowimage_margintop = photo.get_margin_top
- photo.slideshowimage_marginleft = photo.get_margin_left
- photo.save()
- #now resize the local copy
-
-
- def make_local_copies(self,photo):
- orig_dir = settings.IMAGES_ROOT + '/flickr/full/' + photo.pub_date.strftime("%Y")
- if not os.path.isdir(orig_dir):
- os.makedirs(orig_dir)
- full = photo.get_original_url()
- fname = urllib.request.urlopen(full)
- im = io.StringIO(fname.read().decode('UTF-8')) # constructs a StringIO holding the image
- img = Image.open(im)
- local_full = '%s/%s.jpg' % (orig_dir, photo.flickr_id)
- img.save(local_full)
- #save large size
- large_dir = settings.IMAGES_ROOT + '/flickr/large/' + photo.pub_date.strftime("%Y")
- if not os.path.isdir(large_dir):
- os.makedirs(large_dir)
- large = photo.get_large_url()
- fname = urllib.request.urlopen(large)
- im = io.StringIO(fname.read().decode('UTF-8')) # constructs a StringIO holding the image
- img = Image.open(im)
- local_large = '%s/%s.jpg' % (large_dir, photo.flickr_id)
- if img.format == 'JPEG':
- img.save(local_large)
- #save medium size
- med_dir = settings.IMAGES_ROOT + '/flickr/med/' + photo.pub_date.strftime("%Y")
- if not os.path.isdir(med_dir):
- os.makedirs(med_dir)
- med = photo.get_medium_url()
- fname = urllib.request.urlopen(med)
- im = io.StringIO(fname.read().decode('UTF-8')) # constructs a StringIO holding the image
- img = Image.open(im)
- local_med = '%s/%s.jpg' % (med_dir, photo.flickr_id)
- img.save(local_med)
-
-
- def make_gallery_thumb(self, photo, set):
- crop_dir = settings.IMAGES_ROOT + '/gallery_thumbs/'
- if not os.path.isdir(crop_dir):
- os.makedirs(crop_dir)
- remote = photo.get_original_url()
- print(remote)
- fname = urllib.request.urlopen(remote)
- im = io.StringIO(fname.read().decode('UTF-8')) # constructs a StringIO holding the image
- img = Image.open(im)
- #calculate crop:
- cur_width, cur_height = img.size
- new_width, new_height = 291, 350
- ratio = max(float(new_width) / cur_width, float(new_height) / cur_height)
- x = (cur_width * ratio)
- y = (cur_height * ratio)
- xd = abs(new_width - x)
- yd = abs(new_height - y)
- x_diff = int(xd / 2)
- y_diff = int(yd / 2)
- box = (int(x_diff), int(y_diff), int(x_diff + new_width), int(y_diff + new_height))
-
- # create resized file
- resized = img.resize((int(x), int(y)), Image.ANTIALIAS).crop(box)
- # save resized file
- resized_filename = '%s/%s.jpg' % (crop_dir, set.id)
- try:
- if img.format == 'JPEG':
- resized.save(resized_filename, 'JPEG', quality=95, optimize=True)
- else:
- resized.save(resized_filename)
- except IOError as e:
- if os.path.isfile(resized_filename):
- os.unlink(resized_filename)
- raise e
- os.unlink(img)