
    i+                     f   d dl Z 	 d dlZdZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ  e
       Zej                   j#                  d	d
d      Z G d d      Zer9	 er2 ee j(                  j+                   ej,                         d            ZndZyydZy# e$ r dZY w xY w# e$ r dZY yw xY w)    NTF)ListDict)urlparse)Console)binary_paths)config_managerconfigcreate_local_db)defaultc                       e Zd Zd Zd Zdeeef   fdZdedefdZ	dded	ed
edededede
fdZddee   d
edededeeef   defdZdeded
edee   fdZy)LocalDBVaultc                 2    || _         | j                          y )N)db_path_init_database)selfr   s     \/home/nidran/Documenti/script/streaming-community/StreamingCommunity/utils/vault/local_db.py__init__zLocalDBVault.__init__   s        c                 V   t        j                  | j                        5 }|j                         }|j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j                          d d d        y # 1 sw Y   y xY w)Na  
                CREATE TABLE IF NOT EXISTS drm_cache (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    base_url_license TEXT NOT NULL,
                    pssh TEXT NOT NULL,
                    drm_type TEXT NOT NULL,
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    last_accessed TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    access_count INTEGER DEFAULT 1,
                    UNIQUE(base_url_license, pssh, drm_type)
                )
            a  
                CREATE TABLE IF NOT EXISTS drm_keys (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    cache_id INTEGER NOT NULL,
                    kid TEXT NOT NULL,
                    key TEXT NOT NULL,
                    label TEXT,
                    is_valid BOOLEAN DEFAULT 1,
                    FOREIGN KEY (cache_id) REFERENCES drm_cache(id) ON DELETE CASCADE,
                    UNIQUE(cache_id, kid)
                )
            z
                CREATE INDEX IF NOT EXISTS idx_cache_lookup 
                ON drm_cache(base_url_license, pssh, drm_type)
            zn
                CREATE INDEX IF NOT EXISTS idx_keys_cache 
                ON drm_keys(cache_id)
            zg
                CREATE INDEX IF NOT EXISTS idx_keys_kid 
                ON drm_keys(kid)
            )sqlite3connectr   cursorexecutecommit)r   connr   s      r   r   zLocalDBVault._init_database    s    __T\\* /	d[[]F NN   NN   NN  
 NN  
 NN  
 KKM_/	 /	 /	s   A6BB(returnc           
         dddg g d}	 t         j                  j                  | j                        r,t         j                  j	                  | j                        |d<   t        j                  | j                        5 }|j                         }	 |j                  d       |j                         d   xs d|d<   |j                  d       |j                         d   xs d|d<   |j                  d       |j                         D cg c]  }|d   |d	   f c}|d
<   |j                  d       g }|j                         D ](  }|j                  |d   |d	   |d   |d   |d   d       * ||d<   ddd       |S # t
        $ r	 d|d<   Y /w xY wc c}w # t
        $ r"}t        j                  d|        Y d}~Jd}~ww xY w# 1 sw Y   |S xY w)z%Return statistics about the database.r   )total_caches
