§
   ³9ìº)Ÿ.ã                   ó*  — 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ZddlZddlm	Z	m
Z
mZmZmZmZ dZdZdZdZdZd	ZdZd
Zej        fd„Zd„ Z G d„ d¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Zd„ Z G d„ d¦  «        Z dd„Z!dS )u.  Playback tracker, runs in the service (docs/plan/milionar-library/040 Â§4, 020 Â§2).

Player callbacks only enqueue events. One worker loop drains the queue, polls the position, saves it and applies
the thresholds, so no player or GUI call ever happens inside a callback (Kodi GUI is not thread-safe).
é    N)ÚautoplayÚjobsÚplayÚpolicyÚstoreÚurlszplugin.video.milionarzmilionar.npé
   é   é   g      à?éx   c                 óV   — t          j        d                     | ¦  «        |¦  «         d S )Nu   [MilionÃ¡Å™ Tracker] {})ÚxbmcÚlogÚformat)ÚmsgÚlevels     úb/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/library2/tracker.pyÚ_logr      s)   € Ý„HÐ&×-Ò-¨cÑ2Ô2°EÑ:Ô:Ð:Ð:Ð:ó    c                  ó˜   ‡— t          j        t          ¦  «        Šˆfd„}  | dt          j        ¦  «         | dt          j        ¦  «        fS )Nc                 óŒ   •— 	 t          ‰                     | ¦  «        p|¦  «        S # t          $ r t          |¦  «        cY S w xY w©N)ÚfloatÚ
getSettingÚ
ValueError)ÚkeyÚdefaultÚaddons     €r   Únumberzthresholds.<locals>.number#   sV   ø€ ð	"Ý˜×)Ò)¨#Ñ.Ô.Ð9°'Ñ:Ô:Ð:øÝð 	"ð 	"ð 	"Ý˜‘>”>Ð!Ð!Ð!ð	"øøøs   ƒ#' §AÁAÚlib_resume_min_secondsÚlib_watched_percent)Ú	xbmcaddonÚAddonÚADDON_IDr   ÚDEFAULT_RESUME_MIN_SECONDSÚDEFAULT_WATCHED_PERCENT)r   r   s    @r   Ú
thresholdsr'       s_   ø€ ÝŒO�HÑ%Ô%€Eð"ð "ð "ð "ð "ð
 ˆ6Ð*­FÔ,MÑNÔNØˆÐ$¥fÔ&DÑEÔEðFð Fr   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚSessionc                 óJ  — || _         || _        || _        d| _        d| _        d | _        d| _        || _        d| _        |d         dk    rdnd| _	        | 
                    dd¦  «        du| _        d| _        d | _        d | _        d| _        d| _        d| _        d | _        d S )Nç        FÚtypeÚmovieÚtvÚfollowT)ÚnpÚlog_idÚstartedÚpositionÚtotalÚ	polled_atÚ	last_saveÚav_started_atÚsafety_checkedÚkindÚgetr/   Úautoplay_startedÚplanÚ
