diff --git a/confarchive/wikidata.py b/confarchive/wikidata.py index 2191f0f..cb73528 100644 --- a/confarchive/wikidata.py +++ b/confarchive/wikidata.py @@ -1,3 +1,4 @@ +import hashlib import json import os import subprocess @@ -13,6 +14,35 @@ s = requests.Session() s.headers.update({"User-Agent": "conference-archive/0.1 (contact: edward@4angle.com)"}) +def md5sum(s: str) -> str: + """Generate hex md5sum.""" + return hashlib.md5(s.encode("utf-8")).hexdigest() + + +def search(q: str) -> list[dict[str, typing.Any]]: + q_md5 = md5sum(q) + + cache_filename = os.path.join("cache", q_md5 + ".json") + + if os.path.exists(cache_filename): + data = json.load(open(cache_filename)) + else: + params: dict[str, str | int] = { + "action": "query", + "list": "search", + "format": "json", + "formatversion": 2, + "srsearch": q, + "srlimit": "10", + } + r = requests.get(wikidata_api, params=params) + open(cache_filename, "w").write(r.text) + data = r.json() + time.sleep(1) + + return typing.cast(list[dict[str, typing.Any]], data["query"]["search"]) + + def api_image_detail_call(filename: str) -> requests.Response: """Call the Commons API.""" call_params = { @@ -75,3 +105,26 @@ def get_photo(filename: str) -> None: subprocess.run(["convert", "-resize", "1024x", save_to, thumb]) if filename.endswith("jpg") or filename.endswith("jpeg"): subprocess.run(["jpegoptim", "-S1048576", thumb]) + + +wikidata_properties = [ + ("website", "P856", "official website", None), + ("twitter", "P2002", "Twitter username", "https://twitter.com/$1"), + ("github", "P2037", "GitHub username", "https://github.com/$1"), + ( + "linkedin", + "P6634", + "LinkedIn personal profile ID", + "https://www.linkedin.com/in/$1/", + ), + ("mastodon_address", "P4033", "Mastodon address", None), + ("dblp", "P2456", "DBLP author ID", "https://dblp.org/pid/$1"), + ("blog_url", "P1581", "official blog URL", None), + ( + "hacker_news", + "P7171", + "Hacker News username", + "https://news.ycombinator.com/user?id=$1", + ), + ("reddit", "P4265", "Reddit username", "https://www.reddit.com/user/$1"), +]