airplay 0.2.2 → 0.2.3

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/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ before_script: sudo apt-get install -y libavahi-compat-libdnssd-dev && bundle install
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gemspec
4
+ gem "rake"
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Airplay
2
2
 
3
+ ![Travis](https://secure.travis-ci.org/elcuervo/airplay.png)
4
+
5
+ ![Ruby Airplay](https://github.com/elcuervo/elcuervo.github.com/raw/master/images/posts/airplay/ruby_airplay.png)
6
+
3
7
  A client (and someday a server) of the superfancy http content stream technique
4
8
  that Apple uses in its products.
5
9
 
@@ -13,6 +17,7 @@ require 'airplay'
13
17
  airplay = Airplay::Client.new
14
18
  # To send an image
15
19
  airplay.send_image("fancy_pants.jpg")
20
+
16
21
  # To stream a video
17
22
  airplay.send_video("http://www.yo-yo.org/mp4/yu2.mp4")
18
23
  ```
@@ -29,6 +34,30 @@ airplay.send_image(File.open("/home/userman/Pictures/fancy_pants.jpg"))
29
34
  airplay.send_image("http://mine.icanhascheezburger.com/completestore/Wezinyercupz128401525895963750.jpg")
30
35
  ```
31
36
 
37
+ ### Transitions
38
+
39
+ ```ruby
40
+ require 'airplay'
41
+
42
+ airplay = Airplay::Client.new
43
+
44
+ airplay.send_image("fancy_pants.jpg", :dissolve)
45
+ airplay.send_image("fancy_pants.jpg", :slide_left)
46
+ airplay.send_image("fancy_pants.jpg", :slide_right)
47
+ ```
48
+
49
+ ## Scrub
50
+
51
+ ```ruby
52
+ require 'airplay'
53
+
54
+ airplay = Airplay::Client.new
55
+ airplay.scrub
56
+ # {:duration => 189, :position => 50}
57
+ airplay.scrub(30) # Media goes to 30s
58
+ airplay.scrub("10%") # Media goes to the 10% of its duration
59
+ ```
60
+
32
61
  ## Password Authentication
33
62
 
34
63
  ```ruby
@@ -48,6 +77,11 @@ require 'airplay'
48
77
 
49
78
  airplay = Airplay::Client.new
50
79
  player = airplay.send_video("http://www.yo-yo.org/mp4/yu2.mp4")
80
+ player.pause
81
+ player.resume
82
+ player.scrub
83
+ # {:duration => 189, :position => 50}
84
+ player.scrub("50%") # Go to the half of the media
51
85
  player.stop
52
86
  ```
53
87
 
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ task :test do
5
5
  Cutest.run(Dir["test/*.rb"])
6
6
 
7
7
  class Cutest::Scope
8
- include Capybara
8
+ include Capybara::DSL
9
9
  end
10
10
  end
11
11
 
data/airplay.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "airplay"
3
- s.version = "0.2.2"
3
+ s.version = "0.2.3"
4
4
  s.summary = "Airplay client"
5
5
  s.description = "Send image/video to an airplay enabled device"
6
6
  s.authors = ["elcuervo"]
@@ -39,8 +39,13 @@ class Airplay::Client
39
39
  Airplay::Protocol::Media.new(handler).send(audio, position)
40
40
  end
41
41
 
42
- def scrub
43
- Airplay::Protocol::Scrub.new(handler).send
42
+ def scrub(position = false)
43
+ scrubber = Airplay::Protocol::Scrub.new(handler)
44
+ if position
45
+ scrubber.to position
46
+ else
47
+ scrubber.check
48
+ end
44
49
  end
45
50
 
46
51
  end
@@ -5,9 +5,9 @@ class Airplay::Protocol
5
5
  SEARCH = '_airplay._tcp.'
6
6
  PORT = 7000
7
7
 
8
- def initialize(host, port = PORT, password)
8
+ def initialize(host, port, password)
9
9
  @password = password
10
- @http = Net::HTTP.new(host, port)
10
+ @http = Net::HTTP.new(host, port || PORT)
11
11
  @http.set_debug_output($stdout) if ENV.has_key?('HTTP_DEBUG')
12
12
  end
13
13
 
@@ -51,3 +51,4 @@ class Airplay::Protocol
51
51
  end
52
52
 
53
53
  class Airplay::Protocol::InvalidRequestError < StandardError; end
54
+ class Airplay::Protocol::InvalidMediaError < StandardError; end
@@ -10,13 +10,15 @@ class Airplay::Protocol::Image
10
10
 
11
11
  def transitions
12
12
  {
13
- :none => "None",
14
- :dissolve => "Dissolve"
13
+ :none => "None",
14
+ :slide_left => "SlideLeft",
15
+ :slide_right => "SlideRight",
16
+ :dissolve => "Dissolve"
15
17
  }
16
18
  end
17
19
 
18
20
  def transition_header(transition)
19
- {"X-Apple-Transition" => transitions.fetch(transition)}
21
+ {"X-Apple-Transition" => transitions.fetch(transition, :none)}
20
22
  end
21
23
 
22
24
  def send(image, transition = :none)
@@ -2,6 +2,7 @@ class Airplay::Protocol::Media
2
2
 
3
3
  def initialize(protocol_handler)
4
4
  @http = protocol_handler
5
+ @scrubber = Airplay::Protocol::Scrub.new(protocol_handler)
5
6
  end
6
7
 
7
8
  def resource
@@ -12,6 +13,10 @@ class Airplay::Protocol::Media
12
13
  "/stop"
13
14
  end
14
15
 
16
+ def pause_resource
17
+ "/rate"
18
+ end
19
+
15
20
  def position_body(position = 0)
16
21
  "Start-Position: #{position}\n"
17
22
  end
@@ -26,11 +31,32 @@ class Airplay::Protocol::Media
26
31
  end
27
32
 
28
33
  def play(media, position = 0)
34
+ raise Airplay::Protocol::InvalidMediaError if (media =~ URI::regexp).nil?
29
35
  body = location_body(media)
30
36
  body += position_body(position.to_s)
31
37
  @http.post(resource, body)
32
38
  end
33
39
 
40
+ def pause
41
+ rate(0)
42
+ end
43
+
44
+ def scrub(position = false)
45
+ if position
46
+ @scrubber.to position
47
+ else
48
+ @scrubber.check
49
+ end
50
+ end
51
+
52
+ def resume
53
+ rate(1)
54
+ end
55
+
56
+ def rate(play = 1)
57
+ @http.post("#{pause_resource}?value=#{play}")
58
+ end
59
+
34
60
  def stop
35
61
  @http.post(stop_resource)
36
62
  end
@@ -12,13 +12,26 @@ class Airplay::Protocol::Scrub
12
12
  {'Content-Type' => 'text/x-apple-plist+xml'}
13
13
  end
14
14
 
15
- def send
15
+ def check
16
16
  response = @http.get(resource, plist_headers)
17
17
  result = {}
18
18
  response.delete(":").split.each_slice(2) do |key, value|
19
- result[key] = value
19
+ result[key] = value.to_i
20
20
  end
21
21
  result
22
22
  end
23
23
 
24
+ def to(position)
25
+ if position.to_s.include?("%")
26
+ percent = position.to_i
27
+ raise Airplay::Protocol::OutOfRangeError if percent > 100
28
+ duration = check.fetch("duration")
29
+ position = (duration*percent)/100
30
+ end
31
+
32
+ @http.post("#{resource}?position=#{position}\n")
33
+ end
34
+
24
35
  end
36
+
37
+ class Airplay::Protocol::OutOfRangeError < StandardError; end;
@@ -0,0 +1,189 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: http://10.1.0.220:7000/play
6
+ body: ! 'Content-Location: http://www.yo-yo.org/mp4/yu.mp4
7
+
8
+ Start-Position: 0
9
+
10
+ '
11
+ headers:
12
+ user-agent:
13
+ - MediaControl/1.0
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ date:
20
+ - Thu, 22 Sep 2011 14:12:17 GMT
21
+ content-length:
22
+ - '0'
23
+ body: !!null
24
+ http_version: '1.1'
25
+ ignored: false
26
+ - !ruby/struct:VCR::HTTPInteraction
27
+ request: !ruby/struct:VCR::Request
28
+ method: :post
29
+ uri: http://10.1.0.220:7000/rate?value=0
30
+ body: !!null
31
+ headers:
32
+ user-agent:
33
+ - MediaControl/1.0
34
+ response: !ruby/struct:VCR::Response
35
+ status: !ruby/struct:VCR::ResponseStatus
36
+ code: 200
37
+ message: OK
38
+ headers:
39
+ date:
40
+ - Thu, 22 Sep 2011 14:12:17 GMT
41
+ content-length:
42
+ - '0'
43
+ body: !!null
44
+ http_version: '1.1'
45
+ ignored: false
46
+ - !ruby/struct:VCR::HTTPInteraction
47
+ request: !ruby/struct:VCR::Request
48
+ method: :post
49
+ uri: http://10.1.0.220:7000/rate?value=1
50
+ body: !!null
51
+ headers:
52
+ user-agent:
53
+ - MediaControl/1.0
54
+ response: !ruby/struct:VCR::Response
55
+ status: !ruby/struct:VCR::ResponseStatus
56
+ code: 200
57
+ message: OK
58
+ headers:
59
+ date:
60
+ - Thu, 22 Sep 2011 14:12:17 GMT
61
+ content-length:
62
+ - '0'
63
+ body: !!null
64
+ http_version: '1.1'
65
+ ignored: false
66
+ - !ruby/struct:VCR::HTTPInteraction
67
+ request: !ruby/struct:VCR::Request
68
+ method: :get
69
+ uri: http://10.1.0.220:7000/scrub
70
+ body: !!null
71
+ headers:
72
+ user-agent:
73
+ - MediaControl/1.0
74
+ content-type:
75
+ - text/x-apple-plist+xml
76
+ response: !ruby/struct:VCR::Response
77
+ status: !ruby/struct:VCR::ResponseStatus
78
+ code: 200
79
+ message: OK
80
+ headers:
81
+ date:
82
+ - Thu, 22 Sep 2011 14:12:17 GMT
83
+ content-type:
84
+ - text/parameters
85
+ content-length:
86
+ - '38'
87
+ body: ! 'duration: 0.000000
88
+
89
+ position: 0.000000
90
+
91
+ '
92
+ http_version: '1.1'
93
+ ignored: false
94
+ - !ruby/struct:VCR::HTTPInteraction
95
+ request: !ruby/struct:VCR::Request
96
+ method: :get
97
+ uri: http://10.1.0.220:7000/scrub
98
+ body: !!null
99
+ headers:
100
+ user-agent:
101
+ - MediaControl/1.0
102
+ content-type:
103
+ - text/x-apple-plist+xml
104
+ response: !ruby/struct:VCR::Response
105
+ status: !ruby/struct:VCR::ResponseStatus
106
+ code: 200
107
+ message: OK
108
+ headers:
109
+ date:
110
+ - Thu, 22 Sep 2011 14:12:17 GMT
111
+ content-type:
112
+ - text/parameters
113
+ content-length:
114
+ - '38'
115
+ body: ! 'duration: 0.000000
116
+
117
+ position: 0.000000
118
+
119
+ '
120
+ http_version: '1.1'
121
+ ignored: false
122
+ - !ruby/struct:VCR::HTTPInteraction
123
+ request: !ruby/struct:VCR::Request
124
+ method: :get
125
+ uri: http://10.1.0.220:7000/scrub
126
+ body: !!null
127
+ headers:
128
+ user-agent:
129
+ - MediaControl/1.0
130
+ content-type:
131
+ - text/x-apple-plist+xml
132
+ response: !ruby/struct:VCR::Response
133
+ status: !ruby/struct:VCR::ResponseStatus
134
+ code: 200
135
+ message: OK
136
+ headers:
137
+ date:
138
+ - Thu, 22 Sep 2011 14:12:17 GMT
139
+ content-type:
140
+ - text/parameters
141
+ content-length:
142
+ - '38'
143
+ body: ! 'duration: 0.000000
144
+
145
+ position: 0.000000
146
+
147
+ '
148
+ http_version: '1.1'
149
+ ignored: false
150
+ - !ruby/struct:VCR::HTTPInteraction
151
+ request: !ruby/struct:VCR::Request
152
+ method: :post
153
+ uri: http://10.1.0.220:7000/scrub?position=0
154
+ body: !!null
155
+ headers:
156
+ user-agent:
157
+ - MediaControl/1.0
158
+ response: !ruby/struct:VCR::Response
159
+ status: !ruby/struct:VCR::ResponseStatus
160
+ code: 200
161
+ message: OK
162
+ headers:
163
+ date:
164
+ - Thu, 22 Sep 2011 14:12:17 GMT
165
+ content-length:
166
+ - '0'
167
+ body: !!null
168
+ http_version: '1.1'
169
+ ignored: false
170
+ - !ruby/struct:VCR::HTTPInteraction
171
+ request: !ruby/struct:VCR::Request
172
+ method: :post
173
+ uri: http://10.1.0.220:7000/stop
174
+ body: !!null
175
+ headers:
176
+ user-agent:
177
+ - MediaControl/1.0
178
+ response: !ruby/struct:VCR::Response
179
+ status: !ruby/struct:VCR::ResponseStatus
180
+ code: 200
181
+ message: OK
182
+ headers:
183
+ date:
184
+ - Thu, 22 Sep 2011 14:12:17 GMT
185
+ content-length:
186
+ - '0'
187
+ body: !!null
188
+ http_version: '1.1'
189
+ ignored: false
@@ -0,0 +1,121 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: http://10.1.0.220:7000/play
6
+ body: ! 'Content-Location: http://www.yo-yo.org/mp4/yu.mp4
7
+
8
+ Start-Position: 0
9
+
10
+ '
11
+ headers:
12
+ user-agent:
13
+ - MediaControl/1.0
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ date:
20
+ - Thu, 22 Sep 2011 13:58:33 GMT
21
+ content-length:
22
+ - '0'
23
+ body: !!null
24
+ http_version: '1.1'
25
+ ignored: false
26
+ - !ruby/struct:VCR::HTTPInteraction
27
+ request: !ruby/struct:VCR::Request
28
+ method: :get
29
+ uri: http://10.1.0.220:7000/scrub
30
+ body: !!null
31
+ headers:
32
+ user-agent:
33
+ - MediaControl/1.0
34
+ content-type:
35
+ - text/x-apple-plist+xml
36
+ response: !ruby/struct:VCR::Response
37
+ status: !ruby/struct:VCR::ResponseStatus
38
+ code: 200
39
+ message: OK
40
+ headers:
41
+ date:
42
+ - Thu, 22 Sep 2011 13:58:33 GMT
43
+ content-type:
44
+ - text/parameters
45
+ content-length:
46
+ - '38'
47
+ body: ! 'duration: 0.000000
48
+
49
+ position: 0.000000
50
+
51
+ '
52
+ http_version: '1.1'
53
+ ignored: false
54
+ - !ruby/struct:VCR::HTTPInteraction
55
+ request: !ruby/struct:VCR::Request
56
+ method: :post
57
+ uri: http://10.1.0.220:7000/scrub?position=0
58
+ body: !!null
59
+ headers:
60
+ user-agent:
61
+ - MediaControl/1.0
62
+ response: !ruby/struct:VCR::Response
63
+ status: !ruby/struct:VCR::ResponseStatus
64
+ code: 200
65
+ message: OK
66
+ headers:
67
+ date:
68
+ - Thu, 22 Sep 2011 13:58:33 GMT
69
+ content-length:
70
+ - '0'
71
+ body: !!null
72
+ http_version: '1.1'
73
+ ignored: false
74
+ - !ruby/struct:VCR::HTTPInteraction
75
+ request: !ruby/struct:VCR::Request
76
+ method: :get
77
+ uri: http://10.1.0.220:7000/scrub
78
+ body: !!null
79
+ headers:
80
+ user-agent:
81
+ - MediaControl/1.0
82
+ content-type:
83
+ - text/x-apple-plist+xml
84
+ response: !ruby/struct:VCR::Response
85
+ status: !ruby/struct:VCR::ResponseStatus
86
+ code: 200
87
+ message: OK
88
+ headers:
89
+ date:
90
+ - Thu, 22 Sep 2011 13:58:33 GMT
91
+ content-type:
92
+ - text/parameters
93
+ content-length:
94
+ - '38'
95
+ body: ! 'duration: 0.000000
96
+
97
+ position: 0.000000
98
+
99
+ '
100
+ http_version: '1.1'
101
+ ignored: false
102
+ - !ruby/struct:VCR::HTTPInteraction
103
+ request: !ruby/struct:VCR::Request
104
+ method: :post
105
+ uri: http://10.1.0.220:7000/scrub?position=0
106
+ body: !!null
107
+ headers:
108
+ user-agent:
109
+ - MediaControl/1.0
110
+ response: !ruby/struct:VCR::Response
111
+ status: !ruby/struct:VCR::ResponseStatus
112
+ code: 200
113
+ message: OK
114
+ headers:
115
+ date:
116
+ - Thu, 22 Sep 2011 13:58:33 GMT
117
+ content-length:
118
+ - '0'
119
+ body: !!null
120
+ http_version: '1.1'
121
+ ignored: false
@@ -0,0 +1,557 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :put
5
+ uri: http://10.1.0.220:7000/photo
6
+ body: !binary |-
7
+ R0lGODdhAAXQAuMAAMzMzJaWlsXFxb6+vre3t6Ojo7GxsZycnKqqqgAAAAAA
8
+ AAAAAAAAAAAAAAAAAAAAACwAAAAAAAXQAgAE/hDISau9OOvNu/9gKI5kaZ5o
9
+ qq5s675wLM90bd94ru987//AoHBILBqPyKRyyWw6n9CodEqtWq/YrHbL7Xq/
10
+ 4LB4TC6bz+i0es1uu9/wuHxOr9vv+Lx+z+/7/4CBgoOEhYaHiImKi4yNjo+Q
11
+ kZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9
12
+ vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq
13
+ 6+zt7u/w8fLz9PX29/j5+vv8/f7/AAMKHEiwoMGDCBMqXMiwocOHECNKnEix
14
+ osWLGDNq3Mixo8eP/iBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJ
15
+ s6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1L
16
+ tqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17M
17
+ uLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55N
18
+ u7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/O
19
+ vbv37+DDix9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAG/ijg
20
+ gAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmji
21
+ iSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnk
22
+ kkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunm
23
+ m3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirp
24
+ pJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMYq66y01mrr
25
+ rbjmquuuvPbq66/ABivssMQWa+yxyCar7LLM/jbr7LPQRivttNRWa+212Gar
26
+ 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
102
+ tbST+ZusE9y2uYkBhDq/tvs9RbtaPvzDCRTA97uM66SzBxXF0ESYstq0MyDA
103
+ N1lAeVu57PrEJbhL/+e0m5ShZBwAJCCYQMmP5FSVBqRLmsnGPBCsLLDFSNRH
104
+ qlSzabzEZOySfawCUrw9ysq85neyC9SZCMzHawx4JVDIDevHkRSwa+ye/nHc
105
+ jGcEnzpgQB9Xgz0gvI77yJCsbZKsa0U8LzzMqI9MkWeEwkM8ZakMlTWavMD7
106
+ AgZ8yir0SLrMP7MsL6uMpqQ8SUgUuArFhtTDyWGbqHsbl01qwKRcyn+LzPXz
107
+ y8BcxaoayE9IzXflu86bREGwnIDsuZDbv7TcyucIQij8L8Hsd9GslDUYQcuK
108
+ zOQGBFk6eWBciqHLypfMAslnsd4cMO2sAXoMRC3wz2plzJPHX/UcBOMHUvSn
109
+ z7dsxsPsQwwd0ALDzRaLfb38gzBwOZlzO5rzOaozOqWjQQVgACVdBCl3d+jK
110
+ cjygczBgvk+sxHV20neV0itNOf6AAJrz00D9/tNNzNNEXdRGfdRIndRKvdRM
111
+ 3dRO/dRQHdVSPdVUXdVWfdVYndVavdVc3dVe/dVgHdZiPdZkXdZmfdZondZq
112
+ vdZs3dZu/dZwHddyPdd0Xdd2fdd4ndd6vdd83dd+/deAHdiCPdiEXdiGfdiI
113
+ ndiKvdiM3diO/diQHdmSPdmUXdmWfdmYndmavdmc3dme/dmgHdqiPdqkXdqm
114
+ fdqondqqvdqs3dqu/dqwHduyPdu0Xdu2fdu4ndu6vdu83du+/dvAHdzCPdzE
115
+ XdzGfdzIndzKvdzM3dzO/dzQHd3SPd3UXd3Wfd3Ynd3avd3c3d3e/d3gHd7i
116
+ Pd7kXd7mfd7ond7q/r3e7N3e7v3e8B3f8j3f9F3f9n3f+J3f+r3f/N3f/v3f
117
+ AB7gAj7gBF7gBn7gCJ7gCr7gDN7gDv7gEB7hEj7hFF7hFn7hGJ7hGr7hHN7h
118
+ Hv7hIB7iIj7iJF7iJn7iKJ7iKr7iLN7iLv7iMB7jMj7jNF7jNn7jOJ7jOr7j
119
+ PN7jPv7jQB7kQj7kRF7kRn7kSJ7kSr7kTN7kTv7kUB7lUj7lVF7lVn7lWJ7l
120
+ Wr7lXN7lXv7lYB7mYj7mZF7mZn7maJ7mar7mbN7mbv7mcB7ncj7ndF7ndn7n
121
+ eJ7ner7nfN7nfv7ngB7ogj7ohF7ohn7oiJ7oir7ojN7ojv7okB7pkj7pM5Re
122
+ 6ZZ+6Zie6Zq+6Zze6Z7+6aAe6qI+6qRe6qZ+6qie6qq+6qze6q7+6rAe67I+
123
+ 6yATAQA7
124
+ headers:
125
+ user-agent:
126
+ - MediaControl/1.0
127
+ x-apple-transition:
128
+ - None
129
+ response: !ruby/struct:VCR::Response
130
+ status: !ruby/struct:VCR::ResponseStatus
131
+ code: 200
132
+ message: OK
133
+ headers:
134
+ date:
135
+ - Thu, 22 Sep 2011 13:18:47 GMT
136
+ content-length:
137
+ - '0'
138
+ body: !!null
139
+ http_version: '1.1'
140
+ ignored: false
141
+ - !ruby/struct:VCR::HTTPInteraction
142
+ request: !ruby/struct:VCR::Request
143
+ method: :put
144
+ uri: http://10.1.0.220:7000/photo
145
+ body: !binary |-
146
+ R0lGODdhAAXQAuMAAMzMzJaWlsXFxb6+vre3t6Ojo7GxsZycnKqqqgAAAAAA
147
+ AAAAAAAAAAAAAAAAAAAAACwAAAAAAAXQAgAE/hDISau9OOvNu/9gKI5kaZ5o
148
+ qq5s675wLM90bd94ru987//AoHBILBqPyKRyyWw6n9CodEqtWq/YrHbL7Xq/
149
+ 4LB4TC6bz+i0es1uu9/wuHxOr9vv+Lx+z+/7/4CBgoOEhYaHiImKi4yNjo+Q
150
+ kZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9
151
+ vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq
152
+ 6+zt7u/w8fLz9PX29/j5+vv8/f7/AAMKHEiwoMGDCBMqXMiwocOHECNKnEix
153
+ osWLGDNq3Mixo8eP/iBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJ
154
+ s6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1L
155
+ tqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17M
156
+ uLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55N
157
+ u7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/O
158
+ vbv37+DDix9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAG/ijg
159
+ gAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmji
160
+ iSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnk
161
+ kkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunm
162
+ m3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirp
163
+ pJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMYq66y01mrr
164
+ rbjmquuuvPbq66/ABivssMQWa+yxyCar7LLM/jbr7LPQRivttNRWa+212Gar
165
+ 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
241
+ tbST+ZusE9y2uYkBhDq/tvs9RbtaPvzDCRTA97uM66SzBxXF0ESYstq0MyDA
242
+ N1lAeVu57PrEJbhL/+e0m5ShZBwAJCCYQMmP5FSVBqRLmsnGPBCsLLDFSNRH
243
+ qlSzabzEZOySfawCUrw9ysq85neyC9SZCMzHawx4JVDIDevHkRSwa+ye/nHc
244
+ jGcEnzpgQB9Xgz0gvI77yJCsbZKsa0U8LzzMqI9MkWeEwkM8ZakMlTWavMD7
245
+ AgZ8yir0SLrMP7MsL6uMpqQ8SUgUuArFhtTDyWGbqHsbl01qwKRcyn+LzPXz
246
+ y8BcxaoayE9IzXflu86bREGwnIDsuZDbv7TcyucIQij8L8Hsd9GslDUYQcuK
247
+ zOQGBFk6eWBciqHLypfMAslnsd4cMO2sAXoMRC3wz2plzJPHX/UcBOMHUvSn
248
+ z7dsxsPsQwwd0ALDzRaLfb38gzBwOZlzO5rzOaozOqWjQQVgACVdBCl3d+jK
249
+ cjygczBgvk+sxHV20neV0itNOf6AAJrz00D9/tNNzNNEXdRGfdRIndRKvdRM
250
+ 3dRO/dRQHdVSPdVUXdVWfdVYndVavdVc3dVe/dVgHdZiPdZkXdZmfdZondZq
251
+ vdZs3dZu/dZwHddyPdd0Xdd2fdd4ndd6vdd83dd+/deAHdiCPdiEXdiGfdiI
252
+ ndiKvdiM3diO/diQHdmSPdmUXdmWfdmYndmavdmc3dme/dmgHdqiPdqkXdqm
253
+ fdqondqqvdqs3dqu/dqwHduyPdu0Xdu2fdu4ndu6vdu83du+/dvAHdzCPdzE
254
+ XdzGfdzIndzKvdzM3dzO/dzQHd3SPd3UXd3Wfd3Ynd3avd3c3d3e/d3gHd7i
255
+ Pd7kXd7mfd7ond7q/r3e7N3e7v3e8B3f8j3f9F3f9n3f+J3f+r3f/N3f/v3f
256
+ AB7gAj7gBF7gBn7gCJ7gCr7gDN7gDv7gEB7hEj7hFF7hFn7hGJ7hGr7hHN7h
257
+ Hv7hIB7iIj7iJF7iJn7iKJ7iKr7iLN7iLv7iMB7jMj7jNF7jNn7jOJ7jOr7j
258
+ PN7jPv7jQB7kQj7kRF7kRn7kSJ7kSr7kTN7kTv7kUB7lUj7lVF7lVn7lWJ7l
259
+ Wr7lXN7lXv7lYB7mYj7mZF7mZn7maJ7mar7mbN7mbv7mcB7ncj7ndF7ndn7n
260
+ eJ7ner7nfN7nfv7ngB7ogj7ohF7ohn7oiJ7oir7ojN7ojv7okB7pkj7pM5Re
261
+ 6ZZ+6Zie6Zq+6Zze6Z7+6aAe6qI+6qRe6qZ+6qie6qq+6qze6q7+6rAe67I+
262
+ 6yATAQA7
263
+ headers:
264
+ user-agent:
265
+ - MediaControl/1.0
266
+ x-apple-transition:
267
+ - SlideLeft
268
+ response: !ruby/struct:VCR::Response
269
+ status: !ruby/struct:VCR::ResponseStatus
270
+ code: 200
271
+ message: OK
272
+ headers:
273
+ date:
274
+ - Thu, 22 Sep 2011 13:18:48 GMT
275
+ content-length:
276
+ - '0'
277
+ body: !!null
278
+ http_version: '1.1'
279
+ ignored: false
280
+ - !ruby/struct:VCR::HTTPInteraction
281
+ request: !ruby/struct:VCR::Request
282
+ method: :put
283
+ uri: http://10.1.0.220:7000/photo
284
+ body: !binary |-
285
+ R0lGODdhAAXQAuMAAMzMzJaWlsXFxb6+vre3t6Ojo7GxsZycnKqqqgAAAAAA
286
+ AAAAAAAAAAAAAAAAAAAAACwAAAAAAAXQAgAE/hDISau9OOvNu/9gKI5kaZ5o
287
+ qq5s675wLM90bd94ru987//AoHBILBqPyKRyyWw6n9CodEqtWq/YrHbL7Xq/
288
+ 4LB4TC6bz+i0es1uu9/wuHxOr9vv+Lx+z+/7/4CBgoOEhYaHiImKi4yNjo+Q
289
+ kZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9
290
+ vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq
291
+ 6+zt7u/w8fLz9PX29/j5+vv8/f7/AAMKHEiwoMGDCBMqXMiwocOHECNKnEix
292
+ osWLGDNq3Mixo8eP/iBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJ
293
+ s6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1L
294
+ tqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17M
295
+ uLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55N
296
+ u7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/O
297
+ vbv37+DDix9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAG/ijg
298
+ gAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmji
299
+ iSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnk
300
+ kkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunm
301
+ m3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirp
302
+ pJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMYq66y01mrr
303
+ rbjmquuuvPbq66/ABivssMQWa+yxyCar7LLM/jbr7LPQRivttNRWa+212Gar
304
+ 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
380
+ tbST+ZusE9y2uYkBhDq/tvs9RbtaPvzDCRTA97uM66SzBxXF0ESYstq0MyDA
381
+ N1lAeVu57PrEJbhL/+e0m5ShZBwAJCCYQMmP5FSVBqRLmsnGPBCsLLDFSNRH
382
+ qlSzabzEZOySfawCUrw9ysq85neyC9SZCMzHawx4JVDIDevHkRSwa+ye/nHc
383
+ jGcEnzpgQB9Xgz0gvI77yJCsbZKsa0U8LzzMqI9MkWeEwkM8ZakMlTWavMD7
384
+ AgZ8yir0SLrMP7MsL6uMpqQ8SUgUuArFhtTDyWGbqHsbl01qwKRcyn+LzPXz
385
+ y8BcxaoayE9IzXflu86bREGwnIDsuZDbv7TcyucIQij8L8Hsd9GslDUYQcuK
386
+ zOQGBFk6eWBciqHLypfMAslnsd4cMO2sAXoMRC3wz2plzJPHX/UcBOMHUvSn
387
+ z7dsxsPsQwwd0ALDzRaLfb38gzBwOZlzO5rzOaozOqWjQQVgACVdBCl3d+jK
388
+ cjygczBgvk+sxHV20neV0itNOf6AAJrz00D9/tNNzNNEXdRGfdRIndRKvdRM
389
+ 3dRO/dRQHdVSPdVUXdVWfdVYndVavdVc3dVe/dVgHdZiPdZkXdZmfdZondZq
390
+ vdZs3dZu/dZwHddyPdd0Xdd2fdd4ndd6vdd83dd+/deAHdiCPdiEXdiGfdiI
391
+ ndiKvdiM3diO/diQHdmSPdmUXdmWfdmYndmavdmc3dme/dmgHdqiPdqkXdqm
392
+ fdqondqqvdqs3dqu/dqwHduyPdu0Xdu2fdu4ndu6vdu83du+/dvAHdzCPdzE
393
+ XdzGfdzIndzKvdzM3dzO/dzQHd3SPd3UXd3Wfd3Ynd3avd3c3d3e/d3gHd7i
394
+ Pd7kXd7mfd7ond7q/r3e7N3e7v3e8B3f8j3f9F3f9n3f+J3f+r3f/N3f/v3f
395
+ AB7gAj7gBF7gBn7gCJ7gCr7gDN7gDv7gEB7hEj7hFF7hFn7hGJ7hGr7hHN7h
396
+ Hv7hIB7iIj7iJF7iJn7iKJ7iKr7iLN7iLv7iMB7jMj7jNF7jNn7jOJ7jOr7j
397
+ PN7jPv7jQB7kQj7kRF7kRn7kSJ7kSr7kTN7kTv7kUB7lUj7lVF7lVn7lWJ7l
398
+ Wr7lXN7lXv7lYB7mYj7mZF7mZn7maJ7mar7mbN7mbv7mcB7ncj7ndF7ndn7n
399
+ eJ7ner7nfN7nfv7ngB7ogj7ohF7ohn7oiJ7oir7ojN7ojv7okB7pkj7pM5Re
400
+ 6ZZ+6Zie6Zq+6Zze6Z7+6aAe6qI+6qRe6qZ+6qie6qq+6qze6q7+6rAe67I+
401
+ 6yATAQA7
402
+ headers:
403
+ user-agent:
404
+ - MediaControl/1.0
405
+ x-apple-transition:
406
+ - SlideRight
407
+ response: !ruby/struct:VCR::Response
408
+ status: !ruby/struct:VCR::ResponseStatus
409
+ code: 200
410
+ message: OK
411
+ headers:
412
+ date:
413
+ - Thu, 22 Sep 2011 13:18:48 GMT
414
+ content-length:
415
+ - '0'
416
+ body: !!null
417
+ http_version: '1.1'
418
+ ignored: false
419
+ - !ruby/struct:VCR::HTTPInteraction
420
+ request: !ruby/struct:VCR::Request
421
+ method: :put
422
+ uri: http://10.1.0.220:7000/photo
423
+ body: !binary |-
424
+ R0lGODdhAAXQAuMAAMzMzJaWlsXFxb6+vre3t6Ojo7GxsZycnKqqqgAAAAAA
425
+ AAAAAAAAAAAAAAAAAAAAACwAAAAAAAXQAgAE/hDISau9OOvNu/9gKI5kaZ5o
426
+ qq5s675wLM90bd94ru987//AoHBILBqPyKRyyWw6n9CodEqtWq/YrHbL7Xq/
427
+ 4LB4TC6bz+i0es1uu9/wuHxOr9vv+Lx+z+/7/4CBgoOEhYaHiImKi4yNjo+Q
428
+ kZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9
429
+ vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq
430
+ 6+zt7u/w8fLz9PX29/j5+vv8/f7/AAMKHEiwoMGDCBMqXMiwocOHECNKnEix
431
+ osWLGDNq3Mixo8eP/iBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJ
432
+ s6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1L
433
+ tqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17M
434
+ uLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55N
435
+ u7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/O
436
+ vbv37+DDix9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAG/ijg
437
+ gAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmji
438
+ iSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnk
439
+ kkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunm
440
+ m3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirp
441
+ pJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMYq66y01mrr
442
+ rbjmquuuvPbq66/ABivssMQWa+yxyCar7LLM/jbr7LPQRivttNRWa+212Gar
443
+ 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
519
+ tbST+ZusE9y2uYkBhDq/tvs9RbtaPvzDCRTA97uM66SzBxXF0ESYstq0MyDA
520
+ N1lAeVu57PrEJbhL/+e0m5ShZBwAJCCYQMmP5FSVBqRLmsnGPBCsLLDFSNRH
521
+ qlSzabzEZOySfawCUrw9ysq85neyC9SZCMzHawx4JVDIDevHkRSwa+ye/nHc
522
+ jGcEnzpgQB9Xgz0gvI77yJCsbZKsa0U8LzzMqI9MkWeEwkM8ZakMlTWavMD7
523
+ AgZ8yir0SLrMP7MsL6uMpqQ8SUgUuArFhtTDyWGbqHsbl01qwKRcyn+LzPXz
524
+ y8BcxaoayE9IzXflu86bREGwnIDsuZDbv7TcyucIQij8L8Hsd9GslDUYQcuK
525
+ zOQGBFk6eWBciqHLypfMAslnsd4cMO2sAXoMRC3wz2plzJPHX/UcBOMHUvSn
526
+ z7dsxsPsQwwd0ALDzRaLfb38gzBwOZlzO5rzOaozOqWjQQVgACVdBCl3d+jK
527
+ cjygczBgvk+sxHV20neV0itNOf6AAJrz00D9/tNNzNNEXdRGfdRIndRKvdRM
528
+ 3dRO/dRQHdVSPdVUXdVWfdVYndVavdVc3dVe/dVgHdZiPdZkXdZmfdZondZq
529
+ vdZs3dZu/dZwHddyPdd0Xdd2fdd4ndd6vdd83dd+/deAHdiCPdiEXdiGfdiI
530
+ ndiKvdiM3diO/diQHdmSPdmUXdmWfdmYndmavdmc3dme/dmgHdqiPdqkXdqm
531
+ fdqondqqvdqs3dqu/dqwHduyPdu0Xdu2fdu4ndu6vdu83du+/dvAHdzCPdzE
532
+ XdzGfdzIndzKvdzM3dzO/dzQHd3SPd3UXd3Wfd3Ynd3avd3c3d3e/d3gHd7i
533
+ Pd7kXd7mfd7ond7q/r3e7N3e7v3e8B3f8j3f9F3f9n3f+J3f+r3f/N3f/v3f
534
+ AB7gAj7gBF7gBn7gCJ7gCr7gDN7gDv7gEB7hEj7hFF7hFn7hGJ7hGr7hHN7h
535
+ Hv7hIB7iIj7iJF7iJn7iKJ7iKr7iLN7iLv7iMB7jMj7jNF7jNn7jOJ7jOr7j
536
+ PN7jPv7jQB7kQj7kRF7kRn7kSJ7kSr7kTN7kTv7kUB7lUj7lVF7lVn7lWJ7l
537
+ Wr7lXN7lXv7lYB7mYj7mZF7mZn7maJ7mar7mbN7mbv7mcB7ncj7ndF7ndn7n
538
+ eJ7ner7nfN7nfv7ngB7ogj7ohF7ohn7oiJ7oir7ojN7ojv7okB7pkj7pM5Re
539
+ 6ZZ+6Zie6Zq+6Zze6Z7+6aAe6qI+6qRe6qZ+6qie6qq+6qze6q7+6rAe67I+
540
+ 6yATAQA7
541
+ headers:
542
+ user-agent:
543
+ - MediaControl/1.0
544
+ x-apple-transition:
545
+ - Dissolve
546
+ response: !ruby/struct:VCR::Response
547
+ status: !ruby/struct:VCR::ResponseStatus
548
+ code: 200
549
+ message: OK
550
+ headers:
551
+ date:
552
+ - Thu, 22 Sep 2011 13:18:48 GMT
553
+ content-length:
554
+ - '0'
555
+ body: !!null
556
+ http_version: '1.1'
557
+ ignored: false
data/test/images.rb CHANGED
@@ -21,9 +21,12 @@ scope do
21
21
  end
22
22
  end
23
23
 
24
- test "send an image to the server doing a dissolve" do
25
- VCR.use_cassette("send image to apple tv") do
26
- assert @airplay.send_image("./test/fixtures/image.gif", :dissolve).kind_of?(String)
24
+ test "send an image to the server doing all the effects" do
25
+ VCR.use_cassette("send image to apple tv with effects") do
26
+ [:none, :slide_left, :slide_right, :dissolve].each do |effect|
27
+ assert @airplay.send_image("./test/fixtures/image.gif", effect).kind_of?(String)
28
+ end
27
29
  end
28
30
  end
31
+
29
32
  end
data/test/media.rb CHANGED
@@ -4,6 +4,8 @@ scope do
4
4
  test "check media protocol class" do
5
5
  image_protocol = Airplay::Protocol::Media.new("127.0.0.1")
6
6
  assert_equal "/play", image_protocol.resource
7
+ assert_equal "/stop", image_protocol.stop_resource
8
+ assert_equal "/rate", image_protocol.pause_resource
7
9
  end
8
10
  end
9
11
 
@@ -14,9 +16,20 @@ scope do
14
16
 
15
17
  test "send a video to the server" do
16
18
  VCR.use_cassette("send video to apple tv") do
19
+ assert @airplay.send_video("http://www.yo-yo.org/mp4/yu.mp4")
20
+ end
21
+ end
22
+
23
+ test "player capabilities" do
24
+ VCR.use_cassette("control a video being played in apple tv") do
17
25
  player = @airplay.send_video("http://www.yo-yo.org/mp4/yu.mp4")
18
- assert player
19
- assert player.stop.kind_of?(String)
26
+
27
+ assert player.pause
28
+ assert player.resume
29
+ assert player.scrub.has_key?("position")
30
+ assert player.scrub.has_key?("duration")
31
+ assert player.scrub("10%")
32
+ assert player.stop
20
33
  end
21
34
  end
22
35
 
@@ -25,4 +38,10 @@ scope do
25
38
  assert @airplay.send_audio("http://www.robtowns.com/music/blind_willie.mp3")
26
39
  end
27
40
  end
41
+
42
+ test "raise an exception on invalid media url" do
43
+ assert_raise Airplay::Protocol::InvalidMediaError do
44
+ @airplay.send_video("Surculus Fructum!")
45
+ end
46
+ end
28
47
  end
data/test/scrub.rb CHANGED
@@ -18,4 +18,14 @@ scope do
18
18
  assert @airplay.scrub.has_key?("position")
19
19
  end
20
20
  end
21
+
22
+ test "move to a given position" do
23
+ VCR.use_cassette("go to a given position in the video") do
24
+ @airplay.send_video("http://www.yo-yo.org/mp4/yu.mp4")
25
+ duration = @airplay.scrub.fetch("duration")
26
+
27
+ assert @airplay.scrub(duration/2)
28
+ assert @airplay.scrub("50%")
29
+ end
30
+ end
21
31
  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.2.2
4
+ version: 0.2.3
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-09-15 00:00:00.000000000 -03:00
12
+ date: 2011-09-22 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: &70199534234500 !ruby/object:Gem::Requirement
17
+ requirement: &70225844795760 !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: *70199534234500
25
+ version_requirements: *70225844795760
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: net-http-digest_auth
28
- requirement: &70199534234060 !ruby/object:Gem::Requirement
28
+ requirement: &70225844795320 !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: :runtime
35
35
  prerelease: false
36
- version_requirements: *70199534234060
36
+ version_requirements: *70225844795320
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: cutest
39
- requirement: &70199534233640 !ruby/object:Gem::Requirement
39
+ requirement: &70225844794900 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70199534233640
47
+ version_requirements: *70225844794900
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: capybara
50
- requirement: &70199534233220 !ruby/object:Gem::Requirement
50
+ requirement: &70225844794460 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *70199534233220
58
+ version_requirements: *70225844794460
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: fakeweb
61
- requirement: &70199534276300 !ruby/object:Gem::Requirement
61
+ requirement: &70225844794040 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *70199534276300
69
+ version_requirements: *70225844794040
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: vcr
72
- requirement: &70199534275880 !ruby/object:Gem::Requirement
72
+ requirement: &70225844793620 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,7 +77,7 @@ dependencies:
77
77
  version: '0'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *70199534275880
80
+ version_requirements: *70225844793620
81
81
  description: Send image/video to an airplay enabled device
82
82
  email:
83
83
  - yo@brunoaguirre.com
@@ -86,6 +86,7 @@ extensions: []
86
86
  extra_rdoc_files: []
87
87
  files:
88
88
  - .gitignore
89
+ - .travis.yml
89
90
  - Gemfile
90
91
  - README.md
91
92
  - Rakefile
@@ -102,9 +103,12 @@ files:
102
103
  - test/authentication.rb
103
104
  - test/discovery.rb
104
105
  - test/fixtures/cassettes/airplay/authenticate_all_the_things_.yml
106
+ - test/fixtures/cassettes/airplay/control_a_video_being_played_in_apple_tv.yml
105
107
  - test/fixtures/cassettes/airplay/get_current_scrub_from_apple_tv.yml
108
+ - test/fixtures/cassettes/airplay/go_to_a_given_position_in_the_video.yml
106
109
  - test/fixtures/cassettes/airplay/send_audio_to_apple_tv.yml
107
110
  - test/fixtures/cassettes/airplay/send_image_to_apple_tv.yml
111
+ - test/fixtures/cassettes/airplay/send_image_to_apple_tv_with_effects.yml
108
112
  - test/fixtures/cassettes/airplay/send_video_to_apple_tv.yml
109
113
  - test/fixtures/image.gif
110
114
  - test/fixtures/image2.gif