
    Ti7                     D   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 d dl	m
Z
mZ d dlmZ d dlmZmZmZ d dlZ ed      Ze j(                  j+                  ed      Zej/                  d	      d
efd       Zej/                  d      d
efd       Zej/                  d      d
efd       Zej/                  d      d
efd       Zej/                  d      d
efd       Zej;                  d      defd       Zej/                  d      d
efd       Z ej;                  d      d'defd       Z!ej;                  d      defd       Z"ej;                  d      defd        Z#ded!efd"Z$ej;                  d#      defd$       Z%ej;                  d%      defd&       Z&y)(    N)	APIRouterRequestHTTPException)FileResponseStreamingResponse)USER_DATA_DIR)ListDictAnyz/api)prefix	workspacez/update_filerequestc                 P  K   	 | j                          d {   }|d   }t        j                  j                  t        |      }|d   }t        |d      5 }|j                  |       d d d        ddiS 7 \# 1 sw Y   xY w# t        $ r}t        |      dcY d }~S d }~ww xY ww)NpathcontentwsuccessTerrorr   )	jsonosr   joinWORKSPACE_ROOTopenwrite	Exceptionstr)r   datar   	full_pathr   fes          K/home/jay/workspace/tools/ai-image-gen/jaaz-app/server/routers/workspace.pyupdate_filer#      s     	/\\^#F|GGLL6	y/)S! 	QGGG	4   $	 	  /Q../s\   B&B A4>B A6(B 3B&4B 6A?;B 	B#BB#B&B##B&z/create_filec                 .  K   | j                          d {   }|d   }t        j                  j                  t        |d      }t        j                  j                  |      \  }}t        j                  j                  |      \  }}|}d}	t        j                  j                  |      rN| d|	 | }
t        j                  j                  ||
      }|	dz  }	t        j                  j                  |      rNt        d|       t        j                  t        j                  j                  |      d       t        |d      5 }|j                  d	       d d d        d
t        j                  j                  |t              iS 7 p# 1 sw Y   2xY ww)Nrel_dirzUntitled.md    candidate_pathT)exist_okr    r   )r   r   r   r   r   splitsplitextexistsprintmakedirsdirnamer   r   relpath)r   r   r%   r   dir_name	base_namenameextr(   counternew_baser    s               r"   create_filer8      s2    D9oG77<<?D''---Hi  +ID#NG
''..
(V1WIcU+h91	 ''..
(
 

N+KK/$?	nc	" a	BGGOONNCDD%    s/   FFC"F:AFF	/F	FFz/delete_filec                 z   K   | j                          d {   }|d   }t        j                  |       ddiS 7 "w)Nr   r   T)r   r   remove)r   r   r   s      r"   delete_filer;   3   s8     D<DIIdOt  s   ;9#;z/rename_filec                 
  K   	 | j                          d {   }|d   }t        j                  j                  t        |      }|d   }t        j                  j                  |      rXt        j                  j                  t        j                  j                  |      |      }t        j                  ||       d|dS d| d|dS 7 # t        $ r+}t        j                          dt        |      icY d }~S d }~ww xY ww)	Nold_path	new_titleT)r   r   File  does not existr   r   )r   r   r   r   r   r-   r0   renamer   	traceback	print_excr   )r   r   r=   r>   new_pathr!   s         r"   rename_filerE   :   s     !\\^#
#77<<9%	77>>(#ww||BGGOOH$=yIHIIh)#X66$XJo>QQ $  !Q  !sQ   DC C
B(C  DC 	D
C 	D  C;5D 6D;D  Dz
/read_filec                   K   	 | j                          d {   }|d   }t        j                  j                  t        |      }t        j                  j                  |      r*t        |d      5 }|j                         }d|icd d d        S d| d|dS 7 # 1 sw Y   y xY w# t        $ r}t        |      dcY d }~S d }~ww xY ww)Nr   rr   r?   r@   r   )
r   r   r   r   r   r-   r   readr   r   )r   r   r   r   r    r   r!   s          r"   	read_filerI   K   s     /\\^#F|GGLL6	77>>)$i% ,&&(!7+, ,  %TF/:DII $, ,
  /Q../su   C	B% BAB% 0B	B% C	B% C	B% B"B% !C	"B% %	C.C;C<C	CC	z/list_files_in_dirrel_pathc           	      8  K   	 t         j                  j                  t        |       }t        j                  |      }g }|D ]  }t         j                  j                  ||      }|j                  |t         j                  j                  |      t         j                  j                  | |      t         j                  j                  |      d        |j                  d d       |D ]  }|j                  d        |S # t        $ r}g cY d }~S d }~ww xY ww)N)r4   is_dirrJ   mtimec                     | d   S NrM    xs    r"   <lambda>z#list_files_in_dir.<locals>.<lambda>i   s
    aj     TkeyreverserM   )r   r   r   r   listdirappendisdirgetmtimesortpopr   )rJ   r   files
