
    iW                        S r SSKJrJr  SSKJrJrJrJr  SSK	J
r
  Sr " S S\5      r " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\R(                  5      rg)z&Extractors for https://www.flickr.com/   )	ExtractorMessage   )textoauthutil	exception)memcachez0(?:https?://)?(?:www\.|secure\.|m\.)?flickr\.comc                   R    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
 rS rS rS rS rSrg)FlickrExtractor   z Base class for flickr extractorsflickrzhttps://www.flickr.comz{category}_{id}.{extension})
{category}{user[username]}z{id})g      ?g       @g      ?c                 :    S U l         U R                  S   U l        g )N    )usergroupsitem_idselfs    H/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/flickr.py_initFlickrExtractor._init   s    	{{1~    c              #   H  #    [        U 5      U l        U R                  5       nU R                  R                  nU R	                  5        Hl  n U" U5      nUR                  U5        U R                  U5      n[        R                  SU4v   [        R                  U[        R                  " XC5      4v   Mn     g ! [         a[  nU R                  R                  SUS   UR                  R                   U5        U R                  R#                  U5         S nAM  S nAff = f7f)N zSkipping photo %s (%s: %s)id)	FlickrAPIapimetadata_extract_formatphotosupdate	_file_urlr   	DirectoryUrlr   nameext_from_url	Exceptionlogwarning	__class____name__	traceback)r   dataextractphotourlexcs         r   itemsFlickrExtractor.items    s     T?}}((**[[]EJ T"nnU+''U22kk3(=(=c(III #  (  0$K!7!7> ""3''	(s2   A
D"B:A%D":
DADD"DD"c                 "   U R                   R                  U R                  5      U l        U R	                  SS5      (       aA  U R                  R                  U R                   R                  U R                  S   5      5        SU R                  0$ )zReturn general metadataprofileFnsidr   )r    urls_lookupUserr   r   configr$   people_getInfor   s    r   r!   FlickrExtractor.metadata3   sf    HH,,T\\:	;;y%((IITXX44TYYv5FGH		""r   c                     g)z2Return an iterable with all relevant photo objectsN r   s    r   r#   FlickrExtractor.photos:   s    r   c                 T    US   nSU;   a  U$ UR                  S5      u  p4nUS-   U-   $ )Nr2   z/video/.z_d.)
rpartition)r   r1   r2   path_exts         r   r%   FlickrExtractor._file_url=   s9    ElJ~~c*e|c!!r   )r    r   r   N)r-   
__module____qualname____firstlineno____doc__categoryrootfilename_fmtdirectory_fmtarchive_fmtrequest_intervalrequest_interval_minr   r4   r!   r#   r%   __static_attributes__r>   r   r   r   r      sE    *H#D0L6MK!&J&#A"r   r   c                   *    \ rS rSrSrSrSrSrS rSr	g)	FlickrImageExtractorG   z/Extractor for individual images from flickr.comimagez(?:https?://)?(?:(?:(?:www\.|secure\.|m\.)?flickr\.com/photos/[^/?#]+/|[\w-]+\.static\.?flickr\.com/(?:\d+/)+)(\d+)|flic\.kr/p/([A-Za-z1-9]+))z(https://www.flickr.com/photos/USER/12345c              #     #    [        U 5      U l        U R                  u  pUb  Sn[        R                  " X#5      nU R                  R                  U5      nU R                  R                  US5        US   S:X  a7  U R                  R                  (       a  U R                  R                  U5        OU R                  R                  U5        U R                  SS5      (       a%  U R                  R                  US   S   5      US'   OUS   US'   US	   S
   US	'   [        R                  " US   S
   5      US'   US   S
   US'   US   S    Vs/ s H  oUS   PM	     snUS'   U R                  US   5      US'   [        R                  " US   5      US'   [        R                  " US   5      US'   SU;   a<  US   nUR                  5        H#  u  px[!        U["        5      (       d  M  US
   Xg'   M%     U R%                  U5      n	[&        R(                  SU4v   [&        R*                  U	[        R,                  " X5      4v   g s  snf 7f)N:123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZFmediavideor7   ownerr8   r   title_contentcommentsdescriptiontagstagrawdateuploadeddateviewsr   locationr   )r   r    r   r   bdecodephotos_getInfo_extract_metadatavideos_extract_video_extract_photor:   r;   r   	parse_intparse_timestampr4   
isinstancedictr%   r   r&   r'   r(   )
r   r   enc_idalphabetr1   trf   keyvaluer2   s
             r   r4   FlickrImageExtractor.itemsP   s    T?++8Hll64G''0""5%0>W$HH##E*HH##E*;;y%(( HH33E'N64JKE&M!'NE&Mw
3g NN5+<Z+HIj$]3J?m+0=+?@+?a5+?@f,,U>-BCfg7gnnU4[1dZ(H&nn.
eT**$)*$5HM / nnU#U**kk3 5 5c AAA As   EIIBI+A I)r    N)
r-   rG   rH   rI   rJ   subcategorypatternexampler4   rR   r>   r   r   rT   rT   G   s    9K.G 9G&Br   rT   c                   J    \ rS rSrSrSrSrSr\S-   r	Sr
S rS	 rS
 rS rSrg)FlickrAlbumExtractory   z*Extractor for photo albums from flickr.comalbum)r   r   Albumsz{album[id]} {album[title]}za_{album[id]}_{id}z+/photos/([^/?#]+)/(?:album|set)s(?:/(\d+))?z/https://www.flickr.com/photos/USER/albums/12345c                     U R                   S   U l        U R                  (       a  [        R                  U 5      $ U R	                  5       $ )Nr   )r   album_idr   r4   _album_itemsr   s    r   r4   FlickrAlbumExtractor.items   s8    A=="((..  ""r   c              #   r  #    [        U 5      U l        [        R                  U 5      n[        US'   U R                  R                  U R                  S   5       HY  nU R                  R                  U5      R                  U5        SU R                  S    SUS    3n[        R                  X24v   M[     g 7f)N
_extractorr8   https://www.flickr.com/photos/
path_aliasz/albums/r   )r   r    r   r!   r{   photosets_getListr   _clean_infor$   r   Queue)r   r/   r}   r2   s       r   r   !FlickrAlbumExtractor._album_items   s     T?''-1\XX//		&0ABEHH  '..t43DIIl4K3LeDk],C--++	 Cs   B5B7c                    [         R                  U 5      n U R                  R                  U R                  U R
                  S   5      US'   U$ ! [         a/    0 US'   U R                  R                  SU R                  5         U$ f = f)Nr8   r}   z%%s: Unable to retrieve album metadata)	r   r!   r    photosets_getInfor   r   r)   r*   r+   r   r/   s     r   r!   FlickrAlbumExtractor.metadata   s    ''-	, HH66tyy02DM 	  	,DMHHD!]],		,s   6A 5BBc                 L    U R                   R                  U R                  5      $ N)r    photosets_getPhotosr   r   s    r   r#   FlickrAlbumExtractor.photos   s    xx++DMM::r   )r   r    N)r-   rG   rH   rI   rJ   rw   rN   rO   BASE_PATTERNrx   ry   r4   r   r!   r#   rR   r>   r   r   r{   r{   y   s:    4K=M&KKKG?G#
