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

Last change on this file since 8703 was 8703, checked in by Juanma, 20 months ago

sync with git

File size: 7.7 KB
Line 
1import urllib.request as urllib2
2import os
3import tempfile
4import datetime
5import time
6import json
7import re
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                try:
33                        self.package_icon=self.icon_db.lookup_icon("package",256,Gtk.IconLookupFlags.FORCE_SVG ).get_filename()
34                except:
35                        self.icon_db.set_custom_theme("Humanity")
36                        self.package_icon=self.icon_db.lookup_icon("package-x-generic",256,Gtk.IconLookupFlags.FORCE_SVG ).get_filename()
37
38               
39        #def init
40
41        def get_icon(self,pkg_info):
42               
43                debian_name=pkg_info["package"]
44                icon=pkg_info["icon"]
45                if icon==None:
46                        icon=""
47
48                if os.path.isfile(icon):
49                        return(icon)
50
51                if icon.startswith("http"):
52                        cache_dir=os.getenv("HOME")+"/.cache/lliurex-store/icons"
53                        icon_name=icon.split("/")[-1]
54                        if not os.path.exists(cache_dir):
55                                os.makedirs(cache_dir)
56                        if os.path.isfile(cache_dir+"/"+icon_name):
57                                return(cache_dir+"/"+icon_name)
58                        icon_file=cache_dir+"/"+icon_name
59                        url=icon
60                        try:
61                                req=urllib2.Request(url,headers=HEADER)
62                                res=urllib2.urlopen(req)
63                                x=open(icon_file,"wb")
64                                x.write(res.read())
65                                x.close()
66                        except Exception as e:
67                                icon_file=''
68                        finally:
69                                return(icon_file)
70       
71               
72                component=pkg_info["component"]
73                ret_icon=self.icon_db.lookup_icon(debian_name,256,Gtk.IconLookupFlags.FORCE_SVG)
74                if ret_icon!=None:
75                        return ret_icon.get_filename()
76               
77                ret_icon=self.icon_db.lookup_icon(icon,256,Gtk.IconLookupFlags.FORCE_SVG)
78                if ret_icon!=None:
79                        return ret_icon.get_filename()
80                       
81               
82                if len(icon)>0:
83               
84                        for dist in ["xenial-updates","xenial-security","xenial"]:
85                                # "64x64/" is included in pkg_info["icon"]
86#                               if "64x64/" not in icon:
87                                if not re.match("[0-9]*x[0-9]*\/",icon):
88                                        icon="64x64/" + icon
89                                        if debian_name+"_"+debian_name not in icon:
90                                                icon=icon.replace(debian_name,debian_name+"_"+debian_name)
91                                                if not icon.endswith(".png"):
92                                                        icon=icon+'.png'
93                                        if "pyromaths" in icon:
94                                                icon="64x64/pyromaths_pyromaths.png"
95                                       
96                                ret_icon=self.icons_path+"%s/%s"%(component,icon)
97                                if os.path.exists(ret_icon):
98                                        return ret_icon
99                                else:
100                                        ret_icon=ret_icon.replace("64x64","128x128")
101                                        if os.path.exists(ret_icon):
102                                                return ret_icon
103                                        icon="64x64/" + pkg_info['icon']
104                                ret_icon=self.icons_path+"%s/%s"%(component,icon)
105                                if os.path.exists(ret_icon):
106                                        return ret_icon
107                                else:
108                                #Last attempt
109                                        if len(pkg_info['id'].split('.'))>2:
110                                                pkg_id=pkg_info['id'].split('.')[-2]
111                                                icon="64x64/%s_%s.png"%(debian_name,pkg_id)
112                                ret_icon=self.icons_path+"%s/%s"%(component,icon)
113                                if os.path.exists(ret_icon):
114                                        return ret_icon
115                                else:
116                                #Unaccurate icon search...
117                                        if os.path.isdir(self.icons_path+"/"+component+"/64x64"):
118                                                for icon_file in os.listdir(self.icons_path+"/"+component+"/64x64/"):
119                                                        if re.search("^.*"+pkg_info['icon']+".*\.png",icon_file):
120                                                                ret_icon=self.icons_path+"%s/64x64/%s"%(component,icon_file)
121                                if os.path.exists(ret_icon):
122                                        return ret_icon
123                                else:
124                                #The very last attempt. We'll look for the icon in the desktop (if any)
125                                        desktop_file=pkg_info['id']
126                                        if not desktop_file.endswith(".desktop"):
127                                                desktop_file=desktop_file+".desktop"
128                                        if os.path.isfile("/usr/share/applications/%s"%desktop_file):
129                                                f=open("/usr/share/applications/%s"%desktop_file,'r')
130                                                for l in f.readlines():
131                                                        if l.startswith("Icon"):
132                                                                icon_name=l.split('=')[-1].strip('\n')
133                                                                if os.path.isfile(icon_name):
134                                                                        return(icon_name)
135                                                                else:
136                                                                        ret_icon=self.icon_db.lookup_icon(icon_name,256,Gtk.IconLookupFlags.FORCE_SVG)
137                                                                        if ret_icon:
138                                                                                return(ret_icon.get_filename())
139
140                ret_icon=self.package_icon
141                return ret_icon
142               
143        #def get_icon
144
145       
146        def check_perms(self):
147               
148                try:
149                        f=open("/run/lliurex-store.background.pid","w")
150                        f.close()
151                        return True
152                       
153                except:
154                        return False
155                       
156        #def check_perms
157       
158       
159        def create_icons_dir(self):
160               
161                if not os.path.exists(self.icons_path):
162                        os.makedirs(self.icons_path)
163                       
164        #def create_icons_dir
165       
166       
167        def write_local_icons_info(self,info):
168               
169                f=open(self.icon_dates_file,"w")
170                f.write(json.dumps(info,indent=4))
171                f.close()
172               
173        #def write_local_icons_info
174       
175       
176        def check_local_icons_files(self):
177               
178                self.local_icons_dates={}
179                try:
180                        f=open(self.icon_dates_file)
181                        self.local_icons_dates=json.load(f)
182                        f.close()
183                except Exception as e:
184                        print(e)
185               
186                for dist in self.dists:
187                        self.local_icons_dates.setdefault(dist,{})
188                        for component in self.components:
189                                self.local_icons_dates[dist].setdefault(component,-1)
190
191        #def check_local_icons_files
192
193
194       
195        def check_remote_icons_files(self):
196               
197                self.remote_icons_dates={}
198               
199                for dist in self.dists:
200                        self.remote_icons_dates[dist]={}
201                        for component in self.components:
202                               
203                                url=self.base_url+dist+"/"+component
204                                       
205                                try:
206                                       
207                                        req=urllib2.Request(url,headers=HEADER)
208                                        res=urllib2.urlopen(req)
209                                        x=tempfile.NamedTemporaryFile()
210                                        x.write(res.read())
211                                        x.seek(0)
212                                       
213                                        for line in x.readlines():
214                                                line=line.decode("utf-8")
215                                                if self.icons_url_file in line:
216                                                        line=line.split('<td align="right">')[1].split(" ")
217                                                        icons_date=line[0]
218                                                        icons_date=time.mktime(datetime.datetime.strptime(icons_date, "%Y-%m-%d").timetuple())
219                                                        self.remote_icons_dates[dist][component]=icons_date
220                                                        break
221                                        x.close()
222                                               
223                                except Exception as e:
224                                        pass
225                                       
226                                if component not in self.remote_icons_dates[dist]:
227                                        self.remote_icons_dates[dist][component]=-1
228       
229        #def download_home_info
230       
231       
232        def update_icons(self):
233               
234                self.check_local_icons_files()
235                self.check_remote_icons_files()
236               
237                self.current_icons_dates={}
238               
239                if not os.path.exists(self.download_cache):
240                        os.makedirs(self.download_cache)
241       
242                for dist in self.dists:
243                        self.current_icons_dates[dist]={}
244                        for component in self.components:
245                       
246                                if self.remote_icons_dates[dist][component] > self.local_icons_dates[dist][component]:
247
248                                        url=self.base_url+dist+"/"+component+"/"+self.icons_url_file
249                                        try:
250                                                icon_file=self.download_cache+"%s_%s_icons.tar.gz"%(dist,component)
251                                                path=self.icons_path+self.distro_name+"-"+dist+"-"+component+"/64x64/"
252                                               
253                                                req=urllib2.Request(url,headers=HEADER)
254                                                res=urllib2.urlopen(req)
255                                                x=open(icon_file,"wb")
256                                                x.write(res.read())
257                                                x.close()
258                                               
259                                                self.current_icons_dates[dist][component]=self.remote_icons_dates[dist][component]
260                                               
261                                                command="tar -xf %s -C %s"%(icon_file,path)
262                                                if not os.path.exists(path):
263                                                        os.makedirs(path)
264                                               
265                                                os.system(command)
266                                               
267                                               
268                                        except Exception as e:
269                                                self.current_icons_dates[dist][component]=self.local_icons_dates[dist][component]
270                                               
271                                else:
272                                        self.current_icons_dates[dist][component]=self.local_icons_dates[dist][component]
273               
274        #def update_icons
275       
276       
277#class ResourcesManager
278
279
280if __name__=="__main__":
281       
282        rm=ResourcesManager()
283        #rm.check_remote_icons_files()
284        #rm.check_local_icons_files()
285        rm.update_icons()
286        pkg={}
287        pkg["package"]="zsnes"
288        pkg["component"]="universe"
289        pkg["icon"]="64x64/zsnes_zsnes.png"
290       
291        print(rm.get_icon(pkg))
292       
293
294
Note: See TracBrowser for help on using the repository browser.