
    yf!                         d dl Z d dlZd dlZd dlZd dlZd dlZddlmZ ddlm	Z	m
Z
mZmZmZmZmZ d Zd Z G d d      Zy)	    N   )compat_urlparse)ExtractorErrorPopencheck_executableformat_fieldget_exe_versionis_outdated_versionshell_quotec                 J   | j                   | j                  d}| j                  r| j                  |d<   | j                  r| j
                  |d<   | j                  r| j                  |d<   | j                  | j                  |d<   | j                  | j                  |d<   | j                  | j                  |d<   t        j                  t              5  | j                  d      s"| j                  d	      s| j                  d
      rd|d	<   d d d        |S # 1 sw Y   |S xY w)N)namevalueportdomainpathexpiressecurediscardhttpOnlyhttponlyHttpOnlyT)r   r   port_specifiedr   domain_specifiedr   path_specifiedr   r   r   r   
contextlibsuppress	TypeErrorhas_nonstandard_attr)cookiecookie_dicts     ;/usr/lib/python3/dist-packages/yt_dlp/extractor/openload.pycookie_to_dictr"      s   K $kkF &H$kkF~~!!'I}}  &H~~!!'I			Y	' +''
3..z:..z:&*K
#	+
 +
 s   9DD"c                 >    | D cg c]  }t        |       c}S c c}w N)r"   )
cookie_jarr   s     r!   cookie_jar_to_listr&   -   s    1;<vN6"<<<s   c                   p    e Zd ZdZdZdZdZg dZed        Z	ddZ
d	 Zd
 Zd Zddddi dfdZddddZy)PhantomJSwrapperz=PhantomJS wrapper class

    This class is experimental.
    z;Please download it from https://phantomjs.org/download.htmla  
        phantom.onError = function(msg, trace) {{
          var msgStack = ['PHANTOM ERROR: ' + msg];
          if(trace && trace.length) {{
            msgStack.push('TRACE:');
            trace.forEach(function(t) {{
              msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line
                + (t.function ? ' (in function ' + t.function +')' : ''));
            }});
          }}
          console.error(msgStack.join('\n'));
          phantom.exit(1);
        }};
    a	  
        var page = require('webpage').create();
        var fs = require('fs');
        var read = {{ mode: 'r', charset: 'utf-8' }};
        var write = {{ mode: 'w', charset: 'utf-8' }};
        JSON.parse(fs.read("{cookies}", read)).forEach(function(x) {{
          phantom.addCookie(x);
        }});
        page.settings.resourceTimeout = {timeout};
        page.settings.userAgent = "{ua}";
        page.onLoadStarted = function() {{
          page.evaluate(function() {{
            delete window._phantom;
            delete window.callPhantom;
          }});
        }};
        var saveAndExit = function() {{
          fs.write("{html}", page.content, write);
          fs.write("{cookies}", JSON.stringify(phantom.cookies), write);
          phantom.exit();
        }};
        page.onLoadFinished = function(status) {{
          if(page.url === "") {{
            page.setContent(fs.read("{html}", read), "{url}");
          }}
          else {{
            {jscode}
          }}
        }};
        page.open("");
    )scripthtmlcookiesc                      t        dd      S )N	phantomjsz	([0-9.]+))
version_re)r	        r!   _versionzPhantomJSwrapper._versionj   s    {|DDr0   Nc                    i | _         t        ddg      | _        | j                  st        d| j                   d      || _        |rD| j                         }t        ||      r(| j
                  j                  j                  d|z         | j                  D ]7  }t        j                  d      }|j                          || j                   |<   9 t        j                  d	|i| j                  D ci c]<  }|| j                   |   j                   j#                  d
d      j#                  dd      > c}      | _        y c c}w )Nr-   z-vzPhantomJS not found, T)expectedzaYour copy of PhantomJS is outdated, update it to version %s or newer if you encounter any errors.F)deletetimeout\z\\"\")
_TMP_FILESr   exer   INSTALL_HINT	extractorr1   r
   _downloaderreport_warning_TMP_FILE_NAMEStempfileNamedTemporaryFileclosecollectionsChainMapr   replaceoptions)selfr<   required_versionr5   versionr   tmpxs           r!   __init__zPhantomJSwrapper.__init__n   s1   #K$8xx #89J9J8K!LW[\\"mmoG"7,<=**99?AQRS (( 	(D--U;CIIK$'DOOD!	(
 #++w-
 ))
 tq!&&..tV<DDS%PP

s   3AE
c                     | j                   D ]U  }t        j                  t        t              5  t        j                  | j                  |   j                         d d d        W y # 1 sw Y   bxY wr$   )	r?   r   r   OSErrorKeyErrorosremover9   r   )rG   r   s     r!   __del__zPhantomJSwrapper.__del__   s\    (( 	6D$$Wh7 6		$//$/4456 6	66 6s   -A&&A/	c                    t        | j                  j                        }|D ]2  }d|vrd|d<   d|vst        j                  |      j
                  |d<   4 t        | j                  d   j                  d      5 }|j                  t        j                  |      j                  d             d d d        y # 1 sw Y   y xY w)Nr   /r   r+   wbutf-8)r&   r<   	cookiejarr   urlparsenetlocopenr9   r   writejsondumpsencode)rG   urlr+   r   fs        r!   _save_cookieszPhantomJSwrapper._save_cookies   s    $T^^%=%=> 	HFV#!$vv%#2#;#;C#@#G#Gx 		H
 $//),1148 	9AGGDJJw'..w78	9 	9 	9s   :4B77C c                 R   t        | j                  d   j                  d      5 }t        j                  |j                         j                  d            }d d d        D ]8  }|d   du rdd i|d<   d|v r|d   |d	<    | j                  j                  d
