
    i!                         d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ  e       Zdd	ee   d
ededee   dededefdZdd	ee   d
ededee   dedefdZy)    N)Console)Cdm)Device)DeviceTypes)	RemoteCdm)PSSH)create_client_curl	pssh_listlicense_urlcdm_device_pathcdm_remote_apiheaderskeykid_to_labelc                 .   |rj|j                  d      }t        |      dk(  rJ|d   j                  dd      j                          d|d   j                  dd      j                          gS y||t        j                  d       yt        | |||||      S )	a  
    Extract Widevine CONTENT keys (KID/KEY) from a license.

    Args:
        - pssh_list (list[dict]): List of dicts {'pssh': ..., 'kid': ..., 'type': ...}
        - license_url (str): Widevine license URL.
        - cdm_device_path (str): Path to local CDM file (device.wvd). Optional if using remote.
        - cdm_remote_api (list[str]): Remote CDM API config. Optional if using local device.
        - headers (dict): Optional HTTP headers for the license request (from fetch).
        - key (str): Optional raw license data to bypass HTTP request.
        - kid_to_label (dict): Mapping from KID (hex) to track label.

    Returns:
        list: List of strings "KID:KEY" (only CONTENT keys) or None if error.
    :   r   -    NzB[red]Error: Must provide either cdm_device_path or cdm_remote_api.)splitlenreplacestripconsoleprint_get_widevine_keys)r
   r   r   r   r   r   r   k_splits           Y/home/nidran/Documenti/script/streaming-community/StreamingCommunity/core/drm/widevine.pyget_widevine_keysr       s    " ))C.w<1qz))#r288:;1WQZ=O=OPSUW=X=^=^=`<abcc >#9Z[io~W^`lmm    c                    d}d}t               }| D ]c  }	t        |	j                  dd            j                  dd      j	                         j                         }
|
sM|
dk7  sS|j                  |
       e |At        j                  d       	 t        j                  |      }t        j                  |      }nut        j                  d       	 |d	   d
k(  rt        j                  |d	<   n8|d	   dk(  rt        j                   |d	<   nt        j                  d|d	           yt#        d:i |}|j%                         }g }t               }	 t'        |       D ]  \  }}	|	d   }t        |	j                  dd            j                  dd      j	                         j                         }|	j                  dd      }t        j                  d| d|dd  d| d       	 |j)                  |t+        |            }|r|j-                         ni }d|vrd|d<   |t        j                  d       	 t/        |      j1                  ||      }|j2                  dk7  r:t        j                  d |j2                   d!|j4                  dd  d"| d#|        ?|j6                  }|j8                  j                  dd      }d$|v rJ	 |j;                         }d%|v rt=        j>                  |d%         }nt        j                  d&| d'       	 |st        j                  d)       	 |jA                  ||       	 |jC                  |      D ]  }|jD                  d+k7  r|jF                  jH                  j	                         j                         }
tK        d, |
D              rX|
|vrt        j                  d-|
 d.       |
|v rz|
 d/|jL                  jI                          }||vs|jO                  |       |j                  |
        	 |j	                         d1k(  rtQ        |      tQ        |      k\  r n#tQ        |       d2k(  stQ        |      d2k\  s n |ryt'        |      D ]j  \  }}|jS                  d/      \  }
}|dd3 d4z   }|r|j                  |
j	                               nd}|rd5| nd}t        j                  d6|
 d7| |        l nt        j                  d8       |r|nd	 	 |jU                  |       S # t        $ r"}t        j                  d|        Y d}~yd}~ww xY w# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w# t        $ r)}t        j                  d|dd  d|        Y d}~7d}~ww xY w# t        $ r#}t        j                  d|        Y d}~fd}~ww xY w# t        $ r#}t        j                  d(|        Y d}~d}~ww xY w# t        $ r#}t        j                  d*|        Y d}~d}~ww xY w# t        $ r#}t        j                  d0|        Y d}~d}~ww xY w# t        $ r Y S w xY w# t        $ rC}t        j                  d9|        Y d}~	 |jU                  |       y# t        $ r Y yw xY wd}~ww xY w# 	 |jU                  |       w # t        $ r Y w w xY wxY w);z7Extract Widevine keys using local or remote CDM device.Nkidr   r   zn/az[cyan]Using local CDM.z%[red]Error loading local CDM device: z[cyan]Using remote CDM.device_typeANDROIDCHROMEz)[red]Unsupported remote CDM device type: z$[red]Error initializing remote CDM: psshzN/Atypeunknownz[red]z [cyan](PSSH: [yellow]   z...[cyan] KID: [red])z'[red]Error creating challenge for PSSH z...: zContent-Typezapplication/octet-streamz
