airplay 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,16 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- airplay (1.0.0)
4
+ airplay (1.0.1)
5
5
  CFPropertyList (~> 2.2.0)
6
6
  celluloid (~> 0.15.0)
7
7
  cuba (~> 3.1.0)
8
8
  dnssd (~> 2.0)
9
9
  log4r (~> 1.1.10)
10
10
  micromachine (~> 1.0.4)
11
+ mime-types (~> 2.0)
11
12
  net-http-digest_auth (~> 1.2.1)
12
- net-ptth (= 0.0.13)
13
- uuid (~> 2.3.6)
13
+ net-ptth (= 0.0.16)
14
+ reel-rack (~> 0.1.0)
14
15
 
15
16
  GEM
16
17
  remote: http://rubygems.org/
@@ -32,25 +33,40 @@ GEM
32
33
  debugger-ruby_core_source (1.2.3)
33
34
  dnssd (2.0)
34
35
  fakeweb (1.3.0)
35
- http_parser.rb (0.5.3)
36
+ given_core (3.0.0)
37
+ sorcerer (>= 0.3.7)
38
+ http (0.5.0)
39
+ http_parser.rb
40
+ http_parser.rb (0.6.0.beta.2)
36
41
  log4r (1.1.10)
37
- macaddr (1.6.1)
38
- systemu (~> 2.5.0)
39
42
  micromachine (1.0.4)
43
+ mime-types (2.0)
40
44
  minitest (4.4.0)
45
+ minitest-given (3.0.0)
46
+ given_core (= 3.0.0)
47
+ minitest (> 4.3)
41
48
  net-http-digest_auth (1.2.1)
42
- net-ptth (0.0.13)
49
+ net-ptth (0.0.16)
43
50
  celluloid-io (~> 0.15.0)
44
- http_parser.rb (~> 0.5.3)
51
+ http_parser.rb (~> 0.6.0.beta.2)
45
52
  rack (~> 1.5.2)
46
53
  nio4r (0.5.0)
47
54
  rack (1.5.2)
48
55
  rake (10.1.0)
49
- systemu (2.5.2)
56
+ reel (0.4.0)
57
+ celluloid (>= 0.15.1)
58
+ celluloid-io (>= 0.15.0)
59
+ http (>= 0.5.0)
60
+ http_parser.rb (>= 0.6.0.beta.2)
61
+ websocket_parser (>= 0.1.4)
62
+ reel-rack (0.1.0)
63
+ rack (>= 1.4.0)
64
+ reel (>= 0.4.0)
65
+ sorcerer (1.0.2)
50
66
  timers (1.1.0)
51
- uuid (2.3.7)
52
- macaddr (~> 1.0)
53
67
  vcr (2.4.0)
68
+ websocket_parser (0.1.4)
69
+ http
54
70
 
55
71
  PLATFORMS
56
72
  ruby
@@ -60,5 +76,6 @@ DEPENDENCIES
60
76
  debugger
61
77
  fakeweb (~> 1.3.0)
62
78
  minitest (~> 4.4.0)
79
+ minitest-given (~> 3.0.0)
63
80
  rake
64
81
  vcr (~> 2.4.0)
@@ -4,7 +4,7 @@ require "airplay/cli/version"
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "airplay-cli"
6
6
  s.version = Airplay::CLI::VERSION
7
- s.summary = "Airplay client CLI"
7
+ s.summary = "Airplay CLI"
8
8
  s.description = "Send pics and videos using the terminal"
9
9
  s.executables = "air"
10
10
  s.licenses = ["MIT", "HUGWARE"]
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.homepage = "http://github.com/elcuervo/airplay"
14
14
  s.files = %w(bin/air lib/airplay/cli.rb)
15
15
 
16
- s.add_dependency("airplay", "= 1.0.0")
17
- s.add_dependency("clap", "~> 1.0.0")
18
- s.add_dependency("ruby-progressbar", "~> 1.2.0")
16
+ s.add_dependency("airplay", "= 1.0.1")
17
+ s.add_dependency("clap", "~> 1.0.0")
18
+ s.add_dependency("ruby-progressbar", "~> 1.2.0")
19
19
  end
@@ -14,16 +14,18 @@ Gem::Specification.new do |s|
14
14
  s.test_files = `git ls-files test`.split("\n")
