
    iA8                         d dl Z d dlmc mZ d dlmZmZmZ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 G d d      Z G d	 d
      Zy)    N)OptionalListDictTuple)UUID)Console)PSSH)create_client_curlc                       e Zd ZdZdZdZdZededediZeded	ed
iZdZ	dZ
ddgZededee   fd       Zededee   fd       Zy)	DRMSystemz#DRM system constants and utilities.widevine	playreadyfairplayz$edef8ba9-79d6-4ace-a3c8-27dcd51d21edz$9a04f079-9840-4286-ab92-e65be0885f95z$94ce86fb-07ff-4f43-adb8-93d2fa968ca2WVPRFPz urn:mpeg:dash:mp4protection:2011z-urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21edz-urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95urn:microsoft:playreadydrm_typereturnc                 T    | j                   j                  |j                               S N)UUIDSgetlower)clsr   s     W/home/nidran/Documenti/script/streaming-community/StreamingCommunity/core/parser/mpd.pyget_uuidzDRMSystem.get_uuid0   s    yy}}X^^-..    uuidc                 ~    |j                         t        fd| j                  j                         D        d       S )Nc              3   2   K   | ]  \  }}|v s|  y wr    ).0tvus      r   	<genexpr>z&DRMSystem.from_uuid.<locals>.<genexpr>7   s     ?41aQQ?s   )r   nextr   items)r   r   r&   s     @r   	from_uuidzDRMSystem.from_uuid4   s,    JJL?399??#4?FFr   N)__name__
__module____qualname____doc__WIDEVINE	PLAYREADYFAIRPLAYr   ABBREVCENC_SCHEMEWIDEVINE_URNPLAYREADY_URNSclassmethodstrr   r   r*   r"   r   r   r   r      s    -HIH 	898E 	$4$F 5KBL7!N
 / / / / GS GXc] G Gr   r   c                      e Zd Zddedeeef   fdZdefdZdedefdZd	 Z	d
edefdZ
dej                  d
edeej                     fdZdej                  d
edeej                     fdZdej                  dee   fdZdej                  deeee   f   fdZdej                  deeef   fdZddZd ZddZddZddZy)	MPDParserNmpd_urlheadersc                 D    || _         |xs i | _        d | _        i | _        y r   )r:   r;   rootnamespace_map)selfr:   r;   s      r   __init__zMPDParser.__init__;   s#    }"	r   r   c                 H   	 t        | j                        j                  | j                        }|j	                          t        j                  |j                        | _        | j                          y# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)zParse MPD from URL.)r;   Tz[red]Error parsing MPD: NF)r
   r;   r   r:   raise_for_statusET
fromstringcontentr=   _extract_namespaces	Exceptionconsoleprint)r?   res      r   parsezMPDParser.parseA   sz    		"4<<8<<T\\JA aii0DI$$& 	MM4QC89	s   A3A6 6	B!?BB!	file_pathc                     	 t        j                  |      j                         | _        | j	                          y# t
        $ r | j                         cY S w xY w)zParse MPD from a local file.T)rC   rL   getrootr=   rF   rG   )r?   rM   s     r   parse_from_filezMPDParser.parse_from_fileN   sJ    	 +335DI$$& 	 ::<	 s   8; AAc                     dddd| _         | j                   j                         D ]  \  }}t        j                  ||        y)z.Extract and register namespaces from XML root.zurn:mpeg:dash:schema:mpd:2011zurn:mpeg:cenc:2013r   )mpdcencmsprN)r>   r)   rC   register_namespace)r?   prefixuris      r   rF   zMPDParser._extract_namespacesY   sK     3(-
  --335 	/KFC!!&#.	/r   pathc                 |    | j                   j                         D ]  \  }}|j                  | dd| d      }  |S )z<Convert path with namespace prefixes to full namespace URIs.:{})r>   r)   replace)r?   rX   rV   rW   s       r   _xpathzMPDParser._xpathe   sG    --335 	<KFC<<6(!3%rl;D	<r   elementc                 X    |j                  | j                  |      | j                        S )z%Find element with namespace handling.)findr^   r>   r?   r_   rX   s      r   _findzMPDParser._findk   s"    ||DKK-t/A/ABBr   c                 X    |j                  | j                  |      | j                        S )z*Find all elements with namespace handling.)findallr^   r>   rb   s      r   _findallzMPDParser._findallo   s"    t{{40$2D2DEEr   c                     | j                  |d      D ]?  }|j                  d      xs$ |j                  d      xs |j                  d      }|s=|c S  y)z4Extract default_KID from ContentProtection elements.mpd:ContentProtectionz{urn:mpeg:cenc:2013}default_KIDdefault_KIDkidN)rf   r   )r?   r_   cprj   s       r   _get_default_kidzMPDParser._get_default_kids   sY    --)@A 	B66;<f}@UfY[Y_Y_`eYfC
	 r   c                   	 i }| j                  |d      D ]+  }|j                  d      xs dj                         	t        j                  	v r|j                  | j                  d            }|s]|j                         sn	 t        |j                               }|j                  d      xs |j                  d      }|rYt        t        j                  |            }|j                  rt        d |j                  D              r|j                  |g       |j                  t        j                   g       j#                  |j                                Ft'        	fd	t        j(                  D              sj|j                  | j                  d            xs3 |j                  | j                  d
            xs |j                  d      }|s|j                         s	 t+        |j                                |j                  t        j,                  g       j#                  |j                                . |S # t$        $ r Y =w xY w# t$        $ r Y Mw xY w)zCExtract DRM types and their PSSH data using pywidevine/pyplayready.rh   schemeIdUri z	cenc:psshrj   z{urn:mpeg:cenc:2013}kid)bytesc              3   :   K   | ]  }|j                   d k(    yw)r   N)int)r#   ks     r   r'   z*MPDParser._get_drm_data.<locals>.<genexpr>   s     6Xaquuz6Xs   c              3   &   K   | ]  }|v  
 y wr   r"   )r#   urnschemes     r   r'   z*MPDParser._get_drm_data.<locals>.<genexpr>   s     GsSF]G   zmspr:propro)rf   r   r   r   r4   findtextr^   stripr	   r   base64	b64decodekey_idsallset_key_ids
