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

Last change on this file since 7137 was 7137, checked in by Juanma, 20 months ago

WIP on releases

File size: 6.4 KB
RevLine 
[3275]1import locale
2import gi
3gi.require_version('AppStreamGlib', '1.0')
4from gi.repository import AppStreamGlib as appstream
5
6class searchmanager:
7        def __init__(self):
8                self.locale=locale.getlocale()[0]
[7132]9                self.dbg=True
[3275]10                self.store=''
[6645]11                self.plugin_actions={'search':'*','list':'*','list_sections':'*','info':'*'}
12                self.precision=1
[3275]13                self.applist=[]
14                self.progress=0
[3653]15                self.result={}
16                self.result['data']={}
17                self.result['status']={}
[3275]18        #def __init__
19
20        def __call__(self):
21                return (self.applist)
22
[6693]23        def set_debug(self,dbg=True):
[6645]24                self.dbg=dbg
[3275]25                self._debug ("Debug enabled")
26        #def set__debug
27
28        def _debug(self,msg=''):
[6645]29                if self.dbg:
[7080]30                        print ('DEBUG Search: %s'%msg)
[3275]31        #def _debug
32
33        def register(self):
[6645]34                return(self.plugin_actions)
[3275]35
[6645]36        def execute_action(self,appstreamStore,action,tokens,exact_match_for_search=False,max_results=0):
[6693]37                self._debug("Executing action %s"%action)
38                self._debug("Tokens: %s"%tokens)
[4811]39                self.progress=0
[6693]40                if type(tokens)==type([]):
41                        tokens=' '.join(tokens)
42                if type(tokens) is str:
43                        tokens=tokens.lower()
44                else:
[3275]45                        tokens=''
[4103]46                if len(tokens.split(' '))>1:
47                        if action=='search':
48                                self._debug("Tokenizing search items")
49                                tokens=appstream.utils_search_tokenize(tokens)
50                        else:
51                                tokens=tokens.split(' ')
[3275]52                else:
[4103]53                        if len(tokens)>=1:
54                                tokens=[tokens]
55                        else:
56                                tokens=[]
57       
[3275]58                self.store=appstreamStore
[3653]59                self.result['status']={'status':-1,'msg':''}
60                self.result['data']=[]
[6547]61                if self.store:
62                        if action=='list':
[6645]63                                self._list_category(tokens,max_results)
[6547]64                        if action=='list_sections':
65                                self._list_sections()
66                        if (action=='search' or action=='info'):
67                                self._search_app(tokens,exact_match_for_search)
[3275]68                self.progress=100
[3653]69                return(self.result)
[3275]70
[3653]71        def _set_status(self,status,msg=''):
72                self.result['status']={'status':status,'msg':msg}
73
[3275]74        def set_precision(self,precision):
75                self.precision=precision
76
[3827]77        def _search_app(self,tokens,exact_match):
[3884]78                self._debug("Searching app "+str(tokens)+ " with exact_match="+str(exact_match))
[3275]79                applist=[]
80                app=None
[6693]81#               if len(tokens)==1:
82                if exact_match:
[3275]83                        app=self._app_exists(tokens[0])
84                if app:
85                        applist.append(app)
86                        self._debug("App direct match found: "+app.get_id())
[3827]87                if not exact_match:
[5215]88                        applist.extend(self._get_apps_by_match(tokens,applist))
89#               if len(applist):
90#                       self._set_status(0)
91#               else:
92                        applist.extend(self._get_app_by_pkgname(tokens,applist))
93                applist=set(applist)
[3653]94                if len(applist):
95                        self._set_status(0)
96                else:
[5215]97                        self._set_status(1)
[3678]98                self.result['data']=applist
[3275]99                return(applist)
100
101        def _list_sections(self):
102                applist=[]
[6645]103                categories={}
[3275]104                for app in self.store.get_apps():
105                        for cat in app.get_categories():
[6645]106                                if cat not in categories.keys():
107                                        categories[cat]=1
[3275]108                                else:
[6645]109                                        categories[cat]=categories[cat]+1
110                for section in categories:
111                        applist.append({str(section):categories[section]})
[3653]112                self.result['data']=applist
113                if len(applist):
114                        self._set_status(0)
115                else:
116                        self._set_status(1)
[3275]117                return(applist)
118
[6645]119        def _list_category(self,tokens=[],max_results=0):
[3275]120                applist=[]
121                self._debug("tokens: "+str(tokens))
[6645]122                self._debug("Max results: %s"%max_results)
[3275]123                if len(tokens)>=1:
124                        self._debug("Searching category "+str(tokens))
[6645]125                        categories_set=set(tokens)
[3275]126                        apps_in_store=self.store.get_apps()
127                        count_apps=len(apps_in_store)
128                        self.progress=0
129                        inc=100/count_apps
130                        for app in apps_in_store:
131                                self.progress=self.progress+inc
[6645]132                                if 'categories_set' in locals():
[3275]133                                        try:
[6645]134                                                app_categories=[cat.lower() for cat in app.get_categories()]
[3275]135                                        except:
136                                                pass
[6645]137                                        app_categories_set=set(app_categories)
138                                        if categories_set.issubset(app_categories_set):
[3275]139                                                self._debug("Found "+app.get_id())
140                                                applist.append(app)
141                else:
142                        self._debug("Loading all apps in store")
143                        applist=self.store.get_apps()
[6645]144                        categories_set=set(['snap','appimage'])
145                        applist_2=[]
146                        for app in applist:
147                                if 'categories_set' in locals():
148                                        try:
149                                                app_categories=[cat.lower() for cat in app.get_categories()]
150                                        except:
151                                                pass
152                                        app_categories_set=set(app_categories)
153                                        if not categories_set.issubset(app_categories_set):
154                                                applist_2.append(app)
155                                        else:
156                                                print("Removing %s"%app.get_pkgname())
157                        applist=applist_2
[3275]158#                       for app in applist:
159#                               self._debug("Added "+app.get_id())
[6645]160                if max_results:
161                        applist=applist[0:max_results]
162                #List only valid categories
163
[3653]164                self.result['data']=applist
165                if len(applist):
166                        self._set_status(0)
167                else:
168                        self._set_status(1)
[3275]169                return(applist)
170
[6645]171        def _app_exists(self,app_name):
172                self._debug("Trying direct match for "+app_name)
[3275]173                app=None
174                #1.- Try exact match
[6645]175                app=self.store.get_app_by_id(app_name)
[3275]176                if not app:
[5018]177                #2.- Try exact match with zero-lliurex- for the zomandos
[6645]178                        app=self.store.get_app_by_id("zero-lliurex-"+app_name)
179                if not app:
180                #3.- Try exact match with .desktop
181                        app=self.store.get_app_by_id(app_name+".desktop")
182                if not app:
183                #4.- Try exact match by pkgname
184                        app=self.store.get_app_by_pkgname(app_name)
[7137]185                if not app:
186                        app=self.store.get_app_by_id_ignore_prefix(app_name)
[6645]187                self._debug("App found %s"%app)
[3275]188                return(app)
189
[3678]190        def _get_apps_by_match(self,tokens,applist=[]):
[7137]191                #Add items with match >= self.precision
[5591]192                self._debug("Searching app by fuzzy match")
[5215]193                if not applist:
[6645]194                        position=1
[5215]195                else:
[6645]196                        position=len(applist)+1
[3678]197                apps_in_store=self.store.get_apps()
198                if apps_in_store:
[6645]199                        tmp_app_dict={}
[3678]200                        count_apps=len(apps_in_store)
201                        self.progress=0
202                        inc=100.0/count_apps
203                        for app in apps_in_store:
204                                self.progress=self.progress+inc
205                                if app not in self.applist:
206                                        for token in tokens:
207                                                score=app.search_matches(token)
208                                                if score>=self.precision:
[6693]209#                                                       if "appimage" in app.get_id().lower():
210#                                                               score=1
[6645]211                                                        if score in tmp_app_dict:
212                                                                tmp_app_dict[score].append(app)
[3678]213                                                        else:
[6645]214                                                                tmp_app_dict[score]=[app]
[6693]215                        fake_app=[]
216                        for match in sorted(tmp_app_dict.keys()):
[6645]217                                for app in tmp_app_dict[match]:
[3678]218                                        if app not in applist:
[3275]219                                                self._debug("Adding app "+app.get_id() + " with score: "+str(match))
[6693]220                                                applist.insert(0,app)
[3678]221                return(applist)
222
[3836]223        def _get_app_by_pkgname(self,tokens,applist=[]):
[5215]224                if not applist:
[6645]225                        position=1
[5215]226                else:
[6645]227                        position=len(applist)+1
[3678]228                apps_in_store=self.store.get_apps()
229                if apps_in_store:
230                        count_apps=len(apps_in_store)
231                        self.progress=0
232                        inc=100.0/count_apps
233                        for app in apps_in_store:
234                                self.progress=self.progress+inc
235                                if app not in self.applist:
236                                        for token in tokens:
237                                                if app.get_pkgname_default()==token:
[5215]238                                                        applist.insert(1,app)
[3678]239
240                return(applist)
Note: See TracBrowser for help on using the repository browser.