file_nodesfile	file_pathnoder!   s           r"   list_files_in_dirrc   Z   s     GGLL:	

9%
 	DY5I''--	2GGLL48)))4	 	 	0$? 	DHHW	 	s5   DC=D D	DDDDDDz/open_folder_in_explorerc                   K   	 | j                          d{   }|j                  d      }|st        dd      t        j                  j                  |      st        dd      t        j                  j                  |      st        dd      t        j                         }|d	k(  rt        j                  d
|gd       nN|dk(  rt        j                  d|gd       n/|dk(  rt        j                  d|gd       nt        dd|       dddS 7 # t        j                  $ r}t        ddt        |             d}~wt        $ r2}t        j                          t        ddt        |             d}~ww xY ww)u   
    在系统文件浏览器中打开指定文件夹
    
    Args:
        request: 包含文件夹路径的请求
    
    Returns:
        操作结果
    Nr     zMissing folder pathstatus_codedetail  zFolder not foundPath is not a directoryWindowsexplorerT)checkDarwinr   Linuxzxdg-open  zUnsupported operating system: z Folder opened in system explorer)r   messagezFailed to open folder: zError opening folder: )r   getr   r   r   r-   rZ   platformsystem
subprocessrunCalledProcessErrorr   r   rB   rC   )r   r   folder_pathrt   r!   s        r"   open_folder_in_explorerry   q   sa    #W\\^#hhv&C8MNN ww~~k*C8JKKww}}[)C8QRR "YNNJ4DAxNNFK0=wNNJ4DAC:XY_X`8abb,NOO9 $< (( X6McRSfX4VWW W6LSQRVH4UVVWsE   F
D DDD F
D F0E		F-FFF
z/browse_filesystemr   c           
      (  K   	 | st         j                  j                  d      } t         j                  j                  |       st	        dd      t         j                  j                  |       st	        dd      g }	 t        j                  |       D ]  }t         j                  j                  | |      }|j                  d      r5	 t        j                  |      }t         j                  j                  |      }|rdn
t        |      }|s|j                  nd	}|j                  }|d
v }	|||||||	|	d}
|j                  |
        	 |j!                  d        | | t         j                  j#                  |       k7  rt         j                  j#                  |       nd	|dS # t        t        f$ r Y $w xY w# t        $ r t	        dd      w xY w# t$        $ r/}t'        j(                          t	        dt+        |            d	}~ww xY ww)u   
    浏览电脑任意位置的文件系统
    
    Args:
        path: 要浏览的路径，如果为空则从用户家目录开始
    
    Returns:
        包含文件夹和文件信息的列表
    ~ri   zPath not foundrf   re   rj   .folderNimagevideo)r4   r   typesizerM   is_directoryis_mediahas_thumbnail  Permission deniedc                 4    | d    | d   j                         fS )Nr   r4   )lowerrQ   s    r"   rS   z#browse_filesystem.<locals>.<lambda>   s    a&7"769J!K rT   )rV   )current_pathparent_pathitemsrp   )r   r   
expanduserr-   r   rZ   rX   r   
startswithstatget_file_typest_sizest_mtimerY   OSErrorPermissionErrorr\   r0   r   rB   rC   r   )r   r   item	item_pathr   rL   	file_typer   rM   r   	item_infor!   s               r"   browse_filesystemr      s    F<77%%c*D ww~~d#C8HIIww}}T"C8QRR+	M

4( &GGLLt4	 ??3'779-DWW]]95F -3i8PI 064<<4D !MME  ),>>H !% ) ) $!&(.$,)1	!I LL+E&X 	

K
L !48BGGOOD<Q4Q277??40W[
 	
  1   	MC8KLL	M  <CF;;<sh   HA;G  A
F= A?F'
F= AG &H'F:6F= 9F::F= =GG 	H *H

HHz/get_media_filesc           	        K   	 t         j                  j                  |       rt         j                  j                  |       st	        dd      g }	 t        j
                  |       D ]  }t         j                  j                  | |      }t         j                  j                  |      sCt        |      }|dv sSt        j                  |      }|j                  ||||j                  |j                  d        	 |j                  d d	
       |S # t        $ r t	        dd      w xY w# t        $ r/}t!        j"                          t	        dt%        |            d}~ww xY ww)u   
    获取指定文件夹下的所有媒体文件（图片和视频）
    
    Args:
        path: 文件夹路径
    
    Returns:
        媒体文件列表
    re   zInvalid directory pathrf   r~   )r4   r   r   r   rM   r   r   c                     | d   S rO   rP   rQ   s    r"   rS   z!get_media_files.<locals>.<lambda>  s
    qz rT   TrU   rp   N)r   r   r-   rZ   r   rX   r   isfiler   r   rY   r   r   r   r\   r   rB   rC   r   )r   media_filesr   r   r   r   r!   s          r"   get_media_filesr      s4    "<ww~~d#277==+>C8PQQ	M

4( GGLLt4	77>>), -i 8I $66!wwy1#**$($-$-$(LL%)]], * 	14@  	MC8KLL	M  <CF;;<sO   E(AD- AD *D :AD <D- E(D**D- -	E%6*E  E%%E(z/get_file_thumbnailra   c                    K   	 t         j                  j                  |       st        dd      t	        |       }| |d|dv dS # t
        $ r}t        dt        |            d}~ww xY ww)	u   
    获取文件的缩略图信息
    
    Args:
        file_path: 文件路径
    
    Returns:
        缩略图信息或文件信息
    ri   File not foundrf   Tr~   )r   r   r-   can_previewrp   N)r   r   r-   r   r   r   r   )ra   r   r!   s      r"   get_file_thumbnailr   #  ss     <ww~~i(C8HII!),	 $(::	
 	
  <CF;;<s(   A+?A A+	A(A##A((A+returnc                    t         j                  j                  |       ryt         j                  j                  | j	                               \  }}h d}h d}h d}h d}h d}h d}||v ry||v ry	||v ry
||v ry||v ry||v ryy)u   
    根据文件扩展名判断文件类型
    
    Args:
        file_path: 文件路径
    
    Returns:
        文件类型: 'image', 'video', 'audio', 'document', 'archive', 'code', 'file'
    r}   >	   .bmp.gif.ico.jpg.png.svg.jpeg.tiff.webp>	   .3gp.avi.flv.m4v.mkv.mov.mp4.wmv.webm>   .aac.m4a.mp3.ogg.wav.wma.flac>   .doc.odt.pdf.rtf.txt.docx.pages>   .7z.gz.xz.bz2.rar.tar.zip>   .c.go.js.py.rb.rs.cpp.css.php.html.javar   r   audiodocumentarchivecoder`   )r   r   rZ   r,   r   )	ra   _r5   image_extensionsvideo_extensionsaudio_extensionsdocument_extensionsarchive_extensionscode_extensionss	            r"   r   r   >  s     
