§
   <o JÞø*ã                   ó(  — 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mZm	Z	 dZ
dddœZdZd	Zd
dhZdZej        fd„Zd+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,d„Zd-d„Zd.d „Z d/d!„Z!d0d"„Z"d#„ Z#d$„ Z$d%„ Z%d&„ Z&d'„ Z'd-d(„Z(d)„ Z)d-d*„Z*dS )1aP  Shared watch progress of the channels (MyTV / MyCinema) and the library (user decision 2026-10-06).

Settings `mytv_shared_progress` / `mycinema_shared_progress`, both on by default. With the switch on, library.db is
the only truth for the channels:

* reads: a channel's next episode, resume point and watched films come from the store (wcs/ai/ChannelHistory.py asks
  here), by the same rule as Continue watching (`next_up.next_up`);
* plays: a channel's play carries the tracker contract (`play.contract`, origin `channel`), so the service tracker saves
  resume / watched / the play log like for any library play; what comes next stays the channel's program
  (`follow` False) and the title joins My series / My movies;
* a manual progress edit in MyTV marks the episodes in the store (`set_pointer`).

The channel files (`mytv_history/<channel>.json`) are still written by the channel's own monitor. `sync` reconciles the
two worlds when the MyTV switch changes (service worker, the only place here that may use the network):
  on:  the further progress wins: the episodes up to a channel's pointer become watched in the store
  off: every channel takes over the store's current pointer and resume point
Until the first `sync` succeeded the channels keep reading their files (`active` is False), so a failed merge never
shows a series from its beginning.
é    N)ÚmetaÚstorezplugin.video.milionarÚmytv_shared_progressÚmycinema_shared_progress)ÚtvÚcinemazshared.tv.appliedzshared:syncÚwidget_mytv_nextÚwidget_mytv_channelséc   c                 óV   — t          j        d                     | ¦  «        |¦  «         d S )Nu   [MilionÃ¡Å™ Shared] {})ÚxbmcÚlogÚformat)ÚmessageÚlevels     úa/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/library2/shared.pyÚ_logr   '   s)   € Ý„HÐ%×,Ò,¨WÑ5Ô5°uÑ=Ô=Ð=Ð=Ð=ó    r   c                 óœ   — 	 t          j        t          ¦  «                             t          |          ¦  «        dk    S # t
          $ r Y dS w xY w)z/The user's switch; on unless it was turned off.ÚfalseT)Ú	xbmcaddonÚAddonÚADDON_IDÚ
