#navi(../)
# 音楽室をリニューアルしてみた（[Loudblog](http://loudblog.com/)の改造／[dojo](/dojo).query、swfObjectの使い方）
http://logue.be/podcast/

MP3プレイヤーは、[Marsh氏のmrmp3player.swf](http://marsh.way-nifty.com/mashlog/2008/10/mp3-190a.html)を使うことにした。さて、ソースをみるとどうやら、FlashVarsにmp3、lyric、mp3title、mp3artistというFlashに渡すパラメータがあり、どれか一つでもかけていると使えないようである。とりあえず、Loudblog本体は極力いじらない方向で再生する方法を考えていたところ妙案を思いついた。それは、 **CSSセレクタを使ってパラメーターをLoudblogから抜き出して、swfObjectを使ってFlashを書き換えればいいじゃないか** ということである。

ここでは、例によって慣れている[dojo](/dojo)を使うことにした。FireFoxならFireBugで関数の名前や処理の結果を出力することができるが、IEではこれができない。やっぱりフレームワークの一部にFirebugが入っていることは便利である。

## 本体の改造
まず、本体の改造だ。Flashを書き換えるためには<object>タグにID属性をつける必要がある。あとで、処理しやすいようにplayer0、player1というようなIDになるようにしよう。そこで、loudblog/inc/function.phpの1198行目付近を以下のようにする。
#code(diff)
function showflash ($url, $width, $height) {
1. global $player_count;
```
   $return = "\n<object type=\"application/x-shockwave-flash\" ";
```
1. $return .= "id=\"player".$player_count."\" ";
```
   $return .= "data=\"".$url."\" ";
   $return .= "width=\"".$width."\" height=\"".$height."\">\n";
   $return .= "    <param name=\"movie\" value=\"".$url."\" />\n";
   $return .= "</object>\n";
```
1. $player_count++;
```
   return $return;
```
}
}}

## [dojo](/dojo)の準備
次に、dojoを呼び出す。面倒だからGoogle CDNのスクリプトにダイレクトリンク。dijitといったUI拡張は行わないためこの２つだけで問題ない。テンプレートのヘッダーに以下の行を追加。
```
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/dojo/1.2.3/dojo/dojo.xd.js" djConfig="isDebug:true"></script>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.2.3/dojo/resources/dojo.css" />
```

### 曲名のタイトル
dojo.queryとは、dojoのCSSセレクタである。たとえば、mp3titleで使うパラメータはh2タグの文字である。従って
```
dojo.query('h2')
```
で、ページに含まれるすべてのh2タグの内容を配列として取得できる。たとえば、３番目のh2タグにアクセスしたい場合は、
```
dojo.query('h2')[2]
```
となる。２なのは単に０からカウントしているため。次にテキストデーターを取得したいのでIEでは、
```
dojo.query('h2')[2].innerText
```
になる。これで、曲名のタイトルが取得できる。しかし、IE以外ではinnerTextでテキストを読み込むことができない。そこで、textContentを使う。これは逆にIEでは使えないため、分岐処理が必要になる。
```
dojo.query('h2')[2].textContent;
```
となる。

### mp3の位置
次にmp3の位置である。Loudblogでは、
```
<object type="application/x-shockwave-flash" data="loudblog/custom/templates/(テンプレート名)/emff.swf?src=get.php?fla=(ファイル名).mp3" width="355" height="28">
 <param name="movie" value="loudblog/custom/templates/(テンプレート名)/emff.swf?src=get.php?fla=(ファイル名).mp3" />
</object>
```
でmp3を呼び出している。ちなみに、get.php?fla=というパラメータが必要になるのは、mp3のflashによる再生回数をLoudblogで集計しているため。ここで必要になるパラメータは、(ファイル名).mp3なので、=でsplitすると、３番目にmp3のファイル名が出てくる。どういうわけか、Loudblogでは標準で、.htaccessのmod_rewrite指定にget?php=flaというアドレスをfla/でアクセスできるようになっているので、本来ならば、emff.swf?fla/(ファイル名).mp3でもいいはずだが・・・。

まぁ、それはさておき結論から言うと、mp3は
```
'./fla/' + dojo.query('object')[count].data.split(/=/)[2],
```
という感じで、mrmp3player.swfに渡せばいいだろう。同一ドメインなので相対指定でも問題ない。

