§
   þþ�fô)ã                   ó¼   — d Z ddlZddlZddlmZ dZdez  Zdez  ZdZdez  Z	dZ
d„ Zd	„ Zd
„ Zd„ Zd„ Zdd„Zd„ Zdd„Zdd„Zd„ Zdd„Zd„ Zdd„Zdd„Zd„ Zd„ ZdS )uŸ  TMDb metadata cache inside library.db (docs/plan/milionar-library/030 Â§3).

Keys: movie:<id>, tv:<id>, season:<id>:<n>, collection:<id>, plus the generic key space http:<sha256> that
wcs/metadata/TMDbCache.py uses for everything else (logos, aliases, search results, ÄŒSFD pages). Readers get
(data, stale); a stale or missing entry never blocks on the network here, the
caller decides whether to queue a refresh.
é    N)Ústorei€Q é   iÀ¨  )zReturning SerieszIn ProductionÚPlannedÚPilotc                 óF   — d                      t          | ¦  «        ¦  «        S )Nzmovie:{}©ÚformatÚint©Útmdb_ids    ú_/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/library2/meta.pyÚ	key_movier      s   € Ø×Ò�S ™\œ\Ñ*Ô*Ð*ó    c                 óF   — d                      t          | ¦  «        ¦  «        S )Nztv:{}r   r   s    r   Úkey_tvr      s   € Ø�>Š>�#˜g™,œ,Ñ'Ô'Ð'r   c                 ób   — d                      t          | ¦  «        t          |¦  «        ¦  «        S )Nzseason:{}:{}r   )r   Úseasons     r   Ú
key_seasonr      s$   € Ø× Ò ¥ W¡¤­s°6©{¬{Ñ;Ô;Ð;r   c                 óF   — d                      t          | ¦  «        ¦  «        S )Nzcollection:{}r   )Úcollection_ids    r   Úkey_collectionr   "   s   € Ø×!Ò!¥# mÑ"4Ô"4Ñ5Ô5Ð5r   c                 ó0   — | t           v rt          nt          S )uU   tv:<id> and its seasons: 12 h while the show is running, 30 days otherwise (030 Â§3).)ÚRUNNING_STATUSESÚTTL_RUNNINGÚ	TTL_ENDED)Ústatuss    r   Úttl_for_statusr   &   s   € à Õ$4Ð4Ð4�;ˆ;½)ÐCr   c                 ó.   — t          | ||fg|¦  «         d S ©N)Úput_many)ÚkeyÚdataÚttlÚnows       r   Úputr%   +   s"   € Ýˆs�D˜#ÐÐ Ñ%Ô%Ð%Ð%Ð%r   c                 óâ   — ddl m} |                      d¦  «        r|                     dd¬¦  «        S |                      d¦  «        r|                     dd¬¦  «        d	hz  S t	          ¦   «         S )
Nr   )Úrefreshzmovie:ÚmovieT)Ú
membership)ztv:zseason:ÚtvÚwidget_mytv_next)Úwcs.skinr'   Ú
startswithÚ
media_rowsÚset)r!   r'   s     r   Ú	_rows_forr0   /   s‚   € Ø Ð Ð Ð Ð Ð Ø
‡~‚~�hÑÔð <Ø×!Ò! '°dÐ!Ñ;Ô;Ð;Ø
‡~‚~Ð(Ñ)Ô)ð PØ×!Ò! $°4Ð!Ñ8Ô8Ð<NÐ;OÑOÐOÝ‰5Œ5€Lr   c                 ó<  — t          | ¦  «        } | sdS t          |�|nt          j        ¦   «         ¦  «        }t          j        ¦   «         5 }| D ]´\  }}}t          j        |ddd¬¦  «        }|                     d|f¦  «                             ¦   «         }|du pt          j	        |d         ¦  «        |k    }	|                     d|||t          |¦  «        f¦  «         |	r"t          j
        |t          |¦  «        ¦  «         Œµ	 ddd¦  «         dS # 1 swxY w Y   dS )	zPCommit a complete metadata snapshot together; unchanged content only renews TTL.NFT)ú,ú:)Úensure_asciiÚ	sort_keysÚ
separatorsz!SELECT json FROM meta WHERE key=?ÚjsonzGINSERT OR REPLACE INTO meta(key, json, fetched_at, ttl) VALUES(?,?,?,?))Úlistr
   Útimer   Útxr7   ÚdumpsÚexecuteÚfetchoneÚloadsÚdirtyr0   )
