かすみこめも

@Kasu_mikoがやったこととか

#なうぷれいんぐ を作った

久しぶりのブログ更新ですが技術ネタです。
iTunesで再生している曲をTwitterに投稿するものを作りました(n番煎じ)。

やりたいこと

ターミナルでiTunesで再生している曲を取得してTwitterに投稿する。

使うもの

普段のbotと同様に投稿したいのでRuby
ターミナルからiTunesを操作するためAppleScript

実際に作ったもの

まず普通にTwitterに投稿する準備をする。

#!/usr/local/bin/ruby -Ku
#coding : utf-8
require'twitter'
require'yaml'

keys = YAML.load_file 'userconf.yml' #任意のディレクトリ

@client = Twitter::REST::Client.new do |config|
	  	config.consumer_key = keys["api_key"]
	  	config.consumer_secret = keys["api_secret"]
	  	config.access_token = keys["access_token"]
	  	config.access_token_secret = keys["access_token_secret"]
end

AppleScriptRuby中で使いたいのでosascriptを使います。

osascript は指定されたファイルか、コードを AppleScript として実行します。

http://macwiki.sourceforge.jp/wiki/index.php/コマンド/osascript

Ruby内でosascriptコマンドを実行し、出力を変数に代入します。

track = `osascript << SCRIPT

~~~ここからAppleScript~~~
tell application "アプリケーション名"
で操作対象のアプリケーションを指定してブロックに入ります。(ブロック終わるときはend tell)

AppleScriptでは変数への代入は

set 変数名 to 値

で行うようです。

tell application "iTunes"
	set trackname to name of current track
	set trackartist to artist of current track
	set albumname to album of current track
	return trackname & " - " & trackartist & " / "& albumname & " #なうぷれいんぐ"
end tell
SCRIPT`

どういう値が扱えるのかは
iTunes for Mac まとめ - AppleScript
この辺参照してください。

これでトラック名,アーティスト名,アルバム名が取得出来たのであとはツイートするだけ。

@client.update(track)
end

はい、これで完成です。



ちょっと待って、なんか寂しくない?画像がないやん!ジャケットが見たくてなうぷれしたの!
じゃけんジャケットも投稿できるようにしましょうね〜


というわけでジャケットも同時に投稿するようにしましょう。
まず、iTunesのAlbum Artworkは1つの項目に対して複数設定することができます。
また、Artworkが設定されていない項目も存在します。

i = `osascript << SCRIPT
tell application "iTunes"
	tell current track
		if exists artwork 1 then
                    return artwork 1
		end if 
	end tell
end tell
SCRIPT`

こんな感じで条件判定します。
※ifもtellと同様忘れずにend ifすること


さてiにartworkが入ったかな、と思ったのですが、これをupdate_with_mediaしてもエラーを吐いてしまいました。

エラーの解決法がわからなかったので、とても遠回りになりますが、一旦ファイルに書き出してそれを読み込み直すことにしました。

i = `osascript << SCRIPT
tell application "iTunes"
	tell current track
		if exists artwork 1 then
			set d to raw data of artwork 1
			set filepath to ((path to desktop) as text) & "hoge.png"
			set b to open for access file filepath with write permission
			set eof b to 0
			write d to b starting at 0
			close access b
			return 1
		end if 
	end tell
end tell
SCRIPT`


あとは仕上げ

if i == "1\n"
@client.update_with_media(track,open("~/Desktop/hoge.png"))
else
@client.update(track)
end

なんか数字をiに代入できないし後ろに改行入るしで悲しいことになった。

これでとりあえずは動くようになりました。
(画像書きだすのでめちゃくちゃ重い)


気が向いたら画像書き出さない方法考えます。(なんか方法あったら教えて頂けるとうれしいです)