,	;r   r{   c                   >    \ rS rSrSrSrSrSr\S-   r	Sr
S rS	 rS
rg)FlickrGalleryExtractor   z-Extractor for photo galleries from flickr.comgallery)r   r   	Galleriesz&{gallery[gallery_id]} {gallery[title]}zg_{gallery[id]}_{id}z!/photos/([^/?#]+)/galleries/(\d+)z3https://www.flickr.com/photos/USER/galleries/12345/c                     [         R                  U 5      nU R                  S   U l        U R                  R                  U R                  5      US'   U$ )Nr   r   )r   r!   r   
gallery_idr    galleries_getInfor   s     r   r!   FlickrGalleryExtractor.metadata   sB    ''-++a.((44T__EYr   c                 L    U R                   R                  U R                  5      $ r   )r    galleries_getPhotosr   r   s    r   r#   FlickrGalleryExtractor.photos   s    xx++DOO<<r   )r   Nr-   rG   rH   rI   rJ   rw   rN   rO   r   rx   ry   r!   r#   rR   r>   r   r   r   r      s1    7KLM(KAAGCG=r   r   c                   >    \ rS rSrSrSrSrSr\S-   r	Sr
S rS	 rS
rg)FlickrGroupExtractor   z)Extractor for group pools from flickr.comgroup)r   Groupsz{group[groupname]}zG_{group[nsid]}_{id}z/groups/([^/?#]+)z#https://www.flickr.com/groups/NAME/c                 r    U R                   R                  U R                  5      U l        SU R                  0$ )Nr   )r    urls_lookupGroupr   r   r   s    r   r!   FlickrGroupExtractor.metadata   s+    XX..t||<
$$r   c                 R    U R                   R                  U R                  S   5      $ Nr8   )r    groups_pools_getPhotosr   r   s    r   r#   FlickrGroupExtractor.photos   s     xx..tzz&/ABBr   )r   Nr   r>   r   r   r   r      s/    3KBM(K11G3G%Cr   r   c                   4    \ rS rSrSrSrSr\S-   rSr	S r
Srg	)
FlickrUserExtractor   z.Extractor for the photostream of a flickr userr   zu_{user[nsid]}_{id}z/photos/([^/?#]+)/?$z#https://www.flickr.com/photos/USER/c                 R    U R                   R                  U R                  S   5      $ r   )r    people_getPhotosr   r   s    r   r#   FlickrUserExtractor.photos   s     xx((6):;;r   r>   N)r-   rG   rH   rI   rJ   rw   rO   r   rx   ry   r#   rR   r>   r   r   r   r      s$    8K'K44G3G<r   r   c                   8    \ rS rSrSrSrSrSr\S-   r	Sr
S rS	rg
)FlickrFavoriteExtractor   z.Extractor for favorite photos of a flickr userfavorite)r   r   	Favoriteszf_{user[nsid]}_{id}z/photos/([^/?#]+)/favoritesz,https://www.flickr.com/photos/USER/favoritesc                 R    U R                   R                  U R                  S   5      $ r   )r    favorites_getListr   r   s    r   r#   FlickrFavoriteExtractor.photos   s     xx))$))F*;<<r   r>   N)r-   rG   rH   rI   rJ   rw   rN   rO   r   rx   ry   r#   rR   r>   r   r   r   r      s)    8KCM'K;;G<G=r   r   c                   >    \ rS rSrSrSrSrSr\S-   r	Sr
S rS	 rS
rg)FlickrSearchExtractor   z3Extractor for flickr photos based on search resultssearch)r   Searchz{search[text]}zs_{search}_{id}z/search/?\?([^#]+)z%https://flickr.com/search/?text=QUERYc                     [         R                  " U R                  S   5      U l        SU R                  ;  a  SU R                  S'   SU R                  0$ )Nr   r   r   r   )r   parse_queryr   r   r   s    r   r!   FlickrSearchExtractor.metadata   sE    &&t{{1~6$"$DKK$++&&r   c                 L    U R                   R                  U R                  5      $ r   )r    photos_searchr   r   s    r   r#   FlickrSearchExtractor.photos   s    xx%%dkk22r   )r   Nr   r>   r   r   r   r      s.    =K>M#K22G5G'3r   r   c                   (   \ rS rSrSrSrSr/ SQrSSSS	S
SSSSSS.
rSSSSSSSSSSSS.r	\
\" SS9S 5       5       rS  rS! rS" rS# rS$ rS% rS& rS' rS( rS) rS* rS+ rS, rS- rS. rS/ rS0 rS<S2 jrS3 rS=S4 jr S5 r!S6 r"S7 r#S8 r$S>S9 jr%S: r&S;r'g1)?r      zKMinimal interface for the flickr API

https://www.flickr.com/services/api/
z%https://api.flickr.com/services/rest/r   ))oOriginalN)6kz
X-Large 6Ki   )5kz
X-Large 5Ki   )4kz
X-Large 4Ki   )3kz
X-Large 3Ki   )kz
Large 2048i   )hz
Large 1600i@  )lLargei   )cz
Medium 800i   )zz
Medium 640i  )mMediumi  )nz	Small 320i@  )sSmall   )qzLarge Square   )rs   	Thumbnaild   )r   SquareK   	                     r   r   r   )
orig1080p720p360p288p700300100appletviphone_wifizAll Rights Reservedz,Attribution-NonCommercial-ShareAlike Licensez!Attribution-NonCommercial Licensez*Attribution-NonCommercial-NoDerivs LicensezAttribution LicensezAttribution-ShareAlike LicensezAttribution-NoDerivs LicensezNo known copyright restrictionszUnited States Government WorkzPublic Domain Dedication (CC0)zPublic Domain Mark)012345678910i  )maxagec                     U R                   nUR                  R                  S5        UR                  UR                  S-   5      R
                  n[
        R                  " USS5      $ )NzRetrieving public API keyz/printsz.flickr.api.site_key = "")	extractorr*   inforequestrL   r   extr)r   r  pages      r   API_KEYFlickrAPI.API_KEY$  sO     ~~12||DII	1277yy93??r   c                 4   [         R                  R                  X5        UR                  SS5      U l        UR                  SS5      U l        UR                  SS5      U l        UR                  SS5      U l        UR                  S5      U l        [        U R                  [        5      (       ak  U R                   H.  u  p#nU R                  U:X  d  U R                  U:X  d  M(  X@l          O/   S U l        UR                  R                  SU R                  5        U R                  (       aB  U R                   Vs/ s H$  nUS	   (       a  US	   U R                  ::  d  M"  UPM&     snU l        OU R                  U l        U R                  S S
 U l        g s  snf )Nrj   TexifFr   contextszsize-maxz"Could not match '%s' to any formatr   r   )r   	OAuth1API__init__r:   rj   	meta_exif	meta_infometa_contextsmaxsizero   strFORMATSr*   r+   formats)r   r   fmtfmtnamefmtwidths        r   r
  FlickrAPI.__init__,  sD     1&&x6"))&%8"))&%8&--j%@ ''
