
    Tg'0                     R   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m	Z	m
Z
mZmZmZmZ d dlZe j                   j#                   ej$                         dd      ZdZdZdZd	Zd	Zd
ZdZdZdZ eed      Zi Zd Zd Z d Z!d Z" G d de
jF                        Z$ G d d      Z%y)    N)ThreadPoolExecutor)GObjectGtkGLibGioGdk	GdkPixbufmintinstallscreenshotszhttps://dl.flathub.org/media/z?/usr/share/linuxmint/mintinstall/data/fallback-package-icon.svg   0   @   _  p     zmintinstall-images)max_workersthread_name_prefixc                      i } y N )icon_surface_caches    )/usr/lib/linuxmint/mintinstall/imaging.pyclear_cacher      s        c                     |  d| S )N_r   )stringsizes     r   keyr   "   s    XQtfr   c                     d }	 t         t        | |         }t        j                  j	                  |      }|S # t
        $ r}t        | ||d      }Y d }~|S d }~ww xY w)NT)cache)r   r   r   Imagenew_from_surface	Exception
AsyncImage)r   r   iconsurfacees        r   get_iconr)   %   s_    D:$S%67yy))'2 K  :&$D9K:s   28 	AAAc                     t        | ||      S r   )r%   )r   widthheights      r   get_image_for_screenshotr-   0   s    feV,,r   c                        e Zd Zej                  j
                  ddfej                  j
                  ddfdZdeedf fd	ZddZ	eefdZ
d Zdd	Zdd
Z xZS )r%   Nr   )image-loadedimage-failedFc                    t         t        |           || _        || _        || _        d | _        d | _        d | _        d| _	        d| _
        || _        | j                  d| j                         |r| j                  |||       y y )N   destroy)superr%   __init__icon_string	req_width
req_heightpathcancellableloaderr+   r,   cachedconnecton_destroyedset_icon_string)selfr6   r+   r,   r!   	__class__s        r   r5   zAsyncImage.__init__9   s    j$(*& 	
Y 1 12  eV< r   c                 R    | j                   r| j                   j                          y y r   )r:   cancel)r@   widgetdatas      r   r>   zAsyncImage.on_destroyedK   s"    ##% r   c                 (   t         j                  j                         }|| _        || _        | j                  ||       |dk7  r|| j                         z  | _        n|| _        |dk7  r|| j                         z  | _        n|| _        d | _	        d }t        j                  j                  |      r1|| _        t        j                  j                  | j                        }n|j!                  d      r1|| _        t        j                  j#                  | j                        }n|j%                  |      rw|| _        || _        | j                  ||       | j'                  |t         j(                  j*                         | j-                  | j                         | j/                  d       y |r:t        j0                         | _	        t2        j5                  | j6                  |       y | j9                  t:        | j                  | j                         y )Nhttpr/   )r   	IconThemeget_defaultoriginal_widthoriginal_heightset_size_requestget_scale_factorr+   r,   r:   osr9   isabsr   Filenew_for_path
startswithnew_for_urihas_iconset_from_icon_nameIconSizeDIALOGset_pixel_sizeemitCancellable
threadpoolsubmit_fetch_url_threadr?   FALLBACK_PACKAGE_ICON_PATH)r@   r6   r+   r,   themefiles         r   r?   zAsyncImage.set_icon_stringO   s   ))+#% 	eV,B;!6!6!88DJDJR< 4#8#8#::DK DK77==%#DI88((3D##F+#DI88''		2D^^K(DJ DK!!%0##K1D1DE,IIn%"0Dd44d;  !;T=P=PRVRfRfgr   c                 0   d }|j                         j                  d      rf	 t        j                  |j                         dd      }| j                  j                         ry d}|j                  d      D ]
  }|s||z  } |}n+	 |j                  | j                        \  }}}	t        |      }t"        j*                  j-                  |d       }
| j                  j                         ry |
rMt.        j0                  j3                  |
| j4                  | j6                  d| j                  | j8                         y t        j                  | j                         y # t        $ r>}t        d       t        j                  | j                  t        |             Y d }~y d }~ww xY w# t        j                  $ r[}|j                   t"        j$                  j&                  k7  r*t        j                  | j                  |j(                         Y d }~y d }~ww xY w)	NrH   T
   streamtimeoutr   i   
