
    ni:                        S SK r S SKrS SKrS SKrS SKrS SKJr  S SKrS SKrS SK	r	S SK
JrJrJrJrJr  S SKrS SKr\" \5      r\ R(                  R+                  \ R,                  " 5       S5      r\ R(                  R+                  \ R,                  " 5       S5      r\\R2                  S'   \\R2                  S'   \ R4                  " \SS	9  \ R4                  " \SS	9  S
 rS rS rS rS r\RA                  S5      S 5       r!\RA                  SS/S9S 5       r"\RA                  S5      S 5       r#\S:X  a  \RI                  SSSS9  gg)    N)BeautifulSoup)Flaskrequest	send_filerender_templatejsonifycache	convertedDOWNLOAD_CACHEOUTPUT_FOLDERTexist_okc                    / nUR                  S5        UR                  S5        UR                  S5        U(       a  UR                  S5        U H  nUR                  SU S35        M     UR                  S5        UR                  S5        UR                  SU;   a  S	OS5        UR                  S
U;   a  SOS5        UR                  SU;   a  SOS5        UR                  SU;   a  SOS5        UR                  SU;   a  SOS5        U Vs/ s H  oD(       d  M  UPM     nn[        [        R                  R	                  U S5      S5       nUR                  SR	                  U5      5        SSS5        gs  snf ! , (       d  f       g= f)z5
Generates fxmanifest.lua based on found meta files.
zfx_version 'cerulean'zgame 'gta5' zfiles {z    'z',}zhandling.metaz)data_file 'HANDLING_FILE' 'handling.meta'vehicles.metaz1data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'zcarcols.metaz'data_file 'CARCOLS_FILE' 'carcols.meta'zvehiclelayouts.metaz6data_file 'VEHICLE_LAYOUTS_FILE' 'vehiclelayouts.meta'zcarvariations.metaz<data_file 'CONTENT_UNLOCKING_META_FILE' 'carvariations.meta'zfxmanifest.luaw
N)appendopenospathjoinwrite)output_path
meta_filesmanifest_contentmetalinefs         JC:\Users\qxrol\Documents\Programmieren\FiveMServerManagerWeb\server\app.pygenerate_fxmanifestr"      s    34M*B	*D##eD6$45 $#blOl KrtuWfjtWt Sz|}^_iMi Ioqr\qu\ X  FH  	Ibv  {E  cE ^  KM  	N .>F-=TD-=F	bggll;(893	?1			*+, 
@	? G	?	?s   
E9E9!E>>
Fc                 `
   SSS.n[        SU  35        [        R                  " XS9nUR                  5         [	        UR
                  S5      nUR                  S5      nSnU(       a  S	UR                  S
S5      ;   a	  SUS
   -   nO*UR                  SSS9 H  nSUS
   ;   d  M  SUS
   -   n  O   U(       d  [        S5      e[        SU 35        [        R                  " XQS9nUR                  5         [	        UR
                  S5      nSnUR                  SSS9 H  nSUS
   ;   d  M  US
   n  O   U(       d3  UR                  S5      nU(       a  UR                  S
5      (       a  US
   nU(       d  [        S5      eUR                  S5      (       d  SU-   n[        SU 35        [        R                  " XqSS9n	U	R                  5         Sn
SU	R                  ;   ab  U	R                  S   nUR                  S5      nU H<  nSU;   d  M  UR                  S5      S   R                  5       R                  S5      n
  O   U
(       d  UR                  S5      S   n
[        R                  R                  U
5      S   (       dC  U	R                  R                  S 5      nU(       a!  [         R"                  " U5      nU(       a  X-  n
[        S!U
 35        [        R                  R%                  [&        R(                  S"   U
5      n[+        US#5       nU	R-                  S$S%9 H  nUR/                  U5        M     SSS5        Sn[+        US&5       nUR1                  S'5      n[        S(U 35        UR                  S)5      (       a  S*nO]UR                  S+5      (       a  S,nODUR                  S-5      (       a  S.nO+S/U;   d  S0U;   d  S1UR3                  5       ;   a  [        S25      eSSS5        U(       a  [        R                  R                  U
5      S   R3                  5       nUU:w  a  [        S3U S435        [        R                  R                  U
5      S5   U-   n[        R                  R%                  [&        R(                  S"   U5      n[4        R6                  " UU5        UnUn
OP[        R                  R                  U
5      S   (       d)  [        S65        US*-   n[4        R6                  " UU5        Un[        S7U 35        U$ ! , (       d  f       GN= f! , (       d  f       GN?= f)8zu
Scrapes GTA5-Mods.com to find the download link and downloads the file.
Returns the path to the downloaded archive.
zsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36zhttps://www.gta5-mods.com/)z
User-AgentRefererz
Scraping: )headerszhtml.parserza.btn.btn-primary.btn-lgNdownloadhrefr   zhttps://www.gta5-mods.comaT)r'   
/download/z+Could not find download button on the page.zDownload Page: zfiles.gta5-mods.comza.btn.btn-primaryz/Could not find final download link on the page.httpzDownloading file from: )r%   streamzContent-Disposition;z	filename=   "/zContent-TypezInitial filename: r   wbi    )
chunk_sizerb
   zHeader bytes: s   PK.zips   Rar!z.rars   7z.7zs	   <!DOCTYPEs   <htmls   <!doczfError: Downloaded file appears to be HTML. The scraper likely failed to find the direct download link.zDetected archive type: z. Renaming file.r   z+Warning: Unknown header, defaulting to .zipzFinal saved file: )printrequestsgetraise_for_statusr   text
select_onefind_all	Exception
startswithr%   splitstripr   r   splitext	mimetypesguess_extensionr   appconfigr   iter_contentr   readlowershutilmove)urlr%   responsesoupdownload_btndownload_page_urlr(   file_urlfile_link_tagfile_responsefilenamecdpartspartcontent_typeguess	save_pathr    chunkdetected_extheadercurrent_extnew_filenamenew_save_paths                           r!   download_from_gta5modsra   8   s    L/G 
Jse
||C1H6D ??#=>L
l&6&6vr&BB7,v:NN s.Aqy($?!F)$K! /
 EFF	O-.
/0 ||-?H6D H]]3T]* AfI-yH +
 (;<]..v66$V,HIJJv&&.9	#H:
./ LL4HM""$
 H 5 55""#89Dd"::k215;;=CCCH 
 >>#&r* 77H%a($,,00@..|<Ux(x	xj
)*SZZ(898DI	i	!"//4/@EGGEN A 
 L	i	!vh'(U##!Lw''!Lu%% LV#x6'9X=W  E  F  F 
 gg&&x0399;,&+L>9IJK77++H5a8<GLGGLL4D)E|TMKK	=1%I#H   *1-@A&/][[M2&Y	yk
*+O 
	 
	s   (TBT
T
T-c                 x   [         R                  " USS9   U R                  5       R                  S5      (       a9  [	        S5        [
        R                  " U SS9 nUR                  US9  SSS5        gU R                  5       R                  S	5      (       a=  [	        S
5        [        R                  " U S5       nUR                  U5        SSS5        g[	        SU  S35        [        R                  " XS9  g! , (       d  f       g= f! , (       d  f       g= f! [         a  n[        SU S35      eSnAff = f)z$
Extracts zip, rar, or 7z archives.
Tr   r6   z#Extracting 7z archive with py7zr...r)mode)r   Nr5   z&Extracting zip archive with zipfile...zExtracting z with patool...)outdirzFailed to extract archive: zO. If it's a RAR file, ensure 'unrar' or 'WinRAR' is installed and in your PATH.)r   makedirsrI   endswithr7   py7zrSevenZipFile
extractallzipfileZipFilepatoolibextract_archiver>   )archive_path
extract_tozzip_refes        r!   rn   rn      s    KK
T*J((//89$$\<:. =<!**622;<//,4"":. 54
 K~_=>$$\E =< 54  J5aS  9H  I  J  	JJsa   AD C9+D 4AD :D
D #D 9
DD D 

DD D 
D9%D44D9c                    / n[         R                  " U 5       Hc  u  p#nU HW  nUR                  5       R                  S5      (       d  M)  UR	                  [         R
                  R                  X%5      5        MY     Me     U$ )z4
Recursively finds all .rpf files in the directory.
z.rpf)r   walkrI   rg   r   r   r   )	directory	rpf_filesrootdirsfilesfiles         r!   find_rpf_filesr|      se     IWWY/EDzz|$$V,,  d!9:  0     c           	      z   [         R                  R                  [        R                  S   U5      n[         R                  R                  U5      (       a  [        R                  " U5        [         R                  " U5        [         R                  R                  US5      n[         R                  " U5        Sn[         R                  R                  U5      (       dT  [        SU S35        [        [         R                  R                  US5      S5       ofR                  S5        S	S	S	5        U$  US
SU SU/n[        SU 35        [        R                  " USSSS9n[        UR                  5        [         R                  R                  US5      n
[         R                  " U
SS9  / n[         R$                  " U5       H  u  pnU H  nUR'                  5       n[         R                  R                  X5      nUR)                  S5      (       a6  [        R*                  " U[         R                  R                  X5      5        M~  UR)                  S5      (       d  M  [        R*                  " U[         R                  R                  X?5      5        UR-                  U5        M     M     [        R                  " U5        [/        X;5        U$ ! , (       d  f       U$ = f! [        R                   a  n	[        SU	 35        [        SU	R                   35        [        SU	R                    35        [        [         R                  R                  US5      S5       ofR                  S5        S	S	S	5         S	n	A	GM	  ! , (       d  f        S	n	A	GN= fS	n	A	f["         a  n	[        SU	 35         S	n	A	GN@S	n	A	ff = f)z
Extracts a specific RPF file and organizes it.
New logic: We might have multiple RPFs or nested folders.
We'll treat "file_path" as the RPF to process.
r   _temp_rpf_extractedzKC:\Users\qxrol\Documents\Programmieren\FiveMServerInstaller\bin\GTAUtil.exezGTAUtil not found at z. Using fallback dummy.r   r   r   Nextractarchivez-iz-ozRunning GTAUtil: T)checkcapture_outputr;   z#Error extracting RPF with GTAUtil: zOutput: zError: z!Unexpected error extracting RPF: r+   r   )z.yftz.ytdz.ydr)z.metaz.xmlz.dat)r   r   r   rE   rF   existsrJ   rmtreerf   r7   r   r   
subprocessrunstdoutCalledProcessErrorstderrr>   ru   rI   rg   rK   r   r"   )	file_pathresource_namebase_extract_dirresource_dirtemp_extract_pathgta_util_pathr    cmdresultrs   
stream_dirr   rx   ry   rz   r{   
file_lowersrc_paths                     r!   process_rpfr      s    77<<

? ;]KL	ww~~l##l#KK\3HIKK!" cM77>>-((%m_4KLM"'',,0/BCHAwwWY{H7.iGXY!#'(44Pfmm lH5JKK
T*JWW%67EDJww||D/H""#;<<Hbggll:&DE$$%>??Hbggll<&FG!!$'  8 MM#$1S IH (( [3A378
#$z"#"'',,0/BCHAwwWY{HHHHH 71!5667sP   K3AK" 
K"N:6A(NM>/N>
N	NNN:!N55N:r/   c                      [        S5      $ )Nz
index.html)r    r}   r!   indexr   #  s    <((r}   z/processPOST)methodsc                     [         R                  n U R                  S5      nU(       a  SU;  a  [        SS05      S4$  [	        U5      n[        [        R                  " 5       5      S S n[        R                  R                  [        R                  S   SU 35      n[        X$5        [        U5      nS nU H8  nS	[        R                  R                  U5      R!                  5       ;   d  M6  Un  O   U(       d  U(       a  US
   nU(       d  [        SS05      S4$ UR#                  S5      R%                  S5      S   S-   U-   n['        XhU5      n	U S3n
[        R                  R                  [        R                  S   U
5      n[(        R*                  " US[(        R,                  5       n[        R.                  " U	5       Hr  u  pnU Hf  n[        R                  R                  UU5      n[        R                  R1                  U[        R                  S   5      nUR3                  UU5        Mh     Mt     S S S 5        [4        R6                  " U5        [        R                  R9                  U5      (       a  [        R:                  " U5        [        SSU
 3S.5      $ ! , (       d  f       No= f! [<         a-  n[?        U5        [        S[        U5      05      S4s S nA$ S nAff = f)NrL   zgta5-mods.comerrorz-Invalid URL. Please use a gta5-mods.com link.i     r   stage_zdlc.rpfr   z-No .rpf file found in the downloaded archive.r/   r0   _r5   r   r   Tr)   )successdownload_urli  ) r   jsonr9   r   ra   struuiduuid4r   r   r   rE   rF   rn   r|   basenamerI   rA   r@   r   rk   rl   ZIP_DEFLATEDru   relpathr   rJ   r   r   remover>   r7   )datarL   ro   	unique_idstaging_dirrw   
target_rpfrpfr   r   zip_filenamezip_pathzipfrx   ry   rz   r{   r   arcnamers   s                       r!   process_urlr   '  s]   <<D
((5/C/,!PQRTWWW9/-c2 

%bq)	ggll3::.>#?6)AUV2 #;/	
 CBGG,,S17799 
   i"1JW&UVWY\\\ 		#,,S1"5;iG":kJ (-77<<

? ;\J__XsG,@,@AT%'WW\%:!E!D "T4 8I ggooiO9TUGJJy'2 " &; B 	k"77>>,''IIl#4:l^9TUVV BA  /aQ()3../sE   B,J6 /.J6 BJ6 /BJ%<A(J6 %
J3/J6 6
K- "K("K-(K-z/download/<filename>c                 t    [        [        R                  R                  [        R
                  S   U 5      SS9$ )Nr   T)as_attachment)r   r   r   r   rE   rF   )rT   s    r!   download_filer   j  s(    RWW\\#**_"=xHX\]]r}   __main__z0.0.0.0i  )hostportdebug)%r   rJ   rk   r   r8   bs4r   rm   rh   rC   flaskr   r   r   r   r   r   glob__name__rE   r   r   getcwdr   r   rF   rf   r"   ra   rn   r|   r   router   r   r   r   r   r}   r!   <module>r      sG   	         E E  Ho biik73RYY[+6-

 +

?  NT * MD )-8CJJ.	BH 3) ) :x(@/ )@/D !"^ #^ zGGTG2 r}   