Radikoで録音したファイルの一覧からid3タグを取出してPodcastを作成


Radikoでとりためたものをipodで聴きたいのでpodcastにしてみた。一部サブルーチンで使っている変数が引数でわたしていないなど中途半端ですが、perlは初心者なのであしからず。できる方は適当になおしてあげてください。

#!/usr/bin/perl
#-------------------------------------------
# File list to Podcast
#-------------------------------------------
use strict;
use warnings;
use utf8;
use Encode;
use Jcode;
use MP3::Tag;
use XML::DOM;
use XML::Twig;
# 入出力設定
if( $ARGV[0] eq "" ){
print "Error\n";
exit(0);
}
my $mas_dir = '/var/www/html/podcast/';
my $input_dir = $mas_dir . $ARGV[0] . '/audio/';    # 入力ディレクトリ名
my $xml_out_dir = $mas_dir . $ARGV[0] . '/index.xml';    # 出力xmlファイル
my $podcast_url = 'http://192.168.X.X/' .$ARGV[0] . '/audio/';
#-------------------------------------------
# ファイル一覧を取得
#-------------------------------------------
opendir DH, $input_dir or die "$input_dir:$!";
my @dir_files = readdir DH;
my @sort_dir_files  = sort @dir_files;
my @reverse_dir_files  = reverse @sort_dir_files;
my @fileinfo_list_hash=();
foreach my $filename (@reverse_dir_files) {
next if $filename =~ /^\.{1,2}$/;        # '.'や'..'も取れるので、スキップする
utf8::decode($filename) unless utf8::is_utf8($filename);    # 日本語ファイル対応
my $filesize = -s $input_dir.$filename;
my @filestat = stat $input_dir.$filename;
my $filedate = localtime($filestat[9]);
my $mp3 = MP3::Tag->new($input_dir.$filename);    # MP3タグ情報
my $fileinfo = {
"filename"=>$filename ,                    # ファイル名
"size"=>$filesize ,        # ファイルサイズ(バイト)
"date"=>$filedate ,    # 更新日時
"title"=>$mp3->title() ,    # 番組タイトル
"comment"=>$mp3->comment() ,    # コメント
"url"=>$podcast_url.$filename    # podcastのURL
};
push(@fileinfo_list_hash, $fileinfo );
}
closedir DH;
&xml_create(@fileinfo_list_hash);
#============================================
# Podcast用 RSS
#============================================
sub xml_create {
my(@fileinfo) = @_;
my $xmlSrc = <<"DATA";
<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd" version="2.0">
<channel>
<title>xxx</title>
<link>http://192.168.X.X</link>
<description></description>
<language>ja</language>
<copyright></copyright>
<itunes:owner>
<itunes:name>/itunes:name&gt;
<itunes:email></itunes:email>
</itunes:name>
<itunes:summary></itunes:summary>
</itunes:owner>
</channel>
DATA
# XMLを解析しノードを生成
my $parser = new XML::DOM::Parser;
my $dom = $parser-&gt;parse($xmlSrc);
foreach my $info ( @fileinfo ) {
# アイテムノードを作成
my $item = $dom-&gt;createElement("item");
# title
my $title = $dom-&gt;createElement("title");
$title-&gt;appendChild($dom-&gt;createTextNode(Encode::decode_utf8( $info-&gt;{ title } )));
# description
my $description = $dom-&gt;createElement("description");
$description-&gt;appendChild($dom-&gt;createTextNode(Encode::decode_utf8( $info-&gt;{ comment } )));
# itunes:author
my $itunesauthor = $dom-&gt;createElement("itunes:author");
$itunesauthor-&gt;appendChild($dom-&gt;createTextNode("自分"));
# author
my $author = $dom-&gt;createElement("author");
$author-&gt;appendChild($dom-&gt;createTextNode("自分"));
my $enc = $dom-&gt;createElement("enclosure");
$enc-&gt;setAttribute("url",$info-&gt;{ url });
$enc-&gt;setAttribute("type","audio/mpeg");
$enc-&gt;setAttribute("length",$info-&gt;{ size });
# pubDate
my $pubdate = $dom-&gt;createElement("pubDate");
$pubdate-&gt;appendChild($dom-&gt;createTextNode($info-&gt;{ date }." JST"));
# 本ノードにエレメントを追加
$item-&gt;appendChild($title);
$item-&gt;appendChild($description);
$item-&gt;appendChild($itunesauthor);
$item-&gt;appendChild($author);
$item-&gt;appendChild($enc);
$item-&gt;appendChild($pubdate);
# ルートからchannelノードを取り出し本ノードを追加
$dom-&gt;getElementsByTagName("channel")-&gt;item(0)-&gt;appendChild($item);
}
#インデントを付加して整形
my $twig= new XML::Twig;
$twig-&gt;set_indent(" "x4);
$twig-&gt;parse($dom-&gt;toString);
$twig-&gt;set_pretty_print("indented");
# ファイルへ出力
open(OUTXML, "&gt;".$xml_out_dir);
print OUTXML Encode::encode_utf8($twig-&gt;sprint);
close(OUTXML);
}
</rss>

ジャンルなど複数ディレクトリに対応したかったので入出力ディレクトリをコマンドに渡す形式にしています。これをcronで回せばマスタからpodcast用のxmlを更新できます。

<ご注意!>

radikoの録音 linuxのシェルを使う(2)と組み合わせていますが、あくまでも自宅で自分が楽しむためなので、とった番組の公開などはしていません。私的録音の範囲を逸脱する行為を推奨しているわけではありませんので十分にご理解の上参考にして頂ければと思います。


投稿者: ちゅう たろう

ネットワーク・サーバー周りをちょっと知っているだけの普通の人です。