+
    Kiy  c                   s   R t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RIH	t	H
t
HtHt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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+H,t, ^ RI-H.t.H/t/H0t0 ^ RI1H2t2 ^ RI3H4t4H5t5 ]Pl                  '       d   ^ RI7H8t8  ! R R])4      t9 ! R R]94      t: ! R R]94      t; ! R R]'4      t< ! R R]%4      t=R# )z#Module for handling the GOG serviceN)defaultdict)gettext)AnyDictListOptionalTuple)	parse_qslunquote	urlencodeurlparse)etree)settings)AuthenticationErrorUnavailableGameError)AUTO_ELF_EXEAUTO_WIN32_EXE)InstallerFile)InstallerFileCollection)get_runner_human_name)SERVICE_LOGINOnlineService)ServiceGame)ServiceMedia)i18nsystem)	HTTPErrorRequestUnauthorizedAccessError)logger)
human_sizeslugify)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# )
GogSmallBannerzSmall size game logogogzgog/banners/smallz%s.jpgZimagezhttps:%s_prof_game_100x60.jpg N)id   i<   )__name__
__module____qualname____firstlineno____doc__servicesizeospathjoinr   	CACHE_DIR	dest_pathZfile_patternsZ	api_fieldurl_pattern__static_attributes__r#       8/usr/lib/python3.14/site-packages/lutris/services/gog.pyr!   r!       s;    GDX//1DEIJMI1Kr2   r!   c                   sn    ] tR t^+tRtRt]P                  P                  ]	P                  R4      tRtRtR# )GogMediumBannerzMedium size game logozgog/banners/mediumzhttps:%s_196.jpgr#   N)i   in   r$   r%   r&   r'   r(   r*   r+   r,   r-   r   r.   r/   r0   r1   r#   r2   r3   r4   r4   +   s*    DX//1EFI$Kr2   r4   c                   sn    ] tR t^3tRtRt]P                  P                  ]	P                  R4      tRtRtR# )GogLargeBannerzBig size game logozgog/banners/largezhttps:%s_392.jpgr#   N)i  i   r5   r#   r2   r3   r6   r6   3   s*    DX//1DEI$Kr2   r6   c                   s8   a  ] tR t^;t o RtRt]R 4       tRtV t	R# )GOGGamezRepresentation of a GOG gamer"   c                s    \        4       p\        VR,          4      Vn        VR,          Vn        VR,          Vn        \
        P                  ! V4      Vn        V# )z,Return a GOG game instance from the API infoidslugtitle)r7   strappidr9   namejsondumpsdetails)Zclsgog_gameZservice_game   && r3   new_from_gog_gameZGOGGame.new_from_gog_game@   sM     y $0$V,$W-#zz(3r2   r#   N)
