Windows Media Player 9.0以降で使用されるプレイリストファイル(wpl形式)を、Linux等でも使用できるようにm3u形式に変換する。

プレイリストのフォーマット

Windows Media Player 9.0以降で使用されるプレイリスト(wpl形式)は、下記のような形式のXMLファイルとなっている(media要素にはsrc以外の属性が存在する場合もある)。

<smil>
    <head>
        <meta name="Generator" content="Microsoft Windows Media Player -- 9.0.0.2980"/>
        <author></author>
        <title>プレイリストのタイトル</title>
    </head>
    <body>
        <seq>
            <media src="Sample Album\01 xxxx.wma"/>
            <media src="Sample Album\02 yyyy.wma"/>
            <media src="Sample Album\03 zzzz.wma"/>
        </seq>
    </body>
</smil>

    
        
        
        プレイリストのタイトル
    
    
        
            
            
            
        
    
]]>

また、m3u形式の(もっともシンプルな)フォーマットは下記のような形式のテキストファイルとなっている(単にファイル名を列挙しただけ)。

Sample Album/01 xxxx.wma
Sample Album/02 yyyy.wma
Sample Album/03 zzzz.wma

wpl形式のファイルから、media要素のsrc属性のみを取り出してファイルとして書き出せば、m3u形式のプレイリストとなる。

Perlで作成した変換スクリプト

wpl形式のプレイリストをm3u形式に変換するPerlスクリプト。 XMLパーサ等を使用しない手抜き版、src属性の内容は正規表現で取得している。 第一引数に変換元wpl形式のプレイリストファイルのパス、第二引数に変換後(m3u形式)のプレイリストファイルのパスを指定して実行する。

#!/usr/bin/perl

#
# wpl2m3u.pl
# 
# Usage: wpl2m3u.pl source.wpl dest.m3u
#

my $path_win = quotemeta( 'E:\\Musics\\' );
my $path_unix = '/home/santamarta/musics/';

# wpl形式のファイルを読み込む
open( INPUT, "<$ARGV[0]" ) or die "couldn't open source '$ARGV[0]'";

my @lines = <INPUT>;

close( INPUT );

# m3u形式のファイルを作成する
open( OUTPUT, ">$ARGV[1]" ) or die "couldn't open destination '$ARGV[1]'";

foreach $line ( @lines ) {
  # media要素にマッチする行を取得する
  if ( $line =~ /^\s+\<media\ssrc\=\"([^\"]+)\".+$/ ) {
    my $path = $1;

    # パスをWindows形式からUNIX形式に変換
    $path =~ s/$path_win/$path_unix/o;
    $path =~ s/\\/\//g;

    # エスケープされた文字を復元
    $path =~ s/\&gt\;/\>/g;
    $path =~ s/\&lt\;/\</g;
    $path =~ s/\&apos\;/\'/g;
    $path =~ s/\&quot\;/\"/g;
    $path =~ s/\&amp\;/\&/g;

    print OUTPUT "$path\n";
  }
}

close( OUTPUT );
;

close( INPUT );

# m3u形式のファイルを作成する
open( OUTPUT, ">$ARGV[1]" ) or die "couldn't open destination '$ARGV[1]'";

foreach $line ( @lines ) {
  # media要素にマッチする行を取得する
  if ( $line =~ /^\s+\/g;
    $path =~ s/\<\;/\

$path_winと$path_unixは音楽ファイルのあるパスを表しているので、使用している環境にあわせて書き換えること。