Use airplayer (#452)

* Use airplayer

* Mock AirPlay volume support

* Add AirPlay event support
This commit is contained in:
Thomas Watson Steen
2016-05-28 19:50:30 +02:00
committed by DC
parent 501a07c386
commit 13f1ecdbe3
2 changed files with 43 additions and 20 deletions

View File

@@ -14,7 +14,7 @@
"url": "https://github.com/feross/webtorrent-desktop/issues"
},
"dependencies": {
"airplay-js": "guerrerocarlos/node-airplay-js",
"airplayer": "^2.0.0",
"application-config": "^0.2.1",
"bitfield": "^1.0.2",
"chromecasts": "^1.8.0",

View File

@@ -12,7 +12,7 @@ module.exports = {
setRate
}
var airplay = require('airplay-js')
var airplayer = require('airplayer')()
var chromecasts = require('chromecasts')()
var dlnacasts = require('dlnacasts')()
@@ -41,10 +41,9 @@ function init (appState, callback) {
state.devices.dlna = dlnaPlayer(player)
})
var browser = airplay.createBrowser()
browser.on('deviceOn', function (player) {
airplayer.on('update', function (player) {
state.devices.airplay = airplayPlayer(player)
}).start()
})
}
// chromecast player implementation
@@ -129,13 +128,31 @@ function chromecastPlayer (player) {
// airplay player implementation
function airplayPlayer (player) {
function addEvents () {
player.on('event', function (event) {
switch (event.state) {
case 'loading':
break
case 'playing':
state.playing.isPaused = false
break
case 'paused':
state.playing.isPaused = true
break
case 'stopped':
break
}
update()
})
}
function open () {
player.play(state.server.networkURL, 0, function (res) {
if (res.statusCode !== 200) {
player.play(state.server.networkURL, function (err, res) {
if (err) {
state.playing.location = 'local'
state.errors.push({
time: new Date().getTime(),
message: 'Could not connect to AirPlay.'
message: 'Could not connect to AirPlay. ' + err.message
})
} else {
state.playing.location = 'airplay'
@@ -145,11 +162,11 @@ function airplayPlayer (player) {
}
function play (callback) {
player.rate(1, callback)
player.resume(callback)
}
function pause (callback) {
player.rate(0, callback)
player.pause(callback)
}
function stop (callback) {
@@ -157,13 +174,18 @@ function airplayPlayer (player) {
}
function status () {
player.status(function (status) {
state.playing.isPaused = status.rate === 0
state.playing.currentTime = status.position
// TODO: get airplay volume, implementation needed. meanwhile set value in setVolume
// According to docs is in [-30 - 0] (db) range
// should be converted to [0 - 1] using (val / 30 + 1)
update()
player.playbackInfo(function (err, res, status) {
if (err) {
state.playing.location = 'local'
state.errors.push({
time: new Date().getTime(),
message: 'Could not connect to AirPlay. ' + err.message
})
} else {
state.playing.isPaused = status.rate === 0
state.playing.currentTime = status.position
update()
}
})
}
@@ -172,12 +194,13 @@ function airplayPlayer (player) {
}
function volume (volume, callback) {
// TODO remove line below once we can fetch the information in status update
// AirPlay doesn't support volume
// TODO: We should just disable the volume slider
state.playing.volume = volume
volume = (volume - 1) * 30
player.volume(volume, callback)
}
addEvents()
return {
player: player,
open: open,