audio.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. '.opus': 'audio/ogg',
  25. '.wav': 'audio/wav',
  26. '.mp4': 'audio/mp4'}
  27. def create_html(markup):
  28. match = AUDIO.search(markup)
  29. if match:
  30. groups = match.groups()
  31. audio_files = [g for g in groups if g]
  32. if any(audio_files):
  33. audio_out = '<audio controls>'
  34. for audio_file in audio_files:
  35. base, ext = os.path.splitext(audio_file)
  36. if ext not in AUDIO_TYPEDICT:
  37. raise ValueError("Unrecognized audio extension: "
  38. "{0}".format(ext))
  39. # add audio source
  40. audio_out += '<source src="{}" type="{}">'.format(
  41. audio_file, AUDIO_TYPEDICT[ext])
  42. # close audio tag
  43. audio_out += 'Your browser does not support the audio element.'
  44. audio_out += '</audio>'
  45. else:
  46. raise ValueError("Error processing input, "
  47. "expected syntax: {0}".format(SYNTAX))
  48. return audio_out
  49. @LiquidTags.register('audio')
  50. def audio(preprocessor, tag, markup):
  51. return create_html(markup)
  52. # ---------------------------------------------------
  53. # This import allows image tag to be a Pelican plugin
  54. from liquid_tags import register