wikicommons.py 1.8 KB

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