o
    iQ                     @   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/128907 31899fd683de49ad46f4ee67e53e83fe128907mp4zStiftung Warentestu   Wie ein Test abläuftz$md5:d1ddb1ef63de721132abd38639cc2fd2
SPIEGEL TVre:^https?://.*\.jpg$i	  i2R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/17018341701834u%   Mein Leben mit 'nem TikTok E-Boy 😤z$md5:f84f395a881fd143f952c892deab528di  i_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:1269984 d5f14e14b592501e51addd5abef95a7f1269984u"   1 TAG ohne KLO... wortwörtlich! ?z$md5:2016393a31991a900946432ccdd09a6fi_  i9Z20180214)	r   r   r   r   r   r   r   r   r   )r   r   r    znexx:747:1533779 6bf6883912b82b7069fb86c2297e98931533779z$Aufregung um ausgebrochene Raubtierez	Eifel-Zooz$md5:f21375c91c74ad741dcb164c427999d2o   i[20180601z1https://api.nexxcdn.com/v3/748/videos/byid/128907r   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 r8   I/home/ubuntu/.local/lib/python3.10/site-packages/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:   r3   findallappend)clsr   r6   entries	domain_idvideo_idr8   r8   r9   _extract_embed_urlst   s   
zNexxIE._extract_embed_urlsc                 C   sv   t |dtdr| d| j|d d  tt|dd pd}d|  kr+d	k r,d S  td| j|d d
 dd)N)metadatanoticeexpected_typez{} said: {}rC   rD   c                 S      | d d S )NrC   statusr8   xr8   r8   r9   <lambda>       z&NexxIE._handle_error.<locals>.<lambda>   i,  	errorhintT)expected)r	   strreport_warningformatIE_NAMEr   r
   r   )selfresponserH   r8   r8   r9   _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   rV   )rT   r@   pathrA   rY   rZ   r[   r8   r8   r9   	_call_api   s   
zNexxIE._call_apic              
      s  |d   d }|dksJ |d d }t  d } d dkr=d	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 }qi|d7 }n|	dkr|d}| }d| }}| d  }|d7 }|D ]Z}|d}t|d }| |d  |
| d}|d | | d| |d}|d d}t|dkr|t|d t|d d  || |d|d!   }||d 7 }q|d d
 d" |dd  }nJ |	dkr.|	| j
| d$ d%f || d&d#d' |	| j| d( d)f |d*d+| d,d#d- |S ).N
streamdatacdnTypefreegeneralhashoriginalDomainapplyFolderHierarchyr   z%04drW   r   r      _z	http://%sazureFileDistribution,cdnProviderc                    s    d dkrd|  S dS )NapplyAzureStructurer   rh    r8   )pstream_datar8   r9   p0   s   z(NexxIE._extract_free_formats.<locals>.p0ak:z.mp4.csmil/master.%scecdnPathHTTPz0/asset.ism/manifest.%s?dcp_ver=aos4&videostream=.mp4-http-r   	format_idtbrrJ   widthheight  z&audiostream=FcdnPathDASHmpd-dashmpd_idfatal
cdnPathHLSm3u8r   m3u8_native-hls)entry_protocolm3u8_idr   )rP   intsplitpopjoinlenupdater   r=   extend_extract_mpd_formats_extract_m3u8_formats)rT   videorA   cdn
video_hashpsstfdcdn_providerrq   formatsirn   kh	http_baserz   filenamefwidth_heightar8   ro   r9   _extract_free_formats   sn   $
"







 

zNexxIE._extract_free_formatsc                    sd  |d d }|dksJ d d d d f\}}}}t |dtd	 d, fdd	}| }	g }
|
| j|	 | d| d| d| ddpL| d|d| ddd |
| j|	 | d| d| d| d| d|| ddd |d}dpd
}|d}|D ]<}|d}t|dkrqt|d dd }|
	| | d!| d|d"  d#| d|d$  |rd| nd
 |d% qd&pd
}|d}|D ]X}|d}t|dkrqt|d$ }t|d d'd"kr|d d'nd(\}}| | d| d| d|d"  d)	| d*|rd| nd
 |t|t|d+}|
	| q|
