forked from FloydJohn/ulauncher-chrome-profiles
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
94 lines (80 loc) · 3.33 KB
/
main.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
import os
import subprocess
import json
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.ExtensionCustomAction import ExtensionCustomAction
def scan_chrome_folder(chrome_config_folder):
profiles = {}
# First, let's extract profiles from Local State JSON
with open(os.path.join(chrome_config_folder, 'Local State')) as f:
local_state = json.load(f)
cache = local_state['profile']['info_cache']
for folder, profile_data in cache.items():
profiles[folder] = {
'name': profile_data['name'],
'email': profile_data['user_name']
}
# Leave out every past profile which doesn't exist anymore
for folder in list(profiles.keys()):
try:
os.listdir(os.path.join(chrome_config_folder, folder))
except:
profiles.pop(folder)
return profiles
class DemoExtension(Extension):
def __init__(self):
super(DemoExtension, self).__init__()
self.subscribe(KeywordQueryEvent, KeywordQueryEventListener())
self.subscribe(ItemEnterEvent, ItemEnterEventListener())
class KeywordQueryEventListener(EventListener):
def on_event(self, event, extension):
chrome_config_folder = os.path.expanduser(extension.preferences['chrome_folder'])
profiles = scan_chrome_folder(chrome_config_folder)
# Filter by query if inserted
query = event.get_argument()
if query:
query = query.strip().lower()
for folder in list(profiles.keys()):
name = profiles[folder]['name'].lower()
if query not in name:
profiles.pop(folder)
# Create launcher entries
entries = []
for folder in profiles:
entries.append(ExtensionResultItem(
icon='images/icon.png',
name=profiles[folder]['name'],
description=profiles[folder]['email'],
on_enter=ExtensionCustomAction({
'chrome_cmd': extension.preferences['chrome_cmd'],
'opt': ['--profile-directory={0}'.format(folder)]
}, keep_app_open=False)
))
entries.append(
ExtensionResultItem(
icon="images/icon.png",
name="Incognito",
description="Launch browser in incognito mode",
on_enter=ExtensionCustomAction(
{
"chrome_cmd": extension.preferences["chrome_cmd"],
"opt": ["--incognito"],
},
keep_app_open=False,
),
)
)
return RenderResultListAction(entries)
class ItemEnterEventListener(EventListener):
def on_event(self, event, extension):
# Open Chrome when user selects an entry
data = event.get_data()
chrome_path = data['chrome_cmd']
opt = data['opt']
subprocess.Popen([chrome_path] + opt)
if __name__ == '__main__':
DemoExtension().run()