Skip to content

Commit

Permalink
Add support for subtitles on Chromecast
Browse files Browse the repository at this point in the history
  • Loading branch information
janza committed Apr 27, 2017
1 parent a82498b commit 171c1ab
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 15 deletions.
62 changes: 48 additions & 14 deletions src/renderer/lib/cast.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ module.exports = {
setRate
}

const http = require('http')

const config = require('../../config')
const {CastingError} = require('./errors')

Expand Down Expand Up @@ -130,22 +132,51 @@ function chromecastPlayer () {
})
}

function serveSubtitles (cb) {
const subtitles = state.playing.subtitles
const selectedSubtitle = subtitles.tracks[subtitles.selectedIndex]
if (!selectedSubtitle) {
cb()
} else {
ret.subServer = http.createServer((req, res) => {
if (!selectedSubtitle) {
res.writeHead(400, {'Content-Type': 'text/html'})
return res.end('No subtitles selected')
}
res.writeHead(200, {
'Content-Type': 'text/vtt;charset=utf-8',
'Access-Control-Allow-Origin': '*',
'Transfer-Encoding': 'chunked'
})
res.end(Buffer.from(selectedSubtitle.buffer.substr(21), 'base64'))
}).listen(0, function () {
const port = ret.subServer.address().port
const subtitlesUrl = 'http://' + state.server.networkAddress + ':' + port + '/'
cb(subtitlesUrl)
})
}
}

function open () {
const torrentSummary = state.saved.torrents.find((x) => x.infoHash === state.playing.infoHash)
ret.device.play(state.server.networkURL + '/' + state.playing.fileIndex, {
type: 'video/mp4',
title: config.APP_NAME + ' - ' + torrentSummary.name
}, function (err) {
if (err) {
state.playing.location = 'local'
state.errors.push({
time: new Date().getTime(),
message: 'Could not connect to Chromecast. ' + err.message
})
} else {
state.playing.location = 'chromecast'
}
update()
serveSubtitles(function (subtitles) {
ret.device.play(state.server.networkURL + '/' + state.playing.fileIndex, {
type: 'video/mp4',
title: config.APP_NAME + ' - ' + torrentSummary.name,
subtitles: subtitles ? [subtitles] : [],
autoSubtitles: !!subtitles
}, function (err) {
if (err) {
state.playing.location = 'local'
state.errors.push({
time: new Date().getTime(),
message: 'Could not connect to Chromecast. ' + err.message
})
} else {
state.playing.location = 'chromecast'
}
update()
})
})
}

Expand All @@ -159,6 +190,9 @@ function chromecastPlayer () {

function stop (callback) {
ret.device.stop(callback)
if (ret.subServer) {
ret.subServer.close()
}
}

function status () {
Expand Down
3 changes: 2 additions & 1 deletion src/renderer/webtorrent.js
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,8 @@ function startServerFromReadyTorrent (torrent, cb) {
const info = {
torrentKey: torrent.key,
localURL: 'http://localhost' + urlSuffix,
networkURL: 'http://' + networkAddress() + urlSuffix
networkURL: 'http://' + networkAddress() + urlSuffix,
networkAddress: networkAddress()
}

ipc.send('wt-server-running', info)
Expand Down

0 comments on commit 171c1ab

Please sign in to comment.