diff --git a/backend/src/metadataProvider/__init__.py b/backend/src/metadataProvider/__init__.py index 9ee4684..f437712 100644 --- a/backend/src/metadataProvider/__init__.py +++ b/backend/src/metadataProvider/__init__.py @@ -1,4 +1,5 @@ import logging +from cachetools import TTLCache, cached import metadataProvider.tmdb import metadataProvider.tvdb @@ -7,6 +8,7 @@ from metadataProvider.schemas import MetaDataProviderShowSearchResult from tv.schemas import Show log = logging.getLogger(__name__) +search_show_cache = TTLCache(maxsize=128, ttl=24 * 60 * 60) # Cache for 24 hours def get_show_metadata(id: int = None, provider: str = "tmdb") -> Show: @@ -15,6 +17,7 @@ def get_show_metadata(id: int = None, provider: str = "tmdb") -> Show: return metadata_providers[provider].get_show_metadata(id) +@cached(search_show_cache) def search_show(query: str | None = None, provider: str = "tmdb") -> list[MetaDataProviderShowSearchResult]: """ If no query is provided, it will return the most popular shows. diff --git a/backend/src/metadataProvider/tvdb.py b/backend/src/metadataProvider/tvdb.py index bfa65b8..05feb34 100644 --- a/backend/src/metadataProvider/tvdb.py +++ b/backend/src/metadataProvider/tvdb.py @@ -1,4 +1,5 @@ import pprint +from functools import cache import tvdb_v4_official import logging diff --git a/web/src/lib/components/add-show-card.svelte b/web/src/lib/components/add-show-card.svelte index 281a22f..2c8d62b 100644 --- a/web/src/lib/components/add-show-card.svelte +++ b/web/src/lib/components/add-show-card.svelte @@ -6,6 +6,7 @@ import {goto} from '$app/navigation'; import {base} from '$app/paths'; import type {MetaDataProviderShowSearchResult} from '$lib/types.js'; + import {toOptimizedURL} from "sveltekit-image-optimize/components"; let loading = $state(false); let errorMessage = $state(null); @@ -47,7 +48,7 @@ {#if result.poster_path != null} {:else} diff --git a/web/src/lib/components/app-sidebar.svelte b/web/src/lib/components/app-sidebar.svelte index d15771c..59a3809 100644 --- a/web/src/lib/components/app-sidebar.svelte +++ b/web/src/lib/components/app-sidebar.svelte @@ -1,9 +1,15 @@ @@ -85,7 +91,7 @@ - + diff --git a/web/src/lib/components/loading-bar.svelte b/web/src/lib/components/loading-bar.svelte new file mode 100644 index 0000000..c351752 --- /dev/null +++ b/web/src/lib/components/loading-bar.svelte @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/web/src/lib/components/nav-main.svelte b/web/src/lib/components/nav-main.svelte index 2977927..9e46458 100644 --- a/web/src/lib/components/nav-main.svelte +++ b/web/src/lib/components/nav-main.svelte @@ -22,7 +22,7 @@ - Platform + {#each items as mainItem (mainItem.title)} diff --git a/web/src/lib/components/nav-projects.svelte b/web/src/lib/components/nav-projects.svelte index cdad17d..cde3ebb 100644 --- a/web/src/lib/components/nav-projects.svelte +++ b/web/src/lib/components/nav-projects.svelte @@ -23,7 +23,7 @@ - Projects + {#each projects as item (item.name)} diff --git a/web/src/lib/components/ui/progress/index.ts b/web/src/lib/components/ui/progress/index.ts new file mode 100644 index 0000000..ed00711 --- /dev/null +++ b/web/src/lib/components/ui/progress/index.ts @@ -0,0 +1,7 @@ +import Root from "./progress.svelte"; + +export { + Root, + // + Root as Progress, +}; diff --git a/web/src/lib/components/ui/progress/progress.svelte b/web/src/lib/components/ui/progress/progress.svelte new file mode 100644 index 0000000..a18ec98 --- /dev/null +++ b/web/src/lib/components/ui/progress/progress.svelte @@ -0,0 +1,24 @@ + + + + + diff --git a/web/src/routes/dashboard/+page.svelte b/web/src/routes/dashboard/+page.svelte index 24bc152..7b9a8ce 100644 --- a/web/src/routes/dashboard/+page.svelte +++ b/web/src/routes/dashboard/+page.svelte @@ -3,10 +3,13 @@ import * as Sidebar from '$lib/components/ui/sidebar/index.js'; import * as Breadcrumb from '$lib/components/ui/breadcrumb/index.js'; import RecommendedShowsCarousel from '$lib/components/recommended-shows-carousel.svelte'; + import LoadingBar from '$lib/components/loading-bar.svelte'; import {base} from '$app/paths'; import {page} from '$app/state'; + import type {MetaDataProviderShowSearchResult} from "$lib/types"; + + let recommendedShows: Promise = page.data.tvRecommendations; - let recommendedShows = page.data.tvRecommendations; @@ -30,7 +33,12 @@ Trending Shows - + {#await recommendedShows} + + {:then recommendations} + + + {/await} diff --git a/web/src/routes/dashboard/+page.ts b/web/src/routes/dashboard/+page.ts index d6c74f4..6f8fa88 100644 --- a/web/src/routes/dashboard/+page.ts +++ b/web/src/routes/dashboard/+page.ts @@ -14,16 +14,5 @@ export const load: PageLoad = async ({fetch}) => { credentials: 'include' }); - if (!response.ok) { - console.error(`Failed to fetch TV recommendations: ${response.statusText}`); - toast.error(`Failed to fetch TV recommendations: ${response.statusText}`); - return {tvRecommendations: []}; - } else { - console.log('Fetched TV recommendations successfully'); - toast.success('Fetched TV recommendations successfully'); - } - - const recommendations = await response.json(); - console.log('Tv Recommendations:', recommendations); - return {tvRecommendations: recommendations}; + return {tvRecommendations: await response.json()}; }; \ No newline at end of file diff --git a/web/src/routes/dashboard/settings/+page.svelte b/web/src/routes/dashboard/settings/+page.svelte index 5091650..5497b4b 100644 --- a/web/src/routes/dashboard/settings/+page.svelte +++ b/web/src/routes/dashboard/settings/+page.svelte @@ -10,7 +10,7 @@ Settings - + Users Edit or delete users diff --git a/web/src/routes/dashboard/tv/+page.svelte b/web/src/routes/dashboard/tv/+page.svelte index daef4f4..031d165 100644 --- a/web/src/routes/dashboard/tv/+page.svelte +++ b/web/src/routes/dashboard/tv/+page.svelte @@ -8,6 +8,7 @@ import {toOptimizedURL} from 'sveltekit-image-optimize/components'; import {getFullyQualifiedShowName} from '$lib/utils'; import logo from '$lib/images/svelte-logo.svg'; + import LoadingBar from '$lib/components/loading-bar.svelte'; let tvShowsPromise = page.data.tvShows; @@ -33,19 +34,24 @@ - +{#snippet loadingbar()} + + + + + +{/snippet} TV Shows - + {#await tvShowsPromise} - Loading... + {@render loadingbar()} {:then tvShowsJson} {#await tvShowsJson.json()} - Loading... + {@render loadingbar()} + {:then tvShows} {#each tvShows as show}