U
    $PfB                     @   s   d dl m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	 ddl
mZmZmZmZmZ G dd	 d	eZG d
d deZdS )    )unicode_literalsN   )InfoExtractor   )
compat_str)ExtractorErrorint_or_noneparse_duration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i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d0dd1d2dd1d3dd1d4dd1gZed5d6 Zed7d8 Zed9d: Zd;d< Z	d=i fd>d?Z
d@dA ZdBdC ZdDdE Zd=S )FNexxIEaX  (?x)
                        (?:
                            https?://api\.nexx(?:\.cloud|cdn\.com)/v3/(?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_date)urlmd5	info_dictz0https://api.nexx.cloud/v3/741/videos/byid/247858Z247858zReturn of the Golden Child (OV)z$md5:5d969537509a92b733de21bae249dc63i  iu  ieYZ20170517r   )r   r   r   r   release_yearr   r   r   r   episode_numberseason_numberskip_downloadTzHTTP Error 404: Not Found)r   r   paramsskipznexx:741:1269984Z c714b5b238b2958dc8d5642addba6886Z1269984u%   1 TAG ohne KLO... wortwörtlich! 😑i_  i9ZZ20180214)r   r   r   r   r   r   r   r   znexx:747:1533779Z 6bf6883912b82b7069fb86c2297e9893Z1533779z$Aufregung um ausgebrochene Raubtierez	Eifel-Zooz$md5:f21375c91c74ad741dcb164c427999d2o   i[Z20180601)	r   r   r   r   r   r   r   r   r   z1https://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+   =/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/extractor/nexx.py_extract_domain_idl   s
    zNexxIE._extract_domain_idc                 C   s:   g }t | }|r6td| D ]}|d||f  q|S )NzT(?is)onPLAYReady.+?_play\.(?:init|(?:control\.)?addPlayer)\s*\(.+?\s*,\s*["\']?(\d+)z+https://api.nexx.cloud/v3/%s/videos/byid/%s)r   r-   r&   findallappend)r)   entries	domain_idvideo_idr+   r+   r,   _extract_urlss   s    
zNexxIE._extract_urlsc                 C   s   t | d S )Nr   )r   r3   r)   r+   r+   r,   _extract_url   s    zNexxIE._extract_urlc                 C   sT   t t|dd pd}d|  kr*dk r2n nd S td| j|d d f dd	d S )
Nc                 S   s   | d d S )Nmetadatastatusr+   xr+   r+   r,   <lambda>       z&NexxIE._handle_error.<locals>.<lambda>   i,  z%s said: %sr6   Z	errorhintT)expected)r   r
   r   ZIE_NAME)selfresponser7   r+   r+   r,   _handle_error   s     zNexxIE._handle_errorNc                 C   s>   d|d< | j d||f |d| t||d}| | |d S )Nz0application/x-www-form-urlencoded; charset=UTF-8zContent-Typezhttps://api.nexx.cloud/v3/%s/%szDownloading %s JSONdataheadersresult)_download_jsonr   r@   )r>   r1   pathr2   rB   rC   rD   r+   r+   r,   	_call_api   s    
  
zNexxIE._call_apic              
      s  |d   d }|dkst |d d }t d } d dkrvd	t| d d d
 }|d|dd |dd f 7 }|d||f 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 |
|f }|d | d||f |d}|d d }t|dkr|t|d t|d d! |	| |d"|d#   }||d 7 }qH|d d
 d$ |dd  }n
d%s$t |	dkrV|
| j| d& d'f |d(| d%d) |
| j| d* d+f |d,d-d.| d%d/ |S )0N
streamdatacdnTypefreegeneralhashZoriginalDomainZapplyFolderHierarchyr   z%04dz/%s/%sr   r      z/%s/%s_z	http://%sazureFileDistribution,ZcdnProviderc                    s    d dkrd|  S dS )NZapplyAzureStructurer   z_%s r+   )pZstream_datar+   r,   p0   s    z(NexxIE._extract_free_formats.<locals>.p0Zak:z.mp4.csmil/master.%sZce/ZcdnPathHTTPz0/asset.ism/manifest.%s?dcp_ver=aos4&videostream=z
%s%s%s.mp4
%s-http-%dr   Z	format_idtbrr9   widthheightz:%si  z&audiostream=FZcdnPathDASHZmpd%s-dashZmpd_idfatalZ
cdnPathHLSZm3u8r   m3u8_native%s-hls)Zentry_protocolm3u8_idr_   )AssertionErrorr   intsplitpopjoinlenupdater   r/   extend_extract_mpd_formats_extract_m3u8_formats)r>   videor2   cdnrL   ZpsstfdZcdn_providerrT   formatsirR   khZ	http_baserY   filenamefwidth_heightar+   rS   r,   _extract_free_formats   sz     

"







 

      zNexxIE._extract_free_formatsc                    s  |d   d }|dkst  d }d( fdd	}|d	 d
