+
    Ki-  c                   sh   R t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHtHtH	t	H
t
 ^ RIHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHtHt ^ RIHt ^ RIHt ^ RIH t  ^ RI!H"t"H#t# ^ RI$H%t% ^ RI&H't' ]PP                  '       d   ^ RI)H*t*  ! R R]4      t+ ! R R]4      t, ! R R]4      t-R# )z$Module for handling the Zoom serviceN)gettext)AnyDictListTuple)settings)AuthenticationError)AUTO_ELF_EXEAUTO_WIN32_EXE)InstallerFile)InstallerFileCollection)get_runner_human_name)SERVICE_LOGINOnlineService)ServiceGame)ServiceMedia)system)	HTTPErrorRequest)logger)computer_size)LutrisInstallerc                   s|    ] tR t^tRtRtR	t]P                  P                  ]
P                  R4      tR.tRtRtRtR# )
	ZoomCoverzSmall size game logozoomplatformzzoom/cover/z%s.jpgimagez%s N)i   i,  )__name__
__module____qualname____firstlineno____doc__servicesizeospathjoinr   	CACHE_DIRZ	dest_pathZfile_patternsZ	api_fieldZurl_pattern__static_attributes__r       9/usr/lib/python3.14/site-packages/lutris/services/zoom.pyr   r      s:    GDX//?IJMIKr&   r   c                   s8   a  ] tR t^'t o RtRt]R 4       tRtV t	R# )ZoomGamezRepresentation of a Zoom gamer   c                s   \        4       p\        VR,          4      Vn        \        VR,          4      Vn        VR,          Vn        VR,          Vn        TpVR,          VR&   VR,          VR&   \        P                  ! V4      Vn        V# )z-Return a Zoom game instance from the API infoidslugnameZ
poster_urlr   )	r(   strappidZgame_idr*   r+   jsonZdumpsdetails)Zcls	zoom_gameZservice_gamer/      &&  r'   new_from_zoom_gameZZoomGame.new_from_zoom_game,   s      z 41"9T?3%f-%f-$\2#F+#zz'2r&   r   N)
r   r   r   r   r   r   Zclassmethodr2   r%   __classdictcell____classdict__   @r'   r(   r(   '   s     'G r&   r(   c                   s  a  ] tR t^;t o RtRt]! R4      tRtRt	Rt
R]/tRtRtRtR.tRt]P&                  P)                  ]P,                  R	4      t]P&                  P)                  ]P,                  R
4      t]P&                  P)                  ]P,                  R4      tRRRR/t]R 4       t]V 3R lR l4       tV 3R lR ltR tV 3R lR lt V 3R lR lt!V 3R lR lt"V 3R lR lt#V 3R lR lt$V 3R lR  lt%V 3R! lR" lt&V 3R# lR$ lt'V 3R% lR& lt(V 3R' lR( lt)V 3R) lR* lt*V 3R+ lR, lt+V 3R- lR. lt,V 3R/ lR0 lt-V 3R1 lR2 lt.R3t/V t0R4# )5ZoomServicezService class for ZOOM Platformr   zZOOM PlatformZzoomTZcoverartzhttps://www.zoom-platform.comz/https://www.zoom-platform.com/account?li_token=z.zoom.tokenz
.zoom.authzzoom-library.jsonwinewindowslinuxc                s     V P                    R2# )zReturn authentication URLz%/login?li=lutris&return_li_token=true)	embed_urlself   &r'   	login_urlZZoomService.login_urlR   s     ..!!FGGr&   c                0   < V ^8  d   QhRS[ S[,          /#    return)r   r,   Zformatr5      "r'   __annotate__ZoomService.__annotate__X   s     4 4$s) 4r&   c                s2    V P                   V P                  .# N)cookies_path
token_pathr<   r>   r'   credential_filesZZoomService.credential_filesW   s    !!4??33r&   c                    < V ^8  d   QhRS[ /# rA   )ZboolrD   rE   r'   rF   rG   [   s     
 
d 
r&   c                s     V P                  V P                   R24      p\        P                  ! RT4       R#   \         d    \        P                  ! R4        R# i ; i)zHReturn whether the user is authenticated and if the service is availablez/li/loggedinzUser is not authenticatedFzUser is authenticated: %sT)make_requestapi_urlr   r   debug)r=   requests   & r'   is_connectedZZoomService.is_connected[   sW    	''4<<.(EFG
 	0': # 	LL45	s   9 !AAc                s"    V P                  4       # rH   )rQ   r<   r>   r'   is_authenticatedZZoomService.is_authenticatedg   s      ""r&   c                r@   rA   )r   r(   rD   rE   r'   rF   rG   j   s     	 	d8n 	r&   c                s"   V P                  4       '       g   \        P                  ! R4       . # V P                  4        Uu. uF  p\        P                  V4      NK  	  ppV F  pVP                  4        K  	  V P                  4        V# u upi )z,Load the user game library from the Zoom APIzUser not connected to Zoom)rQ   r   errorget_libraryr(   r2   ZsaveZmatch_games)r=   gamegames   &  r'   loadZZoomService.loadj   sw      ""LL56I?C?O?O?QR?Qt,,T2?QRDIIK 	 Ss   Bc                s   < V ^8  d   QhRR/# )rB   rC   Nr   rD   rE   r'   rF   rG   u   s     
! 
!T 
!r&   c                sb   R V9  d   \         P                  ! R4       R# VP                  R 4      R,          p\        V P                  RRR7      ;_uu_ 4       pVP                  V4       RRR4       V P                  '       d   Q h\        P                  ! V 4       R#   + '       g   i     L<; i)z	li_token=z.Login callback URL does not contain 'li_token'Nwutf-8Zencodingi)	r   rS   ZsplitopenrJ   ZwriteZis_login_in_progressr   Zfire)r=   urltoken
token_filer1   r'   login_callbackZZoomService.login_callbacku   s    c!LLIJ		+&r*$//399ZU# : ,,,,,4 	 :9s   BB.	c                rL   rA   )r,   rD   rE   r'   rF   rG      s      C r&   c                s6   \         P                  P                  V P                  4      '       g   \	        R4      h\        V P                  RR7      ;_uu_ 4       pVP                  4       pRRR4       X'       g   \	        R4      hV#   + '       g   i     L%; i)zLoad token from diskzNo Zoom token availablerZ   r[   N)r!   r"   ZexistsrJ   r   r\   Zread)r=   r_   Ztoken_contentrW   r'   
load_tokenZZoomService.load_token   si    ww~~doo..%&?@@$//G44
&OO-M 5 %&?@@ 54s   BB	c                &   < V ^8  d   QhRS[ RS[/# )rB   r]   rC   )r,   r   rD   rE   r'   rF   rG      s        r&   c                s    V P                  4       pRRV,           RR/p\        WR7      pVP                  4        VP                  # )z/Send a token authenticated HTTP request to ZoomZAuthorizationzBearer ZAcceptzapplication/json)headers)ra   r   getr.   )r=   r]   r^   rc   rP   s   &&   r'   rM   ZZoomService.make_request   sA     !"I$5xAST#/||r&   c                r@   rA   )r   r   rD   rE   r'   rF   rG      s      T$Z r&   c                sP   \         P                  ! V P                  4      '       dX   \        P                  ! R4       \        V P                  RRR7      ;_uu_ 4       p\        P                  ! V4      uuRRR4       # V P                   R2pV P                  V4      pVP                  R^ 4      pVP                  R^ 4      pVR	,          pWE^,
          8  dh   \        P                  ! ^4       \        P                  ! R
4       V^,          pV RV 2pV P                  V4      pVP                  VR	,          4       Kt  \        V P                  RRR7      ;_uu_ 4       p\        P                  ! Wa4       RRR4       V#   + '       g   i     EL; i  + '       g   i     T# ; i)z'Return the user's library of Zoom gameszReturning cached Zoom libraryZrrZ   r[   Nz	/li/gamescurrent_pagetotal_pagesrV   z)Fetching additional pages of Zoom libraryz?page=rY   )r   Zpath_exists
cache_pathr   rO   r\   r.   rX   rN   rM   rd   timeZsleepZextendZdump)r=   Z
zoom_cacher]   Zresponsere   rf   rV   Znext_page_urls   &       r'   rT   ZZoomService.get_library   sA   doo..LL89doosW==yy, >= i($$S)||NA6ll=!4!1_,JJqMLLDEAL"e6,8M((7HLL'*+ $//399ZIIe( : + >==$ :9 s   F F F	F%	c                sL   < V ^8  d   QhRS[ RS[S[ S[S[,          3,          /# rB   r-   rC   )r,   r   r   dictrD   rE   r'   rF   rG      s(     2 2 2S$t*_(= 2r&   c                sV    \         P                  ! RV4       RV P                  V4      /# )zCReturn a list of bonus content available for a Zoom ID and its DLCsz+Download extras for Zoom ID %s and its DLCsextras)r   rO   
_get_extra)r=   r-      &&r'   
get_extrasZZoomService.get_extras   s%    BEJ$//%011r&   c                s6   < V ^8  d   QhRS[ RS[S[,          /# ri   )r,   r   rj   rD   rE   r'   rF   rG      s       T
 r&   c                s   V P                  V P                   R V R24      p. pR F|  pW$,          pV Fk  p V P                  V P                   RVR,           24      pRTR,          RTR,          RTR,          R	\        TR
