diff --git a/config/defaults.js b/config/defaults.js index 73c49649..a617c264 100644 --- a/config/defaults.js +++ b/config/defaults.js @@ -91,6 +91,10 @@ const defaultConfig = { "saveSize": false, "hotkey": "P" }, + "captions-selector": { + enabled: false, + disableCaptions: false + } }, }; diff --git a/plugins/captions-selector/back.js b/plugins/captions-selector/back.js index 533cceca..de53d85a 100644 --- a/plugins/captions-selector/back.js +++ b/plugins/captions-selector/back.js @@ -1,8 +1,8 @@ const { ipcMain, dialog } = require("electron"); module.exports = () => { - ipcMain.handle('captionsSelector', async (_, captionLabels, currentIndex) => { - return await dialog.showMessageBox({ + ipcMain.handle('captionsSelector', async (_, captionLabels, currentIndex) => { + return await dialog.showMessageBox({ type: "question", buttons: captionLabels, defaultId: currentIndex, diff --git a/plugins/captions-selector/front.js b/plugins/captions-selector/front.js index f8c83cb9..9ae9dbde 100644 --- a/plugins/captions-selector/front.js +++ b/plugins/captions-selector/front.js @@ -1,30 +1,44 @@ const { ElementFromFile, templatePath } = require("../utils"); const { ipcRenderer } = require("electron"); +function $(selector) { return document.querySelector(selector); } + const captionsSettingsButton = ElementFromFile( templatePath(__dirname, "captionsSettingsTemplate.html") ); -module.exports = () => { - document.addEventListener('apiLoaded', setup, { once: true, passive: true }); +module.exports = (options) => { + document.addEventListener('apiLoaded', (event) => setup(event, options), { once: true, passive: true }); } -function setup(event) { +/** + * If captions are disabled by default, + * unload "captions" module when video changes. + */ +const videoChanged = (api, options) => { + if (options.disableCaptions) { + setTimeout(() => api.unloadModule("captions"), 100); + } +} + +function setup(event, options) { const api = event.detail; - document.querySelector('.right-controls-buttons').append(captionsSettingsButton); + $("video").addEventListener("srcChanged", () => videoChanged(api, options)); + + $(".right-controls-buttons").append(captionsSettingsButton); captionsSettingsButton.onclick = function chooseQuality() { + api.loadModule("captions"); + const captionTrackList = api.getOption("captions", "tracklist"); if (captionTrackList?.length) { - api.pauseVideo(); - const currentCaptionTrack = api.getOption("captions", "track"); const currentIndex = captionTrackList.indexOf(captionTrackList.find(track => track.languageCode === currentCaptionTrack.languageCode)); const captionLabels = [ - ...captionTrackList.map(track => track.displayName), + ...captionTrackList.map(track => track.displayName), 'None' ]; diff --git a/plugins/captions-selector/menu.js b/plugins/captions-selector/menu.js new file mode 100644 index 00000000..439ff8b4 --- /dev/null +++ b/plugins/captions-selector/menu.js @@ -0,0 +1,12 @@ +const { setOptions } = require('../../config/plugins'); + +module.exports = (_win, options) => [ + { + label: "No captions by default", + type: "checkbox", + checked: options.disabledCaptions, + click: (item) => { + setOptions("captions-selector", { disableCaptions: item.checked }); + }, + } +];