pBd}| }d|k}d||||rbdndf 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# |f d$||f |d%}|d# d&}t	|d kr|t
|d! t
|d# d' || q|S ))NrH   rI   azureZazureLocatorrQ   Fc                    s   dD ].}  d| | f }|rd||f   S qd d krN|rHdnd}n|rVdnd	}t d d
ddd}d||f S )N)rQ   ro   zcdnShield%sHTTP%szhttp%s://%sZfbZazureAccountZdfrw   drR   ZnexxplayplusrQ   Z
nexxplayfbzhttp://nx-%s%02d.akamaized.net/)getupperrd   replace)Zshield_typeZstaticsecureZ
cdn_shieldprefixaccountrS   r+   r,   get_cdn_shield_base   s    z:NexxIE._extract_azure_formats.<locals>.get_cdn_shield_baserK   Zlanguage_rawrP   z%s%s/%s_src%s.ism/ManifestZ	_manifestz%sc                 S   s   | d d S )NZprotectiondatatokenr+   r8   r+   r+   r,   r:      r;   z/NexxIE._extract_azure_formats.<locals>.<lambda>z	?hdnts=%sz(format=m3u8-aapl)r   r`   ra   )rb   r_   z(format=mpd-time-csf)r]   r^   z%s-mss)Zism_idr_   ZProgTrO   rU   r   r   z%s%s/%s_src_%s_%d.mp4r   rW   rX   r9   rZ   )rQ   F)rc   r}   r
   r   rl   rj   rk   Z_extract_ism_formatsre   rh   r   ri   r/   )r>   rm   r2   rn   Zazure_locatorr   languageZazure_stream_baseZis_mlZazure_manifest_urlZprotection_tokenrr   Zazure_progressive_baseZazure_file_distributionZfdsrq   ssrY   rw   rx   r+   rS   r,   _extract_azure_formats   s       
          



    


zNexxIE._extract_azure_formatsc                    sf  t | j|}|dp |d}|d d } fdd}| jd   dd}|rtt|trt|d	}|rt||}|sd
t	ddt
t t	ddt	ddf }| 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d# }| j|d$| f  d%dddddddd&d'	|	|d(d}||}|d }|d) }|d* d+ }|d,kr| | }n"|d-kr| | }n
dst| |  ||d.|d/t|d0|d1p|d2t|d3d4 tt|d5t|d6tt|d7d4 tt|d8d4 |d9S ):Nr1   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 )NrK   ZIDr+   r8   r+   r+   r,   r:   0  r;   z:NexxIE._real_extract.<locals>.find_video.<locals>.<lambda>)
isinstancedictlistrd   r
   )rD   Zvidvr2   r+   r,   
find_video*  s    


z(NexxIE._real_extract.<locals>.find_videoz(https://arc.nexx.cloud/api/video/%s.jsonF)r_   rD   z
%d:%d:%d%dr   rN   g     @i 	   zsession/initrQ   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-FallbackrA   rK   cidZdeviceZclienttokenr   rM   Zbyidzutf-8zvideos/%s/%szIlanguage,channel,actors,studio,licenseby,slug,subtitle,teaser,descriptionrB   )	ZadditionalfieldsZaddInteractionOptionsZaddStatusDetailsZaddStreamDetailsZaddCaptionsZ	addScenesZaddHotSpotsZ
addBumpersZcaptionFormat)zX-Request-CIDzX-Request-Tokenr   rH   rI   r{   rJ   Zsubtitler   yearZstudioZstudio_adrefc                 S   s   | d d S )NZ	imagedataZthumbr+   r8   r+   r+   r,   r:     r;   z&NexxIE._real_extract.<locals>.<lambda>ZruntimeZuploadedc                 S   s   | d d S )NepisodedataZepisoder+   r8   r+   r+   r,   r:     r;   c                 S   s   | d d S )Nr   Zseasonr+   r8   r+   r+   r,   r:     r;   )r   r   r   r   r   r   r   r   r   r   r    rr   )r&   match
_VALID_URLr(   rE   r   r   r}   randomrandintrd   timerG   rh   hashlibr   rg   encode	hexdigestr   rz   rc   Z_sort_formatsr   r
   r   r	   )r>   r   r*   r1   rm   r   r?   rD   Z	device_idr   secretopZrequest_tokenrK   r   rn   rr   r+   r   r,   _real_extract#  s    

 

 

 

 
 
 



    zNexxIE._real_extract)__name__
__module____qualname__r   _TESTSstaticmethodr-   r3   r5   r@   rG   rz   r   r   r+   r+   r+   r,   r      s   
 O


		ADr   c                   @   sX   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gZedd Zdd ZdS )NexxEmbedIEzHhttps?://embed\.nexx(?:\.cloud|cdn\.com)/\d+/(?:video/)?(?P<id>[^/?#&]+)z6http://embed.nexx.cloud/748/KC1614647Z27Y7T?autoplay=1Z 16746bfc28c42049492385c989b26c4aZ161464r   zNervenkitzel AchterbahnzKarussellbauer in Deutschlandz$md5:ffe7b1cc59a01f585e0569949aef73ccr   r   i
  igSZ20140305r   Z	bestvideoT)formatr!   )r   r   r   r"   z3https://embed.nexx.cloud/11888/video/DSRTO7UVOX06S7r%   c                 C   s   dd t d| D S )Nc                 S   s   g | ]}| d qS )r   )r(   ).0r*   r+   r+   r,   
<listcomp>  s     z-NexxEmbedIE._extract_urls.<locals>.<listcomp>zb<iframe[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?//embed\.nexx(?:\.cloud|cdn\.com)/\d+/(?:(?!\1).)+)\1)r&   finditerr4   r+   r+   r,   r3     s    
zNexxEmbedIE._extract_urlsc                 C   s.   |  |}| ||}| jt|t dS )N)Zie)Z	_match_idZ_download_webpageZ
url_resultr   r5   Zie_key)r>   r   Zembed_idr)   r+   r+   r,   r     s    
zNexxEmbedIE._real_extractN)r   r   r   r   r   r   r3   r   r+   r+   r+   r,   r     s2   
	r   )
__future__r   r   r   r&   r   commonr   compatr   utilsr   r   r	   r
   r   r   r   r+   r+   r+   r,   <module>   s   	   