U
    g=                     @   s  d 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 dZ	dZ
ddd	d
ddgZddddiddidddddddiddidddddddiddidddddd d!iddidddd"dd dd#iddidddd$dddiddidddd%d&diddidddd'd(ddidd)idddd*d+ddidd,idddd-d.diddidddd/d0ddidd1idddd2d3ddidd4idddd5d6diddidddd7d8diddiddd9Zd:Zeej d; Zejed<ZG d=d> d>ZdS )?zThis module is designed to interact with the innertube API.

This module is NOT intended to be used directly by end users, as each of the
interfaces returns raw results. These should instead be parsed to extract
the useful information for the end user.
    N)parse)requestzH861556708454-d6dlm3lh05idd8npek18k6be8ba3oc68.apps.googleusercontent.comZSboVhoG9s0rNafixCSGGKXATZ'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8Z'AIzaSyCtkvNIR1HCEwzsqK6JuE6KqpyjusIRI30z'AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39wZ'AIzaSyC8UYZpvA2eknNex0Pjid0_eTLJoDu6losZ'AIzaSyCjc_pVEDi4qsv5MtC2dMXzpIaDoRFLsxwZ'AIzaSyDHQ9ipnphqTzDqZsbtd8_Ru4_kiKVQe2kclientWEBz2.20200720.00.02)
clientNameclientVersionz
User-AgentzMozilla/5.0)contextheaderapi_keyANDROIDz17.31.35   )r   r   androidSdkVersionzcom.google.android.youtube/IOSz17.33.2z
iPhone14,3)r   r   ZdeviceModelzcom.google.ios.youtube/ZWEB_EMBEDDED_PLAYERz2.20210721.00.00ZEMBED)r   r   clientScreenZANDROID_EMBEDDED_PLAYER)r   r   r   r   ZIOS_MESSAGES_EXTENSIONZ	WEB_REMIXz1.20220727.01.00ANDROID_MUSICz5.16.51z&com.google.android.apps.youtube.music/	IOS_MUSICz5.21zcom.google.ios.youtubemusic/WEB_CREATORz1.20220726.00.00ANDROID_CREATORz	22.30.100z(com.google.android.apps.youtube.creator/IOS_CREATORz	22.33.101zcom.google.ios.ytcreator/MWEBz2.20220801.00.00ZTVHTML5_SIMPLY_EMBEDDED_PLAYERz2.0)r   r   r   Z	WEB_EMBEDZANDROID_EMBEDZ	IOS_EMBEDZ	WEB_MUSICr   r   r   r   r   r   ZTV_EMBEDi  Z	__cache__ztokens.jsonc                   @   s   e Zd ZdZd&ddZdd Zd'd	d
Zdd Zedd Z	edd Z
edd Zdd Zdd Zdd Zdd Zdd Zdd Zd(d d!Zd"d# Zd$d% ZdS ))	InnerTubez.Object for interacting with the innertube API.r   FTc              	   C   s   t | d | _t | d | _t | d | _d| _d| _|| _|| _d| _| jr| jrt	j
trtt6}t|}|d | _|d | _|d | _|   W 5 Q R X dS )ag  Initialize an InnerTube object.

        :param str client:
            Client to use for the object.
            Default to web because it returns the most playback types.
        :param bool use_oauth:
            Whether or not to authenticate to YouTube.
        :param bool allow_cache:
            Allows caching of oauth tokens on the machine.
        r   r	   r
   Naccess_tokenrefresh_tokenexpires)_default_clientsr   r	   r
   r   r   	use_oauthallow_cacher   ospathexists_token_fileopenjsonloadrefresh_bearer_token)selfr   r   r   fdata r(   4/tmp/pip-unpacked-wheel-1a9f0fi6/pytube/innertube.py__init__   s     




zInnerTube.__init__c              	   C   sX   | j s
dS | j| j| jd}tjts2tt t	t
d}t|| W 5 Q R X dS )z Cache tokens to file if allowed.N)r   r   r   w)r   r   r   r   r   r   r   
_cache_dirmkdirr!   r    r"   dump)r%   r'   r&   r(   r(   r)   cache_tokens   s    
zInnerTube.cache_tokensc                 C   s   | j s
dS | jt kr |s dS tt d }ttd| jd}tjddddi|d	}t	
| }|d
 | _||d  | _|   dS )zxRefreshes the OAuth token if necessary.

        :param bool force:
            Force-refresh the bearer token.
        Nr   r   )	client_idclient_secret
grant_typer   #https://oauth2.googleapis.com/tokenPOSTContent-Typeapplication/jsonheadersr'   r   
expires_in)r   r   timeint
_client_id_client_secretr   r   _execute_requestr"   loadsreadr   r/   )r%   force
start_timer'   responseresponse_datar(   r(   r)   r$     s,     
zInnerTube.refresh_bearer_tokenc                 C   s   t t d }tdd}tjddddi|d}t| }|d	 }|d
 }td| d|  t	d tt