15
15
 
16
16
  s.add_dependency("dnssd", "~> 2.0")
17
- s.add_dependency("uuid", "~> 2.3.6")
18
17
  s.add_dependency("CFPropertyList", "~> 2.2.0")
18
+ s.add_dependency("mime-types", "~> 2.0")
19
19
  s.add_dependency("log4r", "~> 1.1.10")
20
20
  s.add_dependency("cuba", "~> 3.1.0")
21
21
  s.add_dependency("micromachine", "~> 1.0.4")
22
22
  s.add_dependency("celluloid", "~> 0.15.0")
23
- s.add_dependency("net-ptth", "= 0.0.13")
23
+ s.add_dependency("reel-rack", "~> 0.1.0")
24
+ s.add_dependency("net-ptth", "= 0.0.16")
24
25
  s.add_dependency("net-http-digest_auth", "~> 1.2.1")
25
26
 
26
- s.add_development_dependency("minitest", "~> 4.4.0")
27
- s.add_development_dependency("fakeweb", "~> 1.3.0")
28
- s.add_development_dependency("vcr", "~> 2.4.0")
27
+ s.add_development_dependency("minitest", "~> 4.4.0")
28
+ s.add_development_dependency("minitest-given", "~> 3.0.0")
29
+ s.add_development_dependency("fakeweb", "~> 1.3.0")
30
+ s.add_development_dependency("vcr", "~> 2.4.0")
29
31
  end
data/bin/air CHANGED
@@ -10,9 +10,11 @@ begin
10
10
  "--wait" => lambda { |sec| @wait = sec.to_i },
11
11
  "--interactive" => lambda { @interactive = true },
12
12
 
13
+ "help" => Airplay::CLI.method(:help),
14
+
13
15
  "list" => Airplay::CLI.method(:list),
14
16
 
15
- "version" => lambda { puts Airplay::CLI::VERSION },
17
+ "version" => Airplay::CLI.method(:version),
16
18
 
17
19
  "play" => lambda { |video|
18
20
  options = { device: @device || Airplay.devices.first }
@@ -28,6 +30,8 @@ begin
28
30
  Airplay::CLI.view(file, options)
29
31
  }
30
32
 
33
+ Airplay::CLI.help if ARGV.empty?
34
+
31
35
  rescue Airplay::Browser::NoDevicesFound
32
36
  puts "No devices found."
33
37
  rescue Interrupt
@@ -49,17 +49,65 @@ module Airplay
49
49
  # Returns if there are more nodes coming
50
50
  #
51
51
  def node_resolver(node, resolved)
52
- info = Socket.getaddrinfo(resolved.target, nil, Socket::AF_INET)
53
- ip = info[0][2]
52
+ address = get_device_address(resolved)
53
+ type = get_type(resolved.text_record)
54
54
 
55
- airplay_device = Device.new(
56
- name: node.name.gsub(/\u00a0/, ' '),
57
- address: "#{ip}:#{resolved.port}",
58
- )
55
+ add_device(node.name, address, type)
56
+ resolved.flags.more_coming?
57
+ end
59
58
 
60
- devices << airplay_device
59
+ # Private: Gets the device type
60
+ #
61
+ # records - The text records hash to be investigated
62
+ #
63
+ # Returns a symbol with the type
64
+ #
65
+ def get_type(records)
66
+ # rhd means Remote HD the first product of the Airserver people
67
+ if records.has_key?("rhd")
68
+ :airserver
69
+ else
70
+ :apple_tv
71
+ end
72
+ end
61
73
 
62
- resolved.flags.more_coming?
74
+ # Private: Resolves the node complete address
75
+ #
76
+ # resolved - The DNS Resolved object
77
+ #
78
+ # Returns a string with the address (host:ip)
79
+ #
80
+ def get_device_address(resolved)
81
+ host = get_device_host(resolved.target)
82
+ "#{host}:#{resolved.port}"
83
+ end
84
+
85
+ # Private: Resolves the node ip or hostname
86
+ #
87
+ # resolved - The DNS Resolved object
88
+ #
89
+ # Returns a string with the ip or the hostname
90
+ #
91
+ def get_device_host(target)
92
+ info = Socket.getaddrinfo(target, nil, Socket::AF_INET)
93
+ info[0][2]
94
+ rescue SocketError
95
+ target
96
+ end
97
+
98
+ # Private: Creates and adds a device to the pool
99
+ #
100
+ # name - The device name
101
+ # address - The device address
102
+ #
103
+ # Returns nothing
104
+ #
105
+ def add_device(name, address, type)
106
+ devices << Device.new(
107
+ name: name.gsub(/\u00a0/, ' '),
108
+ address: address,
109
+ type: type
110
+ )
63
111
  end
