
    Ği*D                         d dl Z d dlZd dlZd dl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mZ ddlmZmZ  G d de          Z G d	 d
e          Z G d de          Z G d d          ZdS )    N   )InfoExtractor   )ExtractorErrorint_or_none)	get_firsttraverse_objc                       e Zd ZdZdZdZdZddddd	d
ddddd	ddiddddddddddidddddddddddd d!	ddiddgZd"Zd# Z	d$ Z
d% Zd"S )&GoPlayIEzplay.tvzPLAY (formerly goplay.be)zAhttps?://(www\.)?play\.tv/video/([^/?#]+/[^/?#]+/|)(?P<id>[^/#]+)goplayzhttps://www.play.tv/video/de-slimste-mens-ter-wereld/de-slimste-mens-ter-wereld-s22/de-slimste-mens-ter-wereld-s22-aflevering-1z$2baa4560-87a0-421b-bffc-359914e3c387mp4z/De Slimste Mens ter Wereld - S22 - Aflevering 1zJre:In aflevering 1 nemen Daan Alferink, Tess Elst en Xander De Rycke .{66}zDe Slimste Mens ter WereldzWordt aangekondigd   r   z	Season 22)	idexttitledescriptionseriesepisodeseason_numberepisode_numberseasonskip_downloadTz1This video is only available for registered users)url	info_dictparamsskipzhttps://www.play.tv/video/1917z$40cac41d-8d29-4ef5-aa11-75047b9f09071917zHre:Op het hoogtepunt van de Eerste Wereldoorlog krijgen twee jonge .{94})r   r   r   r   zLhttps://www.play.tv/video/de-mol/de-mol-s11/de-mol-s11-aflevering-1#autoplayz$ecb79672-92b9-4cd9-a0d7-e2f0250681eezDe Mol - S11 - Aflevering 1zNre:Tien kandidaten beginnen aan hun verovering van Amerika en ontmoeten .{102}z	Episode 1zDe Mol   z	Season 11)	r   r   r   r   r   r   r   r   r   Nc                     |                                   t          | dd          }|                    ||          \  | _        }d S )Nzeu-west-1_dViSsKM5Y6s1h851s8uplco5h6mqh1jac8m)iepool_id	client_id)usernamepassword)report_loginAwsIdpauthenticate	_id_token)selfr$   r%   aws_s        \C:\Users\betacode\Desktop\descargarYoutube\venv\Lib\site-packages\yt_dlp/extractor/goplay.py_perform_loginzGoPlayIE._perform_loginB   sM    &;Gcddd,,h,RR    c                 @    | j         s|                     d          d S )Nr%   )method)r)   raise_login_requiredr*   s    r-   _real_initializezGoPlayIE._real_initializeG   s-    ~ 	?++:+>>>	? 	?r/   c                    |                                }|                     |          }|                     ||          }t          |fd          }|d         t	          |dt
          hfdt
          j        hfd          }t	          |d          dk    rt	          |dd	dt          hf          D ]}t	          |d
fdt          f          }|s t	          |dt          hf          }	|
                    t	          |dt
          hf          t	          |dt          hf          |	|                     d|	 d|                    d          dd           d            |                     d dd| j         i|                                           }
