subsplease switch, cutting down on global variables ep1

This commit is contained in:
ThaUnknown 2020-10-18 20:32:48 +02:00
parent 3f4e6bd6c3
commit 70d178999f
7 changed files with 71 additions and 62 deletions

View file

@ -231,7 +231,7 @@ video::cue {
2px 2px 2px #000;
}
#dl:not([download])>span {
#dl:not([href])>span {
cursor: not-allowed;
color: rgba(255, 255, 255, .4);
}

View file

@ -237,7 +237,7 @@
<span class="input-group-text">Feed</span>
</div>
<select class="form-control" disabled>
<option value="HS" selected="selected">Erai Raws</option>
<option value="HS" selected="selected">SubsPlease</option>
</select>
</div>
</div>
@ -298,20 +298,15 @@
<h1 class="content-title font-size-22">
Subtitle Settings
</h1>
<div class="input-group w-200 mb-10">
<div class="input-group w-200 mb-20">
<div class="input-group-prepend">
<span class="input-group-text">Font</span>
<span class="input-group-text">Font Fallback</span>
</div>
<select class="form-control" id="subtitle1">
<option value="'Open Sans', sans-serif">Open Sans</option>
<option value="Roboto,Arial,Helvetica,sans-serif">Roboto</option>
</select>
</div>
<div class="custom-switch mb-20">
<input type="checkbox" id="subtitle2">
<label for="subtitle2">Edge Spacing [Has Issues With Displaying Multiple Subtitles At
Once]</label>
</div>
<h1 class="content-title font-size-22">

View file

