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