
    i<                        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 d dl	m
Z
 d dlmZ ddlmZ d dlmZmZmZmZ d dlmZ d d	lmZmZmZ d d
lmZmZ  e
       Z e       ZddddZddddZ ejB                  jE                  dd      Z#ejB                  jE                  dd      Z$d+ded   de%ddfdZ&d Z'de%de%fdZ(de)de*fdZ+de)dee,e)f   fd Z-d!e%fd"Z.d!e%ddfd#Z/d$ Z0d% Z1d& Z2d' Z3d( Z4d) Z5d* Z6y),    N)CallableTuple)Console)Prompt   )call_global_search)get_prd_pathget_wvd_pathget_info_wvdget_info_prd)load_search_functions)config_manager
os_managerstart_message)
git_updatebinary_updateredyellowblue)animefilm_&_serieserier   r   r   )r         DEFAULTshow_device_infoclose_consolefunc).Nsearch_termsreturnc                      | |       y)z>Run function once or indefinitely based on close_console flag.N )r   r   s     O/home/nidran/Documenti/script/streaming-community/StreamingCommunity/cli/run.pyrun_functionr$   &   s
        c                  P   t        d       t        rTt               } t               }| t        j                  t        |              |t        j                  t        |             t        j                         dk(  r+dt        j                         v rt        j                  d       t        j                  dk  r*t        j                  d       t        j                  d       	 t!                y# t"        $ r+}t        j                  d	t%        |              Y d}~yd}~ww xY w)
z8Initialize the application with system checks and setup.FNWindows7zmode 120, 40)r      z$[red]Install python version > 3.7.16r   z [red]Error with loading github: )r   SHOW_DEVICE_INFOr	   r
   consoleprintr   r   platformsystemversionossysversion_infologexitr   	Exceptionstr)prd_pathwvd_pathes      r#   
initializer:   +   s    %>>MM,x01MM,x01 I%#1A1A1C*C
		.! & :;A A6s1vh?@@As   &
C1 1	D%:!D  D%pathc                     | s| S t         j                  j                  t         j                  j                  t         j                  j	                  |                   S )z<Expand '~' and environment variables and normalize the path.)r0   r;   normpath
expandvars
expanduser)r;   s    r#   _expand_user_pathr@   H   s=    77BGG..rww/A/A$/GHIIr%   hookc                     | j                  d      }|sy	 |D cg c])  }t        |      j                         j                         + }}t
        j                  |v S c c}w # t        $ r Y yw xY w)z)Check if a hook is allowed on current OS.r0   T)getr6   striplowerr5   r   r.   )rA   allowed_systemss
normalizeds       r#   _should_run_on_current_osrI   O   sk    hhtnO6EFc!flln**,F
F 
** G s"   A! .AA! A! !	A-,A-c                    t        | j                  dd            j                         j                         }| j                  d      }| j                  d      }| j                  dg       }| j                  d      xs i }| j                  d      }t	        |t               r"|j                  d      D cg c]  }|s|	 }}nt	        |t              sg }|rIt        |      }t        j                  j                  |      st        j                  j                  |      }|rt        |      }t        j                  j                         }|j                         D ]  \  }	}
t        |
      |t        |	      <    |d	k(  r:|st        d
      t         j"                  |g|z   }|D cg c]  }|s|	 c}||dfS t$        j&                  dv r'|dv r#|rdd|g}n|st        d      d|g|z   }|||dfS t$        j&                  dk(  r(|dv r$|rdd|g}n|st        d      dd|g|z   }|||dfS t        d| dt$        j&                   d      c c}w c c}w )zCBuild the subprocess command and environment for a hook definition.type r;   commandargsenvcwd pythonzMissing 'path' for python hook)rO   rP   )linuxdarwin)bashshshellz	/bin/bashz-lczMissing 'path' for bash/sh hookwindows)batcmdrW   rZ   z/czMissing 'path' for bat/cmd hookzUnsupported hook type 'z	' on OS '')r6   rC   rD   rE   
isinstancesplitlistr@   r0   r;   isabsabspathenvironcopyitems
ValueErrorr1   
executabler   r.   )rA   	hook_typescript_pathinline_commandrN   rO   workdirabase_envkvrM   cs                r#   _build_command_for_hookro   [   sC   DHHVR()//1779I((6"KXXi(N88FBD
((5/
RChhuoG$::c?0aa00d#'4ww}}[)''//+6K#G,zz H		 "1q6Q" H=>>>>;/$6#)qq)8G+LMM////&~>"$%FGG&4t;Xg>??I%// $7"$%FGG $4t;Xg>??
.yk:CTCTBUUVW
XXU 1( *s   5I=I&I.Istagec              #      K   	 t         j                  j                  d|       }t        |t              sy|D ]  }t        |t
              s|  y# t        $ r Y yw xY ww)z<Yield hook dicts for a given stage ('pre_run' | 'post_run').HOOKSN)r   configget_listr\   r^   dictr5   )rp   
hooks_listrA   s      r#   _iter_hooksrw      sd     	#**33GUC
*d+ 	DdD)J	  s2   A!0A A!A A!	AA!AA!c           
         t        |       j                         j                         } | dvryt        |       D ]  }t        j                  d|  d       |j                  d      xs |  d}|j                  dd      }|j                  d	d      }|j                  d
      }|smt        |      sy	 t        |      \  }}d}|%t        j                  |fdddt        |      d|}nt        j                  |fdddd|}|j                  xs dj                         }	|j                  xs dj                         }
