mirror of
https://github.com/ThaUnknown/miru.git
synced 2026-04-18 11:22:12 +00:00
subsplease switch, cutting down on global variables ep1
This commit is contained in:
parent
3f4e6bd6c3
commit
70d178999f
7 changed files with 71 additions and 62 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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, " ")
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in a new issue