airplay 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/airplay.gemspec +1 -1
- data/lib/airplay.rb +1 -0
- data/lib/airplay/client.rb +12 -3
- data/lib/airplay/node.rb +3 -3
- data/lib/airplay/protocol.rb +10 -5
- data/lib/airplay/protocol/image.rb +1 -1
- data/lib/airplay/protocol/scrub.rb +19 -0
- data/lib/airplay/protocol/video.rb +12 -2
- data/test/discovery.rb +2 -2
- data/test/fixtures/image2.gif +0 -0
- data/test/images.rb +4 -4
- data/test/scrub.rb +20 -0
- data/test/video.rb +9 -0
- metadata +11 -8
data/airplay.gemspec
CHANGED
data/lib/airplay.rb
CHANGED
data/lib/airplay/client.rb
CHANGED
|
@@ -22,21 +22,30 @@ class Airplay::Client
|
|
|
22
22
|
@servers = []
|
|
23
23
|
DNSSD.browse!(Airplay::Protocol::SEARCH) do |reply|
|
|
24
24
|
resolver = DNSSD::Service.new
|
|
25
|
-
target = nil
|
|
25
|
+
target, port = nil
|
|
26
26
|
resolver.resolve(reply) do |resolved|
|
|
27
|
+
port = resolved.port
|
|
27
28
|
target = resolved.target
|
|
28
29
|
break unless resolved.flags.more_coming?
|
|
29
30
|
end
|
|
30
31
|
info = Socket.getaddrinfo(target, nil, Socket::AF_INET)
|
|
31
32
|
ip_address = info[0][2]
|
|
32
|
-
@servers << Airplay::Node.new(reply.name, reply.domain, ip_address)
|
|
33
|
+
@servers << Airplay::Node.new(reply.name, reply.domain, ip_address, port)
|
|
33
34
|
break unless reply.flags.more_coming?
|
|
34
35
|
end
|
|
35
36
|
@servers
|
|
36
37
|
end
|
|
37
38
|
|
|
38
39
|
def send_image(image, transition = :none)
|
|
39
|
-
Airplay::Protocol::Image.new(@active_server.ip).send(image, transition)
|
|
40
|
+
Airplay::Protocol::Image.new(@active_server.ip, @active_server.port).send(image, transition)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def send_video(video, position = 0)
|
|
44
|
+
Airplay::Protocol::Video.new(@active_server.ip, @active_server.port).send(video, position)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def scrub
|
|
48
|
+
Airplay::Protocol::Scrub.new(@active_server.ip, @active_server.port).send
|
|
40
49
|
end
|
|
41
50
|
|
|
42
51
|
end
|
data/lib/airplay/node.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
class Airplay::Node
|
|
2
|
-
attr_reader :name, :domain, :ip
|
|
2
|
+
attr_reader :name, :domain, :ip, :port
|
|
3
3
|
|
|
4
|
-
def initialize(name, domain, ip)
|
|
5
|
-
@name, @domain, @ip = name, domain, ip
|
|
4
|
+
def initialize(name, domain, ip, port)
|
|
5
|
+
@name, @domain, @ip, @port = name, domain, ip, port
|
|
6
6
|
end
|
|
7
7
|
end
|
data/lib/airplay/protocol.rb
CHANGED
|
@@ -11,11 +11,9 @@ class Airplay::Protocol
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def make_request(request)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
end
|
|
18
|
-
true
|
|
14
|
+
response = @http.request(request)
|
|
15
|
+
raise Airplay::Protocol::InvalidRequestError if response.code == "404"
|
|
16
|
+
response.body
|
|
19
17
|
end
|
|
20
18
|
|
|
21
19
|
def put(resource, body = nil, headers = {})
|
|
@@ -25,6 +23,13 @@ class Airplay::Protocol
|
|
|
25
23
|
make_request(request)
|
|
26
24
|
end
|
|
27
25
|
|
|
26
|
+
def post(resource, body = nil, headers = {})
|
|
27
|
+
request = Net::HTTP::Post.new resource
|
|
28
|
+
request.body = body
|
|
29
|
+
request.initialize_http_header DEFAULT_HEADERS.merge(headers)
|
|
30
|
+
make_request(request)
|
|
31
|
+
end
|
|
32
|
+
|
|
28
33
|
def get(resource, headers = {})
|
|
29
34
|
request = Net::HTTP::Get.new resource
|
|
30
35
|
request.initialize_http_header DEFAULT_HEADERS.merge(headers)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class Airplay::Protocol::Scrub < Airplay::Protocol
|
|
2
|
+
def resource
|
|
3
|
+
"/scrub"
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def plist_headers
|
|
7
|
+
{'Content-Type' => 'text/x-apple-plist+xml'}
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def send
|
|
11
|
+
response = get(resource, plist_headers)
|
|
12
|
+
result = {}
|
|
13
|
+
response.delete(":").split.each_slice(2) do |key, value|
|
|
14
|
+
result[key] = value
|
|
15
|
+
end
|
|
16
|
+
result
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
@@ -4,8 +4,18 @@ class Airplay::Protocol::Video < Airplay::Protocol
|
|
|
4
4
|
"/play"
|
|
5
5
|
end
|
|
6
6
|
|
|
7
|
-
def
|
|
8
|
-
|
|
7
|
+
def position_body(position = 0)
|
|
8
|
+
"Start-Position: #{position}\n"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def location_body(video)
|
|
12
|
+
"Content-Location: #{video}\n"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def send(video, position = 0)
|
|
16
|
+
body = location_body(video)
|
|
17
|
+
body += position_body(position.to_s)
|
|
18
|
+
post(resource, body)
|
|
9
19
|
end
|
|
10
20
|
|
|
11
21
|
def play
|
data/test/discovery.rb
CHANGED
|
@@ -12,7 +12,7 @@ scope do
|
|
|
12
12
|
|
|
13
13
|
test "find servers by name" do
|
|
14
14
|
airplay = Airplay::Client.new
|
|
15
|
-
assert @airplay.find_by_name("
|
|
15
|
+
assert @airplay.find_by_name("Apple TV").is_a?(Airplay::Node)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
test "raise on not found" do
|
|
@@ -22,7 +22,7 @@ scope do
|
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
test "autoselect if only one server available" do
|
|
25
|
-
assert_equal "
|
|
25
|
+
assert_equal "Apple TV", @airplay.active_server.name
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
end
|
|
Binary file
|
data/test/images.rb
CHANGED
|
@@ -13,12 +13,12 @@ scope do
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
test "send an image to the server" do
|
|
16
|
-
@airplay.use("
|
|
17
|
-
|
|
16
|
+
@airplay.use("Apple TV")
|
|
17
|
+
assert @airplay.send_image("./test/fixtures/image2.gif").kind_of?(String)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
test "send an image to the server doing a dissolve" do
|
|
21
|
-
@airplay.use("
|
|
22
|
-
|
|
21
|
+
@airplay.use("Apple TV")
|
|
22
|
+
assert @airplay.send_image("./test/fixtures/image.gif", :dissolve).kind_of?(String)
|
|
23
23
|
end
|
|
24
24
|
end
|
data/test/scrub.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require File.expand_path("helper", File.dirname(__FILE__))
|
|
2
|
+
|
|
3
|
+
scope do
|
|
4
|
+
test "check image protocol class" do
|
|
5
|
+
scrub_protocol = Airplay::Protocol::Scrub.new("127.0.0.1")
|
|
6
|
+
assert_equal "/scrub", scrub_protocol.resource
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
scope do
|
|
11
|
+
setup do
|
|
12
|
+
@airplay = Airplay::Client.new
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
test "check scrub status" do
|
|
16
|
+
@airplay.use("Apple TV")
|
|
17
|
+
assert @airplay.scrub.has_key?("duration")
|
|
18
|
+
assert @airplay.scrub.has_key?("position")
|
|
19
|
+
end
|
|
20
|
+
end
|
data/test/video.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: airplay
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.6
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,12 +9,12 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2011-08-
|
|
12
|
+
date: 2011-08-30 00:00:00.000000000 -03:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: dnssd
|
|
17
|
-
requirement: &
|
|
17
|
+
requirement: &70190462401180 !ruby/object:Gem::Requirement
|
|
18
18
|
none: false
|
|
19
19
|
requirements:
|
|
20
20
|
- - ! '>='
|
|
@@ -22,10 +22,10 @@ dependencies:
|
|
|
22
22
|
version: '0'
|
|
23
23
|
type: :runtime
|
|
24
24
|
prerelease: false
|
|
25
|
-
version_requirements: *
|
|
25
|
+
version_requirements: *70190462401180
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: cutest
|
|
28
|
-
requirement: &
|
|
28
|
+
requirement: &70190462400740 !ruby/object:Gem::Requirement
|
|
29
29
|
none: false
|
|
30
30
|
requirements:
|
|
31
31
|
- - ! '>='
|
|
@@ -33,10 +33,10 @@ dependencies:
|
|
|
33
33
|
version: '0'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
|
-
version_requirements: *
|
|
36
|
+
version_requirements: *70190462400740
|
|
37
37
|
- !ruby/object:Gem::Dependency
|
|
38
38
|
name: capybara
|
|
39
|
-
requirement: &
|
|
39
|
+
requirement: &70190462400320 !ruby/object:Gem::Requirement
|
|
40
40
|
none: false
|
|
41
41
|
requirements:
|
|
42
42
|
- - ! '>='
|
|
@@ -44,7 +44,7 @@ dependencies:
|
|
|
44
44
|
version: '0'
|
|
45
45
|
type: :development
|
|
46
46
|
prerelease: false
|
|
47
|
-
version_requirements: *
|
|
47
|
+
version_requirements: *70190462400320
|
|
48
48
|
description: Send image/video to an airplay enabled device
|
|
49
49
|
email:
|
|
50
50
|
- yo@brunoaguirre.com
|
|
@@ -61,11 +61,14 @@ files:
|
|
|
61
61
|
- lib/airplay/node.rb
|
|
62
62
|
- lib/airplay/protocol.rb
|
|
63
63
|
- lib/airplay/protocol/image.rb
|
|
64
|
+
- lib/airplay/protocol/scrub.rb
|
|
64
65
|
- lib/airplay/protocol/video.rb
|
|
65
66
|
- test/discovery.rb
|
|
66
67
|
- test/fixtures/image.gif
|
|
68
|
+
- test/fixtures/image2.gif
|
|
67
69
|
- test/helper.rb
|
|
68
70
|
- test/images.rb
|
|
71
|
+
- test/scrub.rb
|
|
69
72
|
- test/video.rb
|
|
70
73
|
has_rdoc: true
|
|
71
74
|
homepage: http://github.com/elcuervo/airplay
|