diff --git a/albert.pyi b/albert.pyi index 12845d24..0c12fee1 100644 --- a/albert.pyi +++ b/albert.pyi @@ -36,17 +36,20 @@ md_credits: [str|List(str)] Third party credit(s) and license notes Due to the differences in type systems multiple inheritance of extensions is not supported. If the Plugin class inherits an extension it will be automatically registered. * Define an "extensions() -> List[Extension]" instance function if you want to provide multiple extensions. + Note: Do not return temporary objects. No ownership taken/refcount increased. * Define initialize() and/or finalize() instance functions if needed. Do not use the constructor, since PyBind11 imposes some inconvenient boilerplate on them. """ +from abc import abstractmethod from enum import Enum from typing import Any from typing import Callable from typing import List from typing import Optional from typing import Union +from typing import overload class Action: """Action object for items.""" diff --git a/dice_roll/__init__.py b/dice_roll/__init__.py index 944e054c..5be00b60 100644 --- a/dice_roll/__init__.py +++ b/dice_roll/__init__.py @@ -132,7 +132,7 @@ class Plugin(albert.TriggerQueryHandler): """A plugin to roll dice""" def id(self) -> str: - return __name__ + return md_id def name(self) -> str: return md_name diff --git a/duckduckgo/__init__.py b/duckduckgo/__init__.py new file mode 100644 index 00000000..9a9627dc --- /dev/null +++ b/duckduckgo/__init__.py @@ -0,0 +1,61 @@ +""" +Inline DuckDuckGo web search using the 'duckduckgo-search' library. +""" + +from subprocess import run +from albert import * +from pathlib import Path +from duckduckgo_search import DDGS +from itertools import islice +from time import sleep + +md_iid = '1.0' +md_version = '1.0' +md_name = 'DuckDuckGo' +md_description = 'Inline DuckDuckGo web search' +md_url = 'https://github.com/albertlauncher/python/duckduckgo' +md_lib_dependencies = "duckduckgo-search" + + +class Plugin(TriggerQueryHandler): + iconUrl = f"file:{Path(__file__).parent}/duckduckgo.svg" + + def initialize(self): + self.ddg = DDGS() + + def id(self): + return md_id + + def name(self): + return md_name + + def description(self): + return md_description + + def synopsis(self): + return "" + + def defaultTrigger(self): + return 'ddg ' + + def handleTriggerQuery(self, query): + + stripped = query.string.strip() + if stripped: + + # dont flood + for number in range(25): + sleep(0.01) + if not query.isValid: + return + + for r in islice(self.ddg.text(stripped, safesearch='off'), 10): + query.add( + Item( + id=md_id, + text=r['title'], + subtext=r['body'], + icon=[Plugin.iconUrl], + actions=[Action("open", "Open link", lambda u=r['href']: openUrl(u))] + ) + ) diff --git a/duckduckgo/duckduckgo.svg b/duckduckgo/duckduckgo.svg new file mode 100644 index 00000000..87f27951 --- /dev/null +++ b/duckduckgo/duckduckgo.svg @@ -0,0 +1,118 @@ + + diff --git a/emoji/__init__.py b/emoji/__init__.py index 12943ff4..0522e772 100644 --- a/emoji/__init__.py +++ b/emoji/__init__.py @@ -49,7 +49,7 @@ def schedule_create_missing_icons(emojis, icon_dir_path: Path): class Plugin(TriggerQueryHandler): def id(self): - return __name__ + return md_id def name(self): return md_name diff --git a/goldendict/__init__.py b/goldendict/__init__.py index c1bbd3db..1409cc16 100644 --- a/goldendict/__init__.py +++ b/goldendict/__init__.py @@ -14,7 +14,7 @@ class Plugin(TriggerQueryHandler): def id(self) -> str: - return __name__ + return md_id def name(self) -> str: return md_name diff --git a/unit_converter/__init__.py b/unit_converter/__init__.py index d25f547f..64797385 100644 --- a/unit_converter/__init__.py +++ b/unit_converter/__init__.py @@ -356,7 +356,7 @@ def initialize(self): self.currency_converter = CurrencyConverter() def id(self) -> str: - return __name__ + return md_id def name(self) -> str: return md_name diff --git a/wikipedia/__init__.py b/wikipedia/__init__.py index 58c468ce..e7ec00bd 100644 --- a/wikipedia/__init__.py +++ b/wikipedia/__init__.py @@ -43,7 +43,7 @@ class Plugin(TriggerQueryHandler): limit = 20 def extensions(self): - return [self, FallbackProvider()] + return [self, self.fb] def id(self): return md_id @@ -58,6 +58,8 @@ def defaultTrigger(self): return "wiki " def initialize(self): + self.fb = FallbackProvider() + params = { 'action': 'query', 'meta': 'siteinfo', @@ -138,4 +140,4 @@ def createFallbackItem(query_string): Action("wiki_search", "Search on Wikipedia", lambda url=Plugin.searchUrl % (Plugin.local_lang_code, query_string): openUrl(url)) ] - ) \ No newline at end of file + ) diff --git a/youtube/__init__.py b/youtube/__init__.py index 17f5bc9e..fb578145 100644 --- a/youtube/__init__.py +++ b/youtube/__init__.py @@ -115,7 +115,7 @@ class Plugin(TriggerQueryHandler): temp_dir = None def id(self) -> str: - return __name__ + return md_id def name(self) -> str: return md_name