
    g=                     d   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
g d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+d,ddidd-idddd.d/ddidd0idddd1d2diddidddd3d4diddiddd5Zd6Z ej                  e      j                   j#                         d7z  Zej&                  j)                  ed8      Z G d9 d:      Zy);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.comSboVhoG9s0rNafixCSGGKXAT)'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8'AIzaSyCtkvNIR1HCEwzsqK6JuE6KqpyjusIRI30z'AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w'AIzaSyC8UYZpvA2eknNex0Pjid0_eTLJoDu6los'AIzaSyCjc_pVEDi4qsv5MtC2dMXzpIaDoRFLsxw'AIzaSyDHQ9ipnphqTzDqZsbtd8_Ru4_kiKVQe2kclientWEBz2.20200720.00.02)
clientNameclientVersionz
User-AgentzMozilla/5.0r   )contextheaderapi_keyANDROIDz17.31.35   )r   r   androidSdkVersionzcom.google.android.youtube/IOSz17.33.2z
iPhone14,3)r   r   deviceModelzcom.google.ios.youtube/WEB_EMBEDDED_PLAYERz2.20210721.00.00EMBED)r   r   clientScreenANDROID_EMBEDDED_PLAYER)r   r   r   r   IOS_MESSAGES_EXTENSION	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.00TVHTML5_SIMPLY_EMBEDDED_PLAYERz2.0)r   r   r   	WEB_EMBEDANDROID_EMBED	IOS_EMBED	WEB_MUSICr   r   r   r    r!   r"   TV_EMBEDi  	__cache__ztokens.jsonc                       e Zd ZdZddZd ZddZd Zed        Z	ed        Z
ed        Zd	 Zd
 Zd Zd Zd Zd ZddZd Zd Zy)	InnerTubez.Object for interacting with the innertube API.c                    t         |   d   | _        t         |   d   | _        t         |   d   | _        d| _        d| _        || _        || _        d| _        | j                  r| j                  rt        j                  j                  t              r\t        t              5 }t        j                  |      }|d   | _        |d   | _        |d   | _        | j!                          ddd       yyyy# 1 sw Y   yxY w)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   r1   r2   fdatas         Y/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-packages/pytube/innertube.py__init__zInnerTube.__init__   s     (/	:&v.x8'/	: !"&  >>d..ww~~k*+& 0!99Q<D(,^(<D%)-o)>D&#'	?DL--/0 0 + />0 0s   !AC11C:c                 T   | j                   sy| j                  | j                  | j                  d}t        j
                  j                  t              st	        j                  t               t        t        d      5 }t        j                  ||       ddd       y# 1 sw Y   yxY w)z Cache tokens to file if allowed.N)r-   r.   r/   w)r2   r-   r.   r/   r3   r4   r5   
_cache_dirmkdirr7   r6   r8   dump)r;   r=   r<   s      r>   cache_tokenszInnerTube.cache_tokens   s}     !--!//||

 ww~~j)HHZ +s# 	qIIdA	 	 	s   >BB'c                    | j                   sy| j                  t        j                         kD  r|syt        t        j                         dz
        }t        t
        d| j                  d}t        j                  ddddi|	      }t        j                  |j                               }|d
   | _        ||d   z   | _        | j                          y)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)r1   r/   timeint
_client_id_client_secretr.   r   _execute_requestr8   loadsreadr-   rE   )r;   force
start_timer=   responseresponse_datas         r>   r:   zInnerTube.refresh_bearer_token  s     ~~<<$))+%e r)*
#+)!//	
 ++1 2 
 

8==?3).9!M,$??    c                     t        t        j                         dz
        }t        dd}t        j                  ddddi|      }t        j                  |j                               }|d	   }|d
   }t        d| d|        t        d       t        t        |d   dd}t        j                  ddddi|      }t        j                  |j                               }|d   | _        |d   | _        ||d   z   | _        | j                          y)zFetch an OAuth token.r   z'https://www.googleapis.com/auth/youtube)rG   scopez)https://oauth2.googleapis.com/device/coderK   rL   rM   rN   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)rG   rH   ra   rI   rJ   r-   r.   rP   N)rR   rQ   rS   r   rU   r8   rV   rW   printinputrT   r-   r.   r/   rE   )r;   rY   r=   rZ   r[   r_   r`   s          r>   fetch_bearer_tokenzInnerTube.fetch_bearer_token1  s*    r)*
#>
 ++7 2 
 

8==?3();<!+.	-..>ykJK>? $+(7H	
 ++1 2 
 

8==?3).9*?;!M,$??r\   c                      y)z3Return the base url endpoint for the innertube API.z#https://www.youtube.com/youtubei/v1 r;   s    r>   base_urlzInnerTube.base_url\  s     5r\   c                     d| j                   iS )z;Return the base json data to transmit to the innertube API.r   )r   rg   s    r>   	base_datazInnerTube.base_dataa  s     t||
 	
r\   c                 "    | j                   dddS )zBReturn the base query parameters to transmit to the innertube API.T)keycontentCheckOkracyCheckOk)r   rg   s    r>   base_paramszInnerTube.base_paramsh  s     <<"
 	
r\   c                    | j                   r|d= | dt        j                  |       }ddi}| j                   rQ| j                  r#| j	                          d| j                   |d<   n"| j                          d| j                   |d<   |j                  | j                         t        j                  |d||      }t        j                  |j                               S )	zOMake a request to a given endpoint with the provided query parameters and data.rl   ?rL   rM   zBearer AuthorizationrK   rN   )r1   r   	urlencoder-   r:   rd   updater   r   rU   r8   rV   rW   )r;   endpointqueryr=   endpoint_urlrO   rZ   s          r>   	_call_apizInnerTube._call_apiq  s     >>e"1U__U%;$<=.
 >>  ))+-4T5F5F4G+H('')-4T5F5F4G+H(t{{#++	
 zz(--/**r\   c                      y)z]Make a request to the browse endpoint.

        TODO: Figure out how we can use this
        Nrf   rg   s    r>   browsezInnerTube.browse       	r\   c                      y)z]Make a request to the config endpoint.

        TODO: Figure out how we can use this
        Nrf   rg   s    r>   configzInnerTube.config  r{   r\   c                      y)z\Make a request to the guide endpoint.

        TODO: Figure out how we can use this
        Nrf   rg   s    r>   guidezInnerTube.guide  r{   r\   c                      y)z[Make a request to the next endpoint.

        TODO: Figure out how we can use this
        Nrf   rg   s    r>   nextzInnerTube.next  r{   r\   c                     | j                    d}d|i}|j                  | j                         | 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rh   rt   ro   rx   rj   )r;   video_idru   rv   s       r>   playerzInnerTube.player  sK     mm_G,x
 	T%%&~~ht~~>>r\   Nc                     | j                    d}d|i}|j                  | j                         i }|r||d<   |j                  | j                         | 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/searchrv   continuation)rh   rt   ro   rj   rx   )r;   search_queryr   ru   rv   r=   s         r>   searchzInnerTube.search  si     mm_G,\
 	T%%&#/D DNN#~~ht44r\   c                     | j                    d}ddd| iidd}|j                  | j                         | 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_ageurlEndpointurlz	/watch?v=T)nextEndpointsetControvercy)rh   rt   rj   rx   ro   )r;   r   ru   r=   results        r>   
verify_agezInnerTube.verify_age  sj     mm_K0 Yxj1 
 #
 	DNN#$*:*:DAr\   c                     | j                    d}d|i}|j                  | j                         | 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   ru   rv   r   s        r>   get_transcriptzInnerTube.get_transcript  sO    
 mm_O4x
 	T%%&%@r\   )r   FT)F)N)__name__
__module____qualname____doc__r?   rE   r:   rd   propertyrh   rj   ro   rx   rz   r}   r   r   r   r   r   r   rf   r\   r>   r+   r+      s    80B D)V 5 5 
 
 
 
+:? 5(4r\   r+   )r   r8   r3   pathlibrQ   urllibr   pytuber   rS   rT   	_api_keysr0   _token_timeoutPath__file__parentresolverB   r4   joinr6   r+   rf   r\   r>   <module>r      s
    	     X
+	 #!3
 -
 = '!+%'
 7
 = #!*+
 3
 =  3!3 '
 -
 = 7!+ '%'	
 7
 =  6!*+
 3
 =  )!3
 -
 = -!*%'
 B
 = )!'+
 8
 =  +!3
 -
 = /!,%'
 D
 = +!,+
 5
 =  $!3
 -
 = >!&
 -
 =Yx r W\\(#**224{B
ggll:}5^ ^r\   