diff --git a/app/js/animeHandler.js b/app/js/animeHandler.js index bc9bbb4..22dab54 100644 --- a/app/js/animeHandler.js +++ b/app/js/animeHandler.js @@ -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 }) diff --git a/app/js/interface.js b/app/js/interface.js index 29d5841..b1563ce 100644 --- a/app/js/interface.js +++ b/app/js/interface.js @@ -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 diff --git a/app/js/torrent-player.js b/app/js/torrent-player.js index 4b6a601..103ad30 100644 --- a/app/js/torrent-player.js +++ b/app/js/torrent-player.js @@ -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, {