d|
v r)|                     |
d         d         dd          \  }}nd|
vrt#          d          |
d         d         }|
d         d          }|                     d!| d"| d#d$d%d&i'          }|                     |d(                   }d) |D             }|                     |          \  }}|
                    ||d*           |S )+Nc                 h    | dv o-|d         t           j                                      j        k    S )N)videometapath)urllibparseurlparser9   )kvr   s     r-   <lambda>z(GoPlayIE._real_extract.<locals>.<lambda>Q   s/    //`AfIAVAVWZA[A[A`4` r/   uuidr   r   )r   r   )programsubtypemovie.	playlistsvideosc                     |d         k    S )NvideoId )r,   r>   video_ids     r-   r?   z(GoPlayIE._real_extract.<locals>.<lambda>[   s    QRS\Q]aiQi r/   r   episodeTitleepisodeNumberz
^(.+)? - Sz - r   )default)r   r   r   r   z,https://api.play.tv/web/v1/videos/long-form/AuthorizationzBearer )headersmanifestUrlshlsr   HLS)r   m3u8_idssaizexpecting Google SSAI streamcontentSourceIDvideoIDz-https://dai.google.com/ondemand/dash/content/z/vid/z/streamss   {"api-key":"null"}zcontent-typezapplication/json)datarN   stream_manifestc                 &    g | ]}d |d         v|S )z-ad-r   rH   ).0ps     r-   
<listcomp>z*GoPlayIE._real_extract.<locals>.<listcomp>   s&    CCCQV1T7-B-Bq-B-B-Br/   )r   formats	subtitles)	_match_id_download_webpage_search_nextjs_v13_datar   r	   strstripdictanyr   update_search_regexget_download_jsonr)   geo_verification_headers#_extract_m3u8_formats_and_subtitlesr   _extract_mpd_periods_merge_mpd_periods)r*   r   
display_idwebpagenextjs_datar8   r   season_dataepisode_datar   apir\   r]   ssai_content_source_idssai_video_iddaiperiodsrI   s    `               @r-   _real_extractzGoPlayIE._real_extractK   s8   ^^C((
((j99227JGG````c c < u%)CI;7(
 (
  	
 455@@+K#{CRVQW9XYY  +K(DiDiDiDikn9opp#  ,[8k]:S T T  +L>C5:QRR&2</T_S`Aa&b&b%2"008m888)--:P:PRZdh 1 j j	" "    !!E8EE!;4>!;!;//11 "   S  !%!I!IN#E*H% "J "P "PGYY S  $%CDDD%([1B%C"K	2M%%t@Vtt]jttt4');< & > >C
 //4E0FQQG DC'CCCG!%!8!8!A!AGY"
 
 	 	 	
 r/   )__name__
__module____qualname__IE_NAMEIE_DESC
_VALID_URL_NETRC_MACHINE_TESTSr)   r.   r4   rw   rH   r/   r-   r   r      s"       G)GUJN Q8Fh2+!

 

 #D)C   08f	
 
 #D)C
 
 ^82l"!

 

 #D)C 3(FT IS S S
? ? ?A A A A Ar/   r   c                       e Zd ZdZdS )InvalidLoginExceptionz# The login credentials are invalid Nrx   ry   rz   __doc__rH   r/   r-   r   r      s        ----r/   r   c                       e Zd ZdZdS )AuthenticationExceptionz' Something went wrong while logging in Nr   rH   r/   r-   r   r      s        1111r/   r   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zd ZdS )r'   z AWS Identity Provider c                 p   || _         || _        d| j        vrt          d          || _        | j                            d          d         | _        d| j         d| _        d| _        d| _        t          dd	          | _
        |                     | j                  | _        |                     | j                  | _        |                     |                     d
| j        z   dz   | j        z                       | _        |                                 | _        |                                 | _        dS )aM  
        :param InfoExtrator ie: The extractor that instantiated this class.
        :param str pool_id:     The AWS user pool to connect to (format: <region>_<poolid>).
                                E.g.: eu-west-1_aLkOfYN3T
        :param str client_id:   The client application ID (the ID of the application connecting)
        r,   z4Invalid pool_id format. Should be <region>_<poolid>.r   zhttps://cognito-idp.z.amazonaws.com/   FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF2zCaldera Derived Keyutf-8000N)r!   r"   
ValueErrorr#   splitregionr   n_hexg_hex	bytearray	info_bits_AwsIdp__hex_to_longbig_ng_AwsIdp__hex_hashr=    _AwsIdp__generate_random_small_asmall_a_value_AwsIdp__calculate_alarge_a_value)r*   r!   r"   r#   s       r-   __init__zAwsIdp.__init__   s    dl""STTT"l((--a0F$+FFF
? 	
& 
"#8'BB''
33
##DJ//##DOOD4:4E4Kdj4X$Y$YZZ!;;==!//11r/   c                    |                      |          }t          j        |                                          }dddd}| j                            | j        d||dd          }|                    d	          }|                    d
          dk    rt          |d                   | 	                    ||          }t          j        |                                          }	ddd}
| j                            | j        d|	|
dd          }d|v rt          |d                   |d         d         |d         d         fS )z, Authenticate with a username and password. z.AWSCognitoIdentityProviderService.InitiateAuthidentityzapplication/x-amz-json-1.1)X-Amz-TargetzAccept-EncodingContent-TypeNzAuthenticating usernamezInvalid username)rV   rN   noteerrnoteChallengeParametersChallengeNamePASSWORD_VERIFIERmessagez8AWSCognitoIdentityProviderService.RespondToAuthChallenge)r   r   zAuthenticating passwordzInvalid passwordAuthenticationResultIdTokenRefreshToken)#_AwsIdp__get_authentication_requestjsondumpsencoder!   rh   r   rg   r   '_AwsIdp__get_challenge_response_requestr   )r*   r$   r%   auth_data_dict	auth_dataauth_headersauth_response_jsonchallenge_parameterschallenge_requestchallenge_datachallenge_headerss              r-   r(   zAwsIdp.authenticate   s    ::8DDJ~..5577	L)8
 

 "W33HdL*4F 4 H H  2556KLL!!/226III)*<Y*GHHH !AABVX`aa$566==??V8
 
 "W33Hd9J*4F 4 H H ***'(:9(EFFF56yA56~F
 	
