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

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

wuo

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