queued_urlÚadvancedÚdeclinedÚmarked_watchedÚ
end_notice)Úselfr0   r1   r2   s       r   Ú__init__zSession.__init__-   s­   € ØˆŒØˆŒØˆŒØˆŒØˆŒ
ØˆŒØˆŒØ$ˆÔØ#ˆÔØ! &œz¨WÒ4Ð4�G�G¸$ˆŒ	à—f’f˜X tÑ,Ô,°EÐ9ˆŒà %ˆÔØˆŒ	ØˆŒØˆŒØˆŒØ#ˆÔØˆŒˆˆr   c                 óŽ   — | j         | j        d         | j                             d¦  «        | j                             d¦  «        fS )NÚtmdbÚsÚe)r9   r0   r:   ©rB   s    r   r   zSession.keyC   s5   € Ø”	˜4œ7 6œ?¨D¬G¯KªK¸Ñ,<Ô,<¸d¼g¿kºkÈ#Ñ>NÔ>NÐOÐOr   N)Ú__name__Ú
__module__Ú__qualname__rC   r   © r   r   r)   r)   ,   s7   € € € € € ðð ð ð,Pð Pð Pð Pð Pr   r)   c                   óB   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	ˆ xZ
S )ÚTrackerc                 óx   •— t          ¦   «                              ¦   «          t          j        ¦   «         | _        d S r   )ÚsuperrC   ÚqueueÚQueueÚevents)rB   Ú	__class__s    €r   rC   zTracker.__init__H   s*   ø€ Ý‰Œ×ÒÑÔÐÝ”k‘m”mˆŒˆˆr   c                 ób   — | j                              dt          j        ¦   «         d f¦  «         d S )Nr2   ©rS   ÚputÚtimerH   s    r   ÚonAVStartedzTracker.onAVStartedM   ó)   € ØŒ�Š˜¥D¤I¡K¤K°Ð6Ñ7Ô7Ð7Ð7Ð7r   c                 ób   — | j                              dt          j        ¦   «         d f¦  «         d S )NÚstoppedrV   rH   s    r   ÚonPlayBackStoppedzTracker.onPlayBackStoppedP   rZ   r   c                 ób   — | j                              dt          j        ¦   «         d f¦  «         d S )NÚendedrV   rH   s    r   ÚonPlayBackEndedzTracker.onPlayBackEndedS   ó)   € ØŒ�Š˜¥$¤)¡+¤+¨tÐ4Ñ5Ô5Ð5Ð5Ð5r   c                 ób   — | j                              dt          j        ¦   «         d f¦  «         d S )NÚerrorrV   rH   s    r   ÚonPlayBackErrorzTracker.onPlayBackErrorV   ra   r   c                 ób   — | j                              dt          j        ¦   «         d f¦  «         d S )NÚpausedrV   rH   s    r   ÚonPlayBackPausedzTracker.onPlayBackPausedY   s)   € ØŒ�Š˜¥4¤9¡;¤;°Ð5Ñ6Ô6Ð6Ð6Ð6r   c                 ób   — | j                              dt          j        ¦   «         d f¦  «         d S )NÚseekrV   )rB   Útime_msÚseek_offsets      r   ÚonPlayBackSeekzTracker.onPlayBackSeek\   s)   € ØŒ�Š˜¥¤¡¤¨dÐ3Ñ4Ô4Ð4Ð4Ð4r   )rI   rJ   rK   rC   rY   r]   r`   rd   rg   rl   Ú__classcell__©rT   s   @r   rN   rN   G   s’   ø€ € € € € ð$ð $ð $ð $ð $ð
8ð 8ð 8ð8ð 8ð 8ð6ð 6ð 6ð6ð 6ð 6ð7ð 7ð 7ð5ð 5ð 5ð 5ð 5ð 5ð 5r   rN   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚAdoptionMonitorc                 óV   •— t          ¦   «                              ¦   «          || _        d S r   )rP   rC   rS   )rB   rS   rT   s     €r   rC   zAdoptionMonitor.__init__a   s$   ø€ Ý‰Œ×ÒÑÔÐØˆŒˆˆr   c                 ón   — |dv r0| j                              dt          j        ¦   «         d f¦  «         d S d S )N)zVideoLibrary.OnUpdatezVideoLibrary.OnRemovezGUI.OnContainerChangedÚadopt_changedrV   )rB   ÚsenderÚmethodÚdatas       r   ÚonNotificationzAdoptionMonitor.onNotificatione   s>   € ØÐaÐaÐaØŒK�OŠO˜_­d¬i©k¬k¸4Ð@ÑAÔAÐAÐAÐAð bÐar   )rI   rJ   rK   rC   rw   rm   rn   s   @r   rp   rp   `   sN   ø€ € € € € ðð ð ð ð ðBð Bð Bð Bð Bð Bð Br   rp   c                  ó®   — t          j        d¦  «                             t          ¦  «        } 	 | rt	          j        | ¦  «        nd S # t          $ r Y d S w xY w)Né'  )ÚxbmcguiÚWindowÚgetPropertyÚNP_PROPERTYÚjsonÚloadsr   )Úraws    r   Ú_read_npr�   j   s]   € Ý
Œ.˜Ñ
Ô
×
+Ò
+­KÑ
8Ô
8€CðØ"%Ð/�tŒz˜#‰Œˆ¨4Ð/øÝð ð ð Øˆtˆtðøøøs   ®A Á
AÁAc                   óü   — e Zd ZdZej        fd„Zd#d„Zd„ Zd„ Ze	d„ ¦   «         Z
e	d„ ¦   «         Zd	„ Zd$d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d Z"d!„ Z#d"„ Z$dS )%ÚEnginezNThe loop body; `player` is a Tracker (or a test double with the same methods).c                 óv   — || _         || _        || _        d | _        d| _        d | _        d | _        d| _        d S )Nr+   F)ÚplayerÚmonitorÚnowÚsessionÚ
last_adoptÚadopt_signatureÚadopt_cursorrs   )rB   r…   r†   r‡   s       r   rC   zEngine.__init__u   sC   € ØˆŒØˆŒØˆŒØˆŒØˆŒØ#ˆÔØ ˆÔØ"ˆÔÐÐr   Nc                 ó$  — |dk    r|                       |¦  «         d S |dv r| j        r|                      ||¦  «         d S |dv r3| j        r,|                      ¦   «          |                      d¬¦  «         d S |dk    rI| j        r<| j        j        d         |d         k    r"| j        j        €|d         | j        _        d S d S d S d S |d	k    r|                      |¦  «         d S |d
k    r|                      |¦  «         d S |dk    r	d| _	        d S d S )Nr2   )r\   r_   rc   )rf   ri   T)ÚforceÚautoplay_prefetchÚtokenr<   Úautoplay_planÚautoplay_actionrs   )
Ú_startrˆ   Ú_finishÚ_pollÚ_saver0   r<   Ú_on_planÚ
_on_actionrs   )rB   ÚeventÚwhenrv   s       r   ÚhandlezEngine.handle€   sU  € Ø�IÒÐØ�KŠK˜ÑÔÐÐÐØÐ3Ð3Ð3¸¼Ð3Ø�LŠL˜ Ñ%Ô%Ð%Ð%Ð%ØÐ(Ð(Ð(¨T¬\Ð(Ø�JŠJ‰LŒLˆLØ�JŠJ˜TˆJÑ"Ô"Ð"Ð"Ð"ØÐ)Ò)Ð)ØŒ|ð 1 ¤¤°Ô 8¸DÀ¼MÒ IÐ IÈdÌlÔN_ÐNgØ$(¨¤L�”Ô!Ð!Ð!ð1ð 1Ð IÐ IÐNgÐNgà�oÒ%Ð%Ø�MŠM˜$ÑÔÐÐÐØÐ'Ò'Ð'Ø�OŠO˜DÑ!Ô!Ð!Ð!Ð!Ø�oÒ%Ð%Ø!%ˆDÔÐÐð &Ð%r   c                 óì  — t          ¦   «         }	 | j                             ¦   «         }n# t          $ r Y d S w xY w| j        r>|                      | j        j        s|                      | j        ¦  «        rdnd|¦  «         t          j	        |||  
                    ¦   «         ¦  «        s,t          d                     |d d…         ¦  «        ¦  «         d S t          |  
                    ¦   «         ¦  «        }t          j        |d         dk    rdnd|d         |                     d	¦  «        |                     d
¦  «        |¦  «        }t#          |||  
                    ¦   «         ¦  «        | _        t%          j        d¦  «                             t*          ¦  «         t          d                     |d         |d         ¦  «        ¦  «         |                     d¦  «        t,          j        k    rW|                      | j        | j        j        |d         |                     d¦  «        p|                     d¦  «        pd¦  «         | j        j        sd S |                      | j        ||d         ¦  «         d S )Nr_   r\   z+playback ignored (no matching contract): {}éP   r,   r-   r.   rE   rF   rG   ry   ztracking {} {}ÚoriginÚ
show_titleÚtitleÚ r�   )r�   r…   ÚgetPlayingFileÚRuntimeErrorrˆ   r“   r/   Ú_ran_outr   Ú
np_matchesr‡   r   r   Úintr   Ú	log_startr:   r)   rz   r{   ÚclearPropertyr}   r   ÚORIGIN_CHANNELÚ_spawnÚ_list_workerr9   Ú_prefetch_worker)rB   r™   r0   Úplayingr2   r1   s         r   r’   zEngine._start’   s1  € Ý‰ZŒZˆð	Ø”k×0Ò0Ñ2Ô2ˆGˆGøÝð 	ð 	ð 	ØˆFˆFð	øøøàŒ<ð 	mØ�LŠL D¤LÔ$7Ðe¸4¿=º=ÈÌÑ;VÔ;VÐe˜˜Ð\eÐgkÑlÔlÐlÝÔ   W¨d¯hªh©j¬jÑ9Ô9ð 	ÝÐ>×EÒEÀgÈcÈrÈcÄlÑSÔSÑTÔTÐTØˆFÝ�d—h’h‘j”j‘/”/ˆÝ”¨B¨v¬J¸'Ò,AÐ,A  ÀtÈRÐPVÌZÐY[×Y_ÒY_Ð`cÑYdÔYdÐfh×flÒflÐmpÑfqÔfqÐszÑ{Ô{ˆÝ˜r 6¨4¯8ª8©:¬:Ñ6Ô6ˆŒÝŒ�uÑÔ×+Ò+­KÑ8Ô8Ð8ÝÐ×$Ò$ R¨¤Z°°F´Ñ<Ô<Ñ=Ô=Ð=Ø�6Š6�(ÑÔ�tÔ2Ò2Ð2Ø�KŠK˜Ô)¨4¬<Ô+<¸bÀ¼jÈ"Ï&Ê&ÐQ]ÑJ^ÔJ^ÐJwÐbd×bhÒbhÐipÑbqÔbqÐJwÐuwÑxÔxÐxØŒ|Ô"ð 	ØˆFð 	�Š�DÔ)¨2¨r°'¬{Ñ;Ô;Ð;Ð;Ð;s   �* ª
8·8c                 ó€  — |j         �|j        dk    rdS |                      ¦   «         |j         z
  t          k    }|j        |j        z
  t          t          |j        dz  ¦  «        k    }|rT|sRt          d                     |j	        d         |j	        d         |j        |j        ¦  «        t          j        ¦  «         dS dS )	aT  Kodi reports 'ended' also when a stream fails a few seconds in (a broken or unsupported file) or a file is
        cut short. That is not the end of the film: the player read the position moments before and it was far from the
        end. A seek to the very end is still the end: the poll before it is old, or the position is near the end.Nr   Fgš™™™™™©?zC{} {} stopped at {:.0f} s of {:.0f} s: a broken stream, not the endr,   rE   T)r5   r4   r‡   ÚBROKE_OFF_POLL_Sr3   ÚmaxÚBROKE_OFF_MARGIN_Sr   r   r0   r   Ú
