a
    h{=                     @   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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parse_qs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i 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!   Q/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/extractor/googledrive.py
<dictcomp>K       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_urlsV   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_idr4   fr!   r!   r"   _download_subtitles_xml^   s(    	z%GoogleDriveIE._download_subtitles_xmlc              
   C   s   |r|sd S i }| j | j| D ]}|jd}|jdp@|}	|rJ|	s^| d|j  q"g }
| jD ]R}||||d u r~|n|d|	dd}|d ur|d|i |
t	| j
||d qh|
||< q"|S )	N	lang_codenamezOMissing necessary caption metadata. Need lang_code and name attributes. Found: r%    )r3   r    fmtlangr5   rG   kindZtlang)r   r   )r;   r=   _CAPTIONS_ENTRY_TAGr>   r   report_warningr?   updater@   r   r<   )rA   rB   rC   Zcaption_typeorigin_lang_codeorigin_lang_nameZcaptionsZcaption_entryZcaption_lang_codeZcaption_nameZcaption_format_dataZcaption_formatr6   r!   r!   r"   _get_captions_by_typer   s@    




z#GoogleDriveIE._get_captions_by_typec                 C   s2   |r|sd S |  ||| | js$d S | ||dS )Nr'   )rE   r;   rQ   )rA   rB   rC   r4   r!   r!   r"   _get_subtitles   s    zGoogleDriveIE._get_subtitlesc                 C   s   |r|sd S |  ||| | js$d S tdd | jdD d }|d u rLd S |jd}|jd}|rl|spd S | ||d||S )Nc                 s   s"   | ]}|j d dkr|V  qdS )ZcantrantrueN)r>   r   )r   tr!   r!   r"   	<genexpr>   r$   z8GoogleDriveIE._get_automatic_captions.<locals>.<genexpr>r%   rF   rG   r(   )rE   r;   nextr=   r>   r   rQ   )rA   rB   rC   r4   r%   rO   rP   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}|rt|d2d gd3 }jjd4d5d6d7 d8 t|d9 ||||d:S )<Nz'https://drive.google.com/get_video_infozDownloading video webpageZdocid)r6   c                    s   t  fddS )Nc                    s   |   d S )Nr   r!   )xkeyr!   r"   <lambda>   r$   z@GoogleDriveIE._real_extract.<locals>.get_value.<locals>.<lambda>)r   rY   )
video_inforY   r"   	get_value   s    z.GoogleDriveIE._real_extract.<locals>.get_valuereasonr   fmt_stream_maprH   ,fmt_listz5^(?P<format_id>\d+)/(?P<width>\d+)[xX](?P<height>\d+)widthheight	format_id|r   zUnknown format )r   rd   r   r   r   )rb   rc   z-https://drive.usercontent.google.com/downloaddownloadrT   )r   exportZconfirmc                    s&    j | d| dd| dd|dS )NzRequesting z filezUnable to request F)r7   r8   r9   data)Z_request_webpage)
source_urlrK   rh   )rA   rB   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   )r:   r   rk   r   )r   r   rd   Zquality)_search_regexheadersr   r@   r   r   lower)urlh)formatsrA   r   r!   r"   add_source_format   s    z6GoogleDriveIE._real_extract.<locals>.add_source_formatrl   zDownloading confirmation pagezUnable to confirm downloadF)r7   r8   r9   zdownload-formactionzconfirmed sourcer$   )rh   zuc-error-subcaptionzuc-error-captionz#unable to extract confirmation codeT)expectedr4   ttsurlr3   z.google.com/ZNID)domainpathrG   z&https://drive.google.com/thumbnail?id=Zlength_seconds)r   r   r   r   rq   r'   r(   )N)	_match_idurllibparser   _download_webpagesplitr)   r*   intr,   len_FORMATS_EXTr   rM   r   r   rN   r@   r   rn   Z_webpage_read_contentr	   r   r
   Zraise_no_formatsr   	cookiejarclearr   Zextract_subtitlesZextract_automatic_captions)rA   r   r]   r^   r_   ra   ZresolutionsrI   r/   Z
fmt_streamZfmt_stream_splitrd   Z
format_urlr   rD   
resolutionri   rj   rp   rr   Zconfirmation_webpageZconfirmed_source_urlr4   rC   ru   r!   )rq   rA   r   rB   r\   r"   _real_extract   s    








zGoogleDriveIE._real_extract)NN)__name__
__module____qualname__
_VALID_URL_TESTSr   _formatsitemsr   r<   rL   r?   r;   classmethodr0   rE   rQ   rR   rW   r   r!   r!   r!   r"   r      sl   (
 
#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   sR   | j d|f| dddd| j d|dd|}| jd	|d
|fi |pPi 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$ctrZ   )rh   rn   r6   rH   zapi response)r}   encode	_BOUNDARYZ_search_json)rA   	folder_idrZ   rh   kwargsresponser!   r!   r"   	_call_api<  s    	
zGoogleDriveFolderIE._call_apic                 c   sP   d}|d urL| j j|||d}| ||| j| }|d E d H  |d}qd S )NrH   )r   
page_tokenrZ   r   ZnextPageToken)_REQUESTr+   r   _DATAr   )rA   r   rZ   r   requestpager!   r!   r"   _get_folder_itemsI  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})"rZ   z/drive/v2beta/files/z	 HTTP/1.1F)r9   r   c                 S   s   d| d  S )Nz https://drive.google.com/file/d/r   r!   )itemr!   r!   r"   r[   [  r$   z3GoogleDriveFolderIE._real_extract.<locals>.<lambda>)Ziegetter)	rz   r}   rm   r   r   Zplaylist_from_matchesr   r   r   )rA   r   r   r.   rZ   Zfolder_infor!   r!   r"   r   Q  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.parser{   commonr   Zyoutuber   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   s   4  