r$   r%   r&   r'   r(   r)   ZclassmethodrC   r1   __classdictcell__)__classdict__s   @r3   r7   r7   ;   s     &G r2   r7   c                   s`  a a ] tR t^Kt oRtRt]! R4      tRtRt	Rt
R]R]R]/tRtRtR	tR
tRtR.tRt]P.                  P1                  ]P4                  R4      t]P.                  P1                  ]P4                  R4      t]P.                  P1                  ]P4                  R4      tRRRR/tV 3R lt] R 4       t!] V3R lR l4       t"V3R lR lt#V3R lR lt$V3R lR lt%ReV3R lR l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-RfV3R. lR/ llt.V3R0 lR1 lt/V3R2 lR3 lt0V3R4 lR5 lt1V3R6 lR7 lt2V3R8 lR9 lt3RgV3R: lR; llt4V3R< lR= lt5RgV3R> lR? llt6V3R@ lRA lt7V3RB lRC lt8V3RD lRE lt9V3RF lRG lt:V3RH lRI lt;V3RJ lRK lt<V3RL lRM lt=V3RN lRO lt>V3RP lRQ lt?V3RR lRS lt@V3RT lRU ltAV3RV lRW ltBV3RX lRY ltCV3RZ lR[ ltDRhV3R\ lR] lltEV3R^ lR_ ltFV3R` lRa ltGV3Rb lRc ltHRdtIVtJV ;tK# )i
GOGServicezService class for GOGr"   GOGTZbanner_smallZbannerZbanner_largezhttps://embed.gog.comzhttps://api.gog.comZ46899977096215655Z@9d85c43b1482497dbbce61f6e4aa173a433796eeae2ca8c5f6129f2dc4de46d9z4https://embed.gog.com/on_login_success?origin=clientz$https://www.gog.com/on_login_successz	.gog.authz
.gog.tokenzgog-library.jsonwinewindowslinuxc                s   < \         SV `  4        R RRRRRRRRR	R
R/pVP                  \        P                  ! 4       R4      V n        R# )enzen-USZdezde-DEZfrzfr-FRZplzpl-PLZruzru-RUZzhzzh-HansN)Zsuper__init__getr   get_langlocale)selfZgog_locales	__class__s   & r3   rL   ZGOGService.__init__d   sO     ''''')
 "oodmmow?r2   c                sp    RV P                   RRRV P                  ^ ,          RR/pR\        V4      ,           # )zReturn authentication URL	client_idZlayoutZclient2redirect_uriZresponse_typecodezhttps://auth.gog.com/auth?)rR   redirect_urisr	   )rP   params   & r3   	login_urlZGOGService.login_urlq   s@     iD..q1V	
 ,i.???r2   c                0   < V ^8  d   QhRS[ S[,          /#    return)r   r;   formatrE      "r3   __annotate__GOGService.__annotate__}   s     4 4$s) 4r2   c                s2    V P                   V P                  .# N)cookies_path
token_path)rP   s   &r3   credential_filesZGOGService.credential_files|   s    !!4??33r2   c                    < V ^8  d   QhRS[ /# rZ   )boolr]   r_   r3   r`   ra      s     ; ;d ;r2   c                sD   V P                  4       '       g   R#  V P                  4       p\        T;'       d    RT9   4      #   \         d     R# \         d    \        P
                  ! R4        R# \         d#   p\        P                  ! RT4        Rp?R# Rp?ii ; i)zHReturn whether the user is authenticated and if the service is availableFzGOG token is invalidzFailed to query user data: %sNZusername)	is_authenticatedget_user_datar   r   r   warningr   	exceptionrg   )rP   Z	user_dataex   &  r3   is_connectedZGOGService.is_connected   s    $$&&		**,I I99*	"9:: # 	& 	NN12 	<bA	s/   A BBB3B<B=BBc                rY   rZ   )r   r7   r]   r_   r3   r`   ra      s     	 	d7m 	r2   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 GOG APIzUser not connected to GOG)rn   r   errorget_libraryr7   rC   ZsaveZmatch_games)rP   gamegamesrm   r3   loadZGOGService.load   sw      ""LL45I=A=M=M=OP=OT**40=OPDIIK 	 Qs   Bc                s   < V ^8  d   QhRR/# )r[   r\   Nr#   r]   r_   r3   r`   ra      s     ' 'T 'r2   c                s$    V P                  V4      # rb   )request_tokenrP   url   &&r3   login_callbackZGOGService.login_callback   s    !!#&&r2   c                s*   < V ^8  d   QhRS[ RS[ RR/# )r[   rv   refresh_tokenr\   N)r;   r]   r_   r3   r`   ra      s"     '% '% '%# '%t '%r2   c                s   V'       d   RpRV/pM~Rp\        V4      p\        \        VP                  4      4      pRV9  d/   \        P
                  ! R4       \        P
                  ! V4       R# RVR,          RV P                  ^ ,          /pRV P                  RV P                  R	V/pVP                  V4       R
\        V4      ,           p\        VRR7      p VP                  4        TP                   p
\#        T P$                  RRR7      ;_uu_ 4       pTP'                  \         P(                  ! T
4      4       RRR4       T'       g   \*        P,                  ! T 4       R# R#   \         d^   p	\        P
                  ! T	4       \        P
                  ! R4       \        P                  ! R4       T P                  4         Rp	?	R# Rp	?	ii ; i  + '       g   i     L; i)z!Get authentication token from GOGry   Zauthorization_coderT   zcode not received from GOGNrS   rR   client_secret
grant_typezhttps://auth.gog.com/token?)Zredacted_query_parameterszFailed to get token.zClearing existing credentialswutf-8Zencoding)ry   rT   )r
   dictr   queryr   ro   rU   rR   rz   Zupdater	   r   rM   r   rj   Zlogoutr>   openrd   Zwriter?   r   Zfire)rP   rv   ry   r{   Zextra_paramsZ
parsed_urlZresponse_paramsrV   requestZ
http_errortoken
token_files   &&&         r3   rt   ZGOGService.request_token   su   (J+];L-J!#J"9Z-=-=#>?O_,9:_-/ 2 21 5L T//*

 	l#+i.??#9RS	KKM $//399ZTZZ./ :t$   	LL$LL/0NN:;KKM	 :9s%   E' &G'G2AG

GG"	c                rf   rZ   r   r]   r_   r3   r`   ra      s      D r2   c                s^   \         P                  P                  V P                  4      '       g   \	        R4      h\        V P                  RR7      ;_uu_ 4       p\        P                  ! VP                  4       4      pRRR4       X'       g   \	        R4      hV#   + '       g   i     L%; i)zLoad token from diskzNo GOG token availabler}   r~   N)	r+   r,   Zexistsrd   r   r   r>   loadsread)rP   r   Ztoken_contentrm   r3   
load_tokenZGOGService.load_token   sr    ww~~doo..%&>??$//G44
 JJz'89M 5 %&>?? 54s   %BB,	c                rf   rZ   )Zfloatr]   r_   r3   r`   ra      s     , ,u ,r2   c                s    \         P                  ! V P                  4      pVP                  p\        P                  ! 4       V,
          # )zReturn age of token)r+   Zstatrd   Zst_mtimetime)rP   Z
token_statZtoken_modifiedrm   r3   get_token_ageZGOGService.get_token_age   s0    WWT__-
#,,yy{^++r2   c                &   < V ^8  d   QhRS[ RS[/# r[   rv   r\   r;   r   r]   r_   r3   r`   ra      s        r2   c                s    \        WP                  4       R7      pVP                  4        VP                  P	                  R4      '       d   \        R4      hVP                  # )z/Send a cookie authenticated HTTP request to GOG)cookiess   <z"Token expired, please log in again)r   load_cookiesrM   ZcontentZ
startswithr   r>   )rP   rv   r   rB   r3   make_requestZGOGService.make_request   sI    #'8'8':;??%%d++%&JKK||r2   c                r   r   r   r]   r_   r3   r`   ra      s     
 