3dllC((*.,,&h<<3&$,,'*A#+L +7
  $%%8$,,H<<+/<< E<C#&q6SVt||-C  < EDL  <<DL||BQ'	Es   ;!F Fc                 .    SU0nU R                  SU5      $ )z-Returns a list of the user's favorite photos.user_idzfavorites.getList_paginationr   r  paramss      r   r   FlickrAPI.favorites_getListE  s     W% 3V<<r   c                 V    SU0nU R                  SU5      S   nU R                  U5      $ )z!Gets information about a gallery.r   zgalleries.getInfor   _callr   )r   r   r  r   s       r   r   FlickrAPI.galleries_getInfoJ  s3    
+**0&9)D((r   c                 .    SU0nU R                  SU5      $ )z(Return the list of photos for a gallery.r   zgalleries.getPhotosr  )r   r   r  s      r   r   FlickrAPI.galleries_getPhotosP  s     
+ 5v>>r   c                 .    SU0nU R                  SU5      $ )z0Returns a list of pool photos for a given group.group_idzgroups.pools.getPhotosr  )r   r$  r  s      r   r    FlickrAPI.groups_pools_getPhotosU  s     h' 8&AAr   c                 J   SU0nU R                  SU5      n US   nS H2  n[        UR                  U5      [        5      (       d  M)  X4   S   X4'   M4     US   nS H2  n[        UR                  U5      [        5      (       d  M)  XT   S   XT'   M4     U$ ! [         a     U$ f = f)zGet information about a user.r  zpeople.getInfoperson)r_   usernamerealnamerf   
profileurl	photosurl	mobileurlr]   r#   )count	firstdatefirstdatetaken)r  ro   getrp   r)   )r   r  r  r   rt   r#   s         r   r;   FlickrAPI.people_getInfoZ  s    W%zz*F3	>D@dhhsmT22 $	* 5DI@ (^F?fjjot44"(+j"9FK @   		s   ,B 9B B 
B"!B"c                 .    SU0nU R                  SU5      $ )z0Return photos from the given user's photostream.r  zpeople.getPhotosr  r  s      r   r   FlickrAPI.people_getPhotosn  s     W% 2F;;r   c                 8    SU0nU R                  SU5      nUS	 U$ )z8Returns all visible sets and pools the photo belongs to.photo_idzphotos.getAllContextsstatr  )r   r5  r  r/   s       r   photos_getAllContextsFlickrAPI.photos_getAllContextss  s)    h'zz16:Lr   c                 4    SU0nU R                  SU5      S   $ )z9Retrieves a list of EXIF/TIFF/GPS tags for a given photo.r5  zphotos.getExifr1   r7  r   r5  r  s      r   photos_getExifFlickrAPI.photos_getExifz  #    h'zz*F3G<<r   c                 4    SU0nU R                  SU5      S   $ )zGet information about a photo.r5  photos.getInfor1   r7  r;  s      r   rh   FlickrAPI.photos_getInfo  r>  r   c                    SU0nU R                  SU5      S   S   nU R                  (       a[  [        U5       HL  u  pEUS:  d  M  [        US   5      U R                  :  d  [        US   5      U R                  :  d  MG  X4S2	   U$    U$ )	z(Returns the available sizes for a photo.r5  zphotos.getSizessizessizer   widthheightN)r  r  	enumerateint)r   r5  r  rC  indexrD  s         r   photos_getSizesFlickrAPI.photos_getSizes  s    h'

