a
    h!                     @   s~   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Zddlm	Z	m
Z
mZmZmZmZmZ dd Zdd ZG dd	 d	ZdS )
    N   )ExtractorErrorPopencheck_executableformat_fieldget_exe_versionis_outdated_versionshell_quotec                 C   s   | j | jd}| jr| j|d< | jr.| j|d< | jr>| j|d< | jd urR| j|d< | j	d urf| j	|d< | j
d urz| j
|d< tt6 | ds| d	s| d
rd|d	< W d    n1 s0    Y  |S )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_dict r   N/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/extractor/openload.pycookie_to_dict   s.    









&r    c                 C   s   dd | D S )Nc                 S   s   g | ]}t |qS r   )r    ).0r   r   r   r   
<listcomp>.       z&cookie_jar_to_list.<locals>.<listcomp>r   )Z
cookie_jarr   r   r   cookie_jar_to_list-   s    r$   c                   @   sx   e Zd ZdZdZdZdZg dZedd Z	dd
dZ
dd Zdd Zdd Zddddi dfddZdddddZdS )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                   C   s   t dddS )N	phantomjsz	([0-9.]+))Z
version_re)r   r   r   r   r   _versionj   s    zPhantomJSwrapper._versionN'  c                    s   i  _ tddg _ js.td j dd| _|r`  }t||r` jj	d| d  j
D ]"}tjdd	}|  | j |< qftd
|i fdd j
D  _d S )Nr)   z-vzPhantomJS not found, T)expectedz9Your copy of PhantomJS is outdated, update it to version z& or newer if you encounter any errors.F)deletetimeoutc                    s*   i | ]"}| j | jd dddqS )\z\\"\")
_TMP_FILESr
   replace)r!   xselfr   r   
<dictcomp>   s   z-PhantomJSwrapper.__init__.<locals>.<dictcomp>)r2   r   exer   INSTALL_HINT	extractorr*   r   Z_downloaderZreport_warning_TMP_FILE_NAMEStempfileNamedTemporaryFileclosecollectionsChainMapoptions)r6   r:   Zrequired_versionr.   versionr
   tmpr   r5   r   __init__n   s0    


zPhantomJSwrapper.__init__c              	   C   sN   | j D ]B}ttt" t| j| j W d    q1 s>0    Y  qd S )N)	r;   r   r   OSErrorKeyErrorosremover2   r
   )r6   r
   r   r   r   __del__   s    
zPhantomJSwrapper.__del__c                 C   s   t | jj}|D ].}d|vr$d|d< d|vrtj|j|d< qt| jd j	d$}|
t|  W d    n1 s|0    Y  d S )Nr   /r   r(   wb)r$   r:   	cookiejarurllibparseurlparsenetlocopenr2   r
   writejsondumpsencode)r6   urlr(   r   fr   r   r   _save_cookies   s    zPhantomJSwrapper._save_cookiesc                 C   s   t | jd jd$}t| d}W d    n1 s<0    Y  |D ]B}|d du rfdd i|d< d|v rz|d |d	< | jjf i | qJd S )
Nr(   rbutf-8r   Tr   restZexpiryexpire_time)	rQ   r2   r
   rS   loadsreaddecoder:   Z_set_cookie)r6   rW   r(   r   r   r   r   _load_cookies   s    2zPhantomJSwrapper._load_cookieszExecuting JS on webpagesaveAndExit();c              	   C   s  d|vrt d|s(| jj||||d}t| jd jd}||  W d   n1 s^0    Y  | | |	dp| j
dd }	| j| j||	d	d
|d}| j|||d}
t| jd jd}| d}W d   n1 s0    Y  |   ||
fS )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();
        ra   z&`saveAndExit();` not found in `jscode`)noteheadersr'   rK   Nz
User-AgentZhttp_headersr0   r1   )rV   Zuajscoderb   rY   rZ   )r   r:   Z_download_webpagerQ   r2   r
   rR   rU   rX   get	get_param	_TEMPLATE
format_maprA   	new_childr3   executer^   r_   r`   )r6   rV   r'   video_idrb   Znote2rc   rd   rW   
user_agentstdoutr   r   r   rf      s$    $,


,zPhantomJSwrapper.getzExecuting JSre   c          
   
   C   s,  d|vr|d7 }| j | }t| jd jddd}|| W d   n1 sP0    Y  | jt|dd |  | jd	| jd jg}| j	d
t
|  z,tj|| jd d dtjtjd\}}}W n8 ty }	 zt| d|	dW Y d}	~	n
d}	~	0 0 |r(t| d| d|  |S )zExecute JS and return stdoutzphantom.exit();z;
phantom.exit();r&   wrZ   )encodingNz%s: z--ssl-protocol=anyzPhantomJS command line: r.   i  T)r.   textrn   stderrz' failed: Unable to run PhantomJS binary)causez failed with returncode z:
)_BASE_JSrQ   r2   r
   rR   r:   Z	to_screenr   r8   Zwrite_debugr	   r   runrA   
subprocessPIPE	Exceptionr   strip)
r6   rd   rl   rb   rW   cmdrn   rr   
returncodeer   r   r   rk      s"    
(
(zPhantomJSwrapper.execute)Nr+   )N)__name__
__module____qualname____doc__r9   rt   rh   r;   staticmethodr*   rD   rI   rX   r`   rf   rk   r   r   r   r   r%   1   s    



<r%   )r?   r   rS   rG   rv   r<   urllib.parserM   utilsr   r   r   r   r   r   r	   r    r$   r%   r   r   r   r   <module>   s   $