電卓片手に

Last.FM ラジオクライアント Ruby ライブラリ - lastfm12

投稿日:

そういえば、と思い出したので。

last.fm のラジオ再生のための Ruby ライブラリを作ってみた」で紹介したライブラリを大分昔に RubyForge に登録していた ので告知させて頂きます。登録そのものはもう2年前で、RubyGem リポジトリ環境も大分変わってますね。。。

インストール方法

$ sudo gem install lastfm12

使い方

以前の記事とほとんど変わっていませんが、クラスメソッド play_loop というちょっと使いやすそうなメソッドを一つ追加しました。使い方はこんな感じ。

#!ruby -Ku
# -*- coding: utf-8 -*-
#
# クラスメソッド play_loop を使ったサンプル
# ※ mpg123 が必要

$KCODE = 'utf-8'

# Last.FM アカウント情報
user_name = "LastFMのアカウント名"
password = "LastFMのパスワード"

# ラジオ局の選択
#station = ["artist", "abba"] # アーティスト ABBA に似たトラックを流すラジオ局
#station = ["personal", "daftbeats"] # ユーザ daftbeats のパーソナルラジオ局
station = ["tag", "house"] # タグ house の付いたトラックを流すラジオ局
#station = ["group", "hoge"] # グループ hoge のトラックを流すラジオ局(よく分からない)
#station = ["neighbours", "daftbeats"] # ユーザ daftbeats の近所?のユーザのラジオ局
#station = ["recommended", "daftbeats"] # ユーザ daftbeats に対する推薦トラックを流すラジオ局

require "rubygems"
require "lastfm12"

# conter 数のトラックを再生したら終了
counter = 3

LastFM12.play_loop("user_name" => user_name,
                   "password" => password,
                   "user_agent"=> "lastfm12_sample",
                   "station" => station,
                   "verbose"=> true # 冗長出力
                   ) do |track|

  if counter == 0 then
    puts "exit loop"
    break
  end
  counter -= 1

  puts "-------------------------------------------"
  puts "Artist: #{track.artist}"
  puts "Title:  #{track.title}"
  puts "Album:  #{track.album}"
  puts "Length: #{track.length/1000}[sec]"
  puts "ImgURL: #{track.image_url}"
  `mpg123 -b 1024 #{track.location}`

end

注意して欲しいのはやはり前回と同じく track.locationtrack.locationで与えられる URL は、一度アクセスしてたら二度とその URL は使えません。そのトラックとも一期一会なわけですね。

使ってみると分かるんですが、今再生している曲は、残り時間幾つくらいか分からないのが困ります。そこで、データストリームを直接受け取るような使い方もできるようになりました。使い方はこんな感じ。

#!ruby -Ku
# -*- coding: utf-8 -*-
#
# LastFM12::Track#play を使ったサンプル
# ※ mpg123 が必要

$KCODE = 'utf-8'
STDOUT.sync = true 

# Last.FM アカウント情報
user_name = "LastFMのアカウント名"
password = "LastFMのパスワード"

# ラジオ局の情報
station = ["tag", "house"] # タグ house の付いたトラックを流すラジオ局

require "rubygems"
require "lastfm12"

Signal.trap(:INT){puts "\n* exit";exit}
puts "** Type C-c if you want to exit **"

LastFM12.play_loop("user_name" => user_name,
                   "password" => password,
                   "user_agent"=> "lastfm12_sample",
                   "station" => station,
                   "verbose"=> true # 冗長出力
                   ) do |track|

  puts "-------------------------------------------"
  puts "Artist: #{track.artist}"
  puts "Title:  #{track.title}"
  puts "Album:  #{track.album}"
  puts "Length: #{track.length/1000}[sec]"

  IO.popen("mpg123 -b 1024 -q -y -", "w") do |pipe|
    start_time = Time.new
    track.play do |s| # s は mp3 データ断片
      pipe.write s
      rest_time = (track.length/1000)-(Time.new-start_time)
      print "#{rest_time.round.to_s.rjust(5)} sec\r" # 推定残り秒数の表示
    end
  end

end

LastFM12::Track#location と net/http を使えば同じことが出来ますがちょっとややこしいのでメソッド化してしまいました。ストリーミング再生に open-uri は不適なのがよくわかったんだぜ。。。

mp3 データの保存とかもできちゃいますが、利用者の良心にお任せいたします。