source: lliurex-store/trunk/fuentes/lliurex-store-gui/ResourcesManager.py @ 3849

Last change on this file since 3849 was 3840, checked in by hectorgh, 3 years ago

wip

File size: 5.4 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               
29                # testing values
30               
31                self.distro_name="ubuntu"
32                self.icons_path="/tmp/lliurex-store-cache/icons/"
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                component=pkg_info["component"]
41               
42               
43                icon_db=Gtk.IconTheme()
44                icon_db.set_custom_theme("Vibrancy-Dark-Orange")
45                ret_icon=icon_db.lookup_icon(debian_name,256,Gtk.IconLookupFlags.FORCE_SVG)
46                if ret_icon!=None:
47                        return ret_icon.get_filename()
48                       
49               
50                if len(icon)>0:
51               
52                        for dist in ["xenial-updates","xenial-security","xenial"]:
53                                # "64x64/" is included in pkg_info["icon"]
54                                if "64x64/" not in icon:
55                                        icon="64x64/" + icon
56                                        if debian_name+"_"+debian_name not in icon:
57                                                icon=icon.replace(debian_name,debian_name+"_"+debian_name)
58                                        if "pyromaths" in icon:
59                                                icon="64x64/pyromaths_pyromaths.png"
60                                        print(icon)
61                                ret_icon=self.icons_path+"%s/%s"%(component,icon)
62                                if os.path.exists(ret_icon):
63                                        return ret_icon
64               
65                ret_icon=icon_db.lookup_icon("package",256,Gtk.IconLookupFlags.FORCE_SVG ).get_filename()
66                return ret_icon
67               
68               
69        #def get_icon
70
71       
72        def check_perms(self):
73               
74                try:
75                        f=open("/run/lliurex-store.background.pid","w")
76                        f.close()
77                        return True
78                       
79                except:
80                        return False
81                       
82        #def check_perms
83       
84       
85        def create_icons_dir(self):
86               
87                if not os.path.exists(self.icons_path):
88                        os.makedirs(self.icons_path)
89                       
90        #def create_icons_dir
91       
92       
93        def write_local_icons_info(self,info):
94               
95                f=open(self.icon_dates_file,"w")
96                f.write(json.dumps(info,indent=4))
97                f.close()
98               
99        #def write_local_icons_info
100       
101       
102        def check_local_icons_files(self):
103               
104                self.local_icons_dates={}
105                try:
106                        f=open(self.icon_dates_file)
107                        self.local_icons_dates=json.load(f)
108                        f.close()
109                except Exception as e:
110                        print(e)
111               
112                for dist in self.dists:
113                        self.local_icons_dates.setdefault(dist,{})
114                        for component in self.components:
115                                self.local_icons_dates[dist].setdefault(component,-1)
116
117        #def check_local_icons_files
118
119
120       
121        def check_remote_icons_files(self):
122               
123                               
124                self.remote_icons_dates={}
125               
126               
127                for dist in self.dists:
128                        self.remote_icons_dates[dist]={}
129                        for component in self.components:
130                               
131                                url=self.base_url+dist+"/"+component
132                                #print(url)
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       
162        def update_icons(self):
163               
164                self.check_local_icons_files()
165                self.check_remote_icons_files()
166               
167                self.current_icons_dates={}
168               
169                if not os.path.exists(self.download_cache):
170                        os.makedirs(self.download_cache)
171       
172                for dist in self.dists:
173                        self.current_icons_dates[dist]={}
174                        for component in self.components:
175                       
176                                if self.remote_icons_dates[dist][component] > self.local_icons_dates[dist][component]:
177                                        #print("%s icons need to be updated..."%component)
178                                        url=self.base_url+dist+"/"+component+"/"+self.icons_url_file
179                                        #print("Downloading %s ..."%url)
180                                        try:
181                                                icon_file=self.download_cache+"%s_%s_icons.tar.gz"%(dist,component)
182                                                path=self.icons_path+self.distro_name+"-"+dist+"-"+component+"/64x64/"
183                                               
184                                                req=urllib2.Request(url,headers=HEADER)
185                                                res=urllib2.urlopen(req)
186                                                x=open(icon_file,"wb")
187                                                x.write(res.read())
188                                                x.close()
189                                               
190                                                self.current_icons_dates[dist][component]=self.remote_icons_dates[dist][component]
191                                               
192                                                command="tar -xf %s -C %s"%(icon_file,path)
193                                                if not os.path.exists(path):
194                                                        os.makedirs(path)
195                                               
196                                                os.system(command)
197                                               
198                                               
199                                        except Exception as e:
200                                                #print(e)
201                                                self.current_icons_dates[dist][component]=self.local_icons_dates[dist][component]
202                                               
203                                else:
204                                        #print("%s icons OK"%component)
205                                        self.current_icons_dates[dist][component]=self.local_icons_dates[dist][component]
206                               
207                #self.write_local_icons_info(self.current_icons_dates)
208               
209        #def update_icons
210       
211       
212       
213       
214       
215#class ResourcesManager
216
217if __name__=="__main__":
218       
219        rm=ResourcesManager()
220        #rm.check_remote_icons_files()
221        #rm.check_local_icons_files()
222        rm.update_icons()
223        pkg={}
224        pkg["package"]="zsnes"
225        pkg["component"]="universe"
226        pkg["icon"]="64x64/zsnes_zsnes.png"
227       
228        print(rm.get_icon(pkg))
229       
230
231
Note: See TracBrowser for help on using the repository browser.