soundcloud.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. """
  2. Soundcloud Tag
  3. --------------
  4. This implements a Liquid-style soundcloud tag for Pelican.
  5. It asks the official Soundcloud-API for the widget html code.
  6. Syntax
  7. ------
  8. `{% soundcloud track_url %}`
  9. Example
  10. -------
  11. `{% soundcloud https://soundcloud.com/luftmentsh/hakotel %}`
  12. Output
  13. ------
  14. `<iframe width="100%" height="400" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?visual=true&url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F33875102&show_artwork=true"></iframe>`
  15. """
  16. from .mdx_liquid_tags import LiquidTags
  17. import re
  18. import json
  19. try:
  20. from urllib.request import urlopen
  21. except ImportError:
  22. from urllib import urlopen
  23. SYNTAX = '{% soundcloud track_url %}'
  24. PARSE_SYNTAX = re.compile(r'(?P<track_url>https?://soundcloud.com/[\S]+)')
  25. def get_widget(track_url):
  26. r = urlopen(
  27. 'http://soundcloud.com/oembed',
  28. data='format=json&url={}'.format(track_url).encode('utf-8'))
  29. return json.loads(r.read().decode('utf-8'))['html']
  30. def match_it(markup):
  31. match = PARSE_SYNTAX.search(markup)
  32. if match:
  33. return match.groupdict()
  34. else:
  35. raise ValueError('Error processing input. '
  36. 'Expected syntax: {}'.format(SYNTAX))
  37. @LiquidTags.register('soundcloud')
  38. def soundcloud(preprocessor, tag, markup):
  39. track_url = match_it(markup)['track_url']
  40. return get_widget(track_url)
  41. # ---------------------------------------------------
  42. # This import allows image tag to be a Pelican plugin
  43. from liquid_tags import register