I usually upload my full-size photographs to picasaweb, the script provided at the end of this blog uses Picasa Web Album data APIs to get the details of the pics and then publishes a smaller sized pic along with some of the EXIF data to blogger using Blogger APIs. A little more details:
Requirements:
- Python 2.5
- gdata python client
- pyexif
- your gmail id
- Run the script in a shell - it will prompt for your password
- blog-id
This script creates a draft post so that you can make any changes you want before hitting the publish button.
I know you can do something similar directly from Picasa client too, but now you have the freedom to display whatever EXIF data you want in the format you want.
#!/usr/bin/python2.5 import gdata.photos.service import gdata.media import gdata.geo import gdata.blogger.client import gdata.client import atom.data import getopt import getpass import os import sys import time from gdata import service class PicasaData(object): def __init__(self, username, pw): """ Initializes Picasa data.""" self.picasa_client = gdata.photos.service.PhotosService() self.picasa_client.source = 'API' self.picasa_client.ssl = False self.picasa_client.email = username self.picasa_client.password = pw self.picasa_client.ProgrammaticLogin() self.photo_name = '' def GetAlbumName(self): """ Get the name of the picasa album""" albums = self.picasa_client.GetUserFeed(user=self.picasa_client.email) i = 0 albumidlist = [] for album in albums.entry: i+=1 albumidlist.append(album) print '%d %s (%s)' % (i, album.title.text, album.numphotos.text) album_choice = int(raw_input('Choose Album Name:')) self.album = albumidlist[album_choice-1] #print 'You choose: %s' %(self.album.title.text) return self.album.title.text def GetPicName(self): """ Get the name of the pic for which details are required.""" i = 0 photo_id_list = [] photos = self.picasa_client.GetFeed( '/data/feed/api/user/%s/albumid/%s?kind=photo&imgmax=640u' % (self.picasa_client.email, self.album.gphoto_id.text)) for photo in photos.entry: i+=1 photo_id_list.append(photo) print '%d %s:' %(i, photo.title.text) pic_choice = int(raw_input('Choose Pic Name:')) self.photo = photo_id_list[pic_choice-1] return self.photo.title.text def GetPicMetadata(self): """ Get Metadata for the chosen pic.""" meta_data = {} if self.photo.exif.model: camera = self.photo.exif.model.text else: camera = 'unknown' src = self.photo.content.src first_thumbnail = self.photo.media.thumbnail[0].url second_thumbnail = self.photo.media.thumbnail[1].url third_thumbnail = self.photo.media.thumbnail[2].url distance = self.photo.exif.distance if self.photo.exif.exposure: exposure = 1/float(self.photo.exif.exposure.text) else: exposure = 'Unknown' if self.photo.exif.focallength: focallength = self.photo.exif.focallength.text else: focallength = 'Unknown' if self.photo.exif.fstop: aperture = self.photo.exif.fstop.text else: aperture = 'Unknown' if self.photo.exif.iso: iso = self.photo.exif.iso.text else: iso = 'Unknown' if self.photo.exif.time: t = float(self.photo.exif.time.text)/1000 t = str("%s-%s-%s" %(time.gmtime(t).tm_year, time.gmtime(t).tm_mon, time.gmtime(t).tm_mday)) else: t = 'Unknown' if self.photo.geo: location = str(self.photo.geo.Point.pos.text) else: location = 'Unknown' meta_data = {'Camera': camera, 'Source': src, 'Exposure': exposure, 'Focallength': focallength, 'Aperture': aperture, 'ISO': iso, 'Time': t, 'Coordinates': location} return meta_data class BloggerData: def __init__(self, username, pw): """Initialize blogger data.""" self.blogger_client = gdata.blogger.client.BloggerClient() self.blogger_client.service = 'blogger' self.blogger_client.source = 'python script' self.blogger_client.account_type = 'GOOGLE' self.blogger_client.server = 'www.blogger.com' self.blogger_client.email = username self.blogger_client.password = pw self.blogger_client.ClientLogin(username, pw, self.blogger_client.source) # Get the blog ID for the first blog. self.feed = self.blogger_client.get_blogs() self.blog_id = self.feed.entry[0].get_blog_id() def PrintUserBlogTitles(self): self.feed = self.blogger_client.get_blogs() for entry in self.feed.entry: print '%s %s' %(entry.title.text, entry.get_blog_id()) def CreatePost(self, title, content, is_draft): blog_id = 'XXX' # Put your blog-id here, it was a 20 digit number for me print 'Creating Draft %s' %(title) return self.blogger_client.add_post(blog_id, title, content, draft=is_draft) def main(): username = 'XXX' # Put you gmail id(without '@gmail.com') here pw = getpass.unix_getpass("Enter your password:") #pw = os.environ['PASSWD'] run_picasa = PicasaData(username, pw) album_name = run_picasa.GetAlbumName() photo_name = run_picasa.GetPicName() meta_data = run_picasa.GetPicMetadata() blogger_title = photo_name blogger_content = """<center><img src="%s"></img></center><br> <div style="text-align: center; font-family: 'Yanone Kaffeesatz';"> <i> [%s, F %s, 1/%s, ISO:%s, %s]<br> Coordinates: %s </i></div> """ %(meta_data['Source'], meta_data['Camera'], meta_data['Aperture'], meta_data['Exposure'], meta_data['ISO'], meta_data['Time'], meta_data['Coordinates']) run_blogger = BloggerData(username, pw) run_blogger.CreatePost(blogger_title, blogger_content, True) if __name__ == '__main__': main()
1 comment:
LGTM
Please fix lint errors and submit.
Post a Comment