64
112
 
65
113
  # Private: Resolves the node information given a node
@@ -9,6 +9,35 @@ module Airplay
9
9
  #
10
10
  module CLI
11
11
  class << self
12
+ # Public: Shows CLI help
13
+ #
14
+ # Returns nothing.
15
+ #
16
+ def help
17
+ Airplay.configuration.load
18
+ puts <<-EOS.gsub!(" "*10, "")
19
+ Usage: air [OPTIONS] ACTION [URL OR PATH]
20
+
21
+ Command line for the apple tv.
22
+ Example: air play my_video.mov
23
+
24
+ Actions:
25
+
26
+ list - Lists the available devices in the network.
27
+ help - This help.
28
+ version - The current airplay-cli version.
29
+ play - Plays a local or remote video.
30
+ view - Shows an image or a folder of images, can be an url.
31
+
32
+ Options:
33
+
34
+ --device - Name of the device where it should be played (Default: The first one)
35
+ --wait - The wait time for playing an slideshow (Default: 3)
36
+ --interactive - Control the slideshow using left and right arrows.
37
+
38
+ EOS
39
+ end
40
+
12
41
  # Public: Lists all the devices to STDOUT
13
42
  #
14
43
  # Returns nothing.
@@ -18,6 +47,7 @@ module Airplay
18
47
  puts <<-EOS.gsub(/^\s{12}/,'')
19
48
  * #{device.name} (#{device.info.model} running #{device.info.os_version})
20
49
  ip: #{device.ip}
50
+ type: #{device.type}
21
51
  resolution: #{device.info.resolution}
22
52
 
23
53
  EOS
@@ -76,6 +106,42 @@ module Airplay
76
106
  end
77
107
  end
78
108
 
109
+ # Public: Shows the current CLI version
110
+ #
111
+ # Returns nothing
112
+ #
113
+ def version
114
+ Airplay.configuration.load
115
+ v = Airplay::CLI::VERSION
116
+ puts <<-EOS
117
+
118
+ i@@@@@@@@@@@@@@@@@@@@@@@@@
119
+ i80000000000000000000000000000
120
+ i80000000000000000000000000000000G
121
+ i8000000000000000000000000000000000000
122
+ i80000000000000000000000000000000000000000
123
+ @00000 @0000000000000000000000000000000000000@ 000000@
124
+ @0000008 @000000000000000000000000000000000@ 80000000@
125
+ @001 @00000000000000000000000000000@ 100@
126
+ @001 @0000000000000000000000000@ 100@
127
+ @001 80000000000000000000008 t00@
128
+ @001 8000000000000000008 t00@
129
+ @001 800000000000008 t00@
130
+ @001 G000000000G t00@
131
+ @001 G00000G t00@
132
+ @001 L0L t00@
133
+ @001 t00@
134
+ @001 air t00@
135
+ @001 #{v} t00@
136
+ @001 t00@
137
+ @001 t00@
138
+ @001 100@
139
+ @00000000000000000000000000000000000000000000000000000G000@
140
+ @000000000000000000000000000000000000000000000000000000000@
141
+
142
+ EOS
143
+ end
144
+
79
145
  end
80
146
  end
81
147
  end
@@ -1,5 +1,5 @@
1
1
  module Airplay
2
2
  module CLI
3
- VERSION = "0.1.0"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -89,7 +89,8 @@ module Airplay
89
89
  def default_headers
90
90
  {
91
91
  "User-Agent" => "MediaControl/1.0",
92
- "X-Apple-Session-Id" => persistent.session
92
+ "X-Apple-Session-ID" => persistent.session,
93
+ "X-Apple-Device-ID" => persistent.mac_address
93
94
  }
94
95
  end
95
96
 