,f5g>vF<<(/19#d7m"4t||"C"%d8n"5"Df  0
 r   c                 B    U R                  SUR                  5       5      $ )z/Return a list of photos matching some criteria.zphotos.search)r  copy)r   r  s     r   r   FlickrAPI.photos_search  s    ??r   c                 V    XS.nU R                  SU5      S   nU R                  U5      $ )z"Gets information about a photoset.)photoset_idr  zphotosets.getInfophotosetr  )r   rP  r  r  rQ  s        r   r   FlickrAPI.photosets_getInfo  s1    !,A::16::F))r   c                 .    SU0nU R                  SU5      $ )z6Returns the photosets belonging to the specified user.r  zphotosets.getList)_pagination_setsr  s      r   r   FlickrAPI.photosets_getList  s     W%$$%8&AAr   c                 0    SU0nU R                  SUS5      $ )z Get the list of photos in a set.rP  zphotosets.getPhotosrQ  r  )r   rP  r  s      r   r   FlickrAPI.photosets_getPhotos  s"    - 5vzJJr   c                 X    SSU-   0nU R                  SU5      S   nUS   UUS   S   S.$ )	z6Returns a group NSID, given the url to a group's page.r2   zhttps://www.flickr.com/groups/zurls.lookupGroupr   r   	groupnamer]   )r8   r   rY  r7  )r   rY  r  r   s       r   r   FlickrAPI.urls_lookupGroup  sI    9IEF

