From e1d661f6237fa9329a8a8832b61b4216eec39b60 Mon Sep 17 00:00:00 2001 From: ThaUnknown <6506529+ThaUnknown@users.noreply.github.com> Date: Tue, 1 Aug 2023 00:22:30 +0200 Subject: [PATCH] fix: loadTillFull errors fix: scroll errors feat: better search by image fix: search by image toast in search fix: search by image refreshing search --- package.json | 2 +- src/renderer/App.svelte | 2 +- src/renderer/components/Search.svelte | 12 ++++-- .../components/cards/EpisodeCard.svelte | 22 +++++++--- .../cards/EpisodePreviewCard.svelte | 28 +++++++++--- src/renderer/modules/anime.js | 43 +++++++++++++++---- src/renderer/views/Search.svelte | 35 +++++++++------ 7 files changed, 107 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 5c584d9..ea670fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Miru", - "version": "4.2.12", + "version": "4.3.0", "author": "ThaUnknown_ ", "description": "Stream anime torrents, real-time with no waiting for downloads.", "main": "build/main.js", diff --git a/src/renderer/App.svelte b/src/renderer/App.svelte index bc50852..7bee90e 100644 --- a/src/renderer/App.svelte +++ b/src/renderer/App.svelte @@ -1,6 +1,6 @@ -
{ preview = true }} on:custom-pointerleave={() => { preview = false }} use:hoverClick={data.onclick}> +
{ preview = true }} on:custom-pointerleave={() => { preview = false }} use:hoverClick={data.onclick || viewMedia}> {#if preview} {/if} @@ -33,7 +39,7 @@ {data.media?.title.userPreferred || data.parseObject.anime_title}
- {data.episodeData?.title.en || ''} + {data.episodeData?.title?.en || ''}
{#if data.episode} @@ -41,9 +47,15 @@
Episode {data.episode}
-
- {since(data.date)} -
+ {#if data.date} +
+ {since(data.date)} +
+ {:else if data.similarity} +
+ {parseInt(data.similarity * 100)}% +
+ {/if} {/if} diff --git a/src/renderer/components/cards/EpisodePreviewCard.svelte b/src/renderer/components/cards/EpisodePreviewCard.svelte index a701f48..d497eb6 100644 --- a/src/renderer/components/cards/EpisodePreviewCard.svelte +++ b/src/renderer/components/cards/EpisodePreviewCard.svelte @@ -6,11 +6,23 @@ const media = data.media const episodeThumbnail = data.episodeData?.image || media?.bannerImage || media?.coverImage.extraLarge || ' ' + let hide = true
cover + {#if data.episodeData?.video} +
{/if}
diff --git a/src/renderer/modules/anime.js b/src/renderer/modules/anime.js index 80feece..ab87dea 100644 --- a/src/renderer/modules/anime.js +++ b/src/renderer/modules/anime.js @@ -4,7 +4,10 @@ import { alRequest, alSearch } from './anilist.js' import anitomyscript from 'anitomyscript' import { media } from '../views/Player/MediaHandler.svelte' import { toast } from 'svelte-sonner' -import { view } from '@/App.svelte' +import Sections from './sections.js' +import { page } from '@/App.svelte' + +import { search, key } from '@/views/Search.svelte' import { playAnime } from '../views/RSSView.svelte' @@ -16,13 +19,11 @@ window.addEventListener('paste', ({ clipboardData }) => { // WAIT image lookup o if (!item) return const { type } = item if (type.startsWith('image')) { - const promise = traceAnime(item.getAsFile()) - toast.promise(promise, { + toast.promise(traceAnime(item.getAsFile()), { description: 'You can also paste an URL to an image.', loading: 'Looking up anime for image...', success: 'Found anime for image!', error: 'Couldn\'t find anime for specified image! Try to remove black bars, or use a more detailed image.' - }) return } @@ -39,8 +40,7 @@ window.addEventListener('paste', ({ clipboardData }) => { // WAIT image lookup o src = text } if (src) { - const promise = traceAnime(src) - toast.promise(promise, { + toast.promise(traceAnime(src), { description: 'You can also paste an URL to an image.', loading: 'Looking up anime for image...', success: 'Found anime for image!', @@ -63,9 +63,34 @@ export async function traceAnime (image) { // WAIT lookup logic } const res = await fetch(url, options) const { result } = await res.json() - if (result?.[0].similarity >= 0.85) { - const res = await alRequest({ method: 'SearchIDSingle', id: result[0].anilist }) - view.set(res.data.Media) + + if (result?.length) { + const ids = result.map(({ anilist }) => anilist) + search.value = { + clearNext: true, + load: (page = 1, perPage = 50, variables = {}) => { + const res = alRequest({ method: 'SearchIDS', page, perPage, id: ids, ...Sections.sanitiseObject(variables) }).then(res => { + for (const index in res.data?.Page?.media) { + const media = res.data.Page.media[index] + const counterpart = result.find(({ anilist }) => anilist === media.id) + res.data.Page.media[index] = { + media, + episode: counterpart.episode, + similarity: counterpart.similarity, + episodeData: { + image: counterpart.image, + video: counterpart.video + } + } + } + res.data?.Page?.media.sort((a, b) => b.similarity - a.similarity) + return res + }) + return Sections.wrapResponse(res, result.length, 'episode') + } + } + key.value = {} + page.value = 'search' } else { throw new Error('Search Failed', { message: 'Couldn\'t find anime for specified image! Try to remove black bars, or use a more detailed image.' diff --git a/src/renderer/views/Search.svelte b/src/renderer/views/Search.svelte index 37430ee..d7580a6 100644 --- a/src/renderer/views/Search.svelte +++ b/src/renderer/views/Search.svelte @@ -5,6 +5,7 @@ export const search = writable({}) const items = writable([]) + export const key = writable({}) -
+
- {#key key} + {#key $key} {#each $items as card} {/each}