genius.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. # pylint: disable=invalid-name, missing-function-docstring
  4. """Genius
  5. """
  6. from json import loads
  7. from urllib.parse import urlencode
  8. from datetime import datetime
  9. # about
  10. about = {
  11. "website": 'https://genius.com/',
  12. "wikidata_id": 'Q3419343',
  13. "official_api_documentation": 'https://docs.genius.com/',
  14. "use_official_api": True,
  15. "require_api_key": False,
  16. "results": 'JSON',
  17. }
  18. # engine dependent config
  19. categories = ['music']
  20. paging = True
  21. page_size = 5
  22. url = 'https://genius.com/api/'
  23. search_url = url + 'search/{index}?{query}&page={pageno}&per_page={page_size}'
  24. def request(query, params):
  25. params['url'] = search_url.format(
  26. query=urlencode({'q': query}),
  27. index='multi',
  28. page_size=page_size,
  29. pageno=params['pageno'],
  30. )
  31. return params
  32. def parse_lyric(hit):
  33. try:
  34. content = hit['highlights'][0]['value']
  35. except Exception as e: # pylint: disable=broad-except
  36. logger.error(e, exc_info=True)
  37. content = ''
  38. timestamp = hit['result']['lyrics_updated_at']
  39. result = {
  40. 'url': hit['result']['url'],
  41. 'title': hit['result']['full_title'],
  42. 'content': content,
  43. 'thumbnail': hit['result']['song_art_image_thumbnail_url'],
  44. }
  45. if timestamp:
  46. result.update({'publishedDate': datetime.fromtimestamp(timestamp)})
  47. return result
  48. def parse_artist(hit):
  49. result = {
  50. 'url': hit['result']['url'],
  51. 'title': hit['result']['name'],
  52. 'content': '',
  53. 'thumbnail': hit['result']['image_url'],
  54. }
  55. return result
  56. def parse_album(hit):
  57. result = {
  58. 'url': hit['result']['url'],
  59. 'title': hit['result']['full_title'],
  60. 'thumbnail': hit['result']['cover_art_url'],
  61. 'content': '',
  62. }
  63. try:
  64. year = hit['result']['release_date_components']['year']
  65. except Exception as e: # pylint: disable=broad-except
  66. logger.error(e, exc_info=True)
  67. else:
  68. if year:
  69. result.update({'content': 'Released: {}'.format(year)})
  70. return result
  71. parse = {'lyric': parse_lyric, 'song': parse_lyric, 'artist': parse_artist, 'album': parse_album}
  72. def response(resp):
  73. results = []
  74. json = loads(resp.text)
  75. hits = [hit for section in json['response']['sections'] for hit in section['hits']]
  76. for hit in hits:
  77. func = parse.get(hit['type'])
  78. if func:
  79. results.append(func(hit))
  80. return results