-v6w?d'";/
;= 	=r   c                 X    SSU-   0nU R                  SU5      S   nUS   US   S   US.$ )	zAReturns a user NSID, given the url to a user's photos or profile.r2   r   zurls.lookupUserr   r   r(  r]   r8   r(  r   r7  )r   r(  r  r   s       r   r9   FlickrAPI.urls_lookupUser  sI    9HDEzz+V4V<t*z*:6"
 	
r   Nc                    ^  SU0nU(       d  T R                  SU5      S   S   nX#S'   T R                  SU5      S   S   n[        UU 4S jS	9$ )
z#Returns all available video streamsr5  r@  r1   secretzvideo.getStreamInfostreamsstreamc                 B   > TR                   R                  U S   S5      $ )Ntyper   )VIDEO_FORMATSr0  )r   r   s    r   <lambda>/FlickrAPI.video_getStreamInfo.<locals>.<lambda>  s    ););)?)?&	1)Mr   )rt   )r  max)r   video_idr_  r  ra  s   `    r   video_getStreamInfoFlickrAPI.video_getStreamInfo  s\    h'ZZ 0&9'B8LF!x16:9EhO6MNNr   c                    SU-   US'   SUS'   SUS'   U R                   (       a  U R                   US'   U R                  U R                  US9n UR                  5       nSU;   a  UR                  SS5      nU R                  R                  SU5        US   S:X  a*  [        R                  " U R                  R                  5      eUS   S:X  a  [        R                  " U5      eUS   S:X  a  [        R                  " U5      eUS   S:X  a  [        R                  " U5      e[        R                  " SU-   5      eU$ ! [         a    S	UR
                  S
.n Nf = f)Nzflickr.methodjsonformatr   nojsoncallbackapi_key)r  )codemessagerr  rs  r   zServer response: %sr   r   b   c   zAPI request failed: )rp  r  API_URLrm  
ValueErrorcontentr0  r*   debugr	   NotFoundErrorr   rw   AuthorizationErrorAuthenticationErrorAbortExtraction)r   rl  r  responser/   msgs         r   r  FlickrAPI._call  sH   $v-x!x#& << $F9<<V<<	===?D T>((9b)CHHNN0$7F|q --dnn.H.HIIf"22377f#33C88f#22377++,BS,HII  	=8+;+;<D	=s   D= =EEc              #     #    SnU R                   R                  S5      =n(       aK  [        U[        [        45      (       a  SR                  U5      nO[        U[        5      (       d  SnXE-   S-   nUSR                  S U R                   5       5      -  nXBS'   SUS'    U R                  X5      U   nUS	    S h  vN   US   US
   :  a  g US==   S-  ss'   M=   N 7f)Nz?description,date_upload,tags,views,media,path_alias,owner_name,r!   ,zFlicense,date_taken,original_format,last_update,geo,machine_tags,o_dimsc              3   2   #    U  H  nS US   -   v   M     g7f)url_r   Nr>   ).0r  s     r   	<genexpr>(FlickrAPI._pagination.<locals>.<genexpr>  s     Cls6CF?ls   extrasr   r  r1   pages)	r   r:   ro   listtuplejoinr  r  r  )r   rl  r  rt   r  includesr/   s          r   r  FlickrAPI._pagination  s     +~~,,Z8888(T5M2288H-#..6&,F#((CdllCCC!xv::f-c2DG}$$f~g.6NaN $s   B;C =C>!C c              #      #    SUS'    U R                  X5      S   nUS    S h  vN   US   US   :  a  g US==   S-  ss'   M=   N 7f)Nr   r  	photosetsrQ  r  r7  )r   rl  r  r/   s       r   rT  FlickrAPI._pagination_sets  s[     v::f-k:DJ'''f~g.6NaN 's   #AA!Ac                     US   S   R                  5       US'   [        R                  " US   5      US'   U R                  R	                  US   5      US'   US   R                  5       US'   U R                  U5        [        R                  " US   5      US'   SU;  a  U R                  R                  US'   O#U R                  (       d  US   US	   US
   S.US'   US
	 US		 US   S:X  a"  U R                  (       a  U R                  U5      $ U R                   H  u  p#nSU-   nXQ;   d  M  [        R                  " USU-      5      US'   [        R                  " USU-      5      US'   U R                  (       a(  US   U R                  :  d  US   U R                  :  a  M  X   US'   X1S'   U Vs/ s H  nUR                  S5      (       d  M  UPM     nnU H  nX	 M       U$    U R                  U5        U$ s  snf )Nr_   r]   re   
dateuploadrd   r`   r   r[   	ownername	pathaliasr\  rY   rZ   r  width_rE  height_rF  r2   label)r  r  r  )stripr   rm   r   rn   splitri   r   r  rj   rk   r  r  
startswithrl   )r   r1   r  r  r  rt   keyss          r   r"   FlickrAPI._extract_format  s   $]3J?EEGmg7g66u\7JKff++-fu%nnU4[1d%!^^00E'N#Gn#K0#K0E'N ++>W$&&u--&*ll"C(3,C|!%hn0E!Fg"&..y31G"Hh<<U7^dll%B%*8_t||%C$ze!(g $)#(C~~&CD 5    C
   - '3( &s   2G;G;c                     U R                  US   5      S   nUS   US'   US   US'   [        R                  " US   5      US'   [        R                  " US   5      US'   U$ )Nr   rq  sourcer2   r  rE  rF  )rJ  r   rm   )r   r1   rD  s      r   rl   FlickrAPI._extract_photo(  sf    ##E$K04H~eggW6g..h8hr   c                     U R                  US   UR                  S5      5      nUS   US'   US   US'   S=US'   US	'   U$ )
Nr   r_  r]   r2   rc  r  r   rE  rF  )ri  r0  )r   r1   ra  s      r   rk   FlickrAPI._extract_video0  sS    ))%+uyy7JKj)eg+,,gxr   c                    U(       a  U R                   (       a   UR                  U R                  US   5      5        US   S   US'   [        R                  " US   S   5      US'   US   S   US'   US   S    Vs/ s H  o3S   PM	     snUS'   [        R                  " US	   5      US	'   [        R                  " US   5      US'   U R                  (       a$   UR                  U R                  US   5      5        U R                  (       a$   UR                  U R                  US   5      5        SU;   a"  U R                  R                  US   5      US'   g g s  snf ! [
         a?  nU R                  R                  S
US   UR                  R                  U5         S nANS nAff = f! [
         a?  nU R                  R                  SUS   UR                  R                  U5         S nANS nAff = f! [
         a@  nU R                  R                  SUS   UR                  R                  U5         S nAGNS nAff = f)Nr   r\   r]   r^   r_   r`   ra   rb   re   z.Unable to retrieve 'info' data for %s (%s: %s)z.Unable to retrieve 'exif' data for %s (%s: %s)z2Unable to retrieve 'contexts' data for %s (%s: %s)licenselicense_name)r  r$   rh   r   rm   r)   r*   r+   r,   r-   r  r<  r  r8  LICENSESr0  )r   r1   r   rs   r3   s        r   ri   FlickrAPI._extract_metadata7  s
   DNN>T00t=>!&w
