自分用にカスタマイズしたPodcastを活用する

Podcastは非常に便利で、個人的には活用しています。
ところで有益な情報を提供してくれているにも関わらず、諸般の理由で
Podcastとして公開されていないことがあります。

例えばラジオ番組。
従来の放送との兼ね合いもあるのでしょうか。Podcastでは公開されていない
ことが多いです。

最近自宅サーバに取り込んでRSSを自動生成するようにしました。
備忘録として書いてみます。
記述する範囲はRSSを作成するところと、HTTPサーバ(Lighttpd)の設定につい
てのみです。

==準備==

===Ruby===
個人的にRubyが好みなので、RubyでRSSを生成する処理を記述しました。
1.9.3で動作確認をしています。多分1.8.7系でも動作します。

===HTTPサーバ===
自宅サーバは既にLighttpdを導入しているので、こちらに設定を追加しました。

==参考URL==
[http://haraita9283.blog98.fc2.com/blog-entry-312.html Ruby/REXML: CCLedなオーディオコンテンツを紹介するポッドキャストのフィード(RSS2.0)の読み書き | anobota]

==Rubyスクリプト==


#!/usr/bin/ruby
# -*- coding: utf-8 -*-

require “rexml/document”
require “uri”

class REXML::Element
def add_elem(type, text, attributes=nil)
elem = REXML::Element.new(type)
elem.text = text if text
self.add_element(elem, attributes)
end
end

def make_rss2(channel_info, tracks)
rss = REXML::Document.new
rss << REXML::XMLDecl.new("1.0", "utf-8") rss.add_element("rss", { "version"=>“2.0”,
# “xmlns:creativeCommons”=>”http://backend.userland.com/creativeCommonsRssModule”,
“xmlns:dc”=>”http://purl.org/dc/elements/1.1/”,
“xmlns:atom”=>”http://www.w3.org/2005/Atom”
})

channel = REXML::Element.new(“channel”)
channel.add_elem(“title”, channel_info[:title])
channel.add_elem(“link”, channel_info[:link])
channel.add_elem(“description”, channel_info[:description])
rss.elements[“rss”].add_element(channel)

tracks.each {|track|
item = REXML::Element.new(“item”)

item.add_elem(“title”, “%s (by %s)” % [track[:title], track[:artist]])
item.add_elem(“dc:title”, track[:title])
item.add_elem(“dc:creator”, track[:artist])
item.add_elem(“author”, track[:artist])
item.add_elem(“pubDate”, track[:pubdate])
item.add_elem(“description”, track[:description])
item.add_elem(“guid”, URI.encode(track[:audiofile_url]))
item.add_elem(“enclosure”, nil,
{ “url”=>URI.encode(track[:audiofile_url]),
“length”=>File.size(track[:audiofile_local_path]),
“type”=>”audio/mpeg”
})

rss.elements[“rss/channel”].add_element(item)
}

return rss
end

################################################################
## データを用意

channel = {
:title => “お気に入り”,
:link => “http://foo.bar”,
:description => “概要”,
}

tracks = []

################################################################
## ファイルの検索
`/bin/ls -1dp “#{File.dirname( __FILE__)}/”* | /bin/grep “\/$”`.gsub(/\/$/,”).split(“\n”).each do |d|
`find #{d} -name “*.m4a” -or -name “*.mp3″`.split(“\n”).each do |f|
s = File::stat(“#{f}”)
tracks << { :title => “#{d}(#{s.mtime})”,
:artist => “#{d}”,
:pubdate => “#{s.mtime}”,
:description => “#{d} #{s.mtime} 分”,
:audiofile_url => “http://foo/bar/podcast/#{f}”,
:audiofile_local_path => “/userdata/share/allusrs/stream/#{f}”
}
end
end

################################################################
## フィードに書き出し

rss_src = make_rss2(channel, tracks).to_s.gsub(/>\n<") open("podcast.xml", "w") {|f| f.puts rss_src }

ひとまず上記により、このスクリプトを配置している場所にあるディレクトリ
配下に含まれるmp3, aac(m4a)ファイルを探索し、RSSのItemとして登録する。

[http://haraita9283.blog98.fc2.com/blog-entry-312.html Ruby/REXML: CCLedなオーディオコンテンツを紹介するポッドキャストのフィード(RSS2.0)の読み書き | anobota]
にあるソースがベースである。
厳密にはほぼそのままだが…

ただし、もともとはguidタグに記述するURLに対するURLエンコード処理が存
在していなかったが、これにより日本語を含むURLがiTunesに登録されない問
題があったので修正している。

==Lighttpdの設定==

/etc/lighttpd/lighttpd.conf に以下のような記述を追加する。


$HTTP[“remoteip”] != “192.168.0.0/24” {
url.access-deny = (
“^/podcast”
)
}

上記の例では、http://foo/bar/podcast/ 配下に podcast.xmlといったRSSが
存在することを想定している。

これにより、192.168.0.X以外からのアクセスを禁止する。
オリジナルのデータを公開するのは問題ないはずだが、そうでないものが誰も
が参照できる状態になるのは問題である。

==iTunesに取り込む==

メニューにある [詳細] → [Podcastを登録] から URLを指定する。
ちなみに file://〜 や /foo/bar といった形式では登録できないことに注意
すること。