
0nJc           @   s  d  Z  d Z d Z d Z d Z d d k l Z l Z d d k l	 Z	 d d k
 Z
 d d k Z d	 Z d
 Z d Z d Z d Z d Z e Z d Z d Z d e f d     YZ d e f d     YZ d e f d     YZ d e f d     YZ d e f d     YZ d e f d     YZ d e d d d d d d d d d d d d d d d d d d  Z d e d d d d d d d d d d d d  Z  d   Z! d   Z" d d d  Z# d d d d  Z$ d d d  Z% d    Z& d!   Z' d"   Z( d#   Z) d d$  Z* d d d%  Z+ d&   Z, d'   Z- d(   Z. d)   Z/ d*   Z0 e d+  Z1 e d,  Z2 d-   Z3 d.   Z4 d/   Z5 d0   Z6 d1 d> d2     YZ7 d3   Z8 d4   Z9 d5 d? d6     YZ: d7 d@ d8     YZ; d9 dA d:     YZ< d;   Z= d<   Z> e? d= j o e0   GHn d S(B   sy  
    flickr.py
    Copyright 2004-2006 James Clarke <james@jamesclarke.info>
    Portions Copyright 2007-2008 Joshua Henderson <joshhendo@gmail.com>

THIS SOFTWARE IS SUPPLIED WITHOUT WARRANTY OF ANY KIND, AND MAY BE
COPIED, MODIFIED OR DISTRIBUTED IN ANY WAY, AS LONG AS THIS NOTICE
AND ACKNOWLEDGEMENT OF AUTHORSHIP REMAIN.

2007-12-17
  For an upto date TODO list, please see:
  http://code.google.com/p/flickrpy/wiki/TodoList

  For information on how to use the Authentication
  module, plese see:
  http://code.google.com/p/flickrpy/wiki/UserAuthentication

2006-12-19
  Applied patches from Berco Beute and Wolfram Kriesing.

s%   James Clarke <james@jamesclarke.info>s   $Rev$s   $Date$sG   Copyright: 2004-2006 James Clarke; Portions: 2007-2008 Joshua Hendersoni(   t	   urlencodet   urlopen(   t   minidomNs   http://flickr.coms   /services/restt    s	   token.txtt   FlickrErrorc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s   /home/balrog/wp/db/flickr.pyR   7   s    t   Photoc           B   s  e  Z d  Z d d d d d d d d d	 d
 d d d d d d d d d d d g Z d% d% d% d% d% d% d% d% d% d% d% d% d% d% d% d% d  Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d   Z d% d% d  Z d d  d!  Z d"   Z d#   Z d$   Z RS(&   s   Represents a Flickr Photo.t   idt   secrett   servert
   isfavoritet   licenset   rotationt   ownert
   datepostedt	   datetakent   takengranularityt   titlet   descriptiont   ispublict   isfriendt   isfamilyt
   cancommentt
   canaddmetat   commentst   tagst   permcommentt   permaddmetac         C   s   t  |  _ |	 |  _ |
 |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _	 | |  _
 | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d S(   s"   Must specify id, rest is optional.N(   t   Falset   _Photo__loadedt   _Photo__cancommentt   _Photo__canaddmetat   _Photo__commentst   _Photo__dateuploadedt   _Photo__descriptiont
   _Photo__idt   _Photo__licenset   _Photo__isfamilyt   _Photo__isfavoritet   _Photo__isfriendt   _Photo__ispublict   _Photo__ownert   _Photo__rotationt   _Photo__secrett   _Photo__servert   _Photo__tagst   _Photo__titlet   Nonet   _Photo__datepostedt   _Photo__datetakent   _Photo__takengranularityt   _Photo__permcommentt   _Photo__permaddmeta(   t   selfR   R   t   dateuploadedR   R   R   R   R   R   R   R   R   R	   R   R
   R   R   (    (    s   /home/balrog/wp/db/flickr.pyt   __init__C   s.    																						c         C   sD   | |  i  i j o t d |   n t t |   i | |  d  S(   Ns   The attribute %s is read-only.(   t	   __class__t   _Photo__readonlyt   AttributeErrort   superR   t   __setattr__(   R6   t   keyt   value(    (    s   /home/balrog/wp/db/flickr.pyR=   b   s    c         C   s   | d j o |  i  S|  i p |  i   n | |  i i j o' t t |   i d |  i i | f  St t |   i |  Sd  S(   NR   s   _%s__%s(	   R$   R   t   _load_propertiesR9   R:   R<   R   t   __getattribute__R   (   R6   R>   (    (    s   /home/balrog/wp/db/flickr.pyt   __getattr__h   s    
'c         C   sJ  t  |  _ d } t | d |  i } | i i } | i |  _ | i |  _	 | i
 |  _ | i |  _ | i |  _ | i } t | i d | i d | i d | i |  _ | i i |  _ | i i |  _ | i i |  _ | i i |  _  | i i! |  _" | i# i$ |  _% | i# i& |  _' | i# i( |  _) | i* i+ |  _, | i* i- |  _. | i/ i |  _0 y" | i1 i2 |  _3 | i1 i4 |  _5 Wn% t6 j
 o d |  _3 d |  _5 n Xt8 | i9 d  o t: | i9 i; t<  oO g  } | i9 i; D]. } | t= | i t | i>  | i? | i  q~ |  _@ qF| i9 i; } t= | i t | i>  | i? | i  g |  _@ n d S(   s!   Loads the properties from Flickr.s   flickr.photos.getInfot   photo_idt   usernamet   realnamet   locationt   tagN(A   t   TrueR   t   _dogetR   t   rspt   photoR	   R,   R
   R-   R   R'   R   R%   R   R+   R   t   Usert   nsidRD   RE   RF   R*   R   t   textR/   R   R#   t
   visibilityR   R)   R   R(   R   R&   t   datest   postedR1   t   takenR2   R   R3   t   editabilityR   R   R   R    R   R!   t   permissionsR   R4   R   R5   R;   R0   t   hasattrR   t
   isinstanceRG   t   listt   Tagt   authort   rawR.   (   R6   t   methodt   dataRK   R   t   _[1]RG   (    (    s   /home/balrog/wp/db/flickr.pyR@   r   sH    				Hc         C   s   d |  i  S(   Ns   <Flickr Photo %s>(   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyt   __str__   s    c         C   s?   d } t  |  } t | d t d |  i d | |  i   d S(   sU   Set the tags for current photo to list tags.
        (flickr.photos.settags)
        s   flickr.photos.setTagst   authRC   R   N(   t   uniqt   _dopostRH   R   R@   (   R6   R   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   setTags   s    c         C   sS   d } t  | t  o t |  } n t | d t d |  i d | |  i   d S(   sG   Adds the list of tags to current tags. (flickr.photos.addtags)
        s   flickr.photos.addTagsR_   RC   R   N(   RV   RW   R`   Ra   RH   R   R@   (   R6   R   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   addTags   s
    c         C   se   d } d } y | i  } Wn t j
 o t d  n Xt | d t d |  i  d | |  i   d S(   s^   Remove the tag from the photo must be a Tag object.
        (flickr.photos.removeTag)
        s   flickr.photos.removeTagR   s   Tag object expectedR_   RC   t   tag_idN(   R   R;   R   Ra   RH   R@   (   R6   RG   R[   Rd   (    (    s   /home/balrog/wp/db/flickr.pyt	   removeTag   s    c      
   C   su   d } | d j o |  i } n | d j o |  i } n t | d t d | d | d |  i | |  _ | |  _ d S(   s/   Set metadata for photo. (flickr.photos.setMeta)s   flickr.photos.setMetaR_   R   R   RC   N(   R0   R   R   Ra   RH   R   R/   R#   (   R6   R   R   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   setMeta   s    	t   Mediumt   urlc         C   s`   d } t  | d |  i } x5 | i i i D]$ } | i | j o t | |  Sq+ Wt d  d S(   s   Retrieves a url for the photo.  (flickr.photos.getSizes)

        urlType - 'url' or 'source'
        'url' - flickr page of photo
        'source' - image file
        s   flickr.photos.getSizesRC   s   No URL foundN(   RI   R   RJ   t   sizest   sizet   labelt   getattrR   (   R6   Rj   t   urlTypeR[   R\   t   psize(    (    s   /home/balrog/wp/db/flickr.pyt   getURL   s     c   	      C   s   d } t  | d |  i } g  } h t d 6t d 6t d 6t d 6t d 6t d 6} x` | i i i D]O } h  } x3 | i   D]% \ } } | t | |   | | <qz W| i	 |  qa W| S(	   s   
        Get all the available sizes of the current image, and all available
        data about them.
        Returns: A list of dicts with the size data.
        s   flickr.photos.getSizesRC   Rh   t   widtht   heightRk   t   sourceRN   (
   RI   R   t   strt   intRJ   Ri   Rj   t   itemsRl   t   append(	   R6   R[   R\   t   rett   propsRn   t   dt   propt   convert_to_type(    (    s   /home/balrog/wp/db/flickr.pyt   getSizes   s    0  c         C   sU   d } y t  | d |  i } Wn t j
 o d SX| i i i } | i | i g S(   sx   
        Return the latitude+longitutde of the picture.
        Returns None if no location given for this pic.
        s   flickr.photos.geo.getLocationRC   N(	   RI   R   R   R0   RJ   RK   RF   t   latitudet	   longitude(   R6   R[   R\   t   loc(    (    s   /home/balrog/wp/db/flickr.pyt   getLocation
  s    c         C   s@   d } y t  | d |  i } Wn t j
 o d SX| i i S(   s   "
        get list of comments for photo
        returns a list of comment objects
        comment text is in return [item].text
        s   flickr.photos.comments.getListRC   N(   RI   R   R   R0   RJ   R   (   R6   R[   R\   (    (    s   /home/balrog/wp/db/flickr.pyt   getComments  s    N(   R   R   t   __doc__R:   R0   R8   R=   RB   R@   R^   Rb   Rc   Re   Rf   Ro   R|   R   R   (    (    (    s   /home/balrog/wp/db/flickr.pyR   9   s.   					
	5		
				t   Photosetc           B   s   e  Z d  Z d d d d d  Z e d    Z e d    Z e d    Z e d    Z d   Z	 d	   Z
 d
   Z d d  Z d   Z d   Z d d d  Z d   Z d d  Z e e  Z RS(   s   A Flickr photoset.i    R   c         C   sC   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   t   _Photoset__idt   _Photoset__titlet   _Photoset__primaryt   _Photoset__descriptiont   _Photoset__countt   _Photoset__secrett   _Photoset__server(   R6   R   R   t   primaryt   photosR   R	   R
   (    (    s   /home/balrog/wp/db/flickr.pyR8   *  s    						c         C   s   |  i  S(    (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyt   <lambda>4  s    c         C   s   |  i  S(    (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR   5  s    c         C   s   |  i  S(    (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR   6  s    c         C   s   |  i  S(    (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR   7  s    c         C   s   |  i  S(   N(   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyt   __len__9  s    c         C   s   d |  i  S(   Ns   <Flickr Photoset %s>(   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR^   <  s    c      
   C   sv   d } t  | d |  i } | i i i } g  } x? | D]7 } | i t | i d | i d | i d | i	  q7 W| S(   s   Returns list of Photos.s   flickr.photosets.getPhotost   photoset_idR   R	   R
   (
   RI   R   RJ   t   photosetRK   Rv   R   R   R	   R
   (   R6   R[   R\   R   t   pRK   (    (    s   /home/balrog/wp/db/flickr.pyt	   getPhotos?  s     $c         C   s   d } | d j o |  i } n g  } | D] } | | i q+ ~ } | i | j o | i | i  n t | d t d |  i d | i d | t |  |  _ t S(   s   Edit the photos in this set.

        photos - photos for set
        primary - primary photo (if None will used current)
        s   flickr.photosets.editPhotosR_   R   t   primary_photo_idt	   photo_idsN(   R0   R   R   Rv   Ra   RH   t   lenR   (   R6   R   R   R[   R]   RK   t   ids(    (    s   /home/balrog/wp/db/flickr.pyt
   editPhotosJ  s    $	c         C   s;   d } t  | d t d |  i d | i |  i d 7_ t S(   s<   Add a photo to this set.

        photo - the photo
        s   flickr.photosets.addPhotoR_   R   RC   i   (   Ra   RH   R   R   (   R6   RK   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   addPhoto_  s    "c         C   s<   d } t  | d t d |  i d | i |  i d |  _ t S(   sC   Remove the photo from this set.

        photo - the photo
        s   flickr.photosets.removePhotoR_   R   RC   i   (   Ra   RH   R   R   (   R6   RK   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   removePhotok  s    "c      
   C   su   d } | d j o |  i } n | d j o |  i } n t | d t d | d | d |  i | |  _ | |  _ t S(   s/   Set metadata for photo. (flickr.photos.setMeta)s   flickr.photosets.editMetaR_   R   R   R   N(   R0   R   R   Ra   RH   R   R   R   (   R6   R   R   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   editMetav  s    		c         C   s#   d } t  | d t d |  i t S(   s   Deletes the photoset.
        s   flickr.photosets.deleteR_   R   (   Ra   RH   R   (   R6   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   delete  s    c      
   C   s~   t  | t  p t d  n d } t | d t d | d | d | i } t | i i i | t | i  d d d | } | S(	   s>   Create a new photoset.

        photo - primary photo
        s   Photo expecteds   flickr.photosets.createR_   R   R   R   R   i   (	   RV   R   t	   TypeErrorRa   RH   R   R   RJ   R   (   t   clsRK   R   R   R[   R\   t   set(    (    s   /home/balrog/wp/db/flickr.pyt   create  s    !N(   R   R   R   R8   t   propertyR   R   R   R   R   R^   R   R0   R   R   R   R   R   R   t   classmethod(    (    (    s   /home/balrog/wp/db/flickr.pyR   '  s"   							RL   c           B   s  e  Z d  Z d d d d d d d d  Z e d    Z e d    Z e d    Z e d    Z	 e d    Z
 e d    Z e d    Z e d	    Z e d
    Z e d    Z e d    Z d   Z d   Z d   Z d   Z d d d  Z d d d  Z RS(   s   A Flickr user.c	   	      C   sU   t  |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _	 d S(   s   id required, rest optional.N(
   R   t   _User__loadedt	   _User__idt   _User__usernamet   _User__isadmint   _User__isprot   _User__realnamet   _User__locationt   _User__photos_firstdatet   _User__photos_count(	   R6   R   RD   t   isadmint   isproRE   RF   t	   firstdatet   count(    (    s   /home/balrog/wp/db/flickr.pyR8     s    								c         C   s   |  i  S(    (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   RD   (   t   _general_getattr(   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   R   (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   R   (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   RE   (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   RF   (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   t   photos_firstdate(   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   t   photos_firstdatetaken(   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   t   photos_count(   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   t   icon_server(   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   t   icon_url(   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s\   t  |  d |  i i | f  d j o |  i o |  i   n t  |  d |  i i | f  S(   s   Generic get attribute function.s   _%s__%sN(   Rl   R9   R   R0   R   R@   (   R6   t   var(    (    s   /home/balrog/wp/db/flickr.pyR     s    &c         C   sV  d } t  | d |  i } t |  _ | i i } | i |  _ | i |  _	 | i
 |  _ t | i
  d j o d | i
 |  i f |  _ n
 d |  _ | i i |  _ t t | d d  d d  |  _ t t | d	 d  d d  |  _ t t t | d
 d  d d  d d  |  _ |  i o( | i i i |  _ | i i i |  _ n d |  _ d |  _ d S(   s!   Load User properties from Flickr.s   flickr.people.getInfot   user_idi    s,   http://photos%s.flickr.com/buddyicons/%s.jpgs*   http://www.flickr.com/images/buddyicon.jpgRE   u    RN   RF   R   R   N(   RI   R   RH   R   RJ   t   personR   R   R   R   t
   iconservert   _User__icon_serverRt   t   _User__icon_urlRD   RN   R   Rl   R   R   R0   R   R   R   R   t   firstdatetakent   _User__photos_firstdatetaken(   R6   R[   R\   R   (    (    s   /home/balrog/wp/db/flickr.pyR@     s(    		!!-
	c         C   s   d |  i  S(   Ns   <Flickr User %s>(   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR^     s    c         C   s-  d } t  | d |  i } g  } t | i i d d  p | St | i i i t  op x | i i i D]X } | i	 t
 | i | i i t | i  d | i d | i d | i i d | i  qh Wnb | i i i } | i	 t
 | i | i i t | i  d | i d | i d | i i d | i  | S(	   s   Returns a list of Photosets.s   flickr.photosets.getListR   R   R	   R
   R   R   N(   RI   R   Rl   RJ   t	   photosetsR0   RV   R   RW   Rv   R   R   RN   R   R   R	   R
   R   R   (   R6   R[   R\   t   setsR   (    (    s   /home/balrog/wp/db/flickr.pyt   getPhotosets  s,     				R   c         C   s   t  d |  i d | d |  S(   NR   t   per_paget   page(   t   favorites_getPublicListR   (   R6   R   R   (    (    s   /home/balrog/wp/db/flickr.pyt   getPublicFavorites  s    c         C   s   t  d |  i d | d |  S(   NR   R   R   (   t   favorites_getListR   (   R6   R   R   (    (    s   /home/balrog/wp/db/flickr.pyt   getFavorites  s    N(   R   R   R   R0   R8   R   R   RD   R   R   RE   RF   R   R   R   R   R   R   R@   R^   R   R   R   (    (    (    s   /home/balrog/wp/db/flickr.pyRL     s(   					t   Groupc           B   s   e  Z d  Z d d d d d d d  Z e d    Z e d    Z e d    Z e d    Z	 e d    Z
 e d    Z e d    Z d	   Z d
   Z d   Z d d d d  Z d   Z d   Z RS(   s   Flickr Group Poolc         C   sU   t  |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  |  _
 d  S(   N(   R   t   _Group__loadedt
   _Group__idt   _Group__namet   _Group__memberst   _Group__onlinet   _Group__privacyt   _Group__chatidt   _Group__chatcountR0   t   _Group__url(   R6   R   t   namet   memberst   onlinet   privacyt   chatidt	   chatcount(    (    s   /home/balrog/wp/db/flickr.pyR8     s    								c         C   s   |  i  S(    (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   R   (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   R   (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   R   (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   R   (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR     s    c         C   s   |  i  d   S(   R   (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR      s    c         C   s   |  i  d   S(   R   (   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR   !  s    c         C   s\   t  |  d |  i i | f  d j o |  i o |  i   n t  |  d |  i i | f  S(   s   Generic get attribute function.s   _%s__%sN(   Rl   R9   R   R0   R   R@   (   R6   R   (    (    s   /home/balrog/wp/db/flickr.pyR   #  s    &c         C   s   d } t  | d |  i } t |  _ | i i } t i i |  _	 t i
 i |  _ t i i |  _ t i i |  _ t i i |  _ t i i |  _ d S(   s!   Loads the properties from Flickr.s   flickr.groups.getInfot   group_idN(   RI   R   RH   R   RJ   t   groupRK   R   RN   R   R   R   R   R   R   R   R   R   R   R   (   R6   R[   R\   R   (    (    s   /home/balrog/wp/db/flickr.pyR@   *  s    	c         C   s   d |  i  S(   Ns   <Flickr Group %s>(   R   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR^   :  s    R   c      
   C   sd   d } t  | d |  i d | d | d | } g  } x* | i i i D] } | i t |   qC W| S(   s*   Get a list of photo objects for this groups   flickr.groups.pools.getPhotosR   R   R   R   (   RI   R   RJ   R   RK   Rv   t   _parse_photo(   R6   R   R   R   R[   R\   R   RK   (    (    s   /home/balrog/wp/db/flickr.pyR   =  s     c         C   s,   d } t  | d t d | i d |  i t S(   s   Adds a Photo to the groups   flickr.groups.pools.addR_   RC   R   (   Ra   RH   R   (   R6   RK   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   addG  s    "c         C   s,   d } t  | d t d | i d |  i t S(   s   Remove a Photo from the groups   flickr.groups.pools.removeR_   RC   R   (   Ra   RH   R   (   R6   RK   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   removeM  s    "N(   R   R   R   R0   R8   R   R   R   R   R   R   R   R   R   R@   R^   R   R   R   (    (    (    s   /home/balrog/wp/db/flickr.pyR     s    				
	RX   c           B   s   e  Z d    Z d   Z RS(   c         C   s(   | |  _  | |  _ | |  _ | |  _ d  S(   N(   R   RY   RZ   RN   (   R6   R   RY   RZ   RN   (    (    s   /home/balrog/wp/db/flickr.pyR8   T  s    			c         C   s   d |  i  |  i f S(   Ns   <Flickr Tag %s (%s)>(   R   RN   (   R6   (    (    s   /home/balrog/wp/db/flickr.pyR^   Z  s    (   R   R   R8   R^   (    (    (    s   /home/balrog/wp/db/flickr.pyRX   S  s   	c      (   C   s"  d } t  | d | d |  d | d | d | d | d | d	 | d
 |	 d |
 d | d | d | d | d | d | d | d | d | } g  } | i i i i d  of t | i i i t  o1 xF | i i i D] } | i t	 |   q Wq	t	 | i i i  g } n | t
 | i i i  f S(   se   Returns a list of Photo objects.

    If auth=True then will auth the user.  Can see private etc
    s   flickr.photos.searchR_   R   R   RN   t   min_upload_datet   max_upload_datet   min_taken_datet   max_taken_dateR   R   R   t   sortt   safe_searcht   content_typet   tag_modet   machine_tagst   machine_tag_modet   mediat   extrasRK   (   RI   RJ   R   t   __dict__t   has_keyRV   RK   RW   Rv   R   Rt   t   pages(   R   R_   R   R   RN   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R[   R\   R   RK   (    (    s   /home/balrog/wp/db/flickr.pyt   photos_searchc  s(    
!	 c         C   sg   d } t  | d | d |  d | d | d | d | d | d	 | d
 |	 d |
 d | d | } | i i i S(   sL   Returns the number of pages for the previous function (photos_search())
    s   flickr.photos.searchR_   R   R   RN   R   R   R   R   R   R   R   R   (   RI   RJ   R   R   (   R   R_   R   R   RN   R   R   R   R   R   R   R   R   R[   R\   (    (    s   /home/balrog/wp/db/flickr.pyt   photos_search_pages  s    !c         C   sC   d } t  | d |  } t | i i i d | i i i i } | S(   s   Returns User object.s   flickr.people.findByEmailt
   find_emailRD   (   RI   RL   RJ   t   userR   RD   RN   (   t   emailR[   R\   R   (    (    s   /home/balrog/wp/db/flickr.pyt   people_findByEmail  s    'c         C   sC   d } t  | d |  } t | i i i d | i i i i } | S(   s   Returns User object.s   flickr.people.findByUsernameRD   (   RI   RL   RJ   R   R   RD   RN   (   RD   R[   R\   R   (    (    s   /home/balrog/wp/db/flickr.pyt   people_findByUsername  s    'c         C   s   d } t  | d |  d | d | } g  } t | i i d  of t | i i i t  o1 xF | i i i D] } | i t |   qi Wq t | i i i  g } n | S(   s   Returns list of Photo objects.s   flickr.people.getPublicPhotosR   R   R   RK   (	   RI   RU   RJ   R   RV   RK   RW   Rv   R   (   R   R   R   R[   R\   R   RK   (    (    s   /home/balrog/wp/db/flickr.pyt   people_getPublicPhotos  s     c      
   C   s   d } t  | d t d |  d | d | } g  } t | i i i t  o1 xF | i i i D] } | i t |   qY Wn t | i i i  g } | S(   s   Returns list of Photo objects.s   flickr.favorites.getListR_   R   R   R   (	   RI   RH   RV   RJ   R   RK   RW   Rv   R   (   R   R   R   R[   R\   R   RK   (    (    s   /home/balrog/wp/db/flickr.pyR     s    	 c      
   C   s   d } t  | d t d |  d | d | } g  } t | i i i t  o1 xF | i i i D] } | i t |   qY Wn t | i i i  g } | S(   s   Returns list of Photo objects.s   flickr.favorites.getPublicListR_   R   R   R   (	   RI   R   RV   RJ   R   RK   RW   Rv   R   (   R   R   R   R[   R\   R   RK   (    (    s   /home/balrog/wp/db/flickr.pyR     s    	 c         C   s    d } t  | d t d |  t S(   s$   Add a photo to the user's favorites.s   flickr.favorites.addR_   RC   (   Ra   RH   (   RC   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   favorites_add  s    c         C   s    d } t  | d t d |  t S(   s)   Remove a photo from the user's favorites.s   flickr.favorites.removeR_   RC   (   Ra   RH   (   RC   R[   (    (    s   /home/balrog/wp/db/flickr.pyt   favorites_remove  s    c          C   s   d }  t  |  d t } g  } t | i i i t  o= xd | i i i D]% } | i t | i	 d | i
  qG Wn+ | i i i } t | i	 d | i
 g } | S(   s4   Get a list of groups the auth'd user is a member of.s   flickr.groups.getPublicGroupsR_   R   (   RI   RH   RV   RJ   t   groupsR   RW   Rv   R   R   R   (   R[   R\   R   R   (    (    s   /home/balrog/wp/db/flickr.pyt   groups_getPublicGroups  s     'c          C   s   d }  t  |  d t } g  } t | i i i t  oF xv | i i i D]. } | i t | i	 d | i
 d | i  qG Wn4 | i i i } t | i	 d | i
 d | i g } | S(   s8   Get a list of groups the auth'd user can post photos to.s   flickr.groups.pools.getGroupsR_   R   R   (   RI   RH   RV   RJ   R   R   RW   Rv   R   R   R   R   (   R[   R\   R   R   (    (    s   /home/balrog/wp/db/flickr.pyt   groups_pools_getGroups  s     $c         C   s   d } |  d j } t  | d | d |  } t | i i i t  o, g  } | i i i D] } | | i qW ~ S| i i i i g Sd S(   s<   Returns a list of tags for the given user (in string format)s   flickr.tags.getListUserR   R_   R   N(   RI   RV   RJ   R   RG   RW   RN   (   R   R[   R_   R\   R]   RG   (    (    s   /home/balrog/wp/db/flickr.pyt   tags_getListUser  s    ,c         C   s   d } |  d j } t  | d | d |  } h  } t | i i i t  o. xM | i i i D] } | i | | i <qY Wn# | i i i i | | i i i i <| S(   s>   Gets the popular tags for a user in dictionary form tag=>counts   flickr.tags.getListUserPopularR   R_   R   (   RI   RV   RJ   R   RG   RW   R   RN   (   R   R   R[   R_   R\   t   resultRG   (    (    s   /home/balrog/wp/db/flickr.pyt   tags_getListUserPopular  s     "c         C   sz   d } t  | d t d |  } t | i i i t  o, g  } | i i i D] }  | |  i qK ~ S| i i i i g Sd S(   s$   Gets the related tags for given tag.s   flickr.tags.getRelatedR_   RG   N(   RI   R   RV   RJ   R   RG   RW   RN   (   RG   R[   R\   R]   (    (    s   /home/balrog/wp/db/flickr.pyt   tags_getrelated  s
    ,c      
   C   s   d } t  | d t d |  } yX t | i i i t  o; g  } | i i i D] } | t | i d | i	 qN ~ SWn t
 j
 o d Sd SXd S(   s)   Gets the contacts (Users) for the user_ids   flickr.contacts.getPublicListR_   R   RD   s   No users in the lists   Unknown errorN(   RI   R   RV   RJ   t   contactst   contactRW   RL   RM   RD   R;   (   R   R[   R\   R]   R   (    (    s   /home/balrog/wp/db/flickr.pyt   contacts_getPublicList  s    8c          C   s~   d }  t  |   } g  } t | i i i t  o1 xF | i i i D] } | i t |   qA Wn t | i i i  g } | S(   Ns   flickr.interestingness.getList(   RI   RV   RJ   R   RK   RW   Rv   R   (   R[   R\   R   RK   (    (    s   /home/balrog/wp/db/flickr.pyt   interestingness+  s     c          C   sC   d }  t  |  d t } t | i i i d | i i i i } | S(   Ns   flickr.test.loginR_   RD   (   RI   RH   RL   RJ   R   R   RD   RN   (   R[   R\   R   (    (    s   /home/balrog/wp/db/flickr.pyt
   test_login6  s    'c          C   s   d }  t  |   } | i i S(   Ns   flickr.test.echo(   RI   RJ   t   stat(   R[   R\   (    (    s   /home/balrog/wp/db/flickr.pyt	   test_echo<  s    c      
   K   sS   t  |  } d t t t |  t |  t |  | |  f } t t i t	 |    S(   Ns   %s%s/?api_key=%s&method=%s&%s%s(
   t   _prepare_paramst   HOSTt   APIt   API_KEYR    t   _get_auth_url_suffixt	   _get_dataR   t   parseR   (   R[   R_   t   paramsRh   (    (    s   /home/balrog/wp/db/flickr.pyRI   D  s
    c         K   s`   t  |  } d t t t |  | |  f } d t |  t |  f } t t i t	 | |    S(   Ns   %s%s/%ss   api_key=%s&method=%s&%s(
   R  R  R  R  R  R    R  R   R  R   (   R[   R_   R	  Rh   t   payload(    (    s   /home/balrog/wp/db/flickr.pyRa   R  s
    c         C   sc   x\ |  i    D]N \ } } t | t  o2 d i g  } | D] } | | q: ~  |  | <q q W|  S(   s0   Convert lists to strings with ',' between items.t   ,(   Ru   RV   RW   t   join(   R	  R>   R?   R]   t   item(    (    s   /home/balrog/wp/db/flickr.pyR  a  s
     6c         C   sR   t  |   } | i i d j p/ d | i i i | i i i f } t |  n | S(   sy   Given a bunch of XML back from Flickr, we turn it into a data structure
    we can deal with (after checking for errors).t   oks   ERROR [%s]: %s(   t	   unmarshalRJ   R   t   errt   codet   msgR   (   t   xmlR\   R  (    (    s   /home/balrog/wp/db/flickr.pyR  h  s
    "c   
      C   s  t  } | p t o t   } t } n; | t  j o | } t } n t t  j o t } t } n | p d Sd d d g } x% | i   D] } | i | d  q W| i   t g } x | D] } xM | i   D]? } | | d j o( | i |  | i t | d   q q W| d j o | i d  | i |   n | d j o | i d  | i t	  n | d j o | i d  | i |  q q Wt
 i d i |   i   }	 d | |	 f S(	   sr   Figure out whether we want to authorize, and if so, construct a suitable
    URL suffix to pass to the Flickr API.R   R  R[   t
   auth_tokeni    i   t   api_keys   &auth_token=%s&api_sig=%s(   R   t   AUTHt	   userTokenRH   Ru   Rv   R   t
   API_SECRETRs   R  t   hashlibt   md5R  t	   hexdigest(
   R[   R_   R	  t   authenticationt   tokent
   paramatersR  t
   api_stringt	   chocolatet   api_signature(    (    s   /home/balrog/wp/db/flickr.pyR  q  sH    	


 
	  c   	      C   s   t  |  i  } |  i } |  i } |  i } |  i } |  i } |  i } t |  i	 d | d | d | d | d | d | d | } |  i
 | _ | S(   s&   Create a Photo object from photo data.R   R   R   R   R   R	   R
   (   RL   R   R   R   R   R   R	   R
   R   R   R   t   raw_keys(	   RK   R   R   R   R   R   R	   R
   R   (    (    s   /home/balrog/wp/db/flickr.pyR     s    								t   Bagc           B   s   e  Z RS(    (   R   R   (    (    (    s   /home/balrog/wp/db/flickr.pyR#    s    c   	      C   s  t    } t |  t i  o8 x5 |  i i   D]  } t | | |  i | i  q, Wn g  } |  i D]$ } t | t i  o | | qb qb ~ } | o xD| D] } | i	 } t
 | |  ol t t | |   t g   j o  t | | t | |  g  n t | | t | |  t |  g  q t | t i  o- | i	 d j o t | | t |  g  q t | | t |   q WnX d i g  } |  i D]' } t | t i  o | | i qq~  } t | d |  | S(   Nt   DetailsR   RN   (   R#  RV   R   t   Elementt
   attributest   keyst   setattrR?   t
   childNodest   tagNameRU   t   typeRl   R  R  t   TextR\   (	   t   elementt   rcR>   R]   t   et   childElementst   childt   _[2]RN   (    (    s   /home/balrog/wp/db/flickr.pyR    s.    	 "' 	" *-c         C   s#   h  } t  | i |  g   | i   S(   N(   t   mapt   __setitem__R'  (   t   alistR   (    (    s   /home/balrog/wp/db/flickr.pyR`     s    t   Blogsc           B   s   e  Z e d   Z d   Z RS(   c   
   	   C   s  d } | t  j o t | d t  } n | t  j p t | d t } n g  } g  } g  } g  } y^ xW | i i i D]F } | i | i  | i | i  | i | i	  | i | i
  qw WWn t j
 o yh | i | i i i i  | i | i i i i  | i | i i i i	  | i | i i i i
  Wqqt j
 o d Sd SXn t j
 o d SX| | | | g }	 |	 S(   s*   blogs.getList requires READ authentications   flickr.blogs.getListR_   s   AttributeError, unexplained!s   Unknown error!s   There are no blogs!(   RH   RI   R   RJ   t   blogst   blogRv   R   R   t   needspasswordRh   R   R;   (
   R6   R_   R[   R\   t   bIDt   bNamet   bNeedsPwordt   bURLt   plogt   myReturn(    (    s   /home/balrog/wp/db/flickr.pyt   getList  s<       	c         C   s
   d } d S(   s-   blogs.postPhoto requires WRITE authentications   flickr.blogs.postPhotoN(   R0   (   R6   t   blogIDt   photoIDR   R   t	   bpasswordR[   (    (    s   /home/balrog/wp/db/flickr.pyt	   postPhoto  s    (   R   R   RH   R@  RD  (    (    (    s   /home/balrog/wp/db/flickr.pyR6    s   #t   Urlsc           B   s   e  Z d    Z RS(   c         C   s4   d } t  | d |  } | i i i | i i i g S(   s6   Returns user URL in an array (to access, use array[1])s   flickr.urls.getUserPhotosR   (   RI   RJ   R   RM   Rh   (   t   useridR[   R\   (    (    s   /home/balrog/wp/db/flickr.pyt   getUserPhotosURL  s    (   R   R   RG  (    (    (    s   /home/balrog/wp/db/flickr.pyRE    s   t   Authc           B   s#   e  Z d    Z d   Z d   Z RS(   c         C   sV   d } t  d t d | } t i |  i   } t | d t d | } | i i i	 S(   s-   Returns a frob that is used in authentications   flickr.auth.getFrobR  R[   R_   t   api_sig(
   R  R  R  R  R  RI   R   RJ   t   frobRN   (   R6   R[   t   sig_strt   signature_hashR\   (    (    s   /home/balrog/wp/db/flickr.pyt   getFrob  s
    c         C   s\   t    } t d t d | d | } t i |  i   } | } d t | | | f } | S(   s0   Generates a link that the user should be sent toR  RJ  t   permssG   http://flickr.com/services/auth/?api_key=%s&perms=%s&frob=%s&api_sig=%s(   RH  R  R  R  R  R  (   R6   t
   permissionRJ  t   myAuthRK  RL  RN  t   link(    (    s   /home/balrog/wp/db/flickr.pyt	   loginLink"  s    	c      
   C   sm   d } t  d t d | d | } t i |  i   } t | d t d | d t d | } | i i i	 i
 S(   s7   This token is what needs to be used in future API callss   flickr.auth.getTokenR  RJ  R[   R_   RI  (   R  R  R  R  R  RI   R   RJ   R_   R  RN   (   R6   RJ  R[   RK  RL  R\   (    (    s   /home/balrog/wp/db/flickr.pyt   getToken+  s    (   R   R   RM  RR  RS  (    (    (    s   /home/balrog/wp/db/flickr.pyRH    s   			c          C   sX   t  d j p" t t i i t  t  d  }  n t t d  }  |  i   } |  i   | S(   NR   t   r(   t	   tokenPatht   filet   ost   pathR  t	   tokenFilet   readt   close(   t   fR  (    (    s   /home/balrog/wp/db/flickr.pyR  4  s    "
c         C   s:   d } t  | d |  } | i i i | i i i g } | S(   s6   Returns user URL in an array (to access, use array[1])s   flickr.urls.getUserPhotosR   (   RI   RJ   R   RM   Rh   (   RF  R[   R\   t   userurl(    (    s   /home/balrog/wp/db/flickr.pyRG  A  s    t   __main__(    (    (    (    (@   R   t
   __author__t   __version__t   __date__t   __copyright__t   urllibR    R   t   xml.domR   R  RW  R  R  R  R  R0   R   t   passwordR   R  RU  RY  t	   ExceptionR   t   objectR   R   RL   R   RX   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R  RI   Ra   R  R  R  R   R#  R  R`   R6  RE  RH  R  RG  R   (    (    (    s   /home/balrog/wp/db/flickr.pyt   <module>   s   {jG							
										0		#	)		