setdefaultr/   appendrG   anyr5   PR_PSSHr0   )
r?   r_   drm_datark   	pssh_textpsshkid_attrrj   pr_textrv   s
            @r   _get_drm_datazMPDParser._get_drm_data{   s   --)@A $	Bff]+1r88:F %%/KKK(@A	!2#IOO$56 $&66%=#UBFF;T4U#"&V-=-=h-G"HC $(<<36X4<<6X3X $ 0 0# 7 ++I,>,>CJJ9??K\]
 Gi.F.FGG ;;t{{;'?@~BKKPTP[P[\fPgDh~lnlwlwx}l~w}}0 ++I,?,?DKKGMMO\E$	L # %  % s&   CI,AI	II	I$#I$	adapt_setc                     |j                  d      xs |j                  d      xs dj                         }d|v rdnd|v rdnd|v rdnd|v rdnd}|j                  d	d      }||fS )
z6Extract content type and language from adaptation set.contentTypemimeTypero   videoaudioimagetextN/Alang)r   r   )r?   r   c_typecontent_typer   s        r   _get_content_infozMPDParser._get_content_info   s    --.Q)--
2KQrXXZ")V"3wGvDUfmqwfw[b  HN  RX  HX  ~D  ^c}}VU+T!!r   c           
         | j                   sg S g }|xs g D cg c]  }t        |       }}|xs g D cg c]%  }|s|j                         j                  dd      ' }	}|xs g D 
cg c]  }
|
s|
j                          }}
|xs g D cg c]  }|st        |       }}| j	                  | j                   d      D ]  }|j                  d      }|r|r||vr| j	                  |d      D ]W  }| j                  |      \  }}
|dv r| j                  |||
||	|      s3| j                  |||
|      }|j                  |       Y  |S c c}w c c}w c c}
w c c}w )z)Get information about all AdaptationSets.-ro   z
mpd:Periodidzmpd:AdaptationSet)r   r   )
r=   r7   r   r]   rf   r   r   _matches_filters_extract_adaptation_set_infor   )r?   selected_idsselected_kidsselected_langsselected_periodsadaptation_setsinorm_idsrs   	norm_kidsr   
norm_langspnorm_periodsperiod	period_idr   r   infos                      r   get_adaptation_sets_infoz"MPDParser.get_adaptation_sets_info   su   yyI &2%7R9qCF99:G:M2TARSQWWY&&sB/T	T0>0D"NtdjjlN
N)9)?RF1AAFFmmDII|< 	-F

4(I 	i|.K!]]63FG -	%)%;%;I%F"d  #44 ,,YdHV_akl 88LRVX`a&&t,-	-, 7 :TNFs'   EE"E)E1EEEc                     |j                  dd      } j                  |d      D cg c]  }|j                  d       }	}r|v st        fd|	D              sy|r j                  |      g}
|
j	                   fd j                  |d      D               |
D cg c]%  }|s|j                         j                  dd      ' c}t        fd	|D              sy|r|d
k(  r|j                         |vryyc c}w c c}w )z0Check if adaptation set matches filter criteria.r   r   mpd:Representationc              3   &   K   | ]  }|v  
 y wr   r"   )r#   ridr   s     r   r'   z-MPDParser._matches_filters.<locals>.<genexpr>   s     3[CC<4G3[rw   Fc              3   @   K   | ]  }j                  |        y wr   )rl   )r#   repr?   s     r   r'   z-MPDParser._matches_filters.<locals>.<genexpr>   s     sSd33C8ss   r   ro   c              3   &   K   | ]  }|v  
 y wr   r"   )r#   tknorm_adapt_kidss     r   r'   z-MPDParser._matches_filters.<locals>.<genexpr>   s     Er_,Erw   r   T)r   rf   r   rl   extendr   r]   )r?   r   r   r   r   r   r   adapt_idr   rep_ids