ここでは、
```
location.href.split(/\?/)[0]
```
で、Loudblogの設置ディレクトリを指定し、そこにfla/を追加して、
```
dojo.query('object')[count].data.split(/=/)[2]
```
で、その後ろにobjectタグのdata属性から、mp3のファイルを=で分割してファイル名を取得している。

### mp3artist
mp3artistだが、しゅとくする方法がこのままではないので、テンプレートの<lb:author />を<span class="author">タグで囲んでそれをdojo.queryで呼び出すことにした。
```
dojo.query('span.author')[n].childNodes[0].data
```
dojo.query('span.author')[n].innerTextでアクセスできないので、やや変則的だがこれで問題ない。

なお、IE以外では、
```
dojo.query('span.author')[count].textContent;
```
でも読み込める

### そのほか
lyricは、
```
[00:00:00]表示したいテキスト
```
という内容の外部テキストファイルを読み込んで使うらしい。mp3のid3タグのLyricsを参照させることは可能だが、今回は割愛。空欄にしておこう。

## [swfObject](http://code.google.com/p/swfobject/)の指定
swfObjectは、flashを呼び出す際の煩雑なタグ打ちを簡略化したり、flashのバージョンが古いときに自動的にアップグレードしたりするスクリプトで広く使われている。まぁ、dojoにもこれと同じ処理ができるAPI『[dojox.embed.Flash](http://api.dojotoolkit.org/jsdoc/dojox/1.2/dojox.embed.Flash)』があるわけだが、いかせん採用事例が少ない。というか、<span style="color:red">dojox.embed.Flashの検索結果で一番ヒットするのが自分の作っている[Lorelei](http://mabinogi.logue.be/)の[ソースコード](http://code.google.com/p/lorelei/source/browse/trunk/webroot/js/lorelei/mml/player.js)じゃないか！</span>

dojox.embed.Flashを使ったサンプルは後日書くとして、今回はswfObjectを使う。使い方は、[SWFObject v2.0 ドキュメント日本語訳](http://mtl.recruit.co.jp/blog/2007/10/swfobject_v20.html)を参考にした。形式は、
```
swfobject.embedSWF([埋め込むFlash],[書き換えるターゲットとなるDOM],[幅],[高さ],[Flashのバージョン],[expressInstall.swfの位置, [flashvarsのパラメータ], [paramタグの内容], [Flashのobjectタグに埋め込む属性]);
```
らしい。

結果上記パラメータを加えて
#code(HTML)
script type="text/javascript">
<!--<![CDATA[-->
var flashvars = {},params = {},attributes = {};

flashvars.mp3 = './fla/' + dojo.query('object')[count].data.split(/=/)[2];
if (dojo.isIE){
```
	flashvars.mp3title = dojo.query('h2')[count].innerText;
	flashvars.mp3artist = dojo.query('span.author')[count].childNodes[0].data;
```
}else{
```
	flashvars.mp3title = dojo.query('h2')[count].textContent;
	flashvars.mp3artist = dojo.query('span.author')[count].textContent;
```
}
flashvars.lyric = ' ';

params = {
```
	'repeat':'false',
	'quality':'high',
	'bgcolor': '#000000'
```
}
swfobject.embedSWF('loudblog/custom/templates/(テンプレート名)/mrmp3player.swf','player'+count,'320', '240', '9.0.0','loudblog/custom/templates/(テンプレート名)/expressInstall.swf', flashvars, params, attributes);
count++;
<!--]]>-->
/script>
}}
となる。あと、カウンターを初期化する処理をヘッダー内に入れる
#code(HTML)
script type="text/javascript">
<!--<![CDATA[-->
var count = 0;
<!--]]>-->
/script>
}}

これで、完成だ。JavaScriptが無効なときはデフォルトのemff.swfが使われる。


---

## Page Navigation

