玩式草子─ソフトウェアとたわむれる日々

第13回 TotemのYouTubeプラグイン再び

この記事を読むのに必要な時間:およそ 9 分

今年の夏は各地で記録的な猛暑の日々が続いていますが,皆さまいかがお過しでしょうか?

データセンターなどが利用できる大手ディストリビューションとは異なり,Plamoのような零細ディストリではFTPサーバ用のマシンも自宅に置いているため,夏の暑さには余計敏感になってしまいます。

今年の暑さは特に厳しくて,去年までは何とか我慢して居室で同居していたサーバ用マシンを,今年はついに隣りの物置用部屋に追い出してしまいました。サーバ機用に空調を管理できるデータセンターとは異なり,お家サーバではサーバ機よりも住人の健康優先はいたしかたないところでしょう。

さて,そのような日々でもディストリビューションの開発作業は続きます。Plamoの場合,筆者の仕事の都合で3月の後半から6月くらいまではほとんど開発時間を取れないので,7月以降の暑い時期に,春ごろから貯まった宿題を片づけるはめになりがちです。今年も,3月にリリースしたPlamo-4.72以降のアップデートを集めた次のメンテナンスリリース(Plamo-4.73)を近々に公開するために現在鋭意作業中です。

今回はその作業中に遭遇した,TotemのYouTubeプラグイン問題を紹介してみましょう。

TotemとYouTube plugin

この連載の3回目あたりでも紹介したように,TotemはGNOME環境のデフォルトのマルチメディアプレイヤーです。Totemでは,動画や音声のデータをデコードするバックエンド部をGStreamerに委ねて多様なコーデックに対応すると共に,フロントエンド部はプラグインを使ってインターネット上のさまざまなサービスに対応する柔軟性を有しています。

このTotemの各種機能の中で,筆者が気に入っていたのは動画投稿サイトYouTubeの動画を見るためのYouTubeプラグインです。この機能(プラグイン)を使えば,firefox等のWebブラウザを起動しなくてもTotemからYouTubeの動画を再生できるので,作業時のBGM代わりに愛用していました。

このプラグインは便利なものの,YouTube側の処理に強く依存しているため,動画ファイルの指定方法などが少しでも変更されれば使えなくなります。事実,かつて紹介したパッチの後にもYouTube側で動画URIの指定方法が変更されたことがあり,それに対応するための新しいパッチが必要となったこともありました。

ところが,7月の中旬くらいから,この新パッチを適用したプラグインでもYouTubeが利用できなくなっていました。正確に言うと,キーワードから動画を検索はできるものの,検索された結果を再生しようとすると,指定されたURLが見つからない旨のエラーになります。

図1 Totem のエラー

図1 Totem のエラー

このエラーは前回も経験したので,またまたYouTube側がAPIを変えたんだろうなぁ…,とあれこれ調べていたところ,修正コードがTotemの開発版用に登録(コミット)された旨の情報をPlamo-MLで教えてもらいました。

さっそくその修正コードを眺めてみましたが,最近のTotem(2.28以降)では,YouTube用のプラグインはより本体と密接に連携できるようにCで書かれたコードになっており,そのままではPlamo-4.7系が採用しているTotem-2.26のPython版プラグインで利用することはできません。一方,Totem-2.26はかなり古くなったバージョンなので,待っていてもPython版のYouTubeプラグインが修正されることは無さそうです。仕方ないので少し手元で調べてみることにしました。

Totem-2.30用YouTubeプラグインパッチ

まずはTotem-2.30用のYouTubeプラグインに施された修正を調べてみましょう。この修正はパッチファイルで公開されており,抜粋して紹介します。

23  g_regex_match (self->regex, contents, 0, &match_info);
24  if (g_match_info_matches (match_info) == TRUE) {
25  - gchar *t_param, *s;
26  - const gchar *fmt_param;
27  - GString *video_uri_string;
28  + gchar *fmt_url_map_escaped, *fmt_url_map;
29  + gchar **mappings, **i;
30  /* We have a match */
31  - s = g_match_info_fetch (match_info, 1);
32  - t_param = g_uri_unescape_string (s, NULL);
33  - if (t_param == NULL)
34  - t_param = s;
35  - else
36  - g_free (s);
37  - fmt_param = get_fmt_param (self);
38  -
39  - video_uri_string = g_string_new ("http://www.youtube.com/get_video?video_id=");
40  - g_string_append_uri_escaped (video_uri_string, video_id, NULL, TRUE);
41  - g_string_append (video_uri_string, "&t=");
42  - g_string_append_uri_escaped (video_uri_string, t_param, NULL, TRUE);
43  - g_string_append (video_uri_string, fmt_param);
44  -
45  - video_uri = g_string_free (video_uri_string, FALSE);
46  + fmt_url_map_escaped = g_match_info_fetch (match_info, 1);
47  + fmt_url_map = g_uri_unescape_string (fmt_url_map_escaped, NULL);
48  + g_free (fmt_url_map_escaped);
49  +
50  + /* The fmt_url_map parameter is in the following format:
51  + * fmt1|uri1,fmt2|uri2,fmt3|uri3,...
52  + * where fmtN is an identifier for the audio and video encoding and resolution as described here:
53  + * (http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs) and uriN is the playback URI for that format. */
54  + mappings = g_strsplit (fmt_url_map, ",", 0);
55  +
56  + for (i = mappings; *i != NULL; i++) {
57  + /* For the moment we just take the first format we get */
58  + gchar **mapping = g_strsplit (*i, "|", 2);
59  + video_uri = g_strdup (mapping[1]);
60  + g_strfreev (mapping);
61  + break;
62  + }

パッチファイルに詳しくない人でも,このリストを見ればある程度意味がわかることでしょう。パッチファイルでは,行頭に "-" が付いた行を削除し "+" が付いた行を挿入することで,元のファイルを新しいファイルに修正することができます。

「パッチ(patch)」はもともと「継ぎ当て用の布」の意味で,古くて擦り切れたソースコードに「継ぎ」を当てて直す,といった意味が込められています。修正箇所をまとめたパッチファイルは,修正前後の2つのファイルの差分をdiffコマンドで抽出した結果で, この結果を手元のソースコードに対してpatchコマンドで適用してやれば,該当するファイルが指示に従って修正されます。

このパッチファイルを見る限り,変更前の従来の手順では,32行目で入手したt_paramを元に,39行目から43行目でサーバのアドレスや動画のID番号(video_id)などの情報を付け加えて動画ファイルのURLを生成しているのに対して,変更後の新しい手順では46~47行目でfmt_url_mapという変数を作り,その変数を切り分けることで動画ファイルのURLを生成しているようです。

具体的には,50行目からのコメントに示されているように,fmt_url_mapにはfmt1|uri1,fmt2|uri2,…という形式で複数のフォーマット情報と対応するURL情報が折り込まれていて,それを54行目のg_strsplit()で "," を区切りに分割し,さらにをその結果を56行目からのループで "|" を区切りに分割し,その結果をvideo_uriと見なす,といった処理のようです。

YouTube用プラグインにどのような修正が必要なのかをざっと把握した上で,Totem-2.26のPython版プラグインの方に目を移します。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入