airplay 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
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