r/   c                 N    ||                      | j                  dd| j        dS )z

        :param str username:    The username to use

        :return: A full Authorization request.
        :rtype: dict
        )USERNAMESRP_AUSER_SRP_AUTH)AuthParametersAuthFlowClientId)_AwsIdp__long_to_hexr   r#   )r*   r$   s     r-   __get_authentication_requestz#AwsIdp.__get_authentication_request   s>     %++D,>??  (
 
 	
r/   c                    |d         }|d         }|d         }|d         }|d         }|                                  }|                     |||                     |          |          }	t          j        |          }
t          | j                            d          d         d          t          |d          z   t          |
          z   t          |d          z   }t          j	        |	|t          j        	          }t          j        |                                                              d          }||||d
d| j        dS )aH   Create a Challenge Response Request object.

        :param dict[str,str|imt] challenge_parameters:  The parameters for the challenge.
        :param str password:                            The password.

        :return: A valid and full request data object to use as a response for a challenge.
        :rtype: dict
        r   USER_ID_FOR_SRPSRP_BSALTSECRET_BLOCKr,   r   r   )	digestmod)r   	TIMESTAMPPASSWORD_CLAIM_SECRET_BLOCKPASSWORD_CLAIM_SIGNATUREr   )ChallengeResponsesr   r   )_AwsIdp__get_current_timestamp"_AwsIdp__get_hkdf_key_for_passwordr   base64standard_b64decoder   r"   r   hmacnewhashlibsha256standard_b64encodedigestdecoder#   )r*   r   r%   user_iduser_id_for_srpsrp_bsaltsecret_block	timestamphkdfsecret_block_bytesmsghmac_objsignature_strings                 r-    __get_challenge_response_requestz'AwsIdp.__get_challenge_response_request  s`    'z2./@A$W-#F++N;0022	 //u%%	
 
 $6|DD dl((--a0'::ow//0())* i))* 	
 8D#@@@!4X__5F5FGGNNwWW $&/;,<	# # 1	
 	
 		
r/   c           
      &   |                      | j        |          }|dk    rt          d          d                    | j                            d          d         ||          }|                     |                                          }|                     | 	                    | 
                    |          |z                       }t          | j        || j                  }	|| j        |	z  z
  }
t          |
| j        ||z  z   | j                  }|                     t"                              | 
                    |                    t"                              | 
                    |                     |                                        S )ab   Calculates the final hkdf based on computed S value, and computed U value and the key.

        :param str username:        Username.
        :param str password:        Password.
        :param int server_b_value:  Server B value.
        :param int salt:            Generated salt.

        :return Computed HKDF value.
        :rtype: object
        r   zU cannot be zero.z{}{}:{}r,   r   )_AwsIdp__calculate_ur   r   formatr"   r   _AwsIdp__hash_sha256r   r   r   _AwsIdp__pad_hexpowr   r   r=   r   _AwsIdp__compute_hkdfr   fromhexr   )r*   r$   r%   server_b_valuer   u_valueusername_passwordusername_password_hashx_valueg_mod_pow_xn
int_value2s_values               r-   __get_hkdf_key_for_passwordz"AwsIdp.__get_hkdf_key_for_password/  sZ    $$T%7HHa<<0111%,,T\-?-?-D-DQ-GS[\\!%!3!34E4L4L4N4N!O!O$$T__T^^D5I5ILb5b%c%cdd467DJ77#df|&;;
j$"4w7H"H$*UU""dnnW5566dnnT-?-?-H-HIIJJ
 
 	
r/   c                 (   t          j        ||t          j                                                  }| j        t          t          d          d          z   }t          j        ||t          j                                                  }|dd         S )z Standard hkdf algorithm

        :param {Buffer} ikm Input key material.
        :param {Buffer} salt Salt value.
        :return {Buffer} Strong key material.
        r   r   N   )r   r   r   r   r   r   r   chr)r*   ikmr   prkinfo_bits_update	hmac_hashs         r-   __compute_hkdfzAwsIdp.__compute_hkdfJ  sr     htS'.1188::>Ic!ffg,F,FFHS"2GNCCJJLL	"~r/   c                     |                      |                     |          |                     |          z             }|                     |          S )z Calculate the client's value U which is the hash of A and B

        :param int big_a:   Large A value.
        :param int big_b:   Server B value.

        :return Computed U value.
        :rtype: int
        )r   r   r   )r*   big_abig_b