!;g$(NN*%j1%3j!',]';J'Gm$38=3G H3Ga53G Hf!%g!?g"nnU4[9d >>>T00t=> >T77dDE $(MM$5$5eI6F$GE.! 1 !I  >  D$K!7!7> >>  >  D$K!7!7> >>  >  H$K!7!7> >>sZ   A"E  <E
>E  #F, #G8 E   
F)*5F$$F),
G565G00G58
I5H==Ic                 2    US   S   US'   US   S   US'   U$ )Nr\   r]   r_   r>   )r   r   s     r   r   FlickrAPI._clean_infoZ  s-    Wj1W"=1*=]r   )r  r  r  r  r  rj   r   )r#   )T)(r-   rG   rH   rI   rJ   rv  
API_SECRETr  rd  r  propertyr
   r  r
  r   r   r   r   r;   r   r8  r<  rh   rJ  r   r   r   r   r   r9   ri  r  r  rT  r"   rl   rk   ri   r   rR   r>   r   r   r   r      s   
 6GJG& M #;09"-+.,-"H T@  @(2=
)?
B
(<
=
=

@*B
K
=
O2 , .`!HFr   r   N)rJ   commonr   r   r   r   r   r   r	   cacher
   r   r   rT   r{   r   r   r   r   r   r	  r   r>   r   r   <module>r     s    - & + + B2"i 2"j/B? /Bd';? ';T=_ =&C? C </ <	=o 	=3O 3$n nr   