§
   G”™Šæ·ã                   óÜ   — d Z ddlZddlmc mZ ddlZddlmZ dZ	dZ
de
z  Zde
z  Ze
dz  Zd	Zd
d
dddœZdZ G d„ de¦  «        Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zdd„Zd„ ZdS )aå  Can a recommendation be played? The Webshare check of Pro tebe (docs/plan/pro-tebe/020).

The check runs the same search as playback (wcs/ui/dialogs/DialogWcsSearch.py): the same queries
(ranking.movie_queries / episode_queries + the dialog's own query and fallbacks), the same strict ranking
(ranking.rank: only files that are the requested film / episode), so "available" means the play dialog will have
that file on top. A series is checked on S01E01, what a household starts with. The language of the best file decides:
CZ dub (or bare CZ), CZ subtitles and SK dub count (decision 10 and 2026-10-09: "CZ + SK dabing"); English or
unlabelled files do not. Results are cached in `meta` (key `avail:<media>:<id>`); errors are never cached.
é    N)Úrankingzavail:{}:{}i€Q é   é   é   éx   Úcz_dubÚcz_subÚsk_dub)ÚCZ_DUBÚCZÚCZ_SUBÚSK_DUBc                   ó   — e Zd ZdZdS )ÚUnavailablezPWebshare cannot be asked (no account, login failed, network): nothing is cached.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úe/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/foryou/availability.pyr   r      s   € € € € € ØZÐZÐZÐZr   r   c           
      ó  — ddl m} |                     d| dddd|dœ¦  «        }t          j        |j        ¦  «        }|                     |¦  «        sKt          d                     | | 	                    d	¦  «        p| 	                    d
¦  «        ¦  «        ¦  «        ‚g }| 
                    d¦  «        D ]R}d„ |D ¦   «         }|                     d¦  «        r/|                     d¦  «        pd|d<   |                     |¦  «         ŒS|S )Nr   ©ÚWebshareClientÚsearchÚvideoÚ é2   )ÚwhatÚcategoryÚsortÚlimitÚoffsetÚwstzsearch {!r}: {}ÚmessageÚstatusÚfilec                 ó(   — i | ]}|j         |j        “ŒS r   )ÚtagÚtext)Ú.0Úes     r   ú