chunk_sizezload image failed)get_urirS   requestsgetr:   is_cancellediter_contentr$   printr   idle_addemit_image_failedstrload_contentsbytesErrorcoder   IOErrorEnum	CANCELLEDmessageMemoryInputStreamnew_from_datar	   Pixbufnew_from_stream_at_scale_asyncr+   r,   on_pixbuf_created)r@   ra   rE   rbdatachunkr(   successcontentsetagre   s              r   r^   zAsyncImage._fetch_url_threadz   s   <<>$$V,LLbI##002^^t^< 'E' *.*<*<T=M=M*N'4X &&44T4@((*;;F<@JJ<@KK<@<@<L<L<@<R<RT MM$0015  )*d44c!f= :: 66S__666MM$"8"8!))Ds=   A E $E >	E 	*F' 	F$&4FF$'H:AHHc                     t        d| j                  d|       | j                  j                          | j	                  t
        | j                  | j                         | j                  d       y )Nz9AsyncIcon could not read icon file contents for loading (z): r0   )	rn   r9   r:   rC   r?   r_   rK   rL   rZ   )r@   rx   s     r   rp   zAsyncImage.emit_image_failed   sT    TXT]T]_fgh!79L9LdNbNbc		.!r   c                    | j                   j                         r|j                          y 	 t        j                  j                  |      }|r| j                         }|j                         |z  | _        |j                         |z  | _
        t        j                  ||| j                               }| j                  r'|t        t!        | j"                  | j$                        <   | j'                  |       |j                          | j1                  | j                  | j                         | j3                  d       y # t(        j*                  $ r%}| j-                  |j.                         Y d }~y d }~ww xY w)Nr/   )r:   rl   closer	   r{   new_from_stream_finishrN   	get_widthr+   
get_heightr,   r    cairo_surface_create_from_pixbuf
get_windowr<   r   r   r6   r8   set_from_surfacer   rt   rp   rx   rM   rZ   )r@   re   resultrE   pixbufscaler'   r(   s           r   r}   zAsyncImage.on_pixbuf_created   s%   ((*LLN	%%<<VDF--/#--/%7
$//1E9>>v?D?C?PR ;;QX&s4+;+;T__'MN%%g.
 	
 	djj$++6		.! zz 	""199-	s   C
D? ?E7E22E7r   )__name__
__module____qualname__r   SignalFlagsRUN_LAST__gsignals__DETAILS_ICON_SIZEr5   r>   r?   r^   rp   r}   __classcell__)rA   s   @r   r%   r%   3   sn     ,,55tR@ ,,55tR@L
 $(/@IZbg =$& 2CK\ )hV)2V""r   r%   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)ScreenshotDownloaderc                     || _         || _        t        j                  d      | _        || _        t        j                  | j                         y )Nzcom.linuxmint.install)	schema_id)	applicationpkginfor   Settingssettingsscale_factorr\   r]   _download_screenshots_thread)r@   r   r   r   s       r   r5   zScreenshotDownloader.__init__   s>    &/FG!$;;<r   c                 l    |j                  d      s"| j                  j                  dk(  r	t        |z   S |S )NrH   flathub)rS   r   remoteFLATHUB_MEDIA_BASE_URL)r@   urls     r   prefix_media_base_urlz*ScreenshotDownloader.prefix_media_base_url   s/    v&DLL,?,?9,L)C//
r   c                 
   d}g | j                   _        | j                  j                  j	                  d      r	 t        | j                   j                  j                  | j                              dkD  r\| j                  j                  D ]B  }|j                  dd| j                        }|j                         }| j                  |j                        }t        j                  |d      j                  dk\  rB|@| j                  |j                        }t        j                  |d      j                  dk\  r|dz  }t         j"                  j%                  t&        | j                  j(                  d	|d
      }|| j                  |j                        }| j+                  |||       | j-                  | j                  ||       E |dk(  r| j-                  | j                  d d       y 	 d| j                  j(                  z  }	t        j                  |	d      j                  dk  rs|dz  }t         j"                  j%                  t&        | j                  j(                  d	|d
      }| j+                  |	d |       | j-                  | j                  ||       	 ddlm}
  |
t6        j8                  j;                  d| j                  j(                  z  d      d      }|j=                  t?        j@                  d            }|D ]  }|dk\  r n}|dz  }d|d   z  }t         j"                  j%                  t&        | j                  j(                  d	|d
      }| j+                  |d |       | j-                  | j                  ||        | jB                  jE                  tF        jH                        r		 ddlm}
 | j                  j(                  jK                  dd	      } |