,          4      /p	TP                  T	4       Km  	  K~  	  V#   \         d3   p\        P                  ! RTP                  R4      T4        Rp?K  Rp?ii ; i)	/li/game//files/li/download/r)   zUnable to locate extra '%s': %sr+   Nr]   filename
total_sizer    )ZmanualZmiscZ
soundtrack)rM   rN   r   r   Z	exceptionrd   r   append)
r=   r-   files_requestZ
all_extrasZ
extra_typefilesfileZdownload_requestZexZextra_file_dicts
   &&        r'   rl   ZZoomService._get_extra   s     ))T\\N)E7&*QR 
:J!-E'+'8'8DLL>W[\`WaVb9c'd$ DL+E2V -V"=	# !!/2  ;   ! $$%FQWHXZ\]s   'B((C%3'C  C%c                sR   < V ^8  d   QhRS[ S[S[3,          RS[ S[S[3,          /# rB   db_gamerC   )r   r,   r   rD   rE   r'   rF   rG      s+     = =$sCx. =T#s(^ =r&   c                s    \         P                  ! R V4       \        P                  ! VR,          4      pVR,          pRV9   d   V P	                  RV4      # V P	                  RV4      # )zGenerating installer for %sr/   operating_systemsr:   r8   )r   rO   r.   loads_generate_installer)r=   ry   r/   	platformsr1   r'   generate_installerZZoomService.generate_installer   s]    2G<**WY/0/0	i++GW==++FG<<r&   c                sL   < V ^8  d   QhRS[ S[S[3,          RS[S[,          /# rx   )r   r,   r   r   rj   rD   rE   r'   rF   rG      s'      4S> d4j r&   c                s   \         P                  ! VR ,          4      pVR,          p. pRV9   d"   VP                  V P                  RV4      4       RV9   d"   VP                  V P                  RV4      4       \	        V4      ^8  dI   V FB  p\        VR,          4      pTR;;,          RT;'       g
    VR,          ,           ,          uu&   KD  	  V# )r/   rz   r:   r9   r8   runnerversionZ )r.   r{   rt   r|   lenr   )r=   ry   r/   r}   Z
