§
   oïšåÚÂã                   ój   — d Z ddlZddlZddlZddlZddlmZ dZdZda	d„ Z
dd	„Zd
„ Zdd„Zd„ Zd„ ZdS )u  Generic TMDb / ÄŒSFD response cache on top of the single metadata cache (`meta` in library.db).

Replaces the old tmdb_cache.json (docs/plan/milionar-library/030 Â§3): same call signatures, but every entry is a
`meta` row with the key `http:<sha256 of endpoint|params>`. The lifetime is chosen by the reader (`expire_seconds`),
rows are kept for 30 days and purged on the first write of a process. Series, season, movie and collection data do
not go through here; they use `wcs.library2.tmdb` and their canonical keys.
é    N)Úmetazhttp:i �' Fc                 óÚ   — d                      | t          j        |dd¬¦  «        ¦  «        }t          t	          j        |                     d¦  «        ¦  «                             ¦   «         z   S )z-Stable key of an endpoint and its parameters.z{}|{}TF)Ú	sort_keysÚensure_asciizutf-8)ÚformatÚjsonÚdumpsÚPREFIXÚhashlibÚsha256ÚencodeÚ	hexdigest)ÚendpointÚparamsÚraw_keys      úd/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/metadata/TMDbCache.pyÚ	_make_keyr      sT   € à�nŠn˜X¥t¤z°&ÀDÐW\Ð']Ñ']Ô']Ñ^Ô^€GÝ•G”N 7§>¢>°'Ñ#:Ô#:Ñ;Ô;×EÒEÑGÔGÑGÐGó    é€Q c                 ó4  — 	 t          j        t          | |¦  «        ¦  «        }n]# t          $ rP}t	          j        d                     t          |¦  «        j        |¦  «        t          j	        ¦  «         Y d}~dS d}~ww xY w|r|d         |k    rdS |d         S )z?Cached data or None when missing / older than `expire_seconds`.u&   [MilionÃ¡Å™ Cache] read failed: {}: {}Né   r   )
r   Úget_agedr   Ú	ExceptionÚxbmcÚlogr   ÚtypeÚ__name__Ú
LOGWARNING)r   r   Úexpire_secondsÚentryÚexcs        r   Úget_from_cacher"      s¥   € ðÝ”�i¨°&Ñ9Ô9Ñ:Ô:ˆˆøÝð ð ð ÝŒÐ9×@Ò@ÅÀcÁÄÔASÐUXÑYÔYÕ[_Ô[jÑkÔkÐkØˆtˆtˆtˆtˆtøøøøðøøøð ð �E˜!”H˜~Ò-Ð-ØˆtØ�Œ8€Os   ‚"% ¥
A?¯AA:Á:A?c                 ó¬  — 	 t           sEda d„ t          j        t          j        ¦   «         ¦  «        D ¦   «         }t          j        |¦  «         t          j        t          | |¦  «        |t          ¦  «         d S # t          $ rP}t          j
        d                     t          |¦  «        j        |¦  «        t          j        ¦  «         Y d }~d S d }~ww xY w)NTc                 óF   — g | ]}|                      t          ¦  «        ¯|‘ŒS © )Ú
startswithr
   )Ú.0Úks     r   ú
<listcomp>z set_to_cache.<locals>.<listcomp>-   s)   € ÐSÐSÐS˜¸a¿lºlÍ6Ñ>RÔ>RÐS�1ÐSÐSÐSr   u'   [MilionÃ¡Å™ Cache] write failed: {}: {})Ú_purgedr   Ú
stale_keysÚtimeÚdelete_keysÚputr   ÚKEEP_SECONDSr   r   r   r   r   r   r   )r   r   ÚdataÚoldr!   s        r   Úset_to_cacher2   (   sÓ   € ðmÝð 	"ØˆGØSÐS�dœo­d¬i©k¬kÑ:Ô:ÐSÑSÔSˆCÝÔ˜SÑ!Ô!Ð!ÝŒ•˜8 VÑ,Ô,¨dµLÑAÔAÐAÐAÐAøÝð mð mð mÝŒÐ:×AÒAÅ$ÀsÁ)Ä)ÔBTÐVYÑZÔZÕ\`Ô\kÑlÔlÐlÐlÐlÐlÐlÐlÐløøøøðmøøøs   ‚A5A9 Á9
CÂACÃCc                 ój   — t          | ||¦  «        }|�|S  |¦   «         }|�t          | ||¦  «         |S )zPCached data, otherwise `fetch_fn()` (no arguments); a non-None result is stored.)r"   r2   )r   r   Úfetch_fnr   r0   s        r   Úget_or_fetchr5   4   sF   € å˜( F¨NÑ;Ô;€DØÐØˆØˆ8‰:Œ:€DØÐÝ�X˜v tÑ,Ô,Ð,Ø€Kr   c                 óx   — t          | |¦  «        }t          j        |¦  «        €dS t          j        |g¦  «        S )z*Drop one entry; returns 1 when it existed.Nr   )r   r   r   r-   )r   r   Úkeys      r   Údeleter8   ?   s9   € å
�H˜fÑ
%Ô
%€CÝ„}�SÑÔÐ!ØˆqÝÔ˜S˜EÑ"Ô"Ð"r   c                 ór   ‡ — t          j        ˆ fd„t          j        t          ¦  «        D ¦   «         ¦  «        S )zSDrop every generic entry whose data satisfies `predicate(data)`; returns the count.c              3   ó8   •K  — | ]\  }} ‰|¦  «        ¯|V — Œd S )Nr%   )r'   r(   r0   Ú	predicates      €r   ú	<genexpr>zdelete_where.<locals>.<genexpr>I   s5   øè è € Ð_Ð_¡' ! TÈyÈyÐY]ÉÌÐ_˜AÐ_Ð_Ð_Ð_Ð_Ð_r   )r   r-   Úitems_with_prefixr
   )r;   s   `r   Údelete_wherer>   G   s4   ø€ åÔÐ_Ð_Ð_Ð_­TÔ-CÅFÑ-KÔ-KÐ_Ñ_Ô_Ñ_Ô_Ð_r   )r   )Ú__doc__r   r   r,   r   Úwcs.library2r   r
   r/   r*   r   r"   r2   r5   r8   r>   r%   r   r   ú<module>rA      sÏ   ððð ð €€€Ø €€€Ø €€€à €€€à Ð Ð Ð Ð Ð à	€Ø€Ø
€ðHð Hð Hð	ð 	ð 	ð 	ð	mð 	mð 	mðð ð ð ð#ð #ð #ð`ð `ð `ð `ð `r   