Compare commits

...

3 Commits

Author SHA1 Message Date
Diego Rodríguez Baquero
1350f3f7cf fixes 2021-10-10 13:58:19 -05:00
Diego Rodríguez Baquero
08a182d165 standard fix 2021-10-10 13:51:38 -05:00
Diego Rodríguez Baquero
63b55df637 fix: modernify code 2021-10-10 13:49:13 -05:00
24 changed files with 134 additions and 161 deletions

View File

@@ -82,7 +82,7 @@ function openTorrentFile () {
const selectedPaths = dialog.showOpenDialogSync(windows.main.win, opts) const selectedPaths = dialog.showOpenDialogSync(windows.main.win, opts)
resetTitle() resetTitle()
if (!Array.isArray(selectedPaths)) return if (!Array.isArray(selectedPaths)) return
selectedPaths.forEach(function (selectedPath) { selectedPaths.forEach(selectedPath => {
windows.main.dispatch('addTorrent', selectedPath) windows.main.dispatch('addTorrent', selectedPath)
}) })
} }

View File

@@ -110,13 +110,13 @@ function init () {
ipc.init() ipc.init()
app.once('ipcReady', function () { app.once('ipcReady', () => {
log('Command line args:', argv) log('Command line args:', argv)
processArgv(argv) processArgv(argv)
console.timeEnd('init') console.timeEnd('init')
}) })
app.on('before-quit', function (e) { app.on('before-quit', e => {
if (app.isQuitting) return if (app.isQuitting) return
app.isQuitting = true app.isQuitting = true
@@ -129,7 +129,7 @@ function init () {
}, 4000) // quit after 4 secs, at most }, 4000) // quit after 4 secs, at most
}) })
app.on('activate', function () { app.on('activate', () => {
if (isReady) windows.main.show() if (isReady) windows.main.show()
}) })
} }
@@ -207,7 +207,7 @@ function sliceArgv (argv) {
function processArgv (argv) { function processArgv (argv) {
const torrentIds = [] const torrentIds = []
argv.forEach(function (arg) { argv.forEach(arg => {
if (arg === '-n' || arg === '-o' || arg === '-u') { if (arg === '-n' || arg === '-o' || arg === '-u') {
// Critical path: Only load the 'dialog' package if it is needed // Critical path: Only load the 'dialog' package if it is needed
const dialog = require('./dialog') const dialog = require('./dialog')

View File

@@ -21,16 +21,16 @@ function setModule (name, module) {
} }
function init () { function init () {
ipcMain.once('ipcReady', function (e) { ipcMain.once('ipcReady', e => {
app.ipcReady = true app.ipcReady = true
app.emit('ipcReady') app.emit('ipcReady')
}) })
ipcMain.once('ipcReadyWebTorrent', function (e) { ipcMain.once('ipcReadyWebTorrent', e => {
app.ipcReadyWebTorrent = true app.ipcReadyWebTorrent = true
log('sending %d queued messages from the main win to the webtorrent window', log('sending %d queued messages from the main win to the webtorrent window',
messageQueueMainToWebTorrent.length) messageQueueMainToWebTorrent.length)
messageQueueMainToWebTorrent.forEach(function (message) { messageQueueMainToWebTorrent.forEach(message => {
windows.webtorrent.send(message.name, ...message.args) windows.webtorrent.send(message.name, ...message.args)
log('webtorrent: sent queued %s', message.name) log('webtorrent: sent queued %s', message.name)
}) })
@@ -66,7 +66,7 @@ function init () {
* Player Events * Player Events
*/ */
ipcMain.on('onPlayerOpen', function () { ipcMain.on('onPlayerOpen', () => {
const powerSaveBlocker = require('./power-save-blocker') const powerSaveBlocker = require('./power-save-blocker')
const shortcuts = require('./shortcuts') const shortcuts = require('./shortcuts')
const thumbar = require('./thumbar') const thumbar = require('./thumbar')
@@ -77,14 +77,14 @@ function init () {
thumbar.enable() thumbar.enable()
}) })
ipcMain.on('onPlayerUpdate', function (e, ...args) { ipcMain.on('onPlayerUpdate', (e, ...args) => {
const thumbar = require('./thumbar') const thumbar = require('./thumbar')
menu.onPlayerUpdate(...args) menu.onPlayerUpdate(...args)
thumbar.onPlayerUpdate(...args) thumbar.onPlayerUpdate(...args)
}) })
ipcMain.on('onPlayerClose', function () { ipcMain.on('onPlayerClose', () => {
const powerSaveBlocker = require('./power-save-blocker') const powerSaveBlocker = require('./power-save-blocker')
const shortcuts = require('./shortcuts') const shortcuts = require('./shortcuts')
const thumbar = require('./thumbar') const thumbar = require('./thumbar')
@@ -95,7 +95,7 @@ function init () {
thumbar.disable() thumbar.disable()
}) })
ipcMain.on('onPlayerPlay', function () { ipcMain.on('onPlayerPlay', () => {
const powerSaveBlocker = require('./power-save-blocker') const powerSaveBlocker = require('./power-save-blocker')
const thumbar = require('./thumbar') const thumbar = require('./thumbar')
@@ -103,7 +103,7 @@ function init () {
thumbar.onPlayerPlay() thumbar.onPlayerPlay()
}) })
ipcMain.on('onPlayerPause', function () { ipcMain.on('onPlayerPause', () => {
const powerSaveBlocker = require('./power-save-blocker') const powerSaveBlocker = require('./power-save-blocker')
const thumbar = require('./thumbar') const thumbar = require('./thumbar')
@@ -115,7 +115,7 @@ function init () {
* Folder Watcher Events * Folder Watcher Events
*/ */
ipcMain.on('startFolderWatcher', function () { ipcMain.on('startFolderWatcher', () => {
if (!modules.folderWatcher) { if (!modules.folderWatcher) {
log('IPC ERR: folderWatcher module is not defined.') log('IPC ERR: folderWatcher module is not defined.')
return return
@@ -124,7 +124,7 @@ function init () {
modules.folderWatcher.start() modules.folderWatcher.start()
}) })
ipcMain.on('stopFolderWatcher', function () { ipcMain.on('stopFolderWatcher', () => {
if (!modules.folderWatcher) { if (!modules.folderWatcher) {
log('IPC ERR: folderWatcher module is not defined.') log('IPC ERR: folderWatcher module is not defined.')
return return
@@ -190,10 +190,10 @@ function init () {
* External Media Player * External Media Player
*/ */
ipcMain.on('checkForExternalPlayer', function (e, path) { ipcMain.on('checkForExternalPlayer', (e, path) => {
const externalPlayer = require('./external-player') const externalPlayer = require('./external-player')
externalPlayer.checkInstall(path, function (err) { externalPlayer.checkInstall(path, err => {
windows.main.send('checkForExternalPlayer', !err) windows.main.send('checkForExternalPlayer', !err)
}) })
}) })
@@ -219,7 +219,7 @@ function init () {
*/ */
const oldEmit = ipcMain.emit const oldEmit = ipcMain.emit
ipcMain.emit = function (name, e, ...args) { ipcMain.emit = (name, e, ...args) => {
// Relay messages between the main window and the WebTorrent hidden window // Relay messages between the main window and the WebTorrent hidden window
if (name.startsWith('wt-') && !app.isQuitting) { if (name.startsWith('wt-') && !app.isQuitting) {
console.dir(e.sender.getTitle()) console.dir(e.sender.getTitle())

View File

@@ -68,11 +68,9 @@ function onToggleFullScreen (flag) {
} }
function getMenuItem (label) { function getMenuItem (label) {
for (let i = 0; i < menu.items.length; i++) { for (const menuItem of menu.items) {
const menuItem = menu.items[i].submenu.items.find(function (item) { const submenuItem = menuItem.submenu.items.find(item => item.label === label)
return item.label === label if (submenuItem) return submenuItem
})
if (menuItem) return menuItem
} }
return {} return {}
} }

View File

@@ -38,5 +38,5 @@ function showItemInFolder (path) {
*/ */
function moveItemToTrash (path) { function moveItemToTrash (path) {
log(`moveItemToTrash: ${path}`) log(`moveItemToTrash: ${path}`)
shell.moveItemToTrash(path) shell.trashItem(path)
} }

View File

@@ -12,7 +12,7 @@ const handlers = require('./handlers')
const EXE_NAME = path.basename(process.execPath) const EXE_NAME = path.basename(process.execPath)
const UPDATE_EXE = path.join(process.execPath, '..', '..', 'Update.exe') const UPDATE_EXE = path.join(process.execPath, '..', '..', 'Update.exe')
const run = function (args, done) { const run = (args, done) => {
spawn(UPDATE_EXE, args, { detached: true }) spawn(UPDATE_EXE, args, { detached: true })
.on('close', done) .on('close', done)
} }

View File

@@ -34,7 +34,7 @@ function setWindowFocus (flag) {
} }
function initLinux () { function initLinux () {
checkLinuxTraySupport(function (err) { checkLinuxTraySupport(err => {
if (!err) createTray() if (!err) createTray()
}) })
} }
@@ -50,7 +50,7 @@ function checkLinuxTraySupport (cb) {
const cp = require('child_process') const cp = require('child_process')
// Check that libappindicator libraries are installed in system. // Check that libappindicator libraries are installed in system.
cp.exec('ldconfig -p | grep libappindicator', function (err, stdout) { cp.exec('ldconfig -p | grep libappindicator', (err, stdout) => {
if (err) return cb(err) if (err) return cb(err)
cb(null) cb(null)
}) })

View File

@@ -37,7 +37,7 @@ function init () {
win.loadURL(config.WINDOW_ABOUT) win.loadURL(config.WINDOW_ABOUT)
win.once('ready-to-show', function () { win.once('ready-to-show', () => {
win.show() win.show()
// No menu on the About window // No menu on the About window
// Hack: BrowserWindow removeMenu method not working on electron@7 // Hack: BrowserWindow removeMenu method not working on electron@7
@@ -45,7 +45,7 @@ function init () {
win.setMenuBarVisibility(false) win.setMenuBarVisibility(false)
}) })
win.once('closed', function () { win.once('closed', () => {
about.win = null about.win = null
}) })
} }

View File

@@ -38,7 +38,7 @@ function init () {
win.loadURL(config.WINDOW_WEBTORRENT) win.loadURL(config.WINDOW_WEBTORRENT)
// Prevent killing the WebTorrent process // Prevent killing the WebTorrent process
win.on('close', function (e) { win.on('close', e => {
if (app.isQuitting) { if (app.isQuitting) {
return return
} }

View File

@@ -23,7 +23,7 @@ module.exports = class MediaController {
telemetry.logPlayAttempt('error') telemetry.logPlayAttempt('error')
state.playing.location = 'error' state.playing.location = 'error'
ipcRenderer.send('checkForExternalPlayer', state.saved.prefs.externalPlayerPath) ipcRenderer.send('checkForExternalPlayer', state.saved.prefs.externalPlayerPath)
ipcRenderer.once('checkForExternalPlayer', function (e, isInstalled) { ipcRenderer.once('checkForExternalPlayer', (e, isInstalled) => {
state.modal = { state.modal = {
id: 'unsupported-media-modal', id: 'unsupported-media-modal',
error, error,
@@ -56,7 +56,7 @@ module.exports = class MediaController {
const state = this.state const state = this.state
state.playing.location = 'external' state.playing.location = 'external'
const onServerRunning = function () { const onServerRunning = () => {
state.playing.isReady = true state.playing.isReady = true
telemetry.logPlayAttempt('external') telemetry.logPlayAttempt('external')

View File

@@ -13,7 +13,7 @@ module.exports = class PrefsController {
const state = this.state const state = this.state
state.location.go({ state.location.go({
url: 'preferences', url: 'preferences',
setup: function (cb) { setup (cb) {
// initialize preferences // initialize preferences
state.window.title = 'Preferences' state.window.title = 'Preferences'
ipcRenderer.send('setAllowNav', false) ipcRenderer.send('setAllowNav', false)

View File

@@ -37,12 +37,11 @@ module.exports = class SubtitlesController {
// Read the files concurrently, then add all resulting subtitle tracks // Read the files concurrently, then add all resulting subtitle tracks
const tasks = files.map((file) => (cb) => loadSubtitle(file, cb)) const tasks = files.map((file) => (cb) => loadSubtitle(file, cb))
parallel(tasks, function (err, tracks) { parallel(tasks, (err, tracks) => {
if (err) return dispatch('error', err) if (err) return dispatch('error', err)
for (let i = 0; i < tracks.length; i++) { // No dupes allowed
// No dupes allowed tracks.forEach((track, i) => {
const track = tracks[i]
let trackIndex = subtitles.tracks.findIndex((t) => let trackIndex = subtitles.tracks.findIndex((t) =>
track.filePath === t.filePath) track.filePath === t.filePath)
@@ -55,7 +54,7 @@ module.exports = class SubtitlesController {
if (autoSelect && (i === 0 || isSystemLanguage(track.language))) { if (autoSelect && (i === 0 || isSystemLanguage(track.language))) {
subtitles.selectedIndex = trackIndex subtitles.selectedIndex = trackIndex
} }
} })
// Finally, make sure no two tracks have the same label // Finally, make sure no two tracks have the same label
relabelSubtitles(subtitles) relabelSubtitles(subtitles)
@@ -94,7 +93,7 @@ function loadSubtitle (file, cb) {
const vttStream = fs.createReadStream(filePath).pipe(srtToVtt()) const vttStream = fs.createReadStream(filePath).pipe(srtToVtt())
concat(vttStream, function (err, buf) { concat(vttStream, (err, buf) => {
if (err) return dispatch('error', 'Can\'t parse subtitles file.') if (err) return dispatch('error', 'Can\'t parse subtitles file.')
// Detect what language the subtitles are in // Detect what language the subtitles are in
@@ -127,7 +126,7 @@ function isSystemLanguage (language) {
// Labels each track by language, eg 'German', 'English', 'English 2', ... // Labels each track by language, eg 'German', 'English', 'English 2', ...
function relabelSubtitles (subtitles) { function relabelSubtitles (subtitles) {
const counts = {} const counts = {}
subtitles.tracks.forEach(function (track) { subtitles.tracks.forEach(track => {
const lang = track.language const lang = track.language
counts[lang] = (counts[lang] || 0) + 1 counts[lang] = (counts[lang] || 0) + 1
track.label = counts[lang] > 1 ? (lang + ' ' + counts[lang]) : lang track.label = counts[lang] > 1 ? (lang + ' ' + counts[lang]) : lang

View File

@@ -177,7 +177,7 @@ function showDoneNotification (torrent) {
silent: true silent: true
}) })
notif.onclick = function () { notif.onclick = () => {
ipcRenderer.send('show') ipcRenderer.send('show')
} }

View File

@@ -94,7 +94,7 @@ module.exports = class TorrentListController {
if (!fileOrFolder) return start() if (!fileOrFolder) return start()
// Existing torrent: check that the path is still there // Existing torrent: check that the path is still there
fs.stat(fileOrFolder, function (err) { fs.stat(fileOrFolder, err => {
if (err) { if (err) {
s.error = 'path-missing' s.error = 'path-missing'
dispatch('backToList') dispatch('backToList')
@@ -156,9 +156,7 @@ module.exports = class TorrentListController {
prioritizeTorrent (infoHash) { prioritizeTorrent (infoHash) {
this.state.saved.torrents this.state.saved.torrents
.filter((torrent) => { // We're interested in active torrents only. .filter(torrent => ['downloading', 'seeding'].includes(torrent.status)) // Active torrents only.
return (['downloading', 'seeding'].indexOf(torrent.status) !== -1)
})
.forEach((torrent) => { // Pause all active torrents except the one that started playing. .forEach((torrent) => { // Pause all active torrents except the one that started playing.
if (infoHash === torrent.infoHash) return if (infoHash === torrent.infoHash) return
@@ -331,9 +329,9 @@ module.exports = class TorrentListController {
if (!savePath) return // They clicked Cancel if (!savePath) return // They clicked Cancel
console.log('Saving torrent ' + torrentKey + ' to ' + savePath) console.log('Saving torrent ' + torrentKey + ' to ' + savePath)
const torrentPath = TorrentSummary.getTorrentPath(torrentSummary) const torrentPath = TorrentSummary.getTorrentPath(torrentSummary)
fs.readFile(torrentPath, function (err, torrentFile) { fs.readFile(torrentPath, (err, torrentFile) => {
if (err) return dispatch('error', err) if (err) return dispatch('error', err)
fs.writeFile(savePath, torrentFile, function (err) { fs.writeFile(savePath, torrentFile, err => {
if (err) return dispatch('error', err) if (err) return dispatch('error', err)
}) })
}) })
@@ -346,8 +344,8 @@ function findFilesRecursive (paths, cb_) {
if (paths.length > 1) { if (paths.length > 1) {
let numComplete = 0 let numComplete = 0
const ret = [] const ret = []
paths.forEach(function (path) { paths.forEach(path => {
findFilesRecursive([path], function (fileObjs) { findFilesRecursive([path], fileObjs => {
ret.push(...fileObjs) ret.push(...fileObjs)
if (++numComplete === paths.length) { if (++numComplete === paths.length) {
ret.sort((a, b) => a.path < b.path ? -1 : Number(a.path > b.path)) ret.sort((a, b) => a.path < b.path ? -1 : Number(a.path > b.path))
@@ -359,7 +357,7 @@ function findFilesRecursive (paths, cb_) {
} }
const fileOrFolder = paths[0] const fileOrFolder = paths[0]
fs.stat(fileOrFolder, function (err, stat) { fs.stat(fileOrFolder, (err, stat) => {
if (err) return dispatch('error', err) if (err) return dispatch('error', err)
// Files: return name, path, and size // Files: return name, path, and size
@@ -374,7 +372,7 @@ function findFilesRecursive (paths, cb_) {
// Folders: recurse, make a list of all the files // Folders: recurse, make a list of all the files
const folderPath = fileOrFolder const folderPath = fileOrFolder
fs.readdir(folderPath, function (err, fileNames) { fs.readdir(folderPath, (err, fileNames) => {
if (err) return dispatch('error', err) if (err) return dispatch('error', err)
const paths = fileNames.map((fileName) => path.join(folderPath, fileName)) const paths = fileNames.map((fileName) => path.join(folderPath, fileName))
findFilesRecursive(paths, cb_) findFilesRecursive(paths, cb_)
@@ -384,7 +382,7 @@ function findFilesRecursive (paths, cb_) {
function deleteFile (path) { function deleteFile (path) {
if (!path) return if (!path) return
fs.unlink(path, function (err) { fs.unlink(path, err => {
if (err) dispatch('error', err) if (err) dispatch('error', err)
}) })
} }

View File

@@ -54,17 +54,17 @@ function init (appState, callback) {
state.devices.airplay = airplayPlayer() state.devices.airplay = airplayPlayer()
// Listen for devices: Chromecast, DLNA and Airplay // Listen for devices: Chromecast, DLNA and Airplay
chromecasts.on('update', function (device) { chromecasts.on('update', device => {
// TODO: how do we tell if there are *no longer* any Chromecasts available? // TODO: how do we tell if there are *no longer* any Chromecasts available?
// From looking at the code, chromecasts.players only grows, never shrinks // From looking at the code, chromecasts.players only grows, never shrinks
state.devices.chromecast.addDevice(device) state.devices.chromecast.addDevice(device)
}) })
dlnacasts.on('update', function (device) { dlnacasts.on('update', device => {
state.devices.dlna.addDevice(device) state.devices.dlna.addDevice(device)
}) })
airplayer.on('update', function (device) { airplayer.on('update', device => {
state.devices.airplay.addDevice(device) state.devices.airplay.addDevice(device)
}) })
} }
@@ -116,7 +116,7 @@ function chromecastPlayer () {
} }
function addDevice (device) { function addDevice (device) {
device.on('error', function (err) { device.on('error', err => {
if (device !== ret.device) return if (device !== ret.device) return
state.playing.location = 'local' state.playing.location = 'local'
state.errors.push({ state.errors.push({
@@ -125,7 +125,7 @@ function chromecastPlayer () {
}) })
update() update()
}) })
device.on('disconnect', function () { device.on('disconnect', () => {
if (device !== ret.device) return if (device !== ret.device) return
state.playing.location = 'local' state.playing.location = 'local'
update() update()
@@ -145,7 +145,7 @@ function chromecastPlayer () {
'Transfer-Encoding': 'chunked' 'Transfer-Encoding': 'chunked'
}) })
res.end(Buffer.from(selectedSubtitle.buffer.substr(21), 'base64')) res.end(Buffer.from(selectedSubtitle.buffer.substr(21), 'base64'))
}).listen(0, function () { }).listen(0, () => {
const port = ret.subServer.address().port const port = ret.subServer.address().port
const subtitlesUrl = 'http://' + state.server.networkAddress + ':' + port + '/' const subtitlesUrl = 'http://' + state.server.networkAddress + ':' + port + '/'
callback(subtitlesUrl) callback(subtitlesUrl)
@@ -155,13 +155,13 @@ function chromecastPlayer () {
function open () { function open () {
const torrentSummary = state.saved.torrents.find((x) => x.infoHash === state.playing.infoHash) const torrentSummary = state.saved.torrents.find((x) => x.infoHash === state.playing.infoHash)
serveSubtitles(function (subtitlesUrl) { serveSubtitles(subtitlesUrl => {
ret.device.play(state.server.networkURL + '/' + state.playing.fileIndex, { ret.device.play(state.server.networkURL + '/' + state.playing.fileIndex, {
type: 'video/mp4', type: 'video/mp4',
title: config.APP_NAME + ' - ' + torrentSummary.name, title: config.APP_NAME + ' - ' + torrentSummary.name,
subtitles: subtitlesUrl ? [subtitlesUrl] : [], subtitles: subtitlesUrl ? [subtitlesUrl] : [],
autoSubtitles: !!subtitlesUrl autoSubtitles: !!subtitlesUrl
}, function (err) { }, err => {
if (err) { if (err) {
state.playing.location = 'local' state.playing.location = 'local'
state.errors.push({ state.errors.push({
@@ -221,7 +221,7 @@ function airplayPlayer () {
return ret return ret
function addDevice (player) { function addDevice (player) {
player.on('event', function (event) { player.on('event', event => {
switch (event.state) { switch (event.state) {
case 'loading': case 'loading':
break break
@@ -243,7 +243,7 @@ function airplayPlayer () {
} }
function open () { function open () {
ret.device.play(state.server.networkURL + '/' + state.playing.fileIndex, function (err, res) { ret.device.play(state.server.networkURL + '/' + state.playing.fileIndex, (err, res) => {
if (err) { if (err) {
state.playing.location = 'local' state.playing.location = 'local'
state.errors.push({ state.errors.push({
@@ -270,7 +270,7 @@ function airplayPlayer () {
} }
function status () { function status () {
ret.device.playbackInfo(function (err, res, status) { ret.device.playbackInfo((err, res, status) => {
if (err) { if (err) {
state.playing.location = 'local' state.playing.location = 'local'
state.errors.push({ state.errors.push({
@@ -317,7 +317,7 @@ function dlnaPlayer (player) {
} }
function addDevice (device) { function addDevice (device) {
device.on('error', function (err) { device.on('error', err => {
if (device !== ret.device) return if (device !== ret.device) return
state.playing.location = 'local' state.playing.location = 'local'
state.errors.push({ state.errors.push({
@@ -326,7 +326,7 @@ function dlnaPlayer (player) {
}) })
update() update()
}) })
device.on('disconnect', function () { device.on('disconnect', () => {
if (device !== ret.device) return if (device !== ret.device) return
state.playing.location = 'local' state.playing.location = 'local'
update() update()
@@ -339,7 +339,7 @@ function dlnaPlayer (player) {
type: 'video/mp4', type: 'video/mp4',
title: config.APP_NAME + ' - ' + torrentSummary.name, title: config.APP_NAME + ' - ' + torrentSummary.name,
seek: state.playing.currentTime > 10 ? state.playing.currentTime : 0 seek: state.playing.currentTime > 10 ? state.playing.currentTime : 0
}, function (err) { }, err => {
if (err) { if (err) {
state.playing.location = 'local' state.playing.location = 'local'
state.errors.push({ state.errors.push({
@@ -374,7 +374,7 @@ function dlnaPlayer (player) {
} }
function volume (volume, callback) { function volume (volume, callback) {
ret.device.volume(volume, function (err) { ret.device.volume(volume, err => {
// quick volume update // quick volume update
state.playing.volume = volume state.playing.volume = volume
callback(err) callback(err)
@@ -396,7 +396,7 @@ function handleStatus (err, status) {
// Start polling cast device state, whenever we're connected // Start polling cast device state, whenever we're connected
function startStatusInterval () { function startStatusInterval () {
statusInterval = setInterval(function () { statusInterval = setInterval(() => {
const player = getPlayer() const player = getPlayer()
if (player) player.status() if (player) player.status()
}, 1000) }, 1000)
@@ -454,7 +454,7 @@ function selectDevice (index) {
function stop () { function stop () {
const player = getPlayer() const player = getPlayer()
if (player) { if (player) {
player.stop(function () { player.stop(() => {
player.device = null player.device = null
stoppedCasting() stoppedCasting()
}) })
@@ -522,6 +522,6 @@ function setVolume (volume) {
if (player) player.volume(volume, castCallback) if (player) player.volume(volume, castCallback)
} }
function castCallback () { function castCallback (...args) {
console.log('%s callback: %o', state.playing.location, arguments) console.log('%s callback: %o', state.playing.location, args)
} }

View File

@@ -5,7 +5,7 @@ module.exports = {
} }
const dispatchers = {} const dispatchers = {}
let _dispatch = function () {} let _dispatch = () => {}
function setDispatch (dispatch) { function setDispatch (dispatch) {
_dispatch = dispatch _dispatch = dispatch
@@ -23,7 +23,7 @@ function dispatcher (...args) {
const str = JSON.stringify(args) const str = JSON.stringify(args)
let handler = dispatchers[str] let handler = dispatchers[str]
if (!handler) { if (!handler) {
handler = dispatchers[str] = function (e) { handler = dispatchers[str] = e => {
// Do not propagate click to elements below the button // Do not propagate click to elements below the button
e.stopPropagation() e.stopPropagation()

View File

@@ -52,7 +52,7 @@ function migrate_0_7_0 (saved) {
const { copyFileSync } = require('fs') const { copyFileSync } = require('fs')
const path = require('path') const path = require('path')
saved.torrents.forEach(function (ts) { saved.torrents.forEach(ts => {
const infoHash = ts.infoHash const infoHash = ts.infoHash
// Replace torrentPath with torrentFileName // Replace torrentPath with torrentFileName
@@ -134,7 +134,7 @@ function migrate_0_12_0 (saved) {
'02767050e0be2fd4db9a2ad6c12416ac806ed6ed.torrent', '02767050e0be2fd4db9a2ad6c12416ac806ed6ed.torrent',
'3ba219a8634bf7bae3d848192b2da75ae995589d.torrent' '3ba219a8634bf7bae3d848192b2da75ae995589d.torrent'
] ]
saved.torrents.forEach(function (torrentSummary) { saved.torrents.forEach(torrentSummary => {
if (!defaultTorrentFiles.includes(torrentSummary.torrentFileName)) return if (!defaultTorrentFiles.includes(torrentSummary.torrentFileName)) return
const fileOrFolder = TorrentSummary.getFileOrFolder(torrentSummary) const fileOrFolder = TorrentSummary.getFileOrFolder(torrentSummary)
if (!fileOrFolder) return if (!fileOrFolder) return
@@ -148,16 +148,16 @@ function migrate_0_12_0 (saved) {
} }
function migrate_0_14_0 (saved) { function migrate_0_14_0 (saved) {
saved.torrents.forEach(function (ts) { saved.torrents.forEach(ts => {
delete ts.defaultPlayFileIndex delete ts.defaultPlayFileIndex
}) })
} }
function migrate_0_17_0 (saved) { function migrate_0_17_0 (saved) {
// Fix a sad, sad bug that resulted in 100MB+ config.json files // Fix a sad, sad bug that resulted in 100MB+ config.json files
saved.torrents.forEach(function (ts) { saved.torrents.forEach(ts => {
if (!ts.files) return if (!ts.files) return
ts.files.forEach(function (file) { ts.files.forEach(file => {
if (!file.audioInfo || !file.audioInfo.picture) return if (!file.audioInfo || !file.audioInfo.picture) return
// This contained a Buffer, which 30x'd in size when serialized to JSON // This contained a Buffer, which 30x'd in size when serialized to JSON
delete file.audioInfo.picture delete file.audioInfo.picture
@@ -179,9 +179,7 @@ function migrate_0_17_2 (saved) {
const OLD_HASH = '3ba219a8634bf7bae3d848192b2da75ae995589d' const OLD_HASH = '3ba219a8634bf7bae3d848192b2da75ae995589d'
const NEW_HASH = 'a88fda5954e89178c372716a6a78b8180ed4dad3' const NEW_HASH = 'a88fda5954e89178c372716a6a78b8180ed4dad3'
const ts = saved.torrents.find((ts) => { const ts = saved.torrents.find(ts => ts.infoHash === OLD_HASH)
return ts.infoHash === OLD_HASH
})
if (!ts) return // Wired CD torrent does not exist if (!ts) return // Wired CD torrent does not exist

View File

@@ -12,13 +12,13 @@ const State = module.exports = Object.assign(new EventEmitter(), {
getDefaultPlayState, getDefaultPlayState,
load, load,
// state.save() calls are rate-limited. Use state.saveImmediate() to skip limit. // state.save() calls are rate-limited. Use state.saveImmediate() to skip limit.
save: function () { save (...args) {
// Perf optimization: Lazy-require debounce (and it's dependencies) // Perf optimization: Lazy-require debounce (and it's dependencies)
const debounce = require('debounce') const debounce = require('debounce')
// After first State.save() invokation, future calls go straight to the // After first State.save() invokation, future calls go straight to the
// debounced function // debounced function
State.save = debounce(saveImmediate, SAVE_DEBOUNCE_INTERVAL) State.save = debounce(saveImmediate, SAVE_DEBOUNCE_INTERVAL)
State.save(...arguments) State.save(...args)
}, },
saveImmediate saveImmediate
}) })
@@ -242,7 +242,7 @@ async function saveImmediate (state, cb) {
// reading the torrent file or file(s) to seed & don't have an infohash // reading the torrent file or file(s) to seed & don't have an infohash
copy.torrents = copy.torrents copy.torrents = copy.torrents
.filter((x) => x.infoHash) .filter((x) => x.infoHash)
.map(function (x) { .map(x => {
const torrent = {} const torrent = {}
for (const key in x) { for (const key in x) {
if (key === 'progress' || key === 'torrentKey') { if (key === 'progress' || key === 'torrentKey') {

View File

@@ -50,7 +50,7 @@ function send (state) {
json: true json: true
} }
get.post(opts, function (err, res) { get.post(opts, (err, res) => {
if (err) return console.error('Error sending telemetry', err) if (err) return console.error('Error sending telemetry', err)
if (res.statusCode !== 200) { if (res.statusCode !== 200) {
return console.error(`Error sending telemetry, status code: ${res.statusCode}`) return console.error(`Error sending telemetry, status code: ${res.statusCode}`)
@@ -106,15 +106,14 @@ function getTorrentStats (state) {
} }
// First, count torrents & total file size // First, count torrents & total file size
for (let i = 0; i < count; i++) { for (const torrent of state.saved.torrents) {
const t = state.saved.torrents[i] const stat = byStatus[torrent.status]
const stat = byStatus[t.status] if (!torrent || !torrent.files || !stat) continue
if (!t || !t.files || !stat) continue
stat.count++ stat.count++
for (let j = 0; j < t.files.length; j++) {
const f = t.files[j] for (const file of torrent.files) {
if (!f || !f.length) continue if (!file || !file.length) continue
const fileSizeMB = f.length / (1 << 20) const fileSizeMB = file.length / (1 << 20)
sizeMB += fileSizeMB sizeMB += fileSizeMB
stat.sizeMB += fileSizeMB stat.sizeMB += fileSizeMB
} }
@@ -145,7 +144,7 @@ function roundPow2 (n) {
if (n <= 0) return 0 if (n <= 0) return 0
// Otherwise, return 1, 2, 4, 8, etc by rounding in log space // Otherwise, return 1, 2, 4, 8, etc by rounding in log space
const log2 = Math.log(n) / Math.log(2) const log2 = Math.log(n) / Math.log(2)
return Math.pow(2, Math.round(log2)) return 2 ** Math.round(log2)
} }
// An uncaught error happened in the main process or in one of the windows // An uncaught error happened in the main process or in one of the windows

View File

@@ -9,20 +9,14 @@ const msgNoSuitablePoster = 'Cannot generate a poster from any files in the torr
function torrentPoster (torrent, cb) { function torrentPoster (torrent, cb) {
// First, try to use a poster image if available // First, try to use a poster image if available
const posterFile = torrent.files.filter(function (file) { const posterFile = torrent.files.filter(file => /^poster\.(jpg|png|gif)$/.test(file.name))[0]
return /^poster\.(jpg|png|gif)$/.test(file.name)
})[0]
if (posterFile) return extractPoster(posterFile, cb) if (posterFile) return extractPoster(posterFile, cb)
// 'score' each media type based on total size present in torrent // 'score' each media type based on total size present in torrent
const bestScore = ['audio', 'video', 'image'].map(mediaType => { const bestScore = ['audio', 'video', 'image'].map(mediaType => ({
return { type: mediaType,
type: mediaType, size: calculateDataLengthByExtension(torrent, mediaExtensions[mediaType])
size: calculateDataLengthByExtension(torrent, mediaExtensions[mediaType]) })).sort((a, b) => b.size - a.size)[0] // sort descending on size
}
}).sort((a, b) => { // sort descending on size
return b.size - a.size
})[0]
if (bestScore.size === 0) { if (bestScore.size === 0) {
// Admit defeat, no video, audio or image had a significant presence // Admit defeat, no video, audio or image had a significant presence
@@ -51,9 +45,7 @@ function calculateDataLengthByExtension (torrent, extensions) {
if (files.length === 0) return 0 if (files.length === 0) return 0
return files return files
.map(file => file.length) .map(file => file.length)
.reduce((a, b) => { .reduce((a, b) => a + b)
return a + b
})
} }
/** /**
@@ -65,9 +57,7 @@ function calculateDataLengthByExtension (torrent, extensions) {
function getLargestFileByExtension (torrent, extensions) { function getLargestFileByExtension (torrent, extensions) {
const files = filterOnExtension(torrent, extensions) const files = filterOnExtension(torrent, extensions)
if (files.length === 0) return undefined if (files.length === 0) return undefined
return files.reduce((a, b) => { return files.reduce((a, b) => a.length > b.length ? a : b)
return a.length > b.length ? a : b
})
} }
/** /**
@@ -115,12 +105,10 @@ function torrentPosterFromAudio (torrent, cb) {
if (imageFiles.length === 0) return cb(new Error(msgNoSuitablePoster)) if (imageFiles.length === 0) return cb(new Error(msgNoSuitablePoster))
const bestCover = imageFiles.map(file => { const bestCover = imageFiles.map(file => ({
return { file,
file, score: scoreAudioCoverFile(file)
score: scoreAudioCoverFile(file) })).reduce((a, b) => {
}
}).reduce((a, b) => {
if (a.score > b.score) { if (a.score > b.score) {
return a return a
} }
@@ -190,5 +178,5 @@ function torrentPosterFromImage (torrent, cb) {
function extractPoster (file, cb) { function extractPoster (file, cb) {
const extname = path.extname(file.name) const extname = path.extname(file.name)
file.getBuffer((err, buf) => { return cb(err, buf, extname) }) file.getBuffer((err, buf) => cb(err, buf, extname))
} }

View File

@@ -104,9 +104,7 @@ function onState (err, _state) {
const TorrentController = require('./controllers/torrent-controller') const TorrentController = require('./controllers/torrent-controller')
return new TorrentController(state) return new TorrentController(state)
}), }),
torrentList: createGetter(() => { torrentList: createGetter(() => new TorrentListController(state)),
return new TorrentListController(state)
}),
update: createGetter(() => { update: createGetter(() => {
const UpdateController = require('./controllers/update-controller') const UpdateController = require('./controllers/update-controller')
return new UpdateController(state) return new UpdateController(state)
@@ -155,11 +153,11 @@ function onState (err, _state) {
// Add YouTube style hotkey shortcuts // Add YouTube style hotkey shortcuts
window.addEventListener('keydown', onKeydown) window.addEventListener('keydown', onKeydown)
const debouncedFullscreenToggle = debounce(function () { const debouncedFullscreenToggle = debounce(() => {
dispatch('toggleFullScreen') dispatch('toggleFullScreen')
}, 1000, true) }, 1000, true)
document.addEventListener('wheel', function (event) { document.addEventListener('wheel', event => {
// ctrlKey detects pinch to zoom, http://crbug.com/289887 // ctrlKey detects pinch to zoom, http://crbug.com/289887
if (event.ctrlKey) { if (event.ctrlKey) {
event.preventDefault() event.preventDefault()
@@ -400,7 +398,7 @@ function setupIpc () {
function backToList () { function backToList () {
// Exit any modals and screens with a back button // Exit any modals and screens with a back button
state.modal = null state.modal = null
state.location.backToFirst(function () { state.location.backToFirst(() => {
// If we were already on the torrent list, scroll to the top // If we were already on the torrent list, scroll to the top
const contentTag = document.querySelector('.content') const contentTag = document.querySelector('.content')
if (contentTag) contentTag.scrollTop = 0 if (contentTag) contentTag.scrollTop = 0
@@ -590,7 +588,7 @@ function onWindowBoundsChanged (e, newBounds) {
} }
function checkDownloadPath () { function checkDownloadPath () {
fs.stat(state.saved.prefs.downloadPath, function (err, stat) { fs.stat(state.saved.prefs.downloadPath, (err, stat) => {
if (err) { if (err) {
state.downloadPathStatus = 'missing' state.downloadPathStatus = 'missing'
return console.error(err) return console.error(err)

View File

@@ -86,9 +86,7 @@ class App extends React.Component {
const recentErrors = state.errors.filter((x) => now - x.time < 5000) const recentErrors = state.errors.filter((x) => now - x.time < 5000)
const hasErrors = recentErrors.length > 0 const hasErrors = recentErrors.length > 0
const errorElems = recentErrors.map(function (error, i) { const errorElems = recentErrors.map((error, i) => <div key={i} className='error'>{error.message}</div>)
return (<div key={i} className='error'>{error.message}</div>)
})
return ( return (
<div <div
key='errors' key='errors'

View File

@@ -109,8 +109,7 @@ function renderMedia (state) {
// Add subtitles to the <video> tag // Add subtitles to the <video> tag
const trackTags = [] const trackTags = []
if (state.playing.subtitles.selectedIndex >= 0) { if (state.playing.subtitles.selectedIndex >= 0) {
for (let i = 0; i < state.playing.subtitles.tracks.length; i++) { state.playing.subtitles.tracks.forEach((track, i) => {
const track = state.playing.subtitles.tracks[i]
const isSelected = state.playing.subtitles.selectedIndex === i const isSelected = state.playing.subtitles.selectedIndex === i
trackTags.push( trackTags.push(
<track <track
@@ -121,7 +120,7 @@ function renderMedia (state) {
src={track.buffer} src={track.buffer}
/> />
) )
} })
} }
// Create the <audio> or <video> tag // Create the <audio> or <video> tag
@@ -200,7 +199,7 @@ function renderMedia (state) {
} }
} }
function onEnded (e) { function onEnded () {
if (Playlist.hasNext(state)) { if (Playlist.hasNext(state)) {
dispatch('nextTrack') dispatch('nextTrack')
} else { } else {
@@ -504,7 +503,7 @@ function renderCastOptions (state) {
const { location, devices } = state.devices.castMenu const { location, devices } = state.devices.castMenu
const player = state.devices[location] const player = state.devices[location]
const items = devices.map(function (device, ix) { const items = devices.map((device, ix) => {
const isSelected = player.device === device const isSelected = player.device === device
const name = device.name const name = device.name
return ( return (
@@ -527,7 +526,7 @@ function renderSubtitleOptions (state) {
const subtitles = state.playing.subtitles const subtitles = state.playing.subtitles
if (!subtitles.tracks.length || !subtitles.showMenu) return if (!subtitles.tracks.length || !subtitles.showMenu) return
const items = subtitles.tracks.map(function (track, ix) { const items = subtitles.tracks.map((track, ix) => {
const isSelected = state.playing.subtitles.selectedIndex === ix const isSelected = state.playing.subtitles.selectedIndex === ix
return ( return (
<li key={ix} onClick={dispatcher('selectSubtitle', ix)}> <li key={ix} onClick={dispatcher('selectSubtitle', ix)}>
@@ -554,7 +553,7 @@ function renderAudioTrackOptions (state) {
const audioTracks = state.playing.audioTracks const audioTracks = state.playing.audioTracks
if (!audioTracks.tracks.length || !audioTracks.showMenu) return if (!audioTracks.tracks.length || !audioTracks.showMenu) return
const items = audioTracks.tracks.map(function (track, ix) { const items = audioTracks.tracks.map((track, ix) => {
const isSelected = state.playing.audioTracks.selectedIndex === ix const isSelected = state.playing.audioTracks.selectedIndex === ix
return ( return (
<li key={ix} onClick={dispatcher('selectAudioTrack', ix)}> <li key={ix} onClick={dispatcher('selectAudioTrack', ix)}>
@@ -672,7 +671,7 @@ function renderPlayerControls (state) {
airplay: { true: 'airplay', false: 'airplay' }, airplay: { true: 'airplay', false: 'airplay' },
dlna: { true: 'tv', false: 'tv' } dlna: { true: 'tv', false: 'tv' }
} }
castTypes.forEach(function (castType) { castTypes.forEach(castType => {
// Do we show this button (eg. the Chromecast button) at all? // Do we show this button (eg. the Chromecast button) at all?
const isCasting = state.playing.location.startsWith(castType) const isCasting = state.playing.location.startsWith(castType)
const player = state.devices[castType] const player = state.devices[castType]
@@ -779,7 +778,7 @@ function renderPlayerControls (state) {
dispatch('preview', e.clientX) dispatch('preview', e.clientX)
} }
function clearPreview (e) { function clearPreview () {
if (state.playing.type !== 'video') return if (state.playing.type !== 'video') return
dispatch('clearPreview') dispatch('clearPreview')
} }
@@ -795,7 +794,7 @@ function renderPlayerControls (state) {
} }
// Handles volume muting and Unmuting // Handles volume muting and Unmuting
function handleVolumeMute (e) { function handleVolumeMute () {
if (state.playing.volume === 0.0) { if (state.playing.volume === 0.0) {
dispatch('setVolume', 1.0) dispatch('setVolume', 1.0)
} else { } else {
@@ -817,7 +816,7 @@ function renderPlayerControls (state) {
} }
} }
function handleAudioTracks (e) { function handleAudioTracks () {
dispatch('toggleAudioTracksMenu') dispatch('toggleAudioTracksMenu')
} }
@@ -914,7 +913,7 @@ function renderLoadingBar (state) {
} }
// Output some bars to show which parts of the file are loaded // Output some bars to show which parts of the file are loaded
const loadingBarElems = parts.map(function (part, i) { const loadingBarElems = parts.map((part, i) => {
const style = { const style = {
left: (100 * part.start / fileProg.numPieces) + '%', left: (100 * part.start / fileProg.numPieces) + '%',
width: (100 * part.count / fileProg.numPieces) + '%' width: (100 * part.count / fileProg.numPieces) + '%'

View File

@@ -79,7 +79,7 @@ function init () {
getAudioMetadata(infoHash, index)) getAudioMetadata(infoHash, index))
ipcRenderer.on('wt-start-server', (e, infoHash) => ipcRenderer.on('wt-start-server', (e, infoHash) =>
startServer(infoHash)) startServer(infoHash))
ipcRenderer.on('wt-stop-server', (e) => ipcRenderer.on('wt-stop-server', () =>
stopServer()) stopServer())
ipcRenderer.on('wt-select-files', (e, infoHash, selections) => ipcRenderer.on('wt-select-files', (e, infoHash, selections) =>
selectFiles(infoHash, selections)) selectFiles(infoHash, selections))
@@ -165,7 +165,7 @@ function addTorrentEvents (torrent) {
updateTorrentProgress() updateTorrentProgress()
torrent.getFileModtimes(function (err, fileModtimes) { torrent.getFileModtimes((err, fileModtimes) => {
if (err) return onError(err) if (err) return onError(err)
ipcRenderer.send('wt-file-modtimes', torrent.key, fileModtimes) ipcRenderer.send('wt-file-modtimes', torrent.key, fileModtimes)
}) })
@@ -200,7 +200,7 @@ function saveTorrentFile (torrentKey) {
const torrent = getTorrent(torrentKey) const torrent = getTorrent(torrentKey)
const torrentPath = path.join(config.TORRENT_PATH, torrent.infoHash + '.torrent') const torrentPath = path.join(config.TORRENT_PATH, torrent.infoHash + '.torrent')
fs.access(torrentPath, fs.constants.R_OK, function (err) { fs.access(torrentPath, fs.constants.R_OK, err => {
const fileName = torrent.infoHash + '.torrent' const fileName = torrent.infoHash + '.torrent'
if (!err) { if (!err) {
// We've already saved the file // We've already saved the file
@@ -208,8 +208,8 @@ function saveTorrentFile (torrentKey) {
} }
// Otherwise, save the .torrent file, under the app config folder // Otherwise, save the .torrent file, under the app config folder
fs.mkdir(config.TORRENT_PATH, { recursive: true }, function (_) { fs.mkdir(config.TORRENT_PATH, { recursive: true }, _ => {
fs.writeFile(torrentPath, torrent.torrentFile, function (err) { fs.writeFile(torrentPath, torrent.torrentFile, err => {
if (err) return console.log('error saving torrent file %s: %o', torrentPath, err) if (err) return console.log('error saving torrent file %s: %o', torrentPath, err)
console.log('saved torrent file %s', torrentPath) console.log('saved torrent file %s', torrentPath)
return ipcRenderer.send('wt-file-saved', torrentKey, fileName) return ipcRenderer.send('wt-file-saved', torrentKey, fileName)
@@ -222,14 +222,14 @@ function saveTorrentFile (torrentKey) {
// Auto chooses either a frame from a video file, an image, etc // Auto chooses either a frame from a video file, an image, etc
function generateTorrentPoster (torrentKey) { function generateTorrentPoster (torrentKey) {
const torrent = getTorrent(torrentKey) const torrent = getTorrent(torrentKey)
torrentPoster(torrent, function (err, buf, extension) { torrentPoster(torrent, (err, buf, extension) => {
if (err) return console.log('error generating poster: %o', err) if (err) return console.log('error generating poster: %o', err)
// save it for next time // save it for next time
fs.mkdir(config.POSTER_PATH, { recursive: true }, function (err) { fs.mkdir(config.POSTER_PATH, { recursive: true }, err => {
if (err) return console.log('error creating poster dir: %o', err) if (err) return console.log('error creating poster dir: %o', err)
const posterFileName = torrent.infoHash + extension const posterFileName = torrent.infoHash + extension
const posterFilePath = path.join(config.POSTER_PATH, posterFileName) const posterFilePath = path.join(config.POSTER_PATH, posterFileName)
fs.writeFile(posterFilePath, buf, function (err) { fs.writeFile(posterFilePath, buf, err => {
if (err) return console.log('error saving poster: %o', err) if (err) return console.log('error saving poster: %o', err)
// show the poster // show the poster
ipcRenderer.send('wt-poster', torrentKey, posterFileName) ipcRenderer.send('wt-poster', torrentKey, posterFileName)
@@ -251,15 +251,13 @@ function updateTorrentProgress () {
function getTorrentProgress () { function getTorrentProgress () {
// First, track overall progress // First, track overall progress
const progress = client.progress const progress = client.progress
const hasActiveTorrents = client.torrents.some(function (torrent) { const hasActiveTorrents = client.torrents.some(torrent => torrent.progress !== 1)
return torrent.progress !== 1
})
// Track progress for every file in each torrent // Track progress for every file in each torrent
// TODO: ideally this would be tracked by WebTorrent, which could do it // TODO: ideally this would be tracked by WebTorrent, which could do it
// more efficiently than looping over torrent.bitfield // more efficiently than looping over torrent.bitfield
const torrentProg = client.torrents.map(function (torrent) { const torrentProg = client.torrents.map(torrent => {
const fileProg = torrent.files && torrent.files.map(function (file, index) { const fileProg = torrent.files && torrent.files.map(file => {
const numPieces = file._endPiece - file._startPiece + 1 const numPieces = file._endPiece - file._startPiece + 1
let numPiecesPresent = 0 let numPiecesPresent = 0
for (let piece = file._startPiece; piece <= file._endPiece; piece++) { for (let piece = file._startPiece; piece <= file._endPiece; piece++) {
@@ -299,12 +297,12 @@ function startServer (infoHash) {
else torrent.once('ready', () => startServerFromReadyTorrent(torrent)) else torrent.once('ready', () => startServerFromReadyTorrent(torrent))
} }
function startServerFromReadyTorrent (torrent, cb) { function startServerFromReadyTorrent (torrent) {
if (server) return if (server) return
// start the streaming torrent-to-http server // start the streaming torrent-to-http server
server = torrent.createServer() server = torrent.createServer()
server.listen(0, function () { server.listen(0, () => {
const port = server.address().port const port = server.address().port
const urlSuffix = ':' + port const urlSuffix = ':' + port
const info = { const info = {
@@ -339,7 +337,7 @@ function getAudioMetadata (infoHash, index) {
native: false, native: false,
skipCovers: true, skipCovers: true,
fileSize: file.length, fileSize: file.length,
observer: event => { observer: () => {
ipcRenderer.send('wt-audio-metadata', infoHash, index, { ipcRenderer.send('wt-audio-metadata', infoHash, index, {
common: metadata.common, common: metadata.common,
format: metadata.format format: metadata.format
@@ -384,7 +382,7 @@ function selectFiles (torrentOrInfoHash, selections) {
// selection with individual selections for each file, so we can // selection with individual selections for each file, so we can
// select/deselect files later on // select/deselect files later on
if (!selections) { if (!selections) {
selections = torrent.files.map((x) => true) selections = new Array(torrent.files.length).fill(true)
} }
// Selections specified incorrectly? // Selections specified incorrectly?
@@ -397,15 +395,15 @@ function selectFiles (torrentOrInfoHash, selections) {
torrent.deselect(0, torrent.pieces.length - 1, false) torrent.deselect(0, torrent.pieces.length - 1, false)
// Add selections (individual files) // Add selections (individual files)
for (let i = 0; i < selections.length; i++) { selections.forEach((selection, i) => {
const file = torrent.files[i] const file = torrent.files[i]
if (selections[i]) { if (selection) {
file.select() file.select()
} else { } else {
console.log('deselecting file ' + i + ' of torrent ' + torrent.name) console.log('deselecting file ' + i + ' of torrent ' + torrent.name)
file.deselect() file.deselect()
} }
} })
} }
// Gets a WebTorrent handle by torrentKey // Gets a WebTorrent handle by torrentKey
@@ -423,7 +421,7 @@ function onError (err) {
// TODO: remove this once the following bugs are fixed: // TODO: remove this once the following bugs are fixed:
// https://bugs.chromium.org/p/chromium/issues/detail?id=490143 // https://bugs.chromium.org/p/chromium/issues/detail?id=490143
// https://github.com/electron/electron/issues/7212 // https://github.com/electron/electron/issues/7212
window.testOfflineMode = function () { window.testOfflineMode = () => {
console.log('Test, going OFFLINE') console.log('Test, going OFFLINE')
client = window.client = new WebTorrent({ client = window.client = new WebTorrent({
peerId: PEER_ID, peerId: PEER_ID,