yandex_music.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """Yandex Music
  4. .. _Countries where Yandex.Music is available: https://yandex.com/support/music/access.html
  5. .. hint::
  6. Access to music is limited to a few countries: `Countries where Yandex.Music
  7. is available`_
  8. """
  9. from urllib.parse import urlencode
  10. # about
  11. about = {
  12. "website": 'https://music.yandex.ru',
  13. "wikidata_id": 'Q4537983',
  14. "official_api_documentation": None,
  15. "use_official_api": False,
  16. "require_api_key": False,
  17. "results": 'JSON',
  18. }
  19. # engine dependent config
  20. categories = ['music']
  21. paging = True
  22. # search-url
  23. url = 'https://music.yandex.ru'
  24. search_url = url + '/handlers/music-search.jsx'
  25. # do search-request
  26. def request(query, params):
  27. args = {'text': query, 'page': params['pageno'] - 1}
  28. params['url'] = search_url + '?' + urlencode(args)
  29. return params
  30. # get response from search-request
  31. def response(resp):
  32. results = []
  33. search_res = resp.json()
  34. # parse results
  35. for result in search_res.get('tracks', {}).get('items', []):
  36. if result['type'] == 'music':
  37. track_id = result['id']
  38. album_id = result['albums'][0]['id']
  39. # append result
  40. results.append(
  41. {
  42. 'url': f'{url}/album/{album_id}/track/{track_id}',
  43. 'title': result['title'],
  44. 'content': f"[{result['albums'][0]['title']}] {result['artists'][0]['name']} - {result['title']}",
  45. 'iframe_src': f'{url}/iframe/track/{track_id}/{album_id}',
  46. }
  47. )
  48. return results