adapt_kidsrs   r   s   `   `       @r   r   zMPDParser._matches_filters   s    ==u-,0MM)EY,Z[S3774=[[ ,3[SZ3[0[ //	:;JsDMMR[]qDrssCMSaQRqwwy00b9SOE}EE lg5zz|>1) \ Ts   C>!D)"Dc           	         | j                  |      }| j                  |      }| j                  |d      D ]L  }| j                  |      }|j                         D ]&  \  }	}
|j	                  |	g       j                  |
       ( N |D ]&  }	t        t        j                  ||	               ||	<   ( d}|dk(  rWg }| j                  |d      D ]1  }|j                  d      }|s	 |j                  t        |             3 |rt        |      nd}|j                  dd      |||t        |j                               |t        |      |dS # t        $ r Y w xY w)z1Extract detailed information from adaptation set.r   Nr   heightr   r   )r   r   languagedefault_kid	drm_typespssh_mapis_protectedr   )rl   r   rf   r)   r   r   listdictfromkeysr   r   rr   
ValueErrormaxkeysbool)r?   r   r   r   r   r   r   r   rep_psshr   psshsr   heightshs                 r   r   z&MPDParser._extract_adaptation_set_info   sn   ++I6 %%i0==,@A 	@C))#.H#+>>#3 @%##Hb188?@	@ ! 	IH!%dmmHX4F&G!HHX	I 7"G}}Y0DE GGH%s1v.	 &-S\$F --e,(&hmmo.  N	
 		
 & s   "E	EEc           
         | j                  ||||      }|syi }|D ]&  }|j                  |d   g       j                  |       ( |j                         D ]   \  }}	t	        |||g      }
t        |	D ch c]  }|d   	 c}      dk(  xr |
 }t               }|r|	d   gn|	D ]  }|d   xs d}|d   rdj                  |d         nd	}|rd
| }nh|g}|j                  d      r|j                  |d    d       |j                  d      dk7  r|j                  d|d    d       dj                  |      }| d| }||v r|j                  |       t        j                  d| d| d|         # yc c}w )z!Print AdaptationSets information.Nr   r      r   z	Not foundr   z, Nozall r   r   r   r   () _z    [red]- z[white], [cyan]Kid: [yellow]z, [cyan]Protection: [yellow])r   r   r   r)   r   lensetjoinr   addrH   rI   )r?   r   r   r   r   setsgroupssr   r)   
has_filterr   
is_uniformseenitemrj   protlabelpartskeys                       r   print_adaptation_sets_infoz$MPDParser.print_adaptation_sets_info  s   ,,\=.Zjk  	?Aa/4;;A>	? $\\^ 	xMFElM>JKJ>1a.>?1DWZJ5D'1%(u x=)8[7;K7Htyyk!23d"6(OE#HExx)X'7q%9:xx
+u4qj)9(:!%<=HHUOEq&$;E72NseSoptouvw'x	x>s   3E:
c                 h   | j                   sg dg g dS | j                  ||||      }g }g }t               }	t               }
|D ]  }|j                  di       }|j                  t        j
                  g       D ]N  }||	vs|	j                  |       |j                  ||j                  d      xs dt        j
                  d       P |j                  t        j                  g       D ]N  }||
vs|
j                  |       |j                  ||j                  d      xs dt        j                  d       P  g }|r|j                  t        j
                         |r|j                  t        j                         ||v r|n|r|d   nd}| j                  ||||       t        d       ||||dS )	z!Extract DRM information from MPD.N)available_drm_typesselected_drm_typewidevine_psshplayready_psshr   r   r   )r   rj   typer   ro   )r=   r   r   r   r   r/   r   r   r0   r   rI   )r?   drm_preferencer   r   r   r   matched_setswv_psshpr_psshseen_wvseen_prr   r   r   	availableselecteds                   r   get_drm_infozMPDParser.get_drm_info:  s   yy')%)!#"$	  44\=R`brs %%  	Dxx
B/H !Y%7%7< w&KK%NN $#xx6?% ) 2 2$  !Y%8%8"= w&KK%NN $#xx6?% ) 3 3$ 	0 	Y//0Y001 &4y%@>W`yQR|fj 	''m^Uefb	 $-!)$%	
 	
r   r   )NNNN)r+   r,   r-   r7   r   r@   r   rL   rP   rF   r^   rC   Elementr   rc   r   rf   rl   r   r   r   r   r   r   r   r   r"   r   r   r9   r9   :   s&      d38n  t 	  	  	 
/3 3 CRZZ Cs Cx

7K CF

 F# F$rzz:J F

 x} *RZZ *Dd3i4H *X"2:: "%S/ "#J2&
P$xL=
r   r9   )r{   xml.etree.ElementTreeetreeElementTreerC   typingr   r   r   r   r   r   rich.consoler   pywidevine.psshr	   pyplayready.system.psshr   $StreamingCommunity.utils.http_clientr
   rH   r   r9   r"   r   r   <module>r      sL     " " . .  !   3 D ) G  GF}
 }
r   