forked from varia/varia.website
many many many Varia's websites, work in progress: https://many.vvvvvvaria.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.3 KiB
77 lines
2.3 KiB
7 years ago
|
"""
|
||
|
Video Tag
|
||
|
---------
|
||
|
This implements a Liquid-style video tag for Pelican,
|
||
|
based on the octopress video tag [1]_
|
||
|
|
||
|
Syntax
|
||
|
------
|
||
|
{% video url/to/video [width height] [url/to/poster] %}
|
||
|
|
||
|
Example
|
||
|
-------
|
||
|
{% video http://site.com/video.mp4 100% 480 http://site.com/poster-frame.jpg %}
|
||
|
|
||
|
Output
|
||
|
------
|
||
|
<span class="videobox">
|
||
|
<video width='100%' height='480' preload='none' controls poster='http://site.com/poster-frame.jpg'>
|
||
|
<source src='http://site.com/video.mp4' type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'/>
|
||
|
</video>
|
||
|
</span>
|
||
|
|
||
|
[1] https://github.com/imathis/octopress/blob/master/plugins/video_tag.rb
|
||
|
"""
|
||
|
import os
|
||
|
import re
|
||
|
from .mdx_liquid_tags import LiquidTags
|
||
|
|
||
|
SYNTAX = "{% video url/to/video [url/to/video] [url/to/video] [width height] [url/to/poster] %}"
|
||
|
|
||
|
VIDEO = re.compile(r'(/\S+|https?:\S+)(\s+(/\S+|https?:\S+))?(\s+(/\S+|https?:\S+))?(\s+(\d+\%?)\s(\d+\%?))?(\s+(/\S+|https?:\S+))?')
|
||
|
|
||
|
VID_TYPEDICT = {'.mp4':"type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'",
|
||
|
'.ogv':"type='video/ogg; codecs=theora, vorbis'",
|
||
|
'.webm':"type='video/webm; codecs=vp8, vorbis'"}
|
||
|
|
||
|
|
||
|
@LiquidTags.register('video')
|
||
|
def video(preprocessor, tag, markup):
|
||
|
videos = []
|
||
|
width = None
|
||
|
height = None
|
||
|
poster = None
|
||
|
|
||
|
match = VIDEO.search(markup)
|
||
|
if match:
|
||
|
groups = match.groups()
|
||
|
videos = [g for g in groups[0:6:2] if g]
|
||
|
width = groups[6]
|
||
|
height = groups[7]
|
||
|
poster = groups[9]
|
||
|
|
||
|
if any(videos):
|
||
|
video_out = """
|
||
|
<span class="videobox">
|
||
|
<video width="{width}" height="{height}" preload="none" controls poster="{poster}">
|
||
|
""".format(width=width, height=height, poster=poster).strip()
|
||
|
|
||
|
for vid in videos:
|
||
|
base, ext = os.path.splitext(vid)
|
||
|
if ext not in VID_TYPEDICT:
|
||
|
raise ValueError("Unrecognized video extension: "
|
||
|
"{0}".format(ext))
|
||
|
video_out += ("<source src='{0}' "
|
||
|
"{1}>".format(vid, VID_TYPEDICT[ext]))
|
||
|
video_out += "</video></span>"
|
||
|
else:
|
||
|
raise ValueError("Error processing input, "
|
||
|
"expected syntax: {0}".format(SYNTAX))
|
||
|
|
||
|
return video_out
|
||
|
|
||
|
|
||
|
#----------------------------------------------------------------------
|
||
|
# This import allows image tag to be a Pelican plugin
|
||
|
from liquid_tags import register
|