58

I just started blogging using jekyll. I write my posts in markdown. Now, I want to include a youtube video in my post. How can I do this?

Also, I dont really like the pygments highlighting provided by jekyll by default. Is there anyway I can change this to some other style? If yes, can you point me to some nice styles/plugins?

jacksparrow007
  • 1,168
  • 3
  • 17
  • 29
  • 4
    if you have two questions like this, it's best for the Stack Overflow community if you make each an individual post. It will also help you get better answers because each one will be targeted directly to the specific question. – Alan W. Smith May 10 '12 at 12:20

6 Answers6

74

You should be able to put the HTML for embedding directly into your markdown. Under the video, there is a "Share" button, click on this, and then the "Embed" button, which should give you something that looks a little like:

<iframe width="420" height="315" src="http://www.youtube.com/embed/dQw4w9WgXcQ" frameborder="0" allowfullscreen></iframe>

Just copy and paste that into your post, the Markdown preprocessor won't touch it.


For Pygments, there is a whole pile of CSS stylesheets for various colour themes in this repository, you could experiment with them. (Note that you will have to replace .codehilite with .highlight for these to work with Jekyll.)

Mosh Feu
  • 24,625
  • 12
  • 74
  • 111
huon
  • 74,878
  • 14
  • 199
  • 204
  • 11
    The embedded iframe works out of the box and should work with most plugins. However, I've found one (the category page generator from http://recursive-design.com/projects/jekyll-plugins/) that has problems with it. The fix in that case is to put a space between the open and closing iframe tags. If anyone has problems with embedding, that's worth a shot. – Alan W. Smith May 10 '12 at 13:28
  • @AlanW.Smith Thanks Alan, you sorted a bug that had caused me an hours worth of head scratching with a single space character :) – SecretDeveloper Jul 21 '13 at 11:54
  • I kept getting `malformed XML: missing tag start` errors. Seemed to be coming from the allowfullscreen attribute. I tried added allowfullscreen="true" and it compiled but didn't close the iframe tag properly and swallowed the rest of the document. – speg May 17 '14 at 03:21
  • @dbaupp I ended up doing: `` (Note that character between the iframe tags, adding this allowed the closing iframe tag to be rendered properly) – speg May 31 '14 at 12:42
  • 1
    My iframe also didn't work initially and I noticed I hadn't quoted the values of the attributes. Once I added the double-quotes it worked. Just FYI. – lionello May 03 '15 at 17:03
33

I did similar thing but in my case, simple copy and paste doesn't work. The error message is below:

REXML could not parse this XML/HTML:

To avoid this error, I deleted allowfullscreen from copied source as below:

<iframe width="480" height="360" src="http://www.youtube.com/embed/WO82PoAczTc" frameborder="0"> </iframe>

It is important that Adding a whitespace before the closing </iframe>.

Then, I succeeded to embed the video into my site.

Mosh Feu
  • 24,625
  • 12
  • 74
  • 111
Feel Physics
  • 2,773
  • 4
  • 22
  • 36
  • 2
    I encounter the same issue on a page with 3 videos on github pages. Removing the `allowfullscreen` help to display the first video but it hides everything after (other video, text, footer ...). Adding a whitespace before the closing `` done the job. – magdmartin Jan 02 '13 at 14:48
  • 10
    I ran into this problem on github pages. Making things XHTML by changing `allowfullscreen` to `allowfullscreen="allowfullscreen"` worked for me. – bwest Feb 24 '13 at 23:24
  • 1
    `allowfullscreen="1"` worked for me. Seems the parser just doesn't appreciate attributes with no values. – Kurt Emch Apr 14 '13 at 22:24
  • @magdmartin: Thanks for the hint about the whitespace. This resolved my issue to embed a Prezi presentation into a Jekyll post! – orschiro Nov 13 '13 at 07:56
15

The html code to insert a youtube video can be produced in Jekyll using a simple plugin as described in https://gist.github.com/1805814.

The syntax becomes as simple as:

{% youtube oHg5SJYRHA0 %}
Etienne
  • 13,700
  • 3
  • 22
  • 29
  • This is a great tip, although the plugin too suffers from the problems posted in the question. I've forked the plugin and applied the changes suggested in the answers to this question: https://gist.github.com/serra/5574343 – Marijn May 14 '13 at 07:56
  • @Marijn Is it possible to move this from a gist to a full repo? Would be quite handy then. thanks – Mat Benfield Jul 14 '14 at 20:45
  • I am getting an error from github ''The tag youtube in _posts/2015-08-06-my-new-blo-on-jekyll.markdown/#excerpt is not a recognized Liquid tag" –  Aug 06 '15 at 17:58
  • This is pretty handy, Hexo use the same logic for embedding Youtube video. – X.Creates Apr 06 '16 at 10:55
6

In my case issue has been resolved with jQuery:

jQuery

$('.x-frame.video').each(function() {
  $(this).after("<iframe class=\"video\" src=\"" + ($(this).attr('data-video')) + "\" frameborder=\"0\"></iframe>");
});

Usage

<div class="x-frame video" data-video="http://player.vimeo.com/video/52302939"> </div>

Note that whitespace is required between <div> </div>

Helga Konly
  • 61
  • 1
  • 3
3

One of the nicer features of WordPres is that you can just paste a Youtube URL in the content (on a new line) and WordPress transforms this into an embed code.

The following code does the same for Jekyll. Just put this code in your footer (or use a Jekyll include) and all paragraphs with JUST a Youtube URL are automagically converted to responsive Youtube embeds by Vanilla JS.

<style>
.videoWrapper {position: relative; padding-bottom: 56.333%; height: 0;}
.videoWrapper iframe {position: absolute; top: 0; left: 0; width: 100%; height: 100%;}    
</style>

<script>
function getId(url) {
    var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
    var match = url.match(regExp);
    if (match && match[2].length == 11) {
        return match[2];
    } else {
        return 'error';
    }
}
function yt_url2embed() {
    var p = document.getElementsByTagName('p');
    for(var i = 0; i < p.length; i++) {
        var pattern = /^((http|https|ftp):\/\/)/;
        if(pattern.test(p[i].innerHTML)) {
            var myId = getId(p[i].innerHTML);
            p[i].innerHTML = '<div class="videoWrapper"><iframe width="720" height="420" src="https://www.youtube.com/embed/' + myId + '?rel=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe></div>';
        }
    }
}
yt_url2embed();
</script>

Although just adding the HTML code to your Markdown is a very good (maybe even better) and valid solution, this solution might be more user-friendly.

(Source)

JoostS
  • 9,344
  • 3
  • 27
  • 50
2

How often did you find yourself googling "How to embed a video in markdown?"

While its not possible to embed a video in markdown, the best and easiest way is to extract a frame from the video. To add videos to your markdown files easier, I think the jekyll plugin below would help you, and it will parse the video link inside the image block automatically.

jekyll-spaceship - A Jekyll plugin to provide powerful supports for table, mathjax, plantuml, emoji, youtube, vimeo,dailymotion, etc.

https://github.com/jeffreytse/jekyll-spaceship

For now, these video links parsing are provided:

  • Youtube
  • Vimeo
  • DailyMotion
  • ...

There are two ways to embed a video in your Jekyll blog page:

Inline-style:

![]({video-link})

Reference-style:

![][{reference}]

[{reference}]: {video-link}

Then, you succeeded to embed the video into your site.

J.T.
  • 369
  • 3
  • 10