76 lines
1.9 KiB
Python
Executable File
76 lines
1.9 KiB
Python
Executable File
#!/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"})
|