U
    gQ                     @   st   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m	Z	m
Z
mZmZmZ G dd deZG dd	 d	eZdS )
    N   )InfoExtractor   )ExtractorErrorint_or_noneparse_durationsrt_subtitles_timecodetraverse_objtry_geturlencode_postdatac                   @   s  e Zd ZdZdddddddd	d
dddd
ddddddddd
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)d*d+dd,d-d.d
d/d0d1d'	ddd2dd3d4dd3d5dd3d6dd3gZed7d8 Zed9d: Zd;d< Z	d=i fd>d?Z
d@dA ZdBdC ZdDdE ZdFdG Zd=S )HNexxIEaa  (?x)
                        (?:
                            https?://api\.nexx(?:\.cloud|cdn\.com)/v3(?:\.\d)?/(?P<domain_id>\d+)/videos/byid/|
                            nexx:(?:(?P<domain_id_s>\d+):)?|
                            https?://arc\.nexx\.cloud/api/video/
                        )
                        (?P<id>\d+)
                    z0https://api.nexx.cloud/v3/748/videos/byid/128907Z 31899fd683de49ad46f4ee67e53e83feZ128907mp4zStiftung Warentestu   Wie ein Test abläuftz$md5:d1ddb1ef63de721132abd38639cc2fd2
SPIEGEL TVre:^https?://.*\.jpg$i	  i2RZ20131112
idexttitle	alt_titledescriptioncreator	thumbnailduration	timestampupload_datez"Spiegel nexx CDNs are now disabled)urlmd5	info_dictskipz3https://api.nexx.cloud/v3.1/741/videos/byid/1701834Z1701834u%   Mein Leben mit 'nem TikTok E-Boy 😤z$md5:f84f395a881fd143f952c892deab528di  i_Z20200724r   z	Episode 2zSeason 2)r   r   r   r   r   r   r   r   r   episode_numberseason_numberepisodeseasonskip_downloadT)r   r   paramsznexx:741:1269984Z d5f14e14b592501e51addd5abef95a7fZ1269984u"   1 TAG ohne KLO... wortwörtlich! ?z$md5:2016393a31991a900946432ccdd09a6fi_  i9ZZ20180214)	r   r   r   r   r   r   r   r   r   )r   r   r   znexx:747:1533779Z 6bf6883912b82b7069fb86c2297e9893Z1533779z$Aufregung um ausgebrochene Raubtierez	Eifel-Zooz$md5:f21375c91c74ad741dcb164c427999d2o   i[Z20180601z1https://api.nexxcdn.com/v3/748/videos/byid/128907r   Zonly_matchingznexx:748:128907znexx:128907z,https://arc.nexx.cloud/api/video/128907.jsonc                 C   s   t d| }|r|dS d S )Nze<script\b[^>]+\bsrc=["\'](?:https?:)?//(?:require|arc)\.nexx(?:\.cloud|cdn\.com)/(?:sdk/)?(?P<id>\d+)r   )researchgroup)webpagemobj r,   9/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/nexx.py_extract_domain_idm   s
    zNexxIE._extract_domain_idc                 C   s>   g }t |}|r:td|D ]}|d| d|  q|S )NzT(?is)onPLAYReady.+?_play\.(?:init|(?:control\.)?addPlayer)\s*\(.+?\s*,\s*["\']?(\d+)https://api.nexx.cloud/v3/z/videos/byid/)r   r.   r'   findallappend)clsr   r*   entries	domain_idvideo_idr,   r,   r-   _extract_embed_urlst   s    
zNexxIE._extract_embed_urlsc                 C   s~   t |dtdr*| d| j|d d  tt|dd p<d}d|  krTd	k r\n nd S td| j|d d
 ddd S )N)metadatanoticeexpected_typez{} said: {}r7   r8   c                 S   s   | d d S )Nr7   statusr,   xr,   r,   r-   <lambda>       z&NexxIE._handle_error.<locals>.<lambda>   i,  Z	errorhintT)expected)r	   strZreport_warningformatZIE_NAMEr   r
   r   )selfresponser;   r,   r,   r-   _handle_error   s     zNexxIE._handle_errorNc                 C   sF   d|d< | j d| d| |d| dt||d}| | |d S )	Nz0application/x-www-form-urlencoded; charset=UTF-8zContent-Typer/   /zDownloading z JSONdataheadersresult)_download_jsonr   rF   )rD   r4   pathr5   rI   rJ   rK   r,   r,   r-   	_call_api   s     
 
