§
   \ŽIÜ"½Ó°ã                   ó   — d Z ddlZddlZddlZddlZddlmZmZ dZdZ	dZ
 ej        ¦   «         Zej                             e
ddœ¦  «         dadaej        fd	„Zd
„ Zdd„Zdd„Zdd„Zdd„Zdd„Zd„ Zd d„Zd d„Zd„ Zdd„Zd!d„Zd„ Zd„ Z dS )"uý   
Stream Cinema API client pro MilionÃ¡Å™ addon.
Poskytuje vyhledÃ¡vÃ¡nÃ­ filmÅ¯/seriÃ¡lÅ¯ a zÃ­skÃ¡nÃ­ ident pro KRA.sk resolve.

Flow:
1. KRA.sk login â†’ session_id
2. SC /auth/token?krt=session_id â†’ auth_token
3. SC API calls s X-AUTH-TOKEN header
é    N)Ú	urlencodeÚquotez!https://stream-cinema.online/kodiz2.0zMilionar/1.0 (Kodi)zapplication/json)ú
User-AgentzContent-Typec                 ó8   — t          j        d| › �|¬¦  «         dS )u   LogovÃ¡nÃ­ s prefixem.z"[plugin.video.milionar] SCClient: ©ÚlevelN)ÚxbmcÚlog)Úmsgr   s     úg/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/streamcinema/SCClient.pyÚ_logr   "   s&   € å„HÐ7°#Ð7Ð7¸uÐEÑEÔEÐEÐEÐEó    c                  ó^   — t           € t          t          j        ¦   «         ¦  «        a t           S )u/   ZÃ­skÃ¡ nebo vytvoÅ™Ã­ UUID pro tuto instalaci.)Ú_uuidÚstrÚuuidÚuuid4© r   r   Ú	_get_uuidr   '   s!   € õ €}Ý•D”J‘L”LÑ!Ô!ˆÝ€Lr   c                 ó°   — t           | z   }t          t          ¦   «         dddddœ}i |¥}|r|                     |¦  «         t	          |¦  «        }|› d|› �}|S )uÄ   
    SestavÃ­ URL pro SC API volÃ¡nÃ­.
    
    Args:
        path: API cesta (napÅ™. '/Search/search-movies')
        params: dict s parametry
    
    Returns:
        KompletnÃ­ URL string
    ÚmilionarÚCSÚ1Ú0)ÚverÚuidÚskinÚlangÚHDRÚDVú?)ÚBASE_URLÚAPI_VERSIONr   Úupdater   )ÚpathÚparamsÚurlÚdefault_paramsÚ
all_paramsÚquery_strings         r   Ú
_build_urlr+   /   s~   € õ �T‰/€Cõ Ý‰{Œ{ØØØØðð €Nð $�NÐ#€JØð "Ø×Ò˜&Ñ!Ô!Ð!å˜ZÑ(Ô(€LØÐ
!Ð
!�<Ð
!Ð
!€Cà€Jr   c                 ó@   — t           t          ¦   «         dœ}| r| |d<   |S )u   VrÃ¡tÃ­ headers s auth tokenem.)r   zX-UuidzX-AUTH-TOKEN)ÚUAr   )Ú
auth_tokenÚheaderss     r   Ú_get_headersr0   Q   s3   € õ Ý‘+”+ðð €Gð ð -Ø",ˆ�ÑØ€Nr   c                 ó`  — t          | |¦  «        }t          |¦  «        }	 t          d| › �¦  «         t                               ||d¬¦  «        }|                     ¦   «          |                     ¦   «         }|S # t          $ r)}t          d|› �t          j	        ¬¦  «         Y d}~dS d}~ww xY w)uÝ   
    GET request na Stream Cinema API.
    
    Args:
        path: API cesta
        params: dict s query parametry
        auth_token: SC auth token
    
    Returns:
        dict s odpovÄ›dÃ­ nebo None pÅ™i chybÄ›
    z	API GET: é   )r/   ÚtimeoutúAPI error: r   N)
