Da ich in den letzten Tagen meinen Blog auf Jekyll umgebaut habe, habe ich mich natürlich auch mit dem von Jekyll erzeugten RSS-Feed auseinandergesetzt. Dabei fiel mir auf, dass Bilder nur im Lauftext eingebunden werden, also weder <media:thumbnail …> noch <enclosure …> Tags hinzugefügt werden.

Während erstere noch recht einfach mittels

<media:thumbnail url="{{ post.images[0].url | prepend: site.baseurl | prepend: site.url }}" />

hinzugefügt werden können, sieht das ganze für <enclosure …> Tags schon etwas anders aus, da die Länge der Datei in Bytes und der Mime-Type zwingend benötigt werden. Da ich im Internet nichts dazu gefunden habe (erstaunlicherweise!), habe ich mir direkt mal daran versucht, ein Jekyll-Plugin zu schreiben. Es ist das erste Mal, dass ich etwas in Ruby geschrieben habe, ich bin also offen für alle Verbesserungsvorschläge. Ansonsten kann es natürlich gerne für die eigenen Zwecke verwendet werden!

require "mimemagic"

module Jekyll
	class RSSEnclosureTag < Liquid::Tag
		def initialize(tag_name, text, tokens)
			super
			@text = text
		end
		
		def render(context)
			file = context[@text] || @text
			xml = ""
			baseurl = context.registers[:site].config['url'] + context.registers[:site].baseurl
			if File.exist?("." + file)
				xml << "<enclosure url='#{baseurl + file}' length='#{File.stat("." + file).size}' type='#{MimeMagic.by_magic(File.open("." + file))}' />"
			end
			xml
		end
	end
end

Liquid::Template.register_tag('rss_enclosure', Jekyll::RSSEnclosureTag)

Eingebunden wird das ganze dann mit

{% rss_enclosure {{ post.images[0].url }} %}

in der feed.xml. Offensichtlich wird das mimemagic-Gem benötigt, ansonsten sollte alles so funktionieren, zumindest tut es das für mich.

Ich frage vorher noch ab, ob der Beitrag überhaupt ein Bild enthält, sodass sich insgesamt folgender Code ergibt:

{% if post.images %}
	<media:thumbnail url="{{ post.images[0].url | prepend: site.baseurl | prepend: site.url }}" />
	{% rss_enclosure {{ post.images[0].url }} %}
{% endif %}

Viel Spaß damit!