
    iEgG                     &   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Zd dlZd dlZd dl	Z	d dl
mZ d dlZd dlmZ d dlmZ d dlZd dlZ ej&                  dd        ej&                  dd        ej&                  dd	       d d
lmZmZmZmZ ddlmZ ddlmZ  e j8                  d      duZd ZdZ	  ej@                         d    jC                  d      d    ZdZ"e"dz   ddde"dz   ddde"dz   ddde"dz   ddde"dz   dd dd!Z#d"Z$d#Z%d$Z&e jN                  jQ                  d%      Z)e) d&Z*e jN                  jW                   ejX                         d'd(      Z- ej\                         Z/d)Z0d* Z1 G d+ d,      Z2 G d- d.      Z3 G d/ d0      Z4y#  Y xY w)1    N)Path)ThreadPoolExecutor)ImageGtkz3.0GdkGioz2.0)r   r   r   GLib   )logger)proxygsettingsDEBUGc                 (    t         rt        |        y y N)r   print)msgs    4/usr/lib/python3/dist-packages/cinnamon/harvester.pydebugr      s    c
     C_z%https://cinnamon-spices.linuxmint.comz/json/applets.jsonzorg.cinnamonzenabled-applets)urlenabled-schemaenabled-keyz/json/desklets.jsonzenabled-deskletsz/json/extensions.jsonzenabled-extensionsz/json/actions.jsonzorg.nemo.pluginszdisabled-actionsz/json/themes.jsonzorg.cinnamon.themename)appletdesklet	extensionactiontheme   <   x   ~z/.local/share/localecinnamonspices
   c                      t         j                   j                         j                         } t        | t        dz  z        S )Nr!   )datetimeutcnow	timestampintTIMESTAMP_LIFETIME_MINUTES)secondss    r   get_current_timestampr.   X   s5    &&(224Gw5:;<<r   c                       e Zd Zd Zy)SpiceUpdatec                 r   || _         || _        d| _        	 |d   }|dvr|| _        	 |d   dt            | _        	 |d   dt            | _        	 t        j                  j                  |d	         j                  d
      | _	        	 t        j                  j                  |d         j                  d
      | _
        |d   | _        |d   | _        t         d| d|d    | _        |d   | _        y #  Y xY w#  |d   | _        Y xY w#  |d   | _        Y xY w#  d| _	        Y xY w#  d| _
        Y wxY w)N author_user>   noneunknowntranslationsname_r   description_descriptionlast-edited%Y.%m.%dlast_editedlast_commitlast_commit_subject/zs/view/z	spices-id	file_size)uuid
