
    i׎                     >   S SK r S SKrS SKrS SKrS SKrSSKJrJrJrJ	r	J
r
JrJrJrJrJrJrJr  SSKJr  \R(                  r\R*                  r " S S5      r " S S\5      rS	 r " S
 S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)    N   )	extractor
downloaderpostprocessorarchiveconfig	exception	formatteroutputpathtextutilversion)Messagec                       \ rS rSrSrSr\R                  rSS 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Srg)Job"   zBase class for Job typesNc                    [        U[        5      (       a  [        R                  " U5      nU(       d  [        R
                  " 5       eXl        S U l        SU l        0 U l        SU l	        U R                  U5      =n(       a=  [        U[        5      (       a"  UR                  Ul        UR                  Ul        X1l        UR                  S5      =n(       a  SSKJnJn  XPl        U" U5      U l        [,        R.                  " U 5      nU UU[,        R0                  " U 5      S.U l        U R5                  UR6                  5      Ul        UR6                  R9                  SUR:                  R<                  UR>                  5        URA                  SS	5      U l!        URA                  S
S5      U l"        URA                  SS5      nURA                  SS5      n	URA                  SS5      n
U(       a  XpR                  U'   U
(       a  XR                  U
'   U	(       aB  [F        RH                  [J        RL                  [J        RN                  " 5       S.U R                  U	'   UR                  S5      nUR                  S5      =n(       a  U(       a  0 UEUEOUnOU(       d  g UR                  S5      (       a  / U l	        URQ                  5        Hv  u  p[        U[        5      (       aN  [R        RT                  " US [J        RV                  5      nU R                  RY                  XRZ                  45        Mh  XR                  U'   Mx     g U R                  R]                  U5        g )Nr   Factionsr   )LoggerAdapterparse_logging)jobr   r   keywordszUsing %s for '%s'zmetadata-urlzurl-metadatazmetadata-httpzhttp-metadatazmetadata-pathzpath-metadatazmetadata-versionzversion-metadatazmetadata-extractorzextractor-metadata)r   is_executablecurrent_git_headr   zkeywords-globalzkeywords-eval)/
isinstancestrr   findr	   NoExtractorErrorpathfmtstatuskwdictkwdict_eval_build_config_pathlist_config_sharedr   _config_shared_accumulateconfig_accumulate_cfgpathr   r   r   _logger_adapter_logger_actionsr   PathfmtProxyKwdictProxy_logger_extra_wrap_loggerlogdebug	__class____name__urlconfig2metadata_urlmetadata_httpr   __version__r   
EXECUTABLEgit_headitemsr
   parseidentityappend
format_mapupdate)selfextrparentcfgpathr   r   r   
path_proxymetadata_pathmetadata_versionmetadata_extractorr"   kwdict_globalkeyvaluefmts                   ;/app/mltbenv/lib/python3.13/site-packages/gallery_dl/job.py__init__Job.__init__'   s   dC  >>$'D,,.. --f5575'4(("11)-)G)G&#Mkk),,7,=#0 #0#9D ((.
#++D1	
 $$TXX.*DNN,C,CTXXN LLH!\\/?K_oF<<(:<NO!\\ "68 )3KK&.2KK*+$+$7$7$(OO$(MMO-DKK() Z( KK(9::=:4:000F;;''!D$lln
eS))#//%t}}EC$$++S..,AB',KK$ - KKv&    c                    U R                   n/ nU(       Ga/  UR                   nUR                  UR                  :X  d  UR                  UR                  ;   a  UR                  nOUR                  UR                  4-   nXPl        UR                  SUR                  5      (       a.  UR                  Ul        UR
                  Ul        UR                  $ U(       ak  UR
                  nU H<  nU SUR                   3nUR                  X45        UR                  US-   U45        M>     UR                  UR                  U45        OSU l        UR                  (       a  U(       d'  UR                  UR                  UR
                  45        UR                  (       a'  UR                  UR                  UR
                  45        UR                  UR                  UR
                  45        U$ )Nzcategory-transfer>z>* )
r   categoryparentsr   categorytransfersubcategoryr)   r>   basecategorybasesubcategory)	rA   rC   rB   rD   pextrrU   subrT   cats	            rM   r$   Job._build_config_pathk   sy   ~~$$E}}.MMV^^3 .. ..ENN+<<"L||/1G1GHH %#(#4#4 ~~%&& 'H%Ja7CNNC:.NNHtOS#9: !( s34DLt/?/?@A## 4 4d6F6FGHNND--t/?/?@ArP   c                 (   U R                   nUR                  nU R                  5         [        R                  " UR
                  " S5      5      nUb  UR                  " U" 5       S5         U R                  U5      nUc  UR                  SUR                  5        U R;                  5         UR<                  " 5         UR(                  =n(       a  U =R(                  U-  sl        U R(                  $ ! [        R                   aT  nUR                  S:  a:  UR                  UR                  R                  :w  a  U=R                  S-  sl        e  SnANSnAf[        R                    aV  nUR#                  U5        UR%                  UR&                  5        U =R(                  UR*                  -  sl         SnAGN SnAf[        R,                  [        R.                  4 a    e [        R0                   ab  nUR%                  SUR                  R2                  U5        UR#                  U5        U =R(                  UR*                  -  sl         SnAGNSnAf[4         a  nUR#                  U5        UR                  R2                  =nS:X  a-  UR%                  SXe5        U =R(                  S-  sl         SnAGNUR%                  S	Xe5        U =R(                  S
-  sl         SnAGNLSnAf[6         aX  nUR%                  SUR                  R2                  U5        UR#                  U5        U =R(                  S-  sl         SnAGNSnAf[8         a    U =R(                  S-  sl        e f = f! U R;                  5         UR<                  " 5         f = f)zExecute or run the jobsleep-extractorNr   zNo results for %sr   %s: %sJSONDecodeErrorz"Failed to parse JSON data:  %s: %sz Unable to download data:  %s: %s   zAn unexpected error occurred: %s - %s. Please run gallery-dl again with the --verbose flag, copy its output and report this issue on https://github.com/mikf/gallery-dl/issues .)r   r0   _initr   build_duration_funcr   sleepdispatchinfor4   r	   StopExtractiondepthtargetr2   rW   AbortExtraction	tracebackerrormessager!   codeTerminateExtractionRestartExtractionGalleryDLExceptionr3   OSError	ExceptionBaseExceptionhandle_finalizefinalize)rA   r   r0   re   msgexcnamess           rM   runJob.run   s   NN	mm

 ((./1OOEG[1)	!--	*CH {,imm<  "    1 KK1K{{W '' 	yy1}y/B/B/N/N!N		Q	(( 	$MM#IIckk"KK388#KK--y/J/JK 	++ 	$IIh 6 6<MM#KK388#KK 	#MM#...3DD		>Jq 		<dHs" 	II E mm,,c	3
 MM#KK1KK 	KK1K	   " s   +C0 <M. 0M+A
EM. M+*AF;5M. ;;M+6AIM. M+ AK'4M. :'K'!M. 'M+4AMM. $M++M. .#Nc                    SnSnU GH  u  p$nU[         R                  :X  ag  U R                  U5        U R                  XE5      (       a  SnU R	                  U5        OSn[
        R                  b  [
        R                  S5        M  M  Uc  M  U[         R                  :X  a  U R                  (       a  XEU R                  '   U R                  U5        U R                  XE5      (       a  U R                  XE5        [
        R                  b  [
        R                  S5        GM  GM  U[         R                  :X  d  GM5  U R                  U5        U R                  (       a  XEU R                  '   U R                  XE5      (       a  U R                  XE5        [
        R                   c  GM  [
        R                  S5        GM     U$ )z$Call the appropriate message handlerNTPOSTFILECHILD)r   	Directoryupdate_kwdict	pred_posthandle_directoryFLAGSr   processUrlr6   pred_url
handle_urlr   Queue
pred_queuehandle_queuer   )rA   messagesrx   r   r4   r"   s         rM   rf   Job.dispatch   sX    (Cfg'''""6*>>#.."G))&1"G::)MM&) * #$$034,,-""6*==--OOC0::)MM&) * %""6*$$034,,-??3//%%c2;;*MM'*? !)B 
rP   c                     g)zHandle Message.UrlNrS   rA   r4   r"   s      rM   r   Job.handle_url       rP   c                     g)zHandle Message.DirectoryNrS   rA   r"   s     rM   r   Job.handle_directory   r   rP   c                     g)zHandle Message.QueueNrS   r   s      rM   r   Job.handle_queue   r   rP   c                     g)zHandle job finalizationNrS   rA   s    rM   rv   Job.handle_finalize   r   rP   c                    U R                   nUR                  US'   UR                  US'   U R                  (       a  UR	                  U R                  S5        UR
                  (       a  UR                  UR
                  5        U R
                  (       a  UR                  U R
                  5        U R                  (       a   U R                   H  u  p4U" U5      X'   M     gg)z(Update 'kwdict' with additional metadatarT   rW   N)r   rT   rW   r7   popr"   r@   r#   )rA   r"   rB   rJ   valuegens        rM   r   Job.update_kwdict   s    ~~!]]z $ 0 0}JJt))40;;MM$++&;;MM$++&!%!1!1&v. "2 rP   c                     U R                   R                  5         U R                  SS5      U l        U R                  SS5      U l        U R                  SS5      U l        g )NimageTpostFchapter)r   
initialize_prepare_predicatesr   r   r   r   s    rM   rc   	Job._init  sN    !!#00$?11&%@229eDrP   c                    / nU R                   nUR                  US-   5      (       a$  UR                  [        R                  " 5       5        UR                  US-   5      =n(       a&   UR                  [        R
                  " XQ5      5        UR                  US-   5      =n(       aB   U(       a  U(       d  UR                  OS nUR                  [        R                  " Xr5      5        [        R                  " U5      $ ! [        [        [        4 a%  nUR                  R                  U5         S nANS nAff = f! [         a&  nUR                  R                  SX5         S nAN~S nAff = f)Nz-uniquez-filterz-rangezinvalid %s range: %s)r   r   r>   r   predicate_uniquepredicate_filterSyntaxError
ValueError	TypeErrorr0   warningskippredicate_rangepredicate_build)rA   rj   r   
predicatesrB   pfilterry   pranges           rM   r   Job._prepare_predicates  s(   
~~;;v	)**d3356kk&9"45575&!!$"7"7"HI [[(!233639$(tyyd!!$"6"6v"DE
 ##J//  Y7 &  %%&  9  *F9 99s1   (%D  )AD=  D:D55D:=
E-E((E-c                 L    U R                  [        R                  " U5      5      $ N)r/   logging	getLogger)rA   rz   s     rM   
get_loggerJob.get_logger,  s      !2!24!899rP   c                 $    U R                  X5      $ r   )r*   )rA   loggers     rM   r/   Job._wrap_logger/  s    ##F11rP   c                 V    U R                   b  U R                   R                  U5        g g r   )ulogrg   )rA   r4   s     rM   _write_unsupportedJob._write_unsupported2  s!    99 IINN3 !rP   )r+   r*   r.   r   r"   r#   r7   r6   rU   r    r   r   r   r!   r   )r3   
__module____qualname____firstlineno____doc__r   r   r   r*   rN   r$   r|   rf   r   r   r   rv   r   rc   r   r   r/   r   __static_attributes__rS   rP   rM   r   r   "   sa    "D**OB'H#J:x&P!'#&/E0.:2 rP   r   c                   f    \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rSS jrSS jrS rSrg)DownloadJobi7  z=Download images into appropriate directory/filename locationsNc                 6   [         R                  XU5        U R                  S5      U l        S U l        S U l        S U l        SU l        0 U l        [        R                  " 5       U l        U(       a  UR                  O	[        5       U l        S U l        SU l        g )NdownloadrS   r   )r   rN   r   r0   fallbackr   re   hooksdownloadersr   selectoutvisitedset_extractor_filter_skipcntrA   r4   rC   s      rM   rN   DownloadJob.__init__:  sq    T'??:.

==?)/v~~SU!%rP   c                    U R                   nU R                  nU R                  nUR                  U5        SU;   a  US    H  nU" U5        M     Ub8  UR                  " U5      (       a!  UR                  5         U R                  5         gUR                  (       am  U R                  (       d\  UR                  5         UR                  5       (       a7  Ub#  U R                  (       a  UR                  " U5        U R                  5         gSU;   aw  US    H  nU" U5        M     UR                  SS5      (       aL  UR                  5       (       a7  Ub#  U R                  (       a  UR                  " U5        U R                  5         gU R                  b*  U R                  R                  U R                  5       S5        U R!                  U5      (       d  U R"                  (       a  UR%                  SS5      OSn['        US	5       HY  u  p[(        R*                  " UR,                  5        U R.                  R1                  S
U5        U R!                  U5      (       d  MY    Oa   U =R2                  S-  sl        U R.                  R5                  SUR6                  =(       d    U5        SU;   a  US    H  nU" U5        M     gUR,                  (       d7  Ub#  U R                  (       a  UR                  " U5        U R                  5         gSU;   a  US    H  nU" U5        M     UR9                  5         U R:                  R=                  UR>                  5        SU l         Ub#  U RB                  (       a  UR                  " U5        SU;   a  US    H  nU" U5        M     Ub%  U RD                  (       a  UR                  " U5        ggg)z(Download the resource specified in 'url'prepareNzprepare-after_file_recheckFr   	_fallbackrS   r   zTrying fallback URL #%d   zFailed to download %srm   filer   after)#r   r    r   set_filenamecheckfix_extensionhandle_skip	extensionr7   
build_pathexists_archive_write_skipaddr   re   r   r   r   get	enumerater   remove_filetemppathr0   rg   r!   rm   filenamerw   r   successr   r   _archive_write_file_archive_write_after)	rA   r4   r"   r   r    r   callbackr   nums	            rM   r   DownloadJob.handle_urlG  s   

,,,, 	V$!),! - 7==#8#8!!#T%7%7 ~~&4+C+CKK'  "e#!/2! 3 zz/511gnn6F6F&4+C+CKK'  "::!NN  z: }}S!! 7;mmvzz+r2H%h2  !1!127===%%	 3 q 6&//638e#$)'N ) %3"t'?'?F# U?!&M! * 	&4#;#;KKe!'N! +4#<#<KK $=rP   c                    U R                   c  U R                  U5        OySU R                  ;   a(  U R                  S    H  nU" U R                   5        M     [        R                  b  [        R                  S5        U R                   R                  U5        SU R                  ;   a)  U R                  S    H  nU" U R                   5        M     gg)z1Set and create the target directory for downloadsN
post-afterr   r   )r    r   r   r   r   r   set_directory)rA   r"   r   s      rM   r   DownloadJob.handle_directory  s    <<OOF#tzz) $

< 8HT\\* !9zz%f%LL&&v.TZZ JJv.& /  rP   c                    XR                   ;   a  g U R                   R                  U5        UR                  S5      =n(       a  UR                  U5      nOW[        R
                  " U5      =n(       a:  U R                  c  U R                  5       U l        U R                  U5      (       d  S nU(       Ga  U R                  X@5      nU R                  nU R                  nUR                  SUR                  5      nU(       a)  UR                  SU5      (       a  UR                  Ul        OUR                  Ul        UR                  SSU5      =n	(       a  [        U	[         5      (       aA  U R"                  R%                  5       n
U(       a  U
R'                  U5        XR"                  U	'   OkU R"                  (       a%  UR"                  R'                  U R"                  5        U(       a.  UR"                  R'                  U5        SU;   a  UR"                  S	 UR                  SU5      (       a  UR(                  Ul          UR                  SU5      (       a3  U R*                  Ul        UR-                  5       nUR*                  U l        OUR-                  5       nU(       a  U =R.                  U-  sl        US-  (       a  S	U;   a  U R0                  (       a  [3        US	   5      =oS	'    [5        U5      nUR6                  R9                  S
5        [:        R<                  " X5        US   R?                  S5      (       a  URA                  SS5      S   US'   UR?                  S5      (       a  SUS'   U RC                  X5        g U RK                  U5        g ! [D         a     Nf = f! [F        RH                   a     Of = fGM  )N
_extractorrC   zparent-directoryzparent-metadatazmetadata-parentzparent-sessionzparent-skip_   r   zDownloading fallback URLr   )HLSDASH/   zytdl:mp4r   )&r   r   r   from_urlr   r   r   _build_extractor_filterr2   r    r   rC   	directory
_parentdirr5   r   r   r"   copyr@   sessionr   r|   r!   r   iternextr0   rg   r   nameext_from_url
startswithrsplitr   StopIterationr	   rq   r   )rA   r4   r"   clsrB   r   pfmtrZ   rC   pmetadatar!   r   s                rM   r   DownloadJob.handle_queue  s   ,,**\**3*<<$D ~~c**t*))1-1-I-I-KD*--d33D..,C<<DNNE\\(ELL9F%7@@"&.."'"2"2%'8&B Bu BeS));;++-DF+(,JJu%{{

))$++6

))&1'61 #

< 8||,f55$}}||M6::'+}}!$(+!$v-"RK +v 5$-- $VK%8 9:Hk':=&*8n !&		/I J $ 5 5c B#)*#5#@#@ B7 $8 $89<C9KB9OF:$6#&>>'#:#::?F;$7 $ <
 ##C(! $1 % $% !22 ; s8    B)N& *N 5BN& 
N# N& "N##N& &N=<N=c                    U R                   (       aE  U R                  (       d  U R                   R                  5         U R                   R                  5         U R                  =n(       a  U R
                  nSU;   a  US    H  nU" U5        M     U R                  R                  5         U R                  (       a  SU;   a  US    H  nU" U5        M     OSU;   a  US    H  nU" U5        M     SU;   a  US    H  nU" U5        M     g g g )Nr   zfinalize-errorzfinalize-successrw   )r   r!   rw   closer    r   r   cookies_store)rA   r    r   r   s       rM   rv   DownloadJob.handle_finalize  s    <<;;%%'LL ll"7"JJEu$ %l 3HW% !4 NN((*{{#u,$)*:$; ) %< &.$)*<$= ) %>U" %j 1HW% !2 #! #rP   c                    U R                   nSU R                  ;   a  U R                  S    H  nU" U5        M     U R                  R                  UR                  5        U R
                  bh  U R                  b   U R                  UR                  5      (       a;  U =R                  S-  sl        U R                  U R                  :  a  U R
                  eU R                  b+  U R                  R                  U R                  5       S5        g g )Nr   r   )r    r   r   r   r   _skipexc_skipftrr"   r   _skipmax
sleep_skipr   re   )rA   r    r   s      rM   r   DownloadJob.handle_skip  s    ,,TZZ JJv.! /gll#==$}}$gnn(E(E"==DMM1--'??&NN  !2F; 'rP   c                    U R                  USUR                  S5       5      =n(       a   UR                  " XR                  5      $ U R                  U5        g! [         aZ  nUR
                  [
        R                  :X  a  e U R                  R                  SUR                  R                  U5         SnAgSnAff = f)zDownload 'url'N:r`   F)get_downloaderr   r   r    rs   errnoENOSPCr0   r   r2   r3   r   )rA   r4   r   ry   s       rM   r   DownloadJob.download!  s    ,,S#((3--@AA:A!**3== 	$  99,  3==+A+A3G	s   A 
B>$AB99B>c                     U R                   U   $ ! [         a     Of = f[        R                  " U5      nU(       a2  [        R
                  " SUR                  4SS5      (       a	  U" U 5      nOSnU R                  R                  SU5        U(       a0  UR                  S:X  a   U=U R                   S'   U R                   S'   U$ X0R                   U'   U$ )z)Return a downloader suitable for 'scheme'r   enabledTNz$'%s:' URLs are not supported/enabledhttphttps)	r   KeyErrorr   r   r   r   schemer0   rm   )rA   r$  r
  instances       rM   r  DownloadJob.get_downloader.  s    	##F++ 		 oof%6::|SZZ8)TJJ4yHHHHNNA6J3::'CKKDV$t'7'7'@  (0V$s    
c           
      T   U R                   nUR                  n[        R                  " U5      =o@l        Ub  UR                  U5        [        R                  " U" S5      5      U l        [        R                  " U" S5      5      U l	        U" SS5      U l
        U" SS5      (       d  UR                  U l        U" S5      =n(       a  U" S5      nU" S	5      nUc  Uc  UR                  OS
nU" S5      nUc  UR                  n [        R                   " UUUUU" S5      U" S5      U5      U l        UR"                  R%                  SU5        U" S5      n	U	c  SU l        SU l        SU l        OE[-        U	[.        5      (       a  U	R1                  S5      n	SU	;   U l        SU	;   U l        SU	;   U l         U" SS5      =n(       Ga  SU l        US:X  a  UR<                  Ul        GO[-        U[.        5      (       a  URA                  S5      u  pnUS:X  a9  URA                  S5      u  pn[B        RD                  " U=(       d    S5      U l        O-US:X  a  [B        RF                  U l        OUS:X  a  [H        U l        [J        RL                  " U5      U l'        U" S5      =n(       a  [        RP                  " U5      U l)        O:SU l)        O2S/S jUl*        U R                  b  URT                  U R                  l+        U" SS5      (       d  gURY                  S5      =n(       Gan  [Z        R\                  " [^        5      U l0        U Rc                  S5      n[        Rd                  " S S5      =(       d    0 nU" S!5      n/ nU GH  n[-        U[.        5      (       a  URe                  U5      =(       d    S"U0nOBS#U;   a<  US#   nUU;   a&  UU   Rg                  5       nURi                  U5        UnS"U;  a  UUS"'   U(       a!  URg                  5       nURi                  U5        URe                  S$5      nUb  SnOURe                  S%5      nSnU(       a$  [        Rj                  " UU5      " U5      (       d  M  URe                  S"S
5      nS&U;  ac  URm                  S'5      u  nnnU(       a  UUS"'   S(U;  a  UUS('   OUnURm                  S)5      u  nnnU(       a  UUS"'   S*U;  a  UUS*'   OUnSUS&'   [n        Rp                  " U5      nUc  UR5                  S+U5        GM   U" U U5      nURs                  U5        GM     U(       aL  UR"                  R%                  S-U5        S.U R`                  ;   a  U R`                  S.    H  n U " U5        M     gggg! [2         a<  n
UR"                  R5                  SXZR6                  R8                  U
5         Sn
A
GNSn
A
ff = f! [2         aE  n
URu                  U
5        URw                  S,UU
R6                  R8                  U
5         Sn
A
GM  Sn
A
ff = f)0z*Delayed initialization of PathFormat, etc.Nre   z
sleep-skipr   Tr   r   zarchive-tablezarchive-prefix archive-formatzarchive-modezarchive-pragmazUsing download archive '%s'zarchive-eventF,r   r   r   z0Failed to open download archive at '%s' (%s: %s)r   r  abort	terminateexitzskip-filterc                     g)NFrS   )xs    rM   <lambda>(DownloadJob.initialize.<locals>.<lambda>  s    ErP   postprocesspostprocessorsr   rS   zpostprocessor-optionsrz   type	whitelist	blacklistrN   @eventr   modezmodule '%s' not foundz#'%s' initialization failed:  %s: %sz Active postprocessor modules: %sinitr   )<r   r   r   
PathFormatr    r   r   rd   re   r  r   r   r   rT   archive_fmtr   connectr0   r1   r   r   r   r   r   splitrt   r   r2   r3   r  
_enum_file
check_file	partitionr	   rh   rp   
SystemExitr   	parse_intr  compile_filterr  r   r   r(   collectionsdefaultdictr%   r   r   r   r  r@   build_extractor_filter
rpartitionr   r   r>   rl   rm   )!rA   r"   rB   cfgr    archive_patharchive_tablearchive_prefixarchive_formateventsry   r   _smaxsargskip_filterr3  pp_logpp_confpp_optspp_listpp_dictpp_typeppclistnegaterz   sepr8  r9  pp_clspp_objr   s!                                    rM   r   DownloadJob.initializeB  s   ~~kk!%!66,!!&)--c'l;
223|3DEJ-:t$$#11DMy>)<)0M !12N%2?2GR !12N%!%!1!1D& ""!'()  <lK_->/3D,/4D,05D-!&#..!'c!206&0@D,06&0@D,18F1BD-vt$$4$ DM{"%,%7%7"D#&& $s 37?$(NN3$7MDT$-$<$<T\T$JDM[($-$A$ADMV^$.DM $t 4"%m"44;4$($7$7$DDM$(DM 2GN||'%,^^"=$''!334DEE>E$006DJ___5Fjj_5;G12GG)gs++%kk'2Gvw6GGw&%foG')$W-224		'*"$W,*1%llnGNN7+K0$"F#KK4E!F!<!<v"''+"- "-{{62.W,'+s';$D#u*."'1/4GG,$&*ooc&:OD#t*.!0.2GFO#*.GJ'&++D1>NN#:DA+#D'2F NN6*q *t A7KTZZ'$(JJv$6 ) %7 ( E F_  ?  F --"8"8#? ??T ! D$$S)LL!F!%s}}'='=sD DDs0   -V 	W
W1WW
X'"9X""X'c                    U(       a  UR                  S5      OS nU(       ag  [        R                  " U5      nUR                  5        H<  u  pVU R                  U   R                  [        R                  " [        Xd5      5        M>     g UR                  5        H#  u  pVU R                  U   R                  U5        M%     g )Nfilter)	r   r   rD  r;   r   r>   	functoolspartial_call_hook_condition)rA   r   optionsexpr	conditionhookr   s          rM   register_hooksDownloadJob.register_hooks  s    (/w{{8$T++D1I"'++-

4 ''	(9(9(()? @ #0 #(++-

4 ''1 #0rP   c                    U R                   R                  S5      nUb  SnS nOGU R                   R                  S5      nSn[        R                  nUc  U R                   R                  4n[        R
                  " XU5      $ )Nr5  Fr6  T)r   r   r   SPECIAL_EXTRACTORSrT   rG  )rA   rZ  r[  specials       rM   r   #DownloadJob._build_extractor_filter  st    %%k2FGNN))+6EF--G}002**5'BBrP   )r   r   r   r   r   r  r  r  r   r   r   r   r   r0   r   r    re   r  r   r   )r3   r   r   r   r   rN   r   r   r   rv   r   r   r  r   ri  r   r   rS   rP   rM   r   r   7  sC    GQ f'L)\&4< (Y*v
2CrP   r   c                 D    U" UR                   5      (       a	  U " U5        g g r   )r"   )r   rg  r    s      rM   rd  rd    s       !rP   c                   $    \ rS rSrSrS rS rSrg)SimulationJobi  z<Simulate the extraction process without downloading anythingc                    US   =(       d    SnU R                   R                  X35      US'   U R                  b*  U R                  R                  U R                  5       S5        U R                  b,  U R
                  (       a  U R                  R                  U5        U R                  R                  U R                   R                  U5      5        g )Nr   jpgr   )
r    extension_mapre   r   r   r   r   r   r   build_filename)rA   r4   r"   exts       rM   r   SimulationJob.handle_url   s    [!*U"ll88B{::!NN  z:<<#(@(@LLV$dll11&9:rP   c                 @    U R                   c  U R                  5         g g r   )r    r   r   s     rM   r   SimulationJob.handle_directory	  s    <<OO  rP   rS   N)r3   r   r   r   r   r   r   r   rS   rP   rM   rq  rq    s    F;rP   rq  c                   >    \ rS rSrSrS
S jrS rS rS rSS jr	S	r
g)
KeywordJobi  zPrint available keywordsNc                 h    [         R                  XU5        [        R                  " SS5      U l        g )Nr   private)r   rN   r   r   r~  r   s      rM   rN   KeywordJob.__init__  s"    T'zz+y9rP   c                 &   [        S5        U R                  (       aP  UR                  S5      (       a:  [        R                  " U R
                  R                  USS95      X R                  '   U R                  U5        [        R                  " 5       e)NzK
Keywords for filenames and --filter:
------------------------------------
r!  HEAD)method)
stdout_writer7   r  r   extract_headersr   requestprint_kwdictr	   rh   r   s      rM   r   KeywordJob.handle_url  sw     > 	? #.."8"8)-)=)=&&s6&:*<F%%& 	&!&&((rP   c                 <    [        S5        U R                  U5        g )Nz<Keywords for directory names:
-----------------------------
)r  r  r   s     rM   r   KeywordJob.handle_directory   s     7 	8&!rP   c                    S nSU;   a  US   R                  U5      n[        R                  " U5      (       d  U R                  R                  R                  S5        U(       a@  U R                  R                  R                  SU5        [        X05      R                  5         OU R                  R                  R                  SU5        Ol[        S5        U R                  U5        U(       d  U R                  R                  (       a.  [        S5        [        U=(       d    UU 5      R                  5         [        R                  " 5       e)Nr   zYThis extractor only spawns other extractors and does not provide any metadata on its own.z"Showing results for '%s' instead:
z!Try 'gallery-dl -K "%s"' instead.z>Keywords for --chapter-filter:
------------------------------

)r   r   filter_dictr   r0   rg   r{  r|   r  r  rV   r	   rh   )rA   r4   r"   rB   s       rM   r   KeywordJob.handle_queue%  s    6!,'005D''NN##@A ""''93@4&**,""''93@  < =f%t~~66T"4;3-113&&((rP   c           	      8   [         R                  R                  nU(       a  SOSn[        U5      nUc  U1nO%Xc;   a  U" USS  S35        gUR	                  U5        [        UR                  5       5       GH  u  pxUS   S:X  a  U R                  (       d  M"  X'-   U-   n[        U[        5      (       a  U R                  XS-   U5        MU  [        U[        5      (       a  U(       d  Ms  [        US   [        5      (       a  U R                  US   US	-   U5        M  S
[        [        [        U5      5      5      -  R                  n	U" US-   5        [        US5       H  u  pU" U	" X5      5        M     GM  U" U SU S35        GM     UR!                  U5        g)z1Print key-value pairs in 'kwdict' with formattingz']r(  Nr   z
  <circular reference>
r   rO  z['z[N]['z  {:>%s} {}
z[N]

  r  )sysstdoutwriteidr   sortedr;   r~  r   dictr  r%   lenr   formatr   remove)rA   r"   prefixmarkersr  suffixmarkeridrJ   rK   rL   idxvals               rM   r  KeywordJob.print_kwdict?  s]   

  Rf:?jG VCR[M!;<=KK! 0JC1v}T\\,'C%&&!!%tW=E4((a$//%%eAhgwG*SSZ-AAIIC#-($-eQ$7c#m, %8
 T%+,+ 1. 	x rP   )r~  r   )r(  N)r3   r   r   r   r   rN   r   r   r   r  r   rS   rP   rM   r{  r{    s    ":	)"
)4%!rP   r{  c                   8    \ rS rSrSrSrS
S jrS rS rS r	S	r
g)UrlJobig  zPrint download urlsr   Nc                 ~    [         R                  XU5        X0l        X0R                  :  a  U R                  U l        g g r   )r   rN   ri   maxdepthr   r   )rA   r4   rC   ri   s       rM   rN   UrlJob.__init__k  s0    T'
MM! $D "rP   c                      [        US-   5        g Nr  r  )rA   r4   rO  s      rM   r   UrlJob.handle_urlq  s    S4Z rP   c                 d    [        US-   5        SU;   a  US    H  n[        SU S35        M     g g )Nr  r   z| r  r   s      rM   handle_url_fallbackUrlJob.handle_url_fallbackt  s:    S4Z & k*r#b\* + !rP   c                 6   UR                  S5      =n(       a  UR                  U5      nO[        R                  " U5      nU(       aA  U =R                  U R                  X@U R                  S-   5      R                  5       -  sl        g U R                  U5        g Nr   r   )	r   r   r   r   r!   r2   ri   r|   r   )rA   r4   r"   r
  rB   s        rM   r   UrlJob.handle_queuez  sm    **\**3*<<$D>>#&DKK4>>$djj1nEIIKKK##C(rP   )ri   r   )Nr   )r3   r   r   r   r   r  rN   r   r  r   r   rS   rP   rM   r  r  g  s    H0!+	)rP   r  c                   *    \ rS rSrSrS rS rS rSrg)InfoJobi  z%Print extractor defaults and settingsc                    U R                   nU R                  nU R                  nUR                  (       a*  U" SUR                  UR
                  UR                  5        OU" SUR                  UR
                  5        U" SSUR                  5        U" SSUR                  5        U" SSUR                  5        U" S	S
UR                  5        g)Nz%Category / Subcategory / BasecategoryzCategory / SubcategoryzFilename formatr   zDirectory formatr   zArchive formatr)  zRequest intervalzsleep-requestr   )
r   _print_multi_print_configrX   rT   rW   filename_fmtdirectory_fmtr<  request_interval)rA   expmpcs       rM   r|   InfoJob.run  s    ^^??6{{BNNBOO= 'bnnE
j"//:
{B,<,<=
-r~~>
0C0CDrP   c           
      t    [        U SSR                  [        [        R                  U5      5       S35        g )Nr  z / 

)r  joinmapr   
json_dumps)rA   titlevaluess      rM   r  InfoJob._print_multi  s0    gT%**S&%ABC4H	JrP   c                 X   U R                   R                  U[        R                  5      nU[        R                  La@  [	        U S[        R
                  " U5       SU S[        R
                  " U5       S35        g U(       a&  [	        U S[        R
                  " U5       S35        g g )Nz (custom):
  r  z (default):
  r  )r   r   r   SENTINELr  r  )rA   r  optnamerK   optvals        rM   r  InfoJob._print_config  s    &&w>&'(?'@')?(@FG ')?(@EG rP   rS   N)	r3   r   r   r   r   r|   r  r  r   rS   rP   rM   r  r    s    /$JGrP   r  c                   f    \ rS rSrSrSrS\R                  SS4S jrS r	S r
S	 rS
 rS rS rSrg)DataJobi  z'Collect extractor results and dump themFNTc                 N   [         R                  XU5        X0l        / U l        / U l        / U l        / U l        S U l        [        R                  " SSU5      U l
        [        R                  " SSS5      U l        USL a  SOU=(       d    U R                  U l        [        R                  " SS5      nU(       a  [        R                  O[        R                   U l        U R                  S:  a  U R$                  U l        U R                  (       d  [        R(                  U l        g g )	Nr}  asciijsonlFTrb   r~  r   )r   rN   r   r  	data_urls	data_post	data_metar	   r   r   r  r  resolver  r  r   r  ra  handle_queue_resolver   noopr   )rA   r4   rC   r   ensure_asciir  r~  s          rM   rN   DataJob.__init__  s    T'		ZZWlC
ZZWe<
%osG4Kt||**[)4#*dii0@0@<<! $ 9 9DzzyyDH rP   c                    U R                  5         U R                  n[        R                  " UR                  " S5      5      nUb  UR
                  " U" 5       S5         U R                  U5        [        R                   " SSS5      (       a;  U R                   H+  n[        R"                  " US   [        R$                  5        M-     U R&                  (       ad  U R(                  (       dS   [        R*                  " U R                  U R&                  U R,                  S5        U R&                  R/                  5         g	g	! [        R                   a     N[         aN  nX0l        U R                  R                  SUR                  R                  [        U5      S.45         S nAGN6S nAf[         a     GNFf = f! [         a     g	f = f)
Nr_   r   )rm   rn   r}  z
num-to-strFr   r   )rc   r   r   rd   r   re   rf   r	   rh   rt   r  r>   r2   r3   r   ru   r   transform_dictnumber_to_stringr   r  	dump_jsonr  flush)rA   r   re   ry   rx   s        rM   r|   DataJob.run  s^   

NN	((./1OOEG[1	MM)$ ::k<77yy##CGT-B-BC ! 99TZZtyy$))TZZC		! 1 '' 	 	 NIIb==11s8#     		  s8   D> +AF: >F7	F7AF&&F76F7:
GGc                     U R                   R                  [        R                  " U5      5        U R                   R                  S5        U R                   R	                  5         g r  )r   r  r   r  r  )rA   rx   s     rM   r   DataJob.out  s9    		,-				rP   c                    U R                  U5      nU R                  [        R                  X4=n5        U R                  R                  U5        U R                  R                  U5        U R                  R                  U5        g r   )ra  r   r   r   r  r>   r  r  rA   r4   r"   rx   s       rM   r   DataJob.handle_url  s`    V$c223c"f%		rP   c                     U R                  U5      nU R                  [        R                  U4=n5        U R                  R                  U5        U R                  R                  U5        g r   )ra  r   r   r   r  r>   r  )rA   r"   rx   s      rM   r   DataJob.handle_directory  sP    V$**F334f%		rP   c                    U R                  U5      nU R                  [        R                  X4=n5        U R                  R                  U5        U R                  R                  U5        U R                  R                  U5        g r   )ra  r   r   r   r  r>   r  r  r  s       rM   r   DataJob.handle_queue  s`    V$445c"f%		rP   c                    UR                  S5      =n(       a  UR                  U5      nO[        R                  " U5      nU(       d  U R	                  U5      nU R                  [        R                  X4=n5        U R                  R                  U5        U R                  R                  U5        U R                  R                  U5      $ U R                  X@S U R                  U R                  S-
  5      nU R                  Ul        U R                  Ul        U R                  Ul        U R                  Ul
        UR!                  5         g r  )r   r   r   r   ra  r   r   r   r  r>   r  r  r2   r  r  r  r|   )rA   r4   r"   r
  rB   rx   r   s          rM   r  DataJob.handle_queue_resolve  s    **\**3*<<$D>>#&D[[(FHHW]]C88S9NN!!#&NN!!&)99##C((nnTtzz4<<>J99	rP   )r  r  r  r  r  r	   r   ra  r   r  r   r  )r3   r   r   r   r   r  r  r  rN   r|   r   r   r   r   r  r   rS   rP   rM   r  r    s<    1G#'cjjt!*$L
rP   r  )r  r  r   rb  rE  r(  r   r   r   r   r   r	   r
   r   r   r   r   r   extractor.messager   r  r   r   r   rd  rq  r{  r  r  r  rS   rP   rM   <module>r     s            '""

R  R j~C# ~CB
K "V! V!r)S )>!Gc !GHjc jrP   