C 
C 
r2   c                s0   V P                  4       pV P                  4       R8  d*   V P                  VR,          R7       V P                  4       pRRVR,          ,           /p\        WV P	                  4       R7      pVP                  4        VP                  # )z)Send a token authenticated request to GOGi(
  ry   )ry   ZAuthorizationzBearer Zaccess_token)headersr   )r   r   rt   r   r   rM   r>   )rP   rv   r   r   r      &&   r3   make_api_requestZGOGService.make_api_request   s}    !$&U?-CDOO%E"In0E$EF#8I8I8KL||r2   c                rf   rZ   r   r]   r_   r3   r`   ra      s     * *t *r2   c                s(    RpV P                  V4      # )zReturn GOG profile informationz#https://embed.gog.com/userData.json)r   ru   rW   r3   ri   ZGOGService.get_user_data   s    3$$S))r2   c                rY   rZ   )r   r   r]   r_   r3   r`   ra      s      T$Z r2   c                sN   \         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       # ^p. p^pWB8:  d6   V P                  VR7      pV^,          pVR,          pW5R,          ,          pK;  \        V P                  R	RR7      ;_uu_ 4       p\        P                  ! W14       RRR4       V#   + '       g   i     L; i  + '       g   i     T# ; i)
z&Return the user's library of GOG gameszReturning cached GOG libraryZrr}   r~   N)pageZ
totalPagesproductsr|   )
r   Zpath_exists
cache_pathr   debugr   r>   rs   get_products_pageZdump)rP   Z	gog_cacheZtotal_pagesrr   r   Zproducts_responses   &     r3   rp   ZGOGService.get_library   s    doo..LL78doosW==yy+ >= ! $ 6 6D 6 AAID+L9Kz22E$//399YIIe' : >= :9s   D D D	D$	c                r   )r[   rA   r\   )r   r7   r]   r_   r3   r`   ra     s     3 3 3' 3r2   c                s,    \         P                  V4      # rb   )r7   rC   )rP   rA   rw   r3   get_service_gameZGOGService.get_service_game  s    ((22r2   c                s,   < V ^8  d   QhRS[ RS[RS[/# )r[   r   searchr\   )Zintr;   r   r]   r_   r3   r`   ra   	  s"     
& 
&c 
&s 
&c 
&r2   c                s    V P                  4       '       g   \        R4      hRR/pV'       d   WR&   V'       d   W#R&   V P                  R,           \        V4      ,           pV P	                  V4      # )zReturn a single page of gameszUser is not logged inZ	mediaTypeZ1r   r   z/account/getFilteredProducts?)rh   r   	embed_urlr	   r   )rP   r   r   rV   rv      &&&  r3   r   ZGOGService.get_products_page	  sf    $$&&%&=>>s#!6N%8nn>>6ARR  %%r2   c                6   < V ^8  d   QhRS[ RS[S[,          /# r[   
product_idr\   r;   r   r   r]   r_   r3   r`   ra     s     7 7 7T
 7r2   c                s    V P                  V4      pVR,          '       g   . # VR,          R,          pV P                  V4      # )z*Return the list of DLC products for a gamedlcsZexpanded_all_products_url)get_game_detailsr   )rP   r   Zgame_detailsZall_products_url   &&  r3   get_game_dlcsZGOGService.get_game_dlcs  sE    ,,Z8F##I'/0KL$$%566r2   c                r   r   r;   r   r]   r_   r3   r`   ra     s     * *3 *4 *r2   c                s    V'       g   \        R4      h\        P                  ! RV4       RP                  V P                  WP
                  4      pV P                  V4      # )z(Return game information for a given gamezMissing product IDzGetting game details for %sz){}/products/{}?expand=downloads&locale={})
