diff --git a/lib/main.js b/lib/main.js
index c6e5c78..f56f9f7 100644
--- a/lib/main.js
+++ b/lib/main.js
@@ -11,25 +11,21 @@ flags.defineBoolean('diagnostics', false, 'run diagnostics utility');
flags.defineBoolean('version', false, 'return version number');
flags.defineInteger('timeout', 5, 'disconnect timeout (in seconds)');
flags.defineBoolean('verbose', false, 'show verbose output');
+flags.defineStringList('devices', [], 'a comma separated list of IP[:port] values where Sonos devices can be found, disables discovery');
flags.parse();
-if (flags.get('version')) {
+var setupSonos = function(device, model) {
- var pjson = require('../package.json');
- console.log(pjson.version);
-
-} else if (flags.get('diagnostics')) {
+ if (model === 'BR100' || model === 'ANVIL') return; // ignore Sonos Bridge and Sub device
- var diag = require('./diagnostics');
- diag();
-
-} else {
-
- console.log('Searching for Sonos devices on network...');
- sonos.search(function(device, model) {
-
- if (model === 'BR100' || model === 'ANVIL') return; // ignore Sonos Bridge and Sub device
+ // set up a domain to catch errors from setting up individual
+ // devices.
+ var setupDomain = require('domain').create();
+ setupDomain.on('error', function(err) {
+ console.error('Error setting up AirSonos for {' + device.host + ':' + device.port + '}: ' + err);
+ });
+ setupDomain.run(function() {
device.getZoneAttrs(function(err, zoneAttrs) {
if (err) throw err;
@@ -86,13 +82,13 @@ if (flags.get('version')) {
device.play({
uri: 'x-rincon-mp3radio://' + ip.address() + ':' + port + '/listen.m3u',
metadata: '' +
- '' +
- '- ' +
- '' + clientName + '' +
- 'object.item.audioItem.audioBroadcast' +
- 'SA_RINCON65031_' +
- '
' +
- ''
+ '' +
+ '- ' +
+ '' + clientName + '' +
+ 'object.item.audioItem.audioBroadcast' +
+ 'SA_RINCON65031_' +
+ '
' +
+ ''
});
});
@@ -112,6 +108,41 @@ if (flags.get('version')) {
airplayServer.start();
});
-
});
+};
+
+if (flags.get('version')) {
+
+ var pjson = require('../package.json');
+ console.log(pjson.version);
+
+} else if (flags.get('diagnostics')) {
+
+ var diag = require('./diagnostics');
+ diag();
+
+} else if (flags.get('devices').length > 0) {
+
+ var deviceArguments = flags.get('devices');
+ for(var i = 0; i < deviceArguments.length; i++) {
+
+ var deviceArg = deviceArguments[i];
+
+ var sonosDevice;
+
+ // Check if the argument contains a port specifier
+ var ipPortSplit = deviceArg.split(':');
+ if (ipPortSplit.length > 1) {
+ sonosDevice = new sonos.Sonos(ipPortSplit[0], ipPortSplit[1]);
+ } else {
+ sonosDevice = new sonos.Sonos(deviceArg);
+ }
+
+ setupSonos(sonosDevice, 'Sonos' + i);
+ }
+
+} else {
+
+ console.log('Searching for Sonos devices on network...');
+ sonos.search(setupSonos);
}
diff --git a/package.json b/package.json
index 7023e95..498d770 100644
--- a/package.json
+++ b/package.json
@@ -7,6 +7,9 @@
{
"name": "Stephen Wan",
"email": "stephen@stephenwan.net"
+ },
+ {
+ "name": "@iona5 (GitHub)"
}
],
"scripts": {