§
   “Åhäé|Bã                   óR   — d Z ddlmZ dZd„ Zd„ Zd„ Zd„ Zdd	„Zd
„ Z	d„ Z
d„ Zd„ ZdS )uß   Next episode / Continue logic (docs/plan/milionar-library/050 Â§1-2, Â§5): pure functions, no Kodi, no store.

Inputs are plain dicts: TMDb show + season data (as cached in `meta`), watch states keyed by (season, episode).
é    )Údate)ÚEndedÚCanceledÚ	Cancelledc                 óÆ   — 	 d„ t          | ¦  «        d d…                              d¦  «        D ¦   «         \  }}}t          |||¦  «        S # t          t          f$ r Y d S w xY w)Nc              3   ó4   K  — | ]}t          |¦  «        V — Œd S ©N)Úint)Ú.0Úxs     úb/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/library2/next_up.pyú	<genexpr>z_parse_date.<locals>.<genexpr>   s(   è è € ÐFÐF q�C ™FœFÐFÐFÐFÐFÐFÐFó    é
   ú-)ÚstrÚsplitr   Ú
ValueErrorÚ	TypeError)ÚtextÚyearÚmonthÚdays       r   Ú_parse_dater      sv   € ðØFÐF­C°©I¬I°c°r°c¬N×,@Ò,@ÀÑ,EÔ,EÐFÑFÔFÑˆˆe�SÝ�D˜% Ñ%Ô%Ð%øÝ�	Ð"ð ð ð Øˆtˆtðøøøs   ‚AA ÁA ÁA c                 ód  — t          d„ |                      d¦  «        pg D ¦   «         ¦  «        }g }|D ]ü}|                     |¦  «        pi }t          |                     d¦  «        pg d„ ¬¦  «        D ]»}t          |                     d¦  «        ¦  «        }|                     |t	          |d         ¦  «        |r|                     ¦   «         ndt          |o||k    ¦  «        |                     d	d¦  «        |                     d
¦  «        pd|                     d¦  «        pddœ¦  «         Œ¼Œý|S )a‰  Regular episodes of a series in play order (specials, season 0, excluded - decision 9).

    show     TMDb tv details ('seasons': [{'season_number'}...])
    seasons  {season_number: TMDb season details ('episodes': [...])}; seasons without data are skipped
    Returns [{'s', 'e', 'air_date', 'aired', 'name', 'runtime', 'still'}...]. An episode without air_date counts as
    not aired.
    c                 ó†   — h | ]>}t          |                     d d¦  «        ¦  «        dk    ¯)t          |d          ¦  «        ’Œ?S )Úseason_numberr   ©r
   Úget)r   Úss     r   ú	<setcomp>z episode_order.<locals>.<setcomp>   sL   € ÐyÐyÐy°!ÕVYÐZ[×Z_ÒZ_Ð`oÐqrÑZsÔZsÑVtÔVtÐwxÒVxÐVx•c˜!˜OÔ,Ñ-Ô-ÐVxÐVxÐVxr   ÚseasonsÚepisodesc                 ó.   — |                       dd¦  «        S )NÚepisode_numberr   ©r   )Úes    r   ú<lambda>zepisode_order.<locals>.<lambda>   s   € À1Ç5Â5ÐIYÐ[\ÑC]ÔC]€ r   ©ÚkeyÚair_dater%   Ú ÚnameÚruntimer   Ú
still_path)r    r'   r+   Úairedr-   r.   Ústill)Úsortedr   r   Úappendr
   Ú	isoformatÚbool)	Úshowr"   ÚtodayÚnumbersÚorderÚnumberÚdataÚepÚairs	            r   Úepisode_orderr>      s[  € õ ÐyÐy¸¿ºÀÑ8KÔ8KÐ8QÈrÐyÑyÔyÑzÔz€GØ€EØð cð cˆØ�{Š{˜6Ñ"Ô"Ð( bˆÝ˜Ÿš *Ñ-Ô-Ð3°Ð9]Ð9]Ð^Ñ^Ô^ð 	cð 	cˆBÝ˜bŸfšf ZÑ0Ô0Ñ1Ô1ˆCØ�LŠL˜v­C°Ð3CÔ0DÑ,EÔ,EÐfiÐSqÐSV×S`ÒS`ÑSbÔSbÐSbÐoqÝ#'¨Ð(<°°u²Ñ#=Ô#=ÀrÇvÂvÈfÐVXÑGYÔGYØ%'§V¢V¨IÑ%6Ô%6Ð%;¸!ÀbÇfÂfÈ\ÑFZÔFZÐF`Ð^`ðbð bñ cô cð cð cð	cð
 €Lr   c                 óL   — |                       |d         |d         f¦  «        pi S )Nr    r'   r&   )Ústatesr<   s     r   Ú_staterA   '   s&   € Ø�:Š:�r˜#”w  3¤Ð(Ñ)Ô)Ð/¨RÐ/r   c                 óp   ‡— d„ | D ¦   «         }t          |¦  «        ot          ˆfd„|D ¦   «         ¦  «        S )zaTrue when every aired regular episode was watched (playcount > 0); an empty order is not watched.c                 ó"   — g | ]}|d          ¯
|‘ŒS )r0   © )r   r<   s     r   ú
<listcomp>z"series_watched.<locals>.<listcomp>-   s!   € Ð/Ð/Ð/�B 2 g¤;Ð/ˆRÐ/Ð/Ð/r   c              3   ó„   •K  — | ]:}t          t          ‰|¦  «                             d ¦  «        pd¦  «        dk    V — Œ;dS )Ú	playcountr   N)r
   rA   r   ©r   r<   r@   s     €r   r   z!series_watched.<locals>.<genexpr>.   sN   øè è € ÐaÐaÐUW�s¥6¨&°"Ñ#5Ô#5×#9Ò#9¸+Ñ#FÔ#FÐ#KÈ!ÑLÔLÈqÒPÐaÐaÐaÐaÐaÐar   )r5   Úall)r9   r@   r0   s    ` r   Úseries_watchedrJ   +   sE   ø€ à/Ð/˜%Ð/Ñ/Ô/€EÝ�‰;Œ;Ða�3ÐaÐaÐaÐaÐ[`ÐaÑaÔaÑaÔaÐar   Nc                 óò   ‡— ˆfd„| D ¦   «         }d„ |D ¦   «         }|rt          |d„ ¬¦  «        d         }d|dœS d„ t          |¦  «        D ¦   «         }|sd	d	dœS t          | t          |¦  «        |¦  «        S )
uK  Continue state of a series (050 Â§2).

    Returns {'kind': 'resume' | 'next' | 'upcoming' | 'finished' | 'caught_up' | None, 'episode': dict | None}
      resume     an episode with a resume point (newest play first)
      next       first episode after the latest watched one *by order*
      upcoming   that next episode exists but is not aired (not playable, shows its air date)
      finished   nothing follows and the series ended
      caught_up  nothing follows, the series is still running (nothing announced yet)
      None       no watch activity at all (not in Continue)
    c                 ó4   •— g | ]}|t          ‰|¦  «        f‘ŒS rD   )rA   rH   s     €r   rE   znext_up.<locals>.<listcomp><   s(   ø€ Ð7Ð7Ð7¨2ˆr•6˜& "Ñ%Ô%Ð&Ð7Ð7Ð7r   c                 ó¼   — g | ]Y\  }}t          |                     d ¦  «        pd¦  «        dk    ¯-t          |                     d¦  «        pd¦  «        dk    ¯U||f‘ŒZS )Ú
resume_posr   rG   )Úfloatr   r
   )r   r<   Ústs      r   rE   znext_up.<locals>.<listcomp>=   sx   € ð  Að  Að  A¡  BµE¸"¿&º&ÀÑ:NÔ:NÐ:SÐRSÑ4TÔ4TÐWXÒ4XÐ4XÕ]`Ðac×agÒagÐhsÑatÔatÐayÐxyÑ]zÔ]zÐ~Ò]Ð]�B˜�8Ð]Ð]Ð]r   c                 ó<   — | d                               d¦  «        pdS )Né   Úlast_played_atr   r&   ©Úpairs    r   r(   znext_up.<locals>.<lambda>?   s   € ¨t°A¬w¯{ª{Ð;KÑ/LÔ/LÐ/QÐPQ€ r   r)   r   Úresume©ÚkindÚepisodec                 ón   — g | ]2\  }\  }}t          |                     d ¦  «        pd¦  «        dk    ¯0|‘Œ3S )rG   r   r   )r   ÚiÚ_eprP   s       r   rE   znext_up.<locals>.<listcomp>A   sE   € ÐdÐdÐd™\˜Q¡	  bÅ#ÀbÇfÂfÈ[ÑFYÔFYÐF^Ð]^ÑB_ÔB_ÐbcÒBcÐBc�qÐBcÐBcÐBcr   N)ÚmaxÚ	enumerateÚafter_index)r9   r@   Ústatusr7   ÚactiveÚin_progressr<   Úwatched_indexess    `      r   Únext_uprd   1   s½   ø€ ð 8Ð7Ð7Ð7°Ð7Ñ7Ô7€Fð Að  A¨&ð  Añ  Aô  A€KØð 1Ý�Ð"QÐ"QÐRÑRÔRÐSTÔUˆØ ¨RÐ0Ð0Ð0ØdÐd­Y°vÑ->Ô->ÐdÑdÔd€OØð /Ø¨Ð.Ð.Ð.Ý�u�c /Ñ2Ô2°FÑ;Ô;Ð;r   c                 ó‚   — |dz   t          | ¦  «        k     r| |dz            }|d         rdnd|dœS |t          v rdndddœS )	zcThe state of the series once the episode at `index` in `order` is watched (also used for autoplay).rR   r0   ÚnextÚupcomingrW   ÚfinishedÚ	caught_upN)ÚlenÚENDED_STATUSES)r9   Úindexr`   Ú	candidates       r   r_   r_   G   s_   € àˆq�y•3�u‘:”:ÒÐØ˜% !™)Ô$ˆ	Ø"+¨GÔ"4ÐD˜˜¸*ÐQZÐ[Ð[Ð[Ø"(­NÐ":Ð":�J�JÀÐX\Ð]Ð]Ð]r   c                 óˆ   — t          | ¦  «        D ].\  }}|d         |d         f||fk    rt          | ||¦  «        c S Œ/dddœS )zTAutoplay: what follows S<season>E<episode> as if it were watched, rollover included.r    r'   ri   NrW   )r^   r_   )r9   ÚseasonrY   r`   r[   r<   s         r   Ú
