2年ほど前から、USB 接続タイプの AM/FM ラジオを購入して、いろいろなラジオ番組を録音して聴いています。特に AM を聞くのは高校生の頃以来で、久しぶりに楽しんでいます。

定期的に録音するようになると、オーディオファイルを手動でデジタルオーディオプレイヤーに転送するのが面倒になってきました。タイマーで自動録音したものを、自動的に転送することはできないだろうかと考え、Podcast として登録することにしました。そのためには、Podcast として登録できるフィードを作成しなければいけません。これはブログの更新情報と同様の RSS 形式ですので、以前の記事を参考に Windows PowerShell で Podcast フィード生成スクリプトを作ることにしました。

必要なもの

  • オーディオファイル、またはビデオファイル
  • Windows PowerShell (1.0 or 2.0)
  • .NET Framework 3.5 以降
  • IIS などの Web サーバー
  • Podcast 対応ソフトウェアやデジタルオーディオプレイヤー

参考情報(以前の記事)

まずは、Podcast として登録するオーディオファイルを用意します。ここでは、e:\radio フォルダに保存されているとします。

image

これらのオーディオファイルを元に、Podcast の RSS フィードを作成することにします。

まずは準備です。

  • RSS を簡単に作成できる .NET Framework のライブラリを読み込みます。これは .NET Framework 3.5 以降に含まれます。
  • 以降のスクリプトを書きやすく、見やすくするために、
    System.ServiceModel.Syndication という名前空間を入れた変数を使います。
  • 複数の番組に対応するため、$progs という配列に番組名を入れておきます。
    • ここでは、ファイル名の先頭文字列を見て、どの番組のファイルか判断することにしますので、日本語の番組名と RSS フィードのファイル名に使うための英語の番組名を登録しておきます。(ファイルのプロパティ値へのアクセスは、別の記事で触れたいと思います。)

[Reflection.Assembly]::LoadWithPartialName("System.ServiceModel.Web") |
   Out-Null
$sss = "System.ServiceModel.Syndication."

$progs = @{
  TitleE = "EIKAIWA"
  TitleJ = "ラジオ英会話"
}, @{
  TitleE = "CHARO"
  TitleJ = "チャロ"
}

$mp3dir = "E:\radio"

次に RSS フィードを格納する、System.ServiceModel.Syndication.SyndicationFeed オブジェクト $feed を、番組の数だけ作成します。また、フィード全体に関する情報である、最終変更時刻や番組名などを、$feed のプロパティにセットします。

0..($progs.count-1) | foreach {
  $feed = new-object ($sss + "SyndicationFeed")
  $feed.LastUpdatedTime = [DateTimeOffset]::Now
  $prog = $progs[$_]["TitleJ"]
  $feed.Title = $prog

では、実際のオーディオファイルの情報からフィードを作成しましょう。

  • $mp3dir フォルダー内の、$prog 文字列で始まるファイル名のリストを取得し、それらのファイル情報をフィードに追加していきます。
  • ファイルごとに System.ServiceModel.Syndication.SyndicationItem オブジェクトを作成し、タイトルや日付を登録します。
    • タイトルはファイル名から拡張子 (extension) を削除したものを使っています。オーディオファイルの属性値から取得した方がよい場合もあると思います。
    • ファイルの作成日時 (CreationTime) を発行日付として登録しています。
    • System.ServiceModel.Syndication.TextSyndicationContent オブジェクトを���って、内容説明にもタイトルをセットしています。

  dir ("{0}\*{1}*" -f  $mp3dir, $prog) | sort LastWriteTime -desc | `
  foreach {
    $title = ($_.name.replace($_.extension,""))
    $item = new-object ($sss + "SyndicationItem")
    $item.Title = $title
    $item.PublishDate = $_.CreationTime
    $item.Content = new-object ($sss + "TextSyndicationContent") $title

ここからは Podcast に特有の部分です。

  • System.ServiceModel.Syndication.SyndicationLink オブジェクトを作成し、オーディオファイルの情報をセットし、先に作った SyndicationItem にリンク要素として追加します。
  • Podcast としてオーディオファイルにアクセスする URL を $link.Uri にセットしています。ここでは、オーディオファイルと同じコンピューターの IIS を経由して
    http://localhost/podcast/ファイル名 でアクセスするようにします。

    $link = new-object System.ServiceModel.Syndication.SyndicationLink
    $link.Uri = "http://localhost/podcast/{0}" -f $_.name
    $link.Length = $_.length
    $link.MediaType = "audio/mpeg"
    $link.RelationshipType = "enclosure"
    $item.Links.Add($link)
    $feed.items.add($item)
  }

これで Podcast 用の RSS フィードがセットされたオブジェクト $feed が準備できましたので、あとはファイルに書き出すだけです。

  • ここでは、RSS 2.0 形式で書き出すように、
    System.ServiceModel.Syndication.Rss20FeedFormatter クラスを使っています。
  • ”英語の番組名”.xml というファイルを、オーディオファイルと同じフォルダに作成します。

  $rssFormatter = new-object ($sss + "Rss20FeedFormatter") $feed
  $rssFile = "{0}\{1}.xml" -f $mp3dir, $progs[$_]["TitleE"]
  $rssWriter = [System.Xml.XmlWriter]::Create($rssFile)
  $rssFormatter.WriteTo($rssWriter);
  $rssWriter.close()
}

生成された XML ファイルを見てみると、RSS 形式になっています。

image

多くの場合、この XML ファイルを直接 Podcast として登録するのではなく、http://.. といった URL で登録する必要があります。そのため、ローカルの IIS にこのフォルダを登録し、http(s) でアクセスできるようにしましょう。

  • IIS マネージャーで仮想ディレクトリを追加します。
  • エイリアスは、スクリプト内で指定した $link.Uri、つまり XML ファイルの <enclosure> 要素の URL でアクセスできる名前に合わせます。

image

image

これで、生成した XML ファイルに http(s) 経由でアクセスできるようになりました。ブラウザで見てみましょう。

ブログの RSS と同様に、フィードとして認識されています。オーディオファイル名が文字化けしていますが、アクセスには問題ありません。(フィードとして認識されない場合は、一旦ブラウザを立ち上げ直してみてください。)

image

ここまでできれば、あとはお好みのオーディオプレイヤーに Podcast として登録するだけです。

iTunes では、詳細メニューから Podcast の URL を登録することができます。

image

image

image

Winamp では、メディアライブラリ > Podcast ディレクトリ > サブスクリプションから追加します。(オレンジ色の枠内)

image 

無事登録できました。さらに、この Podcast フィード作成スクリプトをタスクスケジューラーに登録し、定期的に実行すれば、自動的にフィードが更新され、オーディオプレイヤーにも同期されるためとても便利です。

このように Windows PowerShell と .NET Framework とを活用して、ほんの30行程度のスクリプトで Podcast のフィード生成スクリプトを作ることができます。しかも直接の XML の操作は一切ありません。Windows PowerShell の強力さを実感、です。

※ なお、本スクリプトでは基本的な情報しかフィードに含めていません。アイコン画像など、より多くの情報をどのようにして System.ServiceModel.Syndication クラスで扱うことができるのか試行錯誤中です。