Annotation of ruby/snd/itunes2snd.rb, revision 1.1
1.1 ! as 1: #!/usr/bin/env ruby
! 2: # $Paefchen$
! 3:
! 4: #
! 5: # Abhaengigkeiten
! 6: #
! 7: require 'rubygems'
! 8: require 'getoptlong'
! 9: require 'socket'
! 10: require 'appscript'
! 11: include Appscript
! 12:
! 13:
! 14: #
! 15: # Main-Object Variablen
! 16: #
! 17: @playing = nil # Abspiel-Thread
! 18: @snd = nil # Socket zum Sound-Chip
! 19: @index = -1 # aktueller abspielender Track
! 20: @args = {:host => nil, :port => 100, :usage => false}
! 21: # Aufrufsparameter
! 22:
! 23: Thread.abort_on_exception = true
! 24:
! 25:
! 26: #
! 27: # main
! 28: #
! 29: def main
! 30: begin
! 31: @snd = TCPSocket.new @args[:host], @args[:port]
! 32: rescue
! 33: puts "ConnectionError: " + $!
! 34: sleep 2
! 35: retry
! 36: end
! 37:
! 38: run
! 39: end
! 40:
! 41:
! 42: #
! 43: # usage
! 44: #
! 45: def usage
! 46: puts "#{$0}: --host <host> [--port <port>]"
! 47: exit 0
! 48: end
! 49:
! 50:
! 51: #
! 52: # iTunes "abhoehren"
! 53: #
! 54: def run
! 55: while true
! 56: sleep 1
! 57:
! 58: itunes = app('iTunes')
! 59: # wenn itunes nicht spielt machen wir auch nichts
! 60: next if itunes.player_state.get != :playing
! 61:
! 62: # aktuelle Track-ID die iTunes spielt
! 63: current_index = itunes.current_track.index.get
! 64:
! 65: # wenn es nicht mehr der Track zuvor ist,
! 66: # den neuen abspielen.
! 67: if current_index != @index
! 68: play_new_track itunes.current_track
! 69: @index = current_index
! 70: end
! 71: end
! 72: end
! 73:
! 74:
! 75: #
! 76: # Track abspielen
! 77: #
! 78: def play_new_track track
! 79: file = track.location.get.to_s
! 80:
! 81: # Der Soundchip vertraegt nur MP3-Streams.
! 82: # daher lassen wir, wenn es keine MP3 ist, alles wie es ist.
! 83: if ! /\.mp3$/i.match file
! 84: puts "error => #{track.name.get} ist keine MP3-Datei"
! 85: return false
! 86: end
! 87:
! 88: # wenn noch was abgespielt wird,
! 89: # muessen wir das erst unterbrechen
! 90: if @playing
! 91: Thread.kill(@playing)
! 92: end
! 93:
! 94: puts "play => #{track.name.get}"
! 95:
! 96: # und das abspielen in einem Thread nach
! 97: # hinten schieben damit wir weiter auf neue
! 98: # Tracks hoeren koennen.
! 99: @playing = Thread.new do
! 100: File.open(file, 'r') do |fh|
! 101: begin
! 102: @snd.puts fh.read
! 103: rescue
! 104: puts "SendError: " + $!
! 105: sleep 1
! 106: retry
! 107: end
! 108: end
! 109: end
! 110: end
! 111:
! 112:
! 113: if ARGV.length < 1
! 114: puts "Error: Missing host argument (try --usage)"
! 115: exit 1
! 116: end
! 117:
! 118: begin
! 119: GetoptLong.new(
! 120: ['--host', '-h', GetoptLong::REQUIRED_ARGUMENT],
! 121: ['--port', '-p', GetoptLong::REQUIRED_ARGUMENT],
! 122: ['--usage', '-u', GetoptLong::NO_ARGUMENT]
! 123: ).each do |arg, value|
! 124: @args[arg[2..-1].to_sym] = value
! 125: end
! 126: rescue
! 127: exit 1
! 128: end
! 129:
! 130: usage if @args[:usage]
! 131:
! 132: main