S )-Nr_   r`   3qqAccountqPrefixqLocatorqHash)protectiondatakeyrE   rm   c                    sn   dD ]} d|  d|  }|rd| d|   S qd|  dkr'dnd d	 r4d
  d S d S )Nrm   r   	cdnShieldHTTPhttp://zhttp://sdn-global-prog	streamingz-cache.3qsdn.com/zs/rW   rm   )getupperlower)shield_typesecure
cdn_shieldprotection_keyrp   r8   r9   get_cdn_shield_base   s   2z7NexxIE._extract_3q_formats.<locals>.get_cdn_shield_basez/files/rW   -	qHEVCHashz.ism/manifest.m3u8r   r   Fr   r   z.ism/manifest.mpdr   r   ProgqReferencesrj   rs      r   r~   )scalez	/uploads/r   z.webmr   rx   ri   rJ   )NNrv   rw   )r   ry   rz   r|   r}   )rm   )
r	   rP   r   r   r   r   r   r   r   r=   )rT   r   rA   r   q_accq_prefix	q_locatorq_hashr   stream_baser   progressive_baseq_referencesfdsr   ssrz   azure_file_distributionr|   r}   r   r8   r   r9   _extract_3q_formats   s^   $.$

"


,"zNexxIE._extract_3q_formatsc              
      s  |d   d }|dksJ  d }d+ fdd	}|d	  d
p!d}| }d|v }d||||r2dndd }	t|dd t}
|
rH|	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 ]R}|d}t	|d krt
|d! }|r| | d"| d#|d$  d%| d&	| d'| |d(}|d$ d)}t	|d kr|t
|d! t
|d$ d* || q|S ),Nr_   r`   azureazureLocatorrm   Fc                    s   dD ]}  d|  d|  }|rd| d|   S qd d v r+|r(dnd	}n|r/d
nd}t d dddd}d||f S )Nr   r   r   r   r   fbazureAccountdfr   drn   nexxplayplusrm   
nexxplayfbzhttp://nx-%s%02d.akamaized.net/)r   r   r   replace)r   staticr   r   prefixaccountro   r8   r9   r     s   z:NexxIE._extract_azure_formats.<locals>.get_cdn_shield_baserb   language_rawrj   z{}{}/{}_src{}.ism/Manifest	_manifestz%sc                 S   rG   )Nr   tokenr8   rI   r8   r8   r9   rK   3  rL   z/NexxIE._extract_azure_formats.<locals>.<lambda>z?hdnts=z(format=m3u8-aapl)r   r   r   r   z(format=mpd-time-csf)r   r   z-mss)ism_idr   r   Tri   rs   r   r   rW   _src_r   rh   rv   rw   rx   rJ   r{   )rm   F)r   rR   r
   rP   r   r   r   _extract_ism_formatsr   r   r   r   r=   )rT   r   rA   r   azure_locatorr   languageazure_stream_baseis_mlazure_manifest_urlprotection_tokenr   azure_progressive_baser   r   r   r   rz   r   r   r8   ro   r9   _extract_azure_formats  sj   





"


zNexxIE._extract_azure_formatsc                    sT  |  |}|dp|d}|d d } fdd}| jd  d dd	}|r:t|tr:|d
}|r:||}|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| | }n|d/kr| | }n|d0kr| | }n	| | d1  i }|d2p	g D ]V}|d3r:||d4d5g d6d7d8d9 t|d3 D |d:p4|d+d; q
|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 )NNr@   domain_id_sr   c                    sJ   t | tr| S t | tr#t }| D ]}t|dd t|kr"|  S qd S )Nc                 S   rG   )Nrb   IDr8   rI   r8   r8   r9   rK   g  rL   z:NexxIE._real_extract.<locals>.find_video.<locals>.<lambda>)
isinstancedictlistr   r
   )r[   vidvrA   r8   r9   
find_videoa  s   

z(NexxIE._real_extract.<locals>.find_videoz!https://arc.nexx.cloud/api/video/z.jsonF)r   r[   r   rg   rs   i'  i 	   zsession/initrm   019201080z6.0.00html5zen-US1)nxp_devh	nxp_userhprecidplaylicensescreenxscreenyplayerversiongateway	adGatewayexplicitlanguageaddTextTemplatesaddDomainData
addAdModelzX-Request-Enable-Auth-FallbackrX   rb   ciddevicedomaintokenr   rf   byidzvideos/rW   zAlanguage,channel,format,licenseby,slug,fileversion,episode,seasonvttpersons)additionalfieldsaddInteractionOptionsaddStatusDetailsaddStreamDetailsaddFeaturesaddCaptions	addScenesaddChaptersaddHotSpotsaddConnectedMedia
addBumpers)zX-Request-CIDzX-Request-Tokenr   r_   r`   r   ra   r   z$ formats are currently not supportedcaptiondatarY   r   ensrtz

c              	   s   sN    | ]"\}}|d   dt |d d  dt |d d  d|d  V  qdS )r   
frommsr~   z --> tomscaptionN)r   ).0r   liner8   r8   r9   	<genexpr>  s
    8
z'NexxIE._real_extract.<locals>.<genexpr>language_long)r   rY   namer   rR   )r   r   r!  subtitler   yearstudiostudio_adrefc                 S   rG   )N	imagedatathumbr8   rI   r8   r8   r9   rK     rL   z&NexxIE._real_extract.<locals>.<lambda>runtimeuploaded)episodedatarb   r&   )rF   get_all)r*  r'   )connectedmedia.r   rE   )r   r   r   r   release_yearr   r   r   r   r$   r%   castr   	subtitles)_match_valid_urlr5   r\   r   r   r   randomrandintr   timer^   r   hashlibr   r   encode	hexdigestr   r   r   raise_no_formats
setdefaultr=   	enumerater   r
   rP   r   r	   )rT   r   r7   r@   r   r   rU   r[   	device_idr  secretoprequest_tokenrb   r   r   r   r0  subr8   r   r9   _real_extractZ  s   




8



zNexxIE._real_extract)__name__
__module____qualname__
_VALID_URL_TESTSstaticmethodr:   classmethodrB   rV   r^   r   r   r   r@  r8   r8   r8   r9   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=1 16746bfc28c42049492385c989b26c4a161464r   zNervenkitzel AchterbahnzKarussellbauer in Deutschlandz$md5:ffe7b1cc59a01f585e0569949aef73ccr   r   i
  igS20140305r   r(   T)r   r   r    r)   z3https://embed.nexx.cloud/11888/video/DSRTO7UVOX06S7r1   c                 C   s.   |  |}| ||}| jt|t dS )N)ie)	_match_id_download_webpage
url_resultr   _extract_urlie_key)rT   r   embed_idr6   r8   r8   r9   r@    s   
zNexxEmbedIE._real_extractN)rA  rB  rC  rD  _EMBED_REGEXrE  r@  r8   r8   r8   r9   rH    s0    rH  )r5  r2  r3   r4  commonr   utilsr   r   r   r   r	   r
   r   r   rH  r8   r8   r8   r9   <module>   s    $   X