
    iP                        S r SSKJrJrJr  SSKJrJrJr  SSK	J	r	J
r
  S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\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)\5      r " S* S+5      r\	" S,S-S.9S/ 5       rg0)1z Extractors for https://bsky.app/   )	ExtractorMessageDispatch   )textutil	exception)cachememcachezI(?:https?://)?(?:(?:www\.)?(?:c|[fv]x)?bs[ky]y[ex]?\.app|main\.bsky\.dev)z/profile/([^/?#]+)c                   z    \ 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S9S 5       rS rS rS rS rSrg)BlueskyExtractor   z!Base class for bluesky extractorsbluesky)z
{category}z{author[handle]}z,{createdAt[:19]}_{post_id}_{num}.{extension}z
{filename}zhttps://bsky.appc                    U R                  S5      =(       d    S=n(       aT  [        U[        5      (       a"  UR                  SS5      R	                  S5      nO[        U[
        [        45      (       d  SnSU;   U l        SU;   U l        [        U 5      U l
        S =U l        U l        U R                  R                  S	5      S
   U l        U R                  SS5      U l        U R                  SS5      U l        g )Nmetadata   ,)userfacetsr   r   z://r   videosTquotedF)config
isinstancestrreplacesplitlisttuple_metadata_user_metadata_facets
BlueskyAPIapi_user	_user_didroot	partitioninstancer   r   )selfmetas     I/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/bluesky.py_initBlueskyExtractor._init   s    ;;z*0b040$$$||C,2237tUm44)%~!)T!1d#&**
T^		++E215kk(D1kk(E2    c              #   \  #    U R                  5        GH  nSU;   a  US   nOSU;   a  US   nU R                  (       aC  US   S   U R                  :w  a-  U R                  R                  SU R	                  U5      5        Mo  UR                  S5      n UR                  UR                  S5      5         U R                  U5        U R                  U5      n[        R                  S	U4v   U(       am  US   S   nU R                  R                  U5       S
U S3n[        US5       H4  u  US'   nUR                  U5        [        R                   XVS   -   U4v   M6     U R"                  (       a  U(       a  SU;  a  GMn  US   nSU;   a  US   nUR                  SS 5      nUc  GM  U R	                  U5      US'   US   US'   UR                  S5      nUR                  U5        UnGM7     g ! [         a0    U R                  R                  SU R	                  U5      5         GM  f = f7f)NpostitemauthordidzSkipping %s (repost)embedrecordzSkipping %s (no 'record')r   z#/xrpc/com.atproto.sync.getBlob?did=z&cid=r   numfilenamevaluequote_idquote_by)postsr&   logdebug_pidgetupdatepop	Exception_prepare_extract_filesr   	Directoryr$   service_endpoint	enumerateUrlr   )	r*   r1   r5   filesr4   basefilequoter9   s	            r,   itemsBlueskyExtractor.items+   s    JJLD~F|4F|~~$x."74>>"I5tyyGHHW%EDHHX./
 d#++D1''T11x./C#xx88=> ?==@EHD-6ua-@)UTD)%kk4z2B+BDHH .A {{%853Hhu$!(OE		'40=$(IIdOj!$(Nj!		'*U#5  !  :DIIdOLs+   BH, G/4D;H,/5H)$H,(H))H,c                     g)Nr   r   r*   s    r,   r<   BlueskyExtractor.postsW   s    r/   c              #     #    U R                  SS5      nU R                  R                  X5       H<  nS n US   S   S   nSU;   a%  U R                  R                  XS5       S h  vN   M<  M>     g  N! [        R
                   a     MZ  [         a_  nU R                  R                  XFS9  U R                  R                  SU=(       d    S	UR                  R                  U5         S nAM  S nAff = f7f)
Ndepth0r9   subjecturi/app.bsky.feed.post/)exc_infozFailed to extract %s (%s: %s)r6   )r   r$   list_recordsget_post_thread_urir	   ControlExceptionrC   r=   r>   warning	__class____name__)r*   actor
collectionrT   r6   rW   excs          r,   _posts_recordsBlueskyExtractor._posts_recordsZ   s     GS)hh++E>FC	OWoi07)S0#xx;;CGGG 1	 ?
 H--  Ov4  !@!$#--2H2H#O OOsM   3C5/A3%A1&A3*C51A33C2C5
	C2AC-'C5-C22C5c                 0    US   R                  S5      S   $ )NrW   /r   )
