sm-photo-tool bug fix release – 1.19

30 10 2009

sm-photo-tool had a problem where it would no longer upload pictures to your smugmug.com account, a bug of this magnitude pretty much renders a photo uploader useless :) I fixed the upload issue and at the same time switched it from using a HTTP POST with multipart encoded data to HTTP PUT. Uploads are now FASTER!

You can download version 1.19 here: http://github.com/jmrodri/sm-photo-tool/downloads





sm-photo-tool 1.16 released!

5 08 2009

Hey there Smugmuggers!

I’m releasing version 1.16 of sm-photo-tool tonight. For those that don’t know, sm-photo-tool is a command line program that aids in managing your photos on smugmug.com. Given a directory of photos, you can create a new album on smugmug.com, then upload all of the pictures in the directory into that newly created album.

[jmrodri@firebird ~]$ cd myphotos
[jmrodri@firebird  myphotos]$ sm-photo-tool create 'my photos album'
[my photos album] created with id [9164554]
[jmrodri@firebird myphotos]$ sm-photo-tool update
./spaceshuttlehuge.jpg...[OK] 939321 bytes 24 seconds 38KB/sec ETA 0
24 939321 bytes 38KB/sec

This release is mainly a maintenance release but I also refactored the code from a single python file to a series of modules, and cleaned up the available commands.

REFACTOR

Version 1.15 of sm-photo-tool contained a single python script, while this is easy to use, it is a bear to maintain. All of the commands were moved into smcommands.py as new classes.  I then replaced all of the horrible option parsing from the previous script in the individual command classes. Thanks to yum and tito project for the inspiration in moving the commands to a separate module.

COMMAND LINE OPTION CHANGES

In the process of refactoring I deemed a few of the commands as redundant and merged them into other commands.

[jmrodri@firebird ~]$ sm-photo-tool 

Usage: sm-photo-tool [options] MODULENAME --help

Supported modules:

	create         creates a new gallery and uploads the given files.
	list           Lists the files in an album, or lists available galleries
	upload         Upload the given files to the given gallery_id.
	full_update    Mirror an entire directory tree.
	update         Updates gallery with any new or modified images.
  • create_upload no longer exists, it was replaced by create –upload
  • galleries merged with list
  • list gained two new options album and galleries
[jmrodri@firebird ~]$ sm-photo-tool list --help
Usage: sm-photo-tool list 

Lists the files in an album, or lists available galleries

Options:
  -h, --help           show this help message and exit
  --login=LOGIN        smugmug.com username
  --password=PASSWORD  smugmug.com password
  --quiet              Don't tell us what you are doing

README

If you download the tarball, do the following:

  • cd /opt/
  • sudo tar -zxf ~/Download/sm-photo-tool-1.16.tar.gz
  • cd sm-photo-tool-1.16/src/
  • copy the smugmugrc to $HOME/.smugmugrc
  • add your login and password to .smugmugrc
  • ./sm-photo-tool –help

Fedora users have an easier time :) <pre>rpm -Uvh http://cloud.github.com/downloads/jmrodri/sm-photo-tool/sm-photo-tool-1.16-2.fc11.noarch.rpm</pre>

Happy uploading! If you run into any problems, leave me a comment or write up an issue here: http://github.com/jmrodri/sm-photo-tool/issues





migrated to github

23 07 2009

I decided to join the legions moving to github.com, I moved my projects, sm-photo-tool and zmugfs, from sourceforge.net to github.com. The clean interface on github.com is awesome and the whole social networking aspect about it is very appealing. If you haven’t moved to git give github.com a try.





sm-photo-tool 1.13 released

23 04 2008

Tonight I released version 1.13 of sm-photo-tool. Download it here:
http://sourceforge.net/project/showfiles.php?group_id=179298





sm-photo-tool

17 03 2008

I released a new version of sm-photo-tool. It’s a simple script that that was originally written by John Ruttenberg wrote. I took it and packaged it in rpm form and have been maintaining it under source control (versus a forum).

sm-photo-tool help
Usage: sm-photo-tool create gallery_name [options] [file...]
       sm-photo-tool create_upload gallery_name [options] [file...]
       sm-photo-tool update [options]
       sm-photo-tool full_update [options]
       sm-photo-tool upload gallery_id [options] file...

       sm-photo-tool --help for complete documentaton

It’s create to upload an entire directory of photos to smugmug from the command line.





sm-photo-tool page using drupal

17 09 2007

I installed drupal on sourceforge this weekend. My old Welcome page for sm-photo-tool sucked, and I wanted something much more powerful than hand coded html files.





zmugfs tree created

20 08 2007




