wikicommons.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """Wikimedia Commons (images)
  4. """
  5. from urllib.parse import urlencode
  6. # about
  7. about = {
  8. "website": 'https://commons.wikimedia.org/',
  9. "wikidata_id": 'Q565',
  10. "official_api_documentation": 'https://commons.wikimedia.org/w/api.php',
  11. "use_official_api": True,
  12. "require_api_key": False,
  13. "results": 'JSON',
  14. }
  15. base_url = "https://commons.wikimedia.org"
  16. search_prefix = (
  17. '?action=query'
  18. '&format=json'
  19. '&generator=search'
  20. '&gsrnamespace=6'
  21. '&gsrprop=snippet'
  22. '&prop=info|imageinfo'
  23. '&iiprop=url|size|mime'
  24. '&iiurlheight=180' # needed for the thumb url
  25. )
  26. paging = True
  27. number_of_results = 10
  28. def request(query, params):
  29. language = 'en'
  30. if params['language'] != 'all':
  31. language = params['language'].split('-')[0]
  32. args = {
  33. 'uselang': language,
  34. 'gsrlimit': number_of_results,
  35. 'gsroffset': number_of_results * (params["pageno"] - 1),
  36. 'gsrsearch': "filetype:bitmap|drawing " + query,
  37. }
  38. params["url"] = f"{base_url}/w/api.php{search_prefix}&{urlencode(args, safe=':|')}"
  39. return params
  40. def response(resp):
  41. results = []
  42. json = resp.json()
  43. if not json.get("query", {}).get("pages"):
  44. return results
  45. for item in json["query"]["pages"].values():
  46. imageinfo = item["imageinfo"][0]
  47. title = item["title"].replace("File:", "").rsplit('.', 1)[0]
  48. result = {
  49. 'url': imageinfo["descriptionurl"],
  50. 'title': title,
  51. 'content': item["snippet"],
  52. 'img_src': imageinfo["url"],
  53. 'img_format': f'{imageinfo["width"]} x {imageinfo["height"]}',
  54. 'thumbnail_src': imageinfo["thumburl"],
  55. 'template': 'images.html',
  56. }
  57. results.append(result)
  58. return results