Skip to content

Commit

Permalink
Add media:content support to RSS
Browse files Browse the repository at this point in the history
refs #2263, #4888

- Adds media:content element to Ghost Rt pSS feeds containing the post cover image if one is available
- Removes the prepending of the image to the `<description>` field
- Keeps the prepending of the image in `<content:encoded>`
  • Loading branch information
ErisDS committed Apr 6, 2015
1 parent 6db9826 commit 14134fb
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 17 deletions.
40 changes: 28 additions & 12 deletions core/server/controllers/frontend.js
Expand Up @@ -505,7 +505,8 @@ frontendControllers = {
site_url: siteUrl,
ttl: '60',
custom_namespaces: {
content: 'http://purl.org/rss/1.0/modules/content/'
content: 'http://purl.org/rss/1.0/modules/content/',
media: 'http://search.yahoo.com/mrss/'
}
});

Expand All @@ -525,14 +526,11 @@ frontendControllers = {
url: config.urlFor('post', {post: post, permalinks: permalinks}, true),
date: post.published_at,
categories: _.pluck(post.tags, 'name'),
author: post.author ? post.author.name : null
author: post.author ? post.author.name : null,
custom_elements: []
},
htmlContent = cheerio.load(post.html, {decodeEntities: false});

if (post.image) {
htmlContent('p').first().before('<img src="' + post.image + '" />');
htmlContent('img').attr('alt', post.title);
}
htmlContent = cheerio.load(post.html, {decodeEntities: false}),
image;

// convert relative resource urls to absolute
['href', 'src'].forEach(function (attributeName) {
Expand Down Expand Up @@ -572,13 +570,31 @@ frontendControllers = {
});
});

item.custom_elements = [{
item.description = post.meta_description || downsize(htmlContent.html(), {words: 50});

if (post.image) {
image = config.urlFor('image', {image: post.image}, true);

// Add a media content tag
item.custom_elements.push({
'media:content': {
_attr: {
url: image,
medium: 'image'
}
}
});

// Also add the image to the content, because not all readers support media:content
htmlContent('p').first().before('<img src="' + image + '" />');
htmlContent('img').attr('alt', post.title);
}

item.custom_elements.push({
'content:encoded': {
_cdata: htmlContent.html()
}
}];

item.description = post.meta_description || downsize(htmlContent.html(), {words: 50});
});

feed.item(item);
});
Expand Down
14 changes: 9 additions & 5 deletions core/test/functional/routes/frontend_test.js
Expand Up @@ -443,7 +443,14 @@ describe('Frontend Routing', function () {
}).catch(done);
});

it('should use meta_description where available', function (done) {
it('should use meta_description and image where available', function (done) {
var post1End = 'you think :)</p>]]></content:encoded>',
post3Title = '<title><![CDATA[Short and Sweet]]>',
post3DescStart = '<description><![CDATA[test stuff',
post3ContentStart = '<content:encoded><![CDATA[<h2 id=\"testing\">testing</h2>\n\n' +
'<img src=\"http:\/\/placekitten.com\/500\/200\"',
post3Image = '<media:content url=\"http:\/\/placekitten.com\/500\/200\" medium=\"image\"\/>';

request.get('/rss/')
.expect('Content-Type', 'text/xml; charset=utf-8')
.expect('Cache-Control', testUtils.cacheRules['public'])
Expand All @@ -454,17 +461,14 @@ describe('Frontend Routing', function () {
}

var content = res.text,
post1End = 'you think :)</p>]]></content:encoded>',
post3Title = '<title><![CDATA[Short and Sweet\]\]>',
post3DescStart = '<description><![CDATA[test stuff',
post3ContentStart = '<content:encoded><![CDATA[<h2 id=\"testing\">testing</h2>',
endIndex = content.indexOf(post1End);

content.indexOf('<rss').should.be.above(0);
content.indexOf(post1End).should.be.above(0);
content.indexOf(post3Title).should.be.above(endIndex);
content.indexOf(post3DescStart).should.be.above(endIndex);
content.indexOf(post3ContentStart).should.be.above(endIndex);
content.indexOf(post3Image).should.be.above(endIndex);
content.indexOf('</rss>').should.be.above(0);

done();
Expand Down
1 change: 1 addition & 0 deletions core/test/utils/fixtures/data-generator.js
Expand Up @@ -23,6 +23,7 @@ DataGenerator.Content = {
slug: "short-and-sweet",
markdown: "## testing\n\nmctesters\n\n- test\n- line\n- items",
html: "<h2 id=\"testing\">testing</h2>\n\n<p>mctesters</p>\n\n<ul>\n<li>test</li>\n<li>line</li>\n<li>items</li>\n</ul>",
image: "http://placekitten.com/500/200",
meta_description: "test stuff",
published_at: new Date("2015-01-03")
},
Expand Down

0 comments on commit 14134fb

Please sign in to comment.