#!/usr/bin/env ruby # $Paefchen: ruby/snd/itunes2snd.rb,v 1.1 2008/04/01 17:33:11 as Exp $ # # Abhaengigkeiten # require 'rubygems' require 'getoptlong' require 'socket' require 'appscript' include Appscript # # Main-Object Variablen # @playing = nil # Abspiel-Thread @snd = nil # Socket zum Sound-Chip @index = -1 # aktueller abspielender Track @args = {:host => nil, :port => 100, :usage => false} # Aufrufsparameter Thread.abort_on_exception = true # # main # def main begin @snd = TCPSocket.new @args[:host], @args[:port] rescue puts "ConnectionError: " + $! sleep 2 retry end run end # # usage # def usage puts "#{$0}: --host [--port ]" exit 0 end # # iTunes "abhoehren" # def run while true sleep 1 itunes = app('iTunes') # wenn itunes nicht spielt machen wir auch nichts next if itunes.player_state.get != :playing # aktuelle Track-ID die iTunes spielt current_index = itunes.current_track.index.get # wenn es nicht mehr der Track zuvor ist, # den neuen abspielen. if current_index != @index play_new_track itunes.current_track @index = current_index end end end # # Track abspielen # def play_new_track track file = track.location.get.to_s # Der Soundchip vertraegt nur MP3-Streams. # daher lassen wir, wenn es keine MP3 ist, alles wie es ist. if ! /\.mp3$/i.match file puts "error => #{track.name.get} ist keine MP3-Datei" return false end # wenn noch was abgespielt wird, # muessen wir das erst unterbrechen if @playing Thread.kill(@playing) end puts "play => #{track.name.get}" # und das abspielen in einem Thread nach # hinten schieben damit wir weiter auf neue # Tracks hoeren koennen. @playing = Thread.new do File.open(file, 'r') do |fh| begin @snd.puts fh.read rescue puts "SendError: " + $! sleep 1 retry end end end end if ARGV.length < 1 puts "Error: Missing host argument (try --usage)" exit 1 end begin GetoptLong.new( ['--host', '-h', GetoptLong::REQUIRED_ARGUMENT], ['--port', '-p', GetoptLong::REQUIRED_ARGUMENT], ['--usage', '-u', GetoptLong::NO_ARGUMENT] ).each do |arg, value| @args[arg[2..-1].to_sym] = value end rescue exit 1 end usage if @args[:usage] main