sonos 0.2.1 → 0.3.0
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 +4 -0
- data/Changelog.markdown +7 -0
- data/Gemfile +11 -1
- data/Rakefile +7 -0
- data/Readme.markdown +25 -13
- data/lib/sonos/cli.rb +21 -10
- data/lib/sonos/device/base.rb +79 -0
- data/lib/sonos/device/bridge.rb +17 -0
- data/lib/sonos/device/speaker.rb +25 -0
- data/lib/sonos/device.rb +8 -0
- data/lib/sonos/discovery.rb +18 -5
- data/lib/sonos/endpoint/{transport.rb → a_v_transport.rb} +34 -13
- data/lib/sonos/endpoint/rendering.rb +2 -0
- data/lib/sonos/endpoint.rb +1 -1
- data/lib/sonos/group.rb +48 -0
- data/lib/sonos/system.rb +59 -0
- data/lib/sonos/topology_node.rb +21 -0
- data/lib/sonos/version.rb +1 -1
- data/lib/sonos.rb +12 -7
- data/sonos.gemspec +2 -0
- data/test/cassettes/topology.yml +840 -0
- data/test/support/discovery_macros.rb +7 -0
- data/test/support/vcr.rb +4 -0
- data/test/test_helper.rb +15 -0
- data/test/units/system_test.rb +21 -0
- metadata +26 -12
- data/lib/sonos/speaker.rb +0 -44
- data/lib/sonos/topology.rb +0 -35
data/test/support/vcr.rb
ADDED
data/test/test_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.require :test
|
4
|
+
require 'minitest/autorun'
|
5
|
+
require 'mocha/setup'
|
6
|
+
require 'sonos'
|
7
|
+
|
8
|
+
# Support files
|
9
|
+
Dir["#{File.expand_path(File.dirname(__FILE__))}/support/*.rb"].each do |file|
|
10
|
+
require file
|
11
|
+
end
|
12
|
+
|
13
|
+
class SonosTest < MiniTest::Unit::TestCase
|
14
|
+
include DiscoveryMacros
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SystemTest < SonosTest
|
4
|
+
def before_suites
|
5
|
+
super
|
6
|
+
stub_discovery
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_singleton
|
10
|
+
VCR.use_cassette('topology', match_requests_on: [:path]) do
|
11
|
+
assert_equal Sonos.system.object_id, Sonos.system.object_id
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_group_detection
|
16
|
+
VCR.use_cassette('topology', match_requests_on: [:path]) do
|
17
|
+
system = Sonos.system
|
18
|
+
assert_equal 1, system.groups.length
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sonos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2013-02-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: savon
|
@@ -70,6 +70,7 @@ extensions: []
|
|
70
70
|
extra_rdoc_files: []
|
71
71
|
files:
|
72
72
|
- .gitignore
|
73
|
+
- .travis.yml
|
73
74
|
- Changelog.markdown
|
74
75
|
- Gemfile
|
75
76
|
- LICENSE
|
@@ -78,18 +79,29 @@ files:
|
|
78
79
|
- bin/sonos
|
79
80
|
- lib/sonos.rb
|
80
81
|
- lib/sonos/cli.rb
|
82
|
+
- lib/sonos/device.rb
|
83
|
+
- lib/sonos/device/base.rb
|
84
|
+
- lib/sonos/device/bridge.rb
|
85
|
+
- lib/sonos/device/speaker.rb
|
81
86
|
- lib/sonos/discovery.rb
|
82
87
|
- lib/sonos/endpoint.rb
|
88
|
+
- lib/sonos/endpoint/a_v_transport.rb
|
83
89
|
- lib/sonos/endpoint/content_directory.rb
|
84
90
|
- lib/sonos/endpoint/device.rb
|
85
91
|
- lib/sonos/endpoint/rendering.rb
|
86
|
-
- lib/sonos/
|
87
|
-
- lib/sonos/
|
88
|
-
- lib/sonos/
|
92
|
+
- lib/sonos/group.rb
|
93
|
+
- lib/sonos/system.rb
|
94
|
+
- lib/sonos/topology_node.rb
|
89
95
|
- lib/sonos/version.rb
|
90
96
|
- sonos.gemspec
|
97
|
+
- test/cassettes/topology.yml
|
98
|
+
- test/support/discovery_macros.rb
|
99
|
+
- test/support/vcr.rb
|
100
|
+
- test/test_helper.rb
|
101
|
+
- test/units/system_test.rb
|
91
102
|
homepage: https://github.com/soffes/sonos
|
92
|
-
licenses:
|
103
|
+
licenses:
|
104
|
+
- MIT
|
93
105
|
post_install_message:
|
94
106
|
rdoc_options: []
|
95
107
|
require_paths:
|
@@ -99,10 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
111
|
requirements:
|
100
112
|
- - ! '>='
|
101
113
|
- !ruby/object:Gem::Version
|
102
|
-
version:
|
103
|
-
segments:
|
104
|
-
- 0
|
105
|
-
hash: -2990383853655204370
|
114
|
+
version: 1.9.2
|
106
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
116
|
none: false
|
108
117
|
requirements:
|
@@ -111,12 +120,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
120
|
version: '0'
|
112
121
|
segments:
|
113
122
|
- 0
|
114
|
-
hash: -
|
123
|
+
hash: -1378351241916050478
|
115
124
|
requirements: []
|
116
125
|
rubyforge_project:
|
117
126
|
rubygems_version: 1.8.23
|
118
127
|
signing_key:
|
119
128
|
specification_version: 3
|
120
129
|
summary: Control Sonos speakers with Ruby
|
121
|
-
test_files:
|
130
|
+
test_files:
|
131
|
+
- test/cassettes/topology.yml
|
132
|
+
- test/support/discovery_macros.rb
|
133
|
+
- test/support/vcr.rb
|
134
|
+
- test/test_helper.rb
|
135
|
+
- test/units/system_test.rb
|
122
136
|
has_rdoc:
|
data/lib/sonos/speaker.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'savon'
|
2
|
-
require 'open-uri'
|
3
|
-
require 'sonos/endpoint'
|
4
|
-
require 'sonos/topology'
|
5
|
-
|
6
|
-
module Sonos
|
7
|
-
class Speaker
|
8
|
-
include Endpoint::Transport
|
9
|
-
include Endpoint::Rendering
|
10
|
-
include Endpoint::Device
|
11
|
-
include Endpoint::ContentDirectory
|
12
|
-
include Topology
|
13
|
-
|
14
|
-
attr_reader :ip, :zone_name, :zone_icon, :uid, :serial_number, :software_version, :hardware_version, :mac_address
|
15
|
-
|
16
|
-
def initialize(ip)
|
17
|
-
@ip = ip
|
18
|
-
|
19
|
-
# Get the speaker's status
|
20
|
-
get_status
|
21
|
-
end
|
22
|
-
|
23
|
-
# URL for giant dump of device information
|
24
|
-
def device_description_url
|
25
|
-
"http://#{self.ip}:#{PORT}/xml/device_description.xml"
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
# Get information about the speaker.
|
31
|
-
def get_status
|
32
|
-
doc = Nokogiri::XML(open("http://#{@ip}:#{PORT}/status/zp"))
|
33
|
-
|
34
|
-
@zone_name = doc.xpath('.//ZoneName').inner_text
|
35
|
-
@zone_icon = doc.xpath('.//ZoneIcon').inner_text
|
36
|
-
@uid = doc.xpath('.//LocalUID').inner_text
|
37
|
-
@serial_number = doc.xpath('.//SerialNumber').inner_text
|
38
|
-
@software_version = doc.xpath('.//SoftwareVersion').inner_text
|
39
|
-
@hardware_version = doc.xpath('.//HardwareVersion').inner_text
|
40
|
-
@mac_address = doc.xpath('.//MACAddress').inner_text
|
41
|
-
self
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/lib/sonos/topology.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
|
3
|
-
module Sonos
|
4
|
-
module Topology
|
5
|
-
def topology
|
6
|
-
doc = Nokogiri::XML(open("http://#{@ip}:#{PORT}/status/topology"))
|
7
|
-
|
8
|
-
doc.xpath('//ZonePlayers/ZonePlayer').map do |node|
|
9
|
-
Node.new(node)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
protected
|
14
|
-
|
15
|
-
class Node
|
16
|
-
attr_accessor :name, :group, :coordinator, :location, :version, :uuid
|
17
|
-
|
18
|
-
def initialize(node)
|
19
|
-
node.attributes.each do |k, v|
|
20
|
-
self.send("#{k}=", v) if self.respond_to?(k.to_sym)
|
21
|
-
end
|
22
|
-
|
23
|
-
self.name = node.inner_text
|
24
|
-
end
|
25
|
-
|
26
|
-
def ip
|
27
|
-
@ip ||= URI.parse(location).host
|
28
|
-
end
|
29
|
-
|
30
|
-
def speaker
|
31
|
-
@speaker || Sonos::Speaker.new(ip)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|