-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathChromeBookmarks.py
97 lines (76 loc) · 3.21 KB
/
ChromeBookmarks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import json
import logging
import os
from ulauncher.api.client.Extension import Extension
from ulauncher.api.client.EventListener import EventListener
from ulauncher.api.shared.event import KeywordQueryEvent, ItemEnterEvent
from ulauncher.api.shared.item.ExtensionResultItem import ExtensionResultItem
from ulauncher.api.shared.action.RenderResultListAction import RenderResultListAction
from ulauncher.api.shared.action.OpenUrlAction import OpenUrlAction
logging.basicConfig()
logger = logging.getLogger(__name__)
support_browsers = ['google-chrome', 'chromium', 'Brave-Browser']
browser_imgs = {
'google-chrome': 'images/chrome.png',
'chromium': 'images/chromium.png',
'Brave-Browser': 'images/brave.png',
}
class KeywordQueryEventListener(EventListener):
def on_event(self, event, extension):
items = extension.get_items(event.get_argument())
return RenderResultListAction(items)
class ChromeBookmarks(Extension):
matches_len = 0
max_matches_len = 10
def __init__(self):
self.bookmarks_paths = self.find_bookmarks_paths()
super(ChromeBookmarks, self).__init__()
self.subscribe(KeywordQueryEvent, KeywordQueryEventListener())
@staticmethod
def find_bookmarks_paths():
res_lst = []
for browser in support_browsers:
f = os.popen('locate %s | grep Bookmarks' % browser)
res = f.read().split('\n')
if len(res) == 0:
logger.info('Path to the %s Bookmarks was not found' % browser)
continue
for one_path in res:
if one_path.endswith('Bookmarks'):
res_lst.append((one_path, browser))
if len(res_lst) == 0:
logger.exception('Path to the Chrome Bookmarks was not found')
return res_lst
def find_rec(self, data, query, matches):
if self.matches_len >= self.max_matches_len:
return
if data['type'] == 'folder':
for child in data['children']:
self.find_rec(child, query, matches)
else:
res = data['name'].lower().find(query.lower())
if res != -1:
matches.append(data)
self.matches_len += 1
def get_items(self, query):
items = []
self.matches_len = 0
if query is None:
query = ''
for bookmarks_path, browser in self.bookmarks_paths:
matches = []
with open(bookmarks_path) as data_file:
data = json.load(data_file)
self.find_rec(data['roots']['bookmark_bar'], query, matches)
self.find_rec(data['roots']['other'], query, matches)
for bookmark in matches:
bookmark_name = bookmark['name'].encode('utf-8')
bookmark_url = bookmark['url'].encode('utf-8')
item = ExtensionResultItem(
icon=browser_imgs.get(browser),
name='%s' % bookmark_name.decode('utf-8'),
description='%s' % bookmark_url.decode('utf-8'),
on_enter=OpenUrlAction(bookmark_url.decode('utf-8'))
)
items.append(item)
return items