ww}}YWWioo/0FAsb`PUNiO
	 	 	 	 	#	#	"	"		rT   z/serve_filec                   K   	 t         j                  j                  |       st        dd      t         j                  j	                  |       st        dd      t        |       }|dvrt        dd      t        j                  |       \  }}|sd}t        | |t         j                  j                  |       	      S # t        $ r/}t        j                          t        d
t        |            d}~ww xY ww)u   
    提供文件内容服务，用于在浏览器中预览图片和视频
    
    Args:
        file_path: 文件路径
    
    Returns:
        文件内容
    ri   r   rf   re   zPath is not a filer~   z#File type not supported for previewapplication/octet-stream)
media_typefilenamerp   N)r   r   r-   r   r   r   	mimetypes
guess_typer   basenamer   rB   rC   r   )ra   r   	mime_typer   r!   s        r"   
serve_filer   c  s     <ww~~i(C8HIIww~~i(C8LMM "),	..C8]^^ !++I6	12I WW%%i0
 	
  <CF;;<s)   C:B:B? >C:?	C7*C22C77C:z/get_file_infoc                   K   	 t         j                  j                  |       st        dd      t        j                  |       }t        |       }t         j                  j                  |       | ||j                  |j                  |j                  t         j                  j                  |       |dv t        j                  |       d   xs dd	S # t        $ r/}t        j                          t        dt!        |            d	}~ww xY ww)
u~   
    获取文件详细信息
    
    Args:
        file_path: 文件路径
    
    Returns:
        文件详细信息
    ri   r   rf   r~   r   r   )	r4   r   r   r   rM   ctimer   r   r   rp   N)r   r   r-   r   r   r   r   r   r   st_ctimerZ   r   r   r   rB   rC   r   )ra   r   r   r!   s       r"   get_file_infor     s     <ww~~i(C8HIIwwy!!),	 GG$$Y/LL]]]]GGMM)4!%77"--i8;Y?Y

 
	
  <CF;;<s)   DCC D	D*DDD)r*   )'r   rB   rs   ru   r   fastapir   r   r   fastapi.responsesr   r   services.config_servicer   typingr	   r
   r   iorouterr   r   r   postr#   r8   r;   rE   rI   rr   r   rc   ry   r   r   r   r   r   r   rP   rT   r"   <module>r      s   	     5 5 = 1 " " 		&	!m[9^
/w 
/ 
/ ^Ew E E* ^w   ^!w ! !  \/W / /  !c  ", '(-W7 -W )-W^  !P<# P< "P<d ,< ,<  ,<\ !"< < #<4#S #S #J M#< #< #<J <3 < <rT   