#!/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 <host> [--port <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