source: lliurex-store/trunk/fuentes/python3-lliurex-store.install/usr/share/lliurexstore/plugins/infoManager.py @ 8223

Last change on this file since 8223 was 8223, checked in by Juanma, 13 months ago

Implemented cache

File size: 6.5 KB
Line 
1import locale
2import re
3class infomanager:
4        def __init__(self):
5                self.dbg=False
6                self.plugin_actions={'get_info':'*'}
7                self.result={}
8                self.result['status']={'status':-1,'msg':''}
9                self.result['data']=[]
10                self.progress=0
11                self.inc=0
12                self._set_locale()
13        #def __init__
14
15        def set_debug(self,dbg=True):
16                self.dbg=dbg
17                #self._debug ("Debug enabled")
18        #def set__debug
19
20        def _debug(self,msg=''):
21                if self.dbg:
22                        print ('DEBUG Info: %s'%msg)
23        #def _debug
24
25        def register(self):
26                return(self.plugin_actions)
27        #def register
28
29        def execute_action(self,action,applist,match=False):
30                self.progress=0
31                count=len(applist)
32                if (action=='get_info' or action=='info') and count>0:
33                        inc=100.0/count
34                        self.result['data']=self._get_info(applist)
35                self.progress=100
36                return(self.result)
37        #def execute_action
38       
39        def _set_status(self,status,msg=''):
40                self.result['status']={'status':status,'msg':msg}
41        #def _set_status
42
43        def _callback_progress(self):
44                self.progress=self.progress+self.inc
45        #def _callback_progress
46
47        def _set_locale(self):
48                if locale.getdefaultlocale()[0]=="ca_ES":
49                        self.locale=['ca_ES@valencia','ca@valencia','qcv','ca','ca_ES','es_ES','es','en_US','en_GB','en','C']
50                else:
51                        if locale.getdefaultlocale()[0]=="es_ES":
52                                self.locale=['es_ES','es','ca_ES@valencia','ca@valencia','qcv','ca','ca_ES','en_US','en_GB','en','C']
53                        else:
54                                self.locale=[locale.getlocale()[0],'en_US','en_GB','en','ca_ES@valencia','ca@valencia','qcv','ca','es_ES','es','C']
55        #def _set_locale
56
57        def _get_info(self,applist):
58                applistInfo=[]
59                for app in applist:
60                        appInfo=self._init_appInfo()
61                        #self._debug("Gathering package info for "+app.get_id())
62#Earlier versions stored the appstream_id as the memory dir of the metadata
63#Changes in python3.6 and pickle module forces us to disable this feature...
64#                       appInfo['appstream_id']=app
65                        if app.get_id():
66                                appInfo['id']=app.get_id()
67                        for localeItem in self.locale:
68                                if app.get_name(localeItem):
69                                        appInfo['name']=app.get_name(localeItem)
70                                        break
71                        if app.get_release_default():
72                                appInfo['version']=app.get_release_default().get_version()
73                        else:
74                                for release in app.get_releases():
75                                        appinfo['version']=release.get_version()
76                                        break
77                        if app.get_pkgname_default():
78                                appInfo['package']=app.get_pkgname_default()
79                        if len(app.get_pkgnames())>1:
80                                appInfo['packages']=app.get_pkgnames()
81                        if app.get_project_license():
82                                appInfo['license']=app.get_project_license()
83                        else:
84                                appInfo['license']='other/restricted'
85                                orig=app.get_origin()
86                                if orig:
87                                        if '-main' in orig or '-universe' in orig:
88                                                appInfo['license']='open source'
89                        for localeItem in self.locale:
90                                if app.get_comment(localeItem):
91                                        appInfo['summary']=app.get_comment(localeItem)
92                                        appInfo['summary']=appInfo['summary'].replace('&','&')
93                                        appInfo['summary']=appInfo['summary'].replace('<p>','')
94                                        break
95                        for localeItem in self.locale:
96                                if app.get_description(localeItem):
97                                        appInfo['description']=app.get_description(localeItem)
98                                        break
99                        if app.get_categories():
100                                appInfo['categories']=app.get_categories()
101                        if app.get_icon_default():
102                                if app.get_icon_default().get_filename():
103                                        appInfo['icon']=app.get_icon_default().get_filename()
104                                else:
105                                        appInfo['icon']=app.get_icon_default().get_name()
106                                if appInfo['icon']==None:
107                                        icons=app.get_icons()
108                                        if icons:
109                                                for icon in icons:
110                                                        appInfo['icon']=icon.get_name()
111                                                        break
112                                        else:
113                                                appInfo['icon']=''
114                        if appInfo['icon']==None:       
115                                appInfo['icon']=''
116                        if app.get_screenshots():       
117                                thumbnails_list=[]
118                                default_screenshot=''
119                                screenshots_list=[]
120                                for screenshot in app.get_screenshots():
121                                        for img in screenshot.get_images():
122                        #The values are the values of appstream.ImageKind. 1=Source, 2=Thumbnail, 0=UNKNOWN
123                        #yml currently doen's support unkown images so we assign videos depending on file extension
124                                                if img.get_url():
125                                                        if not re.search(r'\.....?$',img.get_url()):
126                                                                appInfo['video']=img.get_url()
127                                                                continue
128                                                        if img.get_kind()==0:   
129                                                                appInfo['video']=img.get_url()
130                                                                continue
131                                                        if img.get_kind()==1: #2=Default;1=normal;0=unknown
132                                                                default_screenshot=img.get_url()
133                                                                screenshots_list.append(img.get_url())
134                                                                continue
135                                                        if img.get_kind()==2:   
136                                                                thumbnails_list.append(img.get_url())
137                                                                continue
138                                                elif img.get_basename():
139                                                                screenshots_list.append("/home/lliurex/.cache/lliurex-store/images/"+img.get_basename())
140
141                                        appInfo['thumbnails']=thumbnails_list
142                                appInfo['screenshot']=default_screenshot
143                                appInfo["screenshots"]=screenshots_list
144                        #The values are the values of appstream.UrlKind. 1=HOMEPAGE, 0=UNKNOWN
145#                       #self._debug(app.get_url_item(0))
146                        if app.get_url_item(1):
147                                appInfo['homepage']=app.get_url_item(1).strip()
148                        if app.get_url_item(0):
149                                appInfo['installerUrl']=app.get_url_item(0).strip()
150                        if app.get_state()==1: #1=Installed
151                                appInfo['state']='installed'
152                        else:
153                                appInfo['state']='available'
154                        if app.get_kudos():
155                                appInfo['kudos']=app.get_kudos()
156                        if app.get_metadata_item('x-zomando'):
157                                appInfo['installerUrl']=app.get_metadata_item('x-zomando')
158                        if app.get_origin():
159                                appInfo['component']=app.get_origin()
160                        if app.get_metadata_item('x-video'):
161                                appInfo['video']=app.get_metadata_item('x-video')
162                                #Modify the url and create the url embed code
163                                if 'embed' not in appInfo['video']:
164                                        appInfo['video']=appInfo['video'].replace('watch?v=','embed/')
165                        #This appstream version returns unknown for all the possible kinds
166#                       if app.get_bundle_default():
167#                               appInfo['bundle']=app.get_bundle_default().get_kind()
168                        #This appstream version returns unknown for all the possible kinds
169                        #ID must contain bundle type as last field
170                        for bundle in app.get_bundles():
171                                if bundle.get_kind()==0:
172                                        kind=bundle.get_id().split('.')[-1]
173                                        appInfo['bundle'].append(kind.lower())
174                                        if kind.lower=='sh':
175                                                appInfo['installerUrl']=bundle.get_id()
176                        applistInfo.append(appInfo)
177                        self._callback_progress()
178                self._set_status(0)
179                return(applistInfo)
180        #def _get_info
181
182        def _init_appInfo(self):
183                appInfo={'appstream_id':'',\
184                'id':'',\
185                'name':'',\
186                'version':'',\
187                'package':'',\
188                'license':'',\
189                'summary':'',\
190                'description':'',\
191                'categories':[],\
192                'icon':'',\
193                'screenshot':'',\
194                'thumbnails':[],\
195                'video':'',\
196                'homepage':'',\
197                'installerUrl':'',\
198                'state':'',\
199                'depends':'',\
200                'kudos':'',\
201                'suggests':'',\
202                'extraInfo':'',\
203                'size':'',\
204                'bundle':[],\
205                'updatable':'',\
206                'component':'',\
207                'channel_releases':{}
208                }
209                return(appInfo)
210        #def _init_appInfo
211
212#class infomanager
Note: See TracBrowser for help on using the repository browser.