r+   r0   r   Ú_sessionÚgetÚraise_for_statusÚjsonÚ	Exceptionr	   ÚLOGERROR)r%   r&   r.   r'   r/   ÚresponseÚdataÚes           r   Ú_api_getr>   \   sÁ   € õ �T˜6Ñ
"Ô
"€CÝ˜:Ñ&Ô&€GðÝÐ˜ÐÐÑ Ô Ð Ý—<’< ¨W¸b�<ÑAÔAˆØ×!Ò!Ñ#Ô#Ð#Ø�}Š}‰ŒˆØˆøÝð ð ð ÝÐ˜1ÐÐ¥d¤mÐ4Ñ4Ô4Ð4Øˆtˆtˆtˆtˆtøøøøðøøøs   ¡AA: Á:
B-ÂB(Â(B-c                 ó^  — t          | |¦  «        }t          |¦  «        }	 t          d| › �¦  «         t                               |||d¬¦  «        }|                     ¦   «          |                     ¦   «         S # t          $ r)}t          d|› �t          j	        ¬¦  «         Y d}~dS d}~ww xY w)uý   
    POST request na Stream Cinema API.
    
    Args:
        path: API cesta
        params: dict s query parametry
        data: dict s body daty
        auth_token: SC auth token
    
    Returns:
        dict s odpovÄ›dÃ­ nebo None pÅ™i chybÄ›
    z
API POST: r2   )r/   r8   r3   r4   r   N)
r+   r0   r   r5   Úpostr7   r8   r9   r	   r:   )r%   r&   r<   r.   r'   r/   r;   r=   s           r   Ú	_api_postrA   v   s¿   € õ �T˜6Ñ
"Ô
"€CÝ˜:Ñ&Ô&€GðÝÐ ˜$Ð Ð Ñ!Ô!Ð!Ý—=’= ¨g¸DÈ"�=ÑMÔMˆØ×!Ò!Ñ#Ô#Ð#Ø�}Š}‰ŒÐøÝð ð ð ÝÐ˜1ÐÐ¥d¤mÐ4Ñ4Ô4Ð4Øˆtˆtˆtˆtˆtøøøøðøøøs   ¡AA9 Á9
B,ÂB'Â'B,Fc                 óÐ  — |s|                       d¦  «        }|r|a|S |st          dt          j        ¬¦  «         dS t          d|dd…         › d�¦  «         t          dd	|i¬
¦  «        }|rAd|v r=|d         }|                      d|¦  «         |at          d|dd…         › d�¦  «         |S |r|                     dd¦  «        nd}t          d|› �t          j        ¬¦  «         dS )u  
    ZÃ­skÃ¡ Stream Cinema auth token pomocÃ­ KRA.sk session.
    
    Args:
        addon: xbmcaddon instance
        kraska_session_id: session_id z KRA.sk loginu
        force_refresh: vynutit novÃ½ token
    
    Returns:
        SC auth token nebo None
    Úsc_auth_tokenz+Cannot get SC auth token: no KRA.sk sessionr   Nz,Fetching SC auth token with KRA.sk session: é   z...z/auth/tokenÚkrt)r&   ÚtokenzSC auth token obtained: ÚerrorzUnknown errorzConnection failedzFailed to get SC auth token: )	Ú