@@ -1,26 +1,25 @@
1
1
  require "net/ptth"
2
- require "uuid"
2
+ require "securerandom"
3
3
 
4
4
  module Airplay
5
5
  # Public: The class that handles all the outgoing basic HTTP connections
6
6
  #
7
7
  class Connection
8
- attr_reader :session
9
-
10
8
  # Public: Class that wraps a persistent connection to point to the airplay
11
9
  # server and other configuration
12
10
  #
13
11
  class Persistent
12
+ attr_reader :session, :mac_address
13
+
14
14
  def initialize(address, options = {})
15
15
  @logger = Airplay::Logger.new("airplay::connection::persistent")
16
16
  @socket = Net::PTTH.new(address, options)
17
17
  @socket.set_debug_output = @logger
18
18
 
19
- @socket.socket
20
- end
19
+ @session = SecureRandom.uuid
20
+ @mac_address = "0x#{SecureRandom.hex(6)}"
21
21
 
22
- def session
23
- @_session ||= UUID.generate
22
+ @socket.socket
24
23
  end
25
24
 
26
25
  def close
@@ -1,3 +1,4 @@
1
+ require "airplay"
1
2
  require "airplay/playable"
2
3
  require "airplay/viewable"
3
4
  require "airplay/device/features"
@@ -7,14 +8,19 @@ module Airplay
7
8
  # Public: Represents an Airplay Node
8
9
  #
9
10
  class Device
10
- attr_reader :name, :address, :password
11
+ MissingAttributes = Class.new(KeyError)
12
+
13
+ attr_reader :name, :address, :type, :password
11
14
 
12
15
  include Playable
13
16
  include Viewable
14
17
 
15
18
  def initialize(attributes = {})
16
- @name = attributes[:name]
17
- @address = attributes[:address]
19
+ validate_attributes(attributes)
20
+
21
+ @name = attributes[:name]
22
+ @address = attributes[:address]
23
+ @type = attributes[:type]
18
24
  @password = attributes[:password]
19
25
 
20
26
  Airplay.configuration.load
@@ -98,6 +104,18 @@ module Airplay
98
104
 
99
105
  private
100
106
 
107
+ # Private: Validates the mandatory attributes for a device
108
+ #
109
+ # attributes - The attributes hash to be validated
110
+ #
111
+ # Returns nothing or raises a MissingAttributes if some key is missing
112
+ #
113
+ def validate_attributes(attributes)
114
+ if !([:name, :address] - attributes.keys).empty?
115
+ raise MissingAttributes.new("A :name and an :address are mandatory")
116
+ end
117
+ end
118
+
101
119
  # Private: Access the basic info of the device
102
120
  #
103
121
  # Returns a hash with the basic information
@@ -121,6 +139,8 @@ module Airplay
121
139
  new_device.address = "#{ip}:7100"
122
140
 
123
141
  response = new_device.connection.get("/stream.xml").response
142
+ return {} if response.status != 200
143
+
124
144
  plist = CFPropertyList::List.new(data: response.body)
125
145
  CFPropertyList.native_types(plist.value)
126
146
  end
@@ -15,7 +15,9 @@ module Airplay
15
15
  end
16
16
 
17
17
  def resolution
18
- @_resolution ||= "#{@device.server_info["width"]}x#{@device.server_info["height"]}"
18
+ @_resolution ||= begin
19
+ "#{@device.server_info["width"]}x#{@device.server_info["height"]}"
20
+ end
19
21
  end
20
22
  end
21
23
  end
@@ -1,22 +1,53 @@
1
+ require "mime/types"
2
+
3
+ require "airplay/server"
4
+
1
5
  module Airplay
2
6
  class Player
3
7
  class Media
4
- attr_reader :url
8
+ attr_reader :file_or_url, :url
9
+
10
+ COMPATIBLE_TYPES = %w(
11
+ application/mp4
12
+ video/mp4
13
+ video/vnd.objectvideo
14
+ video/MP2T
15
+ video/quicktime
16
+ video/mpeg4
17
+ )
5
18
 
6
19
  def initialize(file_or_url)