spice_typeauthorLANGUAGE_CODEr   r9   r(   fromtimestampstrftimeold_versionnew_version	commit_id
commit_msgURL_SPICES_HOMElinksize)selfrB   rA   
index_node	meta_noderC   s         r   __init__zSpiceUpdate.__init__]   s`   	$	.F00$	+">2U=/3JKDI	9).9L:XYD	"'00>>y?WXaablmD	"'00>>z-?XYbbcmnD $M2$%:;&'qGJ{<S;TU	{+	7		+"6*DI	9)-8D	"!D	"!Ds9   C4 C; D 6D 	6D+ 4C8;D	D	D(+	D6N__name__
__module____qualname__rQ    r   r   r0   r0   \   s    %,r   r0   c                       e Zd Zd Zy)SpicePathSetc                    t        t        j                  j                  t	        j
                         dd|            }|dk(  }|r<t        |d         }|j                  | _        t        |j                         z   | _
        n;t        |d         }|j                  | _        t        |j                         z   | _
        |j                  | j                        | _        t        |d   z   | _        y )Nr$   r%   r   
screenshoticonfile)r   ospathjoinr	   get_user_cache_dirr   thumb_basenamerK   as_posixthumb_download_urljoinpaththumb_local_pathzip_download_url)rN   
cache_itemrB   cache_folderis_themethumb_rel_paths         r   rQ   zSpicePathSet.__init__   s    BGGLL)@)@)BJPXZdef(!*\":;N"0"5"5D&58O8O8Q&QD#!*V"45N"0"5"5D&58O8O8Q&QD# , 5 5d6I6I J /*V2D Dr   NrR   rV   r   r   rX   rX      s    Er   rX   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd ZddZd Zd Zd Zd Zy)	Harvesterc                    || _         | j                   dk(  | _        | j                   dk(  | _        d| _        g | _        i | _        i | _        t        j                         | _	        t        j                  j                  t        j                         dd| j                         | _        t        j                  j                  | j                  d      | _        | j                  r	t"         dn1t        j                  j                  t"        d| j                    d	      | _        | j                  rt"         d
}|| j$                  f| _        n| j$                  f| _        | j)                          | _        | j-                          | j/                          i | _        	 t3        j4                         | _        y # t6        $ r}t9        |       Y d }~y d }~ww xY w)Nr   r   Fr$   r%   
index.jsonz/.local/share/nemo/actionsz.local/share/cinnamonsz	/.themes/)rB   themesactions	has_cacheupdatesmeta_mapindex_cache	threadingLock
cache_lockr]   r^   r_   r	   r`   rh   
index_filehomeinstall_folderspices_directoriesanything_installeddisabled_load_cache_load_metadata
proxy_infor   get_proxy_settings	Exceptionr   )rN   rB   old_install_folderes       r   rQ   zHarvester.__init__   s   $oo0(2#..*GGLL)@)@)BJPXZ^ZiZij'',,t'8'8,GEI\\&@AWYW^W^WcWcdh  kB  GK  GV  GV  FW  WX  DY  XZ;;$(6!3'94;N;N&OD#'+':':&=D# 3355	,??ADO 	!HH	s   F6 6	G?GGc                     | j                   D ]5  }t        |      }|j                         s|j                         D ]  }  y 7 t	        d| j
                   d       y)NTzNo additional zs installedF)r|   r   existsiterdirr   rB   )rN   locationr^   r   s       r   r}   zHarvester.anything_installed   s_    // 	H>D;;=\\^ 	 	t/{;<r   c                 >   | j                          | _        | j                  ry t        dt                       t	        j
                  | j                  dd       | j                          |r| j                          | j                          | j                          y )NzCache stamp:   Tmodeexist_ok)r}   r~   r   r.   r]   makedirsrh   _update_local_json_update_local_thumbsr   _clean_old_thumbs)rN   fulls     r   refreshzHarvester.refresh   s|     3355==35678
D%%EDA!%%' r   c                 "    | j                         S r   )_generate_update_list)rN   s    r   get_updateszHarvester.get_updates   s    ))++r   c                 &    | j                  |       y r   )_install_by_uuidrN   rA   s     r   installzHarvester.install   s    d#r   c                    t        j                  t        | j                     d         }d}g }| j                  r'|j                  t        | j                     d         g}n%|j                  t        | j                     d         }| j                  r| d}||vrd}|S |D ]-  }|j                  dd      }||j                  d	      v s)|dz  }/ |S )
Nr   )	schema_idr   r   .nemo_actionr
   !r2   :)
r   Settings	SPICE_MAPrB   rp   
get_stringget_strvrq   replacesplit)rN   rA   settingsenabled_countenabled_list	uuid_nameitems          r   get_enabledzHarvester.get_enabled   s    <<)DOO*DEU*VW;;$//	$//0J=0YZ[L#,,Yt-G-VWL<<&-I, !    	#D<<R(Dtzz#&"	#
 r   c                 <   t        d| j                   d       t        | j                     d   }	 t        j                  |t
        | j                  dt               i      }t        d|j                  j                          |j                          t        | j                  d	d
      5 }|j                  |j                          d d d        | j#                          y # t        $ r%}t        d| j                   d|        Y d }~y d }~ww xY w# 1 sw Y   KxY w)Nz-harvester: Downloading new list of available ro   r   timetimeoutproxiesparamszDownloading from z Could not refresh json data for : wutf-8encoding)r   rB   r   requestsgetTIMEOUT_DOWNLOAD_JSONr   r.   requestr   raise_for_statusr   r   openry   writetextr   )rN   r   rr   fs        r   r   zHarvester._update_local_json   s    =doo=NaPQ(/		S%:%)__%+-B-D$EGA %aiimm_56 
 $//39 	QGGAFFO	 	  	4T__4ERsKL		 	s$   A#C! ,D!	D*D

