airplay 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "airplay"
3
- s.version = "0.1.5"
3
+ s.version = "0.1.6"
4
4
  s.summary = "Airplay client"
5
5
  s.description = "Send image/video to an airplay enabled device"
6
6
  s.authors = ["elcuervo"]
@@ -6,5 +6,6 @@ module Airplay; end;
6
6
  require 'airplay/protocol'
7
7
  require 'airplay/protocol/image'
8
8
  require 'airplay/protocol/video'
9
+ require 'airplay/protocol/scrub'
9
10
  require 'airplay/node'
10
11
  require 'airplay/client'
@@ -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
@@ -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
@@ -11,11 +11,9 @@ class Airplay::Protocol
11
11
  end
12
12
 
13
13
  def make_request(request)
14
- Thread.new do |t|
15
- response = @http.request(request)
16
- raise Airplay::Protocol::InvalidRequestError if response.code == "404"
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)
@@ -7,7 +7,7 @@ class Airplay::Protocol::Image < Airplay::Protocol
7
7
  def transitions
8
8
  {
9
9
  :none => "None",
10
- :dissolve => "Dissolve"
10
+ :dissolve => "Dissolve"
11
11
  }
12
12
  end
13
13
 
@@ -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 send(video)
8
- # TODO: serve local file
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
@@ -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("elCuervo").is_a?(Airplay::Node)
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 "elCuervo", @airplay.active_server.name
25
+ assert_equal "Apple TV", @airplay.active_server.name
26
26
  end
27
27
 
28
28
  end
Binary file
@@ -13,12 +13,12 @@ scope do
13
13
  end
14
14
 
15
15
  test "send an image to the server" do
16
- @airplay.use("elCuervo")
17
- assert_equal true, @airplay.send_image("./test/fixtures/image.gif")
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("elCuervo")
22
- assert_equal true, @airplay.send_image("../test/fixtures/image.gif", :dissolve)
21
+ @airplay.use("Apple TV")
22
+ assert @airplay.send_image("./test/fixtures/image.gif", :dissolve).kind_of?(String)
23
23
  end
24
24
  end
@@ -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
@@ -8,4 +8,13 @@ scope do
8
8
  end
9
9
 
10
10
  scope do
11
+ setup do
12
+ @airplay = Airplay::Client.new
13
+ end
14
+
15
+ test "send a video to the server" do
16
+ @airplay.use("Apple TV")
17
+ assert @airplay.send_video("http://www.yo-yo.org/mp4/yu.mp4").kind_of?(String)
18
+ end
19
+
11
20
  end
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.5
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-23 00:00:00.000000000 -03:00
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: &70361332932440 !ruby/object:Gem::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: *70361332932440
25
+ version_requirements: *70190462401180
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: cutest
28
- requirement: &70361332931920 !ruby/object:Gem::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: *70361332931920
36
+ version_requirements: *70190462400740
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: capybara
39
- requirement: &70361332931460 !ruby/object:Gem::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: *70361332931460
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