LOGWARNING)rB   rF   ÚfreshÚnear_ends       r   Ú
_broke_offzEngine._broke_offª   sº   € ð Œ;Ð !¤'¨Q¢, ,Ø�5Ø—’‘”˜aœkÑ)Õ.>Ò>ˆØ”G˜aœjÑ(­SÕ1CÀQÄWÈtÁ^Ñ-TÔ-TÒTˆØð 	˜ð 	ÝÐV×]Ò]Ø”�V”˜aœd 6œl¨A¬J¸¼ñAô AÝBFÄ/ñSô Sð Sà�4Øˆur   c                 ór   — | j         dk    o,| j         | j        z
  t          j        ¦   «         d         dz   k    S )zÌA channel's playlist moved on: the item counts as played to the end only from its countdown point on
        (the channel's own countdown starts the next item there); a skip earlier leaves it in progress.r   é   é   )r4   r3   r   Úsettings)rF   s    r   r£   zEngine._ran_out¸   s7   € ð Œw˜Š{ÐS ¤¨!¬*Ñ 4½Ô9JÑ9LÔ9LÈQÔ9OÐRSÑ9SÒSÐSr   c                 óÌ   — 	 ddl m} |                     | ||¦  «         d S # t          $ r8}t	          d                     |¦  «        t          j        ¦  «         Y d }~d S d }~ww xY w)Nr   )Úsharedz/adding the channel title to the list failed: {})Úwcs.library2rº   Úensure_listedÚ	Exceptionr   r   r   r±   )r9   Útmdb_idrŸ   rº   Úexcs        r   rª   zEngine._list_worker¾   s�   € ð	aØ+Ð+Ð+Ð+Ð+Ð+Ø× Ò   w°Ñ6Ô6Ð6Ð6Ð6øÝð 	að 	að 	aÝÐB×IÒIÈ#ÑNÔNÕPTÔP_Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`Ð`øøøøð	aøøøs   ‚! ¡
A#«-AÁA#c                 óz  — | j         }|sd S 	 t          | j                             ¦   «         ¦  «        |_        t          | j                             ¦   «         ¦  «        }n# t          $ r Y d S w xY wt          j        ||j	         
                    d¦  «        ¦  «        |_        |                      ¦   «         |_        d S )NÚ	runtime_s)rˆ   r   r…   ÚgetTimer3   ÚgetTotalTimer¢   r   Úeffective_totalr0   r:   r4   r‡   r5   )rB   rF   r4   s      r   r”   zEngine._pollÆ   s¬   € ØŒLˆØð 	ØˆFð	Ý˜tœ{×2Ò2Ñ4Ô4Ñ5Ô5ˆAŒJÝ˜$œ+×2Ò2Ñ4Ô4Ñ5Ô5ˆEˆEøÝð 	ð 	ð 	ØˆFˆFð	øøøåÔ(¨°´·²¸Ñ0EÔ0EÑFÔFˆŒØ—h’h‘j”jˆŒˆˆs   �AA Á
A-Á,A-Fc                 óÒ  — | j         }|sd S t          ¦   «         \  }}|                      ¦   «         |j        z
  t          k    }|j        dk    r|j        |j        z  dz  |k    rd S |s|rþ|j        |k    rñt          j        |j	        |j
        d         |j        |j        |j
                             d¦  «        |j
                             d¦  «        |j
                             d¦  «        |j
                             d¦  «        |j
                             d¦  «        d	œ¬
¦  «         t          j        |j        |j        |j        ¦  «         |                      ¦   «         |_        d S d S d S )Nr   g      Y@rE   rF   rG   ÚidentÚproviderÚ	file_name©rÆ   rÇ   rÈ   ©Úsource)rˆ   r'   r‡   r6   Ú
AUTOSAVE_Sr4   r3   r   Úsave_resumer9   r0   r:   Ú
log_updater1   )rB   r�   rF   Úmin_secondsÚpercentÚdues         r   r•   zEngine._saveÒ   sW  € ØŒLˆØð 	ØˆFÝ)™|œ|Ñˆ�WØ�xŠx‰zŒz˜AœKÑ'­JÒ6ˆØŒ7�QŠ;ˆ;˜AœJ¨¬Ñ0°EÑ9¸WÒDÐDØˆFØð 	%�Sð 	%˜aœj¨KÒ7Ð7ÝÔ˜aœf a¤d¨6¤l°A´JÀÄÈÌÏÊÐRUÉÌÐXYÔX\×X`ÒX`ÐadÑXeÔXeØ/0¬t¯xªx¸Ñ/@Ô/@ÈaÌdÏhÊhÐWaÑNbÔNbØ34´4·8²8¸KÑ3HÔ3Hð&Jð &JðKñ Kô Kð Kõ Ô˜QœX q¤z°1´7Ñ;Ô;Ð;ØŸ(š(™*œ*ˆAŒKˆKˆKð 8Ð7ð 	%ð 	%r   c           	      ó  — | j         }d | _         t          ¦   «         \  }}|dk    o|                      |¦  «         }|r*|j        dk    rt	          |j        |j        ¦  «        |_        t          j        |j        |j        |||¦  «        }|                     ¦   «         \  }}	}
}|j	         
                    d¦  «        |j	         
                    d¦  «        |j	         
                    d¦  «        dœ}|dk    r!|j        st          j        ||	|
