
    iR                        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
  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g)z(Extractors for https://www.facebook.com/   )	ExtractorMessageDispatch   )textutil	exception)memcachez((?:https?://)?(?:[\w-]+\.)?facebook\.comza/(?!media/|photo/|photo.php|watch/|permalink.php)(?:profile\.php\?id=|people/[^/?#]+/)?([^/?&#]+)c                       \ 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\" SS9SS j5       rS rS rS rSrg)FacebookExtractor   z"Base class for Facebook extractorsfacebookzhttps://www.facebook.com)
{category}
{username}z{title} ({set_id})z{id}.{extension}c                     U R                   R                  nSUS'   SUS'   SUS'   SUS'   U R                  S	S
5      U l        U R                  SS5      U l        U R                  SS5      U l        g )Nzmtext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8AcceptemptyzSec-Fetch-DestnavigatezSec-Fetch-Modezsame-originzSec-Fetch-Sitezfallback-retriesr   videosTzauthor-followupsF)sessionheadersconfigfallback_retriesr   author_followups)selfr   s     J/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/facebook.py_initFacebookExtractor._init   s~    ,,&&F 	 %, !$. !$1 ! $,> Bkk(D1 $,> F    c                     [         R                  " UR                  5       R                  S5      R                  SS5      R                  S5      5      R	                  SS5      $ )Nunicode_escapeutf_16surrogatepass\//)r   unescapeencodedecodereplace)r   txts     r   
decode_allFacebookExtractor.decode_all)   sK    }}JJL 01VHo.vvh/?
 '%
	r   c                    [         R                  " USS5      =(       d    [         R                  " USS5      U R                  [         R                  " USS5      =(       d    [         R                  " USS5      5      [         R                  " USS5      SU R                  [         R                  " US	S5      5      [         R                  " US
S5      R                  SS5      S   =(       d    [         R                  " USS5      S.nUS   R	                  S5      (       a`  US   US'   [         R                  " USS5      =(       d6    [         R                  " USS5      =(       d    US   R                  S5      S   US'   U$ )Nz"mediaSetToken":""z"mediasetToken":"z%"user":{"__isProfile":"User","name":"","'"actors":[{"__typename":"User","name":"#"owner":{"__typename":"User","id":" z"title":{"text":"z+{"__typename":"Photo","__isMedia":"Photo","z","creation_story"z"id":"r   {"__typename":"Photo","id":")set_idusernameuser_id
user_pfbidtitlefirst_photo_idr7   pfbidr8   z%"actors":[{"__typename":"User","id":"
"userID":"r5   .)r   extrr+   rsplit
startswithsplit)r   set_page	directorys      r   parse_set_page FacebookExtractor.parse_set_page/   sw   ii-s -s 		Eu YYG yy? __TYY-s&  #ii=$ fXq!"	& 
 II8#3
	< Y**733&/	&:Il#		EsL 2		lC12 (#))#.q1 i  r   c                 &   [         R                  " USS5      [         R                  " USS5      R                  SS5      S   U R                  [         R                  " USS5      5      [         R                  " USS5      S	U R                  [         R                  " US
S5      R                  SS5      S   5      U R	                  [         R                  " USS5      =(       d    [         R                  " USS5      5      U R                  [         R                  " USS5      5      [         R                  " USS5      =(       d    [         R                  " USS5      S.	nUS   R                  S5      (       a#  US   US'   [         R                  " USS5      US'   [         R                  " US   U5        / US'   [         R                  " USS5       H=  nSU;   d  M  SU;   d  M  US   R                  [         R                  " USS5      5        M?     U$ ) Nz"__isNode":"Photo","id":"r.   z0"url":"https:\/\/www.facebook.com\/photo\/?fbid=&set=r   r3   z%"owner":{"__typename":"User","name":"r1   r2   z"message":{"delight_ranges"z"},"message_preferred_body"z
],"text":"\"publish_time\":,z"created_time":z,"image":{"uri":"r/   z3"nextMediaAfterNodeId":{"__typename":"Photo","id":"z:"nextMedia":{"edges":[{"node":{"__typename":"Photo","id":")	idr5   r6   r7   r8   captiondateurlnext_photo_idr7   r;   r8   z\"content_owner_id_new\":\"\"rM   followups_idsz{"node":{"id"z"cursor":null}z "is_author_original_poster":truer4   )	r   r>   r?   r+   parse_timestampr@   nameext_from_urlextract_iterappend)r   
photo_pagephotocomment_raws       r   parse_photo_page"FacebookExtractor.parse_photo_pageY   s   ))7 iiF fWa 	%
 		CS)  yyA3 tyy--( f\1%b	(* +
 ((		*&;SA >		*&7= ??499/$  "YYE  LA%
N &&w//"'	"2E,#yy:E CE) 	eElE2!#o,,)9
K 3kA2kAo&--dii2/ 
 r   c                     [         R                  " [         R                  " USS5      SS5      nS[         R                  " USS5      =(       d+    [         R                  " USS5      R                  S	S
5      S   0nU$ )Nz"__isMedia":"Photo"z"target_group"z"url":"rI   r5   z{"mediaset_token":"r.   set=&r       r   r>   r?   )r   	post_pagefirst_photo_urlposts       r   parse_post_page!FacebookExtractor.parse_post_page   su    ))II02B#
 dii	+@#F FIIovs3::3B1E

 r   c           
         [         R                  " USS5      U R                  [         R                  " USS5      5      [         R                  " USS5      U R                  [         R                  " USS5      5      S	S
.nUS   (       d3  U R                  [         R                  " USUS   -   S-   S5      5      US'   [         R                  " USS5      n0 UEU R                  [         R                  " [         R                  " USS5      SS5      5      SS.En0 US'   [         R                  " USS5       HB  nUR                  SS5      S   nU R                  UR                  SS5      S   5      US   U'   MD     US   (       d  X$4$ [        US   R                  5       S S9S   US'   [         R                  " US   U5        US   US'   S US!'   X$4$ )"Nz\"video_id\":\"rO   r0   r/   r1   r.   rH   rI   video)rJ   r6   r7   rL   typer6   z"__typename":"User","id":"r7   z
","name":"z"permalink_url"z\/Period>\u003C\/MPD>AudioChannelConfigurationzBaseURL>\u003CzBaseURL>z\u003C\/audio)rM   rf   urlszFBQualityLabel=\"z\u003C\/BaseURL>r   r]   c                 :    [         R                  " U S   S S 5      $ )Nr]   r3   )r   	parse_int)xs    r   <lambda>4FacebookExtractor.parse_video_page.<locals>.<lambda>   s    $..1cr3r   )keyrM   filenamem4a	extension)	r   r>   r+   rQ   rS   rA   maxitemsrR   )r   
video_pagere   first_video_rawrh   raw_url
resolutions          r   parse_video_page"FacebookExtractor.parse_video_page   s   ))0% 		Eu)  yyA3 ((13*  
  Z  $		,uY/??,N1 !E* )))+E


??499		#/%
 L$  
 f((13G
G !ua03J(,j!,Q/)E&M*%	
 V}<&M!3
 e
 	eElE2!*-j"k|r   c                 F   UR                  S5      (       a  SOSU-   S-   nU R                  " U40 UD6nUR                  R                  U R                  S-   5      (       a  [
        R                  " SU-   S9eSUR                  ;   a  [
        R                  " S	U-   5      eU$ )
NrG   r2   zR
You can use this URL to continue from where you left off (added "&setextract"): 
z&setextractz/loginz1You must be logged in to continue viewing images.)messages   {"__dr":"CometErrorRoot.react"}zYou've been temporarily blocked from viewing images.
Please try using a different account, using a VPN or waiting before you retry.)	endswithrequestrM   r@   rootr	   AuthRequiredcontentAbortExtraction)r   rM   kwargsLEFT_OFF_TXTress        r   photo_page_request_wrapper,FacebookExtractor.photo_page_request_wrapper   s     \\'22r&' 	 ll3)&)77dii(233((L%&( ( .<++;=IJK K
 
r   c              #     #    US   nUS   /nSnSnU[        U5      :  Gae  X5   nU R                   SU SU 3nU R                  U5      R                  nU R	                  U5      n	US-   U	S'   U R
                  (       a@  U	S    H7  n
X;  d  M
  U R                  R                  S	U
5        UR                  U
5        M9     U	S
   (       d  X@R                  :  aU  U R                  (       aD  U R                  5       nU R                  R                  SX{5        U R                  USS9  US-  nGM  U R                  R                  SU-   S-   5        SnO@SnU	R                  U5        [        R                   SU	4v   [        R"                  U	S
   U	4v   U	S   (       d  U R                  R                  S5        OU	S   U;   a(  U	S   U	S   :w  a  U R                  R                  S5        O[%        U	S   5      [%        U	S   5      US-  -   :  aO  U R                  R'                  SU	S   U	S   5        U R)                  SS5      (       a  UR                  U	S   5        OUR                  U	S   5        US-  nU[        U5      :  a  GMd  g g 7f)Nr5   r:   r]   /photo/?fbid=rG   r   numrP   z Found a followup in comments: %srM   zAFailed to find photo download URL for %s. Retrying in %s seconds.z429 Too Many Requests)secondsreasonz&Failed to find photo download URL for z. Skipping.r2   rN   z5Can't find next image in the set. Extraction is over.rJ   zEDetected a loop in the set, it's likely finished. Extraction is over.x   z5Detected jump to the beginning of the set. (%s -> %s)loopF)lenr   r   r   rX   r   logdebugrT   r   _interval_429warningwaiterrorupdater   	DirectoryUrlintinfor   )r   set_datar5   all_photo_idsretriesiphoto_id	photo_urlrU   rV   followup_idr   s               r   extract_setFacebookExtractor.extract_set   s    (#!"234#m$$$'H99+]8*E&JI88CHHJ))*5Eq5E%L$$#(#9K"7> &,,[9 $: <222t7I7I"002GHH$$23< IIg6MINqLGHHNN@9L%&  GX&''U22kk5<66)* '=8)U4[8HHNN. U?+,s5;/?!C%/GGK$K!79 ;;vu--!(()?@$$U?%;<FAu #m$$$s   BJG5JJr   )keyargc                 z    U(       a  U R                    SU S3nOU R                    SU 3nU R                  U5      $ )Nr%   z
/photos_by)r   _extract_profile_page)r   profiler5   rM   s       r   _extract_profile"FacebookExtractor._extract_profile>  s@    YYKq	4CYYKq	*C))#..r   c                    [        U R                  S-   5       H  nU R                  U5      R                  nUR	                  SSS5      S:  a    0 $ SU;   a  [
        R                  " SSS5      eU R                  U5      nU R                  U5      nU(       d  U(       a  XES	'   Us  $ U R                  R                  S
5        M     0 $ )Nr   z>Page Not Found</title>r]   i  z9"props":{"title":"This content isn't available right now"zauthenticated cookiesr   z&This content isn't available right nowr5   z*Got empty profile photos page, retrying...)ranger   r~   r   findr	   r   _extract_profile_set_id_extract_profile_userr   r   )r   rM   _pager5   users         r   r   'FacebookExtractor._extract_profile_pageF  s    t,,q01A<<$))Dyy2At<q@ 	 M,,+Y<> > 11$7F--d3D!'XHHNNGH# 2$ 	r   c                     [         R                  " USS5      n[         R                  " USS5      R                  SS5      S   =(       d    [         R                  " USS	5      nU$ )
Nz"pageItems"z"page_info"r[   r.   r\   r   r]   z
\/photos\/r$   r^   )r   profile_photos_pageset_ids_rawr5   s       r   r   )FacebookExtractor._extract_profile_set_id[  sb    ii
 

&a. 
#yy 
 	 r   c           	         [         R                  " USS5      nS n [        R                  " SU S35      nUS   R	                  S5      (       a#  US   US'   [         R                  " USS	5      US'   [         R                  " US
S	5      =(       d    [         R                  " USS	5      US'   US   S   S   S    Vs/ s H  nUS   PM
     snUS'   [         R                  " USS	5      =n(       a  U R                  U5      US'   U$ UR                  S5      =nS:  a-  U R                  [         R                  " USS	U5      5      US'   U$ [         R                  " [         R                  " [         R                  " USS5      5      5      US'    U$ s  snf ! [         a%    Uc  U R                  R                  SU5        0 n U$ f = f)Nz","user":{"z},"viewer":{z{"}rJ   r;   r8   r<   r.   z"userVanity":"z
"vanity":"r6   profile_tabsprofile_usertimeline_nav_app_sectionsedgesnodez"best_description":{"text":"	biographyz1"__module_operation_ProfileCometTileView_profileTr]   z"text":"z</span></span></h2>z<ul>zFailed to extract user data: %s)r   r>   r   
json_loadsr@   r+   r   rextrr&   remove_html	Exceptionr   r   )r   r   datar   edgebioposs          r   r   'FacebookExtractor._extract_profile_userh  s   yy}n=	??Sb>2DDz$$W--%)$Z\"!YYt\3?T
 $		$0@# F !C $		$c B  ".1.A9;;BD$DD VD$D  ii&DcJJsJ$(OOC$8[!  GI I#MNO$(OODJJ*c350 %1[!  %)MM$2B2B499/D9 3: %;[! '$  	|@$G		s2   B F <F9F AF 
AF F +GG)r   r   r   N)F)__name__
__module____qualname____firstlineno____doc__categoryr   directory_fmtfilename_fmtarchive_fmtr   r+   rD   rX   rb   ry   r   r   r
   r   r   r   r   __static_attributes__ r   r   r   r      st    ,H%DFM%L$KG(T;z?B,AF Q/ /*r   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	FacebookPhotoExtractori  z(Base class for Facebook Photo extractorsrV   zb/(?:[^/?#]+/photos/[^/?#]+/|photo(?:.php)?/?\?(?:[^&#]+&)*fbid=)([^/?&#]+)[^/?#]*(?<!&setextract)$z-https://www.facebook.com/photo/?fbid=PHOTO_IDc           	   #   <  #    U R                   S   nU R                   SU S3nU R                  U5      R                  nSnU R	                  U5      nXES'   U R                   SUS    3nU R                  U5      R                  nU R                  U5      nS HY  n	UR                  U	5      (       d  UR                  U	5      X'   M.  UR                  U	5      (       a  MF  UR                  U	5      XY'   M[     [        R                  S	U4v   [        R                  US
   U4v   U R                  (       ah  US    H^  n
U R	                  U R                  U R                   SU
 S35      R                  5      nUS-  nXKS'   [        R                  US
   U4v   M`     g g 7f)Nr]   r   rG   r   r   /media/set/?set=r5   )r5   r9   r7   r8   r6   r2   rM   rP   )groupsr   r   r   rX   r~   rD   getr   r   r   r   )r   r   r   rU   r   rV   set_urlrB   rC   ro   comment_photo_idcomment_photos               r   rt   FacebookPhotoExtractor.items  s    ;;q>yykxj>	44Y?DD
%%j1eYYK/h/@A<<(--''1	KC==%%!&3	YYs^^&]]3/
	 L Y..kk5<..  $)/$:  $ 5 53399+]3C2DEJd!
 Q'(e$kk=#7FF %; !s   CFB>Fr   Nr   r   r   r   r   subcategoryBASE_PATTERNpatternexamplert   r   r   r   r   r   r     s(    2KGGG >G Gr   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	FacebookSetExtractori  z&Base class for Facebook Set extractorssetz/(?:(?:media/set|photo)/?\?(?:[^&#]+&)*set=([^&#]+)[^/?#]*(?<!&setextract)$|([^/?#]+/posts/[^/?#]+)|photo/\?(?:[^&#]+&)*fbid=([^/?&#]+)&set=([^/?&#]+)&setextract)z.https://www.facebook.com/media/set/?set=SET_IDc                    U R                   S   =(       d    U R                   S   nU R                   S   =n(       aA  U R                  S-   U-   nU R                  U5      R                  nU R	                  U5      S   nU R                   SU 3nU R                  U5      R                  nU R                  U5      nU R                   S   (       a  U R                   S   US'   U R                  U5      $ )	Nr]      r   r%   r5   r   r   r:   )r   r   r~   r   rb   rD   r   )r   r5   pathpost_urlr_   r   rB   r   s           r   rt   FacebookSetExtractor.items  s    Q14;;q>;;q>!4!yy3-HX.33I)))4X>FYYK/x8<<(--&&x0;;q>)-QH%&))r   r   Nr   r   r   r   r   r     s*    0K	K	K  ?G*r   r   c                   4    \ rS rSrSrSrSr\S-   rSr	S r
Srg	)
FacebookVideoExtractori  z(Base class for Facebook Video extractorsre   )r   r   z{subcategory}z*/(?:[^/?#]+/videos/|watch/?\?v=)([^/?&#]+)z*https://www.facebook.com/watch/?v=VIDEO_IDc              #     #    U R                   S   nU R                  S-   U-   nU R                  U5      R                  nU R	                  U5      u  pESU;  a  g [
        R                  SU4v   U R                  S:X  a  [
        R                  SU-   U4v   g U R                  (       a<  [
        R                  US   U4v   US   (       a  [
        R                  US   U4v   g g g 7f)Nr]   z
/watch/?v=rM   r2   ytdlzytdl:)	r   r   r~   r   ry   r   r   r   r   )r   video_id	video_urlru   re   rh   s         r   rt   FacebookVideoExtractor.items  s     ;;q>II,x7	\\),11
,,Z8U**;;& ++w2E99[[++uU|U22U|kk5<66  s   C#C%r   N)r   r   r   r   r   r   r   r   r   r   rt   r   r   r   r   r   r     s$    2KAMJJG:G7r   r   c                   4    \ rS rSrSrSrSr\S-   rSr	S r
Srg	)
FacebookInfoExtractori  z#Extractor for Facebook Profile datar   )r   r   z/infoz&https://www.facebook.com/USERNAME/infoc                 x    U R                  U R                  S   5      n[        [        R                  SU445      $ )Nr]   r2   )r   r   iterr   r   )r   r   s     r   rt   FacebookInfoExtractor.items  s5    $$T[[^4g''T2455r   r   N)r   r   r   r   r   r   r   USER_PATTERNr   r   rt   r   r   r   r   r   r     s#    -K0MX%G6G6r   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	FacebookAlbumsExtractori  z%Extractor for Facebook Profile albumsalbumsz/photos_albums(?:/([^/?#]+))?z/https://www.facebook.com/USERNAME/photos_albumsc              #   &  #    U R                   u  pU R                   SU S3nU R                  U5      R                  nUR	                  S5      nUS:  a  g Ub  UR                  5       n[        R                  " USSU5      S   n[        R                  " US-   5      S   nU Hi  nUS	   n	U	S	   n
U	S
   S   =U
S
'   nUb  X+R                  5       :w  a  M2  [        U
S'   U	S   =n=(       a    US   U
S'   [        R                  U
S   U
4v   Mk     g 7f)Nr%   z/photos_albumsz:"TimelineAppCollectionAlbumsRenderer","collection":{"id":"r]   z},"pageItems":z}}},z}}r   r   r9   r   
_extractorimageuri	thumbnailrM   )r   r   r~   r   r   lowerextractr   r   r   r   Queue)r   r   namerM   r   r   rt   r   r   r   albumr9   imgs                r   rt   FacebookAlbumsExtractor.items  s    1WI^4||C %%iiHJ7::<DT#3VSA!D-g6 D<DLE%)']6%::E'NUDKKM$9"6E,)-g"6#!FCJE+--uu44 s   DDr   Nr   r   r   r   r   r   r   r   r   rt   r   r   r   r   r   r     s    /K==G?G5r   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	FacebookPhotosExtractori  z%Extractor for Facebook Profile Photosphotosz/photos(?:_by)?z(https://www.facebook.com/USERNAME/photosc                    U R                  U R                  S   S5      S   nU(       d  [        S5      $ U R                   SU 3nU R	                  U5      R
                  nU R                  U5      nU R                  U5      $ )Nr]   Tr5   r   r   )r   r   r   r   r~   r   rD   r   )r   r5   r   rB   r   s        r   rt   FacebookPhotosExtractor.items  sw    &&t{{1~t<XF8OYYK/x8<<(--&&x0))r   r   Nr  r   r   r   r  r    s    /K//G8G*r   r  c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	FacebookAvatarExtractori)  z&Extractor for Facebook Profile Avatarsavatarz/avatarz(https://www.facebook.com/USERNAME/avatarc              #     #    U R                  U R                  S   5      nUS   S   nU R                  U5      R                  nU R	                  U5      nS=US'   US'   SUS'   U R
                   S	US
    3nU R                  U5      R                  nU R                  U5      n[        R                  SU4v   [        R                  US   U4v   g 7f)Nr]   profilePhotorM   r   countr   r  rf   r   r5   r2   )r   r   r   r   rX   r   r~   rD   r   r   r   )r   r   avatar_page_urlavatar_pager  r   rB   rC   s           r   rt   FacebookAvatarExtractor.items/  s     $$T[[^4~.u555oFKK&&{3*++w&-!vYYK/x0@/AB<<(--''1	Y..kk6%=&00s   CCr   Nr  r   r   r   r  r  )  s    0KZ'G8G1r   r  c                   ,    \ rS rSrSr\S-   rSrS rSr	g)FacebookUserExtractori@  zExtractor for Facebook Profilesz/?(?:$|\?|#)z!https://www.facebook.com/USERNAMEc                     U R                    SU R                  S    S3nU R                  [        US-   4[        US-   4[
        US-   4[        US-   44S5      $ )Nr%   r]   r   r  r	  photos_albums)r	  )r   r   _dispatch_extractorsr   r  r  r   )r   bases     r   rt   FacebookUserExtractor.itemsE  so    ))Adkk!n-Q/(("dVm4$dXo6$dXo6$d_&<=	*

  	r   r   N)
r   r   r   r   r   r   r   r   rt   r   r   r   r   r  r  @  s    )_,G1Gr   r  N)r   commonr   r   r   r2   r   r   r	   cacher
   r   r   r   r   r   r   r   r   r  r  r  r   r   r   <module>r     s    / 0 0 $ $ :DD
s	 sl(G. (GV*, *87. 76	6- 	65/ 5B*/ *"1/ 1.H&7 r   