installers	installerZrunner_human_names   &&     r'   generate_installersZZoomService.generate_installers   s    **WY/0/0	
id66wHI	!d66vwGHz?Q'	$9)H:M$N!)$/@/W/WIhDW(XX$ ( r&   c                sX   < V ^8  d   QhRS[ RS[S[ S[3,          RS[S[ S[3,          /# )rB   r   ry   rC   )r,   r   r   rD   rE   r'   rF   rG      s5     
 
# 
S#X 
4PSUXPX> 
r&   c                s    VR ,          p/ pVR8X  d   R\         /pRRRRR//RR	RRR
//.pMR\        /pRR/.pRVR,          RRR VRV P                  V4      RVRVR,          RRVRVRRR/.RV//# )r*   r:   ZexeZextractrw   zoominstallerZdstz$CACHEZmergeZsrcz$GAMEDIRZautosetup_zoom_platformr+   r   ZZoom	game_slugr   Zzoomidr-   scriptrU   r   rv   z"N/A:Select the installer from Zoomr   )r   r   Zget_installed_slug)r=   r   ry   r*   Zsystem_configZgame_configr   s   &&&    r'   r|   ZZoomService._generate_installer   s    vW ,/KV_eXFG5(E:>?F
 !.1K*O<F GFOvD009fgg&-?,PQRV	
 	