ValueErrorr   infor^   api_urlrO   r   )rP   r   rv   rB   r3   r   ZGOGService.get_game_details  sM    1221:>9@@z[f[fg$$S))r2   c                r   )r[   downlinkr\   r   r]   r_   r3   r`   ra   %  s        #  $t*  r2   c                s   \         P                  ! RV4        V P                  V4      pT'       g   \         P                  ! RT4       . # . pR	 F  pY%,          p\        T4      p\        \        TP                  4      4      pRY%,          /p	RT9   d+   \        P                  P                  TR,          4      T	R&   MF\        P                  P                  TP                  4      p
\        T
4      pYR&   Y8w  d   T
.M. T	R&   TP                  T	4       K  	  T#   \         d$   p\         P                  ! RT4       . u Rp?# Rp?ii ; i)
zcReturn file download information, a list of dict containing the 'url' and
'filename' for each file.zGetting download info for %szHTTP error: %sNz No download info obtained for %srv   r,   filenamealternate_filenames)Zchecksumr   )r   r   r   r   ro   r
   r   r   r   r+   r,   Zbasenamer   append)rP   r   Zresponserl   ZexpandedZfieldZ	field_urlZparsedr   ZexpZquoted_namer   s   &&          r3   get_download_infoZGOGService.get_download_info%  s    	2H=	,,X6H LL;XFI-E Ii(F6<<01E(/*C"$''"2"25="AJ gg..v{{;";/"*J ?J>Uk][])*OOC # .$ 5  	LL)2.I	s   D E	&E>E	E	c                r   r[   gogidr\   r   r]   r_   r3   r`   ra   G  s     	% 	%3 	%4 	%r2   c                s    V'       g   \         P                  ! R4       / # V P                  V4      pV'       g   \         P                  ! RV4       / # VR,          # )z+Return all available downloads for a GOG IDz5Unable to get GOG data because no GOG ID is available"Unable to get GOG data for game %s	downloads)r   rj   r   )rP   r   Zgog_datarB   r3   get_downloadsZGOGService.get_downloadsG  sI    NNRSI((/NN?GI$$r2   c                sL   < V ^8  d   QhRS[ RS[S[ S[S[,          3,          /# r   )r;   r   r   r   r]   r_   r3   r`   ra   R  s(     # # #S$t*_(= #r2   c                s   \         P                  ! RV4       V P                  V4      pV'       g   \         P                  ! RV4       / #  V P	                  V4      pV'       d   V.VOMV.p/ pV EF(  pVP                  R4      '       g   K  VR,          P                  R4      ;'       g    .  UU	u. uF  pRVP                  RR	4      P                  4       P                  4       R
VP                  R
R	4      P                  4       RVP                  R^ 4      R\        VR,          4      RVP                  R4      ;'       g    .  U	u. uF  qP                  R4      NK  	  up	/NK  	  p
pp	V
'       g   EK  WVP                  RR	4      P                  4       &   EK+  	  V#   \
         d%   p\         P                  ! RT4       / p Rp?ELmRp?ii ; iu up	i u up	pi )zBReturn a list of bonus content available for a GOG ID and its DLCsz*Download extras for GOG ID %s and its DLCsr   zUnable to retrieve DLC: %sNZis_installabler   Zbonus_contentr=    type
