Skip to content

Instantly share code, notes, and snippets.

@dbrgn
Created June 13, 2012 07:56
Show Gist options
  • Save dbrgn/2922648 to your computer and use it in GitHub Desktop.
Save dbrgn/2922648 to your computer and use it in GitHub Desktop.
ReStructuredText Youtube / Vimeo video embed directive
# -*- coding: utf-8 -*-
"""
ReST directive for embedding Youtube and Vimeo videos.
There are two directives added: ``youtube`` and ``vimeo``. The only
argument is the video id of the video to include.
Both directives have three optional arguments: ``height``, ``width``
and ``align``. Default height is 281 and default width is 500.
Example::
.. youtube:: anwy2MPT5RE
:height: 315
:width: 560
:align: left
:copyright: (c) 2012 by Danilo Bargen.
:license: BSD 3-clause
"""
from __future__ import absolute_import
from docutils import nodes
from docutils.parsers.rst import Directive, directives
def align(argument):
"""Conversion function for the "align" option."""
return directives.choice(argument, ('left', 'center', 'right'))
class IframeVideo(Directive):
has_content = False
required_arguments = 1
optional_arguments = 0
final_argument_whitespace = False
option_spec = {
'height': directives.nonnegative_int,
'width': directives.nonnegative_int,
'align': align,
}
default_width = 500
default_height = 281
def run(self):
self.options['video_id'] = directives.uri(self.arguments[0])
if not self.options.get('width'):
self.options['width'] = self.default_width
if not self.options.get('height'):
self.options['height'] = self.default_height
if not self.options.get('align'):
self.options['align'] = 'left'
return [nodes.raw('', self.html % self.options, format='html')]
class Youtube(IframeVideo):
html = '<iframe src="http://www.youtube.com/embed/%(video_id)s" \
width="%(width)u" height="%(height)u" frameborder="0" \
webkitAllowFullScreen mozallowfullscreen allowfullscreen \
class="align-%(align)s"></iframe>'
class Vimeo(IframeVideo):
html = '<iframe src="http://player.vimeo.com/video/%(video_id)s" \
width="%(width)u" height="%(height)u" frameborder="0" \
webkitAllowFullScreen mozallowfullscreen allowFullScreen \
class="align-%(align)s"></iframe>'
def setup(builder):
directives.register_directive('youtube', Youtube)
directives.register_directive('vimeo', Vimeo)
@seonman
Copy link

seonman commented Jul 2, 2015

Hi,
How can I add this to conf.py so that I can use it from my rst file?

@KeyWeeUsr
Copy link

@seonman Call setup() function which should (even in conf.py) register new classes that handle a non-standard RST directives such as youtube and vimeo from this file.

@jukent
Copy link

jukent commented Feb 26, 2021

Thank you for this directive. It worked for me. What are the allowable inputs for align? I tried center and there was no change.

@dbrgn
Copy link
Author

dbrgn commented Feb 26, 2021

@jukent hehe, nice that this is still being used 🙂

Alignment options are left, center and right. I don't know if it still works, you may need to adjust the code. I haven't used this in a long time.

@wsaihopfsg
Copy link

Suggest to update the iframe embed url from http to https, otherwise this error may pop up

MQTT.html:332 Mixed Content: The page at 'https://xxxxxxxx' was loaded over HTTPS, but requested an insecure frame 'http://www.youtube.com/embed/xxxxxxxxx'. This request has been blocked; the content must be served over HTTPS.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment