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

Last change on this file since 4114 was 4099, checked in by hectorgh, 3 years ago

wip

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