i | : y # 1 sw Y   GxY w)Nr+   rbrV   r   Tr   restexpiryexpire_timer/   )	rZ   r9   r   r\   loadsreaddecoder<   _set_cookie)rG   r`   r+   r   s       r!   _load_cookieszPhantomJSwrapper._load_cookies   s    $//),1148 	;Ajj!9:G	; 	1Fj!T)",d!3v6!(.x(8}%&DNN&&00	1	; 	;s   3BB&zExecuting JS on webpagesaveAndExit();c           	      &   d|vrt        d      |s| j                  j                  ||||      }t        | j                  d   j
                  d      5 }|j                  |j                  d             ddd       | j                  |       |j                  d      xs | j                  j                  d	      d   }	| j                  j                  | j                  j                  ||	j                  d
d      |d            }| j!                  |||      }
t        | j                  d   j
                  d      5 }|j#                         j%                  d      }ddd       | j'                          ||
fS # 1 sw Y   xY w# 1 sw Y   *xY w)a  
        Downloads webpage (if needed) and executes JS

        Params:
            url: website url
            html: optional, html code of website
            video_id: video id
            note: optional, displayed when downloading webpage
            note2: optional, displayed when executing JS
            headers: custom http headers
            jscode: code to be executed when page is loaded

        Returns tuple with:
            * downloaded website (after JS execution)
            * anything you print with `console.log` (but not inside `page.execute`!)

        In most cases you don't need to add any `jscode`.
        It is executed in `page.onLoadFinished`.
        `saveAndExit();` is mandatory, use it instead of `phantom.exit()`
        It is possible to wait for some element on the webpage, e.g.
            var check = function() {
              var elementFound = page.evaluate(function() {
                return document.querySelector('#b.done') !== null;
              });
              if(elementFound)
                saveAndExit();
              else
                window.setTimeout(check, 500);
            }

            page.evaluate(function(){
              document.querySelector('#a').click();
            });
            check();
        rl   z&`saveAndExit();` not found in `jscode`)noteheadersr*   rU   rV   Nz
User-Agenthttp_headersr7   r8   )r_   uajscodern   rc   )r   r<   _download_webpagerZ   r9   r   r[   r^   ra   get	get_param	_TEMPLATE
format_maprF   	new_childrE   executerh   ri   rk   )rG   r_   r*   video_idrn   note2ro   rr   r`   
user_agentstdouts              r!   ru   zPhantomJSwrapper.get   sh   H 6) !IJJ>>33CV]3^D$//&)..5 	*GGDKK()	* 	3[[.h$..2J2J>2Z[g2h
**4<<+A+A$$S%0C
 ,  fhU;$//&)..5 	,668??7+D	,V|%	* 	*	, 	,s   !E:> F:FFzExecuting JSrs   c                   d|vr|dz  }| j                   |z   }t        | j                  d   j                  dd      5 }|j	                  |       ddd       | j
                  j                  t        |dd       |        | j                  d	| j                  d   j                  g}| j
                  j                  d
t        |              	 t        j                  || j                  d   dz  dt        j                  t        j                        \  }}}|r!t#        | d| d|j%                                |S # 1 sw Y   xY w# t         $ r}	t#        | d|	      d}	~	ww xY w)zExecute JS and return stdoutzphantom.exit();z;
phantom.exit();r)   wrV   )encodingNz%s: z--ssl-protocol=anyzPhantomJS command line: r5   i  T)r5   textr~   stderrz' failed: Unable to run PhantomJS binary)causez failed with returncode z:
)_BASE_JSrZ   r9   r   r[   r<   	to_screenr   r:   write_debugr   r   runrF   
subprocessPIPE	Exceptionr   strip)
rG   rr   r{   rn   r`   cmdr~   r   
returncodees
             r!   rz   zPhantomJSwrapper.execute   sa   F***F'$//(+00#H 	AGGFO	  L4$H#I$!PQxx-tx/H/M/MN""%=k#>N=O#PQ	\).3Y@WZ^@^8<Z__]g]l]l*n&FFJ  D6)A*SQWQ]Q]Q_P`!abb	 	  	\ D6)P!QYZ[[	\s$   D?A
E ?E	E)E$$E))Ni'  r$   )__name__
__module____qualname____doc__r;   r   rw   r?   staticmethodr1   rL   rR   ra   rk   ru   rz   r/   r0   r!   r(   r(   1   su    
 QLHI@ 4OE E86
91 !4dB[eg  qA :x^ r0   r(   )rC   r   r\   rP   r   r@   compatr   utilsr   r   r   r   r	   r
   r   r"   r&   r(   r/   r0   r!   <module>r      s?       	   $  2=B Br0   