in common/app/common/TrailsToRss.scala [59:154]
def apply(metaData: MetaData, content: Seq[Content])(implicit request: RequestHeader): String =
TrailsToRss(Some(metaData.webTitle), content, Some(metaData.url), metaData.description)
def apply(
title: Option[String],
content: Seq[Content],
url: Option[String] = None,
description: Option[String] = None,
)(implicit
request: RequestHeader,
): String = {
val feedTitle = title.map(t => s"$t | The Guardian").getOrElse("The Guardian")
// Feed
val feed = new SyndFeedImpl
feed.setFeedType("rss_2.0")
feed.setTitle(feedTitle)
feed.setDescription(
description.getOrElse("Latest news and features from theguardian.com, the world's leading liberal voice"),
)
feed.setLink("https://www.theguardian.com" + url.getOrElse(""))
feed.setLanguage("en-gb")
feed.setCopyright(
s"Guardian News & Media Limited or its affiliated companies. All rights reserved. ${RssDates
.getYear(new Date())}",
)
feed.setImage(image)
feed.setPublishedDate(new Date())
feed.setEncoding("utf-8")
// Feed: entries
val entries = content.map { content =>
val trail = content.trail
// Entry: categories
val categories = trail.tags.keywords.map { tag =>
val category = new SyndCategoryImpl
category.setName(tag.name)
category.setTaxonomyUri(tag.metadata.webUrl)
category
}.asJava
// Entry: description
val standfirst = trail.fields.standfirst.getOrElse("")
val intro = introFromContent(content)
val description = makeEntryDescriptionUsing(standfirst, intro, trail.metadata.webUrl)
val mediaModules: Seq[MediaEntryModuleImpl] = for {
profile: ImageProfile <- List(Item140, Item460)
trailPicture: ImageMedia <- trail.trailPicture
trailAsset: ImageAsset <- profile.bestFor(trailPicture)
resizedImage <- profile.bestSrcFor(trailPicture)
} yield {
// create media
val media = new MediaContent(new UrlReference(resizedImage))
profile.width.foreach(media.setWidth(_))
profile.height.foreach(media.setHeight(_))
trailAsset.mimeType.foreach(media.setType)
// create image's metadata
val imageMetadata = new Metadata()
trailAsset.caption.foreach({ d => imageMetadata.setDescription(stripInvalidXMLCharacters(d)) })
trailAsset.credit.foreach { creditName =>
val credit = new Credit(null, null, stripInvalidXMLCharacters(creditName))
imageMetadata.setCredits(Seq(credit).toArray)
}
media.setMetadata(imageMetadata)
// create image module
val module = new MediaEntryModuleImpl()
module.setMediaContents(Seq(media).toArray)
module
}
// Entry: DublinCore
val dc = new DCModuleImpl
dc.setDate(trail.webPublicationDate.toDate)
dc.setCreator(trail.byline.getOrElse("Guardian Staff"))
// Entry
val entry = new SyndEntryImpl
entry.setTitle(stripInvalidXMLCharacters(trail.fields.linkText))
entry.setLink(trail.metadata.webUrl)
entry.setDescription(description)
entry.setCategories(categories)
entry.setModules(new java.util.ArrayList((mediaModules ++ Seq(dc)).asJava))
entry
}.asJava
feed.setEntries(entries)
val writer = new StringWriter()
val output = new SyndFeedOutput()
output.output(feed, writer)
writer.close()
writer.toString
}