Skip to content

Commit

Permalink
Pull and interpret the DNS-SD text_record field for device info and A…
Browse files Browse the repository at this point in the history
…irplay features.
  • Loading branch information
sodabrew committed Sep 2, 2012
1 parent 4bad918 commit e41c91c
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 4 deletions.
3 changes: 2 additions & 1 deletion lib/airplay.rb
Expand Up @@ -6,8 +6,9 @@

module Airplay end
require 'airplay/server'
require 'airplay/server/browser'
require 'airplay/server/node'
require 'airplay/server/browser'
require 'airplay/server/features'

require 'airplay/protocol'
require 'airplay/protocol/image'
Expand Down
5 changes: 3 additions & 2 deletions lib/airplay/server/browser.rb
Expand Up @@ -14,15 +14,16 @@ def self.browse
timeout 3 do
DNSSD.browse!(Airplay::Protocol::SEARCH) do |node|
resolver = DNSSD::Service.new
target, port = nil
target, port, extra = nil
resolver.resolve(node) do |resolved|
port = resolved.port
target = resolved.target
extra = resolved.text_record
break unless resolved.flags.more_coming?
end
info = Socket.getaddrinfo(target, nil, Socket::AF_INET)
ip = info[0][2]
@servers << Airplay::Server::Node.new(node.name, node.domain, ip, port)
@servers << Airplay::Server::Node.new(node.name, node.domain, ip, port, extra)
break unless node.flags.more_coming?
end
end
Expand Down
29 changes: 29 additions & 0 deletions lib/airplay/server/features.rb
@@ -0,0 +1,29 @@
class Airplay::Server::Features
attr_reader :Video,
:Photo,
:VideoFairPlay,
:VideoVolumeControl,
:VideoHTTPLiveStreams,
:Slideshow,
:Screen,
:ScreenRotate,
:Audio,
:AudioRedundant,
:FPSAPv2pt5_AES_GCM,
:PhotoCaching

def initialize(features)
@Video = 0 == (features & ( 1 << 0 ))
@Photo = 0 == (features & ( 1 << 1 ))
@VideoFairPlay = 0 == (features & ( 1 << 2 ))
@VideoVolumeControl = 0 == (features & ( 1 << 3 ))
@VideoHTTPLiveStreams = 0 == (features & ( 1 << 4 ))
@Slideshow = 0 == (features & ( 1 << 5 ))
@Screen = 0 == (features & ( 1 << 7 ))
@ScreenRotate = 0 == (features & ( 1 << 8 ))
@Audio = 0 == (features & ( 1 << 9 ))
@AudioRedundant = 0 == (features & ( 1 << 11 ))
@FPSAPv2pt5_AES_GCM = 0 == (features & ( 1 << 12 ))
@PhotoCaching = 0 == (features & ( 1 << 13 ))
end
end
7 changes: 6 additions & 1 deletion lib/airplay/server/node.rb
@@ -1,7 +1,12 @@
class Airplay::Server::Node
attr_reader :name, :domain, :ip, :port
attr_reader :features, :deviceid, :model, :srcvers

def initialize(name, domain, ip, port)
def initialize(name, domain, ip, port, info)
@name, @domain, @ip, @port = name, domain, ip, port
@features = Airplay::Server::Features.new info.fetch('features', 0).hex
@deviceid = info.fetch('deviceid')
@srcvers = info.fetch('srcvers')
@model = info.fetch('model')
end
end

0 comments on commit e41c91c

Please sign in to comment.