Úentriesr$   ÚfetchedÚconnr!   r"   r#   ÚencodedÚoldÚchangeds
             r   r    r    8   sd  € å�7‰mŒm€GØð ØˆÝ˜˜�#�#­d¬i©k¬kÑ:Ô:€GÝ	Œ‰Œð 2�tØ%ð 	2ð 	2‰NˆC��sÝ”j °EÀTÐV`ÐaÑaÔaˆGØ—,’,ÐBÀSÀFÑKÔK×TÒTÑVÔVˆCØ˜T�kÐD¥T¤Z°°F´Ñ%<Ô%<ÀÒ%DˆGØ�LŠLÐbØ˜w¨µ°S±´Ð:ñ<ô <ð <àð 2Ý”˜D¥)¨C¡.¤.Ñ1Ô1Ð1øð	2ð2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2ð 2ð 2s   ÁB8DÄDÄDc                 ó†  — t          j        ¦   «         }	 |                     d| f¦  «                             ¦   «         }|                     ¦   «          n# |                     ¦   «          w xY w|sdS t          |�|nt          j        ¦   «         ¦  «        |d         z
  |d         k    }t          j        |d         ¦  «        |fS )z<(data, stale) or (None, True) when the key was never cached.z2SELECT json, fetched_at, ttl FROM meta WHERE key=?)NTNÚ
fetched_atr#   r7   )	r   Úconnectr<   r=   Úcloser
   r9   r7   r>   )r!   r$   rB   ÚrowÚstales        r   ÚgetrL   I   s®   € åŒ=‰?Œ?€DðØ�lŠlÐOÐRUÐQWÑXÔX×aÒaÑcÔcˆà�
Š
‰Œˆˆøˆ�
Š
‰ŒˆˆøøøØð ØˆzÝ˜˜��­T¬Y©[¬[Ñ9Ô9¸CÀÔ<MÑMÐRUÐV[ÔR\Ò\€EÝŒ:�c˜&”kÑ"Ô" EÐ)Ð)ó   •)A ÁA)c                 óX   — d„ t          | ¦  «                             ¦   «         D ¦   «         S )zc{key: data} of the cached keys (one connection; stale entries are served, absent keys are missing).c                 ó&   — i | ]\  }}||d          “ŒS )r   © )Ú.0r!   Úvalues      r   ú
<dictcomp>zget_many.<locals>.<dictcomp>X   s"   € ÐJÐJÐJ™j˜c 5ˆC��q”ÐJÐJÐJr   )Úget_many_statusÚitems)Úkeyss    r   Úget_manyrW   V   s*   € àJÐJ­O¸DÑ,AÔ,A×,GÒ,GÑ,IÔ,IÐJÑJÔJÐJr   c                 ó6  ‡— t          | ¦  «        } | si S t          j        ¦   «         }	 i }t          dt	          | ¦  «        d¦  «        D ] }| ||dz   …         }|                     d                     d                     dt	          |¦  «        z  ¦  «        ¦  «        |¦  «        }t          |�|nt          j	        ¦   «         ¦  «        Š| 
                    ˆfd„|D ¦   «         ¦  «         Œ¡	 |                     ¦   «          n# |                     ¦   «          w xY w|S )z9Bulk metadata and freshness, including expired snapshots.r   iô  z:SELECT key,json,fetched_at,ttl FROM meta WHERE key IN ({})r2   ú?Nc                 ó|   •— i | ]8}|d          t          j        |d         ¦  «        ‰|d         z
  |d         k    f“Œ9S )r!   r7   rG   r#   ©r7   r>   )rQ   ÚrÚstamps     €r   rS   z#get_many_status.<locals>.<dictcomp>g   sH   ø€ ÐoÐoÐoÐef˜!˜Eœ(¥T¤Z°°&´	Ñ%:Ô%:¸EÀAÀlÄOÑ<SÐWXÐY^ÔW_Ò<_Ð$`ÐoÐoÐor   )r8   r   rH   ÚrangeÚlenr<   r	   Újoinr
   r9   ÚupdaterI   )rV   r$   rB   ÚfoundÚstartÚchunkÚrowsr]   s          @r   rT   rT   [   s&  ø€ å�‰:Œ:€DØð Øˆ	ÝŒ=‰?Œ?€DðØˆÝ˜1�c $™iœi¨Ñ-Ô-ð 	qð 	qˆEØ˜˜u s™{Ð*Ô+ˆEØ—<’<Ð \× cÒ cÐdg×dlÒdlÐmpÕsvÐw|Ñs}Ôs}Ñm}Ñd~Ôd~Ñ Ô ð  BGñ  Hô  HˆDÝ˜s˜˜˜µD´I±K´KÑ@Ô@ˆEØ�LŠLÐoÐoÐoÐoÐjnÐoÑoÔoÑpÔpÐpÐpð		qð 	�
Š
‰Œˆˆøˆ�
Š
‰ŒˆˆøøøØ€Ls   ©CD  Ä Dc                 óÚ   — t          j        ¦   «         5 }|                     d| f¦  «        j        r"t          j        |t          | ¦  «        ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S ©NzDELETE FROM meta WHERE key=?)r   r:   r<   Úrowcountr?   r0   )r!   rB   s     r   Údeleteri   m   s£   € Ý	Œ‰Œð .�tØ�<Š<Ð6¸¸Ñ?Ô?ÔHð 	.ÝŒK˜�i¨™nœnÑ-Ô-Ð-ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð .ð .s   ”?A Á A$Á'A$c                 ó8  — t          | �| nt          j        ¦   «         ¦  «        } t          j        ¦   «         }	 |                     d| f¦  «                             ¦   «         }|                     ¦   «          n# |                     ¦   «          w xY wd„ |D ¦   «         S )Nz0SELECT key FROM meta WHERE ? - fetched_at >= ttlc                 ó   — g | ]
}|d          ‘ŒS )r!   rP   ©rQ   r\   s     r   ú
<listcomp>zstale_keys.<locals>.<listcomp>z   s   € Ð#Ð#Ð#˜ˆAˆeŒHÐ#Ð#Ð#r   )r
   r9   r   rH   r<   ÚfetchallrI   )r$   rB   re   s      r   Ú
