single query name resolving, no longer need to cache queries [god kill me pls]

This commit is contained in:
ThaUnknown 2021-05-06 02:29:47 +02:00
parent af3f12fccb
commit 60ef10ba43
3 changed files with 86 additions and 67 deletions

View file

@ -161,9 +161,19 @@ query ($page: Int, $perPage: Int, $sort: [MediaSort], $type: MediaType, $search:
variables.id = opts.id
query = `
query ($id: Int, $type: MediaType) {
Media (id: $id, type: $type){
Media (id: $id, type: $type) {
${queryObjects}
}
}`
} else if (opts.method === 'SearchIDS') {
variables.id = opts.id
query = `
query ($id: [Int], $type: MediaType, $page: Int, $perPage: Int) {
Page (page: $page, perPage: $perPage) {
media (id_in: $id, type: $type) {
${queryObjects}
}
}
}`
} else if (opts.method === 'Viewer') {
query = `
@ -520,34 +530,43 @@ async function nyaaRss (media, episode) {
async function resolveFileMedia (opts) {
// opts.fileName opts.method opts.isRelease
const elems = await anitomyscript(opts.fileName)
if (!relations[elems.anime_title]) {
// resolve name and shit
let method, res
if (opts.isRelease) {
method = { name: elems.anime_title, method: 'SearchName', perPage: 1, status: 'RELEASING', sort: 'TRENDING_DESC' }
// maybe releases should include this and last season? idfk
} else {
method = { name: elems.anime_title, method: opts.method, perPage: 1, sort: 'SEARCH_MATCH' }
}
res = await alRequest(method)
if (!res.data.Page.media[0]) {
method.sort = 'SEARCH_MATCH'
method.name = method.name.replace(' (TV)', '').replace(` (${new Date().getFullYear()})`, '').replace('-', '').replace('S2', '2') // this needs to be improved!!!
method.status = undefined
async function resolveTitle (title) {
if (!relations[title]) {
// resolve name and shit
let method, res
if (opts.isRelease) {
method = { name: title, method: 'SearchName', perPage: 1, status: 'RELEASING', sort: 'TRENDING_DESC' }
// maybe releases should include this and last season? idfk
} else {
method = { name: title, method: opts.method, perPage: 1, sort: 'SEARCH_MATCH' }
}
res = await alRequest(method)
}
if (res.data.Page.media[0]) {
relations[elems.anime_title] = res.data.Page.media[0].id
store[res.data.Page.media[0].id] = res.data.Page.media[0]
if (!res.data.Page.media[0]) {
method.sort = 'SEARCH_MATCH'
method.name = method.name.replace('(TV)', '').replace(` (${new Date().getFullYear()})`, '').replace('-', '').replace('S2', '2') // this needs to be improved!!!
method.status = undefined
res = await alRequest(method)
}
if (res.data.Page.media[0]) {
relations[title] = res.data.Page.media[0].id
}
}
}
if (!store[relations[elems.anime_title]] && relations[elems.anime_title]) {
store[relations[elems.anime_title]] = (await alRequest({ method: 'SearchIDSingle', id: relations[elems.anime_title] })).data.Media
const parsePromises = []
if (opts.fileName.constructor === Array) {
for (const name of opts.fileName) parsePromises.push(anitomyscript(name))
} else {
parsePromises[0] = anitomyscript(opts.fileName)
}
let episode; let media = store[relations[elems.anime_title]]
// resolve episode, if movie, dont.
if ((media?.format !== 'MOVIE' || (media.episodes || media.nextAiringEpisode.episode)) && elems.episode_number) {
const parseObjs = await Promise.all(parsePromises)
const titlePromises = [...new Set(parseObjs.map(obj => obj.anime_title))].map(title => resolveTitle(title))
await Promise.all(titlePromises)
const mediaList = (await alRequest({ method: 'SearchIDS', id: [...new Set(parseObjs.map(obj => relations[obj.anime_title]))], perPage: 50 })).data.Page.media
const assoc = {}
for (const media of mediaList) assoc[media.id] = media
const fileMedias = []
for (const praseObj of parseObjs) {
let media = assoc[relations[praseObj.anime_title]]
async function resolveSeason (opts) {
// opts.media, opts.episode, opts.increment, opts.offset
let epMin, epMax
@ -573,7 +592,7 @@ async function resolveFileMedia (opts) {
} else if (tempMedia?.episodes && epMax - (opts.offset + tempMedia.episodes) <= (media.nextAiringEpisode?.episode || media.episodes) && epMin - (opts.offset + tempMedia.episodes) > 0) {
// episode is in range, seems good! overwriting media to count up "seasons"
if (opts.episode.constructor === Array) {
episode = `${elems.episode_number[0] - (opts.offset + tempMedia.episodes)} ~ ${elems.episode_number[elems.episode_number.length - 1] - (opts.offset + tempMedia.episodes)}`
episode = `${praseObj.episode_number[0] - (opts.offset + tempMedia.episodes)} ~ ${praseObj.episode_number[praseObj.episode_number.length - 1] - (opts.offset + tempMedia.episodes)}`
} else {
episode = opts.episode - (opts.offset + tempMedia.episodes)
}
@ -585,51 +604,56 @@ async function resolveFileMedia (opts) {
console.log('error in parsing!', opts.media, tempMedia)
// something failed, most likely couldnt find an edge or processing failed, force episode number even if its invalid/out of bounds, better than nothing
if (opts.episode.constructor === Array) {
episode = `${Number(elems.episode_number[0])} ~ ${Number(elems.episode_number[elems.episode_number.length - 1])}`
episode = `${Number(praseObj.episode_number[0])} ~ ${Number(praseObj.episode_number[praseObj.episode_number.length - 1])}`
} else {
episode = Number(opts.episode)
}
}
}
if (elems.episode_number.constructor === Array) {
// resolve episode, if movie, dont.
if ((media?.format !== 'MOVIE' || (media.episodes || media.nextAiringEpisode.episode)) && praseObj.episode_number) {
if (praseObj.episode_number.constructor === Array) {
// is an episode range
if (parseInt(elems.episode_number[0]) === 1) {
if (parseInt(praseObj.episode_number[0]) === 1) {
// if it starts with #1 and overflows then it includes more than 1 season in a batch, cant fix this cleanly, name is parsed per file basis so this shouldnt be an issue
episode = `${elems.episode_number[0]} ~ ${elems.episode_number[elems.episode_number.length - 1]}`
} else {
if ((media?.episodes || media?.nextAiringEpisode?.episode) && parseInt(elems.episode_number[elems.episode_number.length - 1]) > (media.episodes || media.nextAiringEpisode.episode)) {
// if highest value is bigger than episode count or latest streamed episode +1 for safety, parseint to math.floor a number like 12.5 - specials - in 1 go
await resolveSeason({ media: media, episode: elems.episode_number, offset: 0 })
episode = `${praseObj.episode_number[0]} ~ ${praseObj.episode_number[praseObj.episode_number.length - 1]}`
} else {
if ((media?.episodes || media?.nextAiringEpisode?.episode) && parseInt(praseObj.episode_number[praseObj.episode_number.length - 1]) > (media.episodes || media.nextAiringEpisode.episode)) {
// if highest value is bigger than episode count or latest streamed episode +1 for safety, parseint to math.floor a number like 12.5 - specials - in 1 go
await resolveSeason({ media: media, episode: praseObj.episode_number, offset: 0 })
} else {
// cant find ep count or range seems fine
episode = `${Number(elems.episode_number[0])} ~ ${Number(elems.episode_number[elems.episode_number.length - 1])}`
episode = `${Number(praseObj.episode_number[0])} ~ ${Number(praseObj.episode_number[praseObj.episode_number.length - 1])}`
}
}
} else {
if ((media?.episodes || media?.nextAiringEpisode?.episode) && parseInt(praseObj.episode_number) > (media.episodes || media.nextAiringEpisode.episode)) {
// value bigger than episode count
await resolveSeason({ media: media, episode: praseObj.episode_number, offset: 0 })
} else {
// cant find ep count or episode seems fine
episode = Number(praseObj.episode_number)
}
}
} else {
if ((media?.episodes || media?.nextAiringEpisode?.episode) && parseInt(elems.episode_number) > (media.episodes || media.nextAiringEpisode.episode)) {
// value bigger than episode count
await resolveSeason({ media: media, episode: elems.episode_number, offset: 0 })
} else {
// cant find ep count or episode seems fine
episode = Number(elems.episode_number)
}
}
const streamingEpisode = media?.streamingEpisodes.filter(episode => episodeRx.exec(episode.title) && Number(episodeRx.exec(episode.title)[1]) === Number(praseObj.episode_number))[0]
fileMedias.push({
mediaTitle: media?.title.userPreferred,
episodeNumber: episode,
episodeTitle: streamingEpisode ? episodeRx.exec(streamingEpisode.title)[2] : undefined,
episodeThumbnail: streamingEpisode?.thumbnail,
mediaCover: media?.coverImage.medium,
name: 'Miru',
parseObject: praseObj,
media: media
})
}
const streamingEpisode = media?.streamingEpisodes.filter(episode => episodeRx.exec(episode.title) && Number(episodeRx.exec(episode.title)[1]) === Number(elems.episode_number))[0]
return {
mediaTitle: media?.title.userPreferred,
episodeNumber: episode,
episodeTitle: streamingEpisode ? episodeRx.exec(streamingEpisode.title)[2] : undefined,
episodeThumbnail: streamingEpisode?.thumbnail,
mediaCover: media?.coverImage.medium,
name: 'Miru',
parseObject: elems,
media: media
}
return fileMedias.length === 1 ? fileMedias[0] : fileMedias
}
const store = {}
const relations = JSON.parse(localStorage.getItem('relations')) || {}
let relations = JSON.parse(localStorage.getItem('relations'))
relations = relations || {}
function getRSSurl () {
if (Object.values(torrent4list.options).filter(item => item.value === settings.torrent4)[0]) {
@ -639,12 +663,8 @@ function getRSSurl () {
}
}
async function releasesCards (items, limit) {
const mediaItems = []
const cards = []
for (let l = 0; l < (limit || items.length); l++) {
mediaItems.push(resolveFileMedia({ fileName: items[l].querySelector('title').textContent, method: 'SearchName', isRelease: true }))
}
await Promise.all(mediaItems).then(results => {
await resolveFileMedia({ fileName: [...items].map(item => item.querySelector('title').textContent).slice(0, limit), method: 'SearchName', isRelease: true }).then(results => {
results.forEach((mediaInformation, index) => {
const o = items[index].querySelector.bind(items[index])
mediaInformation.onclick = () => client.playTorrent(o('link').textContent, { media: mediaInformation, episode: mediaInformation.episode, expectedSize: o('size').textContent })

View file

@ -86,7 +86,7 @@ async function loadHomePage () {
notification.onclick = async () => {
window.parent.focus()
client.playTorrent(doc.querySelector('item').querySelector('link').textContent, { media: mediaInformation, episode: mediaInformation.episode })
store[relations[mediaInformation.parseObject.anime_title]] = await alRequest({ id: mediaInformation.media.id, method: 'SearchIDSingle' }).then(res => res.data.Media)
relations[mediaInformation.parseObject.anime_title] = await alRequest({ id: mediaInformation.media.id, method: 'SearchIDSingle' }).then(res => res.data.Media.id)
}
}
})
@ -169,7 +169,6 @@ async function loadHomePage () {
media = media.media
}
cards.push(cardCreator({ media: media, schedule: opts.schedule, onclick: () => viewAnime(media) }))
store[media.id] = media
})
opts.gallery.append(...cards)
canScroll = true

View file

@ -383,9 +383,9 @@ Style: Default,${options.defaultSSAStyles || 'Roboto Medium,26,&H00FFFFFF,&H0000
if ('mediaSession' in navigator) {
navigator.mediaSession.metadata = new MediaMetadata({
title: this.nowPlaying.mediaTitle || this.nowPlaying.name || 'WebTorrentPlayer',
title: this.nowPlaying.mediaTitle || this.nowPlaying.name || 'Miru',
artist: 'Episode ' + episodeInfo,
album: this.nowPlaying.name || 'WebTorrentPlayer',
album: this.nowPlaying.name || 'Miru',
artwork: [{
src: this.nowPlaying.episodeThumbnail || this.nowPlaying.mediaCover || '',
sizes: '256x256',
@ -396,7 +396,7 @@ Style: Default,${options.defaultSSAStyles || 'Roboto Medium,26,&H00FFFFFF,&H0000
if (this.nowPlaying.episodeThumbnail) this.video.poster = this.nowPlaying.episodeThumbnail
this.changeControlsIcon('nowPlaying', 'EP ' + episodeInfo)
document.title = [this.nowPlaying.mediaTitle, episodeInfo ? 'EP ' + episodeInfo : false, this.nowPlaying.name || 'WebTorrentPlayer'].filter(s => s).join(' - ')
document.title = [this.nowPlaying.mediaTitle, episodeInfo ? 'EP ' + episodeInfo : false, this.nowPlaying.name || 'Miru'].filter(s => s).join(' - ')
}
}
@ -412,7 +412,7 @@ Style: Default,${options.defaultSSAStyles || 'Roboto Medium,26,&H00FFFFFF,&H0000
this.video.src = ''
this.video.load()
this.onDone = undefined
document.title = this.nowPlaying?.name || 'WebTorrentPlayer'
document.title = this.nowPlaying?.name || 'Miru'
this.setProgress(0)
// look for file and delete its store, idk how to do this
Object.assign(this.subtitleData, {