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

Last change on this file since 7432 was 7432, checked in by Juanma, 18 months ago

fix wrong update

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