7
- @url = case true
8
- when File.exists?(file_or_url)
9
- Airplay.server.serve(File.expand_path(file_or_url))
10
- when !!(file_or_url =~ URI::regexp)
11
- file_or_url
12
- else
13
- raise Errno::ENOENT, file_or_url
14
- end
20
+ @file_or_url = file_or_url
21
+ end
22
+
23
+ def url
24
+ @_url ||= case true
25
+ when local?
26
+ Airplay.server.serve(File.expand_path(file_or_url))
27
+ when remote?
28
+ file_or_url
29
+ else
30
+ raise Errno::ENOENT, file_or_url
31
+ end
15
32
  end
16
33
 
17
- def to_s
18
- @url
34
+ def compatible?
35
+ @_compatible ||= begin
36
+ path = File.basename(file_or_url)
37
+ compatibility = MIME::Types.type_for(path).map(&:to_s) & COMPATIBLE_TYPES
38
+ compatibility.any?
39
+ end
19
40
  end
41
+
42
+ def local?
43
+ File.exists?(file_or_url)
44
+ end
45
+
46
+ def remote?
47
+ !!(file_or_url =~ URI::regexp)
48
+ end
49
+
50
+ def to_s; url end
20
51
  end
21
52
  end
22
53
  end
@@ -9,12 +9,16 @@ module Airplay
9
9
  info["duration"]
10
10
  end
11
11
 
12
+ def has_duration?
13
+ !duration.to_f.zero?
14
+ end
15
+
12
16
  def position
13
17
  info["position"]
14
18
  end
15
19
 
16
20
  def percent
17
- return unless position && duration
21
+ return unless position && has_duration?
18
22
  (position * 100 / duration).floor
19
23
  end
20
24
 
@@ -1,6 +1,7 @@
1
1
  require "rack"
2
2
  require "socket"
3
- require "uuid"
3
+ require "celluloid"
4
+ require "reel/rack"
4
5
 
5
6
  require "airplay/logger"
6
7
  require "airplay/server/app"
@@ -13,11 +14,12 @@ module Airplay
13
14
  @port = Airplay.configuration.port
14
15
  @logger = Airplay::Logger.new("airplay::server")
15
16
  @server = Rack::Server.new(
16
- server: :webrick,
17
+ server: :reel,
17
18
  Host: private_ip,
18
19
  Port: @port,
19
20
  Logger: @logger,
20
21
  AccessLog: [],
22
+ quiet: true,
21
23
  app: App.app
22
24
  )
23
25
 
@@ -1,10 +1,11 @@
1
1
  require "cuba"
2
+ require "securerandom"
2
3
 
3
4
  module Airplay
4
5
  class Server
5
6
  class App < Cuba
6
7
  settings[:assets] ||= Hash.new do |h, k|
7
- h[k] = UUID.generate
8
+ h[k] = SecureRandom.uuid
8
9
  end
9
10
 
10
11
  define do
@@ -1,3 +1,3 @@
1
1
  module Airplay
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -0,0 +1,5 @@
1
+ require "bundler/setup"
2
+ require "minitest/spec"
3
+ require "minitest/pride"
4
+ require "minitest/autorun"
5
+ require "minitest/given"
@@ -0,0 +1,28 @@
1
+ require "test_helper"
2
+ require "airplay/configuration"
3
+
4
+ describe Airplay::Configuration do
5
+ Given(:configuration) { Airplay::Configuration.new }
6
+
7
+ context "default configuration" do
8
+ Then { configuration.log_level == 4 }
9
+ Then { configuration.autodiscover == true }
10
+ Then { configuration.host == "0.0.0.0" }
11
+ Then { configuration.port == "1337" }
12
+ Then { configuration.output.respond_to?(:info) }
13
+ end
14
+
15
+ context "changing configuration" do
16
+ When do
17
+ configuration.log_level = 1
18
+ configuration.autodiscover = false
19
+ configuration.host = "200.47.220.245"
20
+ configuration.port = "80"
21
+ end
22
+
23
+ Then { configuration.log_level == 1 }
24
+ And { configuration.autodiscover == false }
25
+ And { configuration.host == "200.47.220.245" }
26
+ And { configuration.port == "80" }
27
+ end
28
+ end
@@ -0,0 +1,12 @@
1
+ require "test_helper"
2
+ require "airplay/device"
3
+
4
+ describe Airplay::Device do
5
+ context "a Device must have at least a name and an address" do
6
+ When(:result) { Airplay::Device.new name: "Test" }
7
+ Then { result == Failure(Airplay::Device::MissingAttributes) }
8
+
9
+ When(:result) { Airplay::Device.new address: "192.168.1.1:80" }
10
+ Then { result == Failure(Airplay::Device::MissingAttributes) }
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ require "test_helper"
2
+ require "airplay/player/media"
3
+
4
+ describe Airplay::Player::Media do
5
+ context "finding if a media is compatible" do
6
+ Given(:media) { Airplay::Player::Media.new("test.mov") }
7
+ When(:compatibility) { media.compatible? }
8
+ Then { compatibility == true }
9
+ end
10
+
11
+ context "finding if a media is not compatible" do
12
+ Given(:media) { Airplay::Player::Media.new("test.psd") }
13
+ When(:compatibility) { media.compatible? }
14
+ Then { compatibility == false }
15
+ end
16
+ 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: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-25 00:00:00.000000000 Z
12
+ date: 2013-11-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dnssd
@@ -28,13 +28,13 @@ dependencies:
28
28
  - !ruby/object:Gem::Version
