U
    g*                     @   sn   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 ddlmZ G dd dZdS )    N   )expand_pathtraverse_objversion_tuplewrite_json_file)__version__c                   @   sZ   e Zd Zdd Zdd Zdd Zedd Zdd
dZdd Z	dddddZ
dd ZdS )Cachec                 C   s
   || _ d S N)_ydl)selfZydl r   0/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/cache.py__init__   s    zCache.__init__c                 C   s8   | j jd}|d kr0tdd}tj|d}t|S )NcachedirXDG_CACHE_HOMEz~/.cachezyt-dlp)r
   paramsgetosgetenvpathjoinr   )r   resZ
cache_rootr   r   r   _get_root_dir   s
    zCache._get_root_dirc                 C   sP   t d|std|tjj|dddd}tj	| 
 || d| S )Nz	^[\w.-]+$zinvalid section  )safe%,.)rematchAssertionErrorurllibparsequotereplacer   r   r   r   )r   sectionkeydtyper   r   r   _get_cache_fn   s    zCache._get_cache_fnc                 C   s   | j jddk	S )Nr   F)r
   r   r   r   r   r   r   enabled   s    zCache.enabledjsonc              	   C   s   |dkst | jsd S | |||}zDtjtj|dd | jd| d| d t	t
|d| W n4 tk
r   t }| jd|d	|  Y nX d S )
Nr+   T)exist_okzSaving r   z	 to cache)yt-dlp_versiondatazWriting cache to z	 failed: )r    r*   r(   r   makedirsr   dirnamer
   write_debugr   r   	Exception	traceback
format_excreport_warning)r   r%   r&   r/   r'   fntbr   r   r   store!   s    zCache.storec                 C   sV   t |d}|sd|id }}|r0t|t|kr8|d S | jd| d| d d S )Nr.   r/   z
2022.08.19z"Discarding old cache from version z (needs ))r   r   r
   r2   )r   r/   min_verversionr   r   r   	_validate0   s    
zCache._validateN)r;   c          
      C   s  |dkst | js|S | |||}tt z^t|ddH}| jd| d| d | 	t
||W  5 Q R  W W  5 Q R  S Q R X W np ttfk
 r   ztj|}W n* tk
r }	 zt|	}W 5 d }	~	X Y nX | jd| d| d	 Y nX W 5 Q R X |S )
Nr,   zutf-8)encodingzLoading r   z from cachezCache retrieval from z	 failed (r:   )r    r*   r(   
contextlibsuppressOSErroropenr
   r2   r=   r+   load
ValueErrorKeyErrorr   r   getsizestrr6   )
r   r%   r&   r'   defaultr;   Zcache_fnZcachef	file_sizeZoer   r   r   rC   8   s     6*z
Cache.loadc                    s   | j s| jd d S |   t fdddD sDtd  d| jjd  dd	d
 tj r| jjdd	d
 t	
  | jd d S )NzFCache is disabled (Did you combine --no-cache-dir and --rm-cache-dir?)c                 3   s   | ]}| kV  qd S r	   r   ).0Ztermr   r   r   	<genexpr>S   s     zCache.remove.<locals>.<genexpr>)cachetmpzNot removing directory z& - this does not look like a cache dirzRemoving cache dir z .T)Zskip_eolr   )r*   r
   Z	to_screenr   anyr3   r   r   existsshutilrmtreer)   r   rK   r   removeM   s    
 
zCache.remove)r+   )r+   N)__name__
__module____qualname__r   r   r(   propertyr*   r9   r=   rC   rS   r   r   r   r   r      s   

r   )r?   r+   r   r   rQ   r4   urllib.parser!   utilsr   r   r   r   r<   r   r   r   r   r   r   <module>   s   