|d dd}tjddddi|d}t| }|d | _|d | _||d  | _|   dS )zFetch an OAuth token.r   z'https://www.googleapis.com/auth/youtube)r0   Zscopez)https://oauth2.googleapis.com/device/coder4   r5   r6   r7   verification_url	user_codezPlease open z and input code z.Press enter when you have completed this step.device_codez,urn:ietf:params:oauth:grant-type:device_code)r0   r1   rG   r2   r3   r   r   r9   N)r;   r:   r<   r   r>   r"   r?   r@   printinputr=   r   r   r   r/   )r%   rB   r'   rC   rD   rE   rF   r(   r(   r)   fetch_bearer_token1  sF      

zInnerTube.fetch_bearer_tokenc                 C   s   dS )z3Return the base url endpoint for the innertube API.z#https://www.youtube.com/youtubei/v1r(   r%   r(   r(   r)   base_url\  s    zInnerTube.base_urlc                 C   s
   d| j iS )z;Return the base json data to transmit to the innertube API.r   )r   rK   r(   r(   r)   	base_dataa  s     zInnerTube.base_datac                 C   s   | j dddS )zBReturn the base query parameters to transmit to the innertube API.T)keyZcontentCheckOkZracyCheckOk)r
   rK   r(   r(   r)   base_paramsh  s    zInnerTube.base_paramsc                 C   s   | j r|d= | dt| }ddi}| j rf| jrN|   d| j |d< n|   d| j |d< || j tj	|d||d}t
| S )	zOMake a request to a given endpoint with the provided query parameters and data.rN   ?r5   r6   zBearer Authorizationr4   r7   )r   r   	urlencoder   r$   rJ   updater	   r   r>   r"   r?   r@   )r%   endpointqueryr'   Zendpoint_urlr8   rC   r(   r(   r)   	_call_apiq  s(     zInnerTube._call_apic                 C   s   dS )z]Make a request to the browse endpoint.

        TODO: Figure out how we can use this
        Nr(   rK   r(   r(   r)   browse  s    zInnerTube.browsec                 C   s   dS )z]Make a request to the config endpoint.

        TODO: Figure out how we can use this
        Nr(   rK   r(   r(   r)   config  s    zInnerTube.configc                 C   s   dS )z\Make a request to the guide endpoint.

        TODO: Figure out how we can use this
        Nr(   rK   r(   r(   r)   guide  s    zInnerTube.guidec                 C   s   dS )z[Make a request to the next endpoint.

        TODO: Figure out how we can use this
        Nr(   rK   r(   r(   r)   next  s    zInnerTube.nextc                 C   s0   | j  d}d|i}|| j | ||| jS )zMake a request to the player endpoint.

        :param str video_id:
            The video id to get player info for.
        :rtype: dict
        :returns:
            Raw player info results.
        z/playervideoIdrL   rS   rO   rV   rM   )r%   video_idrT   rU   r(   r(   r)   player  s    	 zInnerTube.playerNc                 C   sJ   | j  d}d|i}|| j i }|r0||d< || j | |||S )zMake a request to the search endpoint.

        :param str search_query:
            The query to search.
        :rtype: dict
        :returns:
            Raw search query results.
        z/searchrU   continuation)rL   rS   rO   rM   rV   )r%   Zsearch_queryr_   rT   rU   r'   r(   r(   r)   search  s    	 zInnerTube.searchc                 C   sD   | j  d}ddd| iidd}|| j | || j|}|S )a  Make a request to the age_verify endpoint.

        Notable examples of the types of video this verification step is for:
        * https://www.youtube.com/watch?v=QLdAhwSBZ3w
        * https://www.youtube.com/watch?v=hc0ZDaAZQT0

        :param str video_id:
            The video id to get player info for.
        :rtype: dict
        :returns:
            Returns information that includes a URL for bypassing certain restrictions.
        z/verify_ageZurlEndpointurlz	/watch?v=T)ZnextEndpointZsetControvercy)rL   rS   rM   rV   rO   )r%   r]   rT   r'   resultr(   r(   r)   
verify_age  s     zInnerTube.verify_agec                 C   s4   | j  d}d|i}|| j | ||| j}|S )zMake a request to the get_transcript endpoint.

        This is likely related to captioning for videos, but is currently untested.
        z/get_transcriptr[   r\   )r%   r]   rT   rU   rb   r(   r(   r)   get_transcript  s     zInnerTube.get_transcript)r   FT)F)N)__name__
__module____qualname____doc__r*   r/   r$   rJ   propertyrL   rM   rO   rV   rW   rX   rY   rZ   r^   r`   rc   rd   r(   r(   r(   r)   r      s(   
!
"+


				
r   )rh   r"   r   pathlibr:   urllibr   Zpytuber   r<   r=   Z	_api_keysr   Z_token_timeoutPath__file__parentresolver,   r   joinr    r   r(   r(   r(   r)   <module>   sX      	            :