29
29
  version: '2.0'
30
30
  - !ruby/object:Gem::Dependency
31
- name: uuid
31
+ name: CFPropertyList
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 2.3.6
37
+ version: 2.2.0
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,15 +42,15 @@ dependencies:
42
42
  requirements:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 2.3.6
45
+ version: 2.2.0
46
46
  - !ruby/object:Gem::Dependency
47
- name: CFPropertyList
47
+ name: mime-types
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
51
  - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: 2.2.0
53
+ version: '2.0'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 2.2.0
61
+ version: '2.0'
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: log4r
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -123,6 +123,22 @@ dependencies:
123
123
  - - ~>
124
124
  - !ruby/object:Gem::Version
125
125
  version: 0.15.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: reel-rack
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 0.1.0
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 0.1.0
126
142
  - !ruby/object:Gem::Dependency
127
143
  name: net-ptth
128
144
  requirement: !ruby/object:Gem::Requirement
@@ -130,7 +146,7 @@ dependencies:
130
146
  requirements:
131
147
  - - '='
132
148
  - !ruby/object:Gem::Version
133
- version: 0.0.13
149
+ version: 0.0.16
134
150
  type: :runtime
135
151
  prerelease: false
136
152
  version_requirements: !ruby/object:Gem::Requirement
@@ -138,7 +154,7 @@ dependencies:
138
154
  requirements:
139
155
  - - '='
140
156
  - !ruby/object:Gem::Version
141
- version: 0.0.13
157
+ version: 0.0.16
142
158
  - !ruby/object:Gem::Dependency
143
159
  name: net-http-digest_auth
144
160
  requirement: !ruby/object:Gem::Requirement
@@ -171,6 +187,22 @@ dependencies:
171
187
  - - ~>
172
188
  - !ruby/object:Gem::Version
173
189
  version: 4.4.0
190
+ - !ruby/object:Gem::Dependency
191
+ name: minitest-given
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ~>
196
+ - !ruby/object:Gem::Version
197
+ version: 3.0.0
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ~>
204
+ - !ruby/object:Gem::Version
205
+ version: 3.0.0
174
206
  - !ruby/object:Gem::Dependency
175
207
  name: fakeweb
176
208
  requirement: !ruby/object:Gem::Requirement
@@ -261,6 +293,10 @@ files:
261
293
  - test/fixtures/files/transition_1.png
262
294
  - test/fixtures/files/transition_2.png
263
295
  - test/fixtures/files/transition_3.png
296
+ - test/test_helper.rb
297
+ - test/unit/configuration_test.rb
298
+ - test/unit/device_test.rb
299
+ - test/unit/player/media_test.rb
264
300
  homepage: http://github.com/elcuervo/airplay
265
301
  licenses:
266
302
  - MIT
@@ -293,3 +329,7 @@ test_files:
293
329
  - test/fixtures/files/transition_1.png
294
330
  - test/fixtures/files/transition_2.png
295
331
  - test/fixtures/files/transition_3.png
332
+ - test/test_helper.rb
333
+ - test/unit/configuration_test.rb
334
+ - test/unit/device_test.rb
335
+ - test/unit/player/media_test.rb