getSettingÚSETTINGSÚ	Exception©Úkinds    r   Úenabledr   +   sP   € ðÝŒ�xÑ(Ô(×3Ò3µH¸T´NÑCÔCÀwÒNÐNøÝð ð ð Øˆtˆtðøøøs   ‚:= ½
AÁ
Ac                 ó’   — t          | ¦  «        sdS | dk    rdS 	 t          j        t          ¦  «        dk    S # t          $ r Y dS w xY w)zkThe store speaks for the channels of `kind` now (MyTV: only after its channels were merged into the store).Fr   TÚ1)r   r   Úget_flagÚFLAGr   r   s    r   Úactiver$   3   s_   € å�4‰=Œ=ð ØˆuØˆt‚|€|ØˆtðÝŒ~�dÑ#Ô# sÒ*Ð*øÝð ð ð Øˆuˆuðøøøs   ›8 ¸
AÁAc                  ó‚   — 	 t          j        t          ¦  «        t          d¦  «        rdndk    S # t          $ r Y dS w xY w)z2The MyTV switch changed and `sync` has work to do.r   r!   Ú0F)r   r"   r#   r   r   © r   r   Úpendingr(   ?   sM   € ðÝŒ~�dÑ#Ô#­w°t©}¬}Ð(E¨¨À#ÒFÐFøÝð ð ð Øˆuˆuðøøøs   ‚-0 °
>½>c                 óR   — 	 t          | ¦  «        S # t          t          f$ r Y d S w xY w)N)ÚintÚ	TypeErrorÚ
ValueError)Úvalues    r   Ú_numberr.   I   s:   € ðÝ�5‰zŒzÐøÝ•zÐ"ð ð ð Øˆtˆtðøøøs   ‚ ‘&¥&c                 ód   — t          | ¦  «        }|€i S d„ t          j        |¦  «        D ¦   «         S )z?{(season, episode): state} of the regular episodes of a series.Nc                 óH   — i | ]}|d          dk    ¯|d          |d         f|“Œ S )Úseasonr   Úepisoder'   ©Ú.0Úrs     r   ú
<dictcomp>z_states.<locals>.<dictcomp>U   s9   € ÐfÐfÐf¨qÐVWÐX`ÔVaÐdeÒVeÐVeˆQˆxŒ[˜!˜Iœ,Ð'¨ÐVeÐVeÐVer   )r.   r   Úget_episode_states)Ú	series_idÚshows     r   Ú_statesr:   P   s8   € å�9ÑÔ€DØ€|Øˆ	ØfÐfµEÔ4LÈTÑ4RÔ4RÐfÑfÔfÐfr   c                 óú   — d„ |                       ¦   «         D ¦   «         }|sd S t          |d„ ¬¦  «        }|d         |d         t          |d         ¦  «        t          |                     d¦  «        pd¦  «        d	œS )
Nc                 ó²   — g | ]T}t          |                     d ¦  «        pd¦  «        dk    ¯*t          |                     d¦  «        pd¦  «        dk    ¯R|‘ŒUS )Ú
resume_posr   Ú	playcount)ÚfloatÚgetr*   r3   s     r   ú
<listcomp>z_resume_of.<locals>.<listcomp>Y   se   € ÐtÐtÐt�!­%°·²°lÑ0CÔ0CÐ0HÀqÑ*IÔ*IÈAÒ*MÐ*MÕRUÐVW×V[ÒV[Ð\gÑVhÔVhÐVmÐlmÑRnÔRnÐrsÒRsÐRsˆAÐRsÐRsÐRsr   c                 ó0   — |                       d¦  «        pdS )NÚlast_played_atr   ©r@   )r5   s    r   ú<lambda>z_resume_of.<locals>.<lambda>\   s   €  !§%¢%Ð(8Ñ"9Ô"9Ð">¸Q€ r   )Úkeyr1   r2   r=   Úresume_totalr   ©r1   r2   ÚpositionÚtotal)ÚvaluesÚmaxr?   r@   )ÚstatesÚrowsÚrows      r   Ú
_resume_ofrP   X   s‰   € ØtÐt�v—}’}‘”ÐtÑtÔt€DØð ØˆtÝ
ˆdÐ>Ð>Ð
?Ñ
?Ô
?€CØ˜(”m°°I´ÍEÐRUÐVbÔRcÑLdÔLdÝ˜3Ÿ7š7 >Ñ2Ô2Ð7°aÑ8Ô8ð:ð :ð :r   c                 óD   — |dk    r| |dz
  fS | dk    r| dz
  t           fndS )zBThe channel pointer that makes (season, episode) the next episode.é   ©rR   r   )ÚBEFORE_FIRST©r1   r2   s     r   ÚbeforerV   a   s6   € à�‚{€{Ø�w ‘{Ð"Ð"Ø)/°!ª¨ˆF�Q‰J�Ð%Ð%¸Ð?r   c                 ó¾   — t          | ¦  «        }|rt          |d         |d         ¦  «        S d„ |                      ¦   «         D ¦   «         }|rt          |¦  «        ndS )Nr1   r2   c                 óh   — g | ]/\  }}t          |                     d ¦  «        pd¦  «        dk    ¯-|‘Œ0S )r>   r   )r*   r@   )r4   rF   r5   s      r   rA   z_pointer_of.<locals>.<listcomp>l   s@   € ÐTÐTÐT‘v�s˜Aµ3°q·u²u¸[Ñ7IÔ7IÐ7NÈQÑ3OÔ3OÐRSÒ3SÐ3SˆsÐ3SÐ3SÐ3Sr   rS   )rP   rV   ÚitemsrL   )rM   ÚpointÚwatcheds      r   Ú_pointer_ofr\   h   s`   € Ý�vÑÔ€EØð 9Ý�e˜H”o u¨YÔ'7Ñ8Ô8Ð8ØTÐT §¢¡¤ÐTÑTÔT€GØ"Ð.�3ˆw‰<Œ<ˆ<¨Ð.r   c                 ó:   — t          t          | ¦  «        ¦  «        S )z`The episode in progress (newest play first): {'season', 'episode', 'position', 'total'} or None.)rP   r:   ©r8   s    r   Úresumer_   p   s   € å•g˜iÑ(Ô(Ñ)Ô)Ð)r   c                 ó:   — t          t          | ¦  «        ¦  «        S )zß(season, episode) a channel counts as its last watched one: its next episode is the first after it. The same
    rule as Continue watching: an episode in progress comes first, else the one after the latest watched by order.)r\   r:   r^   s    r   Úpointerra   u   s   € õ •w˜yÑ)Ô)Ñ*Ô*Ð*r   c                 óÀ   — t          | ¦  «        }|�t          j        d|¦  «        nd }t          |o't	          |                     d¦  «        pd¦  «        dk    ¦  «        S )NÚmovier>   r   )r.   r   Ú	get_stateÚboolr*   r@   ©Úmovie_idrc   Ústates      r   Úmovie_watchedri   {   s[   € Ý�HÑÔ€EØ/4Ð/@�EŒO˜G UÑ+Ô+Ð+Àd€EÝ�Ð>�#˜eŸiši¨Ñ4Ô4Ð9¸Ñ:Ô:¸QÒ>Ñ?Ô?Ð?r   c                 ór  — t          | ¦  «        }|�t          j        d|¦  «        nd}|rPt          |                     d¦  «        pd¦  «        dk    s(t          |                     d¦  «        pd¦  «        dk    rdS ddt          |d         ¦  «        t          |                     d¦  «        pd¦  «        dœS )z5{'position', 'total'} of a film in progress, or None.Nrc   r=   r   r>   rG   rH   )r.   r   rd   r?   r@   r*   rf   s      r   Úmovie_resumerk   �   s½   € å�HÑÔ€EØ/4Ð/@�EŒO˜G UÑ+Ô+Ð+Àd€EØð •E˜%Ÿ)š) LÑ1Ô1Ð6°QÑ7Ô7¸1Ò<Ð<ÅÀEÇIÂIÈkÑDZÔDZÐD_Ð^_Ñ@`Ô@`ÐcdÒ@dÐ@dØˆtØ Aµ5¸¸|Ô9LÑ3MÔ3MÕX]Ð^c×^gÒ^gÐhvÑ^wÔ^wÐ^|Ð{|ÑX}ÔX}Ð~Ð~Ð~r   Fc           	      ó\  — ddl m} |                     d| ¦  «        }|€�|r‹ddl m} 	 |                     | ¦  «         nX# t
          $ rK}t          d                     | t          |¦  «        j	        ¦  «        t          j        ¦  «         Y d}~dS d}~ww xY w|                     d| ¦  «        }|S )zl[(season, episode)] of the aired regular episodes from the metadata cache; `network`: fetch what is missing.r   )Újobsr   N)Útmdbz%metadata of series {} unavailable: {})Úwcs.library2rm   Úcached_targetsrn   Úrefresh_showr   r   r   ÚtypeÚ__name__r   Ú
