source: lliurex-store/trunk/fuentes/lliurex-store-gui/usr/share/lliurex-store/lliurex-store-gui/ResourcesManager.py @ 7092

Last change on this file since 7092 was 7092, checked in by Juanma, 3 years ago

Gui supports full path for local icons * Added icons to appimages and snaps

File size: 5.2 KB
Line 
1import urllib.request as urllib2
2import os
3import tempfile
4import datetime
5import time
6import json
7
8import gi
9gi.require_version('Gtk', '3.0')
10from gi.repository import Gtk
11
12HEADER = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11' }
13
14
15class ResourcesManager:
16       
17        def __init__(self):
18               
19                self.distro_name="lliurex"
20                self.base_url="http://appstream.ubuntu.com/data/"
21                self.icons_url_file="icons-64x64.tar.gz"
22                self.icons_path="/var/lib/app-info/icons/"
23                self.dists=["xenial","xenial-updates","xenial-security"]
24                self.components=["main","restricted","universe","multiverse"]
25                self.download_cache="/tmp/lliurex-store-cache/"
26                self.icon_dates_file="downloaded_icons.dates"
27               
28                self.distro_name="ubuntu"
29               
30                self.icon_db=Gtk.IconTheme()
31                self.icon_db.set_custom_theme("Vibrancy-Dark-Orange")
32                self.package_icon=self.icon_db.lookup_icon("package",256,Gtk.IconLookupFlags.FORCE_SVG ).get_filename()
33               
34        #def init
35
36        def get_icon(self,pkg_info):
37               
38                debian_name=pkg_info["package"]
39                icon=pkg_info["icon"]
40                if icon==None:
41                        icon=""
42
43                if os.path.isfile(icon):
44                        return(icon)
45               
46                component=pkg_info["component"]
47               
48                ret_icon=self.icon_db.lookup_icon(debian_name,256,Gtk.IconLookupFlags.FORCE_SVG)
49                if ret_icon!=None:
50                        return ret_icon.get_filename()
51                       
52               
53                if len(icon)>0:
54               
55                        for dist in ["xenial-updates","xenial-security","xenial"]:
56                                # "64x64/" is included in pkg_info["icon"]
57                                if "64x64/" not in icon:
58                                        icon="64x64/" + icon
59                                        if debian_name+"_"+debian_name not in icon:
60                                                icon=icon.replace(debian_name,debian_name+"_"+debian_name)
61                                        if "pyromaths" in icon:
62                                                icon="64x64/pyromaths_pyromaths.png"
63                                       
64                                ret_icon=self.icons_path+"%s/%s"%(component,icon)
65                                if os.path.exists(ret_icon):
66                                       
67                                        return ret_icon
68
69                ret_icon=self.package_icon
70                return ret_icon
71               
72        #def get_icon
73
74       
75        def check_perms(self):
76               
77                try:
78                        f=open("/run/lliurex-store.background.pid","w")
79                        f.close()
80                        return True
81                       
82                except:
83                        return False
84                       
85        #def check_perms
86       
87       
88        def create_icons_dir(self):
89               
90                if not os.path.exists(self.icons_path):
91                        os.makedirs(self.icons_path)
92                       
93        #def create_icons_dir
94       
95       
96        def write_local_icons_info(self,info):
97               
98                f=open(self.icon_dates_file,"w")
99                f.write(json.dumps(info,indent=4))
100                f.close()
101               
102        #def write_local_icons_info
103       
104       
105        def check_local_icons_files(self):
106               
107                self.local_icons_dates={}
108                try:
109                        f=open(self.icon_dates_file)
110                        self.local_icons_dates=json.load(f)
111                        f.close()
112                except Exception as e:
113                        print(e)
114               
115                for dist in self.dists:
116                        self.local_icons_dates.setdefault(dist,{})
117                        for component in self.components:
118                                self.local_icons_dates[dist].setdefault(component,-1)
119
120        #def check_local_icons_files
121
122
123       
124        def check_remote_icons_files(self):
125               
126                self.remote_icons_dates={}
127               
128                for dist in self.dists:
129                        self.remote_icons_dates[dist]={}
130                        for component in self.components:
131                               
132                                url=self.base_url+dist+"/"+component
133                                       
134                                try:
135                                       
136                                        req=urllib2.Request(url,headers=HEADER)
137                                        res=urllib2.urlopen(req)
138                                        x=tempfile.NamedTemporaryFile()
139                                        x.write(res.read())
140                                        x.seek(0)
141                                       
142                                        for line in x.readlines():
143                                                line=line.decode("utf-8")
144                                                if self.icons_url_file in line:
145                                                        line=line.split('<td align="right">')[1].split(" ")
146                                                        icons_date=line[0]
147                                                        icons_date=time.mktime(datetime.datetime.strptime(icons_date, "%Y-%m-%d").timetuple())
148                                                        self.remote_icons_dates[dist][component]=icons_date
149                                                        break
150                                        x.close()
151                                               
152                                except Exception as e:
153                                        pass
154                                       
155                                if component not in self.remote_icons_dates[dist]:
156                                        self.remote_icons_dates[dist][component]=-1
157       
158        #def download_home_info
159       
160       
161        def update_icons(self):
162               
163                self.check_local_icons_files()
164                self.check_remote_icons_files()
165               
166                self.current_icons_dates={}
167               
168                if not os.path.exists(self.download_cache):
169                        os.makedirs(self.download_cache)
170       
171                for dist in self.dists:
172                        self.current_icons_dates[dist]={}
173                        for component in self.components:
174                       
175                                if self.remote_icons_dates[dist][component] > self.local_icons_dates[dist][component]:
176
177                                        url=self.base_url+dist+"/"+component+"/"+self.icons_url_file
178                                        try:
179                                                icon_file=self.download_cache+"%s_%s_icons.tar.gz"%(dist,component)
180                                                path=self.icons_path+self.distro_name+"-"+dist+"-"+component+"/64x64/"
181                                               
182                                                req=urllib2.Request(url,headers=HEADER)
183                                                res=urllib2.urlopen(req)
184                                                x=open(icon_file,"wb")
185                                                x.write(res.read())
186                                                x.close()
187                                               
188                                                self.current_icons_dates[dist][component]=self.remote_icons_dates[dist][component]
189                                               
190                                                command="tar -xf %s -C %s"%(icon_file,path)
191                                                if not os.path.exists(path):
192                                                        os.makedirs(path)
193                                               
194                                                os.system(command)
195                                               
196                                               
197                                        except Exception as e:
198                                                self.current_icons_dates[dist][component]=self.local_icons_dates[dist][component]
199                                               
200                                else:
201                                        self.current_icons_dates[dist][component]=self.local_icons_dates[dist][component]
202               
203        #def update_icons
204       
205       
206#class ResourcesManager
207
208
209if __name__=="__main__":
210       
211        rm=ResourcesManager()
212        #rm.check_remote_icons_files()
213        #rm.check_local_icons_files()
214        rm.update_icons()
215        pkg={}
216        pkg["package"]="zsnes"
217        pkg["component"]="universe"
218        pkg["icon"]="64x64/zsnes_zsnes.png"
219       
220        print(rm.get_icon(pkg))
221       
222
223
Note: See TracBrowser for help on using the repository browser.