def fromFaciaContent()

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
  }