U
    g;                     @   s|   d dl Z d dlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZ G dd deZG d	d
 d
eZdS )    N   )InfoExtractor)	YoutubeIE   )
ExtractorErrorbug_reports_messagedetermine_extextract_attributesget_element_by_classget_element_html_by_idint_or_nonelowercase_escapetry_getupdate_url_queryc                	   @   s   e Zd ZdZdddddddd	d
dddddddd	d
dddddddddddddddgZdd ej D ddiZdZ	ddd Z
g Zd!Zed"d# Zd$d% Zd.d&d'Zd(d) Zd*d+ Zd,d- Zd!S )/GoogleDriveIEa  (?x)
                        https?://
                            (?:
                                (?:docs|drive|drive\.usercontent)\.google\.com/
                                (?:
                                    (?:uc|open|download)\?.*?id=|
                                    file/d/
                                )|
                                video\.google\.com/get_player\?.*?docid=
                            )
                            (?P<id>[a-zA-Z0-9_-]{28,})
                    zGhttps://drive.google.com/file/d/0ByeS4oOUV-49Zzh4R1J6R09zazQ/edit?pli=1Z 5c602afbbf2c1db91831f5d82f678554z0ByeS4oOUV-49Zzh4R1J6R09zazQmp4zBig Buck Bunny.mp4-   zBhttps://drive.google.com/thumbnail?id=0ByeS4oOUV-49Zzh4R1J6R09zazQ)idexttitleduration	thumbnail)urlmd5	info_dictz@https://drive.google.com/uc?id=1IP0o8dHcQrIHGgVyp0Ofvx2cGfLzyO1xZ 322db8d63dd19788c04050a4bba67073Z!1IP0o8dHcQrIHGgVyp0Ofvx2cGfLzyO1xZmp3z7My Buddy - Henry Burr - Gus Kahn - Walter Donaldson.mp3   zGhttps://drive.google.com/thumbnail?id=1IP0o8dHcQrIHGgVyp0Ofvx2cGfLzyO1xzAhttps://drive.google.com/file/d/0B-vUyvmDLdWDcEt4WjBqcmI2XzQ/viewT)r   Zonly_matchingzHhttps://drive.google.com/file/d/1ENcQ_jeCuj7y19s66_Ou9dRP4GKGsodiDQ/editz=https://drive.google.com/open?id=0B2fjwgkl1A_CX083Tkowdmt6d28z;https://drive.google.com/uc?id=0B2fjwgkl1A_CX083Tkowdmt6d28zMhttps://drive.usercontent.google.com/download?id=0ByeS4oOUV-49Zzh4R1J6R09zazQc                 C   s$   i | ]\}}| d r||d  qS )r   )get).0kv r    @/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/googledrive.py
<dictcomp>J   s     
  zGoogleDriveIE.<dictcomp>Z50Zm4az"https://drive.google.com/timedtexttracktarget)	subtitlesautomatic_captionsNc                 c   s&   t d|}|r"d|dV  d S )Nz<iframe[^>]+src="https?://(?:video\.google\.com/get_player\?.*?docid=|(?:docs|drive)\.google\.com/file/d/)(?P<id>[a-zA-Z0-9_-]{28,})z"https://drive.google.com/file/d/{}r   )researchformatgroup)clsr   webpagemobjr    r    r!   _extract_embed_urlsU   s    z!GoogleDriveIE._extract_embed_urlsc                 C   s|   | j r
d S | j| j|||||ddddddddd| _ | j rx| j dD ].}|jd	rH|jd
sH| j|jd	  qHd S )Nlist1)r   vidhlr   typeZtlangsZfmtsZvssidszDownloading subtitles XMLz Unable to download subtitles XMLF)querynoteerrnotefatalr)   Zfmt_codedefault)_captions_xmlZ_download_xml_BASE_URL_CAPTIONSfindallattribr   _caption_formats_extappend)selfvideo_idsubtitles_idr2   fr    r    r!   _download_subtitles_xml]   s,     	 z%GoogleDriveIE._download_subtitles_xmlc              
   C   s   |r|sd S i }| j | j| D ]|}|jd}|s8q"g }| jD ]R}	|||	|d krX|n|dddd}
