#!/usr/bin/ruby
require 'socket'
require 'logger'
require 'mpris'
require 'yaml'

PORT = 1568
$log = Logger.new(STDERR)
$mpris = MPRIS.new 'org.mpris.audacious'

# input:  /TrackList GetMetadata 1
# output: YAML of the hash
def dispatch(peer, str)
  str.strip!
  args = str.split
  $log.info "#{peer}: #{args.inspect}"
  path = args.shift
  cmd = args.shift
  args.map! {|a| YAML.load a}
  $mpris.call(path, cmd, *args).to_yaml + "\n..." rescue nil
end


# TCP
Thread.new do
  server = TCPServer.new(PORT)
  while (sock = server.accept)
    fork do
      peer = sock.peeraddr[2]
      $log.info "connect #{peer}"
      until sock.eof
        cmd = sock.gets
	sock.puts dispatch(peer, cmd)
      end
      $log.info "disconnect #{peer}"
      # close doesn't work inside fork
      sock.shutdown
    end
  end
end

# and UDP
server = UDPSocket.new
server.bind(0, PORT)
loop do
  cmd, peer = server.recvfrom(1024)
  ans = dispatch(peer[2], cmd)
  server.send ans.to_yaml, 0, peer[3], peer[1]
end