total_keysdb_file_sizetop_caches_by_keystop_accessed_cachesr    zSELECT COUNT(*) FROM drm_cacher   zSELECT COUNT(*) FROM drm_keysr   zZSELECT cache_id, COUNT(*) as cnt FROM drm_keys GROUP BY cache_id ORDER BY cnt DESC LIMIT 5   r!   ztSELECT id, base_url_license, drm_type, access_count, last_accessed FROM drm_cache ORDER BY access_count DESC LIMIT 5         )idbase_url_licensedrm_typeaccess_countlast_accessedr"   z [red]Error collecting DB stats: N)ospathexistsr   getsize	Exceptionr   r   r   r   fetchonefetchallappendconsoleprint)r   statsr   r   rowtopes          r   get_db_statszLocalDBVault.get_db_statsR   s   !"!Q^`y{|	&ww~~dll+(*(En% __T\\*  	Fd[[]FF?@(.(9!(<(An%>?&,oo&7&:&?al# p LR??K\.]CAA/?.]*+  K !??, CJJ!!f,/F$'F(+A),Q   03+,; 	FD K  	&$%E.!	&" /^"  F @DEEF? 	FD sV   AE= >GA9F	FAF=FFF	G F=8G=GGGlicense_urlc                     t        |      }|j                   d|j                   |j                   }|j	                  d      S )zIExtract base URL from license URL (remove query parameters and fragments)z:///)r   schemenetlocr-   rstrip)r   r;   parsedbase_urls       r   _clean_license_urlzLocalDBVault._clean_license_url   s;    +&mm_Cv{{mDs##r   Nkidkeyr)   psshlabelc                    |j                  dd      j                         j                         }|j                  dd      j                         j                         }|j                         }| j                  |      }|dvrt        j                  d| d       y|st        j                  d|        yt        j                  | j                        5 }|j                         }		 |	j                  d|||f       |	j                         }
|
rn|
d	   }|	j                  d
|f       |	j                  d||f       |	j                         rSt        j                  d|        |j                          	 ddd       y|	j                  d|||f       |	j                  }|	j                  d||||f       |j                          	 ddd       y# t        j                  $ r*}t        j                  d|        Y d}~ddd       yd}~wt        $ r:}t        j                  d|        |j!                          Y d}~ddd       yd}~ww xY w# 1 sw Y   yxY w)z$Add a single DRM key to the database- widevine	playready[red]Invalid DRM type: z$. Must be 'widevine' or 'playready'.Fz+[yellow]Warning: No PSSH provided for KID: z
                    SELECT id FROM drm_cache 
                    WHERE base_url_license = ? AND pssh = ? AND drm_type = ?
                r   z
                        UPDATE drm_cache 
                        SET last_accessed = CURRENT_TIMESTAMP, 
                            access_count = access_count + 1
                        WHERE id = ?
                    z}
                        SELECT id FROM drm_keys 
                        WHERE cache_id = ? AND kid = ?
                    z%
[yellow]Key already exists for KID: Nz
                        INSERT INTO drm_cache (base_url_license, pssh, drm_type)
                        VALUES (?, ?, ?)
                    z~
                    INSERT INTO drm_keys (cache_id, kid, key, label)
                    VALUES (?, ?, ?, ?)
                Tz[yellow]Key already exists: z[red]Error adding key: )replacestriplowerrC   r4   r5   r   r   r   r   r   r1   r   	lastrowidIntegrityErrorr0   rollback)r   rD   rE   r)   r;   rF   rG   rB   r   r   resultcache_idr9   s                r   set_keyzLocalDBVault.set_key   sR    kk#r"((*002kk#r"((*002>>#**;744MM3H:=abcMMGuMN__T\\* 8	d[[]F5   h/1
  *%ayH NN $
 #& NN $ #C*
 ((Nse&TU$A8	 8	F NN $ #D(35  &//H    S%02
 a8	 8	d ))  <QC@Ai8	 8	j   7s;<q8	 8	jk8	 8	sJ   I(BG=AGI!H9II(I:IIII	keys_listkid_to_labelc           	          |st         j                  d       yd}|D ][  }d|v s|j                  dd      \  }}	|r|j                  |j	                               nd}
| j                  ||	||||
      sW|dz  }] |S )z*Add multiple keys to the database at once.z [yellow]No keys provided to add.r   :r#   N)r4   r5   splitgetrQ   rW   )r   rX   r)   r;   rF   rY   added_countkey_strrD   rE   rG   s              r   set_keyszLocalDBVault.set_keys   s    MM<=  	%Gg~"==a0S9E((54<<S(KuM1$K	% r   c           	         | j                  |      }|j                         }|dvrt        j                  d|        g S t	        j
                  | j                        5 }|j                         }|j                  d|||f       |j                         }|sg cddd       S |d   }t        j                  d       t        j                  d| d|dd	  d
       |j                  d|f       |j                  d|f       g }	|j                         D ]L  }
|
\  }}}|	j                  | d|        |dd dz   }|rd| nd}t        j                  d| d| |        N |j                          |	cddd       S # 1 sw Y   yxY w)aN  
        Retrieve all keys for a given license URL, PSSH, and DRM type.
        
        Args:
            license_url (str): License URL.
            pssh (str): PSSH value.
            drm_type (str): Either 'widevine' or 'playready'.
        
        Returns:
            list: List of "KID:KEY" strings found in database.
        rK   rN   z
                SELECT id FROM drm_cache 
                WHERE base_url_license = ? AND pssh = ? AND drm_type = ?
            Nr   z[cyan]Using Local Database.z[red]z [cyan](PSSH: [yellow]   z...[cyan] KID: [red]N/A)z
                UPDATE drm_cache 
                SET last_accessed = CURRENT_TIMESTAMP, 
                    access_count = access_count + 1
                WHERE id = ?
            z
                SELECT kid, key, label 
                FROM drm_keys 
                WHERE cache_id = ? AND is_valid = 1
            r[   *z [cyan]| [red]rJ   z    - [red]z[white]:[green])rC   rQ   r4   r5   r   r   r   r   r   r1   r2   r3   r   )r   r;   rF   r)   rB   r   r   rU   rV   keysr7   rD   rE   rG   
masked_key	label_strs                   r   get_keys_by_psshzLocalDBVault.get_keys_by_pssh   s    **;7>>#44MM3H:>?I__T\\* /	d[[]F NN  D(+-
 __&F/	 /	 ayH MM78MME(+A$s)Ldef NN 
  NN  	 D( Y"%S%se1SEN+ !"X^
8=nUG42	C5
|I;WXY KKM_/	 /	 /	s   9E="CE==F)NN)__name__
__module____qualname__r   r   r   strobjectr:   rC   boolrW   r   intr`   rh    r   r   r   r      s    0d-d3;/ -^$c $c $H3 HS HC Hc HQT Hdg Hsw HT$s) s  TW nrsvx{s{n|   IL "BC Bs Bc BdSVi Br   r   zdrm_keys.db)r,   r   SQLITE3_AVAILABLEr0   typingr   r   urllib.parser   rich.consoler   StreamingCommunity.setupr   StreamingCommunity.utilsr   r4   
remote_cdmr]   CREATE_DB_ON_STARTUPr   r-   joinget_binary_directoryobj_localDbValutrp   r   r   <module>r|      s    
  ! ! 2 3 )%0044X?PZ_4` I IZ  +BGGLL9Z9Z9Z9\^k,lm#  U	  N	    s#   B 6B& B#"B#&B0/B0