|	rt        j                  d| d|	        |
r6t        j                  d| d|
        t        j                  d| d|
        |j                   dk7  r[d| d|j                    }|rt        j"                  |dz          t        j"                  |dz          t%        |j                          y# t&        $ rO}d| dt        |       }|rt        j"                  |dz          Y d}~t        j"                  |dz           d}~ww xY w)zSExecute configured hooks for the given stage. Stage can be 'pre_run' or 'post_run'.)pre_runpost_runNz"
[green]Executing hook for stage 'z'...name_hookenabledTcontinue_on_errortimeoutF)checkcapture_outputtextr   )r   r   r   rL   z[cyan][hook:z	 stdout]
zHook 'z
' stderr: z[yellow][hook:z	 stderr]
r   z' exited with code z (continuing)z (stopping)z
' failed: )r6   rD   rE   rw   r+   r,   rC   rI   ro   
subprocessrunintstdoutstderrloggingwarning
returncodeerror
SystemExitr5   )rp   rA   r{   r}   r~   r   rM   popen_kwargsresultr   r   messager9   s                r#   execute_hooksr      sW   J$$&E++E" -;E7$GHxx2eWE?((9d+ HH%8$?((9%(. 	$;D$A!G\F"#  DuTX\fijqfr  D  wC  D#muTX\m`lmmm)r002Fmm)r002FTF*VHEF&j ABtfJvhGH  A%"4&(;F<M<M;NO$MM'O";<MM'M"9:$V%6%677 &;-L  	tfJs1vh7G g78g56	s%   2DH-H	I+I<IIc                  X    t         j                  d       t        j                  d       y)z(Force script termination in any context.z 
[red]Closing the application...r   N)r+   r,   r1   r4   r"   r%   r#   
force_exitr      s    MM56HHQKr%   c           
         i }| j                         D ]  }|j                  ||j                  <    dj                  t	        |j                                     }dj                  t	        |j                         d       D cg c]  \  }}| d|j                           c}}      }t        j                  dt        j                  d| d|       }|j                  d	d