- Canonical URL: https://logue.be/blog/2008-12-23
- Permalink: https://logue.be/66d5d8744b8138004c26ff23
- Parent: [blog](/66d5d5a24b8138004c26fc62.md)
- Children: 0 total
- Total descendants: 0
- Siblings: 50 of 396 total (346 more not shown; see the page list API below for the full listing)
  - [2004-01-06](/66d5d5a44b8138004c26fc64.md)
  - [2004-01-20](/66d5d5a64b8138004c26fc66.md)
  - [2004-01-27](/66d5d5a84b8138004c26fc68.md)
  - [2004-01-27_オークって](/66d5d5aa4b8138004c26fc6a.md)
  - [2004-01-27_プリーストになりました](/66d5d5ac4b8138004c26fc6c.md)
  - [2004-01-28](/66d5d5ae4b8138004c26fc6e.md)
  - [2004-01-30](/66d5d5b04b8138004c26fc70.md)
  - [2004-02-05](/66d5d5b24b8138004c26fc72.md)
  - [2004-02-08](/66d5d5b44b8138004c26fc74.md)
  - [2004-02-09](/66d5d5b64b8138004c26fc76.md)
  - [2004-02-11](/66d5d5b84b8138004c26fc78.md)
  - [2004-02-11_遊行](/66d5d5ba4b8138004c26fc7a.md)
  - [2004-02-15](/66d5d5bc4b8138004c26fc7c.md)
  - [2004-02-16](/66d5d5be4b8138004c26fc7e.md)
  - [2004-02-23](/66d5d5c04b8138004c26fc80.md)
  - [2004-02-26](/66d5d5c24b8138004c26fc82.md)
  - [2004-02-26_ニュマ農園](/66d5d5c44b8138004c26fc84.md)
  - [2004-02-27](/66d5d5c74b8138004c26fc86.md)
  - [2004-02-27_遊行](/66d5d5c94b8138004c26fc88.md)
  - [2004-02-29](/66d5d5cb4b8138004c26fc8a.md)
  - [2004-03-03](/66d5d5cd4b8138004c26fc8c.md)
  - [2004-03-04](/66d5d5cf4b8138004c26fc8e.md)
  - [2004-03-05](/66d5d5d14b8138004c26fc90.md)
  - [2004-03-10](/66d5d5d34b8138004c26fc92.md)
  - [2004-03-17](/66d5d5d54b8138004c26fc94.md)
  - [2004-03-19](/66d5d5d74b8138004c26fc96.md)
  - [2004-03-20](/66d5d5d94b8138004c26fc98.md)
  - [2004-04-21](/66d5d5db4b8138004c26fc9a.md)
  - [2004-04-29](/66d5d5dd4b8138004c26fc9c.md)
  - [2004-05-11](/66d5d5df4b8138004c26fc9e.md)
  - [2004-05-13](/66d5d5e14b8138004c26fca0.md)
  - [2004-05-16](/66d5d5e34b8138004c26fca2.md)
  - [2004-05-21](/66d5d5e54b8138004c26fca4.md)
  - [2004-05-22](/66d5d5e84b8138004c26fca6.md)
  - [2004-05-22_鈍器祭り](/66d5d5ea4b8138004c26fca8.md)
  - [2004-05-24](/66d5d5ec4b8138004c26fcaa.md)
  - [2004-06-09](/66d5d5ee4b8138004c26fcac.md)
  - [2004-06-30](/66d5d5f04b8138004c26fcae.md)
  - [2004-07-02](/66d5d5f24b8138004c26fcb0.md)
  - [2004-07-04](/66d5d5f44b8138004c26fcb2.md)
  - [2004-07-04_そりゃ無理だろう](/66d5d5f64b8138004c26fcb4.md)
  - [2004-07-08](/66d5d5f84b8138004c26fcb6.md)
  - [2004-07-10](/66d5d5fa4b8138004c26fcb8.md)
  - [2004-07-10_逆毛ー内藤ヒーラー](/66d5d5fc4b8138004c26fcba.md)
  - [2004-07-19](/66d5d5fe4b8138004c26fcbc.md)
  - [2004-08-07](/66d5d6004b8138004c26fcbe.md)
  - [2004-08-19](/66d5d6024b8138004c26fcc0.md)
  - [2004-08-25](/66d5d6044b8138004c26fcc2.md)
  - [2004-08-25_マッチポンプ](/66d5d6064b8138004c26fcc4.md)
  - [2004-08-29](/66d5d6084b8138004c26fcc6.md)
- Last updated: 2024-09-02T17:01:54.472Z by 
- Full page listing (all children regardless of count): https://logue.be/_api/v3/page-listing/children?id=66d5d8744b8138004c26ff23
