initial commit
This commit is contained in:
commit
bd3fcc0ebe
|
@ -0,0 +1,3 @@
|
||||||
|
/haskal-duckduckgo*
|
||||||
|
/meta.json
|
||||||
|
__pycache__
|
|
@ -0,0 +1,32 @@
|
||||||
|
.PHONY: all clean local-install
|
||||||
|
|
||||||
|
LOGO_URL=https://duckduckgo.com/assets/common/dax-logo.svg
|
||||||
|
ICON_EXISTS=$(shell ./scripts/check-icon.py duckduckgo)
|
||||||
|
|
||||||
|
ifeq ($(ICON_EXISTS),false)
|
||||||
|
export DDG_ICON_NAME=haskal-duckduckgo
|
||||||
|
all: meta.json haskal-duckduckgo.svg
|
||||||
|
else
|
||||||
|
export DDG_ICON_NAME=duckduckgo
|
||||||
|
all: meta.json
|
||||||
|
endif
|
||||||
|
|
||||||
|
haskal-duckduckgo.svg:
|
||||||
|
curl -SsLo "$@" "$(LOGO_URL)" || wget -nv -O "$@" "$(LOGO_URL)"
|
||||||
|
|
||||||
|
meta.json:
|
||||||
|
./scripts/make-meta.py > $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) haskal-duckduckgo* meta.json
|
||||||
|
|
||||||
|
local-install: all
|
||||||
|
mkdir -p ~/.local/share/pop-shell/launcher/duckduckgo/
|
||||||
|
cp duckduckgo_search.py ~/.local/share/pop-shell/launcher/duckduckgo/
|
||||||
|
cp meta.json ~/.local/share/pop-shell/launcher/duckduckgo/
|
||||||
|
ifeq ($(ICON_EXISTS),false)
|
||||||
|
for size in 256 128 96 64 48 32 24 16; do \
|
||||||
|
inkscape -w $$size -h $$size haskal-duckduckgo.svg -o haskal-duckduckgo.png; \
|
||||||
|
xdg-icon-resource install --size $$size haskal-duckduckgo.png; \
|
||||||
|
done
|
||||||
|
endif
|
|
@ -0,0 +1,11 @@
|
||||||
|
# pop-shell ddg
|
||||||
|
|
||||||
|
adds a duckduckgo capability to pop-shell's launcher
|
||||||
|
|
||||||
|
## installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make local-install
|
||||||
|
```
|
||||||
|
|
||||||
|
then: log out and log back in
|
|
@ -0,0 +1,75 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
import webbrowser
|
||||||
|
from urllib.parse import urlencode, quote_plus
|
||||||
|
|
||||||
|
DDG_URL="https://duckduckgo.com/"
|
||||||
|
|
||||||
|
def lookup(query):
|
||||||
|
resp = requests.get(DDG_URL, params={"q":query, "format": "json", "no_html": "1"})
|
||||||
|
print(resp.text)
|
||||||
|
|
||||||
|
|
||||||
|
def send(event, obj=None):
|
||||||
|
if obj is None:
|
||||||
|
obj = {}
|
||||||
|
obj["event"] = event
|
||||||
|
json.dump(obj, sys.stdout)
|
||||||
|
sys.stdout.write("\n")
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
def recv():
|
||||||
|
for line in sys.stdin:
|
||||||
|
if len(line.strip()) == 0:
|
||||||
|
continue
|
||||||
|
req = json.loads(line)
|
||||||
|
if not isinstance(req, dict):
|
||||||
|
send("noop", {"error": "invalid json"})
|
||||||
|
continue
|
||||||
|
|
||||||
|
event = req.get("event", None)
|
||||||
|
if not isinstance(event, str):
|
||||||
|
send("noop", {"error": "invalid event type"})
|
||||||
|
continue
|
||||||
|
yield event, req
|
||||||
|
|
||||||
|
query = ""
|
||||||
|
go_url = ""
|
||||||
|
|
||||||
|
for event, req in recv():
|
||||||
|
if event == "complete":
|
||||||
|
send("noop")
|
||||||
|
elif event == "query":
|
||||||
|
query = req.get("value", "")
|
||||||
|
if query.startswith("ddg "):
|
||||||
|
query = query[4:]
|
||||||
|
elif query.startswith("ddg"):
|
||||||
|
query = query[3:]
|
||||||
|
|
||||||
|
if len(query) > 0 and query != "!":
|
||||||
|
go_url = DDG_URL + "?" + urlencode({"q": query}, quote_via=quote_plus)
|
||||||
|
|
||||||
|
send("queried", {
|
||||||
|
"selections": [
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": f"search {query} on duckduckgo",
|
||||||
|
"description": go_url,
|
||||||
|
# "icon": "meow",
|
||||||
|
# "content_type": "meow"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
go_url = ""
|
||||||
|
send("queried", {"selections": []})
|
||||||
|
elif event == "submit":
|
||||||
|
send("close")
|
||||||
|
if len(go_url) > 0:
|
||||||
|
webbrowser.open(go_url)
|
||||||
|
elif event == "quit":
|
||||||
|
sys.exit(0)
|
||||||
|
else:
|
||||||
|
send("noop", {"error": "invalid event"})
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
sys.stderr.write("usage: check-icon.py <icon name>\n")
|
||||||
|
sys.exit(-1)
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version("Gtk", "3.0")
|
||||||
|
from gi.repository import Gtk
|
||||||
|
|
||||||
|
theme = Gtk.IconTheme.get_default()
|
||||||
|
icon = theme.lookup_icon(sys.argv[1], 48, 0)
|
||||||
|
if icon:
|
||||||
|
print("true")
|
||||||
|
sys.exit(0)
|
||||||
|
else:
|
||||||
|
print("false")
|
||||||
|
sys.exit(1)
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
"name": "duckduckgo",
|
||||||
|
"description": "search duckduckgo",
|
||||||
|
"pattern": "^(ddg|!)",
|
||||||
|
"exec": "duckduckgo_search.py",
|
||||||
|
"icon": os.environ.get("DDG_ICON_NAME", "duckduckgo")
|
||||||
|
}
|
||||||
|
|
||||||
|
json.dump(meta, sys.stdout)
|
Loading…
Reference in New Issue