||¬¦  «         n3|j        rn+|d	k    r%t          j        ||	|j        |j        |
||¬¦  «         |j        rd}t          j        |j        t#          |                      ¦   «         ¦  «        |j        |j        |¦  «         |rE|j        r>|j        s7|j        s0t-          j        ¦   «         d         r|                      |¦  «         d S |j        r|d
v r|                      |¦  «         d S d S d S )Nr_   r   rÆ   rÇ   rÈ   rÉ   ÚwatchedrÊ   Úresume)r\   rc   )rˆ   r'   r´   r4   r¯   r3   r   Úoutcomer   r0   r:   r@   r   Úmark_watchedrÍ   Ú
log_finishr1   r¥   r‡   r/   r>   r?   r   r¸   Ú
_follow_upr=   Ú
drop_queue)rB   r˜   r™   rF   rÏ   rÐ   r_   Úresultr9   r¾   ÚseasonÚepisoderË   s                r   r“   zEngine._finishá   s  € ØŒLˆØˆŒÝ)™|œ|Ñˆ�WØ˜Ò Ð;¨¯ª¸Ñ);Ô);Ð%;ˆØð 	2�Q”W˜q’[�[Ý˜QœZ¨¬Ñ1Ô1ˆAŒJÝ” ¤
¨A¬G°U¸KÈÑQÔQˆØ)*¯ª©¬Ñ&ˆˆg�v˜wØœ4Ÿ8š8 GÑ,Ô,¸!¼$¿(º(À:Ñ:NÔ:NÐ]^Ô]a×]eÒ]eÐfqÑ]rÔ]rÐsÐsˆØ�YÒÐØÔ#ð RÝÔ" 4¨°&¸'È&ÐQÑQÔQÐQøØÔð 	bØØ�xÒÐÝÔ˜d G¨Q¬Z¸¼À&È'ÐZ`ÐaÑaÔaÐaØÔð 	ØˆFÝÔ˜œ¥3 t§x¢x¡z¤z¡?¤?°A´JÀÄÈÑPÔPÐPØð 	�Q”Xð 	 a¤jð 	¸¼ð 	ÍÔHYÑH[ÔH[Ð\]ÔH^ð 	Ø�OŠO˜AÑÔÐÐÐØŒ\ð 	˜eÐ';Ð;Ð;Ø�OŠO˜AÑÔÐÐÐð	ð 	Ð;Ð;r   c                 ó   — | j         }|rë|                      ¦   «          |                      ¦   «          |j        s¼|j                             dd¦  «        dk    r�|                      ¦   «         |j        z
  t          k    rxd|_        |j	        |j        d         dz
  k     rXt          d                     |j        d         |j	        ¦  «        ¦  «         | j                             |j        d         ¦  «         |r|                      |¦  «         d S d S )NÚstart_atr   Tr·   z*safety seek to {:.0f}s (player at {:.0f}s))rˆ   r”   r•   r8   r0   r:   r‡   r7   ÚSAFETY_SEEK_AFTER_Sr3   r   r   r…   ÚseekTimeÚ_check_autoplay©rB   rF   s     r   ÚtickzEngine.tickû   s  € ØŒLˆØð 	;Ø�JŠJ‰LŒLˆLØ�JŠJ‰LŒLˆLØÔ#ð ;¨¬¯ª°¸QÑ(?Ô(?À!Ò(CÐ(CÈÏÊÉÌÐVWÔVeÑIeÕj}ÒH}ÐH}Ø#'�Ô Ø”: ¤ ZÔ 0°1Ñ 4Ò4Ð4ÝÐE×LÒLÈQÌTÐR\ÔM]Ð_`Ô_iÑjÔjÑkÔkÐkØ”K×(Ò(¨¬¨jÔ)9Ñ:Ô:Ð:Øð 	$Ø× Ò  Ñ#Ô#Ð#Ð#Ð#ð	$ð 	$r   c                 ó  — |j         }|€ˆ|j                             d¦  «        dk    rj	 t          j         |j        ¦  «        }nH# t          $ r;}t          d                     |¦  «        t          j        ¦  «         ddi}Y d}~nd}~ww xY w||_         |sdS |d         }|dk    rP|j	        s+t          j        |d         d	d
d¬¦  «         |d         |_	        d|_        |                      |¦  «         dS |dk    rQ|                      |j        p4|                      d¦  «                             |d         |d         ¦  «        ¦  «         dS |dk    r1|                      |j        p|                      d¦  «        ¦  «         dS dS )z¹Natural end of an episode / film: start the next episode, or tell why not (also when the dialog was
        dismissed, never shown (seek to the very end) or the plan was still pending).Nr,   rÜ   z#autoplay plan failed at the end: {}r9   ÚnoneÚseries_nextÚ	canonicalÚautoÚstarté<   ©Úsrcré   Úmax_ageTÚupcomingé~  Úseason_episodeÚ	air_labelÚfinishedé~  )r<   r0   r:   r   r½   r   r   r   r±   r=   r   Úpreparer>   Ú	play_nextÚ_notifyrA   Ú_text)rB   rF   r<   r¿   r9   s        r   rØ   zEngine._follow_up	  s£  € ð ŒvˆØˆ<˜AœDŸHšH VÑ,Ô,°	Ò9Ð9ð(Ý”} Q¤TÑ*Ô*��øÝð (ð (ð (ÝÐ:×AÒAÀ#ÑFÔFÍÌÑXÔXÐXØ Ð'������øøøøð(øøøð ˆAŒFØð 	ØˆFØ�FŒ|ˆØ�=Ò Ð Ø”<ð 1Ý”˜T +Ô.°FÀ'ÐSUÐVÑVÔVÐVØ# KÔ0�”ØˆAŒJØ�NŠN˜4Ñ Ô Ð Ð Ð Ø�ZÒÐØ�LŠL˜œÐl¨¯ª°EÑ):Ô):×)AÒ)AÀ$ÐGWÔBXÐZ^Ð_jÔZkÑ)lÔ)lÑmÔmÐmÐmÐmØ�ZÒÐØ�LŠL˜œÐ:¨¯ª°EÑ):Ô):Ñ;Ô;Ð;Ð;Ð;ð  Ðs   ©A Á
BÁ1BÂBc                 óX   — t          j        ||d¬¦  «                             ¦   «          dS )z?Worker threads for network / modal work; tests run them inline.T)ÚtargetÚargsÚdaemonN)Ú	threadingÚThreadré   )rB   rù   rú   s      r   r©   zEngine._spawn#  s,   € åÔ ¨T¸$Ð?Ñ?Ô?×EÒEÑGÔGÐGÐGÐGr   c                 ón   — | j         j                             ||                      ¦   «         |f¦  «         d S r   )r…   rS   rW   r‡   )rB   r˜   rv   s      r   Ú_postzEngine._post'  s0   € ØŒÔ×Ò  t§x¢x¡z¤z°4Ð8Ñ9Ô9Ð9Ð9Ð9r   c           
      ó´  — |j         r.|j        s'|j        dk    s|j                             d¦  «        dvrd S t          j        ¦   «         \  }}}|j        |j        z
  }|r||k    rd S d|_        |j        �3|  	                    ||j        |t          j
        |||¦  «        ¦  «         d S |                      | j        |j        |j        d         |||¦  «         d S )Nr   r,   )rÜ   r-   Tr�   )r/   r;   r4   r0   r:   r   r¸   r3   r<   Ú_apply_planÚdialog_durationr©   Ú_plan_worker)rB   rF   ÚenabledÚ	countdownÚtriggerÚ	remainings         r   rá   zEngine._check_autoplay*  sè   € ØŒxð 	˜1Ô-ð 	°´¸A²°ÀÄÇÂÈ&ÑAQÔAQÐYmÐAmÐAmØˆFÝ&.Ô&7Ñ&9Ô&9Ñ#ˆ�˜GØ”G˜aœjÑ(ˆ	Øð 	˜) iÒ/Ð/ØˆFØ!ˆÔØŒ6ÐØ×Ò˜Q ¤¨	µ8Ô3KÈIÐW`ÐbiÑ3jÔ3jÑkÔkÐkØˆFØ�Š�DÔ% q¤t¨Q¬T°'¬]¸IÀyÐRYÑZÔZÐZÐZÐZr   c                 ó  — 	 t          j        |¦  «        }n[# t          $ rN}t          d                     t          |¦  «        j        |¦  «        t          j        ¦  «         ddi}Y d }~nd }~ww xY w|  	                    d||dœ¦  «         d S )Núautoplay plan failed: {}: {}r9   rå   rŽ   )r�   r<   )