zNexxIE._call_apic              
      s  |d   d }|dkst |d d }t d } d dkrzd	t| d d d
 }|d|dd  d|dd  7 }|d| d| d7 }d| } d d} d }	 fdd}
g }|	dkr|d7 }|D ].}|d}||d |
t|d  d 7 }q|d7 }n&|	dkr,|d}| }d| }}| d  }|d7 }|D ]}|d}t|d }| |d  |
| d}|d | | d| |d}|d d}t|dkr|t|d t|d d  |	| |d|d!   }||d 7 }qR|d d
 d" |dd  }n
d#s6t |	dkrj|
| j| d$ d%f || d&d#d' |
| j| d( d)f |d*d+| d,d#d- |S ).N
streamdatacdnTypefreegeneralhashZoriginalDomainZapplyFolderHierarchyr   z%04drG   r   r      _z	http://%sazureFileDistribution,ZcdnProviderc                    s    d dkrd|  S dS )NZapplyAzureStructurer   rV    r,   )pstream_datar,   r-   p0   s    z(NexxIE._extract_free_formats.<locals>.p0Zak:z.mp4.csmil/master.%sZceZcdnPathHTTPz0/asset.ism/manifest.%s?dcp_ver=aos4&videostream=.mp4-http-r   	format_idtbrr=   widthheight  z&audiostream=FZcdnPathDASHZmpd-dashZmpd_idfatalZ
cdnPathHLSZm3u8r   m3u8_native-hls)Zentry_protocolm3u8_idrj   )AssertionErrorrB   intsplitpopjoinlenupdater   r1   extend_extract_mpd_formats_extract_m3u8_formats)rD   videor5   cdnZ
video_hashZpsstfdZcdn_providerr]   formatsirZ   khZ	http_baserc   filenamefwidth_heightar,   r[   r-   _extract_free_formats   sz    $

"






 

      zNexxIE._extract_free_formatsc                    sx  |d d }|dkst d d d d f\}}}}t|dtd	 d, fdd	}| }	g }
|
| j|	 | d| d| d| ddp| d|d| ddd |
| j|	 | d| d| d| d| d|| ddd |d}dp
d
}|d}|D ]}|d}t|dkr:qt	|d dd }|

| | d!| d|d"  d#| d|d$  |rd| nd
 |d% qd&pd
}|d}|D ]}|d}t|dkrڐqt	|d$ }t|d d'd"kr|d d'nd(\}}| | d| d| d|d"  d)	| d*|rLd| nd
 |t	|t	|d+}|

| q|
S )-NrO   rP   3qZqAccountZqPrefixZqLocatorZqHash)protectiondatakeyr9   rY   c                    sl   dD ]6} d|  d|  }|rd| d|   S qd|  dkrNdnd d	 rfd
  dnd S )NrY   rz   	cdnShieldHTTPhttp://zhttp://sdn-global-progZ	streamingz-cache.3qsdn.com/zs/rG   rY   )getupperlower)shield_typesecure
