soundcloud.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. """
  2. Soundcloud (Music)
  3. @website https://soundcloud.com
  4. @provide-api yes (https://developers.soundcloud.com/)
  5. @using-api yes
  6. @results JSON
  7. @stable yes
  8. @parse url, title, content, publishedDate, embedded
  9. """
  10. from json import loads
  11. from urllib import urlencode, quote_plus
  12. from dateutil import parser
  13. # engine dependent config
  14. categories = ['music']
  15. paging = True
  16. # api-key
  17. guest_client_id = 'b45b1aa10f1ac2941910a7f0d10f8e28'
  18. # search-url
  19. url = 'https://api.soundcloud.com/'
  20. search_url = url + 'search?{query}'\
  21. '&facet=model'\
  22. '&limit=20'\
  23. '&offset={offset}'\
  24. '&linked_partitioning=1'\
  25. '&client_id={client_id}' # noqa
  26. embedded_url = '<iframe width="100%" height="166" ' +\
  27. 'scrolling="no" frameborder="no" ' +\
  28. 'data-src="https://w.soundcloud.com/player/?url={uri}"></iframe>'
  29. # do search-request
  30. def request(query, params):
  31. offset = (params['pageno'] - 1) * 20
  32. params['url'] = search_url.format(query=urlencode({'q': query}),
  33. offset=offset,
  34. client_id=guest_client_id)
  35. return params
  36. # get response from search-request
  37. def response(resp):
  38. results = []
  39. search_res = loads(resp.text)
  40. # parse results
  41. for result in search_res.get('collection', []):
  42. if result['kind'] in ('track', 'playlist'):
  43. title = result['title']
  44. content = result['description']
  45. publishedDate = parser.parse(result['last_modified'])
  46. uri = quote_plus(result['uri'])
  47. embedded = embedded_url.format(uri=uri)
  48. # append result
  49. results.append({'url': result['permalink_url'],
  50. 'title': title,
  51. 'publishedDate': publishedDate,
  52. 'embedded': embedded,
  53. 'content': content})
  54. # return results
  55. return results