[red]License URL is None.)r   )dataz[red]License request error:    z[red]License error: z
Response: z
Url: z

Headers: zapplication/jsonlicensez1[red]'license' field not found in JSON response: .z![red]Error parsing JSON license: z[red]License data is empty.z[red]Error parsing license: CONTENTc              3   &   K   | ]	  }|d k(    yw)0N ).0cs     r   	<genexpr>z%_get_widevine_keys.<locals>.<genexpr>   s     1181s   z$[yellow]Warning: Extracted KID [red]z( [yellow]is not in the expected KID listr   z[red]Error extracting keys: allr   *z [cyan]| [red]z    - [red]z[white]:[green]z[yellow]No keys extractedz-[red]Unexpected error during key extraction: r3   )+setstrgetr   lowerr   addr   r   r   loadr   from_device	Exceptionr   r%   r&   r   open	enumerateget_license_challenger   copyr	   poststatus_codetextcontentr   jsonbase64	b64decodeparse_licenseget_keysr(   r#   hexr7   r   appendr   r   close) r
   r   r   r   r   r   devicecdmexpected_kidsitemr#   e
session_idall_content_keysextracted_kidsir'   kid_info	type_info	challengereq_headersresponselicense_bytescontent_typer,   key_objformatted_keykkey_val
masked_keylabel	label_strs                                    r   r   r   6   s   F
C EM #$((5"%&..sB7==?EEG3%<c"# "./	[[1F//&)C 	/0	m,	90;0C0C}-.(:0;0B0B}- I.YfJgIhij-n-C JUNy + a	GAt<D488E512::3CIIKQQSH3IMME),B49+Mabjakklmn55j$t*M	 -4',,.K[0.HN+";<-kBGGZcGd
 ##s* 4X5I5I4J,W_WdWdeifiWjVkkrs~r  @K  LW  KX  Y  Z %,,M#++//CL "\1	#==?D D((.(8(8i(I(YZ^Y__`&ab  & !;<!!*m<"||J7 0G||y0  "++////1779C 1S11  -/(LSEQy&z{ n, '*e1W[[__->,?$@M$,<<(//>&**3/-0:  E)c..ASEW.W 9~"s+;'<'ACa	H !"23 Y1 wws|W$Sb\C/
9E((548=nUG42	C5
|I;WXY MM56#3=	IIj!]  	MMA!EF	  	MM@DE	&   GSb	{RWXYWZ[\    <QC@A* ! MM$EaS"IJ   <QC@A<   <QC@A@  		  EaSIJ	IIj! 		
	IIj! 		s  *T AT3 $T3 BY! U!:5Y! 0VA5Y! AW	Y! &W49B.X#($X#;Y! 	Y! BY! 3Y	T0T++T03	U<UU!	V*VY! VY! 	WV=7Y! =WY! 	W1W,&Y! ,W11Y! 4	X =XY! X  Y! #	Y,Y
Y! 
YY! 	YY!	Z-*Z(Z0 Z 	Z%$Z%(Z--Z0 0[2[[	[[[[)NNNNN)NN)rK   rich.consoler   pywidevine.cdmr   pywidevine.devicer   r   pywidevine.remotecdmr   pywidevine.psshr   $StreamingCommunity.utils.http_clientr	   r   listdictr;   r    r   r3   r!   r   <module>rq      s     !  $ ) *   D )nd n# nPS nlpqtlu n  HL n  Z] n  tx n>c$t* c3 cQT cfjknfo cz~ c  VZ cr!   