in common/app/common/TrailsToRss.scala [174:262]
def fromFaciaContent(
webTitle: String,
faciaContentList: Seq[PressedStory],
url: String,
description: Option[String] = None,
)(implicit request: RequestHeader): String = {
// Feed
val feed = new SyndFeedImpl
feed.setFeedType("rss_2.0")
feed.setTitle(webTitle)
feed.setDescription(
description.getOrElse("Latest news and features from theguardian.com, the world's leading liberal voice"),
)
feed.setLink("https://www.theguardian.com" + url)
feed.setLanguage("en-gb")
feed.setCopyright(
s"Guardian News and 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 = faciaContentList.map { faciaContent =>
// Entry: categories
val categories = faciaContent.tags.keywords.map { tag =>
val category = new SyndCategoryImpl
category.setName(tag.name)
category.setTaxonomyUri(tag.metadata.webUrl)
category
}.asJava
// Entry: description
val standfirst = faciaContent.fields.standfirst.getOrElse("")
val intro = faciaContent.fields.body
val webUrl = faciaContent.metadata.webUrl
val description = makeEntryDescriptionUsing(standfirst, intro, webUrl)
val mediaModules: Seq[MediaEntryModuleImpl] = for {
profile: ImageProfile <- List(Item140, Item460)
trailPicture: ImageMedia <- faciaContent.trail.trailPicture
trailAsset: ImageAsset <- profile.bestFor(trailPicture)
resizedImage <- profile.bestSrcFor(trailPicture)
} yield {
// create image
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, 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(faciaContent.trail.webPublicationDate.toDate)
dc.setCreator(faciaContent.trail.byline.getOrElse("Guardian Staff"))
// Entry
val entryWebTitle = faciaContent.metadata.webTitle
val entry = new SyndEntryImpl
entry.setTitle(stripInvalidXMLCharacters(entryWebTitle))
entry.setLink(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
}