t6        j8                  j;                  d|z  d      d      }|j=                  d      }|D ]  }|dk\  r n|d   j	                  d      s|dz  }d|d   z  }|}	t         j"                  j%                  t&        | j                  j(                  d	|d
      }| j+                  |	d |       | j-                  | j                  ||        |dk(  r| j-                  | j                  d d       y y # t.        $ r}t1        |       Y d }~9d }~ww xY w# t.        $ r}t1        |       Y d }~d }~ww xY w# t.        $ r}Y d }~d }~ww xY w# t.        $ r
}Y d }~d }~ww xY w)Nr   fr   r      )rf   i  r2   r   z.pngz6https://community.linuxmint.com/img/screenshots/%s.png)BeautifulSoupz)https://screenshots.debian.net/package/%slxmlz+/shrine/screenshot[/\d\w]*large-[\w\d]*.png)href   z https://screenshots.debian.net%sr   -zhttps://hamonikr.org/%simgsrczhttps://hamonikr.orgz%s)&r   r   r   pkg_hashrS   len	installerget_screenshots	get_imager   get_source_imager   r   rj   headstatus_coderO   r9   joinSCREENSHOT_DIRnamesave_to_fileadd_screenshotr$   rn   bs4r   urllibrequesturlopenfindAllrecompiler   get_booleanprefsHAMONIKR_SCREENSHOTSreplace)r@   num_screenshots
screenshotimagesourcer   
local_name
source_urlr(   linkr   pageimagesthumbhamonikrpkgnames                  r   r   z1ScreenshotDownloader._download_screenshots_thread   s   ')$ <<  ++C0t''11AA$,,OPSTT&*ll&>&> [
 * 4 4S#t?P?P Q!+!<!<!>"88C#==a8DDKPVPb"&"<"<VZZ"HC'}}S!<HHCO ('1,%'WW\\.QUQ]Q]QbQbdsBt%u
!-)-)C)CFJJ)OJ --c:zJ //j/Z#[* !###DLL$:
	KdllN_N__D}}T1-99C?1$WW\\.IZIZ\k:lm
!!$j9##DLL*oN	) !7!78cfjfrfrfwfw8w  BC!7  "D  FL  MD\\rzz2`'a\bF 
O"a'1$:U6]JWW\\.IZIZ\k:lm
!!%z:##DLL*oN
O ==$$U%?%?@-"&,,"3"3";";C"D$V^^%;%;<UXg<gqr%;%su{|e,# WE&!+U|../EF'1, $uU| 3$%'WW\\.QUQ]Q]QbQbdsBt%u
))$jA++DLL*oVW  adA6  {  a   	!HH	&  		.  se   E	S2 AS2 7B0T (C3T6 BU A?U 2	T;TT	T3T..T36	U
U
	U U c                 P   t        j                  |dd      }t        |d      5 }|j                  d      D ]  }|j	                  |        	 d d d        ||}t
        j                  j                  |      }t
        j                  j                         }|j                  d|       	 |j                  |t
        j                  j                  d        y # 1 sw Y   xY w# t        j                  $ r/}	t!        j"                  d|d	|	j$                         Y d }	~	y d }	~	ww xY w)
NTrc   rd   wb   rg   z+metadata::mintinstall-screenshot-source-urlz3Unable to store screenshot source url to metadata 'z': )rj   rk   openrm   writer   rQ   rR   FileInfonewset_attribute_stringset_attributes_from_infoFileQueryInfoFlagsNONEr   rt   loggingwarningrx   )
r@   r   r   r9   r~   fdr   ra   infor(   s
             r   r   z!ScreenshotDownloader.save_to_file3  s    LLT26$ 	 37   	  Jxx$$T*||!!!"OQ[\	t))$0F0F0K0KTR	  	  zz 	tOO\fhihqhqrss	ts#   )C++C# C #D%6%D  D%c                 H    t        j                  | j                  |||       y r   )r   ro   add_ss_idler@   r   r   nums       r   r   z#ScreenshotDownloader.add_screenshotE  s    d&&s;r   c                 >    | j                   j                  |||       y r   )r   r   r   s       r   r   z ScreenshotDownloader.add_ss_idleH  s    ''s;r   N)	r   r   r   r5   r   r   r   r   r   r   r   r   r   r      s#    =
Y7vt$<<r   r   )&rO   	threadingrj   r   r   r   concurrent.futuresr   gi.repositoryr   r   r   r   r   r	   r   r9   r   get_user_cache_dirr   r   r_   ADDON_ICON_SIZELIST_ICON_SIZEFEATURED_ICON_SIZEr   SCREENSHOT_HEIGHTSCREENSHOT_WIDTHMAX_THREADSr\   r   r   r   r)   r-   r"   r%   r   r   r   r   <module>r      s    
    	  1 A A 5d557V8 ^     KL`a
 	-V" V"p~< ~<r   