dd       |j                  dt        d       |j                  ddd       |j                  dt        d       |j                  ddd       |j                  dt        d       |j                  ddt        d       |j                  ddt        d        |j                  d!d"t        d#       |j                  d$dd%       |j                  d&t        d'       |j                  d(d)dd*       |S c c}}w )+z,Setup and return configured argument parser., c                     | d   S )Nr   r"   )xs    r#   <lambda>z'setup_argument_parser.<locals>.<lambda>   s    {|}~{ r%   )key=z,Script to download movies, series and anime.zAvailable sites by name: z
Available sites by index: )descriptionformatter_classepilogz-sz--searchNzSearch terms)defaulthelpz
--categoryz.Category (1: anime, 2: film_&_serie, 3: serie))rK   r   z--auto-first
store_truez9Auto-download first result (use with --site and --search))actionr   z--sitezSite by name or indexz--globalzGlobal search across sitesz--not_closez%Keep console open after last downloadz-svz	--s_videozuSelect video tracks. Example:  1. select best video (best) 2. Select 4K+HEVC video (res="3840*":codecs=hvc1:for=best)z-saz	--s_audiozSelect audio tracks. Example:  1. Select all (all) 2. Select best eng audio (lang=en:for=best) 3. Select best 2, and language is ja or en (lang="ja|en":for=best2)z-ssz--s_subtitlez{Select subtitle tracks. Example:  1. Select all subs (all) 2. Select all subs containing "English" (name="English":for=all)z--use_proxyzEnable proxy for requestsz--extensionz Output file extension (mkv, mp4)z-UPz--updatez+Auto-update to latest version (binary only))valuesindicemodule_namejoinsortedkeysrc   
capitalizeargparseArgumentParserRawTextHelpFormatteradd_argumentr   r6   bool)search_functionsmodule_infor   available_namesr{   idxavailable_indicesparsers           r#   setup_argument_parserr      s   K '') 4(,D$$%4 ii{'7'7'9 :;O		QWXcXiXiXkq  RA  #BID#cU!DOO,=+>#?  #B  C$$B 55*?*;;WXiWjkF j$^L
35ef
|B}~
s1HI

<>Z[
D7^_
{  <w  x
{  <d  e
~C  ?@  A
lA\]
C6XY
z,ErsM+ #Bs   G)
c                 J   i }ddddddd}|j                         D ]!  \  }}t        | |      t        | |      ||<   # |j                         D ]:  \  }}|j                  d	      \  }}t        j                  j                  |||       < |rt        j                          yy)
z.Apply command line arguments to configuration.zM3U8_DOWNLOAD.select_videozM3U8_DOWNLOAD.select_audiozM3U8_DOWNLOAD.select_subtitlezDEFAULT.not_closezREQUESTS.use_proxyzM3U8_CONVERSION.extension)s_videos_audio
s_subtitle	not_close	use_proxy	extensionN.)rc   getattrr]   r   rs   set_keysave_config)	rN   config_updatesarg_mappingsarg_name
config_keyr   valuesectionoptions	            r#   apply_config_updatesr      s    N 0/5()0L !- 2 2 4 A*4".)0x)@N:&A
 %**, >
U))C.%%gvu=> ""$ r%   c                    i }i }i }| j                         D ]h  }|j                  }t        |j                        }|||<   |j	                         |j
                  j                         f||<   |||j                         <   j |||fS )z3Build mappings between indices/names and functions.)r   r   r6   r   r   use_forrE   )r   input_to_functionchoice_labelsmodule_name_to_functionr   r   
site_indexs          r#   build_function_mappingsr     s    M  '') <&&%
(,*%%0%;%;%=t||?Q?Q?S$Tj!7; 1 1 34< m-DDDr%   c                    | j                   syt        | j                         j                         j                         }|j	                  |      xs |j	                  |      }|Ndj                  t        |j                                     }t        j                  d| j                    d|        y| j                  r~|r|	  ||d      }|rYt        |d      rM|j                  rA|j                  d	   }t        |d
      r|j                  j                         ni }	 ||	       yt        j                  d       	 t!        ||       y# t        $ r+}
t        j                  dt        |
              Y d}
~
=d}
~
ww xY w)z.Handle direct site selection via command line.FNr   z[red]Unknown site: 'z'. Available: [yellow]T)get_onlyDatabase
media_listr   __dict__)direct_itemz;[yellow]No results found. Falling back to interactive mode.z[red]Auto-first failed: r   )siter6   rD   rE   rC   r   r   r   r+   r,   
auto_firsthasattrr   r   rb   r5   r$   )rN   r   r   r   site_keyfunc_to_runavailable_sitesdatabase
first_item	item_dictr9   s              r#   handle_direct_site_selectionr   %  sG   99499~##%++-H#''1Z5L5P5PQY5ZK))F+B+G+G+I$JK,TYYK7MoM^_` <
	?"<$GHGHl;@S@S%003
