source: lliurex-store/trunk/fuentes/lliurex-store-gui/Screenshot.py @ 3840

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

wip

File size: 10.6 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3from gi.repository import Gtk,GdkPixbuf,GLib,GObject
4import urllib.request as urllib2
5import threading
6import os
7import ImageManager
8import Core
9import string
10import random
11
12class ScreenshotNeo(Gtk.Stack):
13       
14        def __init__(self):
15               
16                Gtk.Stack.__init__(self)
17                self.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
18                self.set_transition_duration(250)
19               
20                self.image_dir="/tmp/.lliurex-store/"
21                if not os.path.exists(self.image_dir):
22                        os.makedirs(self.image_dir)
23               
24                self.spinner=Gtk.Spinner()
25                #self.spinner.set_size_request(x,y)
26                self.spinner.start()
27               
28                hbox=Gtk.HBox()
29                hbox.pack_start(self.spinner,True,True,0)
30               
31                self.image=Gtk.Image()
32                self.add_titled(hbox,"spinner","Spinner")
33                self.add_titled(self.image,"image","Image")
34               
35                self.image_info={}
36                self.image_info["image_url"]=None
37                self.image_info["video_url"]=None
38                self.image_info["image_id"]=None
39                self.image_info["pkg_name"]=None
40                self.image_info["image_path"]=None
41                self.image_info["x"]=-1
42                self.image_info["y"]=-1
43                self.image_info["aspect_ratio"]=True
44                self.image_info["custom_frame"]=False
45                self.image_info["force_label"]=False
46                self.image_info["pixbuf"]=None
47               
48                self.show_all()
49               
50        #def init
51       
52        def set_image_info(self,image_info):
53               
54                self.image_info["pkg_name"]=image_info.setdefault("pkg_name","")
55                self.image_info["image_path"]=image_info.setdefault("image_path","")
56                self.image_info["x"]=image_info.setdefault("x",-1)
57                self.image_info["y"]=image_info.setdefault("y",-1)
58                self.image_info["aspect_ratio"]=image_info.setdefault("aspect_ratio",True)
59                self.image_info["pixbuf"]=image_info.setdefault("pixbuf",None)
60                self.image_info["image_url"]=image_info.setdefault("image_url","")
61                self.image_info["image_id"]=image_info.setdefault("image_id",self.get_random_id())
62                self.image_info["custom_frame"]=image_info.setdefault("custom_frame",False)
63                self.image_info["force_label"]=image_info.setdefault("force_label",False)
64               
65        #def set_image_info
66       
67        def get_random_id(self):
68               
69                chars=string.ascii_lowercase
70                size=10
71               
72                return ''.join(random.choice(chars) for _ in range(size))
73               
74        #def get_random_id
75       
76        def set_from_file(self,image_info):
77               
78               
79                self.set_image_info(image_info)
80               
81                x=self.image_info["x"]
82                y=self.image_info["y"]
83                aspect_ratio=self.image_info["aspect_ratio"]
84                file_path=self.image_info["image_path"]
85               
86                if os.path.exists(file_path):
87                       
88                        if x==-1 and y==-1:
89                       
90                                self.image.set_from_file(file_path)
91                                pixbuf=self.image.get_pixbuf()
92                                self.image_info["x"]=pixbuf.get_width()
93                                self.image_info["y"]=pixbuf.get_height()
94                                self.set_visible_child_name("image")
95                                return True
96                               
97                        else:
98                               
99                                tmp=ImageManager.scale_image(file_path,x,y,aspect_ratio)
100                                pixbuf=tmp.get_pixbuf()
101                                self.image_info["x"]=pixbuf.get_width()
102                                self.image_info["y"]=pixbuf.get_height()
103                                self.image.set_from_pixbuf(tmp.get_pixbuf())
104                                self.set_visible_child_name("image")
105                                return True
106                       
107                return False
108               
109        #def set_from_file
110       
111        def get_size(self):
112               
113                print(self.image_info["x"])
114                print(self.image_info["y"])
115               
116        #def get_size
117       
118        def set_from_pixbuf(self,image_info):
119               
120                self.set_image_info(image_info)         
121               
122                x=self.image_info["x"]
123                y=self.image_info["x"]
124                pixbuf=self.image_info["pixbuf"]
125                aspect_ratio=self.image_info["aspect_ratio"]
126               
127                if pixbuf!=None:
128                       
129                        if x==-1 and y==-1:
130                               
131                                self.image.set_from_pixbuf(pixbuf)
132                                self.image_info["x"]=pixbuf.get_width()
133                                self.image_info["y"]=pixbuf.get_height()
134                                self.set_visible_child_name("image")
135                               
136                        else:
137                               
138                                pixbuf=ImageManager.scale_pixbuf(pixbuf,x,y,aspect_ratio)
139                                self.image.set_from_pixbuf(pixbuf)
140                                self.image_info["x"]=pixbuf.get_width()
141                                self.image_info["y"]=pixbuf.get_height()
142                                self.set_visible_child_name("image")
143                       
144               
145                        return True
146
147                return False           
148               
149        #set_from_pixbuf
150       
151        def wait_for_image(self):
152       
153                while self.thread.is_alive():
154                        return True
155               
156               
157                if os.path.exists(self.image_dir+self.image_info["image_id"]):
158                        self.set_from_file(self.image_info)
159               
160                return False
161       
162        #def _download
163       
164        def download_image(self,image_info):
165               
166                self.set_image_info(image_info) 
167               
168                x=self.image_info["x"]
169                y=self.image_info["y"]
170               
171                self.set_visible_child_name("spinner")
172               
173                self.spinner.set_size_request(x,y)
174                GLib.timeout_add(500,self.wait_for_image)
175               
176                self.thread=threading.Thread(target=self.download_image_thread)
177                self.thread.daemon=True
178                self.thread.start()
179               
180        #def download_image
181       
182        def download_image_thread(self):
183               
184                if not os.path.exists(self.image_dir+self.image_info["image_id"]):
185                       
186                        header = {
187                                        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'
188                                }
189                       
190                        try:
191                       
192                                self.image_info["image_path"]=self.image_dir+self.image_info["image_id"]
193                       
194                                req=urllib2.Request(self.image_info["image_url"],headers=header)
195                                res=urllib2.urlopen(req)
196                                f=open(self.image_dir+self.image_info["image_id"],"wb")
197                                f.write(res.read())
198                                f.close()
199                               
200                               
201                                if self.image_info["custom_frame"] or self.image_info["force_label"]:
202                                        ImageManager.create_banner(self.image_dir+self.image_info["image_id"],self.image_info["x"],self.image_info["y"],self.image_info["pkg_name"],self.image_info["custom_frame"],self.image_info["image_path"])
203                                       
204                        except Exception as e:
205                               
206                                output_file=self.image_info["image_path"]
207                                self.image_info["name"]=None
208                               
209                                self.image_info["image_path"]="/usr/share/icons/Vibrancy-Colors/mimetypes/256/package.svg"
210                                if self.image_info["video_url"] !=None:
211                                        self.image_info["image_path"]="clean_icons/video.svg"
212                                self.image_info["custom_frame"]=True
213                                self.create_banner_from_file(self.image_info,output_file)
214                                self.image_info["image_path"]=output_file
215               
216                else:
217                        self.image_info["image_path"]=self.image_dir+self.image_info["image_id"]
218
219                return True
220               
221        #def download-image-thread
222       
223        def create_banner_from_file(self,image_info,output_file=None):
224               
225                file_name=image_info.setdefault("image_path")
226                x=image_info.setdefault("x")
227                y=image_info.setdefault("y")
228                custom_frame=image_info.setdefault("custom_frame",False)
229                txt=image_info.setdefault("name","")
230               
231                ret=ImageManager.create_banner(file_name,x,y,txt,custom_frame,output_file)
232               
233               
234                if output_file ==None:
235                        image_info["pixbuf"]=ret[1].get_pixbuf()
236                        self.set_from_pixbuf(image_info)
237                else:
238                        image_info["image_path"]=output_file
239                        self.set_from_file(image_info)
240               
241               
242        #def create_banner_from_file
243       
244        def create_banner_from_url(self,image_info):
245               
246                self.set_image_info(self.image_info)
247                self.download_image(image_info)
248               
249        #def create_banner_from_url
250       
251        def set_video_info(self,video_info):
252               
253                print("e0e0e0e")
254               
255                video_info.setdefault("video_url","")
256                video_info.setdefault("image_url","")
257                video_info.setdefault("image_id","")
258                video_info.setdefault("x",-1)
259                video_info.setdefault("y",-1)
260               
261               
262                self.set_image_info(video_info)
263               
264                self.image_info["video_url"]=video_info.setdefault("video_url")
265                self.image_info["image_url"]=video_info.setdefault("image_url")
266                self.image_info["image_id"]=video_info.setdefault("image_id")
267                self.image_info["x"]=video_info.setdefault("x")
268                self.image_info["y"]=video_info.setdefault("y")
269                self.image_info["pkg_name"]=video_info.setdefault("pkg_name","")
270                               
271                self.download_image(video_info)
272               
273        #def set_video_info
274       
275       
276#class ScreenshotNeo
277
278
279if __name__=="__main__":
280       
281        w=Gtk.Window()
282        w.connect("destroy",Gtk.main_quit)
283       
284        hbox=Gtk.HBox()
285        vbox=Gtk.VBox()
286        hbox.pack_start(vbox,False,False,0)
287        w.add(hbox)
288       
289        s=ScreenshotNeo()
290        info={}
291        info["image_path"]="gearth2.png"
292        info["x"]=300
293        info["y"]=300
294        info["aspect_ratio"]=True
295        info["pkg_name"]="a"
296        s.set_from_file(info)
297        vbox.pack_start(Gtk.Label("load from file aspect_ratio=True"),False,False,0)
298        vbox.pack_start(s,False,False,0)
299       
300        s=ScreenshotNeo()
301        info={}
302        info["image_path"]="gearth2.png"
303        info["x"]=100
304        info["y"]=100
305        info["aspect_ratio"]=False
306        info["pkg_name"]="a"
307        s.set_from_file(info)
308        vbox.pack_start(Gtk.Label("load from file aspect_ratio=False"),False,False,0)
309        vbox.pack_start(s,False,False,0)
310       
311        s=ScreenshotNeo()
312        info={}
313        info["pixbuf"]=Gtk.Image.new_from_file("gearth3.png").get_pixbuf()
314        info["aspect_ratio"]=True
315        info["pkg_name"]="a"
316        s.set_from_pixbuf(info)
317        vbox.pack_start(Gtk.Label("load from pixbuf aspect_ratio=True"),False,False,0)
318        vbox.pack_start(s,False,False,0)
319       
320        s=ScreenshotNeo()
321        info={}
322        info["pixbuf"]=Gtk.Image.new_from_file("gearth3.png").get_pixbuf()
323        info["aspect_ratio"]=False
324        info["pkg_name"]="a"
325        info["x"]=100
326        info["y"]=100
327        s.set_from_pixbuf(info)
328        vbox.pack_start(Gtk.Label("load from pixbuf aspect_ratio=False"),False,False,0)
329        vbox.pack_start(s,False,False,0)
330       
331        s=ScreenshotNeo()
332        info={}
333        info["image_url"]="http://www.hdbloggers.net/wp-content/uploads/2016/10/Wallpaper-4K.jpg"
334        info["image_id"]="wallpaper"
335        info["aspect_ratio"]=True
336        info["pkg_name"]="a"
337        info["x"]=300
338        info["y"]=300
339        s.download_image(info)
340        vbox.pack_start(Gtk.Label("url aspect_ratio=True"),False,False,0)
341        vbox.pack_start(s,False,False,0)
342
343        s=ScreenshotNeo()
344        info={}
345        info["image_url"]="http://no.existo.com/asd.jpg"
346        info["image_id"]="wallpaper2"
347        info["aspect_ratio"]=True
348        info["pkg_name"]="Package name"
349        info["x"]=128
350        info["y"]=128
351        s.download_image(info)
352        vbox.pack_start(Gtk.Label("url 404 aspect_ratio=True"),False,False,0)
353        vbox.pack_start(s,False,False,0)
354
355        vbox1=Gtk.VBox()
356        hbox.pack_start(vbox1,False,False,0)
357
358        s=ScreenshotNeo()
359        info={}
360        info["image_path"]="/usr/share/pixmaps/firefox.png"
361        info["image_id"]="firefox"
362        info["aspect_ratio"]=True
363        info["pkg_name"]="Firefox"
364        info["custom_frame"]=True
365        info["x"]=300
366        info["y"]=300
367        s.create_banner_from_file(info)
368        vbox1.pack_start(Gtk.Label("create banner from file. resize_image=True"),False,False,0)
369        vbox1.pack_start(s,False,False,0)
370
371        s=ScreenshotNeo()
372        info={}
373        info["image_path"]="/home/cless/svn/xenial/lliurex-artwork-icons/trunk/fuentes/future-green/apps/scite.svg"
374        info["image_id"]="scite"
375        info["aspect_ratio"]=True
376        info["pkg_name"]="SciTe"
377        info["custom_frame"]=False
378        info["x"]=200
379        info["y"]=200
380        s.create_banner_from_file(info)
381        vbox1.pack_start(Gtk.Label("create banner from file. resize_image=False"),False,False,0)
382        vbox1.pack_start(s,False,False,0)
383
384       
385        s=ScreenshotNeo()
386        info={}
387        info["image_url"]="http://androidportal.zoznam.sk/wp-content/uploads/2013/01/2013-purple-640x569.png"
388        info["image_id"]="testing"
389        info["aspect_ratio"]=True
390        info["pkg_name"]="Custom banner"
391        info["custom_frame"]=False
392        info["force_label"]=True
393        info["x"]=400
394        info["y"]=400
395       
396        s.create_banner_from_url(info)
397        vbox1.pack_start(Gtk.Label("create banner from URL. resize_image=False"),False,False,0)
398        vbox1.pack_start(s,False,False,0)
399       
400
401       
402        w.show_all()
403       
404        GObject.threads_init()
405        Gtk.main()
406       
Note: See TracBrowser for help on using the repository browser.