Skip to content

Instantly share code, notes, and snippets.

Created June 13, 2012 07:56
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • 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.
.. 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="" \
width="%(width)u" height="%(height)u" frameborder="0" \
webkitAllowFullScreen mozallowfullscreen allowfullscreen \
class Vimeo(IframeVideo):
html = '<iframe src="" \
width="%(width)u" height="%(height)u" frameborder="0" \
webkitAllowFullScreen mozallowfullscreen allowFullScreen \
def setup(builder):
directives.register_directive('youtube', Youtube)
directives.register_directive('vimeo', Vimeo)
Copy link

seonman commented Jul 2, 2015

How can I add this to so that I can use it from my rst file?

Copy link

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

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.

Copy link

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.

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 ''. 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