u_hex_hashs       r-   __calculate_uzAwsIdp.__calculate_uW  sF     __T^^E%:%:T^^E=R=R%RSS
!!*---r/   c                 @    |                      d          }|| j        z  S )zo Helper function to generate a random big integer

        :return a random value.
        :rtype: int
           )_AwsIdp__get_randomr   )r*   random_long_ints     r-   __generate_random_small_az AwsIdp.__generate_random_small_ad  s$     ++C00++r/   c                     t          | j        | j        | j                  }|| j        z  dk    rt	          d          |S )z Calculate the client's public value A = g^a%N with the generated random number a

        :return Computed large A.
        :rtype: int
        r   zSafety check for A failed)r   r   r   r   r   )r*   r   s     r-   __calculate_azAwsIdp.__calculate_am  sB     DFD.
;;DJ1$$8999r/   c                 
    | dS )NxrH   )long_nums    r-   __long_to_hexzAwsIdp.__long_to_hexz  s    r/   c                 "    t          | d          S )Nr   )int
hex_strings    r-   __hex_to_longzAwsIdp.__hex_to_long~  s    :r"""r/   c                 f    t                               t                              |                     S N)r'   r   r   r   r  s    r-   
__hex_hashzAwsIdp.__hex_hash  s$    ##I$5$5j$A$ABBBr/   c                 ~    t          j        |                                           }dt          |          z
  dz  |z   S )zAuthenticationHelper.hash@   r   )r   r   	hexdigestlen)bufr   s     r-   __hash_sha256zAwsIdp.__hash_sha256  s:     $$..00S[[ C'&00r/   c                     t          | t                    st                              |           }n| }t	          |          dz  dk    rd| }n|d         dv rd| }|S )z Converts a Long integer (or hex string) to hex format padded with zeroes for hashing

        :param int|str long_int:    Number or string to pad.

        :return Padded hex string.
        :rtype: str
        r   r   r   r   89ABCDEFabcdefr   )
isinstancera   r'   r   r  )long_inthash_strs     r-   	__pad_hexzAwsIdp.__pad_hex  ss     (C(( 	 ++H55HHHx==1!!%8~~HHa[,,,&HHr/   c                     t          j        t          j        |                     }t                              |          S r  )binasciihexlifyosurandomr'   r   )nbytes
random_hexs     r-   __get_randomzAwsIdp.__get_random  s0    %bj&8&899
##J///r/   c                      g d} g d}t           j                            t           j        j                  }||                                          d| |j                  d|j         d}|                    |          S )z Creates a timestamp with the correct English format.

        :return: timestamp in format 'Sun Jan 27 19:00:04 UTC 2019'
        :rtype: str
        )NJanFebMarAprMayJunJulAugSepOctNovDec)MonTueWedThuFriSatSun z %H:%M:%S UTC %Y)	dtdatetimenowtimezoneutcweekdaymonthdaystrftime)monthsdaystime_nowformat_strings       r-   __get_current_timestampzAwsIdp.__get_current_timestamp  s~     lkk@@@;??2;?33 0 0 2 23mmfX^6Lmmx|mmm  ///r/   c                     d                     | j        | j                            d          d         | j                  S )Nz4AWS IDP Client for:
Region: {}
PoolId: {}
AppId:  {}r,   r   )r   r   r"   r   r#   r3   s    r-   __str__zAwsIdp.__str__  s:    HOOK++C003T^
 
 	
r/   N)rx   ry   rz   r   r   r(   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r  r   rJ  rH   r/   r-   r'   r'      ss       !!.2 .2 .2`"
 "
 "
H
 
 
"+
 +
 +
Z
 
 
6  . . ., , ,     \ # # \# C C \C 1 1 \1
   \& 0 0 \0 0 0 \0 
 
 
 
 
r/   r'   )r   r  r<  r;  r   r   r   r!  urllib.parser:   commonr   utilsr   r   utils.traversalr   r	   r   r   r   r'   rH   r/   r-   <module>rP     sX            				     ! ! ! ! ! ! / / / / / / / / 5 5 5 5 5 5 5 5} } } } }} } } }F. . . . .N . . .2 2 2 2 2n 2 2 2_
 _
 _
 _
 _
 _
 _
 _
 _
 _
r/   