r&   c                sv   < V ^8  d   QhRRRS[ RS[S[,          RS[S[S[,          S[S[,          3,          /# )rB   r   r   installer_file_idselected_extrasrC   )r,   r   rj   r   r
   r	   rD   rE   r'   rF   rG   
  sH      *?BUYZ^U_	t+,d=.AA	Br&   c                sZ   \         P                  ! R V4       VP                  pVR8X  d   RpV P                  WAP                  VP
                  4      p\        VP                  W%4      .p. pV'       d7   V F0  pVP                  \        VP                  VR,          V4      4       K2  	  Wg3# )zGetting installer files for %sr8   r9   r+   )	r   rO   r   _get_installersr   Zservice_appidr
   rt   r	   )	r=   r   r   r   platformZinstaller_filesrv   rk   Zselected_extras	   &&&&     r'   get_installer_filesZZoomService.get_installer_files
  s     	57HI##v H..x9L9LiNeNef()<)<>Oab"1mI,?,?PVAWYghi #2 }r&   c          	      sB   < V ^8  d   QhRS[ RS[ RS[ RS[S[,          /# )rB   r   r   r-   rC   )r,   r   r	   rD   rE   r'   rF   rG     s/        C DQ^L_ r&   c           	     s   V P                  V P                   R V R24      p. pWA,          p\        V4       \        V4      ^8X  g   Q RV,          4       hV P                  V P                   RV^ ,          R,           24      pRVR,          RV^ ,          R,          R\	        V^ ,          R	,          4      /p\        VR
V4      p	VP                  V	4       V# )ro   rp   zMore than one file found for %srq   r)   r]   rr   r+   rs   r    r   )rM   rN   Zprintr   r   r	   rt   )
r=   r   r   r-   ru   Z	file_listrv   r.   Zinstaller_file_dictZinstaller_files
   &&&&      r'   r   ZZoomService._get_installers  s     ))T\\N)E7&*QR 	'e5zQL AH LL  DLL>uQx~>N!OP 4;a(-a(89
 '

 	(r&   c                rb   )rB   r0   rC   )rj   r(   rD   rE   r'   rF   rG   6  s     6 6$ 68 6r&   c                s,    \         P                  V4      # rH   )r(   r2   )r=   r0   rm   r'   get_service_gameZZoomService.get_service_game6  s    **955r&   c                rb   )rB   
product_idrC   )r,   rj   rD   rE   r'   rF   rG   9  s      3 4 r&   c                s4    \         P                  ! R V4       / # )zGetting game details for %s)r   rO   )r=   r   rm   r'   get_game_detailsZZoomService.get_game_details9  s    2J?	r&   c                rb   rx   )rj   r,   rD   rE   r'   rF   rG   =  s     ; ; ;# ;r&   c                s|    V P                  V4       Uu. uF  q"P                  4       NK  	  ppR V9   d   R # R# u upi )r:   r8   )Zget_game_platformsZcasefold)r=   ry   r   r}   r1   r'   get_installed_runner_nameZ%ZoomService.get_installed_runner_name=  sC    9=9P9PQX9YZ9YX&&(9Y	Z!Y.w:F: [s   9r   N)1r   r   r   r   r   r)   _r+   ZiconZ
has_extrasZdrm_freer   ZmediasZdefault_formatr;   rN   Zredirect_urisZlogin_success_urlr!   r"   r#   r   r$   rJ   rI   rg   Zrunner_to_os_dictZpropertyr?   rK   rQ   rR   rX   r`   ra   rM   rT   rn   rl   r~   r   r|   r   r   r   r   r   r%   r3   r4   r6   r'   r7   r7   ;   sx    )	B_DDJH)$FN/I-GFGMIh00-@J77<< 2 2LALh002EFJGW=H H 4 4
 
#	 	
! 
!   62 2
 2= = &
 
: $ 46 6 ; ;r&   r7   ).r   r.   r!   rh   Ztypingr    r   r   r   r   r   Zlutrisr   Zlutris.exceptionsr   Zlutris.installerr   r   Zlutris.installer.installer_filer	   Z*lutris.installer.installer_file_collectionr
   Zlutris.runnersr   Zlutris.services.baser   r   Zlutris.services.service_gamer   Zlutris.services.service_mediar   Zlutris.utilr   Zlutris.util.httpr   r   Zlutris.util.logr   Zlutris.util.stringsr   ZTYPE_CHECKINGZlutris.installer.installerr   r   r(   r7   r   r&   r'   <module>r      sy    *  	     ) )  1 9 9 N 0 = 4 6  / " -	: { (D;- D;r&   