<dictcomp>z#_query_webshare.<locals>.<dictcomp>)   s   € Ð,Ð,Ð, !�”�q”vÐ,Ð,Ð,r   ÚidentÚname)Úwcs.websharer   Úapi_callÚETÚ
fromstringÚcontentÚis_okr   ÚformatÚfindtextÚiterÚgetÚappend)ÚqueryÚtokenr   ÚresponseÚrootÚfilesÚnodeÚitems           r   Ú_query_websharerB       s*  € Ø+Ð+Ð+Ð+Ð+Ð+Ø×&Ò& x¸%ÈWÐ^`ÐkmØ<=Àeð2Mð 2Mñ Nô N€HåŒ=˜Ô)Ñ*Ô*€DØ×Ò Ñ%Ô%ð pÝÐ+×2Ò2°5¸$¿-º-È	Ñ:RÔ:RÐ:mÐVZ×VcÒVcÐdlÑVmÔVmÑnÔnÑoÔoÐoØ€EØ—	’	˜&Ñ!Ô!ð ð ˆØ,Ð, tÐ,Ñ,Ô,ˆØ�8Š8�GÑÔð 	ØŸ8š8 FÑ+Ô+Ð1¨rˆD�‰LØ�LŠL˜ÑÔÐøØ€Lr   c                  ó0  — ddl } |                      d¦  «        }|                     d¦  «        s9|                     d¦  «        r|                     d¦  «        st          d¦  «        ‚ddlm} |                     |d	„ ¦  «        }|st          d
¦  «        ‚|S )zXA valid Webshare token or Unavailable (no account / login failed); never shows a dialog.r   Núplugin.video.milionarr<   ÚwsuserÚwspasszno Webshare accountr   c                  ó   — d S ©Nr   )ÚaÚks     r   ú<lambda>ztoken.<locals>.<lambda>7   s   € ¸T€ r   zWebshare login failed)Ú	xbmcaddonÚAddonÚ
getSettingr   r0   r   Ú
revalidate)rL   Úaddonr   Úvalues       r   r<   r<   0   s·   € àÐÐÐØ�OŠOÐ3Ñ4Ô4€EØ×Ò˜WÑ%Ô%ð 1¨%×*:Ò*:¸8Ñ*DÔ*Dð 1È×IYÒIYÐZbÑIcÔIcð 1ÝÐ/Ñ0Ô0Ð0Ø+Ð+Ð+Ð+Ð+Ð+Ø×%Ò% eÐ-AÐ-AÑBÔB€EØð 3ÝÐ1Ñ2Ô2Ð2Ø€Lr   c                 óÜ   — t           �t          | ¦  «        S 	 t          | |¦  «        S # t          j        t          t
          f$ r' t          j        d¦  «         t          | |¦  «        cY S w xY w)Ng      ð?)ÚSEARCHrB   r2   Ú
ParseErrorÚOSErrorr   ÚtimeÚsleep)r;   r$   s     r   Ú_searchrX   =   sp   € ÝÐÝ�e‰}Œ}Ðð+Ý˜u cÑ*Ô*Ð*øÝŒM�7¥KÐ0ð +ð +ð +ÝŒ
�3‰ŒˆÝ˜u cÑ*Ô*Ð*Ð*Ð*ð+øøøs   ˜( ¨A A+Á*A+c                 óâ   — t          j        | d         ¦  «        }t          j        |                      d¦  «        pd¦  «        }t          |                     ¦   «         ¦  «        dk    o|o||k    S )ua   A one-word Czech title that is not the original ('RodiÄ�e' = Breeders) can be another production.ÚtitleÚoriginal_titler   é   )r   Únormr9   ÚlenÚsplit)ÚcardrZ   Úoriginals      r   Ú	ambiguousrb   G   s`   € åŒL˜˜gœÑ'Ô'€EÝŒ|˜DŸHšHÐ%5Ñ6Ô6Ð<¸"Ñ=Ô=€HÝˆu�{Š{‰}Œ}ÑÔ Ò"ÐE xÐE°HÀÒ4EÐEr   c                 óT  ‡— t          |¦  «        sdS t          j        |                     d¦  «        pd¦  «        }t	          |                     d¦  «        pd¦  «        Šd|z   dz   d| d         z   dz   v }t          ‰¦  «        o t          ˆfd„| d	         D ¦   «         ¦  «        }|p|S )
zNFor an ambiguous title the file must also name the original title or the year.Tr[   r   Úyearr   ú r]   c              3   óD   •K  — | ]}t          |‰z
  ¦  «        d k    V — ŒdS )r\   N)Úabs)r+   Úyrd   s     €r   ú	<genexpr>zconfident.<locals>.<genexpr>U   s2   øè è € ÐNÐN°a�s 1 t¡8™}œ}°Ò1ÐNÐNÐNÐNÐNÐNr   Úyears)rb   r   r]   r9   ÚintÚboolÚany)Ú	file_infor`   ra   ÚnamedÚdatedrd   s        @r   Ú	confidentrq   N   s³   ø€ å�T‰?Œ?ð ØˆtÝŒ|˜DŸHšHÐ%5Ñ6Ô6Ð<¸"Ñ=Ô=€HÝˆt�xŠx˜ÑÔÐ$ 1Ñ%Ô%€DØ�8‰^˜cÑ! s¨Y°vÔ->Ñ'>ÀÑ'DÐE€EÝ�‰JŒJÐN�3ÐNÐNÐNÐN¸9ÀWÔ;MÐNÑNÔNÑNÔN€EØˆ>�EÐr   c                 ó  — | d         }|                       d¦  «        pd}|                     ¦   «                              ¦   «         |                     ¦   «                              ¦   «         k    rd}| d         dk    r†t          |                       d¦  «        pd¦  «        }t	          j        d||g|¬¦  «        }d                     ||¦  «                             ¦   «         gt	          j        ||g|¦  «        z   }|r|gng }nQt	          j        d	||gd
d
¬¦  «        }d                     |¦  «        }|gt	          j        ||gd
d
¦  «        z   }d|z   g}|t          t                               d„ |D ¦   «         ¦  «        ¦  «        |fS )zR(target, queries, fallback) exactly as the play dialog builds them for this title.rZ   r[   r   ÚmediaÚmovierd   )rd   z{} {}Úepisoder\   )Úseasonru   z	{} S01E01úretry:c              3   ó   K  — | ]}|¯|V — Œ	d S rH   r   )r+   Úqs     r   ri   zplan.<locals>.<genexpr>i   s'   è è € Ð%>Ð%>¨A¸AÐ%> aÐ%>Ð%>Ð%>Ð%>Ð%>Ð%>r   )r9   ÚstripÚlowerÚstrr   Úmake_targetr6   Úmovie_queriesÚepisode_queriesÚlistÚdictÚfromkeys)r`   rZ   ra   rd   ÚtargetÚqueriesÚfallbackÚfirsts           r   Úplanr‡   Y   s‚  € à�ŒM€EØ�xŠxÐ(Ñ)Ô)Ð/¨R€HØ‡~‚~ÑÔ×ÒÑÔ 5§;¢;¡=¤=×#6Ò#6Ñ#8Ô#8Ò8Ð8ØˆØˆG„}˜ÒÐÝ�4—8’8˜FÑ#Ô#Ð) rÑ*Ô*ˆÝÔ$ W¨u°hÐ.?ÀdÐKÑKÔKˆØ—>’> %¨Ñ.Ô.×4Ò4Ñ6Ô6Ð7½'Ô:OÐQVÐX`ÐPaÐcgÑ:hÔ:hÑhˆØ"Ð*�E�7�7¨ˆˆåÔ$ Y°¸Ð0AÈ!ÐUVÐWÑWÔWˆØ×"Ò" 5Ñ)Ô)ˆØ�'�GÔ3°U¸HÐ4EÀqÈ!ÑLÔLÑLˆØ˜uÑ$Ð%ˆØ•4�ŸšÐ%>Ð%>°Ð%>Ñ%>Ô%>Ñ>Ô>Ñ?Ô?ÀÐIÐIr   c                 óÐ  — ddl }t          | |¦  «        }|r|S |                     d| |j        ¦  «        }|s|S | d|                     ¦   «         …         }t          |¦  «        dk    r~|dd…                              ¦   «         }t          |¦  «        dk     rnNt          d                     ||                     d¦  «        ¦  «        |¦  «        }|r|S t          |¦  «        dk    °~|S )zido_webshare_search_with_retry without the addon object: shorten the title before SxxEyy until files come.r   Nz\s+(S\d+E\d+.*)$é   éÿÿÿÿz{}{})	ÚrerX   r   Ú
IGNORECASEÚstartr^   Úrstripr6   Úgroup)r;   r$   r‹   r?   Úmatchr/   s         r   Ú_retryr‘   l   sè   € à€I€I€IÝ�E˜3ÑÔ€EØð ØˆØ�IŠIÐ)¨5°"´-Ñ@Ô@€EØð ØˆØ��%—+’+‘-”-�Ô €DÝ
ˆd‰)Œ)�aŠ-ˆ-Ø�C�R�CŒy×ÒÑ!Ô!ˆÝˆt‰9Œ9�qŠ=ˆ=ØÝ˜Ÿš d¨E¯KªK¸©N¬NÑ;Ô;¸SÑAÔAˆØð 	ØˆLõ ˆd‰)Œ)�aŠ-ˆ-ð €Lr   c           	      óŒ  ‡ — t          ‰ ¦  «        \  }}}i }|D ]1}t          ||¦  «        D ]}|                     |d         |¦  «         ŒŒ2t          j        t          |                     ¦   «         ¦  «        ||¦  «        }	|	s˜|D ]`}|                     d¦  «        rt          |dd…         |¦  «        nt          ||¦  «        }
|
D ]}|                     |d         |¦  «         ŒŒat          j        t          |                     ¦   «         ¦  «        ||¦  «        }	ˆ fd„|	D ¦   «         }|r|d         nd}|r&t           
                    |d         d         ¦  «        nd}|rd	nd
|pd|r|d         d         ndt          |¦  «        t          t          j        ¦   «         ¦  «        |pi  
                    dd¦  «        dd…         dœS )z_{'status': 'ok'|'missing', 'lang', 'quality', 'files', 'at'} of one title (raises Unavailable).r.   rw   é   Nc                 ó�   •— g | ]B}t          |                     d ¦  «        pd¦  «        dk    ¯*t          |d         ‰¦  «        ¯@|‘ŒCS )ÚpasswordÚ0Ú1Úinfo)r|   r9   rq   )r+   Úfr`   s     €r   ú