|d k	r||
d|i |t| j	|
|	d qB|||< q"|S )N	lang_coder#    )r1   r   fmtlangr3   namekindZtlang)r   r   )
r9   r;   _CAPTIONS_ENTRY_TAGr<   r   r=   updater>   r   r:   )r?   r@   rA   Zcaption_typeorigin_lang_codeZcaptionsZcaption_entryZcaption_lang_codeZcaption_format_dataZcaption_formatr4   r    r    r!   _get_captions_by_typeq   s8    




z#GoogleDriveIE._get_captions_by_typec                 C   s2   |r|sd S |  ||| | js$d S | ||dS )Nr%   )rC   r9   rM   )r?   r@   rA   r2   r    r    r!   _get_subtitles   s    zGoogleDriveIE._get_subtitlesc                 C   s`   |r|sd S |  ||| | js$d S | jd}|d kr<d S |jd}|sPd S | ||d|S )Nr#   rD   r&   )rC   r9   findr<   r   rM   )r?   r@   rA   r2   r#   rL   r    r    r!   _get_automatic_captions   s"       z%GoogleDriveIE._get_automatic_captionsc                    s   |tjjdddidfdd}|d}|dg  |d	pRd
d}|dpdd
d}|rX|rXi }|D ]:}td|}|rt|	dt|	df||	d< q|D ]}	|	d}
t
|
dk rq|
d d \}}j|}|sd| t   t|||d}||}|rL||d |d d  | qtdddd}d<fdd	}||d}|r< fdd }|jd!r|| nj||d"d#d$d%}|r<ttd&|pd
d'}|r||d(d)d*}|r<|jd!r<|| n"td+|p8td,|p8d-  sj|rjr^j|d.d/ nt|d.d/|d0}d }|d1}|r| d2d3d4 }jjd5d6d7d8 d9 t|d: || ||d;S )=Nz'https://drive.google.com/get_video_infozDownloading video webpageZdocid)r4   c                    s   t  fddS )Nc                    s   |   d S )Nr   r    )xkeyr    r!   <lambda>       z@GoogleDriveIE._real_extract.<locals>.get_value.<locals>.<lambda>)r   rR   )
video_inforR   r!   	get_value   s    z.GoogleDriveIE._real_extract.<locals>.get_valuereasonr   fmt_stream_maprE   ,fmt_listz5^(?P<format_id>\d+)/(?P<width>\d+)[xX](?P<height>\d+)widthheight	format_id|r   zUnknown format )r   r^   r   r   r   )r\   r]   z-https://drive.usercontent.google.com/downloaddownloadt)r   exportZconfirmc                    s&    j | d| dd| dd|dS )NzRequesting z filezUnable to request F)r5   r6   r7   data)Z_request_webpage)
source_urlrI   rc   )r?   r@   r    r!   request_source_file   s      

  z8GoogleDriveIE._real_extract.<locals>.request_source_filesourcec                    sB   sj d| jddd d | jtd ddd d S )	Nz\bfilename="([^"]+)"Content-Dispositionr   )r8   r   rf   r   )r   r   r^   Zquality)_search_regexheadersr   r>   r   r   lower)urlh)formatsr?   r   r    r!   add_source_format   s     
 z6GoogleDriveIE._real_extract.<locals>.add_source_formatrg   zDownloading confirmation pagezUnable to confirm downloadF)r5   r6   r7   zdownload-formactionzconfirmed sourcerU   )rc   zuc-error-subcaptionzuc-error-captionz#unable to extract confirmation codeT)expectedr2   ttsurlZunicode_escape=z.google.com/ZNID)domainpathrH   z&https://drive.google.com/thumbnail?id=Zlength_seconds)r   r   r   r   rl   r%   r&   )N)!	_match_idurllibparseparse_qs_download_webpagesplitr'   r(   intr*   len_FORMATS_EXTr   Zreport_warningr   r   rK   r>   r   ri   Z_webpage_read_contentr	   r   r
   Zraise_no_formatsr   encodedecode	cookiejarclearr   Zextract_subtitlesZextract_automatic_captions)r?   r   rW   rX   rY   r[   ZresolutionsrF   r-   Z
fmt_streamZfmt_stream_splitr^   Z
format_urlr   rB   
resolutionrd   re   rk   rm   Zconfirmation_webpageZconfirmed_source_urlr2   rA   rp   r    )rl   r?   r   r@   rV   r!   _real_extract   s    

    



    

  zGoogleDriveIE._real_extract)N)__name__
__module____qualname__
_VALID_URL_TESTSr   _formatsitemsr~   r:   rJ   r=   r9   classmethodr.   rC   rM   rN   rP   r   r    r    r    r!   r      sj   ) 
 