@ -324,7 +324,8 @@ async function nyaaRss(url) {
const regex = /((?:\[[^\]]*\])*)?\s*((?:[^\d\[\.](?!S\d))*)?\s*((?:S\d+[^\w\[]*E?)?[\d\-]*)\s*(.*)?/i,
eregex = /(\[.*\]\ ?)?(.+?(?=\ \\ \d))?(\ \\ )?(\d+)?/i
eregex = /(\[.*\]\ ?)?(.+?(?=\ \\ \d))?(\ \\ )?(\d+)?/i,
plsregex = /(\[.[^\]]*\]\ ?)?(.+?(?=\ \-\ \d))?(\ \-\ )?(\d+)?(.*)?/i
let store = {};
async function hsRss(url) {
@ -340,7 +341,7 @@ async function hsRss(url) {
let items = doc.querySelectorAll("item")
for (let item of items) {
let i = item.querySelector.bind(item),
regexParse = eregex.exec(i("title").textContent)
regexParse = plsregex.exec(i("title").textContent)
if (!store.hasOwnProperty(regexParse[2]) && !alResponse.data.Page.media.some(media => (Object.values(media.title).concat(media.synonyms).filter(name => name != null).includes(regexParse[2]) && ((store[regexParse[2]] = media) && true)))) {
//shit not found, lookup
let res = await alRequest(regexParse[2], 1)
@ -366,13 +367,13 @@ async function hsRss(url) {
}
}
refRel.onclick = function () {
hsRss(`https://www.erai-rss.info/rss-${settings.torrent1}`)
hsRss(`https://subsplease.org/rss/?r=${settings.torrent1}`)
}
setInterval(() => {
hsRss(`https://www.erai-rss.info/rss-${settings.torrent1}`)
hsRss(`https://subsplease.org/rss/?r=${settings.torrent1}`)
}, 30000);
async function loadAnime() {
await searchAnime()
hsRss(`https://www.erai-rss.info/rss-${settings.torrent1}`)
hsRss(`https://subsplease.org/rss/?r=${settings.torrent1}`)
}
loadAnime()

View file

@ -19,15 +19,33 @@ for (let item of controls) {
window[func]()
})
}
let playerData = {
tracks: [],
headers: undefined,
subtitles: [],
subtitleStream: undefined,
octopusInstance: undefined,
nowPlaying: undefined
}
function resetVideo() {
!!playerData.octopusInstance ? playerData.octopusInstance.dispose() : ""
playerData = {
tracks: [],
headers: undefined,
subtitles: [],
subtitleStream: undefined,
octopusInstance: undefined,
nowPlaying: undefined
}
video.pause()
video.src = "";
video.load()
delete video
video.remove()
nowPlayingDisplay.textContent = ""
tracks = []
subtitles = []
headers = undefined
subtitleStream = undefined
nowPlayingDisplay.textContent = playerData.nowPlaying || ""
dl.removeAttribute("href")
dl.removeAttribute("download")
video = document.createElement("video")
if (settings.player7) {
video.setAttribute("autoPictureInPicture", "")
@ -37,9 +55,11 @@ function resetVideo() {
}
video.src = ""
video.id = "video"
video.volume = settings.player1 / 100
video.setAttribute("preload", "none")
video.volume = volume.value / 100
video.style.setProperty("--sub-font", settings.subtitle1);
video.addEventListener("playing", resetBuffer);
video.addEventListener("canplay", resetBuffer);
video.addEventListener("loadeddata", initThumbnail);
video.addEventListener("loadedmetadata", updateDisplay);
video.addEventListener("ended", autoNext);
@ -232,7 +252,7 @@ function btnpp() {
}
function btnnext() {
nyaaSearch(nowPlaying[0], parseInt(nowPlaying[1]) + 1)
nyaaSearch(playerData.nowPlaying[0], parseInt(playerData.nowPlaying[1]) + 1)
}
function autoNext() {
settings.player6 ? btnnext() : ""
@ -340,7 +360,7 @@ function selectLang(lang) {
for (let track of video.textTracks) {
if (track.language == lang) {
track.mode = 'showing';
displayHeader(headers[tracks.indexOf(track)])
displayHeader(playerData.headers[playerData.tracks.indexOf(track)])
}
else {
track.mode = 'hidden';
@ -390,22 +410,22 @@ document.onkeydown = function (a) {
// media session
function selPlaying(sel) {
nowPlaying = sel
playerData.nowPlaying = sel
if ('mediaSession' in navigator) {
navigator.mediaSession.metadata = new MediaMetadata({
title: store[nowPlaying[0]] ? store[nowPlaying[0]].title.english || store[nowPlaying[0]].title.romaji : nowPlaying[0],
artist: "Episode " + nowPlaying[1],
title: store[playerData.nowPlaying[0]] ? store[playerData.nowPlaying[0]].title.english || store[playerData.nowPlaying[0]].title.romaji : playerData.nowPlaying[0],
artist: "Episode " + playerData.nowPlaying[1],
album: "Miru",
artwork: [
{
src: store[nowPlaying[0]] ? store[nowPlaying[0]].coverImage.medium : "",
src: store[playerData.nowPlaying[0]] ? store[playerData.nowPlaying[0]].coverImage.medium : "",
sizes: '128x128',
type: 'image/png'
}
]
});
}
nowPlayingDisplay.textContent = `EP ${nowPlaying[1]}`
nowPlayingDisplay.textContent = `EP ${playerData.nowPlaying[1]}`
}
function updatePositionState() {

View file

@ -7,7 +7,6 @@ const settingsElements = {
player6: player6,
player7: player7,
subtitle1: subtitle1,
subtitle2: subtitle2,
torrent1: torrent1,
torrent2: torrent2,
torrent3: torrent3
@ -24,7 +23,6 @@ function restoreDefaults() {
player6: false,
player7: true,
subtitle1: "'Open Sans', sans-serif",
subtitle2: true,
torrent1: "1080",
torrent2: false,
torrent3: true

View file

@ -1,29 +1,24 @@
let tracks = [],
headers,
subtitles = [],
subtitleStream,
octopusInstance
const { SubtitleStream } = MatroskaSubtitles
function subStream(stream) {
if (video.src.endsWith(".mkv")) {
if (subtitleStream) {
subtitleStream = new SubtitleStream(subtitleStream)
if (playerData.subtitleStream) {
playerData.subtitleStream = new SubtitleStream(playerData.subtitleStream)
} else {
subtitleStream = new SubtitleStream()
subtitleStream.once('tracks', pTracks => {
playerData.subtitleStream = new SubtitleStream()
playerData.subtitleStream.once('tracks', pTracks => {
pTracks.forEach(track => {
if (track.type == "ass") {
if (!headers) {
headers = []
if (!playerData.headers) {
playerData.headers = []
}
headers[track.number] = track.header
subtitles[track.number] = []
playerData.headers[track.number] = track.header
playerData.subtitles[track.number] = []
} else {
tracks[track.number] = video.addTextTrack('captions', track.type, track.language);
playerData.tracks[track.number] = video.addTextTrack('captions', track.type, track.language);
let spacerCue = new VTTCue(0.1, 9999, "&nbsp;")
spacerCue.line = -1
tracks[track.number].addCue(spacerCue)
playerData.tracks[track.number].addCue(spacerCue)
}
})
if (video.textTracks[0]) {
@ -31,33 +26,34 @@ function subStream(stream) {
}
})
}
subtitleStream.on('subtitle', function (subtitle, trackNumber) {
playerData.subtitleStream.on('subtitle', function (subtitle, trackNumber) {
let formatSub = "Dialogue: " + subtitle.layer + "," + new Date(subtitle.time).toISOString().slice(12, -1).slice(0,-1) + "," + new Date(subtitle.time + subtitle.duration).toISOString().slice(12, -1).slice(0,-1) + "," + subtitle.style + "," + subtitle.name + "," + subtitle.marginL + "," + subtitle.marginR + "," + subtitle.marginV + "," + subtitle.effect + "," + subtitle.text
if (headers) {
if (!subtitles[trackNumber].includes(formatSub)) {
subtitles[trackNumber].push(formatSub)
renderSubs(3)
if (playerData.headers) {
if (!playerData.subtitles[trackNumber].includes(formatSub)) {
playerData.subtitles[trackNumber].push(formatSub)
renderSubs.call(null, 3)
}
} else {
if (!Object.values(tracks[trackNumber].cues).some(c => c.text == subtitle.text && c.startTime == subtitle.time / 1000 && c.endTime == (subtitle.time + subtitle.duration) / 1000)) {
if (!Object.values(playerData.tracks[trackNumber].cues).some(c => c.text == subtitle.text && c.startTime == subtitle.time / 1000 && c.endTime == (subtitle.time + subtitle.duration) / 1000)) {
let cue = new VTTCue(subtitle.time / 1000, (subtitle.time + subtitle.duration) / 1000, subtitle.text)
tracks[trackNumber].addCue(cue)
playerData.tracks[trackNumber].addCue(cue)
}
}
})
stream.pipe(subtitleStream)
stream.pipe(playerData.subtitleStream)
}
}
function renderSubs(trackNumber) {
let trackContent = headers[trackNumber].slice(0,-1)+subtitles[trackNumber].join("\n")
if (!octopusInstance) {
let trackContent = playerData.headers[trackNumber].slice(0,-1)+playerData.subtitles[trackNumber].join("\n")
if (!playerData.octopusInstance) {
let options = {
video: video,
subContent: trackContent,
fonts: ["https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fBBc4.woff2"],
workerUrl: 'js/subtitles-octopus-worker.js'
};
octopusInstance = new SubtitlesOctopus(options);
playerData.octopusInstance = new SubtitlesOctopus(options);
} else {
octopusInstance.setTrack(trackContent)
playerData.octopusInstance.setTrack(trackContent)
}
}

View file

@ -1,4 +1,4 @@
client = new WebTorrent()
let client = new WebTorrent()
window.onbeforeunload = () => {
client.torrents[0] ? client.torrents[0].store.destroy() : ""
client.torrents[0] ? client.torrents[0].destroy() : ""
@ -50,8 +50,7 @@ WEBTORRENT_ANNOUNCE = announceList
.filter(function (url) {
return url.indexOf('wss://') === 0 || url.indexOf('ws://') === 0
})
let nowPlaying,
maxTorrents = 1
let maxTorrents = 1
async function addTorrent(magnet) {
if (client.torrents.length >= maxTorrents) {
client.torrents[0].store ? client.torrents[0].store.destroy() : ""
@ -89,8 +88,8 @@ async function addTorrent(magnet) {
finishThumbnails(videoFile);
downloadFile(videoFile)
})
subtitleStream = undefined
video.src = `${scope}webtorrent/${torrent.infoHash}/${encodeURI(videoFile.path)}`
video.load()
})
}
@ -140,7 +139,7 @@ function serveFile(file, req) {
let stream = file.createReadStream(range)
subStream(stream)
return [res, req.method === 'GET' && subtitleStream || stream]
return [res, req.method === 'GET' && playerData.subtitleStream || stream]
}
// kind of a fetch event from service worker but for the main thread.