#!/usr/bin/env python #### # Copyright (C) 2004 John Sutherland # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # you can contact me at: # http://garion.tzo.com/python/ # #### # Change log: # 09-Jun-04 - Removed self.cookie='' from _doRequest to allow multiple # transactions for each login. # Fixed cut paste error in newAlbum. # (both patches from Yuti Takhteyev import urllib2_file # REQUIRED for uploading pictures. Original source from: # http://fabien.seisen.org/python/ import urllib2 import urllib import string import StringIO import sys # this implements the gallery2 protocal class Gallery: def __init__(self, url): self.url = url self.loggedIn = 0 self.cookie = '' self.protocol_version = '2.7' def _doRequest(self, request): if self.cookie != '': headers = {'Cookie': self.cookie} req = urllib2.Request( self.url + "/gallery_remote2.php", request, headers ) response = urllib2.urlopen( req ) else: response = urllib2.urlopen( self.url + "/gallery_remote2.php", request ) info = response.info() if info.has_key('set-cookie'): self.cookie = info['set-cookie'].split(';')[0] data = response.read() response = self._parseResponse( data ) print data if response[ 'status' ] != '0': raise response[ 'status_text' ] return response def _parseResponse(self, response): myStr = StringIO.StringIO( response ) for line in myStr: if string.find( line, '#__GR2PROTO__' ) != -1: break # make sure the 1st line is #__GR2PROTO__ if string.find( line, '#__GR2PROTO__' ) == -1: raise "Bad response: \r\n" + response resDict = {} for myS in myStr: strList = string.split( myS, '=', 2 ) try: resDict[ strList[0] ] = strList[ 1 ][:-1] except: resDict[ strList[0] ] = '' return resDict def _get(self,response, kwd): try: retval = response[ kwd ] except: retval = '' return retval def login(self, user, password): request = {} request[ 'cmd' ] = 'login' request[ 'protocol_version' ] = self.protocol_version request[ 'uname' ] = user request[ 'password' ] = password response = self._doRequest( request ) # as long as it comes back here without an exception, we're ok. self.loggedIn = 1 def fetchAlbums(self): request = {} request[ 'cmd' ] = 'fetch-albums' request[ 'protocol_version' ] = self.protocol_version response = self._doRequest( request ) # as long as it comes back here without an exception, we're ok. albums = [] for x in range( 1, int( response[ 'album_count' ] ) + 1 ): album = {} album[ 'name' ] = self._get( response, 'album.name.' + str( x ) ) album[ 'title' ] = self._get( response,'album.title.' + str( x ) ) album[ 'summary' ] = self._get( response,'album.summary.' + str( x ) ) album[ 'parent' ] = self._get( response,'album.parent.' + str( x ) ) album[ 'resize_size' ] = self._get( response,'album.resize_size.' + str( x ) ) album[ 'perms.add' ] = self._get( response,'album.perms.add.' + str( x ) ) album[ 'perms.write' ] = self._get( response,'album.perms.write.' + str( x ) ) album[ 'perms.del_item' ] = self._get( response,'album.perms.del_item.' + str( x ) ) album[ 'perms.del_alb' ] = self._get( response,'album.perms.del_alb.' + str( x ) ) album[ 'perms.create_sub' ] = self._get( response,'album.perms.create_sub.' + str( x ) ) album[ 'perms.info.extrafields' ] = self._get( response,'album.info.extrafields' + str( x ) ) albums.append( album ) return albums def fetchAlbumsPrune(self): request = {} request[ 'cmd' ] = 'fetch-albums-prune' request[ 'protocol_version' ] = self.protocol_version response = self._doRequest( request ) # as long as it comes back here without an exception, we're ok. albums = [] for x in range( 1, int( response[ 'album_count' ] ) + 1 ): album = {} album[ 'name' ] = self._get( response, 'album.name.' + str( x ) ) album[ 'title' ] = self._get( response,'album.title.' + str( x ) ) album[ 'summary' ] = self._get( response,'album.summary.' + str( x ) ) album[ 'parent' ] = self._get( response,'album.parent.' + str( x ) ) album[ 'resize_size' ] = self._get( response,'album.resize_size.' + str( x ) ) album[ 'thumb_size' ] = self._get( response,'album.thumb_size.' + str( x ) ) album[ 'perms.add' ] = self._get( response,'album.perms.add.' + str( x ) ) album[ 'perms.write' ] = self._get( response,'album.perms.write.' + str( x ) ) album[ 'perms.del_item' ] = self._get( response,'album.perms.del_item.' + str( x ) ) album[ 'perms.del_alb' ] = self._get( response,'album.perms.del_alb.' + str( x ) ) album[ 'perms.create_sub' ] = self._get( response,'album.perms.create_sub.' + str( x ) ) album[ 'perms.info.extrafields' ] = self._get( response,'album.info.extrafields' + str( x ) ) albums.append( album ) return albums def addItem(self, album, filename, caption, description ): request = {} request[ 'cmd' ] = 'add-item' request[ 'protocol_version' ] = self.protocol_version request[ 'set_albumName' ] = album request[ 'userfile' ] = open(filename) request[ 'userfile_name' ] = filename request[ 'caption' ] = caption request[ 'extrafield.Description' ] = description response = self._doRequest( request ) # if we get here, everything went ok. def albumProperties(self, album): request = {} request[ 'cmd' ] = 'album-properties' request[ 'protocol_version' ] = self.protocol_version request[ 'set_albumName' ] = album response = self._doRequest( request ) resDict = {} if response.has_key( 'auto_resize' ): resDict[ 'auto_resize' ] = response[ 'auto_resize' ] if response.has_key( 'add_to_beginning' ): resDict[ 'add_to_beginning' ] = response[ 'add_to_beginning' ] return resDict def newAlbum(self, parent, name=None, title=None, desc=None): request = {} request[ 'cmd' ] = 'new-album' request[ 'protocol_version' ] = self.protocol_version request[ 'set_albumName' ] = parent if name != None: request[ 'newAlbumName' ] = name if title != None: request[ 'newAlbumTitle' ] = title if desc != None: request[ 'newAlbumDesc' ] = desc response = self._doRequest( request ) return response[ 'album_name' ] def fetchAlbumImages(self, album): # Note: Does not support extrafields! request = {} request[ 'cmd' ] = 'fetch-album-images' request[ 'protocol_version' ] = self.protocol_version request[ 'set_albumName' ] = album response = self._doRequest( request ) # as long as it comes back here without an exception, we're ok. images = [] for x in range( 1, int( response[ 'image_count' ] ) + 1 ): image = {} image[ 'name' ] = self._get( response, 'image.name.' + str( x ) ) image[ 'raw_width' ] = self._get( response, 'image.raw_width.' + str( x ) ) image[ 'raw_height' ] = self._get( response, 'image.raw_height.' + str( x ) ) image[ 'resizedName' ] = self._get( response, 'image.resizedName.' + str( x ) ) image[ 'resized_width' ] = self._get( response, 'image.resized_width.' + str( x ) ) image[ 'resized_height' ] = self._get( response, 'image.resized_height.' + str( x ) ) image[ 'thumbName' ] = self._get( response, 'image.thumbName.' + str( x ) ) image[ 'thumb_width' ] = self._get( response, 'image.thumb_width.' + str( x ) ) image[ 'thumb_height' ] = self._get( response, 'image.thumb_height.' + str( x ) ) image[ 'raw_filesize' ] = self._get( response, 'image.raw_filesize.' + str( x ) ) image[ 'caption' ] = self._get( response, 'image.caption.' + str( x ) ) image[ 'clicks' ] = self._get( response, 'image.clicks.' + str( x ) ) image[ 'capturedate.year' ] = self._get( response, 'image.capturedate.year' + str( x ) ) image[ 'capturedate.mon' ] = self._get( response, 'image.capturedate.mon' + str( x ) ) image[ 'capturedate.mday' ] = self._get( response, 'image.capturedate.mday' + str( x ) ) image[ 'capturedate.hours' ] = self._get( response, 'image.capturedate.hours' + str( x ) ) image[ 'capturedate.minutes' ] = self._get( response, 'image.capturedate.minutes' + str( x ) ) image[ 'capturedate.seconds' ] = self._get( response, 'image.capturedate.seconds' + str( x ) ) image[ 'description' ] = self._get( response, 'image.extrafield.Description.' + str( x ) ) images.append( image ) return images def moveAlbum(self, source, destination): request = {} request[ 'cmd' ] = 'fetch-album-images' request[ 'protocol_version' ] = self.protocol_version request[ 'set_albumName' ] = source request[ 'set_destalbumName' ] = destination response = self._doRequest( request ) if __name__ == '__main__': gallery = Gallery( 'http://www.n8gray.org/photos' ) gallery.login( 'admin', 'password' ) #gallery.addItem( 'temp', '/Users/n8gray/Desktop/DSC_0393.jpg', 'test!', "This is my cat!" ) print gallery.newAlbum( "amaya", "temp2" ) #print gallery.newAlbum( 0, "temp2" ) print gallery.fetchAlbumImages('temp2')