LOGWARNING)r8   Únetworkrm   Útargetsrn   Úexcs         r   Ú_airedrx   Œ   s×   € à!Ð!Ð!Ð!Ð!Ð!Ø×!Ò! $¨	Ñ2Ô2€GØ€˜7€Ø%Ð%Ð%Ð%Ð%Ð%ð	Ø×Ò˜iÑ(Ô(Ð(Ð(øÝð 	ð 	ð 	ÝÐ8×?Ò?À	Í4ÐPSÉ9Ì9ÔK]Ñ^Ô^Õ`dÔ`oÑpÔpÐpØ�4�4�4�4�4øøøøð	øøøð ×%Ò% d¨IÑ6Ô6ˆØ€Ns   ¨> ¾
BÁA BÂBTc                 óv  ‡— t          | ¦  «        }|�t          ||¦  «        nd}|€dS t          |¦  «        t          |¦  «        fŠt          |¦  «        t          t	          |¦  «        ¦  «        z  }t          j        d|ˆfd„|D ¦   «         d¦  «         t          j        d|ˆfd„|D ¦   «         d¦  «         dS )z¬Manual edit in MyTV: every aired episode up to (season, episode) is watched, every later one is not.
    Returns False when the episode list of the series is not available.NFr   c                 ó    •— g | ]
}|‰k    ¯|‘ŒS r'   r'   ©r4   ÚtrZ   s     €r   rA   zset_pointer.<locals>.<listcomp>¤   s   ø€ Ð BÐ BÐ B q°q¸E²z°z °z°z°zr   Tc                 ó    •— g | ]
}|‰k    ¯|‘ŒS r'   r'   r{   s     €r   rA   zset_pointer.<locals>.<listcomp>¥   s   ø€ Ð ?Ð ?Ð ? q°Q¸²Y°Y °Y°Y°Yr   )r.   rx   r*   Úsetr:   r   Ú	mark_many)r8   r1   r2   ru   r9   rv   ÚknownrZ   s          @r   Úset_pointerr�   ›   sÄ   ø€ õ �9ÑÔ€DØ'+Ð'7�f�T˜7Ñ#Ô#Ð#¸T€GØ€ØˆuÝ�‰[Œ[�#˜g™,œ,Ð'€EÝ�‰LŒL�3�w t™}œ}Ñ-Ô-Ñ-€EÝ	„O�D˜$Ð BÐ BÐ BÐ B¨GÐ BÑ BÔ BÀDÑIÔIÐIÝ	„O�D˜$Ð ?Ð ?Ð ?Ð ?¨EÐ ?Ñ ?Ô ?ÀÑGÔGÐGØˆ4r   Ú c                 óª  — |pi }| dk    r|                      d¦  «        n|                      d¦  «        p|pt          |¦  «        }| dk    rdnd}d|| dk    rdnd|d|                      |¦  «        pdd	d
…         d|                      dd¦  «        d|                      dd¦  «        d|                      dd¦  «        d|                      dd¦  «        iS )z`What a title stores when it joins My movies / My series (shown until its TMDb detail is cached).rc   ÚtitleÚnameÚrelease_dateÚfirst_air_dateÚidÚyearr‚   Né   ÚoverviewÚposter_pathÚbackdrop_pathÚvote_averager   )r@   Ústr)ÚmediaÚtmdb_idÚdatar„   r…   Údate_keys         r   Úlist_snapshotr”   ©   sì   € àˆ:�2€DØ!&¨'Ò!1Ð!1ˆD�HŠH�WÑÔÐ°t·x²xÀÑ7GÔ7GÐaÈEÐaÕUXÐY`ÑUaÔUa€DØ!&¨'Ò!1Ð!1ˆ~ˆ~Ð7G€HØ�' u°Ò'7Ð'7˜G˜G¸VÀdØ�T—X’X˜hÑ'Ô'Ð-¨2¨r°¨rÔ2°JÀÇÂÈÐUWÑ@XÔ@XØ˜4Ÿ8š8 M°2Ñ6Ô6¸ÈÏÊÐRaÐceÑIfÔIfØ˜DŸHšH ^°QÑ7Ô7ð9ð 9r   c                 ó,  — t          |¦  «        }t          j        | |¦  «        rdS t          j        | dk    rt          j        |¦  «        nt          j        |¦  «        ¦  «        d         }t          j        | |dt          | |||¦  «        ¦  «         dS )zkA title played from a channel belongs to My movies / My series. Cache only (runs beside the playback loop).Frc   r   T)	r*   r   Ú
is_in_listr   r@   Ú	key_movieÚkey_tvÚset_in_listr”   )r�   r‘   r„   r’   s       r   Úensure_listedrš   ´   s‹   € å�'‰lŒl€GÝÔ˜˜wÑ'Ô'ð ØˆuÝŒ8¨u¸Ò/?Ð/?•D”N 7Ñ+Ô+Ð+ÅTÄ[ÐQXÑEYÔEYÑZÔZÐ[\Ô]€DÝ	Ô�e˜W d­M¸%ÀÈ$ÐPUÑ,VÔ,VÑWÔWÐWØˆ4r   c	           	      óÜ   — ddl m}	 | dk    rdndt          |¦  «        | dk    rdnt          |¦  «        | dk    rdnt          |¦  «        dœ}
|	                     |
|||||	j        |¬¦  «        S )zfTracker contract of a channel's playlist item (its stream is resolved outside the canonical resolver).r   )Úplayrc   r2   N)rr   rn   ÚsÚe)r„   Ú
show_titleÚoriginÚfollow)ro   rœ   r*   ÚcontractÚORIGIN_CHANNEL)r�   r‘   ÚstreamÚselectedr1   r2   r„   rŸ   r¡   rœ   Úinfos              r   r¢   r¢   ¾   s�   € à!Ð!Ð!Ð!Ð!Ð!Ø$¨Ò/Ð/�G�G°YÍÈGÉÌØ 'Ò)Ð)��­s°6©{¬{ÈÐRYÒIYÐIYÀÀÕ_bÐcjÑ_kÔ_kðmð m€Dà�=Š=˜˜v x°uÈØ $Ô 3¸Fð ñ Dô Dð Dr   c                  óZ   — t          j        d                     t          ¦  «        ¦  «        S )Nz special://profile/addon_data/{}/)ÚxbmcvfsÚtranslatePathr   r   r'   r   r   Ú_profilerª   É   s"   € ÝÔ Ð!C×!JÒ!JÍ8Ñ!TÔ!TÑUÔUÐUr   c                  óN  — 	 t          t          j                             t	          ¦   «         d¦  «        dd¬¦  «        5 } t          j        | ¦  «        }d d d ¦  «         n# 1 swxY w Y   n# t          t          f$ r g cY S w xY wt          |t          ¦  «        rd„ |D ¦   «         ng S )Nzmytv_channels.jsonr5   zutf-8)Úencodingc                 óf   — g | ].}t          |t          ¦  «        ¯|                     d ¦  «        ¯,|‘Œ/S ©rˆ   )Ú
isinstanceÚdictr@   )r4   Úcs     r   rA   z_channels.<locals>.<listcomp>Ó   s6   € ÐCÐCÐC�!�z¨!­TÑ2Ô2ÐC°q·u²u¸T±{´{ÐCˆAÐCÐCÐCr   )ÚopenÚosÚpathÚjoinrª   ÚjsonÚloadÚOSErrorr,   r¯   Úlist)Úhandler’   s     r   Ú	_channelsr»   Í   sê   € ðÝ•"”'—,’,�x™zœzÐ+?Ñ@Ô@À#ÐPWÐXÑXÔXð 	%Ð\bÝ”9˜VÑ$Ô$ˆDð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%øøå•ZÐ ð ð ð Øˆ	ˆ	ˆ	ðøøøåGQÐRVÕX\ÑG]ÔG]ÐeÐCÐC�tÐCÑCÔCÐCÐceÐes4   ‚<A+ ¾AÁA+ ÁA#Á#A+ Á&A#Á'A+ Á+BÂ Bc                 ón   — d„ |                       d¦  «        p|                       d¦  «        pg D ¦   «         S )Nc                 óV   — g | ]&}t          |                     d ¦  «        ¦  «        ®$|‘Œ'S r®   )r.   r@   )r4   r�   s     r   rA   z_series_of.<locals>.<listcomp>×   s6   € ÐyÐyÐy�!ÕX_Ð`a×`eÒ`eÐfjÑ`kÔ`kÑXlÔXlÐXxˆAÐXxÐXxÐXxr   Ú
media_listÚseries_listrD   )Úchannels    r   Ú
_series_ofrÁ   Ö   s9   € ØyÐy�w—{’{ <Ñ0Ô0ÐT°G·K²KÀÑ4NÔ4NÐTÐRTÐyÑyÔyÐyr   c                 ó8  — 	 t          t          j                             t          j                             t          ¦   «         dd                     | ¦  «        ¦  «        ¦  «        ¦  «        S # t          $ r# t          t          j        ¦   «         ¦  «        cY S w xY w)NÚmytv_historyz{}.json)	r*   r³   r´   Úgetmtimerµ   rª   r   r¸   Útime)Ú
channel_ids    r   Ú_history_timerÇ   Ú   s   € ð Ý•2”7×#Ò#¥B¤G§L¢Lµ±´¸^ÈY×M]ÒM]Ð^hÑMiÔMiÑ$jÔ$jÑkÔkÑlÔlÐløÝð  ð  ð  Ý•4”9‘;”;ÑÔÐÐÐð øøøs   ‚A)A, Á,*BÂBc                  óØ   — ddl m}  	 t          t          j        t
          ¦  «                             d¦  «        p| j        ¦  «        S # t          $ r t          | j        ¦  «        cY S w xY w)Nr   ©ÚpolicyÚlib_resume_min_seconds)	ro   rÊ   r?   r   r   r   r   ÚDEFAULT_RESUME_MIN_SECONDSr,   rÉ   s    r   Ú_resume_thresholdrÍ   á   s{   € Ø#Ð#Ð#Ð#Ð#Ð#ð8Ý•Y”_¥XÑ.Ô.×9Ò9Ð:RÑSÔSÐxÐW]ÔWxÑyÔyÐyøÝð 8ð 8ð 8Ý�VÔ6Ñ7Ô7Ð7Ð7Ð7ð8øøøs   ˆ?A ÁA)Á(A)c                 ó´  ‡— ddl m} i }t          ¦   «         D �]é}|                     |d         ¦  «        }t	          |d         ¦  «        }t          |¦  «        D �]¥}|                     t          |d         ¦  «        ¦  «        pi }t          |                     d¦  «        ¦  «        pdt          |                     d¦  «        ¦  «        pdf}d}	t          |                     d¦  «        pd¦  «        dk    rt          |                     d	¦  «        ¦  «        pdt          |                     d
¦  «        ¦  «        pdt          |d         ¦  «        t          |                     d¦  «        pd¦  «        f}	|dk    r|	s�Œ(|                     t          |d         ¦  «        ¦  «        Š‰r|‰d         k    rG||	||                     d¦  «        p|                     d¦  «        pddœ|t          |d         ¦  «        <   �Œ§�Œëdt          ¦   «         }}
|                     ¦   «         D ]ü\  }Št          || ¦  «        }|€d}
Œt          j        d|ˆfd„|D ¦   «         d‰d         ¦  «         t!          |¦  «        }‰d         rŠt#          |¦  «        s{‰d         \  }}}}|                     ||f¦  «        pi }||k    rO||k    rIt          |                     d¦  «        pd¦  «        dk    r!t          j        d|||||‰d         ¬¦  «         t'          d|‰d         ¦  «         Œýt)          d                     t-          |¦  «        |
rdnd¦  «        ¦  «         |
S )a&  Switch on: the further progress wins. A series' furthest channel pointer marks its episodes watched in the
    store, a channel's resume point of an unwatched episode is kept, and the series joins My series.
    Returns False when a series could not be merged yet (its episode list is missing).r   ©ÚChannelHistoryrˆ   r1   rR   r2   NÚresume_positionÚresume_sÚresume_erG   rS   rZ   r…   r„   r‚   )rZ   r_   Úwhenr…   TFr   c                 ó,   •— g | ]}|‰d          k    ¯|‘ŒS )rZ   r'   )r4   r|   Úbests     €r   rA   z$merge_into_store.<locals>.<listcomp>  s'   ø€ Ð$NÐ$NÐ$N¨1¸1ÀÀWÄÒ;MÐ;M QÐ;MÐ;MÐ;Mr   rÔ   r_   r>   )rÔ   z1merged {} series of the channels into the store{}z  (some are waiting for metadata))Úwcs.airÐ   r»   Úload_channel_historyrÇ   rÁ   r@   r�   r.   r?   r*   rÍ   rY   rx   r   r   r:   rP   Úsave_resumerš   r   r   Úlen)ru   rÐ   ÚfurthestrÀ   ÚhistoryrÔ   ÚseriesÚentryrZ   Úresume_pointÚcompleteÚminimumr9   rv   rM   r1   r2   rI   rJ   rh   rÖ   s                       @r   Úmerge_into_storerâ   é   s   ø€ ð &Ð%Ð%Ð%Ð%Ð%Ø€HÝ‘;”;ð gñ gˆØ ×5Ò5°g¸d´mÑDÔDˆÝ˜W Tœ]Ñ+Ô+ˆÝ  Ñ)Ô)ð 	gñ 	gˆFØ—K’K¥ F¨4¤LÑ 1Ô 1Ñ2Ô2Ð8°bˆEÝ˜UŸYšY xÑ0Ô0Ñ1Ô1Ð6°Q½ÀÇ	Â	È)Ñ@TÔ@TÑ8UÔ8UÐ8ZÐYZÐ[ˆEØˆLÝ�U—Y’YÐ0Ñ1Ô1Ð6°QÑ7Ô7¸!Ò;Ð;Ý '¨¯	ª	°*Ñ(=Ô(=Ñ >Ô >Ð CÀ!ÅWÈUÏYÊYÐWaÑMbÔMbÑEcÔEcÐEhÐghÝ % eÐ,=Ô&>Ñ ?Ô ?ÅÀuÇyÂyÐQ_ÑG`ÔG`ÐGeÐdeÑAfÔAfð h�à˜Šˆ |ˆÙØ—<’<¥ F¨4¤LÑ 1Ô 1Ñ2Ô2ˆDØð g˜5 4¨¤=Ò0Ð0Ø8=ÈÐ_cØ6<·j²jÀÑ6HÔ6HÐ6eÈFÏJÊJÐW^ÑL_ÔL_Ð6eÐceð/gð /g��˜V Dœ\Ñ*Ô*Ñ+ùñ	gð Õ/Ñ1Ô1ˆg€HØ—n’nÑ&Ô&ð 0ð 0‰
ˆˆdÝ˜˜wÑ'Ô'ˆØˆ?ØˆHØÝŒ˜˜dÐ$NÐ$NÐ$NÐ$N°Ð$NÑ$NÔ$NÐPTÐVZÐ[aÔVbÑcÔcÐcÝ˜‘”ˆØ�Œ>ð 	c¥*¨VÑ"4Ô"4ð 	cØ/3°H¬~Ñ,ˆF�G˜X uØ—J’J ¨Ð0Ñ1Ô1Ð7°RˆEØ˜7Ò"Ð" u¨xÒ'7Ð'7½CÀÇ	Â	È+Ñ@VÔ@VÐ@[ÐZ[Ñ<\Ô<\Ð`aÒ<aÐ<aÝÔ! $¨¨h¸¸vÀwÐUYÐZ`ÔUaÐbÑbÔbÐbÝ�d˜D $ v¤,Ñ/Ô/Ð/Ð/ÝÐ	<×	CÒ	CÅCÈÁMÄMÐYað  TJÐSUÐSUð  hJñ  
Kô  
Kñ  Lô  Lð  LØ€Or   c            	      ó*  — ddl m}  t          ¦   «         D ]ý}t          |                      |d         ¦  «        ¦  «        }t          |¦  «        D ]§}t          |d         ¦  «        }|sŒt          |¦  «        \  }}||dœ}t          |¦  «        }|rM| 	                    t          |d         d¦  «        t          |d         d¦  «        |d         |d	         ¬
¦  «         ||t          |d         ¦  «        <   Œ¨|                      |d         |¦  «         ŒþdS )zVSwitch off: every channel continues from the store's current pointer and resume point.r   rÏ   rˆ   rU   rI   rR   rJ   r1   r2   )rÑ   rG   rÒ   rÓ   T)r×   rÐ   r»   r°   rØ   rÁ   r:   r\   rP   ÚupdateÚroundr�   Úsave_channel_history)	rÐ   rÀ   rÜ   rÝ   rM   r1   r2   rÞ   rZ   s	            r   Úcopy_to_channelsrç     s<  € à%Ð%Ð%Ð%Ð%Ð%Ý‘;”;ð Dð DˆÝ�~×:Ò:¸7À4¼=ÑIÔIÑJÔJˆÝ  Ñ)Ô)ð 
	/ð 
	/ˆFÝ˜V Dœ\Ñ*Ô*ˆFØð ØÝ)¨&Ñ1Ô1‰OˆF�GØ%°'Ð:Ð:ˆEÝ˜vÑ&Ô&ˆEØð RØ—’­U°5¸Ô3DÀaÑ-HÔ-HÕW\Ð]bÐcjÔ]kÐmnÑWoÔWoØ&+¨H¤oÀÀiÔ@Pð ñ Rô Rð Rà).ˆG•C˜˜tœÑ%Ô%Ñ&Ð&Ø×+Ò+¨G°D¬M¸7ÑCÔCÐCÐCØˆ4r   c                 óN  — t          d¦  «        rdnd}t          j        t          ¦  «        }||k    rdS |dk    rt	          | ¦  «        }n|dk    rt          ¦   «         nd}|rBt          j        t          |¦  «         ddlm} | 	                    |j
        t          z  ¦  «         |S )ziBring the channels and the store together after the MyTV switch changed. True when nothing is left to do.r   r!   r&   Tr   )Úrefresh)r   r   r"   r#   râ   rç   Úset_flagÚwcs.skinré   ÚchangedÚSERIES_ROWSÚ	MYTV_ROWS)ru   ÚwantÚcurrentÚdoneré   s        r   Úsyncrò   %  s¯   € å˜$‘-”-Ð(ˆ3ˆ3 S€DÝŒn�TÑ"Ô"€GØ�$‚€ØˆtØˆs‚{€{Ý Ñ(Ô(ˆˆà%,°¢^ ^ÕÑ!Ô!Ð!¸ˆØð 9ÝŒ•t˜TÑ"Ô"Ð"Ø$Ð$Ð$Ð$Ð$Ð$Ø�Š˜Ô+­iÑ7Ñ8Ô8Ð8Ø€Kr   )r   )F)T)Nr‚   )r‚   )NNr‚   r‚   F)+Ú__doc__r¶   r³   rÅ   r   r   r¨   ro   r   r   r   r   r#   ÚSYNC_JOBrî   rT   ÚLOGINFOr   r   r$   r(   r.   r:   rP   rV   r\   r_   ra   ri   rk   rx   r�   r”   rš   r¢   rª   r»   rÁ   rÇ   rÍ   râ   rç   rò   r'   r   r   ú<module>rö      sr  ððð ð& €€€Ø 	€	€	€	Ø €€€à €€€Ø Ð Ð Ð Ø €€€à $Ð $Ð $Ð $Ð $Ð $Ð $Ð $à"€Ø(Ð4NÐOÐO€Ø€Ø€ØÐ!7Ð8€	Ø€ð œð >ð >ð >ð >ðð ð ð ð	ð 	ð 	ð 	ðð ð ðð ð ðgð gð gð:ð :ð :ð@ð @ð @ð/ð /ð /ð*ð *ð *ð
+ð +ð +ð@ð @ð @ðð ð ðð ð ð ðð ð ð ð9ð 9ð 9ð 9ðð ð ð ðDð Dð Dð DðVð Vð Vðfð fð fðzð zð zð ð  ð  ð8ð 8ð 8ð%ð %ð %ð %ðPð ð ð(ð ð ð ð ð r   