cdn_shieldZprotection_keyr\   r,   r-   get_cdn_shield_base   s
    z7NexxIE._extract_3q_formats.<locals>.get_cdn_shield_basez/files/rG   -Z	qHEVCHashz.ism/manifest.m3u8r   rl   Frm   rj   z.ism/manifest.mpdrh   ri   ProgZqReferencesrX   r^      r   rg   )Zscalez	/uploads/r   z.webmr   ra   rW   r=   )NNr_   r`   )r   rb   rc   re   rf   )rY   )rn   r	   rB   ru   rw   r   rv   rp   rs   r   r1   )rD   rx   r5   ry   Zq_accZq_prefixZ	q_locatorZq_hashr   Zstream_baser}   Zprogressive_baseZq_referencesfdsr|   ssrc   azure_file_distributionre   rf   r   r,   r   r-   _extract_3q_formats   sl    $  .   $  

$

."zNexxIE._extract_3q_formatsc              
      s  |d   d }|dkst  d }d+ fdd	}|d	 d
pBd}| }d|k}d||||rddndd }	t|dd t}
|
r|	d|
 7 }	| j|	d |dd| ddd}|| j|	d || ddd || j|	d || ddd |dd} d}|r|	d}|r|D ]}|	d}t
|d kr"t|d! }|r"| | d"| d#|d$  d%| d&	| d'| |d(}|d$ 	d)}t
|d kr|t|d! t|d$ d* || q"|S ),NrO   rP   azureZazureLocatorrY   Fc                    s   dD ]6}  d|  d|  }|rd| d|   S qd d krV|rPdnd	}n|r^d
nd}t d dddd}d||f S )Nr   r   r   r   r   ZfbZazureAccountZdfr   drZ   ZnexxplayplusrY   Z
nexxplayfbzhttp://nx-%s%02d.akamaized.net/)r   r   ro   replace)r   Zstaticr   r   prefixaccountr[   r,   r-   r     s    z:NexxIE._extract_azure_formats.<locals>.get_cdn_shield_baserR   Zlanguage_rawrX   z{}{}/{}_src{}.ism/ManifestZ	_manifestz%sc                 S   s   | d d S )Nr   tokenr,   r<   r,   r,   r-   r>   3  r?   z/NexxIE._extract_azure_formats.<locals>.<lambda>z?hdnts=z(format=m3u8-aapl)r   rk   rl   r   z(format=mpd-time-csf)rh   ri   z-mss)Zism_idrj   r   TrW   r^   r   r   rG   Z_src_r   rV   r_   r`   ra   r=   rd   )rY   F)rn   r   rC   r
   rB   rw   ru   rv   Z_extract_ism_formatsrp   rs   r   rt   r1   )rD   rx   r5   ry   Zazure_locatorr   languageZazure_stream_baseZis_mlZazure_manifest_urlZprotection_tokenr}   Zazure_progressive_baser   r   r|   r   rc   r   r   r,   r[   r-   _extract_azure_formats  s       
          



"

zNexxIE._extract_azure_formatsc                    sZ  |  |}|dp|d}|d d } fdd}| jd  d dd	}|rtt|trt|d
}|rt||}|stdd dtt		  dtdd tdd }| j
|d |dddddddddddddddid}|d d }	|d d  t|d! d  }
|
d!t|
t|d"   }
d#}td|||
f  }| j
|d$| d%   d&ddddd'dddd(dd)|	|d*d}||}|d }|d+ }|d, d- }|d.kr| | }nB|d/kr| | }n*|d0kr| | }n| | d1  i }|d2pg D ]}|d3rz||d4d5g d6d7d8d9 t|d3 D |d:pp|d+d; nJ|d<r||d4d5g |d< |d=|d:p|d+d> q ||d?|d@t|dA|dBp|dCpd t|dDdE tt|dFt|dGt|dHtddIt|dJtddIt|dKtdL||dMS )NNr4   Zdomain_id_sr   c                    sJ   t | tr| S t | trFt }| D ] }t|dd t|kr$|  S q$d S )Nc                 S   s   | d d S )NrR   ZIDr,   r<   r,   r,   r-   r>   g  r?   z:NexxIE._real_extract.<locals>.find_video.<locals>.<lambda>)
isinstancedictlistro   r
   )rK   Zvidvr5   r,   r-   
find_videoa  s    


