]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blob - doc/todo/fancypodcast.mdwn
Move design and code review to discussion subpage.
[git.ikiwiki.info.git] / doc / todo / fancypodcast.mdwn
1 ikiwiki's simple podcasting, while elegant and minimal, doesn't (as
2 mentioned in [[todo/blogging]]) produce full-featured feeds. In
3 fancy podcasts, episodes are accompanied by text content. The feeds
4 also have lots more metadata.
6 [[!toc]]
8 ## Status
10 [[!template id=gitbranch branch=schmonz/fancypodcast author="[[schmonz]]"]]
11 [[!tag patch]]
13 Nothing new on the branch since 2013/07/21 merge to `master`.
15 ## Features
17 [[!table data="""
18 Feature            |iTunes RSS|iTunes Atom|Downcast RSS|Downcast Atom
19 Feed image         |          |           |            |
20 Feed title         |(./)      |(./)       |(./)        |(./)
21 Feed publisher     |          |           |            |
22 Feed "category"    |          |           |            |
23 Feed date          |(./)      |(./)       |(./)        |(./)
24 Feed description   |(./)      |(./)       |(./)        |
25 Episode image      |          |           |            |
26 Episode title      |(./)      |(./)       |(./)        |(./)
27 Episode date       |(./)      |(./)       |(./)        |(./)
28 Episode duration   |          |           |            |
29 Episode author     |          |           |            |
30 Episode description|(./)      |(./)       |(./)        |
31 Episode enclosure  |(./)      |(./)       |(./)        |(./)
32 """]]
34 ## Migration
36 ### Upgrading within ikiwiki: from simple to fancy
38 #### My test podcast
40 For this test, I chose a podcast that tries to work around ikiwiki's
41 current limitations by issuing two separate `inline`s:
43 * One with `feedonly=yes` that includes `.mdwn`, `.pdf`, and `.mp3`
44 * One with `feeds=no` that includes only `.mdwn` (and makes a trail)
46 This has the following effects:
48 * Browser: sees just the articles (each of which has a manually
49   created link to its corresponding media file)
50 * Feedreader: sees all the articles and media in one flat stream
51 * Podcatcher: sees just the media (sans articles)
53 I want instead to write one `inline` with these effects:
55 * Browser: sees just the articles (each of which automatically links
56   to its enclosure)
57 * Feedreader: sees just the articles (each of which specifies its
58   enclosure)
59 * Podcatcher: sees just the enclosures (each of which has an enclosing
60   article, rendered as the media's "description")
62 #### Upgrade steps
64 7. Set up a non-production copy of the podcast.
65     7. Visually diff RSS and Atom feeds against production.
66     7. Subscribe to the copy (both feeds) in `r2e`, iTunes, Downcast.
67 7. Apply fancypodcast patch to the installed ikiwiki:
68     7. `cd ~/Documents/trees/ikiwiki && git checkout fancypodcast`
69     7. `git diff --no-prefix master > ~/Documents/trees/localpatches/www/ikiwiki/fancypodcast.diff`
70     7. `cd ~/Documents/trees/pkgsrc-current/www/ikiwiki && make deinstall && make install clean`
71 7. Verify that simple podcasts are unaffected:
72     7. Rerun `ikiwiki --setup`.
73     7. `diff -uB simple-before.rss simple-after.rss`
74         * A few new elements and attributes, as expected.
75     7. `diff -uB simple-before.atom simple-after.atom`
76         * No change.
77 7. Remove the feed-only `inline` and enable feeds on the remaining one.
78 7. Convert articles' manual download links to `\[[!meta enclosure=""]]`.
79 7. I want existing and future podcatchers to get my new fancy
80    episodes, and I know my podcast isn't in any planets, so I'm
81    going to skip [[tips/howto avoid flooding aggregators]].
82 7. Rerun `ikiwiki --setup`.
83 7. Verify browser shows the same stuff.
84 7. `diff -uB simple-after.rss fancy-after.rss   # and atom`
85     * MP3s and PDFs are no longer naked enclosures, but belong to
86       articles as they should.
87     * Articles have updated modification times, as they should.
88 7. `r2e run` (both RSS and Atom)
89     * Nothing new with the default `trust-guid = True` (otherwise
90       would expect updated articles).
91 7. iTunes "Update Podcast" (both RSS and Atom)
92     * Added one episode per article, with article text as the episode
93       description.
94     * Kept old naked-enclosure episodes around.
95 7. Downcast refresh (RSS):
96     * Added one episode per article, with article text as the episode
97       description.
98     * Kept old naked-enclosure episodes around.
99 7. Downcast refresh (Atom):
100     * Added one episode per article, with no episode description
101       (expected, see feature table).
102     * Kept old naked-enclosure episodes around.
104 Different tradeoffs are possible. These seem okay to me.
106 ### Importing into ikiwiki: fancy (from another CMS)
108 #### My test podcast
110 For this test, I chose a podcast currently being published with
111 Textpattern and tru_podcast, because I'd strongly prefer to publish
112 it with ikiwiki instead.
114 #### Upgrade steps
116 7. Set up a non-production copy of the podcast.
117     7. Visually diff RSS and Atom feeds against production.
118     7. Subscribe to the copy (both feeds) in `r2e`, iTunes, Downcast.
119 7. With a fancypodcast-enabled ikiwiki installed:
120     7. Copy content from Textpattern to ikiwiki:
121         7. Match article paths to preserve `/YYYY/MM/DD/post-title` permalinks.
122         7. Match enclosure paths (or redirect) to preserve Textpattern's URLs.
123         7. Match titles, post dates, and guids with `\[[!meta]]`.
124             7. Match feed paths with permanent redirects from `/atom/` to
125            `/index.atom` (and same for RSS).
126         7. `\[[!inline]]` the articles.
127     7. Rerun `ikiwiki --setup`.
128 7. Stop Textpattern, start ikiwiki.
129 7. Verify that podcatchers see the feeds and don't redownload anything.
130 7. Naively add two new blog posts, one with an enclosure.
131 7. Verify that podcatchers download the new enclosures.
133 -----
135 ## Future improvements
137 ### iTunes fancy podcasting
139 * [iTunes-specific tags](https://www.apple.com/itunes/podcasts/specs.html)
140   appear to be RSS-only
141     * If they work in Atom, teach `inline` to optionally iTunesify RSS/Atom.
142     * Else, add `itunes` as a third kind of feed (RSS plus more stuff).
143 * Notable tags for feeds:
144     * `itunes:subtitle`
145     * `itunes:author`
146     * `itunes:summary` (same as `description`)
147     * `itunes:owner` (includes `itunes:name` and `itunes:email`)
148     * `itunes:image href=''`
149     * `itunes:publisher`
150     * `itunes:category text=''` (can contain subcategories)
151     * `itunes:keywords`
152 * Notable tags for entries:
153     * `itunes:duration`
154         * [[!cpan Audio::TagLib]] might be fastest, if present and applicable
155         * [ffprobe](http://ffmpeg.org/ffprobe.html) is reasonably fast
156         * [mediainfo](http://mediainfo.sourceforge.net/) is way slower
157         * Cache computed durations as pagestate
159 ### Fancy podcast aggregating
161 * Write tests comparing a fancy podcast (HTML and feeds) against
162   the same podcast aggregated and republished, then make them pass
163   via changes to `aggregatepost.impl` and [[plugins/aggregate]].
165 ### Other ideas
167 * Don't render template text (e.g., "Use this template to insert a
168   note into a page") in feeds.
169 * Optionally specify the enclosure's:
170     * MIME type, in case `File::MimeInfo` guesses wrong.
171     * Duration, in case `ffprobe` guesses wrong.
172 * Optionally specify enclosures outside the wiki:
173     * Some people don't want to store big unchanging files in the VCS.
174     * Other people like [podcasting found media](http://huffduffer.com/about).
175     * We'd have to download the file just to compute some metadata
176       about it, and then somehow not frequently re-download it.
177 * Configurably generate additional subscription links (such as
178   iTunes) alongside the RSS/Atom ones in [[plugins/inline]].
179 * Support Apple's "enhanced podcasts" (if they're still relevant).
181 ----
183 [[merged|done]] --[[Joey]]