next_afterrp   O   sg   € å˜5Ñ!Ô!ð 1ð 1‰ˆˆ2ØˆsŒG�R˜”WÐ &¨'Ð!2Ò2Ð2Ý˜u a¨Ñ0Ô0Ð0Ð0Ð0ð 3ð  ¨DÐ1Ð1Ð1r   c                 ó°  — g }|                       d¦  «        pg D ]\}t          |                      d¦  «        ¦  «        }|r6||k    r0|                      d¦  «        |k    r|                     ||f¦  «         Œ]t          |d„ ¬¦  «        D ]L\  }}t	          |                      |d         ¦  «        pi                       d¦  «        pd¦  «        dk    r|c S ŒMdS )	uÞ   Next film of the collection by release date that is released and not watched (050 Â§5), or None.

    collection   TMDb collection ('parts': [{'id', 'title', 'release_date'}])
    movie_states {tmdb_id: {'playcount'}}
    ÚpartsÚrelease_dateÚidc                 óJ   — | d         | d                               dd¦  «        fS )Nr   rR   rt   r&   rT   s    r   r(   z$next_in_collection.<locals>.<lambda>c   s#   € ¸4À¼7ÀDÈÄGÇKÂKÐPTÐVWÑDXÔDXÐ:Y€ r   r)   rG   r   N)r   r   r3   r2   r
   )Ú