rpartition)r*   r1   s     r,   r?   BlueskyExtractor._pidj   s    E{%%c*1--r/   r   keyargc                 J    SR                  UR                  SS5      SS  5      $ )N.r   )joinrsplit)r*   handles     r,   	_instanceBlueskyExtractor._instancem   s#    xxc1-bc233r/   c                 P   US   nU R                  US   5      US'   U R                  (       a  SU;   a~  / =US'   n/ =US'   n/ =US'   nUS    H_  nUS   S	   nS
U;   a  UR                  US
   5        M'  SU;   a  UR                  US   5        MC  SU;   d  MK  UR                  US   5        Ma     OS=US'   =US'   US'   U R                  (       a  U R                  =(       d    UUS'   U R
                  US'   U R                  U5      US'   U R                  US   S S 5      US'   g )Nr3   rp   r)   r   hashtagsmentionsurisfeatures    tagr4   rW   r   r   post_id	createdAt   date)rq   r"   appendr!   r%   r)   r?   parse_datetime_iso)r*   r1   r3   tagsdidsrv   facetrw   s           r,   rD   BlueskyExtractor._prepareq   s@   h!^^F8,<=z  4*,,Z 4*,,Z 4&((Vt!(^E$Z03H(HUO4(*HUO4(*HUO4 , FHGZ G4
#3d6l::/DL==Z))D/Y..tK/@"/EFVr/   c                 z   SU;  a  SUS'   g/ nUS   nSU;   a  US   nSU;   a.  US    H%  n UR                  U R                  US5      5        M'     SU;   a3  U R                  (       a"   UR                  U R                  US5      5        [	        U5      US'   U$ ! [         a     M  f = f! [         a     N-f = f)	Nr5   rx   countr   mediaimagesimagevideo)r~   _extract_mediarC   r   len)r*   r1   rJ   r   r   s        r,   rE   BlueskyExtractor._extract_files   s    $DMWe'NEuxLL!4!4UG!DE )
 eT00@A E
W ! 
  s#   !B+!B- 
B*)B*-
B:9B:c                      US   nUS   nUS   nX   n US   S   nUR                  S5      =(       d    S	UUUUS
   R                  S5      S   S.$ ! [          a    S=pE NQf = f! [          a    US   n NYf = f)NaspectRatiowidthheightrx   ref$linkcidaltr   mimeTyperf   r   )descriptionr   r   r8   	extension)KeyErrorr@   rg   )r*   r   keyaspectr   r   datar   s           r,   r   BlueskyExtractor._extract_media   s    	=)F7OEH%F z	u+g&C
 !99U+1r !
+66s;A>
 	
  	EF	  	u+C	s"   A A& A#"A#&A87A8c                    U R                   R                  U5      nU R                   R                  U5      nX$;  a  gXB   R                  S5      S   R	                  S5      S   nSSUSS	U0S
