前回の続き。appscriptでラップしたPythonのiTunesオブジェクトで,トラックを扱えるようにした。トラックというのはiTunesに取り込んだ曲のこと。iTunesで再生中の曲を取り出したり,曲を検索したりできるようにした。新しいモジュールはエントリの下の方からダウンロードできます。
たとえば,再生中の曲情報を取得するのはこんなかんじ。iTunesオブジェクトのメソッドget_current_track()を呼び出すと,トラックオブジェクトが返ってくる。
>>> from itunes import iTunes
>>> it = iTunes()
>>> it.play()
>>> track = it.get_current_track()
>>> print track.artist, track.album, track.duration
山中千尋 Abyss 305.187988281
トラックオブジェクトには,アトリビュートとしていろんな情報が詰まってて楽しい。曲のタイトルやアーチスト名だけでなく,アルバム情報やレーティングなどiTunesから見える情報の他,何回再生したかとか,最後に再生したのはついかなど,いろんな情報が取得できる。トラックオブジェクトのplay()メソッドを呼ぶと,曲を演奏できる。
トラックの検索はこんなかんじ。引数はname(曲名),artist(アーチスト名),album_title(アルバム名),album_artist(アルバムのアーチスト名)が使える。検索文字列として正規表現を渡す。戻り値はヒットしたトラックオブジェクトのリストになる。
>>> tracks = it.find_in_library(artist='Gary.*')
>>> len(tracks)
165
>>> for t in tracks[0:10]:
... print t.name
...
Native Sense
Love Castle
Duende
No Mystery
Armando's Rhumba
Bagatelle #6
Post Script
Bagatelle #2
Tango '92
Rhumbata
で,がぜん楽しくなってきたところでお約束として,再生中の曲をTwitterにPostするスクリプトを作ってみた。再生中のアルバムが変わるとPostをする。アカウントは自分で変えて下さい。あ,python-twitterをインストールしておく必要があります。
ソースはこんな感じ。コメント込みで35行でできちゃったよママン! まえにやったのよりシンプルでスマートだと思う。
#!/usr/bin/env python
# coding=utf-8
from itunes import iTunes
import twitter
import shelve
# Put you own account information :-).
user = 'dan'
passwd = 'kogaidan'
post_template = 'Now Playing : %(artist)s - %(album)s'
def main():
# Making iTunes object to communicate to it.
it = iTunes()
# Open shelve to store previous track information
s = shelve.open('./ittrack.dat')
if 'album' not in s:
s['album'] = ''
s['artist'] = ''
# Getting current track and comparing name of the album
track = it.get_current_track()
if track and track.album != s['album']:
# Making a post to twitter
# so that people can know playing album has been changed :-).
# Making twitter.app object to post
tw = twitter.Api(user, passwd)
message = post_template % track.get_dict()
tw.PostUpdate(post_template % message)
# Store album information to shelve. It will be automatically saved.
s['album'] = track.album
s['artist'] = track.artist
if __name__ == '__main__':
main()
いろいろ改造すると楽しいかもね。Have fun :-).