DDc           
      h    t        d      5 } fd} j                  5   j                  j                         D ]L  \  }}t	        d|        |j                  |t        j                  |      t        j                  |             N 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr&   )max_workersc                 *    j                  | |       y r   )_download_thumb)rA   r   rN   s     r   	thumb_jobz1Harvester._update_local_thumbs.<locals>.thumb_job  s    $$T40r   zSubmitting thumb_job for )r   rx   ru   itemsr   submitcopydeepcopy)rN   tper   rA   r   s   `    r   r   zHarvester._update_local_thumbs  s      B/ 	P31  P"&"2"2"8"8": PJD$5dV<=JJy$))D/4==;NOPP		P 	PP P		P 	Ps#   B(A*BB(B%	!B((B1c                    t        || j                        }t        j                  j	                  |j
                        r,| j                  |j
                        s| j                  |      rt        d| d|j                          	 t        j                  |j                  t        | j                  dt               i      }|j                          t%        |j
                  dd	      5 }|j'                  |j(                         d d d        y y # t         $ r}t#        d| d|        Y d }~y d }~ww xY w# 1 sw Y   y xY w)
NrB   zDownloading thumbnail for r   r   r   zCould not get thumbnail for wbr   r   )rX   rB   r]   r^   isfilere   _is_bad_image_spice_has_updater   rc   r   r   TIMEOUT_DOWNLOAD_THUMBr   r.   r   r   r   r   r   content)rN   rA   r   pathsr   r   r   s          r   r   zHarvester._download_thumb  s!   Tdoo>ww~~e4459K9KELbLb9cgkg}g}  C  hD.tfBu7O7O6PQRLL!9!9)?)-)/1F1H(IK ""$
 e,,dWE #		"# # hD  4TF"QC@A# #s%   	AD ,D9	D6D11D69Ec                    | j                   ry t        d| j                   d       i | _        | j                  D ]  }	 t        j                  |      }|D ]  }t
        j                  j                  ||      }|j                  d      r5| j                  r t
        j                  j                  |      sa	 t        t
        j                  j                  |d      dd      5 }t        j                  |      }||d<   t        j                  |t
        j                         |d	<   || j                  |<   d d d          y # 1 sw Y   xY w# t"        $ r5}t        |       t%        d
| dt&        j(                         Y d }~2d }~ww xY w# t*        $ r- 	 t        j,                  |dd       n# t"        $ r Y nw xY wY w xY w)Nz)harvester: Loading metadata on installed ro   r   metadata.jsonr   r   r   r^   writablez	Skipping z2: there was a problem trying to read metadata.jsonr\   r   Tr   )r~   r   rB   rt   r|   r]   listdirr^   r_   endswithrq   isdirr   jsonloadaccessW_OKr   r   sysstderrFileNotFoundErrorr   )rN   	directory
extensionsrA   subdirectoryr   metadatadetails           r   r   zHarvester._load_metadata*  s   ==9$//9J!LM00 	IZZ	2
& uD#%77<<	4#@L}}^4 ||BGGMM,,G 	u!"'',,|_"Ms]de ;ij'+yy|H/;HV,3599\2773SHZ02:DMM$/;u		; ; % uf	$/abilisisttu % KK	E  	sy   A8F8,E$AE5E=FEE	F*FFFF	GF32G3	F?<G>F??GGc                    | j                   ry t        d| j                   d       i | _        	 t	        | j
                  dd      5 }t        j                  |      | _        d| _        d d d        y # 1 sw Y   y xY w# t        $ r
 d| _        Y y t        $ r=}	 t        j                  | j
                         n#  Y nxY wt        |       Y d }~y d }~ww xY w)Nzharvester: Loading local z cacher   r   r   TF)r~   r   rB   ru   r   ry   r   r   rr   r   
ValueErrorr]   remove)rN   r   r   s      r   r   zHarvester._load_cacheM  s    ==)$//):&AB	doosW= &#'99Q< !%& & & ! 	"DN 			$//*!HH	sM   A> "A2)A> 2A;7A> ;A> >CCB98C9B=;CCc                    | j                   rg S t        d| j                   d       g | _        | j                  D ]o  }	 || j
                  v r^| j                  |      rMt        | j                  || j                  |   | j
                  |         }| j                  j                  |       q | j                  S # t        $ r'}t        d| d| t        j                          d }~ww xY w)Nz&harvester: Generating list of updated ro   zError checking updates for r   r   )r~   r   rB   rs   ru   rt   r   r0   appendr   r   r   )rN   rA   updater   s       r   r   zHarvester._generate_update_listb  s    ==I6t6GqIJ$$ 	D4==(T-C-CD-I($@P@PQU@VX\XeXefjXklFLL''/		 ||	  3D6A3?cjjQs   A,B99	C)"C$$C)c                 ~    	 t        | j                  |   d         | j                  |   d   k  S # t        $ r Y yw xY w)Nr:   r<   F)r+   rt   ru   r   r   s     r   r   zHarvester._spice_has_updateu  sH    	t}}T*=9:T=M=Md=STa=bbb 		s   -0 	<<c                 ~   || j                   v rdnd}d }|}	 | j                  |   }t        || j                        }	 t        j                  |j                  t        | j                  dt               i      }|j                          	 d }t#        j$                  d      5 }	|	j&                  }|	j)                  |j*                         d d d        t-        j.                  |      5 }
t1        j2                  |       t#        j4                         5 }|
j7                  |       | j9                  t0        j:                  j=                  ||      ||d       | j?                  ||       d d d        | jA                          d d d        y # t        $ r! t        d| dt        j
                          w xY w# t        $ r'}t!        d	| d
| t        j
                          d }~ww xY w# 1 sw Y   !xY w# 1 sw Y   xY w# 1 sw Y   y xY w# t        $ r$}t!        d| t        j
                          d }~ww xY w)Nupgrader   zCan't install z) - it doesn't seem to exist on the serverr   r   r   r   zCould not download zip for r   F)deleteT)from_spiceszcouldn't install: )!rt   ru   KeyErrorr   r   r   rX   rB   r   r   rf   TIMEOUT_DOWNLOAD_ZIPr   r.   r   r   r   tempfileNamedTemporaryFiler   r   r   zipfileZipFiler]   r   TemporaryDirectory
extractall_install_from_folderr^   r_   write_to_logr   )rN   rA   r   error_messager   r   r   r   tmp_namer   _zipds               r   r   zHarvester._install_by_uuid{  s    "dmm3	##D)D
 Tdoo>	U33%9%)__%+-B-D$EGA  
	H,,E: #a66		"# * &d		(#002 4aOOA&--bggll1d.CQZ^-_%%dF34
 ##%& &-  	N4&(QRY\YcYcd	  	/vRs;#**M	# #4 4& &  	&qc*<	s   F
 AF7 H #(G*H (*HAG7)HH 
*F47	G' "G""G'*G4/H 7H 	<HHH H 	H<H77H<c                    t        j                  |      }| j                  sd|v rt         j                  j	                  |d      }t        j                  |      D ]  }|j                  d      s|j                  d      d   }t         j                  j	                  t        |d      }	t        j                  |	dd       t        j                  d	d
t         j                  j	                  ||      dt         j                  j	                  |	| d      gd        t         j                  j	                  | j                  |      }
t         j                  j                  |
      rt        j                  |
       | j                  r:t         j                  j                  |
dz         rt        j                   |
dz          | j                  st        j"                  ||
       n"t        j"                  || j                  d       | j                  sYt        j$                  |
      D ]A  \  }}}|D ]6  }t        j&                  t         j                  j	                  ||      d       8 C t         j                  j	                  |
d      }| j                  r"t         j                  j                  |      si }n,t)        |dd      5 }t+        j,                  |      }d d d        |r$|| j.                  v r| j.                  |   d   d<   n8t1        t2        j2                  j5                         j7                               d<   t)        |dd      5 }t+        j8                  ||d       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Npoz.po.r   LC_MESSAGESr   Tr   z/usr/bin/msgfmtz-cz-oz.mo)checkr   )dirs_exist_okr   r   r   r   r<   r:   zw+   )indent)r]   r   rp   r^   r_   r   r   locale_instr   
subprocessrunr{   r   shutilrmtreerq   r   copytreewalkchmodr   r   r   ru   r+   r(   r)   r*   dump)rN   folderbase_folderrA   r   contentspo_dirr\   lang
locale_dirdestrootr   files	meta_pathmdr   s                    r   r   zHarvester._install_from_folder  s   ::f%{{xfd3JJv. 3D}}U+#zz#q1%'WW\\+t]%S
JUTJ"(94')ww||FD'A4')ww||J4&'M(O .233 ww||D//677>>$MM$<<BGGNN4.+@AIId^+,||OOFD)OOK)<)<DQ{{"$''$- >a! >DHHRWW\\$5u=>> GGLL7	;;rww~~i8Biw7 "1YYq\" 44#3#33 $ 0 0 6} EB} #H$5$5$<$<$>$H$H$J KB})TG4 	'IIb!A&	' 	'" "	' 	's   M4N 4M= N	c                 R   d}d}	 | j                   |   }t        j                  j                  |d         j                  d      }	 | j                  |   }t        j                  j                  |d         j                  d      }t        j                  j                         j                  d
      }t        j                  | d| j                   d| d| d| d|        y # t        $ r |dv rt        d| d       Y w xY w# t        $ r |dv rt        d	| d       Y w xY w)Nz<none>r<   r;   )r   r   z
Upgrading z+ with no local metadata - something's wrongr:   )r   r   zUpgrading or removing z%F %T )ru   r(   rE   rF   r   r   rt   nowactivity_loggerlogrB   )rN   rA   r   rH   rG   remote_item
local_itemlog_timestamps           r   r   zHarvester.write_to_log  s>   	V**40K"++99+m:TU^^_ijK
	bt,J"++99*]:ST]]^hiK
 !))--/88A}oQt.?q$qQ\P]]^_j^klm  	V//
4&(STU	V  	b...tf4_`a	bs%   A C% A D %DDD&%D&c                 L   	 d}t        | j                  |   | j                        }| j                  r0t        j
                  j                  |j                  d|z  dd      }n2t        j
                  j                  |j                  d|z  d|z  d      }|t        t        j                  ||d      }t        j                  j                  |      S # t        $ rF t        d       t        j                  j                  dt        j                   j"                        cY S w xY w)	z gets the icon for a given uuidNr   d   T   zJThere was an error processing one of the images. Try refreshing the cache.zimage-missing)rX   ru   rB   rp   	GdkPixbufPixbufnew_from_file_at_scalere   r   r    cairo_surface_create_from_pixbufr   r   new_from_surfacer   new_from_icon_nameIconSizeLARGE_TOOLBAR)rN   rA   ui_scalepixbufr   surfs         r   get_icon_surfacezHarvester.get_icon_surface  s    	]F !1!1$!7DOOTE{{"))@@AWAWY\_gYgikmqr"))@@AWAWY[^fYfhjmuhuw{|~77$OD99--d33 	]^_99//A[A[\\	]s   CC AD#"D#c                 N    	 t        j                  |       y# t        $ r Y yw xY w)NTF)r   r   IOError)rN   r^   s     r   r   zHarvester._is_bad_image   s,    	JJt   		s    	$$c                    t        j                  | j                        }| j                  j	                         D ]5  }t        || j                        }	 |j                  |j                         7 |D ]T  }|dk(  r		 t        d|        t        j                  t         j                  j                  | j                  |             V y # t        $ r Y w xY w#  Y kxY w)Nr   rn   zremoving old thumb: )r]   r   rh   ru   valuesrX   rB   r   ra   r   r   r^   r_   )rN   flistr   r   r   s        r   r   zHarvester._clean_old_thumbs  s    

4,,-$$++- 	D $//BEU112	  	AL ,QC01		"'',,t'8'8!<=	  s   C>AC	CCCN)F)rS   rT   rU   rQ   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4  r   r   rV   r   r   rl   rl      sh    !F
!",$2(
P#$!F*&(T/'bn*]*r   rl   )5r]   r   r
  r   localer   r   r  r(   r   pathlibr   rv   concurrent.futuresr   PILr   r   girequire_versiongi.repositoryr   r   r   r	   r2   r   r   getenvr   r   rD   	getlocaler   rK   r   r   r   r   r^   
expanduserrz   r	  r_   get_user_config_dirsettings_dirActivityLoggerr   r,   r.   r0   rX   rl   rV   r   r   <module>rG     s   
 
           1   	   5%     5%     5%   - -  		'$&
 	$F$$&q)//4Q7M : !55(( !66() !88(+ !55,) !44.+	8    	ww#*+ww||4D446
HM'&'')
   =&, &,RE E&A Ac	s   2&F F