diff --git a/app/js/playerHandler.js b/app/js/playerHandler.js index e2deae3..14ebc7d 100644 --- a/app/js/playerHandler.js +++ b/app/js/playerHandler.js @@ -338,7 +338,7 @@ function selectLang(lang) { for (let track of video.textTracks) { if (track.language == lang) { track.mode = 'showing'; - parseHeader(headers[tracks.indexOf(track)]) + displayHeaderr(headers[tracks.indexOf(track)]) } else { track.mode = 'hidden'; diff --git a/app/js/subtitleHandler.js b/app/js/subtitleHandler.js index 573cf33..aae5915 100644 --- a/app/js/subtitleHandler.js +++ b/app/js/subtitleHandler.js @@ -12,11 +12,11 @@ function parseSubs(stream) { subtitleStream.once('tracks', pTracks => { pTracks.forEach(track => { tracks[track.number] = video.addTextTrack('captions', track.type, track.language); - headers[track.number] = track.header; + parseHeader(track.header, track.number); }) if (video.textTracks[0]) { video.textTracks[0].mode = "showing" - parseHeader(headers[3]) + displayHeader(headers[3]) } }) } @@ -34,7 +34,8 @@ const re_newline = /\\N/g, // replace \N with newline re_header_style = /(?<=\[V4\+? Styles\][\s\S]*Style: [^\n]*)(.+)/ig; function subConvt(result, trackNumber) { let cue = new VTTCue(result.time / 1000, (result.time + result.duration) / 1000, ""), - text = result.text; + text = result.text, + positioned if (tracks[trackNumber].label == "ass") { // Support for special characters in WebVTT. // For obvious reasons, the ampersand one *must* be first. @@ -54,7 +55,8 @@ function subConvt(result, trackNumber) { let oneLetter = (tagCommand.length == 1) ? tagCommand : ""; // "New" position commands. It is assumed that bottom center position is the default. if (tagCommand === "an") { - let posNum = Number(style[j].substring(2, 3)); + let posNum = Number(style[j].substring(2, 3)) + positioned = 1 if (Math.floor((posNum - 1) / 3) == 1) { cue.line = 0.5; } else if (Math.floor((posNum - 1) / 3) == 2) { @@ -69,6 +71,7 @@ function subConvt(result, trackNumber) { // Legacy position commands. } else if (oneLetter === "a" && !Number.isNaN(Number(style[j].substring(1, 2)))) { let posNum = Number(style[j].substring(1, 2)); + positioned = 1 if (posNum > 8) { cue.line = 0.5; } else if (posNum > 4) { @@ -140,6 +143,19 @@ function subConvt(result, trackNumber) { content += ''; } settings.subtitle2 ? cue.text += `${content}\r\n ` : cue.text += content + if (!positioned) { + let posNum = Number(headers[trackNumber].styles[result.style][headers[trackNumber].format.indexOf("Alignment")]); + if (Math.floor((posNum - 1) / 3) == 1) { + cue.line = 0.5; + } else if (Math.floor((posNum - 1) / 3) == 2) { + cue.line = 0; + } + if (posNum % 3 == 1) { + cue.align = "start"; + } else if (posNum % 3 == 0) { + cue.align = "end"; + } + } } else { settings.subtitle2 ? cue.text = `${text}\r\n ` : cue.text = text } @@ -147,17 +163,25 @@ function subConvt(result, trackNumber) { tracks[trackNumber].addCue(cue) } } -function parseHeader(header) { +function parseHeader(header, number) { + headers[number] = { + format: re_header_format.exec(header)[1].replace(/\ /g, "").split(","), + styles: { + } + } + header.match(re_header_style).forEach((item, index) => { + item = item.replace(/\&h/gi, "").replace(/\ /g, "").split(",") + headers[number].styles[item[headers[number].format.indexOf("Name")]] = item + }) +} +function displayHeader(header) { substyles.innerHTML = "" - let format = re_header_format.exec(header)[1].split(","), - styles = header.match(re_header_style) - for (let style of styles) { - style = style.replace(/\&h/gi, "").split(",") + for (let style of Object.values(header.styles)) { let bordCol - style[format.indexOf("BackColour")] ? bordCol = style[format.indexOf("BackColour")].split("").reverse().join("").slice(0, -2) : "#000" + style[header.format.indexOf("BackColour")] ? bordCol = style[header.format.indexOf("BackColour")].split("").reverse().join("").slice(0, -2) : "#000" substyles.innerHTML += ` -video::cue(.${style[format.indexOf("Name")]}) { - color: #${style[format.indexOf("PrimaryColour")] ? style[format.indexOf("PrimaryColour")].split("").reverse().join("").slice(0, -2) : ""} !important; +video::cue(.${style[header.format.indexOf("Name")]}) { + color: #${style[header.format.indexOf("PrimaryColour")] ? style[header.format.indexOf("PrimaryColour")].split("").reverse().join("").slice(0, -2) : ""} !important; text-shadow: 2px 2px 0 #${bordCol}, 2px -2px 0 #${bordCol}, -2px 2px 0 #${bordCol}, @@ -167,9 +191,9 @@ video::cue(.${style[format.indexOf("Name")]}) { -2px 0px 0 #${bordCol}, 0px -2px 0 #${bordCol}, 2px 2px 2px #${bordCol}; - font-weight: ${style[format.indexOf("Bold")] ? style[format.indexOf("Bold")] * -1 ? "bold" : "normal" : ""} !important; - font-style: ${style[format.indexOf("Italic")] ? style[format.indexOf("Italic")] * -1 ? "italic" : "normal" : ""} !important; - background: ${style[format.indexOf("BorderStyle")] ? style[format.indexOf("BorderStyle")] != 3 ? "none" : `#${bordCol}` : ""} !important; + font-weight: ${style[header.format.indexOf("Bold")] ? style[header.format.indexOf("Bold")] * -1 ? "bold" : "normal" : ""} !important; + font-style: ${style[header.format.indexOf("Italic")] ? style[header.format.indexOf("Italic")] * -1 ? "italic" : "normal" : ""} !important; + background: ${style[header.format.indexOf("BorderStyle")] ? style[header.format.indexOf("BorderStyle")] != 3 ? "none" : `#${bordCol}` : ""} !important; }` } } \ No newline at end of file diff --git a/app/js/torrentHandler.js b/app/js/torrentHandler.js index 75995fc..67218ca 100644 --- a/app/js/torrentHandler.js +++ b/app/js/torrentHandler.js @@ -51,8 +51,7 @@ WEBTORRENT_ANNOUNCE = announceList return url.indexOf('wss://') === 0 || url.indexOf('ws://') === 0 }) let nowPlaying, - maxTorrents = 1, - selectedTorrent + maxTorrents = 1 async function addTorrent(magnet) { if (client.torrents.length >= maxTorrents) { client.torrents[0].store ? client.torrents[0].store.destroy() : "" @@ -65,7 +64,7 @@ async function addTorrent(magnet) { await sw client.add(magnet, async function (torrent) { torrent.on('noPeers', function () { - if (selectedTorrent.progress != 1) { + if (client.torrents[0].progress != 1) { halfmoon.initStickyAlert({ content: `Couldn't find peers for ${torrent.infoHash}! Try a torrent with more seeders.`, title: "Search Failed", @@ -80,7 +79,6 @@ async function addTorrent(magnet) { videoFile = file } }) - selectedTorrent = torrent torrent.on('done', function () { halfmoon.initStickyAlert({ content: `${torrent.infoHash} has finished downloading. Now seeding.`, @@ -97,11 +95,11 @@ async function addTorrent(magnet) { } function onProgress() { - if (document.location.href.endsWith("#player") && selectedTorrent) { - player.style.setProperty("--download", selectedTorrent.progress * 100 + "%"); - peers.textContent = selectedTorrent.numPeers - downSpeed.textContent = prettyBytes(selectedTorrent.downloadSpeed) + '/s' - upSpeed.textContent = prettyBytes(selectedTorrent.uploadSpeed) + '/s' + if (document.location.href.endsWith("#player") && client.torrents[0]) { + player.style.setProperty("--download", client.torrents[0].progress * 100 + "%"); + peers.textContent = client.torrents[0].numPeers + downSpeed.textContent = prettyBytes(client.torrents[0].downloadSpeed) + '/s' + upSpeed.textContent = prettyBytes(client.torrents[0].uploadSpeed) + '/s' } } setInterval(onProgress, 100)