SS.SSS.S./0USSUS.04$ )Nr   rf   r   @rx   r1   r   blobr   z
image/jpeg)z$typer   r   sizei  )r   r   )r   r   r   r   )r5   r3   r6   r{   rW   )r$   _did_from_actorget_profilerg   r(   )r*   r`   kindr4   profiler   s         r,   
_make_postBlueskyExtractor._make_post   s    hh&&u-((&&s+m&&s+A.88=a@ "$*%,cN$0$%	 #'"&$& %  % #
  	r/   )r"   r!   r%   r&   r$   r)   r   r   N)r_   
__module____qualname____firstlineno____doc__categorydirectory_fmtfilename_fmtarchive_fmtr'   r-   rN   r<   rc   r?   r   rq   rD   rE   r   r   __static_attributes__r   r/   r,   r   r      sg    +H6MALKD3*XO . Q4 4G62
,r/   r   c                   (    \ rS rSr\S-   rSrS rSrg)BlueskyUserExtractor   $zhttps://bsky.app/profile/HANDLEc                 j   U R                    SU R                  S    S3nU R                  SS5      (       d  U R                  SS5      (       a  SOSnU R                  [        US	-   4[
        US
-   4[        US-   4[        US-   4[        US-   4[        US-   4[        US-   4[        US-   44U45      $ )Nz	/profile/rx   rf   r   Frepostsr<   r   infoavatarbannerrepliesr   likes)r'   groupsr   _dispatch_extractorsBlueskyInfoExtractorBlueskyAvatarExtractorBlueskyBackgroundExtractorBlueskyPostsExtractorBlueskyRepliesExtractorBlueskyMediaExtractorBlueskyVideoExtractorBlueskyLikesExtractor)r*   rK   defaults      r,   rN   BlueskyUserExtractor.items   s    ))Idkk!n%5Q7"kk(E::;;y%00 6= 	((!7#9'9"8$	)9:"8"8"8	*
 :	 		r/   r   N)	r_   r   r   r   USER_PATTERNpatternexamplerN   r   r   r/   r,   r   r      s    T!G/Gr/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)r      r<   z/postsz%https://bsky.app/profile/HANDLE/postsc                 T    U R                   R                  U R                  S   S5      $ )Nrx   posts_and_author_threadsr$   get_author_feedr   rQ   s    r,   r<   BlueskyPostsExtractor.posts   s'    xx''KKN68 	8r/   r   N
r_   r   r   r   subcategoryr   r   r   r<   r   r   r/   r,   r   r      s    KY&G5G8r/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)r      r   z/repliesz'https://bsky.app/profile/HANDLE/repliesc                 T    U R                   R                  U R                  S   S5      $ )Nrx   posts_with_repliesr   rQ   s    r,   r<   BlueskyRepliesExtractor.posts   s'    xx''KKN02 	2r/   r   Nr   r   r/   r,   r   r      s    K[(G7G2r/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)r   i  r   z/mediaz%https://bsky.app/profile/HANDLE/mediac                 T    U R                   R                  U R                  S   S5      $ )Nrx   posts_with_mediar   rQ   s    r,   r<   BlueskyMediaExtractor.posts  '    xx''KKN.0 	0r/   r   Nr   r   r/   r,   r   r         KY&G5G0r/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)r   i  r   z/videoz%https://bsky.app/profile/HANDLE/videoc                 T    U R                   R                  U R                  S   S5      $ )Nrx   posts_with_videor   rQ   s    r,   r<   BlueskyVideoExtractor.posts  r   r/   r   Nr   r   r/   r,   r   r     r   r/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)r   i  r   z/likesz%https://bsky.app/profile/HANDLE/likesc                     U R                  S5      S:X  a(  U R                  R                  U R                  S   5      $ U R	                  U R                  S   S5      $ )NendpointgetActorLikesrx   zapp.bsky.feed.like)r   r$   get_actor_likesr   rc   rQ   s    r,   r<   BlueskyLikesExtractor.posts  sL    ;;z"o588++DKKN;;""4;;q>3GHHr/   r   Nr   r   r/   r,   r   r     s    KY&G5GIr/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)BlueskyFeedExtractori!  feedz/feed/([^/?#]+)z)https://bsky.app/profile/HANDLE/feed/NAMEc                 T    U R                   u  pU R                  R                  X5      $ N)r   r$   get_feed)r*   r`   r   s      r,   r<   BlueskyFeedExtractor.posts&  s"    kkxx  --r/   r   Nr   r   r/   r,   r   r   !  s    K//G9G.r/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)BlueskyListExtractori+  r   z/lists/([^/?#]+)z(https://bsky.app/profile/HANDLE/lists/IDc                 T    U R                   u  pU R                  R                  X5      $ r   )r   r$   get_list_feed)r*   r`   list_ids      r,   r<   BlueskyListExtractor.posts0  s"    xx%%e55r/   r   Nr   r   r/   r,   r   r   +  s    K00G8G6r/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)BlueskyFollowingExtractori5  	followingz/followsz'https://bsky.app/profile/HANDLE/followsc              #      #    U R                   R                  U R                  S   5       H(  nSUS   -   n[        US'   [        R
                  X!4v   M*     g 7f)Nrx   zhttps://bsky.app/profile/r4   