FUSE based smugmug FS

19 08 2007

I’ve been using smugmug.com to host my photos for almost 3 years now. I’ve been using sm-photo-tool to upload my pictures and I installed Fedora 7 for my wife to use to upload her pictures as well. I gave F-spot a try but I’m not a big fan. Uploading to smugmug using f-spot isn’t that easy either (well for more than a few photos).

So I had the idea “why can’t I open up a nautilus window and copy the photos to a new directory?” That’s when I remembered about FUSE but they don’t have a fs built for smugmug that I could find. So thatt’s my new project to create a FUSE based FS that connects to smugmug.com.

  • creating a new directory would create a new gallery
  • adding files into the directory will upload them to the gallery
  • deleting files removes them from smugmug
  • Linux commands like: ls, cp, mv, should all work just fine as smugmug’s API has most of these capabilities.

Hopefully, I don’t get bored and lose focus which is often the case with my ideas :(





What a difference a / makes

14 06 2007

I’ve been trying to figure out why my image upload to smugmug using HTTP PUT wasn’t working for quite some time. I always got a “connection closed” error. After looking at this example more closely I finally realized what my problem was. I forgot the freakin slash. The upload url is supposed to be http://upload.smugmug.com/filename. My code looked like this:
conn = httplib.HTTPConnection("upload.smugmug.com", 80)
conn.connect()
conn.request("PUT", filename, data, headers)

This obviously generates the following url: http://upload.smugmug.comXXX where XXX is the value of filename. That’s just outright wrong. SIGH! But I fixed it and now my uploads work. Here’s the working snippet:
conn = httplib.HTTPConnection("upload.smugmug.com", 80)
conn.connect()
conn.request("PUT", '/' + filename, data, headers)

Now I can get back to finishing my XMLRPC to JSON migration of sm-photo-tool.





tonights hackfest

20 03 2007

My work on getting sm-photo-tool to use smugmug’s REST API continues. It’s been slow going as I’m also learning python as I go.

Tonight I can get image and album info using the REST API which returns me an XML document. I parse the document using DOM, and dynamically create a class with an internal map (or dict in python) of attributes.

Here’s a sample response from the getImageInfo REST API call:

<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
 <method>smugmug.images.getInfo</method>
  <Info>
   <Image id="134646762">
    <Album id="2559293" />
    <FileName>IMG_0112.JPG</FileName>
    <Caption />
    <Keywords />
    <Position>1</Position>
    <Date>2007-03-08 17:48:25</Date>
    <Format>JPG</Format>
    <Serial>0</Serial>
    <Watermark>0</Watermark>
    <Size>2553371</Size>
    <Width>2592</Width>
    <Height>1944</Height>
    <MD5Sum>a7d81edf9fb659da1947514dbbcfb204</MD5Sum>
    <LastUpdated>2007-03-08 17:48:34</LastUpdated>
    <OriginalURL>http://familiarodriguez.smugmug.com/photos/134646762-O.jpg</OriginalURL>
    <LargeURL>http://familiarodriguez.smugmug.com/photos/134646762-L.jpg</LargeURL>
    <MediumURL>http://familiarodriguez.smugmug.com/photos/134646762-M.jpg</MediumURL>
    <SmallURL>http://familiarodriguez.smugmug.com/photos/134646762-S.jpg</SmallURL>
    <TinyURL>http://familiarodriguez.smugmug.com/photos/134646762-Ti.jpg</TinyURL>
    <ThumbURL>http://familiarodriguez.smugmug.com/photos/134646762-Th.jpg</ThumbURL>
    <AlbumURL>http://familiarodriguez.smugmug.com/gallery/2559293/1/134646762</AlbumURL>
   </Image>
  </Info>
</rsp>

This is the class I want to create:

class Image:
    def __init__(self):
        self.data = {}
    def __setitem__(self, key, value):
        #print "__setitem__(%s:%s)" % (key,value)
        self.data[key.lower()] = value
    def __getitem__(self, key):
        #print "__getitem__(%s)" % (key)
        return self.data[key.lower()]
    def __str__(self):
        return str(self.data)

This makes it easy to use the resulting object.

    print "getimageinfo ---------------------------------------"
    imgInfo = sm1.getImageInfo(sessionid, images[0])
    print "imageinfo: " + str(imgInfo)
    print "TinyURL = " + imgInfo['TinyURL']
    print "imageid = " + imgInfo['imageid']
    print "albumId = " + imgInfo['albumId']

All of the code can be found here..

A more OO way is to have getter and setter methods, but I really like the ability to treat an object as a map and send it “messages”. I despise getters and setters now.

Off to bed now.