:A*j:YJ//446_a		2[\ <8	  	?MM4SVH=>>	?s   A$E 'E 	E?!E::E?c                 v   | j                   rt        j                  | j                         }|j                         D cg c]  \  }}|d   |k(  s||d   f }}}t	        |      dk(  r&t
        j                  d|d   d           |d   d   S ydj                  t        j                         D cg c]  \  }}d| d|j                          d| d! c}}      }|dz  }t
        j                  d	|        t        |j                               d
gz   }	ddj                  |j                         D cg c]E  \  }}dt        j                  |d   d       d| d|d    dt        j                  |d   d       d	G c}}      z   dz   }
t        j                  |
|	ddd      S c c}}w c c}}w c c}}w )z=Get site selection from user (interactive or category-based).r   r   z$[green]Selezionato automaticamente: z | []z[/z | [magenta]Global[/magenta]z
[cyan]Category Legend: globalz[cyan]Insert site: r   whitez](z) z$, [magenta](global) Global[/magenta]0F)choicesr   show_choicesshow_defaultN)categoryCATEGORY_MAPrC   rc   lenr+   r,   r   	COLOR_MAPr   r^   r   msgask)rN   r   selected_categoryr   labelcategory_sitescatcolorlegend_textchoice_keysprompt_messages              r#   get_user_site_selectionr   D  s   }}(,,T]];<I<O<O<Qsjc5UZ[\U]arUr3a/ss~!#MM@PQARSTAU@VWX!!$Q'' $ jj]f]l]l]n!ozsTYAeWAcnn.>-?r%"J!op551+?@=--/0H:=.+113<
U 	eAh01C558*By}}UZ[\U]_fGgFhhij<
 2  44 ww~{CV[jowpp# t "p
<
s   F)	F)3$F/
8A
F5c                     t        d       t                	 t               } t        |       }|j	                         }|j
                  rYt        j                  d       t               }|rt        j                  d       nt        j                  d       	 t        d       y t        |       t        |d      r"t        |j                         	 t        d       y t        |       \  }}}t        ||||j                        r	 t        d       y t        s	 t!        ||      }|dk(  rt        |j                         ||v rt#        ||   |j                         t$        j'                  dd	d
gd
      }|j)                         d	k7  rnst+                nNt!        ||      }|dk(  rt        |j                         ||v rt#        ||   |j                         t+                t        d       y # t        d       w xY w)Nry   z
[cyan]  AUTO-UPDATE MODEz.
[green]Update process initiated successfully!z!
[yellow]Update was not performedrz   r   r   z3
[cyan]Do you want to perform another search? (y/n)yn)r   r   )r   r:   r   r   
parse_argsupdater+   r,   r   r   r   r   searchr   r   	NOT_CLOSEr   r$   r   r   rE   r   )	r   r   rN   successr   r   r   r   user_responses	            r#   mainr   \  s   )L6"02&'78  " ;;MM67#oGOPBCP 	j!M 	T"4"t{{+D 	j!A E\\lDmA=*A'.?AXZ^ZeZef< 	j!9 24Gx'&t{{300 !28!<4;;W #(^ilnqhr|  !A &&(C/  L /t]CH8#"4;;/,,.x8t{{SL 	j!j!s   A=G- !,G- 'G- CG- -G:)N)7r0   r1   r   r-   r   r   typingr   r   rich.consoler   rich.promptr   rL   r   StreamingCommunity.setupr	   r
   r   r   !StreamingCommunity.services._baser   StreamingCommunity.utilsr   r   r   StreamingCommunity.uploadr   r   r+   r   r   r   rs   get_boolr*   r   r6   r$   r:   r@   ru   r   rI   r^   ro   rw   r   r   r   r   r   r   r   r   r"   r%   r#   <module>r     sN   
 
     " !  ! [ [ C N N ? )h	
 ~':!((11)=OP !!**9oF	x	* #  
A:JC JC J	+D 	+T 	+4Y$ 4Y5t+< 4Yns 3 3 3l>%4E >q0:"r%   