getSettingÚ_auth_token_cacher   r	   Ú
LOGWARNINGrA   Ú
setSettingr6   r:   )ÚaddonÚkraska_session_idÚforce_refreshÚcachedr;   rF   rG   s          r   Úget_auth_tokenrP   �   s3  € ð ð Ø×!Ò! /Ñ2Ô2ˆØð 	Ø &ÐØˆMàð ÝÐ:Å$Ä/ÐRÑRÔRÐRØˆtåÐ	RÐ8IÈ"È1È"Ô8MÐ	RÐ	RÐ	RÑSÔSÐSõ ˜°Ð7HÐ/IÐJÑJÔJ€Hàð �G˜xÐ'Ð'Ø˜Ô!ˆØ×Ò˜¨%Ñ0Ô0Ð0Ø!ÐÝÐ6¨¨b¨q¨b¬	Ð6Ð6Ð6Ñ7Ô7Ð7Øˆà6>ÐWˆH�LŠL˜ /Ñ2Ô2Ð2ÐDW€EÝÐ	0¨Ð	0Ð	0½¼ÐFÑFÔFÐFØˆ4r   c                 óJ   — |                       d¦  «        }t          |¦  «        S )u-   Zkontroluje, zda mÃ¡me platnÃ½ SC auth token.rC   )rH   Úbool)rL   rF   s     r   Úis_authenticatedrS   º   s!   € à×Ò˜_Ñ-Ô-€EÝ�‰;Œ;Ðr   é2   c                 ó   — |                      d¦  «        }|st          dt          j        ¬¦  «         g S t          d| › �¦  «         | ddœ}t	          d||¬¦  «        }|r.d	|v r*|d	         }t          d
t          |¦  «        › d�¦  «         |S g S )uá   
    VyhledÃ¡vÃ¡nÃ­ filmÅ¯ pÅ™es Stream Cinema.
    
    Args:
        query: hledanÃ½ text
        addon: xbmcaddon instance
        limit: max poÄ�et vÃ½sledkÅ¯
    
    Returns:
        list filmÅ¯ nebo prÃ¡zdnÃ½ list
    rC   úSearch failed: no auth tokenr   zSearching movies: r   )ÚsearchÚmsz/Search/search-movies©r&   r.   ÚmenuúFound z movies©rH   r   r	   rJ   r>   Úlen)ÚqueryrL   ÚlimitrF   r&   r;   Úitemss          r   Úsearch_moviesra   À   sÂ   € ð ×Ò˜_Ñ-Ô-€EØð ÝÐ+µ4´?ÐCÑCÔCÐCØˆ	åÐ	%˜eÐ	%Ð	%Ñ&Ô&Ð&ð Øðð €Fõ
 Ð/¸È5ÐQÑQÔQ€Hàð �F˜hÐ&Ð&Ø˜Ô ˆÝÐ)•c˜%‘j”jÐ)Ð)Ð)Ñ*Ô*Ð*Øˆà€Ir   c                 ó<  — |                      d¦  «        }|st          dt          j        ¬¦  «         g S t          d| › �¦  «         | dddœ}t	          d||¬	¦  «        }t          d