_extractor)r$   get_followsr   r   r   Queue)r*   r   urls      r,   rN   BlueskyFollowingExtractor.items:  sM     HH((Q8D-U;C!5D--** 9s   AAr   N
r_   r   r   r   r   r   r   r   rN   r   r   r/   r,   r   r   5  s    K[(G7G+r/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)BlueskyPostExtractoriA  r1   z/post/([^/?#]+)z'https://bsky.app/profile/HANDLE/post/IDc                 T    U R                   u  pU R                  R                  X5      $ r   )r   r$   get_post_thread)r*   r`   rz   s      r,   r<   BlueskyPostExtractor.postsF  s"    xx''77r/   r   Nr   r   r/   r,   r   r   A  s    K//G7G8r/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)r   iK  r   z/infoz$https://bsky.app/profile/HANDLE/infoc                     SU l         U R                  R                  U R                  S   5        [	        [
        R                  SU R                  445      $ )NTrx   r   )r!   r$   r   r   iterr   rF   r%   rQ   s    r,   rN   BlueskyInfoExtractor.itemsP  sC    "  Q0g''TZZ8:;;r/   )r!   Nr   r   r/   r,   r   r   K  s    KX%G4G<r/   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	r   iV  r   zavatar_{post_id}.{extension}z/avatarz&https://bsky.app/profile/HANDLE/avatarc                 @    U R                  U R                  S   S5      $ )Nrx   r   r   r   rQ   s    r,   r<   BlueskyAvatarExtractor.posts\      t{{1~x88r/   r   Nr_   r   r   r   r   r   r   r   r   r<   r   r   r/   r,   r   r   V  s     K1LZ'G6G9r/   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	r   i`  
backgroundz background_{post_id}.{extension}z/ba(?:nner|ckground)z&https://bsky.app/profile/HANDLE/bannerc                 @    U R                  U R                  S   S5      $ )Nrx   r   r
  rQ   s    r,   r<    BlueskyBackgroundExtractor.postsf  r  r/   r   Nr  r   r/   r,   r   r   `  s!    K5L44G6G9r/   r   c                   ,    \ rS rSrSr\S-   rSrS rSr	g)BlueskySearchExtractorij  searchz/search(?:/|\?q=)(.+)zhttps://bsky.app/search?q=QUERYc                     [         R                  " U R                  S   R                  SS5      5      nU R                  R                  U5      $ )Nrx   +r   )r   unquoter   r   r$   search_posts)r*   querys     r,   r<   BlueskySearchExtractor.postso  s:    T[[^33C=>xx$$U++r/   r   N
r_   r   r   r   r   BASE_PATTERNr   r   r<   r   r   r/   r,   r  r  j  s    K55G/G,r/   r  c                   ,    \ rS rSrSr\S-   rSrS rSr	g)BlueskyHashtagExtractorit  hashtagz$/hashtag/([^/?#]+)(?:/(top|latest))?zhttps://bsky.app/hashtag/NAMEc                 \    U R                   u  pU R                  R                  SU-   U5      $ )N#)r   r$   r  )r*   r  orders      r,   r<   BlueskyHashtagExtractor.postsy  s(    xx$$S[%88r/   r   Nr  r   r/   r,   r  r  t  s    KDDG-G9r/   r  c                   ,    \ rS rSrSr\S-   rSrS rSr	g)BlueskyBookmarkExtractori~  bookmarkz/savedzhttps://bsky.app/savedc                 6    U R                   R                  5       $ r   )r$   get_bookmarksrQ   s    r,   r<   BlueskyBookmarkExtractor.posts  s    xx%%''r/   r   Nr  r   r/   r,   r%  r%  ~  s    KY&G&G(r/   r%  c                       \ rS rSrSrS rS rSS jrS rS r	S r
S	 rS
 rSS jr\" SS9S 5       rS r\" SS9S 5       r\" SS9S 5       rSS jrSS jrS r\" SSS9S 5       rSS jr S S jrSrg)!r#   i  zRInterface for the Bluesky API

https://docs.bsky.app/docs/category/http-reference
c                 H   Xl         UR                  U l        SS0U l        UR                  5       u  U l        U l        UR                  SS5      =n(       a  UR                  S5      U l        g U R                  (       a  SU l        g SU l        [        R                  U l        g )NAcceptzapplication/jsonz
api-serverFrf   https://bsky.socialzhttps://api.bsky.app)	extractorr=   headers_get_auth_infousernamepasswordr   rstripr'   r   noopauthenticate)r*   r.  srvs      r,   __init__BlueskyAPI.__init__  s~    "== "45'0'?'?'A$t}""<7737

3DI]]-DI.DI $		Dr/   c                 N    SnU R                  U5      SS.nU R                  X#SS9$ )Nzapp.bsky.feed.getActorLikes100r`   limitTcheck_emptyr   _paginationr*   r`   r   paramss       r,   r   BlueskyAPI.get_actor_likes  s7    0))%0
 dCCr/   c                 T    SnU R                  US5      USS.nU R                  X45      $ )Nzapp.bsky.feed.getAuthorFeedTr:  )r`   filterr<  r?  )r*   r`   rE  r   rB  s        r,   r   BlueskyAPI.get_author_feed  s7    0**5$7

 11r/   c                 *    SnU R                  U0 SSS9$ )Nzapp.bsky.bookmark.getBookmarks	bookmarksTr=  r@  )r*   r   s     r,   r(  BlueskyAPI.get_bookmarks  s!    3"ktLLr/   c                 `    SnSU R                  U5       SU 3nUSS.nU R                  X55      $ )Nzapp.bsky.feed.getFeedat://z/app.bsky.feed.generator/r:  )r   r<  r?  )r*   r`   r   r   rW   rB  s         r,   r   BlueskyAPI.get_feed  sC    *t++E23*4&2.11r/   c                 R    SnU R                  U5      SS.nU R                  X#S5      $ )Nzapp.bsky.graph.getFollowsr:  r;  followsr?  rA  s       r,   r   BlueskyAPI.get_follows  s4    .))%0
 )<<r/   c                 `    SnSU R                  U5       SU 3nUSS.nU R                  X55      $ )Nzapp.bsky.feed.getListFeedrL  z/app.bsky.graph.list/r:  )r   r<  r?  )r*   r`   r   r   rW   rB  s         r,   r   BlueskyAPI.get_list_feed  sA    .d**5122GvN/11r/   c                     SU R                  U5       SU 3nU R                  R                  SS5      nU R                  X45      $ )NrL  rX   rT   rU   )r   r.  r   r[   )r*   r`   rz   rW   rT   s        r,   r  BlueskyAPI.get_post_thread  sJ    t++E23%gY0%%gs3''33r/   c                     SnUUSS.nU R                  X45      S   nSU;  a  U4$ SnU/nU[        U5      :  a4  Xv   nSU;   a  UR                  US   5        US-  nU[        U5      :  a  M4  U$ )Nzapp.bsky.feed.getPostThreadrU   )rW   rT   parentHeightthreadr   rx   r   )_callr   extend)	r*   rW   rT   r   rB  rW  indexr<   r1   s	            r,   r[   BlueskyAPI.get_post_thread_uri  s    0!
 H-h7F"9c%j <DD T)_-QJE	 c%j 
 r/   r   ri   c                 0    SnSU0nU R                  X#5      $ )Nzapp.bsky.actor.getProfiler`   rX  )r*   r4   r   rB  s       r,   r   BlueskyAPI.get_profile  s    .3zz(++r/   c                 x    SnU R                  U5      nUUSS.nU R                  X5SU R                  U5      5      $ )Nzcom.atproto.repo.listRecordsr:  )repora   r<  records)r   r@  rG   )r*   r`   ra   r   	actor_didrB  s         r,   rZ   BlueskyAPI.list_records  sP    1((/	#$
 ) $ 5 5i @B 	Br/   c                 6    SnSU0nU R                  X#5      S   $ )Nz"com.atproto.identity.resolveHandlerp   r4   r]  )r*   rp   r   rB  s       r,   resolve_handleBlueskyAPI.resolve_handle  s%    7F#zz(+E22r/   c                     UR                  S5      (       a  SUSS  -   S-   nOSU-   n U R                  R                  U5      nUS    H  nUS   S:X  d  M  US	   s  $    g
! [         a     g
f = f)Nzdid:web:zhttps://   z/.well-known/did.jsonzhttps://plc.directory/servicetypeAtprotoPersonalDataServerserviceEndpointr-  )
startswithr.  request_jsonrC   )r*   r4   r   r   ri  s        r,   rG   BlueskyAPI.service_endpoint  s    >>*%%s12w&)@@C*S0C	>>..s3D	?6?&AA"#455 +
 %  	$	s   *A! A! A! !
A.-A.Nc                 6    SnUSUS.nU R                  X4S5      $ )Nzapp.bsky.feed.searchPostsr:  )qr<  sortr<   rI  )r*   r  rr  r   rB  s        r,   r  BlueskyAPI.search_posts  s,    .

 '::r/   c                 :   UR                  S5      (       a  UnOU R                  U5      nU R                  nU(       a  UR                  SS5      (       d  X4l        UR
                  (       a/  U R                  U5      =Ul        nUR                  US   5      US'   U$ )Nzdid:r   Frp   r)   )	rm  re  r.  r   r&   r!   r   r%   rq   )r*   r`   user_didr4   extrr   s         r,   r   BlueskyAPI._did_from_actor  s    F##C%%e,C~~DKK	599 N $ 0 0 55DJ#~~d8n=D