total_sizer8   	downlinksfilesr   r:   )r   r   r   rj   r   Z	Exceptionrk   rM   ZstripZ
capitalizer;   )rP   r   rq   r   rl   r   Z
all_extrasZproductdownloadZfZextras   &&         r3   
get_extrasZGOGService.get_extrasR  s   A5I$$U+NN?GI	%%e,D %)D=4=tf
G{{+,, %,K$8$<$<_$M$S$SQS$S	 %T VR 8 > > @ K K MVR 8 > > @$hll<&Cc(4.1#gAVA\A\Z\A\%]A\AeeJ&7A\%] %T  	 6CIw{{7B7==?@   3  	
 92>D	& &^	s7   F 2BGGG  GG*G		GGc          	      sh   < V ^8  d   QhRS[ S[S[S[,          3,          RS[RS[RS[S[,          /# )r[   r   runnerlanguager\   r   r;   r   r   r]   r_   r3   r`   ra   w  s>     
 
S$t*_(= 
s 
VY 
eijneo 
r2   c                s6   VP                  R. 4       Uu. uF  qDR,          R8w  g   K  VNK  	  ppV Uu. uF  qDR,          R8X  g   K  VNK  	  ppV'       d   TpV Uu. uF$  pVR,          V P                  WS4      8X  g   K"  VNK&  	  up# u upi u upi u upi )z*Return available installers for a GOG game
installersr+   macrJ   r   )rM   determine_language_installer)rP   r   r   r   	installergog_installersZlinux_installers   &&&&   r3   get_installersZGOGService.get_installersw  s     6?]]<QS5Tq5T	bfXgkpXp))5Tq 8Fd~)SW\cIcII~d-N ,
+	$(I(I.(cc I+
 	
 r e
s!   BBB	BBBc                sR   < V ^8  d   QhRS[ RS[S[ ,          RS[S[ S[3,          /# )r[   gog_idrunner_namer\   )r;   r   r   listr]   r_   r3   r`   ra     s1      # HSM dSVX\S\o r2   c                s   V'       d   V P                   P                  V4      MRpV P                  V4      pVR,          R,          pV'       g   \        P                  ! RV4       / # \        \        4      pV FX  pV'       d0   VP                  R4      pV'       d   W8P                  4       8w  d   K:  WgR,          ,          P                  V4       KZ  	  V# )z;Return updates available for a game, keyed by patch versionNr   patcheszNo patches for %sr+   r=   )	runner_to_os_dictrM   r   r   r   r    r   casefoldr   )	rP   r   r   	filter_osZgames_detailr   patch_versionspatchZpatch_os	   &&&      r3   get_update_versionsZGOGService.get_update_versions  s     @KD**..{;PT	,,V4{+I6KK+\:I$T*E 99T?	->->-@ @=)007  r2   c                s<   < V ^8  d   QhRS[ S[,          RS[RS[/# )r[   r   default_languager\   )r   r   r;   r]   r_   r3   r`   ra     s(      4: Y\ hk r2   c                s    \         P                  ! 4       pV Uu. uF  qDR,          V8X  g   K  VNK  	  ppV'       g   TpV# u upi )z<Return locale language string if available in gog_installersr   )r   rN   )rP   r   r   r   r   r   r3   r   Z'GOGService.determine_language_installer  sB    ==?5Ci^	Q[G\`hGh))^i'H js
   AAc                s\   < V ^8  d   QhRS[ S[S[S[,          3,          RS[S[,          /# )r[   r   r\   r   r]   r_   r3   r`   ra     s,      T#tDz/-B tDz r2   c                s   . pVP                  R. 4       F  pVP                  R4      pV'       g   \        P                  ! RV4       K5  V P                  V4       F  pVP	                  RVP                  RR4      RVP                  RR4      RVP                  RR4      RVP                  R^ 4      R	\        VR	,          4      R
VR
,          RVR,          RVR,          /4       K  	  K  	  V# )zLConvert files from the GOG API to a format compatible with lutris installersr   r   zNo download information for %sr=   r   r+   r   r   r8   rv   r   r   )rM   r   ro   r   r   r;   )rP   r   Zdownload_linksZ	game_filer   r      &&    r3   query_download_linksZGOGService.query_download_links  s    !gr2I }}Z0H=yI..x8%%VR 8hll44VR 8$hll<&Cc)D/2tE{"D$4-t4I/J	 9 3$ r2   c                sJ   < V ^8  d   QhRRRS[ S[,          RS[ S[,          /# )r[   r   r    selected_extrasr\   )r   r   r   r]   r_   r3   r`   ra     s/      ): TRVZ \`an\o r2   c                sX   . pV EF  pVP                  R 4      pV'       d+   V UUu. uF  q`P                  V4       F  qwNK  	  K  	  pppM+\        VR,          4      V9   d   V P                  V4      pM. pV'       g'   \        P
                  ! RVP                  R4      4       V Ft  pVR,          P                  R4      '       d   K#  VP                  \        VP                  \        VR,          4      RVR,          RVR,          RVR,          /4      4       Kv  	  EK  	  V# u uppi )r   r8   z:No download link for bonus content '%s' could be obtained.r=   r   .xmlrv   r   )
rM   r   r;   r   r   ro   endswithr   r   	game_slug)	rP   r   r   extra_filesZextrar   linkr   linksr   r3   get_extra_filesZGOGService.get_extra_files  s   $E		+.I*3])$@V@VW[@\@\)]U4[!_411%8Y[`[d[dek[lm
#,,V44 ""!!++E$K(!4;&Z(8148M3N
  %8 3 ^s   !D&c                s:   < V ^8  d   QhRRRS[ RS[S[ ,          /# )r[   r   r    r   r\   r   r   r]   r_   r3   r`   ra     s/     e e.? eD eUYZ^U_ er2   c                s    V P                  W!P                  4      pV'       g   . # \        V4      ^8  d   \        P                  ! R4       V^ ,          pV P                  V4      #   \         d   p\        \        R4      4      ThRp?ii ; i)z;Return links to downloadable files from a list of downloadsz/More than 1 GOG installer found, picking first.z.Couldn't load the download links for this gameN)	r   r   lenr   rj   r   r   r   _)rP   r   r   r   Z
_installererr   &&&   r3   _get_installer_linksZGOGService._get_installer_links  s    		e!00<L<LMN!	>"Q&PQ'*J,,Z88 	e&q)Y'Z[add	es   $A' ?A' 'B2BBc                s:   < V ^8  d   QhRRRS[ RS[S[,          /# )r[   r   r    installer_file_idr\   )r;   r   r   r]   r_   r3   r`   ra     s/     G G): Gs GW[\iWj Gr2   c                s2   \         P                  ! R VP                  4       V P                  VP                  4      p. pVR,           F;  pRVR,          ,           VP                  8X  g   K$  W@P                  V4      ,          pK=  	  V P                  WV4      # )zGetting patches for %sr   GOG version)r   r   r   r   service_appidr   _format_links)rP   r   r   r   r   Z
patch_filer   r3   get_patch_filesZGOGService.get_patch_files  s    -y/@/@A&&y'>'>?	#I..J
9--1B1BB22:>> / !!)FFr2   c          	      sP   < V ^8  d   QhRRRS[ RS[S[,          RS[S[,          /# )r[   r   r    r   r   r\   )r;   r   r   r   r]   r_   r3   r`   ra     s7     / /*/?B/KOPT:/	m	/r2   c                s   \        \        4      pV F  p VR ,          pTP                  4       P                  R4      '       d    Yb8w  d   TRR pTR,          YF,          R&   KQ  TR,          YF,          R&   TR,          YF,          R&   YdT,          R &   TR,          YF,          R&   TR,          YF,          R&   K  	  . pR	pV F  p	WI,          p
RV
9  d   \        R
V
,          4      hV
R ,          pVP                  4       P                  R4      '       d   V'       g   TpRpMT	pVP                  \        VP                  VRV
R,          R V
R ,          RV
R,          RV
P                  R4      RV
R,          /4      4       K  	  V'       g   \        \        R4      4      hV#   \         d    \        P                  ! RT4       h i ; i)r   zInvalid link: %sr   Nrv   Zchecksum_urlr8   r   r   FzInvalid installer file %sTz4Unable to determine correct file to launch installeri)z.exez.sh)r    r   ZKeyErrorr   ro   Zlowerr   r   r   r   r   rM   r   r   )rP   r   r   r   Z_installer_filesr   r   r   Zfile_id_providedZ_file_idZinstaller_fileZfile_ids   &&&&        r3   r   ZGOGService._format_links  s    't,D
+ ~~((000'}H=A%[ *>:/3Dz&t,04U&u-5=X&z2@DEZ@[&'<=7;L7I&|4    (H-7NN* !<~!MNN%j1H~~((99BR+#' "LL''~e4"N:$>-~>S/T&(:(:>(J$n\&B
 ).  &q)_'`aaQ  /6s   	F$Gc                sv   < V ^8  d   QhRRRS[ RS[S[,          RS[S[S[,          S[S[,          3,          /# )r[   r   r    r   r   r\   )r;   r   r   r   r   r   r]   r_   r3   r`   ra     sH     " "*"?B"UYZ^U_"	t+,d=.AA	B"r2   c                s    V P                  VP                  4      pT P                  Y4      pT'       d+   T P                  YT4      p\        TP                  Y'4      .pM. p. p	T'       d*   T P                  Y4       F  p
T	P                  T
4       K  	  Y3#   \         d   p\        \	        R 4      4      ThRp?ii ; i)z)Couldn't load the downloads for this gameN)r   r   r   r   r   r   r   r   r   r   r   )rP   r   r   r   r   r   r   Z	formattedr   r   Z
extra_files   &&&&       r3   get_installer_filesZGOGService.get_installer_files  s    	`**9+B+BCI )))?**9OI,Y-@-@BS_`EE"229N
"":. O !!  	`&q)T'UV\__	`s   B B=#B88B=c                s<   < V ^8  d   QhRS[ RS[S[ S[ 3,          /# )r[   	file_pathr\   )r;   r   r]   r_   r3   r`   ra   4  s'     
A 
AC 
AE#s(O 
Ar2   c                s@   VP                  R4      '       g   \        R4      h\        VRR7      ;_uu_ 4       pVP                  4       pRRR4       \        P
                  ! X4      pVP                  R,          VP                  R,          3#   + '       g   i     LL; i)zaReturn the MD5 checksum for a GOG file
Requires a GOG XML file as input
This has yet to be used.
r   z&Pass a XML file to return the checksumr}   r~   Nr=   Zmd5)r   r   r   r   r   Z
fromstringZattrib)rP   r   Zchecksum_fileZchecksum_contentZ	root_elemr   r3   read_file_checksumZGOGService.read_file_checksum4  s    
 !!&))EFF)g..-,113 /$$%56	')9)9%)@@@ /.s   BB	c                sR   < V ^8  d   QhRS[ S[S[3,          RS[ S[S[3,          /# r[   db_gamer\   )r   r;   r   r]   r_   r3   r`   ra   @  s/     C C$sCx. CT#s(^ Cr2   c                s8   \         P                  ! VR ,          4      pVR,          pVR,          P                  4        UUu. uF  w  rEV'       g   K  VP                  4       NK!  	  pppRV9   d   V P	                  VRV4      # V P	                  VRV4      # u uppi )r@   r9   worksOnrJ   rH   )r>   r   itemsr   _generate_installer)rP   r   r@   r9   platformis_supported	platformss   &&     r3   generate_installerZGOGService.generate_installer@  s    **WY/0vGNyGYG_G_GarGa-CXeq(X&&(Ga	ri++D'7CC++D&'BB	 ss   BBc                sL   < V ^8  d   QhRS[ S[S[3,          RS[S[,          /# r   )r   r;   r   r   r   r]   r_   r3   r`   ra   I  s'      4S> d4j r2   c                s:   \         P                  ! VR ,          4      pVR,          pVR,          P                  4        UUu. uF  w  rEV'       g   K  VP                  4       NK!  	  ppp. pRV9   d#   VP	                  V P                  VRV4      4       RV9   d#   VP	                  V P                  V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# u uppi )	r@   r9   r   rJ   rI   rH   r   r    )r>   r   r   r   r   r   r   r   )
rP   r   r@   r9   r   r   r   r   r   Zrunner_human_names
   &&        r3   generate_installersZGOGService.generate_installersI  s    **WY/0vGNyGYG_G_GarGa-CXeq(X&&(Ga	r
id66tWgNO	!d66tVWMNz?Q'	$9)H:M$N!)$/@/W/WIhDW(XX$ (  ss   DDc          
      s^   < V ^8  d   QhRS[ RS[ RS[S[ S[3,          RS[S[ S[3,          /# )r[   r9   r   r   r\   )r;   r   r   r]   r_   r3   r`   ra   ]  s>     
 
 
S 
4S> 
VZ[^`c[cVd 
r2   c                s    / pVR 8X  d   R\         /pRR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//# )rJ   ZexeextractfileZgoginstallerr^   zipdstz$CACHEmergesrcz$CACHE/data/noarch$GAMEDIRZautosetup_gog_gamer=   r   rG   r9   r   r   r   r<   scriptrq   r   r   z!N/A:Select the installer from GOGr   )r   r   get_installed_slug)rP   r9   r   r   Zsystem_configZgame_configr   r   r3   r   ZGOGService._generate_installer]  s    W ,/KV^XueXVW5"6zJKF
 !.1K%~6F GFOuD009fWW%->+NOPV	
 	
r2   c                r   r   )r   r;   r]   r_   r3   r`   ra   y  s     ; ; ;# ;r2   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 )rJ   rH   )get_game_platformsr   )rP   r   r   r   r   r3   get_installed_runner_nameZ$GOGService.get_installed_runner_namey  sC    9=9P9PQX9YZ9YX&&(9Y	Z!Y.w:F: [s   9c                rf   rZ   r   r]   r_   r3   r`   ra   }  s     * * *r2   c                sZ    RP                  V P                  4      pV P                  V4      # )z!Return IDs of games owned by userz{}/user/data/games)r^   r   r   ru   rW   r3   get_games_ownedZGOGService.get_games_owned}  s'    "))$..9$$S))r2   c                6   < V ^8  d   QhRS[ RS[S[ ,          /# r   r   r]   r_   r3   r`   ra     s     7 7$ 74: 7r2   c                s   VR,          pVP                  R4      pV'       d   V P                  P                  V4      MRpV P                  V4      p. pV EF'  pRVR,          ,          pVR,          P                  R. 4       U	u. uF  qR,          R	8w  g   K  V	NK  	  p
p	V
 F  pVR,          P                  4       pV'       d   V'       d	   WL8w  d   K2  VR
8X  d   R
pRRRRVRR//RRRRR//.pMRpRRRRV//.pRVR,          RVR,           RV R2RVR,          RRVR,          ,          R V P	                  V4      RVR!R"R#VR$,          R%VR$,          R&R'VR(,          R)VR*/.R+V//
p	VP                  V	4       K  	  EK*  	  V# u up	i ),z,Return all available DLC installers for game
service_idr   Nz	gogdlc-%sr9   r   r   r+   r   rJ   r   r   z
$CACHE/GOGr   r^   r   r   r   r   z$CACHE/GOG/data/noarch/rH   taskr=   wineexec
executabler   r:   z (Z)descriptionz
DLC for %sr   Zis_dlcTdlcidr8   r   r   extendsinstaller_slugr   N/A:Select the patch from GOGr   )rM   r   r   r   r   r   )rP   r   r<   r   r   r   r   ZdlcZdlc_idr   Zinstallfilesr   Zfile_osr   r   s   &&             r3   get_dlc_installersZGOGService.get_dlc_installers  s   %kk(+?JD**..{;PT	!!%(
C 3v;.F ,/{+;+?+?b+Q+Qi_cUdhmUm		+Q   %t*--/Y-A g%$F"UL&&(TY$Z[ 5*e=V"WXF
 $F%
L&'QRSF GFO#g,r&;CK!<'&/#A!8!8!AfdSYSY!7+;#<6+J"K!L#V	" !!),E % X Qs   FFc                r  r   r   r]   r_   r3   r`   ra     s       d r2   c                s    V P                  4       pV P                  V4      pV Uu. uF  qDR,          VR,          9   g   K  VNK  	  ppV# u upi )z#Return DLC installers for owned DLCr  owned)r   r  )rP   r   r  r   r   r   r3   get_dlc_installers_ownedZ#GOGService.get_dlc_installers_owned  sU     $$&,,W5
1;dI?QUZ[bUc?cii
d es   AAc          	      sB   < V ^8  d   QhRS[ RS[RS[RS[S[ ,          /# )r[   r   r   
only_ownedr\   )r   r;   rg   r   r]   r_   r3   r`   ra     s1       s PT `dei`j r2   c                s    V'       d   V P                  V4      pMV P                  V4      pVR8w  d   RpV Uu. uF  qUR,          V8X  g   K  VNK  	  ppV# u upi )ziReturn DLC installers for requested runner
only_owned=True only return installers for owned DLC (default)rJ   rH   r   )r  r  )rP   r   r   r  r   r   s   &&&&  r3   get_dlc_installers_runnerZ$GOGService.get_dlc_installers_runner  sc     66w?J009J WF1;]I?RV\?\ii
] ^s   AAc                r  r   r   r]   r_   r3   r`   ra     s        T  d4j  r2   c                s   VR ,          pVP                  R4      pV P                  W#4      p. pV F  pWF,          p\        \        R V 4       4      4      pR\	        V^ ,          R,          4      ,          p	RVR,          RV^ ,          R,          R,           V,           RVR	,          R
VR,          RRV^ ,          R,          ,           RRRRVR	,          RV	R/.RRRRRV	//.//p
VP                  V
4       K  	  V# )r  r   c              3   s2   "   T F  qR ,          x  K  	  R# 5i)r   Nr#   )Z.0ZpartrW   r3   Z	<genexpr>Z3GOGService.get_update_installers.<locals>.<genexpr>  s     !G|"4"4s   zgogpatch-%sr   r=   r  r   r9   r	  r   r   rH   r   r  r   r
  r   r  r  r  )rM   r   r   Zsumr   r   )rP   r   r<   r   r   Zpatch_installersr   r   r*   Zpatch_idr   r   r3   get_update_installersZ GOGService.get_update_installers  s   %X&11%@%G"+Ec!G!GGHD$wuQx	/B'CCHuQx/#5< 01WV_6E!HY$77&w'78x)HIJ6FJh+W"X!YI ##I.# &$  r2   c                r   r   )r   r   r;   r]   r_   r3   r`   ra     s      $ 49 r2   c                s    VP                  R 4      pV'       dX   \        P                  ! V4      P                  R4      pVe/   VP                  4        UUu. uF  w  rEV'       g   K  VNK  	  upp# . # u uppi )r@   r   )rM   r>   r   r   )rP   r   r@   r   r=   Zworksr   r3   r   ZGOGService.get_game_platforms  s^    ++i(jj)--i8G"07I5II	 Js   A3'A3c                rf   )r[   r   r   r]   r_   r3   r`   ra     s     
 
T 
r2   c                s   VP                  R 4      pV'       dl   \        P                  ! V4      P                  R4      pVeC   VP                  R4      pVe.   \        V\        4      '       d   V^ ,          R8w  d
   VR,          # R# )r@   ZreleaseDatedateZ-:Ni
   Nr   )rM   r>   r   Z
isinstancer;   )rP   r   r@   Zrelease_dater  r   r3   get_game_release_dateZ GOGService.get_game_release_date  sk    ++i(::g.22=AL'#''/#
4(=(=$q'S.9$r2   )rO   )r   r   )i   N)rK   )T)Lr$   r%   r&   r'   r(   r8   r   r=   ZiconZ
has_extrasZdrm_freer!   r4   r6   ZmediasZdefault_formatr   r   rR   rz   rU   Zlogin_success_urlr+   r,   r-   r   r.   rc   rd   r   r   rL   ZpropertyrX   re   rn   rs   rx   rt   r   r   r   r   ri   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r  r1   rD   Z__classcell__)rQ   rE   s   @@r3   rF   rF   K   s|    	BU8DDJHnhYghFN'I#G#IVMKLM>77<< 2 2K@Lh00,?Jh002DEJGW=@ @ @ 4 4; ; 	 	' ''% '%R , , 
 
* *
 &3 3
& 
&7 7* *   D	% 	%# #J
 
 &  . @e eG G/ /b" "*
A 
AC C (
 
8; ;* *
7 7r      2 
 
 
r2   rF   )>r(   r>   r+   r   ZtypingZcollectionsr    r   r   r   r   r   r   r   Zurllib.parser   r   r	   r
   Zlxmlr   Zlutrisr   Zlutris.exceptionsr   r   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   r   Zlutris.util.httpr   r   r   Zlutris.util.logr   Zlutris.util.stringsr   r   ZTYPE_CHECKINGZlutris.installer.installerr    r!   r4   r6   r7   rF   r#   r2   r3   <module>r     s    )  	   #   3 3 @ @   G 9 9 N 0 = 4 6 $ H H " 3	:2\ 2%n %%^ %k  u
 u
r2   