An idiomatic Python library or accessing the SmugMug (http://www.smugmug.com) API.
It includes an API library that:
Mimics the SmugMug API methods Does type and method checking client side Has unit tests for code integrity Takes advantage of HTTP caching Case-insensitve paramater mapping - use
... [More]
the case that suits your project Integrated SmugMug API help using Python docstrings It also includes an ORM wrapper around the API that:
Treats SmugMug types as objects instead of collections of URLs Makes it as easy as creating new object instances to create SmugMug albums, images, users, etc. As easy as updating class properties to update API wrapper example:
>>> from smuggler.api import Smuggler
>>> smugmug = Smuggler()
>>> smugmug.login.withPassword('test', Password='********', APIKey='********************************')
{u'FileSizeLimit': 25165824, u'Session': {u'id': u'********************************'}, u'User': {u'DisplayName': u'Your Name', u'NickName': u'nickname', u'id': 9999999}, u'AccountType': u'Pro', u'PasswordHash': u'********'}
>>> smugmug.albums.get()
[{u'Category': {u'id': 21, u'Name': u'Trucks'}, u'Passworded': False, u'id': 3702665, u'Title': u'2007 Tundra Crewmax'}, {u'Category': {u'id': 39, u'Name': u'Births'}, u'Passworded': False, u'id': 9992, u'Title': u"Son's Birth"}]
>>> smugmug.albums.getInfo(999999999999999)
Traceback (most recent call last):
File "", line 1, in
File "/Projects/Cixate/Smuggler/trunk/src/api/method.py", line 152, in __call__
return self.smuggler.execute(self.module, *args, **kwargs)
File "api/smuggler.py", line 65, in execute
raise errors.get(response.code, response.message)
api.errors.SystemError: system error
>>> smugmug.albums.getInfo(3702665)
{u'Category': {u'id': 21}, u'Title': u'2007 Tundra Crewmax', u'UnsharpThreshold': 0.050000000000000003, u'Comments': True, u'WorldSearchable': False, u'UnsharpAmount': 0.20000000000000001, u'LastUpdated': u'2007-10-23 15:43:25', u'Template': {u'id': 0}, u'Highlight': {u'id': 0}, u'PasswordHint': u'', u'Public': False, u'FriendEdit': False, u'Originals': True, u'Description': u'2007 Toyota Tundra Crewmax, 4x2 5.7L V8, 380 HP', u'Watermark': {u'id': 0}, u'Printable': False, u'id': 3702665, u'Filenames': False, u'SortDirection': False, u'External': True, u'Password': u'', u'ImageCount': 19, u'X2Larges': True, u'SubCategory': {u'id': 0}, u'Larges': True, u'DefaultColor': False, u'SortMethod': u'Position', u'UnsharpRadius': 1, u'Protected': False, u'UnsharpSigma': 1, u'SmugSearchable': False, u'Clean': False, u'Position': 1, u'X3Larges': True, u'FamilyEdit': False, u'EXIF': True, u'Share': True, u'Community': {u'id': 0}, u'Header': False, u'XLarges': True, u'HideOwner': False, u'Watermarking': False, u'ProofDays': 0, u'Keywords': u'', u'CanRank': True, u'Backprinting': u'', u'Geography': False}
>>> smugmug.images.get(3702665)
[{u'id': 212117936}, {u'id': 212118013}, {u'id': 212118179}, {u'id': 212118374}, {u'id': 212117805}, {u'id': 212117885}, {u'id': 212118536}, {u'id': 212118834}, {u'id': 212118698}, {u'id': 212118986}, {u'id': 212119402}, {u'id': 212120243}, {u'id': 212119138}, {u'id': 212117672}, {u'id': 212117735}, {u'id': 212119536}, {u'id': 212119823}, {u'id': 212119977}, {u'id': 212120115}]
>>> smugmug.image.getInfo(212117936)
Traceback (most recent call last):
File "", line 1, in
File "/Projects/Cixate/Smuggler/trunk/src/api/smuggler.py", line 77, in __getattr__
module = __import__(key, globals(), locals())
ImportError: No module named image
>>> smugmug.images.getInfo(212117936)
{u'Album': {u'id': 3702665}, u'LargeURL': u'http://cixate.smugmug.com/photos/212117936-L.jpg', u'OriginalURL': u'http://cixate.smugmug.com/photos/212117936-O.jpg', u'X2LargeURL': u'http://cixate.smugmug.com/photos/212117936-X2.jpg', u'X3LargeURL': u'http://cixate.smugmug.com/photos/212117936-X3.jpg', u'AlbumURL': u'http://cixate.smugmug.com/gallery/3702665/1/212117936', u'Width': 3072, u'Height': 2304, u'SmallURL': u'http://cixate.smugmug.com/photos/212117936-S.jpg', u'id': 212117936, u'Format': u'JPG', u'Date': u'2007-10-23 15:20:06', u'ThumbURL': u'http://cixate.smugmug.com/photos/212117936-Th.jpg', u'XLargeURL': u'http://cixate.smugmug.com/photos/212117936-XL.jpg', u'MD5Sum': u'7d063826a3657396d1062fa11f088407', u'Caption': u'Big grill', u'TinyURL': u'http://cixate.smugmug.com/photos/212117936-Ti.jpg', u'Position': 1, u'Watermark': u'0', u'LastUpdated': u'2007-10-23 15:45:39', u'FileName': u'PA230278.JPG', u'MediumURL': u'http://cixate.smugmug.com/photos/212117936-M.jpg', u'Keywords': u'', u'Serial': 0, u'Size': 1494877}
>>> smugmug.logout()
{u'Successful': u''}ORM wrapper example:
>>> from smuggler.orm import Runner
>>> from smuggler.api import Smuggler
>>> smugmug = Smuggler()
>>> smugmug.login.withPassword('test', Password='********', APIKey='********************************')
>>> runner = Runner(smugmug)
>>> albums = runner.get_all(Album)
>>> album = albums[0]
>>> album.id
3702665
>>> album.title
u'2007 Tundra Crewmax'
>>> album.title = 'My New Truck'
>>> album.save()
>>> image = Image(album)
>>> image.caption = 'Spacious cab'
>>> image.filename = '/My Photos/My Truck/PA230279.JPG'
>>> image.save()
>>> image.crop(100, 100, 0, 0)
>>> image.rotate(Degrees=90, Flip=False)
>>> smugmug.logout()
{u'Successful': u''} [Less]