{"id":19565523,"url":"https://github.com/swaldman/audiofluidity-rss","last_synced_at":"2026-06-13T19:34:17.456Z","repository":{"id":65658841,"uuid":"595403656","full_name":"swaldman/audiofluidity-rss","owner":"swaldman","description":"A simple Scala 3 library for generating RSS.","archived":false,"fork":false,"pushed_at":"2026-01-25T03:43:49.000Z","size":236,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-25T17:35:23.645Z","etag":null,"topics":["rss","rss-generator","scala","scala3"],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/swaldman.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-01-31T02:07:25.000Z","updated_at":"2026-01-25T03:32:01.000Z","dependencies_parsed_at":"2023-02-18T00:46:10.300Z","dependency_job_id":"1ed3a3c6-c33f-476f-b2ea-9665ed03f09b","html_url":"https://github.com/swaldman/audiofluidity-rss","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/swaldman/audiofluidity-rss","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swaldman%2Faudiofluidity-rss","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swaldman%2Faudiofluidity-rss/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swaldman%2Faudiofluidity-rss/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swaldman%2Faudiofluidity-rss/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/swaldman","download_url":"https://codeload.github.com/swaldman/audiofluidity-rss/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swaldman%2Faudiofluidity-rss/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34298247,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["rss","rss-generator","scala","scala3"],"created_at":"2024-11-11T05:27:23.009Z","updated_at":"2026-06-13T19:34:17.451Z","avatar_url":"https://github.com/swaldman.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# audiofluidity-rss\n\nA simple Scala 3 API for generating RSS, for general websites as well as for podcasts.\n\nMost common RSS extensions are supported, including Apple Podcast \"itunes\" elements.\n\n[![scaladoc](https://javadoc.io/badge2/com.mchange/audiofluidity-rss_3/0.0.2/scaladoc.svg)](https://javadoc.io/doc/com.mchange/audiofluidity-rss_3/0.0.2)\n\n## Quickstart\n\nSuppose we have a \"blog\" defined [like this](example/Setup.scala):\n\n```scala\n//\u003e using scala \"3.2.1\"\n//\u003e using dep \"com.mchange::audiofluidity-rss:0.0.2\"\n\nimport audiofluidity.rss.*\nimport java.time.*\nimport scala.collection.*\n\nobject MyBlog {\n  val myName = \"Arthur Q. Author\"\n  val myEmail = s\"nospam@dev.null (${myName})\"\n  val mainUrl = \"https://myblog.dev.null/\"\n\n  case class Post(title: String, desc: String, text : String, published : Long):\n    def permalink = s\"${mainUrl}/entry/${published}.html\"\n}\n\n// reverse chronological\ngiven Ordering[MyBlog.Post]\n  = Ordering.by((p : MyBlog.Post) =\u003e (p.published, p.title, p.desc, p.text)).reverse\n\nval posts = immutable.SortedSet (\n  MyBlog.Post(\"Hello!\", \"First post!\", \"Some words I write.\", 1674449923644),\n  MyBlog.Post(\"Is this on?\", \"In which I worry.\", \"Why was my post not greeted with adulation?\", 1674795664978),\n  MyBlog.Post(\"Pulitzer!\", \"In which I gloat.\", \"Finally 'Hello !' received the recognition it deserves.\", 1675054938281),\n  MyBlog.Post(\"\", \"This is an untitled post.\", \"I've got nothing to say but it's okay.\", 1676054938281),\n)\n\ndef zonedDateTime( epochMilli : Long ) =\n  Instant.ofEpochMilli(epochMilli).atZone(ZoneId.systemDefault())\n```\n\nYou can generate simple XML for it [like this](example/SimpleExample.scala):\n\n```scala\nimport audiofluidity.rss.*\nimport java.time.*\nimport scala.collection.*\n\nobject SimpleExample:\n  given Itemable[MyBlog.Post] with\n    extension (post : MyBlog.Post)\n      def toItem : Element.Item =\n        val pubDate : Option[ZonedDateTime] = Some(zonedDateTime(post.published))\n        Element.Item.create (\n          title = post.title,\n          linkUrl = post.permalink,\n          description = post.desc,\n          author = MyBlog.myEmail,\n          pubDate = pubDate\n        )\n\n  val channel = Element.Channel.create (\n    title = \"My blog's RSS feed!\",\n    linkUrl = MyBlog.mainUrl,\n    description = \"This blog will blow your mind. Or your chance.\",\n    items = posts\n  )\n\n  val rssFeed = Element.Rss(channel)\n\n  @main def simple_go() : Unit =\n    println(rssFeed.asXmlText)\n```\n\nYou can run this from the example directory of this repository:\n\n```sh\n$ scala-cli . --interactive        \n```\n\nAnd whee!\n\n```xml\n\u003c?xml version='1.0' encoding='UTF-8'?\u003e\n\u003crss version=\"2.0\"\u003e\n  \u003cchannel\u003e\n    \u003ctitle\u003eMy blog's RSS feed!\u003c/title\u003e\n    \u003clink\u003ehttps://myblog.dev.null/\u003c/link\u003e\n    \u003cdescription\u003e\u003c![CDATA[This blog will blow your mind. Or your chance.]]\u003e\u003c/description\u003e\n    \u003cdocs\u003ehttps://cyber.harvard.edu/rss/rss.html\u003c/docs\u003e\n    \u003citem\u003e\n      \u003cpubDate\u003eFri, 10 Feb 2023 13:48:58 -0500\u003c/pubDate\u003e\n      \u003cauthor\u003enospam@dev.null (Arthur Q. Author)\u003c/author\u003e\n      \u003cdescription\u003e\u003c![CDATA[This is an untitled post.]]\u003e\u003c/description\u003e\n      \u003clink\u003ehttps://myblog.dev.null//entry/1676054938281.html\u003c/link\u003e\n      \u003ctitle\u003e\u003c/title\u003e\n    \u003c/item\u003e\n    \u003citem\u003e\n      \u003cpubDate\u003eMon, 30 Jan 2023 00:02:18 -0500\u003c/pubDate\u003e\n      \u003cauthor\u003enospam@dev.null (Arthur Q. Author)\u003c/author\u003e\n      \u003cdescription\u003e\u003c![CDATA[In which I gloat.]]\u003e\u003c/description\u003e\n      \u003clink\u003ehttps://myblog.dev.null//entry/1675054938281.html\u003c/link\u003e\n      \u003ctitle\u003ePulitzer!\u003c/title\u003e\n    \u003c/item\u003e\n    \u003citem\u003e\n      \u003cpubDate\u003eFri, 27 Jan 2023 00:01:04 -0500\u003c/pubDate\u003e\n      \u003cauthor\u003enospam@dev.null (Arthur Q. Author)\u003c/author\u003e\n      \u003cdescription\u003e\u003c![CDATA[In which I worry.]]\u003e\u003c/description\u003e\n      \u003clink\u003ehttps://myblog.dev.null//entry/1674795664978.html\u003c/link\u003e\n      \u003ctitle\u003eIs this on?\u003c/title\u003e\n    \u003c/item\u003e\n    \u003citem\u003e\n      \u003cpubDate\u003eSun, 22 Jan 2023 23:58:43 -0500\u003c/pubDate\u003e\n      \u003cauthor\u003enospam@dev.null (Arthur Q. Author)\u003c/author\u003e\n      \u003cdescription\u003e\u003c![CDATA[First post!]]\u003e\u003c/description\u003e\n      \u003clink\u003ehttps://myblog.dev.null//entry/1674449923644.html\u003c/link\u003e\n      \u003ctitle\u003eHello!\u003c/title\u003e\n    \u003c/item\u003e\n  \u003c/channel\u003e\n\u003c/rss\u003e\n```\n\n## Features\n\n_audiofluidity-rss_ defines lots of not-standard-RSS elements that are commonly\nmixed into RSS feeds. \n\nFor example...\n * You might wish to mix-in non-RSS-standard tags\n   * ...to use `\u003cdc:creator\u003e` elements for an author's name, rather \n     than the e-mail address required in the `\u003cauthor\u003e` tag by the RSS standard\n   * ...to include full-text content, rather than just the RSS-standard\n     `\u003cdescription\u003e`, in your feed items. A common way to do this is with RDF-defined\n     `\u003ccontent:encoded\u003e` tags.\n   * ...to add an `\u003catom:link\u003e` element to your channel item indicating\n     the home page of the blog tht the feed represents\n   * If you do any or all of these things, your RSS tag should properly bind\n     the right XML namespaces to those `dc`/`content`/`atom` prefixes.\n * Defying the RSS standard, you might wish to drop required `\u003cauthor\u003e` tags (because\n   you don't want to emit e-mails, real or fake), or to drop the required `\u003ctitle\u003e` element\n   for untitled posts (rather than including an empty title).\n\n_audiofluidity_rss_ supports \n - mixing-in nonstandard elements (and offers definitions of\nlots of common choices)\n - defining RSS-tag namespaces\n - inserting post-processing into the XML-generation process to [drop or rewrite](https://github.com/scala/scala-xml/wiki/Getting-started)\nelements.\n\nFor an example with all the above, please see [`example/FancierExample.scala`](example/FancierExample.scala). \n\nYou can run it in the examples dir with\n\n```sh\n$ scala-cli . --interactive        \n```\n\nHere's what the output looks like:\n\n```xml\n\u003c?xml version='1.0' encoding='UTF-8'?\u003e\n\u003crss \nversion=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\u003e\n  \u003cchannel\u003e\n    \u003ctitle\u003eMy blog's RSS feed!\u003c/title\u003e\n    \u003clink\u003ehttps://myblog.dev.null/\u003c/link\u003e\n    \u003cdescription\u003e\u003c![CDATA[This blog will blow your mind. Or your chance.]]\u003e\u003c/description\u003e\n    \u003cdocs\u003ehttps://cyber.harvard.edu/rss/rss.html\u003c/docs\u003e\n    \u003citem\u003e\n      \u003cpubDate\u003eFri, 10 Feb 2023 13:48:58 -0500\u003c/pubDate\u003e\n      \u003cdescription\u003e\u003c![CDATA[This is an untitled post.]]\u003e\u003c/description\u003e\n      \u003clink\u003ehttps://myblog.dev.null//entry/1676054938281.html\u003c/link\u003e\n      \u003cdc:creator\u003e\u003c![CDATA[Arthur Q. Author]]\u003e\u003c/dc:creator\u003e\n      \u003ccontent:encoded\u003e\u003c![CDATA[I've got nothing to say but it's okay.]]\u003e\u003c/content:encoded\u003e\n    \u003c/item\u003e\n    \u003citem\u003e\n      \u003cpubDate\u003eMon, 30 Jan 2023 00:02:18 -0500\u003c/pubDate\u003e\n      \u003cdescription\u003e\u003c![CDATA[In which I gloat.]]\u003e\u003c/description\u003e\n      \u003clink\u003ehttps://myblog.dev.null//entry/1675054938281.html\u003c/link\u003e\n      \u003ctitle\u003ePulitzer!\u003c/title\u003e\n      \u003cdc:creator\u003e\u003c![CDATA[Arthur Q. Author]]\u003e\u003c/dc:creator\u003e\n      \u003ccontent:encoded\u003e\u003c![CDATA[Finally 'Hello !' received the recognition it deserves.]]\u003e\u003c/content:encoded\u003e\n    \u003c/item\u003e\n    \u003citem\u003e\n      \u003cpubDate\u003eFri, 27 Jan 2023 00:01:04 -0500\u003c/pubDate\u003e\n      \u003cdescription\u003e\u003c![CDATA[In which I worry.]]\u003e\u003c/description\u003e\n      \u003clink\u003ehttps://myblog.dev.null//entry/1674795664978.html\u003c/link\u003e\n      \u003ctitle\u003eIs this on?\u003c/title\u003e\n      \u003cdc:creator\u003e\u003c![CDATA[Arthur Q. Author]]\u003e\u003c/dc:creator\u003e\n      \u003ccontent:encoded\u003e\u003c![CDATA[Why was my post not greeted with adulation?]]\u003e\u003c/content:encoded\u003e\n    \u003c/item\u003e\n    \u003citem\u003e\n      \u003cpubDate\u003eSun, 22 Jan 2023 23:58:43 -0500\u003c/pubDate\u003e\n      \u003cdescription\u003e\u003c![CDATA[First post!]]\u003e\u003c/description\u003e\n      \u003clink\u003ehttps://myblog.dev.null//entry/1674449923644.html\u003c/link\u003e\n      \u003ctitle\u003eHello!\u003c/title\u003e\n      \u003cdc:creator\u003e\u003c![CDATA[Arthur Q. Author]]\u003e\u003c/dc:creator\u003e\n      \u003ccontent:encoded\u003e\u003c![CDATA[Some words I write.]]\u003e\u003c/content:encoded\u003e\n    \u003c/item\u003e\n    \u003catom:link type=\"application/rss+xml\" rel=\"self\" href=\"https://myblog.dev.null/\"/\u003e\n  \u003c/channel\u003e\n\u003c/rss\u003e\n```\n\n## License\n\n_audiofluidity-rss_ was revised from a library internal to [_audiofluidity_](https://github.com/swaldman/audiofluidity),\na podcast-specific static-site generator.\n\nHowever, this library is now offered independently, under Apache 2.0 terms. Please see\n[LICENSE](LICENSE).\n\n(The main _audiofluidity_ application is a GPLv3 project.)\n\n\n## Some useful RSS resources\n\nMore docs soon, I hope. But for now, I want to\nbookmark some useful RSS resources:\n\n- [Really Simple Syndication Best Practices Profile](https://www.rssboard.org/rss-profile)\n- [RSS 2.0.1 Specification](https://www.rssboard.org/rss-2-0-1)\n- [RSS Mime Type](https://www.rssboard.org/rss-mime-type-application.txt)\n- [RSS Validator](https://www.rssboard.org/rss-validator/)\n- [Excerpt from O'Reilly book by Ben Hammersley](https://www.oreilly.com/library/view/developing-feeds-with/0596008813/ch04s02.html)\n- [DublinCore (`dc`) specification](https://www.dublincore.org/specifications/dublin-core/dcmi-terms/)\n- [Podcast RSS resources at audiofluidity main](https://github.com/swaldman/audiofluidity#podcast-rss)\n- [Atom specification](https://datatracker.ietf.org/doc/html/rfc4287)\n- [RSS Feed Best Practises \u0026mdash; Kevin Cox](https://kevincox.ca/2022/05/06/rss-feed-best-practices/)\n\nSee also the podcast-centric RSS resource list in the main [_audiofluidity_ README.md](https://github.com/swaldman/audiofluidity#developer-resources) \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswaldman%2Faudiofluidity-rss","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswaldman%2Faudiofluidity-rss","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswaldman%2Faudiofluidity-rss/lists"}