カテゴリー : appleScript

このカテゴリーの登録数:2件 表示 : 1 - 2 / 2

Feb 28, 2005

ローカルで動いているiTunesの情報をWEBに(2)

ポスト @ 16:39:07 , 修正 @ Dec 28, 2005 10:19:06 | perl,php,appleScript,soft


設置先garden staff room

前回の書き方が悪かったようで・・・

iTunesの曲情報をサイトにアップしてくれるソフトが原因でiMacが固まるととられそうな書き方を一部しましたがあくまでもこれはウチの場合という事でそのソフト自体は非常に有用でまた問題なく動作するソフトです。
固まる要因の一番はどう考えてもウチのiMacが非力な上、iTunesから出力された音をリアルタイムでデジタルマスタリング(みたいな事)をして出力するVolume LogicというiTunesのプラグインを利用しているからです。
なんて書くと今度はVolume Logicが悪者になっちゃいますがこれはこれで非常に優れたソフトです。レジスト前に試用が出来ますが試用して一瞬で気に入ってすぐにレジストしました。ただしこれは本当にCPUを喰うのでG3でしかも低クロックなウチのiMacには非常に荷が重すぎたという事です。それでもレジストする前にこの事実(ウチのiMacだと多々固まる事が有る)を知っていたとしてもきっとレジストしてたと思います。それぐらいいいソフトです(なんかくどいw)

で、前回書き忘れましたがiMacではこれらiTunes関連のソフトのみで運用といいましたがファイル共有用にApacheでWebDAVを立ち上げてます。LAN内の他のPCでエンコードするケースがほとんどですのでWin、Mac関係なくファイルにアクセス出来るようにWebDAVを利用しています。という訳でiMacではiTunes with Volume Logic、例のソフト(曲情報をサイトにアップするソフト)、Apache(WEB共有)が常に動いてました。で、この中で削るものといえば私の場合は例のソフトだった訳ですが上記の設置サイトを見てもらえば分かりますがど真ん中に曲情報を掲載しているのでなにか代換え手段をというのがそもそものきっかけでした。
すでにiMacではApacheが動いているのでそこにまずiMacで演奏中の曲の情報をブラウザで表示するCGIを書きました。これはperlでもPHPでもOKだと思います。


$TrackInfo = `osascript -e 'tell application "iTunes" ' -e
'return ((name of current track) as text) & "|:|:|"
& (artist of current track)& "|:|:|"
& ((album of current track) as text)' -e 'end tell'`;
print "$TrackInfo";

曲情報取得、表示部分こんな感じです。これを取りあえず「ローカル.cgi」として説明します。
これでブラウザには
曲名|:|:|(区切り)アーティスト名|:|:|アルバム名
という風に表示されます。
それをホームページ側に設置したCGIで読みに行く仕組みです。
この部分はPHPで作りました。
何となくPHPの方が外部ファイル(この場合iMacのCGI)の取り扱いが楽だったからです。
これを取りあえず「サーバ.php」として説明します。
まず見に行ってそれをログに残します。その際1行目に時間も記録します。


こんな感じ
$TrackInfo="http://iMac/ローカル.cgi";

で見に行ってそれをログに残します。

1109570036
Portrait of Authority (Live)|:|:|Bad Religion|:|:|Tested

1行目の1109570036は

$now = time();
って感じで現在時刻を取ります。この情報をログファイルに書き込みます。
実際には曲情報が取得出来ない場合が有るのでログに書き込む前に
if(!$trackinfo[0])
って感じで空白じゃなかったら処理するって感じの分岐をします。
で順番が逆になりましたが「サーバ.php」にアクセスが有るとまず
$now = time()で取得した現在時刻とログファイルの1行目の前回の記録時間を比較します。
$hikaku = $now - $logfile[0]
これで前回からの経過時間が秒で$hikakuに入ります。

if ($hikaku < 180) {//180秒(3分)以内なら
$trakinfo = $log[1];//imacのローカル.cgiを読み込まないでログファイルから読み込む
}else{//3分以上経過してれば次の処理・・・ローカル.cgiから曲情報を得てログに記録・・・・
$log = "$now\n$trackinfo[0]";
$fp = fopen ($logfile , "w");
flock($fp ,2);
fputs ($fp, "$log");
fclose ($fp);//こんな感じでと現在時刻($now)とローカル.cgiの情報
($trackinfo[0])をログファイル($logfile)に書き込みます。
}
って感じでiMacの負担を軽くします。ただしここで問題が・・・
iMacの電源落としてる時はローカル.cgiが読み込めないのでブラウザがタイムアウトするまでぐるぐるしてるだけという・・・
これが同じサーバでローカル.cgiとサーバ.phpが動いてたら
if(!fopen(ローカル.cgi,"r"))とかfile_exists("ローカル.cgi")見たいな感じで読み込めなかったら・・・する見たいな処理が出来るんですがリモートファイルはfile_existsが使えないんですよね。
fopenでタイムアウトって指定出来るのかなあ?とか考えてみましたが分からなかったので
$check = fsockopen (ローカルのiMacのアドレス, 80, $errno, $errstr, 5);
って感じでダイナミックDNSを利用したiMacのアドレスのポート80をポートスキャンして5秒以内に出来たらTRUE出来なかったらFALSEを$check返すようにしました。
これであとは

