Raw File
gallery.py
#!/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: <garion@twcny.rr.com>
# http://garion.tzo.com/python/
#
####

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()
        self.cookie = ''
        
        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 ):
        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        
        
        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' ] = title
        
        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 ) )
            
            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://garion.tzo.com/gallery' )
    
    gallery.login( 'user', 'password' )
    #gallery.addItem( 'temp', '/home/garion/missingparts.jpg', 'test!' )
    #print gallery.newAlbum( 0, "temp2" )
    print gallery.fetchAlbumImages('temp')
    
    
    
    
    
back to top