source: lliurex-store/trunk/fuentes/lliurex-appstore.install/usr/bin/plugins/searchManager.py @ 3144

Last change on this file since 3144 was 3144, checked in by Juanma, 2 years ago

wip on yml

File size: 3.7 KB
Line 
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]
9                self.dbg=1
10                self.store=''
11                self.pluginInfo={'search':'*','list':'*','list_sections':'*'}
12                self.precision=50
13                self.applist=[]
14                self.progress=0
15        #def __init__
16
17        def __call__(self):
18                return (self.applist)
19
20        def set_debug(self,dbg='1'):
21                self.dbg=int(dbg)
22                self._debug ("Debug enabled")
23        #def set__debug
24
25        def _debug(self,msg=''):
26                if self.dbg==1:
27                        print ('DEBUG Search: '+msg)
28        #def _debug
29
30        def register(self):
31                return(self.pluginInfo)
32
33        def execute_action(self,appstreamStore,action,tokens):
34                if len(tokens.split(' '))>1 or action=='list':
35                        self._debug("Tokenizing search items")
36                        tokens=appstream.utils_search_tokenize(tokens)
37                else:
38                        tokens=[tokens]
39                self.store=appstreamStore
40                if action=='list':
41                        self._list_category(tokens)
42                if action=='list_sections':
43                        self._list_sections()
44                if action=='search':
45                        self._search_app(tokens)
46                self.progress=100
47                return(self.applist)
48
49        def set_precision(self,precision):
50                self.precision=precision
51
52        def _search_app(self,tokens):
53                self._debug("Searching app "+str(tokens))
54                applist=[]
55                app=None
56                if len(tokens)==1:
57                        app=self._app_exists(tokens[0])
58
59                if app:
60                        applist.append(app)
61                        self._debug("App direct match found: "+app.get_id())
62                else:
63                        for app in self._get_apps_by_match(tokens):
64                                applist.append(app)
65                self.applist=applist
66                return(applist)
67
68        def _list_sections(self):
69                applist=[]
70                catDict={}
71                for app in self.store.get_apps():
72                        for cat in app.get_categories():
73                                if cat not in catDict.keys():
74                                        catDict[cat]=1
75                                else:
76                                        catDict[cat]=catDict[cat]+1
77                for section in catDict:
78                        applist.append({section:catDict[section]})
79                self.applist=applist
80                return(applist)
81
82        def _list_category(self,tokens=[]):
83                applist=[]
84                self._debug("tokens: "+str(tokens))
85                if len(tokens)>=1:
86                        self._debug("Searching category "+str(tokens))
87                        setCategories=set(tokens)
88                        apps_in_store=self.store.get_apps()
89                        count_apps=len(apps_in_store)
90                        self.progress=0
91                        inc=100/count_apps
92                        for app in apps_in_store:
93                                self.progress=self.progress+inc
94                                if 'setCategories' in locals():
95                                        try:
96                                                appCategories=[cat.lower() for cat in app.get_categories()]
97                                        except:
98                                                pass
99                                        setAppCategories=set(appCategories)
100                                        if list(setCategories.intersection(setAppCategories)):
101                                                self._debug("Found "+app.get_id())
102                                                applist.append(app)
103                else:
104                        self._debug("Loading all apps in store")
105                        applist=self.store.get_apps()
106#                       for app in applist:
107#                               self._debug("Added "+app.get_id())
108                self.applist=applist
109                return(applist)
110
111        def _app_exists(self,appName):
112                self._debug("Trying direct match for "+appName)
113                app=None
114                #1.- Try exact match
115                app=self.store.get_app_by_id(appName)
116                if not app:
117                #2.- Try with exact match with .desktop
118                        app=self.store.get_app_by_id(appName+".desktop")
119                return(app)
120
121        def _get_apps_by_match(self,tokens):
122                        #Add items witch match >= self.precision
123                        applist=[]
124                        apps_in_store=self.store.get_apps()
125                        if apps_in_store:
126                                auxDict={}
127                                count_apps=len(apps_in_store)
128                                self.progress=0
129                                inc=100.0/count_apps
130                                for app in apps_in_store:
131                                        self.progress=self.progress+inc
132                                        if app not in self.applist:
133                                                for token in tokens:
134                                                        score=app.search_matches(token)
135                                                        if score>=self.precision:
136                                                                if score in auxDict:
137                                                                        auxDict[score].append(app)
138                                                                else:
139                                                                        auxDict[score]=[app]
140                                for match in sorted(auxDict):
141                                        for app in auxDict[match]:
142                                                self._debug("Adding app "+app.get_id() + " with score: "+str(match))
143                                                applist.insert(0,app)
144                        return(applist)
Note: See TracBrowser for help on using the repository browser.