印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableTypePlugin Podcast は UTF-8 で

Podcast のフィードを作ろうとして見事にハマった。文字コードがいけなかったのだ。プラグインを作って強引に対応する。

■ ■ ■

はじめに

これは Movable Type 2.661 で,文字コードとして EUC-JP を使っている場合の対応方法である。Movable Type 3.x 以降の対応方法はもっとスマートな方法がある。

Podcast 用に RSS 2.0 のフィードを新しく作って,iTunes に登録してみた。しかし,エラーが表示されてしまった。

iTunes のエラー表示
iTunes のエラー表示


[http://nlogn.ath.cx/podcast.xml]は有効な Podcast URL ではないようです。
正しい URL を入力したことを確認して、もう一度やり直してください。

URL は合っている。フィードの内容がいけないのだ。MT 3.2x 用テンプレート (RSS 2.0 Index) でもダメだし,MT 2.6x 用のテンプレート(2.6x Default Templates)でもダメだった(同じ RSS 2.0 フィードでも,3.2x 用と 2.6x 用では違うもののように見えるのは,使っている名前空間が違うからなのだろう)。

調べてみると,原因は文字コードにあった。アップル - iTunes - Podcast - 技術仕様 (オリジナル英語版)には次の記述がある。

フィードにはUTF-8エンコードを使用してください。UTF-8以外のエンコードは、iTunesでは動作保証されません。

他のコードを試した人もいて,ポッドキャスティング配信方法 では,ブログの文字コードをEUCにしているためか、iTunesではエラーになってしまいました。(中略) iTunesでは、UTF-8とShift_JISなら認識してくれるようです。 とのこと。Shift_JIS でもいけそうだが,iTunes の技術仕様通り UTF-8 がいいだろう。

EUC-JP から UTF-8 に変換するプラグイン

環境は Movable Type 2.661。文字コードを EUC-JP から UTF-8 に変換しなければならない。プラグインがないか探してみると,mt-jfold というものがあったのだが(Milano::Monolog: プラグインを3.0対応にしました),バージョンアップされていて,MT::I18N を使うようになっていた。MT::I18N は,MT 3.0 で新しく導入されたモジュールで,MT 2.6x には存在しない。mt-jfold の旧いバージョンは公開されていない。むー。MT 3.0 以降であれば,mt-jfold のスーパーセットである MT-I18N Plugin - Ogawa::Memoranda で対応するのがスマートだろう。

仕方ないので,自前でプラグインを用意することにした。

package MT::Plugin::Convert2UTF8;
use strict;
use Jcode;
use MT::Template::Context;
MT::Template::Context->add_container_tag(Convert2UTF8 => \&Convert2UTF8);
use vars qw($VERSION);
$VERSION = 0.1;

sub Convert2UTF8 {
  my ($ctx, $args) = @_;
  my $tokens = $ctx->stash('tokens');
  my $builder = $ctx->stash('builder');

  defined(my $out = $builder->build($ctx, $tokens))
    or return $ctx->error($builder->errstr);

  $out =~ s|<\?xml version="1.0" encoding="EUC-JP"\?>|<\?xml version="1.0" encoding="UTF-8"\?>|i;
  $out = Jcode::convert($out, "utf8", "euc");

  $out;
}

1;

短っ! 本質的な部分は2行しかない。

ファイル名は何でもよいので,例えば convert2utf8.pl などとして plugins ディレクトリ内に保存する。Perl モジュール Jcode.pm を利用して一発変換している。折角なので,xml 宣言の部分も変換する。Perl のコードとしては,「?」を「\?」としてエスケープしておくのがポイントである。

テンプレートの作成

Podcast 必要なプラグイン Brandon Fuller | MT-Enclosures: A Movable Type Plugin をインストールしておく。

RSS 2.0 に関しては,MT 2.661 でも MT 3.2x 用のテンプレートが使える。3.2x Default Templates から RSS 2.0 Index をコピーしてきて,新しくインデックスを作る。

赤色で示した部分をテンプレートのコードに追加する。「...」は省略を表す。

<MTConvert2UTF8><?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<rss version="2.0">
   <channel>
      ...
      <MTEntries lastn="15">
      <item>
         ...
         <$MTEntryEnclosures  mime_include="audio"$>
      </item>
      </MTEntries>
   </channel>
</rss></MTConvert2UTF8>

最初の <MTConvert2UTF8> の直後に改行や空白文字を入れてはならない。xml 宣言はドキュメントの最初になければならないからである。

再構築後,iTunes への登録に成功すれば完成である。

その他

上で作ったフィードには,iTunes が独自に用意しているタグを使っていない。使わなくても iTunes で再生は可能である。iTunes タグを追加するのはまた後日ということで。

Posted by n at 2006-08-25 01:24 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?