<listcomp>zcheck.<locals>.<listcomp>�   sS   ø€ ÐiÐiÐi�a¥S¨¯ª¨zÑ):Ô):Ð)A¸cÑ%BÔ%BÀcÒ%IÐ%IÍiÐXYÐZ`ÔXaÐcgÑNhÔNhÐ%I�Ð%IÐ%IÐ%Ir   r   r˜   ÚlangÚokÚmissingr   Úqualityr/   r   )r&   r›   rž   r?   ÚatÚtop)r‡   rX   Ú
setdefaultr   Úrankr€   ÚvaluesÚ
startswithr‘   ÚLANGSr9   r^   rk   rV   )r`   r$   Úpreferred_qualityrƒ   r„   r…   Úfoundr;   rA   ÚrankedÚitemsÚplayableÚbestr›   s   `             r   Úcheckr¬   €   só  ø€ å $ T¡
¤
Ñ€FˆG�XØ€EØð 2ð 2ˆÝ˜E 3Ñ'Ô'ð 	2ð 	2ˆDØ×Ò˜T 'œ]¨DÑ1Ô1Ð1Ð1ð	2åŒ\�$˜uŸ|š|™~œ~Ñ.Ô.°Ð8IÑJÔJ€FØð OØð 	6ð 	6ˆEØ.3×.>Ò.>¸xÑ.HÔ.HÐa•F˜5   œ9 cÑ*Ô*Ð*ÍgÐV[Ð]`ÑNaÔNaˆEØð 6ð 6�Ø× Ò   g¤°Ñ5Ô5Ð5Ð5ð6å”�d 5§<¢<¡>¤>Ñ2Ô2°FÐ<MÑNÔNˆàiÐiÐiÐi˜6ÐiÑiÔi€HØ"Ð,ˆ8�AŒ;ˆ;¨€DØ.2Ð<�5�9Š9�T˜&”\ &Ô)Ñ*Ô*Ð*¸€DØ"Ð1�d�d¨	¸4¸:À2Ø26Ð>�t˜F”| IÔ.Ð.¸BÍÈXÉÌÕ^aÕbfÔbkÑbmÔbmÑ^nÔ^nØ�J˜B×#Ò# F¨BÑ/Ô/°°°Ô5ð7ð 7ð 7r   c                 óš   — ddl m} |                     t                               | t          |¦  «        ¦  «        ¦  «        \  }}|�|rd n|S )Nr   ©Úmeta)Úwcs.library2r¯   r9   ÚKEYr6   rk   )rs   Útmdb_idr¯   ÚdataÚstales        r   Úcachedrµ   —   sO   € Ø!Ð!Ð!Ð!Ð!Ð!Ø—(’(�3Ÿ:š: e­S°©\¬\Ñ:Ô:Ñ;Ô;�K€Dˆ%Ø�< 5�<ˆ4ˆ4¨dÐ2r   c                 óò   — | d         dk    rt           S |                     d¦  «        pd}	 ddlm} |r-||                     |¦  «        z
  j        t          k    rt          S n# t          $ r Y nw xY wt          S )Nr&   rœ   Údater   r   ©r·   )
