
    hj                    x    d dl mZ d dlZd dlZd dlZd dlZddZddZdddZd dZ	e
dk    r e	             dS dS )!    )annotationsNpathpathlib.Pathbasereturnboolc                    	 |                                                      |                                            dS # t          $ r Y dS w xY w)NTF)resolverelative_to
ValueError)r   r   s     moviebot/purge_source.pyinsider   	   sR    ""4<<>>222t   uus   9= 
A
Avalue
str | Noneroot	strm_root	m3u8_rootpathlib.Path | Nonec                   | sd S t          |                               dd                                          }|                    d          r,||t	          d          d          z                                  S |                    d          r,||t	          d          d          z                                  S ||                    d          z                                  S )N\/z/strm/z/m3u8/)strreplacestrip
startswithlenr
   lstrip)r   r   r   r   texts        r   from_db_pathr      s     tu::dC((..00Dx   =DX11::<<<x   =DX11::<<<4;;s###,,...    Fsourcer   db_pathstrm_dirm3u8_dir
skip_files%dict[str, int | tuple[int, int, int]]c                
   t           j                                                                        }||z                                  }||z                                  }||z                                  }|| z                                  }	t	          ||          st          d|           t	          ||          st          d|           t	          ||          st          d|           t          j        |          }
t          j        |
_	        |

                    d           |
                    d| f                                          }d |D             }d}d}d}d}t                      }|s9|D ]]}t          |d         |||          }|rt	          ||          r|j                                        d	k    r|                    |j                   |                                r|                                 |d
z  }n|d
z  }|                    d          }t	          ||          r-|                                r|                                 |d
z  }t          |d         |||          }|rZt	          ||          rJ|j                                        dk    r-|                                r|                                 |d
z  }_t	          |	|          rW|	j                                        |                                 k    r(|	                                rt/          j        |	           t3          |d d          D ]]}|}t	          ||          rI||k    rC	 |                                 n# t6          $ r Y n!w xY w|j        }t	          ||          r||k    C^d |
                    d| f                                          D             }||z  }|
                    d| f           |
                    d| f           |
                    d| f           |
                    d           |
                    dd |D                        |
j        }|
                    d           |
j        |z
  }|
                                 |
                    d| f                                          d         |
                    d| f                                          d         |
                    d| f                                          d         f}|
                                  ||||||dS )NzDB path is outside workspace: z STRM path is outside workspace: z M3U8 path is outside workspace: a  
        CREATE INDEX IF NOT EXISTS idx_movie_sources_source ON movie_sources(source);
        CREATE INDEX IF NOT EXISTS idx_movie_sources_movie_id ON movie_sources(movie_id);
        CREATE INDEX IF NOT EXISTS idx_servers_source ON servers(source);
        CREATE INDEX IF NOT EXISTS idx_episodes_source ON episodes(source);
        CREATE INDEX IF NOT EXISTS idx_episodes_movie_id ON episodes(movie_id);
        zPSELECT id, movie_id, strm_path, cleaned_m3u8_path FROM episodes WHERE source = ?c                8    h | ]}t          |d                    S )movie_idint.0rows     r   	<setcomp>zpurge_source.<locals>.<setcomp>9   s$    ;;;sc#j/**;;;r    r   	strm_pathz.strm   z.nfocleaned_m3u8_pathz.m3u8c                *    t          | j                  S N)r   parts)r   s    r   <lambda>zpurge_source.<locals>.<lambda>X   s    s4: r    T)keyreversec                8    h | ]}t          |d                    S )r   r*   r,   s     r   r/   zpurge_source.<locals>.<setcomp>a   s2        	CF  r    zUSELECT DISTINCT movie_id FROM movie_sources WHERE source = ? AND movie_id IS NOT NULLz%DELETE FROM episodes WHERE source = ?z$DELETE FROM servers WHERE source = ?z*DELETE FROM movie_sources WHERE source = ?z?CREATE TEMP TABLE purge_touched_movies (id INTEGER PRIMARY KEY)z:INSERT OR IGNORE INTO purge_touched_movies (id) VALUES (?)c              3     K   | ]}|fV  d S r4    )r-   r)   s     r   	<genexpr>zpurge_source.<locals>.<genexpr>q   s$      44(444444r    a  
        DELETE FROM movies
        WHERE id IN (SELECT id FROM purge_touched_movies)
          AND NOT EXISTS (SELECT 1 FROM movie_sources WHERE movie_sources.movie_id = movies.id)
          AND NOT EXISTS (SELECT 1 FROM episodes WHERE episodes.movie_id = movies.id)
        z3SELECT COUNT(1) FROM movie_sources WHERE source = ?z-SELECT COUNT(1) FROM servers WHERE source = ?z.SELECT COUNT(1) FROM episodes WHERE source = ?)deleted_strmdeleted_nfodeleted_m3u8_filesdeleted_orphan_moviesmissing_strmremaining_ophim)!pathlibPathcwdr
   r   r   sqlite3connectRowrow_factoryexecutescriptexecutefetchallsetr   suffixloweraddparentexistsunlinkwith_suffixnameshutilrmtreesortedrmdirOSErrorexecutemanytotal_changescommitfetchoneclose)r!   r"   r#   r$   r%   r   dbr   r   source_m3u8_dirconnrowstouched_moviesr=   r>   deleted_m3u8rA   touched_dirsr.   r0   nfo_path	m3u8_path	directorycurrentsource_moviesbefore_orphansorphan_deleted	remainings                               r   purge_sourcero      s   <%%''D
.	!	!	#	#B))++I))++I 6)2244O"d @>">>???)T"" IGIGGHHH)T"" IGIGGHHH?2D{D	   <<Z		  hjj 	 <;d;;;NLKLL&)eeL ) 	" 	"C$S%5tY	RRI 
%VIy99 
%i>N>T>T>V>VZa>a>a  !1222##%% &$$&&& A%LL A%L$0088(I.. %8??3D3D %OO%%%1$K$S)<%=tYPYZZI "VIy99 "i>N>T>T>V>VZa>a>afofvfvfxfx>a  """!/9-- 	+/2F2L2L2N2NRXR^R^R`R`2`2`ete{e{e}e}2`M/***2N2NX\]]] 	) 	)IG),, )I1E1EMMOOOO   E!. ),, )I1E1E <<cI
 
 (**  M m#NLL86)DDDLL7&CCCLL=yIIILLRSSSD44^444   'NLL	   '.8NKKMMMJVIVV__aabcdDviPPYY[[\]^EyQQZZ\\]^_I
 	JJLLL %"*!/$$  s   1N
NNNonec                    t          j        d          } |                     d           |                     dd           |                     dd           |                     d	d
           |                     dd           |                                 }t	          |j        |j        |j        |j        |j	                  }|
                                D ]\  }}t          | d|            d S )Nz5Purge one crawled source from DB and generated files.)descriptionr!   z--dbzdata/moviebot.db)defaultz
--strm-dirstrmz
--m3u8-dirm3u8z--skip-files
store_true)actionz: )argparseArgumentParseradd_argument
parse_argsro   r!   r`   r#   r$   r%   itemsprint)parserargsresultr7   r   s        r   mainr      s   $1hiiiF
!!!
(:;;;
f555
f555
|<<<D$+twt}do^^Fllnn ! !
U    ! !r    __main__)r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )F)r!   r   r"   r   r#   r   r$   r   r%   r   r   r&   )r   rp   )
__future__r   rx   rC   rV   rF   r   r   ro   r   __name__r;   r    r   <module>r      s    " " " " " "       / / / /q q q q qh! ! ! ! zDFFFFF r    