|
@@ -0,0 +1,59 @@
|
|
|
+"""
|
|
|
+Soundcloud Tag
|
|
|
+--------------
|
|
|
+This implements a Liquid-style soundcloud tag for Pelican.
|
|
|
+
|
|
|
+It asks the official Soundcloud-API for the widget html code.
|
|
|
+
|
|
|
+Syntax
|
|
|
+------
|
|
|
+`{% soundcloud track_url %}`
|
|
|
+
|
|
|
+Example
|
|
|
+-------
|
|
|
+`{% soundcloud https://soundcloud.com/luftmentsh/hakotel %}`
|
|
|
+
|
|
|
+Output
|
|
|
+------
|
|
|
+`<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>`
|
|
|
+"""
|
|
|
+from .mdx_liquid_tags import LiquidTags
|
|
|
+import re
|
|
|
+import json
|
|
|
+try:
|
|
|
+ from urllib.request import urlopen
|
|
|
+except ImportError:
|
|
|
+ from urllib import urlopen
|
|
|
+
|
|
|
+
|
|
|
+SYNTAX = '{% soundcloud track_url %}'
|
|
|
+PARSE_SYNTAX = re.compile(r'(?P<track_url>https?://soundcloud.com/[\S]+)')
|
|
|
+
|
|
|
+
|
|
|
+def get_widget(track_url):
|
|
|
+ r = urlopen(
|
|
|
+ 'http://soundcloud.com/oembed',
|
|
|
+ data='format=json&url={}'.format(track_url).encode('utf-8'))
|
|
|
+
|
|
|
+ return json.loads(r.read().decode('utf-8'))['html']
|
|
|
+
|
|
|
+
|
|
|
+def match_it(markup):
|
|
|
+ match = PARSE_SYNTAX.search(markup)
|
|
|
+ if match:
|
|
|
+ return match.groupdict()
|
|
|
+ else:
|
|
|
+ raise ValueError('Error processing input. '
|
|
|
+ 'Expected syntax: {}'.format(SYNTAX))
|
|
|
+
|
|
|
+
|
|
|
+@LiquidTags.register('soundcloud')
|
|
|
+def soundcloud(preprocessor, tag, markup):
|
|
|
+ track_url = match_it(markup)['track_url']
|
|
|
+
|
|
|
+ return get_widget(track_url)
|
|
|
+
|
|
|
+
|
|
|
+# ---------------------------------------------------
|
|
|
+# This import allows image tag to be a Pelican plugin
|
|
|
+from liquid_tags import register
|