if(!$check){ポートスキャン出来なかった場合}
else{ポートスキャン出来た場合}
という感じで処理を分けました。
あとはログファイルに残された最新(3分以内の)曲情報をサイトに表示するだけです。こんな感じ。


$data=file($logfile);
$track=explode("|:|:|", $data[1]);
echo date("y.m.d(D)H:i", $data[0] ).";//更新時間
echo "title : $track[0]";//曲名
echo "artist : $track[1]";//アーティスト名
echo "album : $track[2]";//アルバム名



そしてアマゾンにジャケットを探しに来ます。

$amazonURL = "http://xml.amazon.com/onca/xml2?t=
jouledatasolu-20&dev-t=1F1PPDQA08B9BPRN5AR2&KeywordSearch=
$keyword&mode=music&type=lite&page=1&f=xml&ResponseGroup=Images";

私の場合はこのアドレスで検索してます。
$keywordにさっきログファイルから取得したアーティスト名やアルバム名を入れて検索します。
実際には$keywordに
第1候補 アーティスト名とアルバム名
第2候補 アーティスト名と曲名
第3候補 アーティスト名のみ
という感じでどんズバで取得出来なかった場合に関連有りそうなものを
引っ張って来るようにしてます。
ここでスペースは「%20」に変換が必要です。

$keyword = "$track[1]%20$track[2]";
$keyword = str_replace(" ","%20",$keyword);

すると結果が見つかった場合は
http://xml.amazon.com/onca/xml2?t=jouledatasolu-20&dev-t=1F1PPDQA08B9BPRN5AR2&KeywordSearch=Blind%20Melon%20Blind%20Melon
&mode=
music&type=lite&page=1&f=xml&ResponseGroup=Images

こういうページにつながります。
このページのソースに有る
<Asin>B000002UY5</Asin>
の部分さえ分かればあとはいろいろ引っ張ってこれます。
この部分を$Asinとすれば
画像はhttp://images.amazon.com/images/P/$Asin.01.MZZZZZZZ.jpg
でミディアムサイズの画像
商品の詳細ページはhttp://www.amazon.com/exec/obidos/ASIN/$Asin/
って感じです。
というわけで現在まだまだエラー処理とか完全でないしソース汚いのでまとまったらアップしますというか
もっといい方法誰か教えて下さい。

Feb 26, 2005

ローカルで動いているiTunesの情報をWEBに(1)

ポスト @ 13:33:35 , 修正 @ May 03, 2005 3:15:13 | perl,php,appleScript,soft


設置先garden staff room
ローカルで動いているiTunesの演奏曲の情報をリアルタイムでホームページに反映する。
って別に目新しくも何ともないですが・・・
すでにその手のソフトはたくさんある訳で・・・実は私もそういうソフトを利用させていただいていました。
その手のソフトで私が知ってるものは大体というか全て仕組み的にはitunesが動いているMacでitunesと同時に起動させておき一定時間毎に演奏中の曲情報を得て更新が有れば新しい曲情報を(画像などに変換して)サーバ(FTPなど)にアップって感じです。
まあもっともなというか普通に考えるとこの方法が確実でいちばん良いのかもしれません。
私もその手のソフトで事足りてた訳ですがなぜか自分も作ってしまいました。
というのもウチのiTunes専用マシンがiMac rev.D(PowerPC G3 333MHZ 256MBx2)なのですがiTunesとiTunesで演奏中の曲間の音のばらつき(大きい音の曲と小さい音の曲のばらつきなど)を無くす為に入れているVolume Logicというプラグイン(リアルタイムでデジタルマスタリングしてくれているらしいと言うかよく分かってないw)と例のソフトのみの起動という構成で1日8時間ぐらいジュークボックスとして働いているのですが・・・
困った事にOSX10.3にしてから動き自体は10.2よりモッサリ感が無くなったのですが度々固まるようになってしまいました。どうも固まるタイミングが例のソフトでiTunesの曲情報をサーバにアップしようとした時とかエモ系の曲で静かなところから急に激しくなる時(Volume Logicがフル稼働?)とかCPUの負荷が一気に高まって固まっちゃうみたいな感じです。
それとOSX10.3になってメモリチェックが厳しくなったとかって話も聞いた事が有るので後から差した256MBの2枚のメモリが怪しいのかなあとかも思ってたりしますが(もともとPowerBook G4についてたやつ)
なんか前振りが長くなったのであとは簡潔に。
今回作ってみたのは
すでに有るソフトの動き
演奏中のitunesを常に監視」→「変更が有ったら(画像加工などをして)データを作成」→「(FTPなどで)サーバにアップロード
という流れではなく
ホームページに誰かアクセス」→「ローカルのiMacから情報をゲット」→「ゲットした情報とその情報を元にCDのジャケットをAmazon.comから拝借してホームページに表示」という流れで考えました。
これならローカルのiMacが仕事するのは「ローカルのiMacから情報をゲット」の部分だけです。それにホームページに誰もアクセスしていない時は一切何もしないので無駄な動きはありません。
とりあえずホームページにアクセスが集中しても大丈夫なようにホームページの有るサーバ側に曲情報のログを残しローカルのiMacへの問い合せは一定時間たたないと行わないようにして有ります。
(一定時間内はローカルに問い合わせるのではなくサーバのログを参照する)
という訳で長くなったので続きはまた今度。