audio.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. """
  2. Audio Tag
  3. ---------
  4. This implements a Liquid-style audio tag for Pelican,
  5. based on the pelican video plugin [1]_
  6. Syntax
  7. ------
  8. {% audio url/to/audio [url/to/audio] [/url/to/audio] %}
  9. Example
  10. -------
  11. {% audio http://example.tld/foo.mp3 http://example.tld/foo.ogg %}
  12. Output
  13. ------
  14. <audio controls><source src="http://example.tld/foo.mp3" type="audio/mpeg"><source src="http://example.tld/foo.ogg" type="audio/ogg">Your browser does not support the audio element.</audio>
  15. [1] https://github.com/getpelican/pelican-plugins/blob/master/liquid_tags/video.py
  16. """
  17. import os
  18. import re
  19. from .mdx_liquid_tags import LiquidTags
  20. SYNTAX = "{% audio url/to/audio [url/to/audio] [/url/to/audio] %}"
  21. AUDIO = re.compile(r'(/\S+|https?:\S+)(?:\s+(/\S+|https?:\S+))?(?:\s+(/\S+|https?:\S+))?')
  22. AUDIO_TYPEDICT = {'.mp3': 'audio/mpeg',
  23. '.ogg': 'audio/ogg',
  24. '.oga': 'audio/ogg',
  25. '.opus': 'audio/ogg',
  26. '.wav': 'audio/wav',
  27. '.mp4': 'audio/mp4'}
  28. def create_html(markup):
  29. match = AUDIO.search(markup)
  30. if match:
  31. groups = match.groups()
  32. audio_files = [g for g in groups if g]
  33. if any(audio_files):
  34. audio_out = '<audio controls>'
  35. for audio_file in audio_files:
  36. base, ext = os.path.splitext(audio_file)
  37. if ext not in AUDIO_TYPEDICT:
  38. raise ValueError("Unrecognized audio extension: "
  39. "{0}".format(ext))
  40. # add audio source
  41. audio_out += '<source src="{}" type="{}">'.format(
  42. audio_file, AUDIO_TYPEDICT[ext])
  43. # close audio tag
  44. audio_out += 'Your browser does not support the audio element.'
  45. audio_out += '</audio>'
  46. else:
  47. raise ValueError("Error processing input, "
  48. "expected syntax: {0}".format(SYNTAX))
  49. return audio_out
  50. @LiquidTags.register('audio')
  51. def audio(preprocessor, tag, markup):
  52. return create_html(markup)
  53. # ---------------------------------------------------
  54. # This import allows image tag to be a Pelican plugin
  55. from liquid_tags import register