U
    $Pf                     @   s   d dl mZ d dlZd dlZd dlZd dlZddlmZmZ ddl	m
Z
mZmZmZmZmZ dd Zdd	 ZG d
d deZdS )    )unicode_literalsN   )compat_urlparsecompat_kwargs)check_executableencodeArgumentExtractorErrorget_exe_versionis_outdated_versionstd_headersc                 C   s   | j | jd}| jr| j|d< | jr.| j|d< | jr>| j|d< | jd k	rR| j|d< | j	d k	rf| j	|d< | j
d k	rz| j
|d< z*| ds| d	s| d
rd|d	< W n tk
r   Y nX |S )N)namevalueportdomainpathexpiressecurediscardhttpOnlyhttponlyHttpOnlyT)r   r   port_specifiedr   domain_specifiedr   path_specifiedr   r   r   r   has_nonstandard_attr	TypeError)cookiecookie_dict r   A/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/extractor/openload.pycookie_to_dict   s2    









r    c                 C   s   dd | D S )Nc                 S   s   g | ]}t |qS r   )r    ).0r   r   r   r   
<listcomp>3   s     z&cookie_jar_to_list.<locals>.<listcomp>r   )Z
cookie_jarr   r   r   cookie_jar_to_list2   s    r#   c                   @   sb   e Zd ZdZdZdddg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S )PhantomJSwrapperz=PhantomJS wrapper class

    This class is experimental.
    a  
        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);
        }};
        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                 C   s   i | _ tddg| _| js&tddd|| _|rT|  }t||rT| jjd|  d|i| _	| j
D ]"}tjdd	}|  || j |< qdd S )
Nr(   z-vzMPhantomJS executable not found in PATH, download it from http://phantomjs.orgT)expectedzaYour copy of PhantomJS is outdated, update it to version %s or newer if you encounter any errors.timeoutF)delete)
_TMP_FILESr   exer   	extractorr)   r
   _downloaderZreport_warningoptions_TMP_FILE_NAMEStempfileNamedTemporaryFileclose)selfr0   Zrequired_versionr,   versionr   tmpr   r   r   __init__n   s,    
 
zPhantomJSwrapper.__init__c                 C   sB   | j D ]6}zt| j| j W q tttfk
r:   Y qX qd S )N)r3   osremover.   r   IOErrorOSErrorKeyError)r7   r   r   r   r   __del__   s
    
zPhantomJSwrapper.__del__c              	   C   sx   t | jjj}|D ],}d|kr&d|d< d|krt|j|d< qt| jd j	d}|
t|d W 5 Q R X d S )Nr   /r   r'   wbutf-8)r#   r0   r1   	cookiejarr   urlparsenetlocopenr.   r   writejsondumpsencode)r7   urlr'   r   fr   r   r   _save_cookies   s    zPhantomJSwrapper._save_cookiesc              	   C   s~   t | jd jd}t| d}W 5 Q R X |D ]B}|d dkrRdd i|d< d|krf|d |d	< | jjf t	| q6d S )
Nr'   rbrC   r   Tr   restZexpiryexpire_time)
rG   r.   r   rI   loadsreaddecoder0   Z_set_cookier   )r7   rM   r'   r   r   r   r   _load_cookies   s    zPhantomJSwrapper._load_cookieszExecuting JS on webpagesaveAndExit();c              	   C   s  d|krt d|s(| jj||||d}t| jd jd}||d W 5 Q R X | | | j	}	||	d< |
dp~td }
|
d	d
|	d< ||	d< | jD ]$}| j| jddd	d
|	|< qt| jd jd }|| jjf |	d W 5 Q R X |dkr| jd|f  n| jd||f  tj| jd| jd jgtjtjd}| \}}|jdkrzt dt| t| jd jd}| d}W 5 Q R X |   |t|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, for example:
            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();
        rV   z&`saveAndExit();` not found in `jscode`)noteheadersr&   rB   rC   rL   z
User-Agent"z\"Zuajscode\z\\r%   Nz%sz%s: %sz--ssl-protocol=any)stdoutstderrr   zExecuting JS failed
:rO   )r   r0   Z_download_webpagerG   r.   r   rH   rK   rN   r2   getr   replacer3   	_TEMPLATEformatZ	to_screen
subprocessPopenr/   PIPEcommunicate
returncoder   rS   rT   rU   )r7   rL   r&   Zvideo_idrW   Znote2rX   rZ   rM   Zreplaces
user_agentxpouterrr   r   r   r^      sH    $

"$
 
 
zPhantomJSwrapper.get)Nr*   )__name__
__module____qualname____doc__r`   r3   staticmethodr)   r:   r@   rN   rU   r^   r   r   r   r   r$   6   s   ,




r$   )
__future__r   rI   r;   rb   r4   compatr   r   utilsr   r   r   r	   r
   r   r    r#   objectr$   r   r   r   r   <module>   s    