r   r<   r½   r   r   r,   rI   r   r±   rÿ   )rB   r0   r�   r<   r¿   s        r   r«   zEngine._prefetch_worker7  sž   € ð	$Ý”= Ñ$Ô$ˆDˆDøÝð 	$ð 	$ð 	$ÝÐ/×6Ò6µt¸C±y´yÔ7IÈ3ÑOÔOÕQUÔQ`ÑaÔaÐaØ˜FÐ#ˆDˆDˆDˆDˆDˆDøøøøð	$øøøð 	�
Š
Ð&°%ÀÐ(FÐ(FÑGÔGÐGÐGÐGó   ‚ —
A/¡AA*Á*A/c                 óF  — 	 t          j        |¦  «        }n[# t          $ rN}t          d                     t          |¦  «        j        |¦  «        t          j        ¦  «         ddi}Y d }~nd }~ww xY w|  	                    d|||t          j
        |||¦  «        dœ¦  «         d S )Nr	  r9   rå   r�   )r�   r<   r  Úduration)r   r<   r½   r   r   r,   rI   r   r±   rÿ   r  )rB   r0   r�   r  r  r  r<   r¿   s           r   r  zEngine._plan_worker?  sÉ   € ð	$Ý”= Ñ$Ô$ˆDˆDøÝð 	$ð 	$ð 	$ÝÐ/×6Ò6µt¸C±y´yÔ7IÈ3ÑOÔOÕQUÔQ`ÑaÔaÐaØ˜FÐ#ˆDˆDˆDˆDˆDˆDøøøøð	$øøøð 	�
