airplayer
Version:
Query your local network for Apple TV's and have them play videos
77 lines (60 loc) • 1.81 kB
JavaScript
var util = require('util')
var fs = require('fs')
var http = require('http')
var menu = require('appendable-cli-menu')
var mime = require('mime')
var rangeParser = require('range-parser')
var ip = require('internal-ip').v4()
var enableDestroy = require('server-destroy')
var airplayer = require('./')()
var argv = require('minimist')(process.argv.slice(2))
var filename = argv._[0]
var interactive = argv.i
if (!filename) {
usage()
process.exit(1)
}
var contentType = mime.lookup(filename)
if (interactive) {
var tvs = menu('Chose an Apple TV', play)
}
airplayer.on('update', onTv)
function onTv (player) {
if (interactive) tvs.add(player)
else play(player)
}
function play (player) {
airplayer.destroy()
var server = http.createServer(function (req, res) {
var stat = fs.statSync(filename)
var size = stat.size
var range = req.headers.range
range = range && rangeParser(size, range)[0]
res.writeHead(206, {
'Access-Control-Allow-Origin': '*',
'Accept-Ranges': 'bytes',
'Content-Length': (range.end - range.start + 1),
'Content-Type': contentType,
'Content-Range': util.format('bytes %d-%d/%d', range.start, range.end, size)
})
fs.createReadStream(filename, range).pipe(res)
})
server.listen(function () {
var port = server.address().port
player.on('event', function (event) {
if (event.state === 'stopped') server.destroy()
})
player.play('http://' + ip + ':' + port + '/stream.m4v', function (err, res, body) {
if (err) throw err
})
})
enableDestroy(server)
}
function usage () {
console.error('Usage: airplayer filename [options]')
console.error('')
console.error('Options:')
console.error(' -i show available AirPlay devices\n')
}