collectionÚ
current_idÚmovie_statesr7   rr   ÚpartÚreleasedÚ	_releaseds           r   Únext_in_collectionr|   X   sõ   € ð €EØ—’˜wÑ'Ô'Ð-¨2ð +ð +ˆÝ˜tŸxšx¨Ñ7Ô7Ñ8Ô8ˆØð 	+˜ EÒ)Ð)¨d¯hªh°t©n¬nÀ
Ò.JÐ.JØ�LŠL˜( DÐ)Ñ*Ô*Ð*øÝ! %Ð-YÐ-YÐZÑZÔZð ð ‰ˆ	�4Ý�× Ò   d¤Ñ,Ô,Ð2°×7Ò7¸ÑDÔDÐIÈÑJÔJÈaÒOÐOØˆKˆKˆKð Pàˆ4r   c                 óh   — t          | ¦  «        }|r d                     |j        |j        ¦  «        ndS )zE'2026-10-12' -> '12. 10.' (Czech short date used in "vyjde 12. 10.").z{}. {}.r,   )r   Úformatr   r   )Úiso_dateÚparseds     r   Ú	air_labelr�   i   s3   € å˜Ñ"Ô"€FØ9?ÐGˆ9×Ò˜FœJ¨¬Ñ5Ô5Ð5ÀRÐGr   r	   )Ú__doc__Údatetimer   rk   r   r>   rA   rJ   rd   r_   rp   r|   r�   rD   r   r   ú<module>r„      sÉ   ððð ð Ð Ð Ð Ð Ð à3€ðð ð ðð ð ð(0ð 0ð 0ðbð bð bð<ð <ð <ð <ð,^ð ^ð ^ð2ð 2ð 2ðð ð ð"Hð Hð Hð Hð Hr   