|r!t          |                     ¦   «         ¦  «        nd› �¦  «         |r.d|v r*|d         }t          dt          |¦  «        › d�¦  «         |S |rd|v r
|d         }|S |rF|                     ¦   «         D ]1\  }}t          |t
          ¦  «        rt          |¦  «        dk    r|c S Œ2g S )uç   
    VyhledÃ¡vÃ¡nÃ­ seriÃ¡lÅ¯ pÅ™es Stream Cinema.
    
    Args:
        query: hledanÃ½ text
        addon: xbmcaddon instance
        limit: max poÄ�et vÃ½sledkÅ¯
    
    Returns:
        list seriÃ¡lÅ¯ nebo prÃ¡zdnÃ½ list
    rC   rV   r   zSearching series: r   Ú2)rW   rX   Útypz/Search/search-seriesrY   u&   ðŸ”� search_series raw response keys: ÚNonerZ   r[   z seriesr`   r   )
rH   r   r	   rJ   r>   ÚlistÚkeysr]   r`   Ú
isinstance)	r^   rL   r_   rF   r&   r;   r`   ÚkeyÚvals	            r   Úsearch_seriesrk   â   si  € ð ×Ò˜_Ñ-Ô-€EØð ÝÐ+µ4´?ÐCÑCÔCÐCØˆ	åÐ	%˜eÐ	%Ð	%Ñ&Ô&Ð&ð ØØðð €Fõ Ð/¸È5ÐQÑQÔQ€Hõ 	Ð	aÈ8Ð2_µ$°x·}²}±´Ñ2GÔ2GÐ2GÐY_Ð	aÐ	aÑbÔbÐbàð 
�F˜hÐ&Ð&Ø˜Ô ˆÝÐ)•c˜%‘j”jÐ)Ð)Ð)Ñ*Ô*Ð*ØˆØ	ð �g Ð)Ð)Ø˜Ô!ˆØˆØ	ð Ø ŸšÑ(Ô(ð 	ð 	‰HˆC�Ý˜#�tÑ$Ô$ð ­¨S©¬°Aª¨Ø�
�
�
øà€Ir   c                 ó  — |                      d¦  «        }|st          dt          j        ¬¦  «         g S t          d| › �¦  «         t	          | i |¬¦  «        }|r.d|v r*|d         }t          dt          |¦  «        › d�¦  «         |S g S )	uÜ   
    ZÃ­skÃ¡ seznam streamÅ¯ pro danÃ½ film/epizodu.
    
    Args:
        play_path: cesta k pÅ™ehrÃ¡nÃ­ (z menu itemu)
        addon: xbmcaddon instance
    
    Returns:
        list streamÅ¯ nebo prÃ¡zdnÃ½ list
    rC   z!Get streams failed: no auth tokenr   zGetting streams for: rY   Ústrmsr[   z streamsr\   )Ú	play_pathrL   rF   r;   Ústreamss        r   Úget_streamsrp     s¯   € ð ×Ò˜_Ñ-Ô-€EØð ÝÐ0½¼ÐHÑHÔHÐHØˆ	åÐ	, Ð	,Ð	,Ñ-Ô-Ð-õ ˜	¨"¸Ð?Ñ?Ô?€Hàð �G˜xÐ'Ð'Ø˜7Ô#ˆÝÐ,•c˜'‘l”lÐ,Ð,Ð,Ñ-Ô-Ð-Øˆð €Ir   c                 ó>  — |                      d¦  «        }|st          dt          j        ¬¦  «         dS |pi }t          d| › �¦  «         t	          | ||¬¦  «        }|r d|v r|d         }t          d|› �¦  «         |S t          d	|› �t          j        ¬¦  «         dS )
u  
    ZÃ­skÃ¡ ident pro KRA.sk resolve.
    
    Args:
        provider_path: cesta k provider endpointu (z stream.url)
        addon: xbmcaddon instance
        stream_prefs: volitelnÃ© preference streamu
    
    Returns:
        ident string nebo None
    rC   zGet ident failed: no auth tokenr   NzGetting ident from: rY   ÚidentzGot ident: zNo ident in response: )rH   r   r	   rJ   r>   )Úprovider_pathrL   Ústream_prefsrF   r&   r;   rr   s          r   Ú	get_identru   -  sÊ   € ð ×Ò˜_Ñ-Ô-€EØð ÝÐ.µd´oÐFÑFÔFÐFØˆtàÐ˜R€FåÐ	/ Ð	/Ð	/Ñ0Ô0Ð0å˜¨fÀÐGÑGÔG€Hàð �G˜xÐ'Ð'Ø˜Ô!ˆÝÐ"˜5Ð"Ð"Ñ#Ô#Ð#ØˆåÐ	, (Ð	,Ð	,µD´OÐDÑDÔDÐDØˆ4r   Ú1080pÚCZc                 ó¦   ‡— | sdS t          | d„ d¬¦  «        }d„ |D ¦   «         }|r ˆfd„|D ¦   «         }|r|d         S |d         S |r|d         ndS )u  
    Vybere nejlepÅ¡Ã­ stream podle preferencÃ­.
    
    Args:
        streams: list streamÅ¯ z get_streams()
        prefer_quality: preferovanÃ¡ kvalita
        prefer_lang: preferovanÃ½ jazyk
    
    Returns:
        NejlepÅ¡Ã­ stream dict nebo None
    Nc                 ó.   — |                       dd¦  «        S )NÚbitrater   )r6   )Úss    r   ú<lambda>z$select_best_stream.<locals>.<lambda>]  s   € °1·5²5¸ÀAÑ3FÔ3F€ r   T)ri   Úreversec                 ój   — g | ]0}|                      d d¦  «                             ¦   «         dk    ¯.|‘Œ1S )ÚproviderÚ Úkraska)r6   Úlower)Ú.0r{   s     r   ú
<listcomp>z&select_best_stream.<locals>.<listcomp>`  s=   € Ð]Ð]Ð]˜A°1·5²5¸ÀRÑ3HÔ3H×3NÒ3NÑ3PÔ3PÐT\Ò3\Ð3\�aÐ3\Ð3\Ð3\r   c                 ó�   •— g | ]B}|                      d d¦  «                             ¦   «         ‰                     ¦   «         k    ¯@|‘ŒCS )r   r€   )r6   Úupper)rƒ   r{   Úprefer_langs     €r   r„   z&select_best_stream.<locals>.<listcomp>d  sJ   ø€ ÐdÐdÐd˜A°1·5²5¸ÀÑ3DÔ3D×3JÒ3JÑ3LÔ3LÐP[×PaÒPaÑPcÔPcÒ3cÐ3c�aÐ3cÐ3cÐ3cr   r   )Úsorted)ro   Úprefer_qualityr‡   Úsorted_streamsÚkraska_streamsÚ
lang_matchs     `   r   Úselect_best_streamr�   M  s˜   ø€ ð ð Øˆtõ ˜GÐ)FÐ)FÐPTÐUÑUÔU€Nð ^Ð] Ð]Ñ]Ô]€Nàð !àdÐdÐdÐd ÐdÑdÔdˆ
Øð 	!Ø˜a”=Ð Ø˜aÔ Ð ð !/Ð8ˆ>˜!ÔÐ°DÐ8r   c                 ó¶  — |                       dd¦  «                             ¦   «         }|dk    r|                       d¦  «        }|st          dt          j        ¬¦  «         dS t          ||¦  «        }|st          dt          j        ¬¦  «         dS d	d
lm} | 	                    ||¦  «        S |                       d¦  «        }|rt          d|› �¦  «         |S dS )uÌ   
    KompletnÃ­ resolve streamu na finÃ¡lnÃ­ URL.
    
    Args:
        stream: stream dict z get_streams()
        addon: xbmcaddon instance
    
    Returns:
        FinÃ¡lnÃ­ stream URL nebo None
    r   r€   r�   r'   zStream has no provider pathr   NzFailed to get identr   )ÚKraskaClientzDirect stream URL: )
r6   r‚   r   r	   rJ   ru   r:   Ú
wcs.kraskar�   Úresolve)ÚstreamrL   r   rs   rr   r�   r'   s          r   Úresolve_streamr“   m  sü   € ð �zŠz˜* bÑ)Ô)×/Ò/Ñ1Ô1€Hà�8ÒÐàŸ
š
 5Ñ)Ô)ˆØð 	ÝÐ.µd´oÐFÑFÔFÐFØ�4õ ˜-¨Ñ/Ô/ˆØð 	ÝÐ&­d¬mÐ<Ñ<Ô<Ð<Ø�4ð 	,Ð+Ð+Ð+Ð+Ð+Ø×#Ò# E¨5Ñ1Ô1Ð1ð �jŠj˜ÑÔˆØð 	ÝÐ, sÐ,Ð,Ñ-Ô-Ð-ØˆJàˆ4r   c                 óT   — |                       dd¦  «         dat          d¦  «         dS )u    VymaÅ¾e uloÅ¾enÃ½ SC auth token.rC   r€   NzSC auth token cleared)rK   rI   r   )rL   s    r   Ú
clear_authr•   •  s3   € à	×Ò�_ bÑ)Ô)Ð)àÐÝÐ	 Ñ!Ô!Ð!Ð!Ð!r   )N)NN)NNN)F)rT   )rv   rw   )!Ú__doc__Úrequestsr	   Úxbmcguir   Úurllib.parser   r   r"   r#   r-   ÚSessionr5   r/   r$   rI   r   ÚLOGINFOr   r   r+   r0   r>   rA   rP   rS   ra   rk   rp   ru   r�   r“   r•   r   r   r   ú<module>rœ      sÕ  ððð ð €€€Ø €€€Ø €€€Ø €€€Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )ð /€Ø€Ø€àˆ8ÔÑÔ€Ø Ô × Ò ØØ&ðð ñ ô ð ð Ð Ø€ð ”Lð Fð Fð Fð Fð
ð ð ðð ð ð ðDð ð ð ðð ð ð ð4ð ð ð ð4'ð 'ð 'ð 'ðTð ð ðð ð ð ðD*ð *ð *ð *ðZð ð ð<ð ð ð ð@9ð 9ð 9ð 9ð@%ð %ð %ðP"ð "ð "ð "ð "r   