r/   c                 T    U R                  U R                  5      U R                  S'   g )NAuthorization)_authenticate_implr1  r/  rQ   s    r,   r5  BlueskyAPI.authenticate   s    (,(?(?(N_%r/   i  maxagerj   c                 r   [        U5      nU(       a(  U R                  R                  SU5        SnSSU-   0nS nO/U R                  R                  SU5        SnS nUU R                  S.nU R                   SU 3nU R
                  R                  US	XES S
9nUR                  5       nUR                  S:w  aW  U R                  R                  SU5        [        R                  " SUR                  S5       SUR                  S5       S35      e[         R                  U R                  US   5        SUS   -   $ )NzRefreshing access token for %sz!com.atproto.server.refreshSessionry  zBearer zLogging in as %sz com.atproto.server.createSession)
identifierr2  /xrpc/POST)methodr/  jsonfatal   Server response: %s"error: message
refreshJwt	accessJwt)_refresh_token_cacher=   r   r2  r'   r.  requestr  status_coder>   r	   AuthenticationErrorr@   rA   r1  )r*   r1  refresh_tokenr   r/  r   r   responses           r,   rz  BlueskyAPI._authenticate_impl#  s4   ,X6HHMM:HE:H&	M(ABGDHHMM,h79HG&"mmD
 6(,>>))$ * H}}3&HHNN0$7//TXXg&'r$((9*=)>bAC C 	##DMM43EF4,,,r/   c                    Uc  U R                   nU SU 3n U R                  5         U R                  R                  XBU R                  S S9nUR
                  S:  a  UR                  5       $ UR
                  S:X  a6  UR                  R                  S5      nU R                  R                  US9  M  Sn UR                  5       nU SUS	    S
