File:  [Paefchen] / ruby / snd / itunes2snd.rb
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Apr 1 17:33:11 2008 UTC (16 years, 7 months ago) by as
Branches: MAIN
CVS tags: HEAD
Script der den aktuellen Track aus iTunes auf den SND-Platinen abspielt.

#!/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