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.
@@ -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