aggregate enclosures

aggregate: When a feed has an enclosure that is an image, audio, or video,
include the enclosure in the generated page.

The enclosure is hotlinked from the original feed, not copied.

My use case is to include a mastodon rss feed in amoung other rss feeds for
users who don't use mastodon. It could also be used to aggregate together
podcasts, etc.

Other enclosure types than image, audio, video, could be added, perhaps
a generic one? But these are the main ones.

The template uses 50% width for image and video, because often
attachments are in a high resolution, which will default to being
perhaps too wide for the page, or taking up a lot of vertical space. By
making it take up at most half the page width, that is avoided, while
also leaving room for any sidebar.

Sponsored-by: Shae Erisson on Patreon
master
Joey Hess 2021-12-25 12:58:24 -04:00
parent e8432b28ac
commit 7591cf7776
No known key found for this signature in database
GPG Key ID: DB12DB0FF05F8F38
3 changed files with 30 additions and 0 deletions

View File

@ -1,3 +1,10 @@
ikiwiki (3.20200202.4) UNRELEASED; urgency=medium
* aggregate: When a feed has an enclosure that is an image, audio, or
video, include the enclosure in the generated page.
-- Joey Hess <id@joeyh.name> Sat, 25 Dec 2021 12:41:34 -0400
ikiwiki (3.20200202.3) upstream; urgency=medium
[ Amitai Schleier ]

View File

@ -590,6 +590,10 @@ sub aggregate (@) {
title => defined $entry->title ? decode_entities($entry->title) : "untitled",
author => defined $entry->author ? decode_entities($entry->author) : "",
link => $entry->link,
enclosureurl => defined $entry->enclosure ? $entry->enclosure->url : "",
enclosureimage => (defined $entry->enclosure && $entry->enclosure->type =~ m/image\//) ? "1" : "",
enclosureaudio => (defined $entry->enclosure && $entry->enclosure->type =~ m/audio\//) ? "1" : "",
enclosurevideo => (defined $entry->enclosure && $entry->enclosure->type =~ m/video\//) ? "1" : "",
content => (defined $c && defined $c->body) ? $c->body : "",
guid => defined $entry->id ? $entry->id : time."_".$feed->{name},
ctime => $entry->issued ? ($entry->issued->epoch || time) : time,
@ -700,6 +704,14 @@ sub write_page ($$$$$) {
if defined $params{copyright} && length $params{copyright};
$template->param(permalink => IkiWiki::urlabs($params{link}, $feed->{feedurl}))
if defined $params{link};
$template->param(enclosureurl => $params{enclosureurl})
if defined $params{enclosureurl} && length $params{enclosureurl};
$template->param(enclosureimage => $params{enclosureimage})
if defined $params{enclosureimage} && length $params{enclosureimage};
$template->param(enclosureaudio => $params{enclosureaudio})
if defined $params{enclosureaudio} && length $params{enclosureaudio};
$template->param(enclosurevideo => $params{enclosurevideo})
if defined $params{enclosurevideo} && length $params{enclosurevideo};
if (ref $feed->{tags}) {
$template->param(tags => [map { tag => $_ }, @{$feed->{tags}}]);
}

View File

@ -1,4 +1,15 @@
<TMPL_VAR CONTENT>
<TMPL_IF ENCLOSUREURL>
<TMPL_IF ENCLOSUREIMAGE>
<img src="<TMPL_VAR ENCLOSUREURL ESCAPE=HTML>" width="50%" />
</TMPL_IF>
<TMPL_IF ENCLOSUREAUDIO>
<audio controls src="<TMPL_VAR ENCLOSUREURL ESCAPE=HTML>" />
</TMPL_IF>
<TMPL_IF ENCLOSUREVIDEO>
<video controls src="<TMPL_VAR ENCLOSUREURL ESCAPE=HTML>" width="50%" />
</TMPL_IF>
</TMPL_IF>
<TMPL_LOOP TAGS>
[[!tag <TMPL_VAR TAG>]]
</TMPL_LOOP>