r   c                   @   sZ   e Zd ZdZdZddddddgZd	Zd
Zde de dZdd Z	dd Z
dd ZdS )GoogleDriveFolderIEzGoogleDrive:FolderzEhttps?://(?:docs|drive)\.google\.com/drive/folders/(?P<id>[\w-]{28,})zHhttps://drive.google.com/drive/folders/1dQ4sx0-__Nvg65rxTSgQrl7VyW_FZ9QIz!1dQ4sx0-__Nvg65rxTSgQrl7VyW_FZ9QIZForrest)r   r      )r   r   Zplaylist_countz=====vc17a3rwnndj=====a  /drive/v2beta/files?openDrive=true&reason=102&syncType=0&errorRecovery=false&q=trashed%20%3D%20false%20and%20'{folder_id}'%20in%20parents&fields=kind%2CnextPageToken%2Citems(kind%2CmodifiedDate%2CmodifiedByMeDate%2ClastViewedByMeDate%2CfileSize%2Cowners(kind%2CpermissionId%2Cid)%2ClastModifyingUser(kind%2CpermissionId%2Cid)%2ChasThumbnail%2CthumbnailVersion%2Ctitle%2Cid%2CresourceKey%2Cshared%2CsharedWithMeDate%2CuserPermission(role)%2CexplicitlyTrashed%2CmimeType%2CquotaBytesUsed%2Ccopyable%2CfileExtension%2CsharingUser(kind%2CpermissionId%2Cid)%2Cspaces%2Cversion%2CteamDriveId%2ChasAugmentedPermissions%2CcreatedDate%2CtrashingUser(kind%2CpermissionId%2Cid)%2CtrashedDate%2Cparents(id)%2CshortcutDetails(targetId%2CtargetMimeType%2CtargetLookupStatus)%2Ccapabilities(canCopy%2CcanDownload%2CcanEdit%2CcanAddChildren%2CcanDelete%2CcanRemoveChildren%2CcanShare%2CcanTrash%2CcanRename%2CcanReadTeamDrive%2CcanMoveTeamDriveItem)%2Clabels(starred%2Ctrashed%2Crestricted%2Cviewed))%2CincompleteSearch&appDataFilter=NO_APP_DATA&spaces=drive&pageToken={page_token}&maxResults=50&supportsTeamDrives=true&includeItemsFromAllDrives=true&corpora=default&orderBy=folder%2Ctitle_natural%20asc&retryCount=0&key={key} HTTP/1.1z--zM
content-type: application/http
content-transfer-encoding: binary

GET %s

--
c                 K   sN   | j d|f| dddd| j d|dd|}| jd	|d
|f|pLi S )Nz.https://clients6.google.com/batch/drive/v2betaztext/plain;charset=UTF-8;zhttps://drive.google.com)zContent-TypeZOriginzmultipart/mixed; boundary="")z$ctrS   )rc   ri   r4   rE   zapi response)rz   r   	_BOUNDARYZ_search_json)r?   	folder_idrS   rc   kwargsresponser    r    r!   	_call_api8  s    	
zGoogleDriveFolderIE._call_apic                 c   sP   d}|d k	rL| j j|||d}| ||| j| }|d E d H  |d}qd S )NrE   )r   
page_tokenrS   r   ZnextPageToken)_REQUESTr)   r   _DATAr   )r?   r   rS   r   requestpager    r    r!   _get_folder_itemsE  s    z%GoogleDriveFolderIE._get_folder_itemsc                 C   sj   |  |}| ||}| d|d}| j||| jd| d dd}| j| ||||dtdd	 d
S )Nz
"(\w{39})"rS   z/drive/v2beta/files/z	 HTTP/1.1F)r7   r   c                 S   s   d| d  S )Nz https://drive.google.com/file/d/r   r    )itemr    r    r!   rT   W  rU   z3GoogleDriveFolderIE._real_extract.<locals>.<lambda>)Ziegetter)	rv   rz   rh   r   r   Zplaylist_from_matchesr   r   r   )r?   r   r   r,   rS   Zfolder_infor    r    r!   r   M  s    
 
   z!GoogleDriveFolderIE._real_extractN)r   r   r   ZIE_NAMEr   r   r   r   r   r   r   r   r    r    r    r!   r   "  s   	r   )r'   urllib.parserw   commonr   Zyoutuber   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r    r    r    r!   <module>   s   0  