From 7ff0b9626fe1633cd7bb94e609cacef55960a5dd Mon Sep 17 00:00:00 2001
From: Fred Gleason <fredg@paravelsystems.com>
Date: Thu, 4 Jun 2020 15:10:45 -0400
Subject: [PATCH] 2020-06-04 Fred Gleason <fredg@paravelsystems.com> 	*
 Added an 'iTunes + Superfeed' RSS schema.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
---
 .gitignore              |   2 +
 ChangeLog               |   2 +
 configure.ac            |   1 +
 docs/Makefile.am        |   4 +-
 docs/dtds/Makefile.am   |  45 ++++++++++
 docs/dtds/superfeed.xml | 188 ++++++++++++++++++++++++++++++++++++++++
 lib/rdfeed.cpp          |  20 +++--
 lib/rdrssschemas.cpp    |  21 ++++-
 lib/rdrssschemas.h      |   3 +-
 rivendell.spec.in       |   3 +
 10 files changed, 276 insertions(+), 13 deletions(-)
 create mode 100644 docs/dtds/Makefile.am
 create mode 100644 docs/dtds/superfeed.xml

diff --git a/.gitignore b/.gitignore
index f6f400d8..5363d447 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,6 +35,8 @@ configure
 depcomp
 docs/apis/*.html
 docs/apis/*.pdf
+docs/dtds/superfeed.html
+docs/dtds/superfeed.pdf
 docs/opsguide/*.html
 docs/opsguide/*.pdf
 docs/opsguide/chain.png
diff --git a/ChangeLog b/ChangeLog
index 05b91488..f84ed1ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -19998,3 +19998,5 @@
 2020-05-21 Fred Gleason <fredg@paravelsystems.com>
 	* Added '<itunes:author>' tags to the 'Apple' RSS schema.
 	* Added '<itunes:summary>' tags to the 'Apple' RSS schema.
+2020-06-04 Fred Gleason <fredg@paravelsystems.com>
+	* Added an 'iTunes + Superfeed' RSS schema.
diff --git a/configure.ac b/configure.ac
index d0c7aa49..0c49c32b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -515,6 +515,7 @@ AC_CONFIG_FILES([rivendell.spec \
     conf/Makefile \
     docs/Makefile \
     docs/apis/Makefile \
+    docs/dtds/Makefile \
     docs/examples/Makefile \
     docs/manpages/Makefile \
     docs/misc/Makefile \
diff --git a/docs/Makefile.am b/docs/Makefile.am
index bfa12a3d..4cd1f4b1 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -2,7 +2,7 @@
 ##
 ## docs/automake.am for Rivendell
 ##
-## (C) Copyright 2002-2017 Fred Gleason <fredg@paravelsystems.com>
+## (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
 ##
 ##   This program is free software; you can redistribute it and/or modify
 ##   it under the terms of the GNU General Public License version 2 as
@@ -20,7 +20,7 @@
 ## Use automake to process this into a Makefile.in
 
 if DOCBOOK_AM
-  DOCBOOK_AM_OPT = stylesheets apis manpages opsguide rivwebcapi
+  DOCBOOK_AM_OPT = stylesheets apis manpages opsguide rivwebcapi dtds
 endif
 
 SUBDIRS = $(DOCBOOK_AM_OPT) examples\
diff --git a/docs/dtds/Makefile.am b/docs/dtds/Makefile.am
new file mode 100644
index 00000000..7722a2da
--- /dev/null
+++ b/docs/dtds/Makefile.am
@@ -0,0 +1,45 @@
+## Makefile.am
+##
+## docs/dtds/Makefile.am for Rivendell
+##
+## (C) Copyright 2020 Fred Gleason <fredg@paravelsystems.com>
+##
+##   This program is free software; you can redistribute it and/or modify
+##   it under the terms of the GNU General Public License version 2 as
+##   published by the Free Software Foundation.
+##
+##   This program is distributed in the hope that it will be useful,
+##   but WITHOUT ANY WARRANTY; without even the implied warranty of
+##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+##   GNU General Public License for more details.
+##
+##   You should have received a copy of the GNU General Public
+##   License along with this program; if not, write to the Free Software
+##   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## Use automake to process this into a Makefile.in
+
+##
+## Build Dependencies
+##
+%.html:	%.xml
+	xsltproc -o $@ $(DOCBOOK_STYLESHEETS)/xhtml/docbook.xsl $<
+%.pdf:	%.xml
+	xsltproc $(DOCBOOK_STYLESHEETS)/fo/docbook.xsl $< | fop - -pdf $@
+
+all-local:	superfeed.html\
+                superfeed.pdf
+
+EXTRA_DIST = superfeed.html\
+             superfeed.pdf\
+             superfeed.xml
+
+CLEANFILES = *~
+MAINTAINERCLEANFILES = *~\
+                       *.1\
+                       *.8\
+                       *.html\
+                       *.pdf\
+                       aclocal.m4\
+                       configure\
+                       Makefile.in
diff --git a/docs/dtds/superfeed.xml b/docs/dtds/superfeed.xml
new file mode 100644
index 00000000..742de870
--- /dev/null
+++ b/docs/dtds/superfeed.xml
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<article xmlns="http://docbook.org/ns/docbook" version="5.0">
+<info>
+  <title>The Rivendell &quot;superfeed&quot; Namespace</title>
+  <subtitle>Version 0.1</subtitle>
+  <revnumber>v0.1</revnumber>
+  <author>
+    <personname>
+      <firstname>Fred</firstname>
+      <surname>Gleason</surname>
+      <email>fredg@paravelsystems.com</email>
+    </personname>
+  </author>
+  <edition>
+    v0.1
+  </edition>
+  <copyright><year>2020</year><holder>Fred Gleason</holder></copyright>
+  <legalnotice>
+    <para>
+      Permission is granted to copy, distribute and/or modify this document
+      under the terms of the GNU Free Documentation License, Version 1.3
+      or any later version published by the Free Software Foundation;
+      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+    </para>
+  </legalnotice>
+</info>
+
+<sect1 xml:id="overview">
+  <title>Overview</title>
+  <para>
+    The &quot;superfeed&quot; XML namespace adds support for additional
+    fields used by Rivendell Superfeed RSS podcasting functionality.
+  </para>
+</sect1>
+<sect1 xml:id="namespace_declaration">
+  <title>Namespace Declaration</title>
+  <para>
+    The namespace declaration is:
+  </para>
+  <para>
+    <code>xmlns:superfeed=&quot;http://www.rivendellaudio.org/dtds/superfeed-0.1.dtd&quot;</code>
+  </para>
+</sect1>
+<sect1 xml:id="fields">
+  <title>Fields</title>
+  <para>
+    The namespace adds the following fields:
+  </para>
+  <variablelist>
+    <varlistentry>
+      <term>
+	<code>&lt;channelTitle&gt;</code>
+      </term>
+      <listitem>
+	<para>
+	  The value of the <code>&lt;title&gt;</code> field from the
+	  <code>&lt;channel&gt;</code> section of the underlying elemental
+	  feed.
+	</para>
+      </listitem>
+    </varlistentry>
+    <varlistentry>
+      <term>
+	<code>&lt;channelDescription&gt;</code>
+      </term>
+      <listitem>
+	<para>
+	  The value of the <code>&lt;description&gt;</code> field from the
+	  <code>&lt;channel&gt;</code> section of the underlying elemental
+	  feed.
+	</para>
+      </listitem>
+    </varlistentry>
+  </variablelist>
+</sect1>
+
+<sect1 xml:id="example">
+  <title>Example</title>
+  <para>
+    The following example posits the existence of two elemental feeds,
+    <computeroutput>AIRPLAY</computeroutput>,
+    <computeroutput>CARTSLTS</computeroutput> and
+    <computeroutput>LIBRARY</computeroutput>; each containing a single
+    post. A superfeed, called <computeroutput>RIVENDEL</computeroutput>
+    and consisting of those three elemental fields would look like this:
+  </para>
+  <literallayout>
+&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+
+&lt;rss version=&quot;2.0&quot; xmlns:itunes=&quot;http://www.itunes.com/dtds/podcast-1.0.dtd&quot; xmlns:content=&quot;http://purl.org/rss/1.0/modules/content/&quot; xmlns:atom=&quot;http://www.w3.org/2005/Atom&quot; xmlns:superfeed=&quot;http://www.rivendellaudio.org/dtds/superfeed-0.1.dtd&quot;&gt;
+  &lt;channel&gt;
+    &lt;title&gt;Rivendell Radio Automation&lt;/title&gt;
+    &lt;description&gt;All about the Rivendell Radio Automation System&lt;/description&gt;
+    &lt;itunes:summary&gt;All about the Rivendell Radio Automation System&lt;/itunes:summary&gt;
+    &lt;category&gt;Technology&lt;/category&gt;
+    &lt;link&gt;http://feeds.example.com/rivendel&lt;/link&gt;
+    &lt;language&gt;en-us&lt;/language&gt;
+    &lt;copyright&gt;� 2020 John Q. Author&lt;/copyright&gt;
+    &lt;lastBuildDate&gt;Thu, 4 Jun 2020 12:18:54 GMT&lt;/lastBuildDate&gt;
+    &lt;pubDate&gt;Thu, 21 May 2020 10:43:55 GMT&lt;/pubDate&gt;
+    &lt;managingEditor&gt;editor@example.com&lt;/managingEditor&gt;
+    &lt;webMaster&gt;webmaster@example.com&lt;/webMaster&gt;
+    &lt;generator&gt;Rivendell 3.3.0int1&lt;/generator&gt;
+    &lt;image&gt;
+      &lt;url&gt;http://feeds.example.com/rivendel/img000022_000038.png&lt;/url&gt;
+      &lt;title&gt;Rivendell Radio Automation&lt;/title&gt;
+      &lt;link&gt;http://feeds.example.com/rivendel&lt;/link&gt;
+      &lt;width&gt;2048&lt;/width&gt;
+      &lt;height&gt;2048&lt;/height&gt;
+      &lt;description&gt;The Rivendell Icon&lt;/description&gt;
+    &lt;/image&gt;
+    &lt;atom:link href=&quot;http://feeds.example.com/rivendel/RIVENDEL.rss&quot; rel=&quot;self&quot; type=&quot;application/rss+xml&quot; /&gt;
+    &lt;itunes:author&gt;author@example.com&lt;/itunes:author&gt;
+    &lt;itunes:type&gt;episodic&lt;/itunes:type&gt;
+    &lt;itunes:owner&gt;
+     &lt;itunes:name&gt;John Q. Author&lt;/itunes:name&gt;
+      &lt;itunes:email&gt;fredg@paravelsystems.com&lt;/itunes:email&gt;
+    &lt;/itunes:owner&gt;
+    &lt;itunes:image href=&quot;http://feeds.example.com/rivendel/img000022_000038.png&quot; /&gt;
+    &lt;itunes:category text=&quot;Technology&quot; /&gt;
+    &lt;itunes:explicit&gt;false&lt;/itunes:explicit&gt;
+    &lt;item&gt;
+      &lt;superfeed:channelTitle&gt;RDAirPlay&lt;/superfeed:channelTitle&gt;
+      &lt;superfeed:channelDescription&gt;All about RDAirPlay in Rivendell&lt;/superfeed:channelDescription&gt;
+      &lt;title&gt;Thurber Jewelers&lt;/title&gt;
+      &lt;itunes:title&gt;Thurber Jewelers&lt;/itunes:title&gt;
+      &lt;link&gt;http://feeds.example.com/airplay&lt;/link&gt;
+      &lt;guid isPermaLink=&quot;false&quot;&gt;http://feeds.example.com/airplay/000019_000026.mp3_000019_000026&lt;/guid&gt;
+      &lt;description&gt;All about RDAirPlay in Rivendell&lt;/description&gt;
+      &lt;itunes:summary&gt;All about RDAirPlay in Rivendell&lt;/itunes:summary&gt;
+      &lt;author&gt;someone@example.com (John Q. Author)&lt;/author&gt;
+      &lt;itunes:author&gt;someone@example.com (John Q. Author)&lt;/itunes:author&gt;
+      &lt;comments&gt;http://feeds.example.com/airplay&lt;/comments&gt;
+      &lt;source url=&quot;http://feeds.example.com/airplay/RIVENDEL&quot;&gt;Rivendell Radio Automation&lt;/source&gt;
+      &lt;enclosure url=&quot;http://feeds.example.com/airplay/000019_000026.mp3&quot; length=&quot;170496&quot; type=&quot;audio/mpeg&quot; /&gt;
+      &lt;category&gt;Technology&lt;/category&gt;
+      &lt;pubDate&gt;Thu, 21 May 2020 20:31:26 GMT&lt;/pubDate&gt;
+      &lt;itunes:duration&gt;14&lt;/itunes:duration&gt;
+      &lt;itunes:image href=&quot;http://feeds.example.com/airplay/img000019_000024.png&quot; /&gt;
+      &lt;itunes:explicit&gt;false&lt;/itunes:explicit&gt;
+    &lt;/item&gt;
+    &lt;item&gt;
+      &lt;superfeed:channelTitle&gt;RDCartSlots&lt;/superfeed:channelTitle&gt;
+      &lt;superfeed:channelDescription&gt;All channel all about RDCartSlots!&lt;/superfeed:channelDescription&gt;
+      &lt;title&gt;Liberty Tax&lt;/title&gt;
+      &lt;itunes:title&gt;Liberty Tax&lt;/itunes:title&gt;
+      &lt;link&gt;http://feeds.example.com&lt;/link&gt;
+      &lt;guid isPermaLink=&quot;false&quot;&gt;http://feeds.example.com/cartslts/000025_000025.mp3_000025_000025&lt;/guid&gt;
+      &lt;description&gt;The Liberty tax advisors.&lt;/description&gt;
+      &lt;itunes:summary&gt;The Liberty tax advisors.&lt;/itunes:summary&gt;
+      &lt;author&gt;someone@example.com (John Q. Author)&lt;/author&gt;
+      &lt;itunes:author&gt;someone@example.com (John Q. Author)&lt;/itunes:author&gt;
+      &lt;comments&gt;http://feeds.example.com/cartslts&lt;/comments&gt;
+      &lt;source url=&quot;http://feeds.example.com/cartslts/RIVENDEL&quot;&gt;Rivendell Radio Automation&lt;/source&gt;
+      &lt;enclosure url=&quot;http://feeds.example.com/cartslts/000025_000025.mp3&quot; length=&quot;369216&quot; type=&quot;audio/mpeg&quot; /&gt;
+      &lt;category&gt;Technology&lt;/category&gt;
+      &lt;pubDate&gt;Thu, 21 May 2020 19:17:26 GMT&lt;/pubDate&gt;
+      &lt;itunes:duration&gt;15&lt;/itunes:duration&gt;
+      &lt;itunes:image href=&quot;http://feeds.example.com/cartslts/img000025_000037.png&quot; /&gt;
+      &lt;itunes:explicit&gt;false&lt;/itunes:explicit&gt;
+    &lt;/item&gt;
+    &lt;item&gt;
+      &lt;superfeed:channelTitle&gt;RDLibrary&lt;/superfeed:channelTitle&gt;
+      &lt;superfeed:channelDescription&gt;A channel all about RDLibrary&lt;/superfeed:channelDescription&gt;
+      &lt;title&gt;The Peanut Shoppe&lt;/title&gt;
+      &lt;itunes:title&gt;The Peanut Shoppe&lt;/itunes:title&gt;
+      &lt;link&gt;http://feeds.example.com/library&lt;/link&gt;
+      &lt;guid isPermaLink=&quot;false&quot;&gt;http://feeds.example.com/library/000024_000024.mp3_000024_000024&lt;/guid&gt;
+      &lt;description&gt;A trip to a peanut and candy shop in downtown Wadsworth OH.&lt;/description&gt;
+      &lt;itunes:summary&gt;A trip to a peanut and candy shop in downtown Wadsworth OH.&lt;/itunes:summary&gt;
+      &lt;author&gt;someone@example.com (John Q. Author)&lt;/author&gt;
+      &lt;itunes:author&gt;someone@example.com (John Q. Author)&lt;/itunes:author&gt;
+      &lt;comments&gt;http://feeds.example.com/library&lt;/comments&gt;
+      &lt;source url=&quot;http://feeds.example.com/library/RIVENDEL&quot;&gt;Rivendell Radio Automation&lt;/source&gt;
+      &lt;enclosure url=&quot;http://feeds.example.com/library/000024_000024.mp3&quot; length=&quot;196992&quot; type=&quot;audio/mpeg&quot; /&gt;
+      &lt;category&gt;Technology&lt;/category&gt;
+      &lt;pubDate&gt;Thu, 21 May 2020 19:14:53 GMT&lt;/pubDate&gt;
+      &lt;itunes:duration&gt;16&lt;/itunes:duration&gt;
+      &lt;itunes:image href=&quot;http://feeds.example.com/library/img000024_000036.png&quot; /&gt;
+      &lt;itunes:explicit&gt;false&lt;/itunes:explicit&gt;
+    &lt;/item&gt;
+  &lt;/channel&gt;
+&lt;/rss&gt;
+
+  </literallayout>
+</sect1>
+
+</article>
diff --git a/lib/rdfeed.cpp b/lib/rdfeed.cpp
index 6e74b843..54335551 100644
--- a/lib/rdfeed.cpp
+++ b/lib/rdfeed.cpp
@@ -1377,11 +1377,13 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok)
     "PODCASTS.EFFECTIVE_DATETIME,"+  // 13
     "PODCASTS.ID,"+                  // 14
     "FEEDS.BASE_URL,"+               // 15
-    "FEED_IMAGES.ID,"+               // 16
-    "FEED_IMAGES.WIDTH,"+            // 17
-    "FEED_IMAGES.HEIGHT,"+           // 18
-    "FEED_IMAGES.DESCRIPTION,"+      // 19
-    "FEED_IMAGES.FILE_EXTENSION "+   // 20
+    "FEEDS.CHANNEL_TITLE,"+          // 16
+    "FEEDS.CHANNEL_DESCRIPTION,"+    // 17
+    "FEED_IMAGES.ID,"+               // 18
+    "FEED_IMAGES.WIDTH,"+            // 19
+    "FEED_IMAGES.HEIGHT,"+           // 20
+    "FEED_IMAGES.DESCRIPTION,"+      // 21
+    "FEED_IMAGES.FILE_EXTENSION "+   // 22
     "from PODCASTS left join FEEDS "+
     "on PODCASTS.FEED_ID=FEEDS.ID "+
     "left join FEED_IMAGES "+
@@ -1775,6 +1777,10 @@ QString RDFeed::ResolveItemWildcards(const QString &tmplt,RDSqlQuery *item_q,
   QString ret="      "+tmplt;
 
   ret.replace("\n","\r\n      ");
+
+  ret.replace("%ITEM_CHANNEL_TITLE%",RDXmlEscape(item_q->value(16).toString()));
+  ret.replace("%ITEM_CHANNEL_DESCRIPTION%",
+	      RDXmlEscape(item_q->value(17).toString()));
   ret.replace("%ITEM_TITLE%",RDXmlEscape(item_q->value(1).toString()));
   ret.replace("%ITEM_DESCRIPTION%",
 	      RDXmlEscape(item_q->value(2).toString()));
@@ -1824,8 +1830,8 @@ QString RDFeed::ResolveItemWildcards(const QString &tmplt,RDSqlQuery *item_q,
 					    item_q->value(14).toUInt()));
   ret.replace("%ITEM_IMAGE_URL%",item_q->value(15).toString()+"/"+
 	      RDFeed::imageFilename(item_q->value(0).toInt(),
-				    item_q->value(16).toInt(),
-				    item_q->value(20).toString()));
+				    item_q->value(18).toInt(),
+				    item_q->value(22).toString()));
   return ret;
 }
 
diff --git a/lib/rdrssschemas.cpp b/lib/rdrssschemas.cpp
index 9dec2dea..9abce9b5 100644
--- a/lib/rdrssschemas.cpp
+++ b/lib/rdrssschemas.cpp
@@ -25,9 +25,10 @@ RDRssSchemas::RDRssSchemas()
   //
   // Names
   //
-  c_names.push_back("Custom");     // CustomSchema
-  c_names.push_back("RSS 2.0.2");  // Rss202Schema
-  c_names.push_back("Apple");      // AppleSchema
+  c_names.push_back("Custom");                    // CustomSchema
+  c_names.push_back("RSS 2.0.2");                 // Rss202Schema
+  c_names.push_back("Apple iTunes");              // AppleSchema
+  c_names.push_back("Apple iTunes + Superfeed");  // AppleSuperfeedSchema
 
 
   //
@@ -36,6 +37,7 @@ RDRssSchemas::RDRssSchemas()
   c_minimum_image_sizes.push_back(QSize(0,0));       // CustomSchema
   c_minimum_image_sizes.push_back(QSize(88,31));     // Rss202Schema
   c_minimum_image_sizes.push_back(QSize(1400,1400)); // AppleSchema
+  c_minimum_image_sizes.push_back(QSize(1400,1400)); // AppleSuperfeedSchema
 
 
   //
@@ -44,6 +46,7 @@ RDRssSchemas::RDRssSchemas()
   c_maximum_image_sizes.push_back(QSize(0,0));        // CustomSchema
   c_maximum_image_sizes.push_back(QSize(144,400));    // Rss202Schema
   c_maximum_image_sizes.push_back(QSize(3000,3000));  // AppleSchema
+  c_maximum_image_sizes.push_back(QSize(3000,3000));  // AppleSuperfeedSchema
 
 
   //
@@ -58,6 +61,9 @@ RDRssSchemas::RDRssSchemas()
   // AppleSchema
   c_header_templates.push_back("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\" xmlns:itunes=\"http://www.itunes.com/dtds/podcast-1.0.dtd\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" xmlns:atom=\"http://www.w3.org/2005/Atom\">");
 
+  // AppleSuperfeedSchema
+  c_header_templates.push_back("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\" xmlns:itunes=\"http://www.itunes.com/dtds/podcast-1.0.dtd\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" xmlns:atom=\"http://www.w3.org/2005/Atom\" xmlns:superfeed=\"http://www.rivendellaudio.org/dtds/superfeed-0.1.dtd\">");
+
   //
   // Channel Templates
   //
@@ -70,6 +76,9 @@ RDRssSchemas::RDRssSchemas()
   // AppleSchema
   c_channel_templates.push_back("<title>%TITLE%</title>\n<description>%DESCRIPTION%</description>\n<itunes:summary>%DESCRIPTION%</itunes:summary>\n<category>%CATEGORY%</category>\n<link>%LINK%</link>\n<language>%LANGUAGE%</language>\n<copyright>%COPYRIGHT%</copyright>\n<lastBuildDate>%BUILD_DATE%</lastBuildDate>\n<pubDate>%PUBLISH_DATE%</pubDate>\n<managingEditor>%EDITOR%</managingEditor>\n<webMaster>%WEBMASTER%</webMaster>\n<generator>%GENERATOR%</generator>\n<image>\n  <url>%IMAGE_URL%</url>\n  <title>%TITLE%</title>\n  <link>%LINK%</link>\n  <width>%IMAGE_WIDTH%</width>\n  <height>%IMAGE_HEIGHT%</height>\n  <description>%IMAGE_DESCRIPTION%</description>\n</image>\n<atom:link href=\"%FEED_URL%\" rel=\"self\" type=\"application/rss+xml\" />\n<itunes:author>%AUTHOR%</itunes:author>\n<itunes:type>episodic</itunes:type>\n<itunes:owner>\n <itunes:name>%OWNER_NAME%</itunes:name>\n  <itunes:email>%OWNER_EMAIL%</itunes:email>\n</itunes:owner>\n<itunes:image href=\"%IMAGE_URL%\" />\n<itunes:category text=\"%CATEGORY%\" />\n<itunes:explicit>%EXPLICIT%</itunes:explicit>");
 
+  // AppleSuperfeedSchema
+  c_channel_templates.push_back("<title>%TITLE%</title>\n<description>%DESCRIPTION%</description>\n<itunes:summary>%DESCRIPTION%</itunes:summary>\n<category>%CATEGORY%</category>\n<link>%LINK%</link>\n<language>%LANGUAGE%</language>\n<copyright>%COPYRIGHT%</copyright>\n<lastBuildDate>%BUILD_DATE%</lastBuildDate>\n<pubDate>%PUBLISH_DATE%</pubDate>\n<managingEditor>%EDITOR%</managingEditor>\n<webMaster>%WEBMASTER%</webMaster>\n<generator>%GENERATOR%</generator>\n<image>\n  <url>%IMAGE_URL%</url>\n  <title>%TITLE%</title>\n  <link>%LINK%</link>\n  <width>%IMAGE_WIDTH%</width>\n  <height>%IMAGE_HEIGHT%</height>\n  <description>%IMAGE_DESCRIPTION%</description>\n</image>\n<atom:link href=\"%FEED_URL%\" rel=\"self\" type=\"application/rss+xml\" />\n<itunes:author>%AUTHOR%</itunes:author>\n<itunes:type>episodic</itunes:type>\n<itunes:owner>\n <itunes:name>%OWNER_NAME%</itunes:name>\n  <itunes:email>%OWNER_EMAIL%</itunes:email>\n</itunes:owner>\n<itunes:image href=\"%IMAGE_URL%\" />\n<itunes:category text=\"%CATEGORY%\" />\n<itunes:explicit>%EXPLICIT%</itunes:explicit>");
+
 
   //
   // Item Image Support
@@ -83,6 +92,9 @@ RDRssSchemas::RDRssSchemas()
   // AppleSchema
   c_supports_item_images.push_back(true);
 
+  // AppleSuperfeedSchema
+  c_supports_item_images.push_back(true);
+
 
   //
   // Item Templates
@@ -95,6 +107,9 @@ RDRssSchemas::RDRssSchemas()
 
   // AppleSchema
   c_item_templates.push_back("<title>%ITEM_TITLE%</title>\n<itunes:title>%ITEM_TITLE%</itunes:title>\n<link>%ITEM_LINK%</link>\n<guid isPermaLink=\"false\">%ITEM_GUID%</guid>\n<description>%ITEM_DESCRIPTION%</description>\n<itunes:summary>%ITEM_DESCRIPTION%</itunes:summary>\n<author>%ITEM_AUTHOR%</author>\n<itunes:author>%ITEM_AUTHOR%</itunes:author>\n<comments>%ITEM_COMMENTS%</comments>\n<source url=\"%ITEM_SOURCE_URL%\">%ITEM_SOURCE_TEXT%</source>\n<enclosure url=\"%ITEM_AUDIO_URL%\" length=\"%ITEM_AUDIO_LENGTH%\" type=\"audio/mpeg\" />\n<category>%ITEM_CATEGORY%</category>\n<pubDate>%ITEM_PUBLISH_DATE%</pubDate>\n<itunes:duration>%ITEM_AUDIO_SECONDS%</itunes:duration>\n<itunes:image href=\"%ITEM_IMAGE_URL%\" />\n<itunes:explicit>%ITEM_EXPLICIT%</itunes:explicit>");
+
+  // AppleSuperfeedSchema
+  c_item_templates.push_back("<superfeed:channelTitle>%ITEM_CHANNEL_TITLE%</superfeed:channelTitle>\n<superfeed:channelDescription>%ITEM_CHANNEL_DESCRIPTION%</superfeed:channelDescription>\n<title>%ITEM_TITLE%</title>\n<itunes:title>%ITEM_TITLE%</itunes:title>\n<link>%ITEM_LINK%</link>\n<guid isPermaLink=\"false\">%ITEM_GUID%</guid>\n<description>%ITEM_DESCRIPTION%</description>\n<itunes:summary>%ITEM_DESCRIPTION%</itunes:summary>\n<author>%ITEM_AUTHOR%</author>\n<itunes:author>%ITEM_AUTHOR%</itunes:author>\n<comments>%ITEM_COMMENTS%</comments>\n<source url=\"%ITEM_SOURCE_URL%\">%ITEM_SOURCE_TEXT%</source>\n<enclosure url=\"%ITEM_AUDIO_URL%\" length=\"%ITEM_AUDIO_LENGTH%\" type=\"audio/mpeg\" />\n<category>%ITEM_CATEGORY%</category>\n<pubDate>%ITEM_PUBLISH_DATE%</pubDate>\n<itunes:duration>%ITEM_AUDIO_SECONDS%</itunes:duration>\n<itunes:image href=\"%ITEM_IMAGE_URL%\" />\n<itunes:explicit>%ITEM_EXPLICIT%</itunes:explicit>");
 }
 
 
diff --git a/lib/rdrssschemas.h b/lib/rdrssschemas.h
index 037cf5e8..28e00fac 100644
--- a/lib/rdrssschemas.h
+++ b/lib/rdrssschemas.h
@@ -29,7 +29,8 @@
 class RDRssSchemas
 {
  public:
-  enum RssSchema {CustomSchema=0,Rss202Schema=1,AppleSchema=2,LastSchema=3};
+  enum RssSchema {CustomSchema=0,Rss202Schema=1,AppleSchema=2,
+		  AppleSuperfeedSchema=3,LastSchema=4};
   RDRssSchemas();
   QString name(RssSchema schema) const;
   QSize minimumImageSize(RssSchema schema) const;
diff --git a/rivendell.spec.in b/rivendell.spec.in
index baa0d486..69820d9e 100644
--- a/rivendell.spec.in
+++ b/rivendell.spec.in
@@ -147,6 +147,9 @@ cp docs/misc/ando_interface.odt $RPM_BUILD_ROOT/@DOC_PATH@/misc/
 mkdir -p $RPM_BUILD_ROOT/@DOC_PATH@
 mkdir -p $RPM_BUILD_ROOT/@DOC_PATH@/apis
 cp docs/apis/*.pdf $RPM_BUILD_ROOT/@DOC_PATH@/apis/
+mkdir -p $RPM_BUILD_ROOT/@DOC_PATH@/dtds
+cp docs/dtds/*.html $RPM_BUILD_ROOT/@DOC_PATH@/dtds/
+cp docs/dtds/*.pdf $RPM_BUILD_ROOT/@DOC_PATH@/dtds/
 mkdir -p $RPM_BUILD_ROOT/@DOC_PATH@/tables
 cp docs/tables/*.txt $RPM_BUILD_ROOT/@DOC_PATH@/tables/
 mkdir -p $RPM_BUILD_ROOT/@DOC_PATH@/scripts