soraなりの日々 - fc2 -

こころにひっかかったもの

[ruby]アーティストのニュースを自動取得(with quartz)...完成!とりあえず、、

昨日、愚痴みたいなの書いてしまっておりましたが、、
朝からシコシコと続きやってて、一応そこそこできた!

このエントリーをはてなブックマークに追加
itunes でかかってる曲のアーティストのニュースを
itunes のビジュアライザで表示するやつ。

rubyquartz composer を使って作ってみた。

quartz composer ってのは、mac osx のグラフィッ
クエンジンである quartz を簡単にいじくれる開発環境。

ruby 側は、ニュースを検索して取得し、xml ファイル
を生成。
quartz composer 側では、作成された xml ファイル
を読み込んで表示を行う。

そんだけ。

ruby のソース↓
#!/usr/bin ruby -Ku
#
# artist_news_alpha.rb -
# this version is test version.
# alpha 0.1-
#
# The source code packaged with this file is Free Software
#
# Copyright (C) 2008 by sora <sora dot hs at gmail dot com>.
#
require 'kconv'
require 'rexml/document'
require 'rubygems'
require 'rbosa'
require 'mechanize'

class GSearch
  @@gurl = 'http://www.google.com/'

  def initialize(url)
    @url = url
  end

  def search(artist)
    @agent = WWW::Mechanize.new()
    @agent.user_agent_alias = 'Mac Safari'
    page = @agent.get(@@gurl)

    form = page.forms.with.name("f").first
    form.q = artist + ' site:' + @url
    @agent.submit(form)
  end
 
  def get(url)
    @agent.get(url)
  end
end

class ITunes
  def initialize
    @itunes = OSA.app('iTunes')
  end

  def get_current_track
    track = @itunes.current_track
  end

  def visuals_enabled?
    @itunes.visuals_enabled?
  end

  def set_visual
    @itunes.visuals.each do |visual|
      if  /^iTunes/ =~ visual.name
        @itunes.current_visual = visual
        break
      end
    end
    @itunes.visuals.each do |visual|
      if  /^artist_news/ =~ visual.name
        @itunes.current_visual = visual
        break
      end
    end
  end

end

class ANews
  @@xmlfile = '/Library/Compositions/artist_news.xml'

  def initialize
    @load = GSearch.new('http://www.excite.co.jp/music/news/')
    @itunes = ITunes.new
    @track = @itunes.get_current_track
    @aritst_name = ""
  end

  def start
    loop do
      if !@itunes.visuals_enabled? then
        puts "itunesのビジュアライザをオンにしてください。".toutf8
        sleep(5)
        retry
      end
      if self.artist_is_changed? then
        self.get_news
        if @itunes.visuals_enabled? then
          @itunes.set_visual
        end
        puts "コンテンツの作成が終了しました。".toutf8
      end
      sleep(5)
    end
  end

  def get_news
    puts ''
    puts ''
    puts ''
    puts ''
    puts ''
    puts '----------------------------------------'
    puts @track.name.toutf8
    puts @track.artist.toutf8
    puts @track.duration
    puts @track.date_added

    news = @load.search(@track.artist)
    self.create_xmlcontents(@@xmlfile, news)
  end

  def create_xmlcontents(xmlfile, contents)
    File.open(xmlfile, 'w') do |file|
      file.puts(REXML::XMLDecl.new("1.0", "UTF-8"))
      elements = REXML::Element.new("channel")
      contents.links.each do |link|
        if  %r!^http://www.excite.co.jp/music/news/story/! =~ link.href
          page = @load.get(link.href)
          doc = page.root
          sub_elements = elements.add_element("item")
          sub_elements.add_element("title")
                .add_text(doc.search('.news_topicstitle').inner_text.toutf8)
          if doc.search('.news_newstext').inner_text != "" then
            sub_elements.add_element("description")
                .add_text(doc.search('.news_newstext').inner_text.toutf8)
          else
            sub_elements.add_element("description")
                .add_text(doc.search('.news_newstext_emp').inner_text.toutf8)
          end
          elements.add_element(sub_elements)
        end
      end
      file.puts(elements)
    end
  end

  def artist_is_changed?
    if @artist_name == "" then
      @artist_name = @track.artist
      return true
    end
    if @artist_name == @track.artist then
      return false
    end
    @artist_name = @track.artist
    return true
  end
end

# get an artist news.
ANews.new.start

(うーん。さすがにソースがごちゃごちゃしてきた。。
 そろそろ最適化だな。。)

quartz composer

artist_news_qtz.txt

保存して、ファイル名を "artist_news.qtz" に変更してください。
".qtz"だとアップできなかったもんで、、、

前回までのやつをやっていただいていれば、
ruby 側に新しくライブラリ追加する必要はなし。
quartz composer は、"/Library/Compositions" にコピーして
itunes を再起動すれば、メニューに "artist_news" って
ビジュアライザが追加される。
ruby 側は、そこに "artist_news.xml" ってファイルを作成します。

(動かすのは自己責任でお願いいたします。)

動いてるところ↓

・ターミナルで ruby を動かせば、、、
artist_news-itunes02

・itunes のビジュアライザで表示される
artist_news-itunes01


ただ、何点か課題は残ってて、その中で大きいのが2点ある。

 1.itunes で表示されるニュースが流れるのが鬼早っ。
 2.新しく作成された xml ファイルを読み込むために
   一度、別のビジュアライザに切り替える必要がある。

1.がほんとに致命的・・orz
ニュースが長いととても読めません。
10 sec 感覚とかでほんとはロールしたいのだけど、やり方が
いくら探して、調べてもわからなかった。。。
早くなんとかせねば、、、

2.は、動作上あんまり問題ないけど、やっぱり気持ち悪い。
なんとかならぬか。。

今後、ちょこちょこいじって改善していきますです。
あと、windows でも動くようにしたいな、と。

それと、ご意見などございましたら、お願いいたします。。。

参考url:
 Quartz Composerによるビジュアルフロープログラミング
 Quartz Composer入門

関連記事:
 [ruby]アーティストのニュースを自動取得
このエントリーをはてなブックマークに追加

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://sora2hs.blog70.fc2.com/tb.php/252-abb26a63
この記事にトラックバックする(FC2ブログユーザー)