def apply()

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
  }