Š
�?¨e¸TÐPYÝ19Ô1IÈ)ÐU^Ð`gÑ1hÔ1hð%jð %jñ 	kô 	kð 	kð 	kð 	kr
  c                 ó¬   — | j         }|r|j        d         |d         k    s|j        rd S |                      ||d         |d         |d         ¦  «         d S )Nr�   r<   r  r  )rˆ   r0   r>   r  )rB   rv   rF   s      r   r–   zEngine._on_planH  s_   € ØŒLˆØð 	�A”D˜”M T¨'¤]Ò2Ð2°a´jÐ2ØˆFØ×Ò˜˜D œL¨$¨{Ô*;¸TÀ*Ô=MÑNÔNÐNÐNÐNr   c                 óâ  — ||_         |d         }|dk    rE|                      |||dz   ¬¦  «         |                      | j        |||j        d         ¦  «         d S |dk    r*|                      | j        |||j        d         ¦  «         d S |dk    r<|                      d¦  «                             |d	         |d
         ¦  «        |_        d S |dk    r|                      d¦  «        |_        d S d S )Nr9   ræ   r   ©rí   r�   Ú
collectionrî   rï   rð   rñ   rò   ró   )r<   Ú_queuer©   Ú_dialog_workerr0   r÷   r   rA   )rB   rF   r<   r  r  r9   s         r   r  zEngine._apply_planN  sú   € ØˆŒØ�FŒ|ˆØ�=Ò Ð Ø�KŠK˜˜4¨°S©ˆKÑ9Ô9Ð9Ø�KŠK˜Ô+¨T°8¸Q¼TÀ'¼]ÑKÔKÐKÐKÐKØ�\Ò!Ð!Ø�KŠK˜Ô+¨T°8¸Q¼TÀ'¼]ÑKÔKÐKÐKÐKØ�ZÒÐØŸ:š: eÑ,Ô,×3Ò3°DÐ9IÔ4JÈDÐQ\ÔL]Ñ^Ô^ˆAŒLˆLˆLØ�ZÒÐØŸ:š: eÑ,Ô,ˆAŒLˆLˆLð  Ðr   c                 ó\   — t          j        |d         dd|¬¦  «         |d         |_        dS )aG  Remember the next canonical URL and leave a long-lived auto-pick request for its (lazy) resolve.

        PlayMedia does not put the playing item into Kodi's playlist (position -1), so there is no playlist to queue
        into: the engine starts the next item itself with Player.play (no stop() first) from this loop.
        rç   rè   ré   rë   N)r   rô   r=   )rB   rF   r<   rí   s       r   r  zEngine._queue[  s2   € õ 	Œ�T˜+Ô&¨F¸'È7ÐSÑSÔSÐSØ˜KÔ(ˆŒˆˆr   c                 ón   — |                       |||¦  «        }|r|                      d||dœ¦  «         dS dS )z]Show the existing countdown dialog (modal, in this worker); the result goes back as an event.r‘   ©r�   ÚactionN)Ú_show_dialogrÿ   )rB   r<   r  r�   r  s        r   r  zEngine._dialog_workerd  sQ   € à×"Ò" 4¨°5Ñ9Ô9ˆØð 	NØ�JŠJÐ(°EÀVÐ*LÐ*LÑMÔMÐMÐMÐMð	Nð 	Nr   c                 ó¢  ‡ ‡— ddl m} t          j        t          ¦  «        }|d         dk    }ˆ ˆfd„} ||                     ¦   «         |                     d¦  «        ||d         |r|d         n|d	         |                     d
d¦  «        |r‰                      d¦  «        n|d         |                     dd¦  «        |                     dd¦  «        |                     dd¦  «        |rd n|¬¦  «        }| 	                    ¦   «          | 
                    ¦   «         }	~|j        d|j        d|j        d|j        d i                     |	d¦  «        S )Nr   )ÚAutoplayCountdownDialogr9   r  c                  ó:   •— ‰                       d‰ddœ¦  «         d S )Nr‘   Útimeoutr  )rÿ   )rB   r�   s   €€r   Ú
on_timeoutz'Engine._show_dialog.<locals>.on_timeouto  s&   ø€ Ø�JŠJÐ(°EÀYÐ*OÐ*OÑPÔPÐPÐPÐPr   ÚpathrŸ   Úyearrð   Úthumbr    i~  Úseries_nameÚrating)	Úshow_countdown_atÚnext_episode_titleÚnext_episode_season_episodeÚnext_episode_thumbr   Únext_episode_ratingÚnext_episode_rating_onlyÚnext_episode_year_onlyÚtimeout_callbackÚplay_nowÚcancelÚdismiss)Úwcs.playback.dialogs.countdownr  r"   r#   r$   Úget_dialog_xml_filenameÚgetAddonInfor:   r÷   ÚdoModalÚget_user_actionÚACTION_PLAY_NOWÚACTION_CANCEL_AUTOPLAYÚACTION_DISMISSÚACTION_TIMEOUT)
rB   r<   r  r�   ÚDialogr   r  r  ÚdialogÚusers
   `  `      r   r  zEngine._show_dialogj  sƒ  øø€ ØTÐTÐTÐTÐTÐTÝ”¥Ñ)Ô)ˆØ˜&”\ \Ò1ˆ
ð	Qð 	Qð 	Qð 	Qð 	Qð 	Qà�Ø×*Ò*Ñ,Ô,¨e×.@Ò.@ÀÑ.HÔ.HÐ\dØ# Gœ}Ø9CÐ)_¨¨f¬¨ÈÐN^ÔI_Ø#Ÿxšx¨°Ñ4Ô4Ø.8ÐQ˜Ÿš EÑ*Ô*Ð*¸dÀ=Ô>QØ $§¢¨°2Ñ 6Ô 6ÐQU×QYÒQYÐZbÐdfÑQgÔQgØ#'§8¢8¨F°BÑ#7Ô#7Ø&0Ð@˜d˜d°jðCñ Cô Cˆð 	�ŠÑÔÐØ×%Ò%Ñ'Ô'ˆØØÔ&¨
°FÔ4QÐS[ØÔ% y°&Ô2GÈðOßORÊsÐSWÐYbÑOcÔOcð	dr   c                 óü  — | j         }|r|j        d         |d         k    s|j        sd S |d         |j        }}|d         dk    rQ|dk    rI|j        sB|                      |¦  «         |                      ||d¬¦  «         |                      |¦  «         d S |dv r>|j        s3|j        r.|                      |¦  «         |                      |¦  «         d S d S d S |d	k    r|                      |¦  «         d
|_	        d S d S )Nr�   r  r9   r  r*  rê   r  )r*  r  r+  T)
rˆ   r0   r<   r>   Ú_mark_current_watchedr  Ú_advancer=   rÙ   r?   )rB   rv   rF   r  r<   s        r   r—   zEngine._on_action€  s5  € ØŒLˆØð 	�A”D˜”M T¨'¤]Ò2Ð2¸!¼&Ð2ØˆFØ˜H”~ q¤v�ˆØ�Œ<˜<Ò'Ð'Ø˜Ò#Ð#¨A¬JÐ#Ø×*Ò*¨1Ñ-Ô-Ð-Ø—’˜A˜t¨R�Ñ0Ô0Ð0Ø—’˜aÑ Ô Ð ØˆFØÐ,Ð,Ð,Ø”:ð ! !¤,ð !Ø×*Ò*¨1Ñ-Ô-Ð-Ø—’˜aÑ Ô Ð Ð Ð ð!ð !ð !ð !ð �xÒÐØ�OŠO˜AÑÔÐØˆAŒJˆJˆJð  Ðr   c                 ó  — |                      ¦   «         \  }}}}t          j        |||||j                             d¦  «        |j                             d¦  «        |j                             d¦  «        dœ¬¦  «         d|_        d S )NrÆ   rÇ   rÈ   rÉ   rÊ   T)r   r   rÖ   r0   r:   r@   )rB   rF   r9   r¾   rÛ   rÜ   s         r   r:  zEngine._mark_current_watched“  s�   € Ø)*¯ª©¬Ñ&ˆˆg�v˜wÝÔ˜4 ¨&°'Ø,-¬D¯HªH°WÑ,=Ô,=È1Ì4Ï8Ê8ÐT^ÑK_ÔK_Ø01´·²¸Ñ0EÔ0Eð#Gð #Gð	Hñ 	Hô 	Hð 	Hð  ˆÔÐÐr   c                 óH   — d|_         |                      |j        ¦  «         d S )NT)r>   rõ   r<   râ   s     r   r;  zEngine._advanceš  s#   € ØˆŒ
Ø�Š�q”vÑÔÐÐÐr   c           	      óâ  — t          j        d                     |                     d¦  «        p|                     dd¦  «        |                     dd¦  «        ¦  «                             ¦   «         |d         ¬¦  «        }|                     dd	¦  «         |                     ¦   «         }|                     |                     d
d¦  «        ¦  «         |                     d¦  «        rf|                     |d         ¦  «         | 	                    |d         ¦  «         | 
                    |d         ¦  «         |                     d¦  «         | j                             |d         |¦  «         dS )zhStart the planned next item (canonical URL, resolved lazily by the resolver with the auto-pick request).z{} {}r   Úcollection_namer    rð   rç   )Úlabelr  Ú
IsPlayableÚtruerŸ   rF   rG   rÜ   N)rz   ÚListItemr   r:   ÚstripÚsetPropertyÚgetVideoInfoTagÚsetTitleÚsetTvShowTitleÚ	setSeasonÚ
setEpisodeÚsetMediaTyper…   r   )rB   r<   ÚitemÚtags       r   rõ   zEngine.play_nextŸ  sS  € åÔ g§n¢n°T·X²X¸mÑ5LÔ5LÐ5oÐPT×PXÒPXÐYjÐlnÑPoÔPoØ6:·h²hÐ?OÐQSÑ6TÔ6Tñ'Vô 'VßV[ÒV[ÑV]ÔV]ÐdhÐitÔduðwñ wô wˆà×Ò˜ vÑ.Ô.Ð.Ø×"Ò"Ñ$Ô$ˆØ�Š�T—X’X˜g rÑ*Ô*Ñ+Ô+Ð+Ø�8Š8�MÑ"Ô"ð 	(Ø×Ò˜t MÔ2Ñ3Ô3Ð3Ø�MŠM˜$˜sœ)Ñ$Ô$Ð$Ø�NŠN˜4 œ9Ñ%Ô%Ð%Ø×Ò˜YÑ'Ô'Ð'ØŒ×Ò˜˜kÔ*¨DÑ1Ô1Ð1Ð1Ð1r   c                 óJ  — |j         r”t          j        d¦  «        }	 t          j        |                     t          j        ¦  «        pd¦  «                             d¦  «        |j         k    r| 	                    t          j        ¦  «         n# t          $ r Y nw xY wd|_         dS )z'Forget the queued item and its request.ry   z{}rç   N)r=   rz   r{   r~   r   r|   r   ÚREQUEST_PROPERTYr:   r§   r   )rB   rF   Úwindows      r   rÙ   zEngine.drop_queue­  s¡   € àŒ<ð 	Ý”^ EÑ*Ô*ˆFðÝ”:˜f×0Ò0µÔ1FÑGÔGÐOÈ4ÑPÔP×TÒTÐU`ÑaÔaÐefÔeqÒqÐqØ×(Ò(­Ô)>Ñ?Ô?Ð?øøÝð ð ð Ø�ðøøøàˆŒˆˆs   �A.B Â
BÂBc                 óZ   — t          j        t          ¦  «                             |¦  «        S r   )r"   r#   r$   ÚgetLocalizedString)rB   Ú	string_ids     r   r÷   zEngine._text¸  s    € ÝŒ�xÑ(Ô(×;Ò;¸IÑFÔFÐFr   c                 ól   — t          j        ¦   «                              d|t           j        d¦  «         d S )Nu
   MilionÃ¡Å™ip  )rz   r6  ÚnotificationÚNOTIFICATION_INFO)rB   Úmessages     r   rö   zEngine._notify»  s.   € ÝŒÑÔ×%Ò% l°G½WÔ=VÐX\Ñ]Ô]Ð]Ð]Ð]r   )r,   rE   rF   rG   Úsecrv   c                 ó¨  ‡‡— t          j        d¦  «        Št          j        d¦  «        rt          j        d¦  «        rXt          j        d¦  «        sBt	          ˆfd„| j        D ¦   «         ¦  «        r"| j        D ]}‰                     d|z   ¦  «         ŒdS t          j        d¦  «        Šˆfd„d	D ¦   «         }‰                     ¦   «         r't          j        d
 	                    ‰¦  «        ¦  «        nd|d<   |d         s1|d         r|d         s!t                               | j        d¦  «        }n6ddlm} |j                             t          j        d¦  «        d¦  «        |d<   |                     ¦   «         D ]U\  }}‰                     d|z   ¦  «        |k    r4|r‰                     d|z   |¦  «         Œ=‰                     d|z   ¦  «         ŒVdS )uN  Home widgets: the skin's context menu dialog cannot read the focused widget item, so the focused addon item
        (`milionar.type|tmdb|s|e`) is published as Window(Home) properties `milionar.focus.*` (080: our menu only), with
        `sec`, the widget section of the selected main menu item (the menu's "Upravit widgety", 070 Â§5).ry   úWindow.IsActive(home)úWindow.IsActive(contextmenu)c              3   óH   •K  — | ]}‰                      d |z   ¦  «        V — ŒdS )úmilionar.focus.N)r|   )Ú.0ÚkÚhomes     €r   ú	<genexpr>z'Engine.publish_focus.<locals>.<genexpr>Æ  sZ   øè è € ð  RTð  RTÐ~ÐRV×RbÒRbÐctÐwxÑcxÑRyÔRyð  RTð  RTð  RTð  RTð  RTð  RTr   r]  NúSystem.CurrentControlIDc           	      óŽ   •— i | ]A}|‰                      ¦   «         r(t          j        d                      ‰|¦  «        ¦  «        nd“ŒBS )z,Container({}).ListItem.Property(milionar.{})r    )Úisdigitr   ÚgetInfoLabelr   )r^  r   Úcontrols     €r   ú