Ú	TTL_FOUNDr9   Údatetimer·   ÚfromisoformatÚdaysÚNEW_DAYSÚTTL_MISSING_NEWÚ
ValueErrorÚTTL_MISSING)Úresultr`   Útodayr·   Ú_dates        r   Ú_ttlrÄ   �   sš   € ØˆhÔ˜4ÒÐÝÐØ�8Š8�FÑÔÐ!˜r€DðØ*Ð*Ð*Ð*Ð*Ð*Øð 	#�U˜U×0Ò0°Ñ6Ô6Ñ6Ô<ÅÒHÐHÝ"Ð"øøÝð ð ð ØˆðøøøåÐs   ¬4A" Á"
A/Á.A/é   c           
      ód  ‡‡‡‡— ddl m} ddlm} ddlm} |p|                     ¦   «         }i g }	}| D ]t}
d                     |
d         |
d         ¦  «        }t          |
d         |
d         ¦  «        }|�|||<   ŒH|�t          |	¦  «        |k     r|	 
                    ||
f¦  «         Œu|	s|S t          €t          ¦   «         nd	Št          ¦   «         Šg Šˆˆˆfd
„Šg }|                     ˆfd„|	D ¦   «         |¦  «        D ]c}|r_|d         rW|\  }}
}|||<   | 
                    t                               |
d         |
d         ¦  «        |t!          ||
|¦  «        f¦  «         Œd|                     |¦  «         ‰rFt%          j        d                     t          ‰¦  «        ‰d         ¦  «        t$          j        ¦  «         |ro |d                     t          |¦  «        t+          d„ |D ¦   «         ¦  «        t          |¦  «        t          |¦  «        z
  t          ‰¦  «        ¦  «        ¦  «         |S )z¿{key: result} for every card: cached ones as they are, the rest checked on Webshare (at most `budget`
    titles, in the given order). Raises Unavailable when Webshare cannot be asked at all.r   r¸   r®   )Úapiz{}:{}rs   ÚidNÚtestc           	      óè   •— | \  }}	 ||t          |‰‰¦  «        fS # t          $ rK}‰                     d                     |t	          |¦  «        j        |¦  «        ¦  «         ||d fcY d }~S d }~ww xY w)Nz
{}: {}: {})r¬   Ú	Exceptionr:   r6   Útyper   )ÚpairÚkeyr`   ÚexcÚerrorsÚ	preferredr$   s       €€€r   Úonezcheck_many.<locals>.one¿   s‘   ø€ Ø‰	ˆˆTð	#Ø˜�e D¨#¨yÑ9Ô9Ð9Ð9øÝð 	#ð 	#ð 	#Ø�MŠM˜,×-Ò-¨cµ4¸±9´9Ô3EÀsÑKÔKÑLÔLÐLØ˜˜d�?Ð"Ð"Ð"Ð"Ð"Ð"øøøøð	#øøøs   ˆ œ
A1¦A A,Á&A1Á,A1c                 ó   •— g | ]	}|fˆfd „	‘Œ
S )c                 ó   •—  ‰| ¦  «        S rH   r   )ÚprÒ   s    €r   rK   z'check_many.<locals>.<listcomp>.<lambda>Ç   s   ø€ ¨C¨C°©F¬F€ r   r   )r+   rÕ   rÒ   s     €r   rš   zcheck_many.<locals>.<listcomp>Ç   s(   ø€ ÐAÐAÐA°q¨Ð 2Ð 2Ð 2Ð 2Ð 2ÐAÐAÐAr   r   u7   [MilionÃ¡Å™ ProTebe] {} Webshare checks failed, e.g. {}z2webshare: {} checked ({} ok), {} cached, {} failedc              3   ó:   K  — | ]\  }}}|d          dk    ¯dV — ŒdS )r&   rœ   r\   Nr   )r+   Ú_kÚrÚ_ts       r   ri   zcheck_many.<locals>.<genexpr>Ñ   s6   è è € ÐPÐP¡I B¨¨2¸A¸h¼KÈ4Ò<OÐ<O˜aÐ<OÐ<OÐ<OÐ<OÐPÐPr   )rº   r·   r°   r¯   Ú
wcs.foryourÇ   rÂ   r6   rµ   r^   r:   rS   r<   Ú_preferred_qualityÚparallelr±   rÄ   Úput_manyÚxbmcÚlogÚ
LOGWARNINGÚsum)ÚcardsÚbudgetÚworkersrÂ   rß   r·   r¯   rÇ   ÚresultsÚtodor`   rÎ   ÚhitÚentriesÚanswerrÁ   rÐ   rÒ   rÑ   r$   s                   @@@@r   Ú
check_manyrê   ª   s¡  øøøø€ ð ÐÐÐÐÐØ!Ð!Ð!Ð!Ð!Ð!ØÐÐÐÐÐØÐ!�T—Z’Z‘\”\€EØ˜ˆT€GØð %ð %ˆØ�nŠn˜T 'œ]¨D°¬JÑ7Ô7ˆÝ�T˜'”] D¨¤JÑ/Ô/ˆØˆ?ØˆG�C‰LˆLØˆ^�s 4™yœy¨6Ò1Ð1Ø�KŠK˜˜d˜Ñ$Ô$Ð$øØð ØˆÝ�^�%‰'Œ'ˆ'¨€CÝ"Ñ$Ô$€IØ€Fð#ð #ð #ð #ð #ð #ð #ð €GØ—,’,ÐAÐAÐAÐA¸DÐAÑAÔAÀ7ÑKÔKð gð gˆØð 	g�f˜Q”ið 	gØ &ÑˆC��vØ!ˆG�C‰LØ�NŠN�CŸJšJ t¨G¤}°d¸4´jÑAÔAÀ6Í4ÐPVÐX\Ð^cÑKdÔKdÐeÑfÔfÐføØ‡M‚M�'ÑÔÐØð |ÝŒÐJ×QÒQÕRUÐV\ÑR]ÔR]Ð_eÐfgÔ_hÑiÔiÕkoÔkzÑ{Ô{Ð{Ø
ð }ØˆÐ@×GÒGÝ�‰LŒL�#ÐPÐP°ÐPÑPÔPÑPÔPÕRUÐV]ÑR^ÔR^ÕadÐelÑamÔamÑRmÕorÐsyÑozÔozñ|ô |ñ 	}ô 	}ð 	}à€Nr   c                  ó¸   — 	 ddl } |                      d¦  «                             d¦  «        }n# t          $ r Y dS w xY wddddd	d
dœ                     |¦  «        S )zjThe play dialog's preferred quality (setting autoplay_preferred_quality), so the reported quality matches.r   NrD   Úautoplay_preferred_qualityÚ4KÚ1080pÚ720pÚ480pÚ360pÚSD)r\   r   r   rÅ   r‰   r“   )rL   rM   ÚgetSettingIntrË   r9   )rL   rQ   s     r   rÛ   rÛ   Õ   s|   € ðØÐÐÐØ—’Ð 7Ñ8Ô8×FÒFÐGcÑdÔdˆˆøÝð ð ð Øˆtˆtðøøøà˜ F¨v¸&ÀTÐJÐJ×NÒNÈuÑUÔUÐUs   ‚,/ ¯
=¼=rH   )NrÅ   NN)r   rV   Úxml.etree.ElementTreeÚetreeÚElementTreer2   rÞ   Ú
wcs.searchr   r±   ÚDAYr¹   rÀ   r¾   r½   r¥   rS   rË   r   rB   r<   rX   rb   rq   r‡   r‘   r¬   rµ   rÄ   rê   rÛ   r   r   r   ú<module>rù      s–  ððð ð €€€Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à €€€à Ð Ð Ð Ð Ð à€Ø€Ø�‰G€	Ø�#‰g€Ø˜‘(€Ø€Ø 8°xÈ8ÐTÐT€Ø	€ð[ð [ð [ð [ð [�)ñ [ô [ð [ðð ð ð 
ð 
ð 
ð+ð +ð +ðFð Fð Fðð ð ðJð Jð Jð&ð ð ð(7ð 7ð 7ð 7ð.3ð 3ð 3ð
ð 
ð 
ð(ð (ð (ð (ðVVð Vð Vð Vð Vr   