z(NexxIE._real_extract.<locals>.find_videoz!https://arc.nexx.cloud/api/video/z.jsonF)rj   rK   r   rU   r^   i'  i 	   zsession/initrY   0Z1920Z1080z6.0.00html5zen-US1)Znxp_devhZ	nxp_userhZprecidZplaylicenseZscreenxZscreenyZplayerversionZgatewayZ	adGatewayZexplicitlanguageZaddTextTemplatesZaddDomainDataZ
addAdModelzX-Request-Enable-Auth-FallbackrH   rR   cidZdeviceZdomaintokenr   rT   Zbyidzvideos/rG   zAlanguage,channel,format,licenseby,slug,fileversion,episode,seasonZvttZpersons)ZadditionalfieldsZaddInteractionOptionsZaddStatusDetailsZaddStreamDetailsZaddFeaturesZaddCaptionsZ	addScenesZaddChaptersZaddHotSpotsZaddConnectedMediaZ
addBumpers)zX-Request-CIDzX-Request-Tokenr   rO   rP   r   rQ   r   z$ formats are currently not supportedZcaptiondatarI   r   enZsrtz

c              	   s   sL   | ]D\}}|d   dt |d d  dt |d d  d|d  V  qdS )r   
Zfrommsrg   z --> ZtomscaptionN)r   ).0r~   liner,   r,   r-   	<genexpr>  s   z'NexxIE._real_extract.<locals>.<genexpr>Zlanguage_long)r   rI   namer   rC   )r   r   r   Zsubtitler   yearZstudioZstudio_adrefc                 S   s   | d d S )NZ	imagedataZthumbr,   r<   r,   r,   r-   r>     r?   z&NexxIE._real_extract.<locals>.<lambda>ZruntimeZuploaded)ZepisodedatarR   r!   )r:   get_all)r   r"   )Zconnectedmedia.r   r9   )r   r   r   r   Zrelease_yearr   r   r   r   r   r    castr}   	subtitles)Z_match_valid_urlr)   rL   r   r   r   randomrandintro   timerN   rs   hashlibr   rr   encode	hexdigestr   r   r   Zraise_no_formats
setdefaultr1   	enumerater   r
   rB   r   r	   )rD   r   r+   r4   rx   r   rE   rK   Z	device_idr   secretopZrequest_tokenrR   r   ry   r}   r   subr,   r   r-   _real_extractZ  s    



 
8
   





        zNexxIE._real_extract)__name__
__module____qualname__
_VALID_URL_TESTSstaticmethodr.   classmethodr6   rF   rN   r   r   r   r   r,   r,   r,   r-   r      s   
 R

	A;Br   c                   @   sP   e Zd ZdZdgZddddddd	d
ddddd
ddiddddgZdd ZdS )NexxEmbedIEzHhttps?://embed\.nexx(?:\.cloud|cdn\.com)/\d+/(?:video/)?(?P<id>[^/?#&]+)zb<iframe[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?//embed\.nexx(?:\.cloud|cdn\.com)/\d+/(?:(?!\1).)+)\1z6http://embed.nexx.cloud/748/KC1614647Z27Y7T?autoplay=1Z 16746bfc28c42049492385c989b26c4aZ161464r   zNervenkitzel AchterbahnzKarussellbauer in Deutschlandz$md5:ffe7b1cc59a01f585e0569949aef73ccr   r   i
  igSZ20140305r   r#   T)r   r   r   r$   z3https://embed.nexx.cloud/11888/video/DSRTO7UVOX06S7r&   c                 C   s.   |  |}| ||}| jt|t dS )N)Zie)Z	_match_idZ_download_webpageZ
url_resultr   Z_extract_urlZie_key)rD   r   Zembed_idr*   r,   r,   r-   r     s    
zNexxEmbedIE._real_extractN)r   r   r   r   Z_EMBED_REGEXr   r   r,   r,   r,   r-   r     s0    r   )r   r   r'   r   commonr   utilsr   r   r   r   r	   r
   r   r   r   r,   r,   r,   r-   <module>   s   $   X