<dictcomp>z(Engine.publish_focus.<locals>.<dictcomp>Ë  sg   ø€ ð Vð Vð VØ36ð Ø—_’_Ñ&Ô&ð/•tÔ(Ð)W×)^Ò)^Ð_fÐhkÑ)lÔ)lÑmÔmÐmØ,.ðVð Vð Vr   )r,   rE   rF   rG   z1Container({}).ListItem.Property(milionar.ctxdata)r    rv   r,   rE   r   )Úslotsz%Container(9000).ListItem.Property(id)rX  )rz   r{   r   ÚgetCondVisibilityÚanyÚ
FOCUS_KEYSr§   re  rd  r   ÚdictÚfromkeysÚwcs.skinrh  ÚMENU_SECTIONSr:   Úitemsr|   rE  )rB   r   Úvaluesrh  Úvaluerf  r`  s        @@r   Úpublish_focuszEngine.publish_focusÀ  so  øø€ õ Œ~˜eÑ$Ô$ˆÝÔ%Ð&=Ñ>Ô>ð 	Å$ÔBXÐYwÑBxÔBxð 	ÝÔ)Ð*HÑIÔIð @Ícð  RTð  RTð  RTð  RTð  DHô  DSð  RTñ  RTô  RTñ  OTô  OTð @Øœ?ð @ð @�CØ×&Ò&Ð'8¸3Ñ'>Ñ?Ô?Ð?Ð?ØˆFÝÔ#Ð$=Ñ>Ô>ˆðVð Vð Vð VØ:TðVñ Vô Vˆàsz÷  tCò  tCñ  tEô  tEð  M�Ô*Ð+^×+eÒ+eÐfmÑ+nÔ+nÑoÔoÐoð  KMˆˆv‰Ø�fŒ~ð 	t v¨f¤~ð 	t¸VÀF¼^ð 	tÝ—]’] 4¤?°BÑ7Ô7ˆFˆFà&Ð&Ð&Ð&Ð&Ð&Ø!Ô/×3Ò3µDÔ4EÐFmÑ4nÔ4nÐprÑsÔsˆF�5‰MØ Ÿ,š,™.œ.ð 	@ð 	@‰JˆC�Ø×ÒÐ 1°CÑ 7Ñ8Ô8¸EÒAÐAØð @Ø×$Ò$Ð%6¸Ñ%<¸eÑDÔDÐDÐDà×&Ò&Ð'8¸3Ñ'>Ñ?Ô?Ð?øð	@ð 	@r   c           	      ó¤  — t          j        d¦  «        rdS t          j        d¦  «        }t          j        d¦  «        }|rt          j        d¦  «        nd}|r)|                     ¦   «         rd                     |¦  «        nd}|s'|r|                     ¦   «         sd	\  | _        | _        dS t          j        |d
z   ¦  «        pd}t          j        |dz   ¦  «        pd}|                     d                     t          ¦  «        ¦  «        s%t          j
        |¦  «        sd	\  | _        | _        dS 	 t          dt          t          j        |dz   ¦  «        pd¦  «        ¦  «        }n# t          $ r Y dS w xY w||||f}|| j        k    s,| j        s%|                      ¦   «         | j        z
  t"          k    r0|dc| _        | _        |                      ¦   «         dc| _        | _        | j        €dS t          j
        |¦  «        r|gng }	t%          || j        t&          j        z   t+          |	¦  «        z
  ¦  «        }
t-          | j        |
¦  «        D ]Y}t          j        |d                     |¦  «        z   ¦  «        }||	vr)t          j
        |¦  «        r|	                     |¦  «         ŒZ|
|k     r|
nd| _        t'          j        |	|r|nd¦  «         dS )zTFocus/container changes trigger bounded cache-free snapshots; RPC runs only in jobs.r[  NrZ  zWindow.IsActive(videos)rb  r    zContainer({})Ú	Container)NNz.FolderPathz.ListItem.FileNameAndPathzplugin://{}/r   z	.NumItemsFz%.ListItemAbsolute({}).FileNameAndPath)r   ri  re  rd  r   rŠ   r‹   Ú
startswithr$   r   Úparser¯   r¥   r   rs   r‡   r‰   ÚADOPT_EVERY_SÚminr   ÚADOPT_BATCHÚlenÚrangeÚappendÚrequest_adoption)rB   r`  Úvideosrf  Ú	containerr  ÚfocusedÚcountÚ	signatureÚpathsÚendr3   rL  s                r   Úadopt_focusedzEngine.adopt_focusedÚ  sê  € åÔ!Ð"@ÑAÔAð 	ØˆFÝÔ%Ð&=Ñ>Ô>ˆÝÔ'Ð(AÑBÔBˆØBFÐN•$Ô#Ð$=Ñ>Ô>Ð>ÈBˆØ7;ÐbÀÇÂÑ@QÔ@QÐb�O×*Ò*¨7Ñ3Ô3Ð3ÐWbˆ	Øð 	˜tð 	¨7¯?ª?Ñ+<Ô+<ð 	Ø6@Ñ3ˆDÔ  $Ô"3ØˆFÝÔ  ¨]Ñ!:Ñ;Ô;ÐA¸rˆÝÔ# IÐ0KÑ$KÑLÔLÐRÐPRˆØ�Š˜~×4Ò4µXÑ>Ô>Ñ?Ô?ð 	ÍÌ
ÐSZÑH[ÔH[ð 	Ø6@Ñ3ˆDÔ  $Ô"3ØˆFð	Ý˜�3�tÔ0°¸[Ñ1HÑIÔIÐNÈQÑOÔOÑPÔPˆEˆEøÝð 	ð 	ð 	ØˆFˆFð	øøøà  e¨WÐ5ˆ	Ø˜Ô,Ò,Ð,°Ô0BÐ,ÀdÇhÂhÁjÄjÐSWÔSbÑFbÕfsÒFsÐFsØ6?ÀÐ3ˆDÔ  $Ô"3Ø26·(²(±*´*¸eÐ/ˆDŒO˜TÔ/ØÔÐ$ØˆFÝ!œZ¨Ñ0Ô0Ð8��	�	°bˆÝ�%˜Ô*­TÔ-=Ñ=ÅÀEÁ
Ä
ÑJÑKÔKˆÝ˜dÔ/°Ñ5Ô5ð 	#ð 	#ˆHÝÔ$ YÐ1X×1_Ò1_Ð`hÑ1iÔ1iÑ%iÑjÔjˆDØ˜5Ð Ð ¥T¤Z°Ñ%5Ô%5Ð Ø—’˜TÑ"Ô"Ð"øØ#&¨¢; ;˜C˜C°DˆÔÝÔ˜e¨VÐ%; T T¸Ñ<Ô<Ð<Ð<Ð<s   Ä24E' Å'
E5Å4E5r   )F)%rI   rJ   rK   Ú__doc__rX   rC   rš   r’   r´   Ústaticmethodr£   rª   r”   r•   r“   rã   rØ   r©   rÿ   rá   r«   r  r–   r  r  r  r  r—   r:  r;  rõ   rÙ   r÷   rö   rk  rs  r†  rL   r   r   rƒ   rƒ   r   s3  € € € € € ØXÐXà,0¬Ið #ð #ð #ð #ð&ð &ð &ð &ð$<ð <ð <ð0ð ð ð ðTð Tñ „\ðTð
 ðað añ „\ðað
!ð 
!ð 
!ð%ð %ð %ð %ðð ð ð4$ð $ð $ð<ð <ð <ð4Hð Hð Hð:ð :ð :ð[ð [ð [ðHð Hð Hðkð kð kðOð Oð Oð-ð -ð -ð)ð )ð )ðNð Nð Nðdð dð dð,ð ð ð& ð  ð  ðð ð ð
2ð 2ð 2ð	ð 	ð 	ðGð Gð Gð^ð ^ð ^ð ;€Jð@ð @ð @ð4!=ð !=ð !=ð !=ð !=r   rƒ   c                 óæ  — | pt          j        ¦   «         } 	 t          j        ¦   «         }|r"t	          d                     |¦  «        ¦  «         nD# t          $ r7}t	          d                     |¦  «        t           j        ¦  «         Y d}~nd}~ww xY w	 ddlm	} t          j        |j        | fdd¬¦  «                             ¦   «          nD# t          $ r7}t	          d	                     |¦  «        t           j        ¦  «         Y d}~nd}~ww xY wt          ¦   «         }t          |j        ¦  «        }t          j        t"          j        | fd
d¬¦  «                             ¦   «          t%          || ¦  «        }|                      ¦   «         �sf	 	 |j                             ¦   «         \  }}}	|                     |||	¦  «         Œ5# t,          j        $ r Y nVt          $ rJ}t	          d                     t1          |¦  «        j        |¦  «        t           j        ¦  «         Y d}~nd}~ww xY w	 |                     ¦   «          |                     ¦   «          |                     ¦   «          nW# t          $ rJ}t	          d                     t1          |¦  «        j        |¦  «        t           j        ¦  «         Y d}~nd}~ww xY w|                      t>          ¦  «        rdS |                      ¦   «         �¯ddS dS )zXService thread entry: recover from a crash, then process player events until Kodi exits.z.closed {} play log row(s) left open by a crashzcrash recovery failed: {}Nr   )Ú	refresherzmilionar-library-refresherT)rù   rú   Únamerû   zrefresher not started: {}zmilionar-library-jobszevent failed: {}: {}ztick failed: {}: {}) r   ÚMonitorr   Úclose_open_logsr   r   r½   r±   r»   rŠ  rü   rý   Úloopré   rN   rp   rS   r   rƒ   ÚabortRequestedÚ
get_nowaitrš   rQ   ÚEmptyr,   rI   ÚLOGERRORrã   r†  rs  ÚwaitForAbortÚLOOP_TICK_S)
r†   Úclosedr¿   rŠ  r…   Úadoption_monitorÚenginer˜   r™   rv   s
             r   Úrunr˜  þ  s8  € àÐ'�œ™œ€GðGÝÔ&Ñ(Ô(ˆØð 	RÝÐA×HÒHÈÑPÔPÑQÔQÐQøøÝð Gð Gð GÝÐ(×/Ò/°Ñ4Ô4µd´oÑFÔFÐFÐFÐFÐFÐFÐFøøøøðGøøøðGØ*Ð*Ð*Ð*Ð*Ð*ÝÔ 	¤°g°ZÐFbÐkoÐpÑpÔp×vÒvÑxÔxÐxÐxøÝð Gð Gð GÝÐ(×/Ò/°Ñ4Ô4µd´oÑFÔFÐFÐFÐFÐFÐFÐFøøøøðGøøøå‰YŒY€FÝ& v¤}Ñ5Ô5ÐÝÔ�DœI¨W¨JÐ=TÐ]aÐbÑbÔb×hÒhÑjÔjÐjÝ�F˜GÑ$Ô$€FØ×$Ò$Ñ&Ô&ñ ð	Xð1Ø$*¤M×$<Ò$<Ñ$>Ô$>Ñ!��t˜TØ—’˜e T¨4Ñ0Ô0Ð0ð1øõ Œ{ð 	ð 	ð 	ØˆDÝð 	Xð 	Xð 	XÝÐ'×.Ò.­t°C©y¬yÔ/AÀ3ÑGÔGÍÌÑWÔWÐWÐWÐWÐWÐWÐWøøøøð	Xøøøð	WØ�KŠK‰MŒMˆMØ× Ò Ñ"Ô"Ð"Ø× Ò Ñ"Ô"Ð"Ð"øÝð 	Wð 	Wð 	WÝÐ&×-Ò-­d°3©i¬iÔ.@À#ÑFÔFÍÌÑVÔVÐVÐVÐVÐVÐVÐVøøøøð	Wøøøà×Ò¥Ñ,Ô,ð 	ØˆEð! ×$Ò$Ñ&Ô&ñ ð ð ð ð sg   —7A Á
BÁ-BÂBÂ6C Ã
DÃ-DÄDÆ6G ÇH&Ç	H&ÇA H!È!H&È*<I' É'
J;É1A J6Ê6J;r   )"r‡  r~   rQ   rü   rX   r   r"   rz   r»   r   r   r   r   r   r   r$   r}   rÌ   rß   rx  r”  r®   r°   ÚLOGINFOr   r'   r)   ÚPlayerrN   rŒ  rp   r�   rƒ   r˜  rL   r   r   ú<module>r›     sÌ  ððð ð
 €€€Ø €€€Ø Ð Ð Ð Ø €€€à €€€Ø Ð Ð Ð Ø €€€à BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bà"€Ø€Ø€
ØÐ Ø€Ø€ØÐ ØÐ ð ”Lð ;ð ;ð ;ð ;ð	Fð 	Fð 	FðPð Pð Pð Pð Pñ Pô Pð Pð65ð 5ð 5ð 5ð 5ˆdŒkñ 5ô 5ð 5ð2Bð Bð Bð Bð B�d”lñ Bô Bð Bðð ð ðI=ð I=ð I=ð I=ð I=ñ I=ô I=ð I=ðX"ð "ð "ð "ð "ð "r   