US    S3nU R                  R                  R                  SUR                  5        [        R                  " U5      e! [         a"    U SUR
                   SUR                   S3n Nqf = f)Nr  )rB  r/  r  i  i  zRateLimit-Reset)untilzAPI request failedz ('r  r  r  z')z (r   )r  )r'   r5  r.  r  r/  r  r  r@   waitrC   reasonr=   r>   r   r	   AbortExtraction)	r*   r   rB  r'   r   r  r  msgr   s	            r,   rX  BlueskyAPI._callB  sM   <99DfXJ'~~--DLL . FH ##c)}}&##s* ((,,->?##%#0&CJ}}Sgr$y/1B"E NN$$%:HMMJ++C00	  JR 4 45Qx6GqIJs   6!D )E	E	c              #      #     U R                  XU5      nU(       a
  Xc   (       d  g Xc    S h  vN   UR                  S5      nU(       d  g XrS'   MN   N#7f)Ncursor)rX  r@   )r*   r   rB  r   r'   r>  r   r  s           r,   r@  BlueskyAPI._pagination]  sS     ::h5D49y  XXh'F%8 
 !s   ,AA$A)r5  r.  r/  r=   r2  r'   r1  )r   )rU   r   )F)r   NF)r_   r   r   r   r   r7  r   r   r(  r   r   r   r  r[   r   r   rZ   re  rG   r  r   r5  r
   rz  rX  r@  r   r   r/   r,   r#   r#     s    
*D2M2=24* Q, ,

B Q3 3
 Q% %;O $q!- "-<18 8=&r/   r#   i n rx   r|  c                     g r   r   )r1  s    r,   r  r  l  s    r/   N) r   commonr   r   r   r   r   r   r	   r
   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r%  r#   r  r   r/   r,   <module>r     s7   ' 0 0 $ $ #O33Cy CL8%5 (8, 82. 20, 00, 0I, I.+ .6+ 6	+ 0 	+8+ 8<+ <9- 99!1 9,- ,9. 9(/ (b& b&J hq! "r/   