stale_keysro   s   s†   € Ý
�S�_ˆcˆc­$¬)©+¬+Ñ
6Ô
6€CÝŒ=‰?Œ?€DðØ�|Š|ÐNÐQTÐPVÑWÔW×`Ò`ÑbÔbˆà�
Š
‰Œˆˆøˆ�
Š
‰ŒˆˆøøøØ#Ð#˜dÐ#Ñ#Ô#Ð#s   ¹)A7 Á7Bc                 ón  — t          j        ¦   «         }	 |                     d| f¦  «                             ¦   «         }|                     ¦   «          n# |                     ¦   «          w xY w|sdS t          j        |d         ¦  «        t          |�|nt          j        ¦   «         ¦  «        |d         z
  fS )za(data, age_seconds) or None; for callers that pick the lifetime at read time (generic key space).z-SELECT json, fetched_at FROM meta WHERE key=?Nr7   rG   )	r   rH   r<   r=   rI   r7   r>   r
   r9   )r!   r$   rB   rJ   s       r   Úget_agedrq   }   s�   € åŒ=‰?Œ?€DðØ�lŠlÐJÈSÈFÑSÔS×\Ò\Ñ^Ô^ˆà�
Š
‰Œˆˆøˆ�
Š
‰ŒˆˆøøøØð ØˆtÝŒ:�c˜&”kÑ"Ô"¥C¨s¨¨¨ÅDÄIÁKÄKÑ$PÔ$PÐSVÐWcÔSdÑ$dÐdÐdrM   c                 ó  — t          j        ¦   «         }	 |                     dt          | ¦  «        | f¦  «                             ¦   «         }|                     ¦   «          n# |                     ¦   «          w xY wd„ |D ¦   «         S )z<[(key, data)] of every entry whose key starts with `prefix`.z6SELECT key, json FROM meta WHERE substr(key, 1, ?) = ?c                 óR   — g | ]$}|d          t          j        |d         ¦  «        f‘Œ%S )r!   r7   r[   rl   s     r   rm   z%items_with_prefix.<locals>.<listcomp>�   s/   € Ð<Ð<Ð<°!ˆQˆuŒX•t”z ! F¤)Ñ,Ô,Ð-Ð<Ð<Ð<r   )r   rH   r<   r_   rn   rI   )ÚprefixrB   re   s      r   Úitems_with_prefixru   ‰   sw   € åŒ=‰?Œ?€DðØ�|Š|ÐTÕWZÐ[aÑWbÔWbÐdjÐVkÑlÔl×uÒuÑwÔwˆà�
Š
‰Œˆˆøˆ�
Š
‰ŒˆˆøøøØ<Ð<°tÐ<Ñ<Ô<Ð<s   •7A! Á!A7c                 ó   — t          | ¦  «        } | rot          j        ¦   «         5 }| D ]@}|                     d|f¦  «        j        r"t          j        |t          |¦  «        ¦  «         ŒA	 d d d ¦  «         n# 1 swxY w Y   t          | ¦  «        S rg   )r8   r   r:   r<   rh   r?   r0   r_   )rV   rB   r!   s      r   Údelete_keysrw   “   sÊ   € Ý�‰:Œ:€DØð 6ÝŒX‰ZŒZð 	6˜4Øð 6ð 6�Ø—<’<Ð >ÀÀÑGÔGÔPð 6Ý”K ¥i°¡n¤nÑ5Ô5Ð5øð6ð	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6õ ˆt‰9Œ9Ðs   ¥AA6Á6A:Á=A:r   )Ú__doc__r7   r9   Úwcs.library2r   ÚDAYÚ	TTL_MOVIEÚTTL_COLLECTIONr   r   r   r   r   r   r   r   r%   r0   r    rL   rW   rT   ri   ro   rq   ru   rw   rP   r   r   ú<module>r}      s‚  ððð ð €€€Ø €€€à Ð Ð Ð Ð Ð à€Ø�‰H€	Ø�c‘€Ø€Ø�‰H€	ØLÐ ð+ð +ð +ð(ð (ð (ð<ð <ð <ð6ð 6ð 6ðDð Dð Dð
&ð &ð &ð &ðð ð ð2ð 2ð 2ð 2ð"
*ð 
*ð 
*ð 
*ðKð Kð Kð
ð ð ð ð$.ð .ð .ð$ð $ð $ð $ð	eð 	eð 	eð 	eð=ð =ð =ðð ð ð ð r   