o
    Ikct                     @   s   d Z ddl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	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ eeZeed	eed
eje
ddeddG dd de	ZeZdS )z
$description Global live streaming and video on-demand hosting platform.
$url ott.streann.com
$url centroecuador.ec
$url columnaestilos.com
$url evtv.online/noticias-de-venezuela
$url telecuracao.com
$type live, vod
    N)urlparse)Pluginpluginargumentpluginmatcher)validate)	HLSStream)decrypt_openssl)	parse_qsdz=https?://ott\.streann\.com/s(?:treaming|-secure)/player\.htmlz
    https?://(?:www\.)?(?:
        centroecuador\.ec
        |
        columnaestilos\.com
        |
        crc\.cr/estaciones/
        |
        evtv\.online/noticias-de-venezuela/
        |
        telecuracao\.com
    )
urlURLzXSource URL where the iframe is located, only required for direct URLs of ott.streann.com)metavartypehelpc                   @   sj   e Zd ZdZed Zed Zed ZedZ	dZ
dZedd Zed	d
 Zdd Zdd Zdd ZdS )Streannzhttps://ott.streann.comz$/web/services/public/get-server-timezN/loadbalancer/services/web-players/{playerId}/token/{type}/{dataId}/{deviceId}z/loadbalancer/services/web-players/{type}s-reseller-secure/{dataId}/{playerId}/{token}/{resellerId}/playlist.m3u8?date={time}&device-type=web&device-name=web&device-os=web&device-id={deviceId}zJCryptoJS\.AES\.decrypt\(.*?,\s*(['"])(?P<passphrase>(?:(?!\1).)*)\1\s*?\);Nc                 C   s*   | j du rddd tdD | _ | j S )z?
        Randomly generated deviceId.
        :return:
        N c                 s   s    | ]}t d V  qdS )>0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZN)randomchoice).0_ r   </usr/lib/python3/dist-packages/streamlink/plugins/streann.py	<genexpr>D   s    

z$Streann.device_id.<locals>.<genexpr>2   )
_device_idjoinrange)selfr   r   r   	device_id=   s
   


zStreann.device_idc                 C   s:   | j j| j}| j j|}t|dtt d S )N
serverTimei  )sessionhttpgetget_time_urljsonstrinttime)r   resdatar   r   r   r'   H   s   zStreann.timec                 C   s<   t d | jj| j}| j|j}|o|	d
dS )N
passphraseutf8)logdebugr    r!   r"   r
   passphrase_researchtextgroupencode)r   r(   passphrase_mr   r   r   r*   N   s   
zStreann.passphrasec                 K   s  t d tt| jdt| jdd}| jddd}| j	j
j| jjdd| ji|||d}|jd	krDt d
| j  d S | j	j
j|tdttdttdtdttdttdttdtgiid}t | |d| _|d S )N	get_tokenr+   )arg1arg2XMLHttpRequestz!application/x-www-form-urlencoded)RefererzX-Requested-WithzContent-TypedeviceId)r)   headers   z self._domain might be invalid - tokenname	webPlayeridr   allowedDomainsschemar   )r,   r-   dictbase64	b64encode_domainr2   r'   r
   r    r!   post	token_urlformatr   status_codeerrorr$   r   Schemar%   optionaltracer"   title)r   configpdatar:   r(   r)   r   r   r   r4   T   s:   







zStreann.get_tokenc           	   
   C   sn  | j d s7t| jj| _| jjj| jt	t
 tdtdd d}|s.td d S |d jd| _| jsH| drHt| dj| _| jd u rTtd	 d S | jjjd
| ji t| jj}t|}|  }|rtd t||}t|d}td| | jdi |}|sd S | jjd| j| j |d|}td| t!j"| j|ddS d S )Nr   z.//iframe[@src]c                 S   s   t | jdjdkS )Nsrczott.streann.com)r   attribr"   netloc)elemr   r   r   <lambda>}   s    z&Streann._get_streams.<locals>.<lambda>rA   z'Could not find 'ott.streann.com' iframerR   r
   z%Missing source URL, use --streann-urlr8   zFound passphraser+   zconfig: )r'   r9   r<   zURL={0})   i  i  i  )acceptable_statusr   )#matchesr   r
   rT   rF   r    r!   r"   r   rL   
parse_htmlxml_findallfilterr,   rK   rS   
get_optionr:   updatequeryrD   	b64decoder*   r-   r   r	   decoderN   r4   
stream_urlrI   r'   r   r   parse_variant_playlist)	r   iframesencrypted_datar)   r*   paramsrP   r<   hls_urlr   r   r   _get_streamsw   sP   






zStreann._get_streams)__name__
__module____qualname__base_urlr#   rH   rb   recompiler.   r   rF   propertyr   r'   r*   r4   rh   r   r   r   r   r      s    



#r   )__doc__rD   loggingr   rm   r'   urllib.parser   streamlink.pluginr   r   r   streamlink.plugin.apir   streamlink.stream.hlsr   streamlink.utils.cryptor   streamlink.utils.parser	   	getLoggerri   r,   rn   VERBOSEr%   r   
__plugin__r   r   r   r   <module>   s6    

r