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": {