From 00066ba788f36e51838053462f8a64ad36586636 Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Fri, 5 Jan 2024 21:19:59 +0200 Subject: [PATCH 01/46] somewhat ok mediasession implementation --- src/components/player/base/Container.tsx | 2 + .../player/internals/MediaSession.ts | 178 ++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 src/components/player/internals/MediaSession.ts diff --git a/src/components/player/base/Container.tsx b/src/components/player/base/Container.tsx index 9fc10bff..2a68ae31 100644 --- a/src/components/player/base/Container.tsx +++ b/src/components/player/base/Container.tsx @@ -4,6 +4,7 @@ import { OverlayDisplay } from "@/components/overlays/OverlayDisplay"; import { CastingInternal } from "@/components/player/internals/CastingInternal"; import { HeadUpdater } from "@/components/player/internals/HeadUpdater"; import { KeyboardEvents } from "@/components/player/internals/KeyboardEvents"; +import { MediaSession } from "@/components/player/internals/MediaSession"; import { MetaReporter } from "@/components/player/internals/MetaReporter"; import { ProgressSaver } from "@/components/player/internals/ProgressSaver"; import { ThumbnailScraper } from "@/components/player/internals/ThumbnailScraper"; @@ -91,6 +92,7 @@ export function Container(props: PlayerProps) { +
diff --git a/src/components/player/internals/MediaSession.ts b/src/components/player/internals/MediaSession.ts new file mode 100644 index 00000000..f1be96e7 --- /dev/null +++ b/src/components/player/internals/MediaSession.ts @@ -0,0 +1,178 @@ +import { useCallback, useEffect, useRef } from "react"; + +import { usePlayerStore } from "@/stores/player/store"; + +import { usePlayerMeta } from "../hooks/usePlayerMeta"; + +export function MediaSession() { + const display = usePlayerStore((s) => s.display); + const mediaPlaying = usePlayerStore((s) => s.mediaPlaying); + const meta = usePlayerStore((s) => s.meta); + const progress = usePlayerStore((s) => s.progress); + const { setDirectMeta } = usePlayerMeta(); + const setShouldStartFromBeginning = usePlayerStore( + (s) => s.setShouldStartFromBeginning, + ); + + const shouldUpdatePositionState = useRef(false); + const lastPlaybackPosition = useRef(0); + + const dataRef = useRef({ + display, + mediaPlaying, + progress, + meta, + }); + + useEffect(() => { + dataRef.current = { + display, + mediaPlaying, + progress, + meta, + }; + }, [display, mediaPlaying, progress, meta]); + + const changeEpisode = useCallback( + (change: number) => { + const nextEp = meta?.episodes?.find( + (v) => v.number === (meta?.episode?.number ?? 0) + change, + ); + + if (!meta || !nextEp) return; + const metaCopy = { ...meta }; + metaCopy.episode = nextEp; + setShouldStartFromBeginning(true); + setDirectMeta(metaCopy); + }, + [setDirectMeta, meta, setShouldStartFromBeginning], + ); + + const updatePositionState = useCallback((position: number) => { + // If the updated position needs to be buffered, queue an update + if (position > dataRef.current.progress.buffered) { + shouldUpdatePositionState.current = true; + } + if (position > dataRef.current.progress.duration) return; + + lastPlaybackPosition.current = dataRef.current.progress.time; + navigator.mediaSession.setPositionState({ + duration: dataRef.current.progress.duration, + playbackRate: dataRef.current.mediaPlaying.playbackRate, + position, + }); + }, []); + + useEffect(() => { + if (!("mediaSession" in navigator)) return; + + // If not already updating the position state, and the media is loading, queue an update + if ( + !shouldUpdatePositionState.current && + dataRef.current.mediaPlaying.isLoading + ) { + shouldUpdatePositionState.current = true; + } + + // If the user has skipped (or MediaSession desynced) by more than 5 seconds, queue an update + if ( + Math.abs(dataRef.current.progress.time - lastPlaybackPosition.current) > + 5 && + !dataRef.current.mediaPlaying.isLoading && + !shouldUpdatePositionState.current + ) { + shouldUpdatePositionState.current = true; + } + + // If not loading and the position state is queued, update it + if ( + shouldUpdatePositionState.current && + !dataRef.current.mediaPlaying.isLoading + ) { + shouldUpdatePositionState.current = false; + updatePositionState(dataRef.current.progress.time); + } + + lastPlaybackPosition.current = dataRef.current.progress.time; + navigator.mediaSession.playbackState = dataRef.current.mediaPlaying + .isPlaying + ? "playing" + : "paused"; + + navigator.mediaSession.metadata = new MediaMetadata({ + title: dataRef.current.meta?.episode?.title, + artist: dataRef.current.meta?.title, + artwork: [ + { + src: dataRef.current.meta?.poster ?? "", + sizes: "342x513", + type: "image/png", + }, + ], + }); + + navigator.mediaSession.setActionHandler("play", () => { + if (dataRef.current.mediaPlaying.isLoading) return; + dataRef.current.display?.play(); + + navigator.mediaSession.playbackState = "playing"; + updatePositionState(dataRef.current.progress.time); + }); + + navigator.mediaSession.setActionHandler("pause", () => { + if (dataRef.current.mediaPlaying.isLoading) return; + dataRef.current.display?.pause(); + + navigator.mediaSession.playbackState = "paused"; + updatePositionState(dataRef.current.progress.time); + }); + + navigator.mediaSession.setActionHandler("seekbackward", (evt) => { + const skipTime = evt.seekOffset ?? 10; + dataRef.current.display?.setTime( + dataRef.current.progress.time - skipTime, + ); + updatePositionState(dataRef.current.progress.time - skipTime); + }); + + navigator.mediaSession.setActionHandler("seekforward", (evt) => { + const skipTime = evt.seekOffset ?? 10; // Time to skip in seconds + dataRef.current.display?.setTime( + dataRef.current.progress.time + skipTime, + ); + updatePositionState(dataRef.current.progress.time + skipTime); + }); + + navigator.mediaSession.setActionHandler("seekto", (e) => { + if (!e.seekTime) return; + dataRef.current.display?.setTime(e.seekTime); + updatePositionState(e.seekTime); + }); + + if (dataRef.current.meta?.episode?.number !== 1) { + navigator.mediaSession.setActionHandler("previoustrack", () => { + changeEpisode(-1); + }); + } else { + navigator.mediaSession.setActionHandler("previoustrack", null); + } + + if ( + dataRef.current.meta?.episode?.number !== + dataRef.current.meta?.episodes?.length + ) { + navigator.mediaSession.setActionHandler("nexttrack", () => { + changeEpisode(1); + }); + } else { + navigator.mediaSession.setActionHandler("nexttrack", null); + } + }, [ + changeEpisode, + meta, + setDirectMeta, + setShouldStartFromBeginning, + updatePositionState, + ]); + return null; +} From fb68efa5222df1fd3583ac2c0f0c5bbd09006891 Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Sat, 6 Jan 2024 18:43:42 +0200 Subject: [PATCH 02/46] Rework MediaSession to be less bad --- .../player/internals/MediaSession.ts | 75 +++++++++---------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/src/components/player/internals/MediaSession.ts b/src/components/player/internals/MediaSession.ts index f1be96e7..7290217c 100644 --- a/src/components/player/internals/MediaSession.ts +++ b/src/components/player/internals/MediaSession.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useRef } from "react"; +import { useCallback, useEffect, useMemo, useRef } from "react"; import { usePlayerStore } from "@/stores/player/store"; @@ -66,6 +66,22 @@ export function MediaSession() { useEffect(() => { if (!("mediaSession" in navigator)) return; + // If the media is paused, update the navigator + if (mediaPlaying.isPaused) { + navigator.mediaSession.playbackState = "paused"; + } else { + navigator.mediaSession.playbackState = "playing"; + } + }, [mediaPlaying.isPaused]); + + useEffect(() => { + if (!("mediaSession" in navigator)) return; + + updatePositionState(dataRef.current.progress.time); + }, [mediaPlaying.playbackRate, updatePositionState]); + + useEffect(() => { + if (!("mediaSession" in navigator)) return; // If not already updating the position state, and the media is loading, queue an update if ( !shouldUpdatePositionState.current && @@ -76,8 +92,7 @@ export function MediaSession() { // If the user has skipped (or MediaSession desynced) by more than 5 seconds, queue an update if ( - Math.abs(dataRef.current.progress.time - lastPlaybackPosition.current) > - 5 && + Math.abs(progress.time - lastPlaybackPosition.current) >= 5 && !dataRef.current.mediaPlaying.isLoading && !shouldUpdatePositionState.current ) { @@ -90,21 +105,29 @@ export function MediaSession() { !dataRef.current.mediaPlaying.isLoading ) { shouldUpdatePositionState.current = false; - updatePositionState(dataRef.current.progress.time); + updatePositionState(progress.time); } - lastPlaybackPosition.current = dataRef.current.progress.time; - navigator.mediaSession.playbackState = dataRef.current.mediaPlaying - .isPlaying - ? "playing" - : "paused"; + lastPlaybackPosition.current = progress.time; + }, [updatePositionState, progress.time]); + + useEffect(() => { + if ( + !("mediaSession" in navigator) || + dataRef.current.mediaPlaying.hasPlayedOnce || + dataRef.current.progress.duration === 0 + ) + return; + + const title = meta?.episode?.title ?? meta?.title ?? ""; + const artist = meta?.type === "movie" ? undefined : meta?.title ?? ""; navigator.mediaSession.metadata = new MediaMetadata({ - title: dataRef.current.meta?.episode?.title, - artist: dataRef.current.meta?.title, + title, + artist, artwork: [ { - src: dataRef.current.meta?.poster ?? "", + src: meta?.poster ?? "", sizes: "342x513", type: "image/png", }, @@ -115,7 +138,6 @@ export function MediaSession() { if (dataRef.current.mediaPlaying.isLoading) return; dataRef.current.display?.play(); - navigator.mediaSession.playbackState = "playing"; updatePositionState(dataRef.current.progress.time); }); @@ -123,33 +145,16 @@ export function MediaSession() { if (dataRef.current.mediaPlaying.isLoading) return; dataRef.current.display?.pause(); - navigator.mediaSession.playbackState = "paused"; updatePositionState(dataRef.current.progress.time); }); - navigator.mediaSession.setActionHandler("seekbackward", (evt) => { - const skipTime = evt.seekOffset ?? 10; - dataRef.current.display?.setTime( - dataRef.current.progress.time - skipTime, - ); - updatePositionState(dataRef.current.progress.time - skipTime); - }); - - navigator.mediaSession.setActionHandler("seekforward", (evt) => { - const skipTime = evt.seekOffset ?? 10; // Time to skip in seconds - dataRef.current.display?.setTime( - dataRef.current.progress.time + skipTime, - ); - updatePositionState(dataRef.current.progress.time + skipTime); - }); - navigator.mediaSession.setActionHandler("seekto", (e) => { if (!e.seekTime) return; dataRef.current.display?.setTime(e.seekTime); updatePositionState(e.seekTime); }); - if (dataRef.current.meta?.episode?.number !== 1) { + if ((dataRef.current.meta?.episode?.number ?? 1) !== 1) { navigator.mediaSession.setActionHandler("previoustrack", () => { changeEpisode(-1); }); @@ -167,12 +172,6 @@ export function MediaSession() { } else { navigator.mediaSession.setActionHandler("nexttrack", null); } - }, [ - changeEpisode, - meta, - setDirectMeta, - setShouldStartFromBeginning, - updatePositionState, - ]); + }, [changeEpisode, updatePositionState, meta]); return null; } From c6f359d4ea67beb26c097a44790f4e2d46756836 Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Sat, 6 Jan 2024 19:31:05 +0200 Subject: [PATCH 03/46] Remove unused import in MediaSession.ts --- src/components/player/internals/MediaSession.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/player/internals/MediaSession.ts b/src/components/player/internals/MediaSession.ts index 7290217c..6c325aed 100644 --- a/src/components/player/internals/MediaSession.ts +++ b/src/components/player/internals/MediaSession.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useRef } from "react"; +import { useCallback, useEffect, useRef } from "react"; import { usePlayerStore } from "@/stores/player/store"; From 761e952ce269d704a6996793d790d9c466c2b4d8 Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Fri, 9 Feb 2024 17:51:47 +0200 Subject: [PATCH 04/46] fix: update if conditions to allow for updates after changing episodes --- .../player/internals/MediaSession.ts | 142 +++++++++--------- 1 file changed, 70 insertions(+), 72 deletions(-) diff --git a/src/components/player/internals/MediaSession.ts b/src/components/player/internals/MediaSession.ts index 6c325aed..e5127c0e 100644 --- a/src/components/player/internals/MediaSession.ts +++ b/src/components/player/internals/MediaSession.ts @@ -5,10 +5,6 @@ import { usePlayerStore } from "@/stores/player/store"; import { usePlayerMeta } from "../hooks/usePlayerMeta"; export function MediaSession() { - const display = usePlayerStore((s) => s.display); - const mediaPlaying = usePlayerStore((s) => s.mediaPlaying); - const meta = usePlayerStore((s) => s.meta); - const progress = usePlayerStore((s) => s.progress); const { setDirectMeta } = usePlayerMeta(); const setShouldStartFromBeginning = usePlayerStore( (s) => s.setShouldStartFromBeginning, @@ -17,117 +13,107 @@ export function MediaSession() { const shouldUpdatePositionState = useRef(false); const lastPlaybackPosition = useRef(0); - const dataRef = useRef({ - display, - mediaPlaying, - progress, - meta, - }); - - useEffect(() => { - dataRef.current = { - display, - mediaPlaying, - progress, - meta, - }; - }, [display, mediaPlaying, progress, meta]); + const data = usePlayerStore.getState(); const changeEpisode = useCallback( (change: number) => { - const nextEp = meta?.episodes?.find( - (v) => v.number === (meta?.episode?.number ?? 0) + change, + const nextEp = data.meta?.episodes?.find( + (v) => v.number === (data.meta?.episode?.number ?? 0) + change, ); - if (!meta || !nextEp) return; - const metaCopy = { ...meta }; + if (!data.meta || !nextEp) return; + const metaCopy = { ...data.meta }; metaCopy.episode = nextEp; setShouldStartFromBeginning(true); setDirectMeta(metaCopy); }, - [setDirectMeta, meta, setShouldStartFromBeginning], + [data.meta, setDirectMeta, setShouldStartFromBeginning], ); - const updatePositionState = useCallback((position: number) => { - // If the updated position needs to be buffered, queue an update - if (position > dataRef.current.progress.buffered) { - shouldUpdatePositionState.current = true; - } - if (position > dataRef.current.progress.duration) return; + const updatePositionState = useCallback( + (position: number) => { + // If the updated position needs to be buffered, queue an update + if (position > data.progress.buffered) { + shouldUpdatePositionState.current = true; + } + if (position > data.progress.duration) return; - lastPlaybackPosition.current = dataRef.current.progress.time; - navigator.mediaSession.setPositionState({ - duration: dataRef.current.progress.duration, - playbackRate: dataRef.current.mediaPlaying.playbackRate, - position, - }); - }, []); + lastPlaybackPosition.current = data.progress.time; + navigator.mediaSession.setPositionState({ + duration: data.progress.duration, + playbackRate: data.mediaPlaying.playbackRate, + position, + }); + }, + [ + data.mediaPlaying.playbackRate, + data.progress.buffered, + data.progress.duration, + data.progress.time, + ], + ); useEffect(() => { if (!("mediaSession" in navigator)) return; // If the media is paused, update the navigator - if (mediaPlaying.isPaused) { + if (data.mediaPlaying.isPaused) { navigator.mediaSession.playbackState = "paused"; } else { navigator.mediaSession.playbackState = "playing"; } - }, [mediaPlaying.isPaused]); + }, [data.mediaPlaying.isPaused]); useEffect(() => { if (!("mediaSession" in navigator)) return; - updatePositionState(dataRef.current.progress.time); - }, [mediaPlaying.playbackRate, updatePositionState]); + updatePositionState(data.progress.time); + }, [data.progress.time, data.mediaPlaying.playbackRate, updatePositionState]); useEffect(() => { if (!("mediaSession" in navigator)) return; // If not already updating the position state, and the media is loading, queue an update - if ( - !shouldUpdatePositionState.current && - dataRef.current.mediaPlaying.isLoading - ) { + if (!shouldUpdatePositionState.current && data.mediaPlaying.isLoading) { shouldUpdatePositionState.current = true; } // If the user has skipped (or MediaSession desynced) by more than 5 seconds, queue an update if ( - Math.abs(progress.time - lastPlaybackPosition.current) >= 5 && - !dataRef.current.mediaPlaying.isLoading && + Math.abs(data.progress.time - lastPlaybackPosition.current) >= 5 && + !data.mediaPlaying.isLoading && !shouldUpdatePositionState.current ) { shouldUpdatePositionState.current = true; } // If not loading and the position state is queued, update it - if ( - shouldUpdatePositionState.current && - !dataRef.current.mediaPlaying.isLoading - ) { + if (shouldUpdatePositionState.current && !data.mediaPlaying.isLoading) { shouldUpdatePositionState.current = false; - updatePositionState(progress.time); + updatePositionState(data.progress.time); } - lastPlaybackPosition.current = progress.time; - }, [updatePositionState, progress.time]); + lastPlaybackPosition.current = data.progress.time; + }, [updatePositionState, data.progress.time, data.mediaPlaying.isLoading]); useEffect(() => { if ( !("mediaSession" in navigator) || - dataRef.current.mediaPlaying.hasPlayedOnce || - dataRef.current.progress.duration === 0 + (!data.mediaPlaying.isLoading && + data.mediaPlaying.isPlaying && + !data.display) ) return; - const title = meta?.episode?.title ?? meta?.title ?? ""; - const artist = meta?.type === "movie" ? undefined : meta?.title ?? ""; + const title = data.meta?.episode?.title ?? data.meta?.title ?? ""; + const artist = + data.meta?.type === "movie" ? undefined : data.meta?.title ?? ""; navigator.mediaSession.metadata = new MediaMetadata({ title, artist, artwork: [ { - src: meta?.poster ?? "", + src: data.meta?.poster ?? "", sizes: "342x513", type: "image/png", }, @@ -135,26 +121,26 @@ export function MediaSession() { }); navigator.mediaSession.setActionHandler("play", () => { - if (dataRef.current.mediaPlaying.isLoading) return; - dataRef.current.display?.play(); + if (data.mediaPlaying.isLoading) return; + data.display?.play(); - updatePositionState(dataRef.current.progress.time); + updatePositionState(data.progress.time); }); navigator.mediaSession.setActionHandler("pause", () => { - if (dataRef.current.mediaPlaying.isLoading) return; - dataRef.current.display?.pause(); + if (data.mediaPlaying.isLoading) return; + data.display?.pause(); - updatePositionState(dataRef.current.progress.time); + updatePositionState(data.progress.time); }); navigator.mediaSession.setActionHandler("seekto", (e) => { if (!e.seekTime) return; - dataRef.current.display?.setTime(e.seekTime); + data.display?.setTime(e.seekTime); updatePositionState(e.seekTime); }); - if ((dataRef.current.meta?.episode?.number ?? 1) !== 1) { + if ((data.meta?.episode?.number ?? 1) !== 1) { navigator.mediaSession.setActionHandler("previoustrack", () => { changeEpisode(-1); }); @@ -162,16 +148,28 @@ export function MediaSession() { navigator.mediaSession.setActionHandler("previoustrack", null); } - if ( - dataRef.current.meta?.episode?.number !== - dataRef.current.meta?.episodes?.length - ) { + if (data.meta?.episode?.number !== data.meta?.episodes?.length) { navigator.mediaSession.setActionHandler("nexttrack", () => { changeEpisode(1); }); } else { navigator.mediaSession.setActionHandler("nexttrack", null); } - }, [changeEpisode, updatePositionState, meta]); + }, [ + changeEpisode, + updatePositionState, + data.mediaPlaying.hasPlayedOnce, + data.mediaPlaying.isLoading, + data.progress.duration, + data.progress.time, + data.meta?.episode?.number, + data.meta?.episodes?.length, + data.display, + data.mediaPlaying, + data.meta?.episode?.title, + data.meta?.title, + data.meta?.type, + data.meta?.poster, + ]); return null; } From 818e1595868e8ab8c2a83370d2d87b7f7a8dfc42 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Fri, 1 Mar 2024 17:17:09 +0000 Subject: [PATCH 05/46] Create vercel.json --- vercel.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 vercel.json diff --git a/vercel.json b/vercel.json new file mode 100644 index 00000000..00e7eccd --- /dev/null +++ b/vercel.json @@ -0,0 +1,3 @@ +{ + "routes": [{ "src": "/[^.]+", "dest": "/", "status": 200 }] +} From e555354e179901ff29f651bb949055cf1ff633f3 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sun, 3 Mar 2024 18:36:12 +0000 Subject: [PATCH 06/46] If TMDB key is empty, don't attempt request --- src/backend/metadata/tmdb.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index 2bae75d1..b143b312 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -144,12 +144,16 @@ export function decodeTMDBId( const baseURL = "https://api.themoviedb.org/3"; +const apiKey = conf().TMDB_READ_API_KEY; + const headers = { accept: "application/json", - Authorization: `Bearer ${conf().TMDB_READ_API_KEY}`, + Authorization: `Bearer ${apiKey}`, }; async function get(url: string, params?: object): Promise { + if (!apiKey) throw new Error("TMDB API key not set"); + const res = await mwFetch(encodeURI(url), { headers, baseURL, From b5604456596d2cf478b03e521445b04a0a14ae0f Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sun, 3 Mar 2024 18:37:28 +0000 Subject: [PATCH 07/46] Return null values where appr and handle the env being blank --- src/setup/config.ts | 58 ++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/setup/config.ts b/src/setup/config.ts index f081e673..26eb814e 100644 --- a/src/setup/config.ts +++ b/src/setup/config.ts @@ -31,10 +31,10 @@ export interface RuntimeConfig { DONATION_LINK: string; DISCORD_LINK: string; DMCA_EMAIL: string | null; - TMDB_READ_API_KEY: string; + TMDB_READ_API_KEY: string | null; NORMAL_ROUTER: boolean; PROXY_URLS: string[]; - BACKEND_URL: string; + BACKEND_URL: string | null; DISALLOWED_IDS: string[]; TURNSTILE_KEY: string | null; CDN_REPLACEMENTS: Array; @@ -66,48 +66,48 @@ const env: Record = { HAS_ONBOARDING: import.meta.env.VITE_HAS_ONBOARDING, }; -// loads from different locations, in order: environment (VITE_{KEY}), window (public/config.js) -function getKeyValue(key: keyof Config): string | undefined { - let windowValue = (window as any)?.__CONFIG__?.[`VITE_${key}`]; - if ( - windowValue !== null && - windowValue !== undefined && - windowValue.length === 0 - ) - windowValue = undefined; - return env[key] ?? windowValue ?? undefined; +function coerceUndefined(value: string | null | undefined): string | undefined { + if (value == null) return undefined; + if (value.length === 0) return undefined; + return value; } -function getKey(key: keyof Config, defaultString?: string): string { - return getKeyValue(key)?.toString() ?? defaultString ?? ""; +// loads from different locations, in order: environment (VITE_{KEY}), window (public/config.js) +function getKeyValue(key: keyof Config): string | undefined { + const windowValue = (window as any)?.__CONFIG__?.[`VITE_${key}`]; + + return coerceUndefined(env[key]) ?? coerceUndefined(windowValue) ?? undefined; +} + +function getKey(key: keyof Config): string | null; +function getKey(key: keyof Config, defaultString: string): string; +function getKey(key: keyof Config, defaultString?: string): string | null { + return getKeyValue(key)?.toString() ?? defaultString ?? null; } export function conf(): RuntimeConfig { - const dmcaEmail = getKey("DMCA_EMAIL"); - const chromeExtension = getKey("ONBOARDING_CHROME_EXTENSION_INSTALL_LINK"); - const firefoxExtension = getKey("ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK"); - const proxyInstallLink = getKey("ONBOARDING_PROXY_INSTALL_LINK"); - const turnstileKey = getKey("TURNSTILE_KEY"); return { APP_VERSION, GITHUB_LINK, DONATION_LINK, DISCORD_LINK, - DMCA_EMAIL: dmcaEmail.length > 0 ? dmcaEmail : null, - ONBOARDING_CHROME_EXTENSION_INSTALL_LINK: - chromeExtension.length > 0 ? chromeExtension : null, - ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK: - firefoxExtension.length > 0 ? firefoxExtension : null, - ONBOARDING_PROXY_INSTALL_LINK: - proxyInstallLink.length > 0 ? proxyInstallLink : null, + DMCA_EMAIL: getKey("DMCA_EMAIL"), + ONBOARDING_CHROME_EXTENSION_INSTALL_LINK: getKey( + "ONBOARDING_CHROME_EXTENSION_INSTALL_LINK", + ), + ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK: getKey( + "ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK", + ), + ONBOARDING_PROXY_INSTALL_LINK: getKey("ONBOARDING_PROXY_INSTALL_LINK"), BACKEND_URL: getKey("BACKEND_URL", BACKEND_URL), TMDB_READ_API_KEY: getKey("TMDB_READ_API_KEY"), - PROXY_URLS: getKey("CORS_PROXY_URL") + PROXY_URLS: getKey("CORS_PROXY_URL", "") .split(",") - .map((v) => v.trim()), + .map((v) => v.trim()) + .filter((v) => v.length > 0), NORMAL_ROUTER: getKey("NORMAL_ROUTER", "false") === "true", HAS_ONBOARDING: getKey("HAS_ONBOARDING", "false") === "true", - TURNSTILE_KEY: turnstileKey.length > 0 ? turnstileKey : null, + TURNSTILE_KEY: getKey("TURNSTILE_KEY"), DISALLOWED_IDS: getKey("DISALLOWED_IDS", "") .split(",") .map((v) => v.trim()) From 404d3b885fc1b260adda067e0aebcecc55837f67 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sun, 3 Mar 2024 18:37:43 +0000 Subject: [PATCH 08/46] Handle nullability of config fields --- src/hooks/auth/useBackendUrl.ts | 2 +- src/pages/parts/admin/TMDBTestPart.tsx | 2 +- src/pages/parts/settings/SidebarPart.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hooks/auth/useBackendUrl.ts b/src/hooks/auth/useBackendUrl.ts index 64545227..adee8622 100644 --- a/src/hooks/auth/useBackendUrl.ts +++ b/src/hooks/auth/useBackendUrl.ts @@ -1,7 +1,7 @@ import { conf } from "@/setup/config"; import { useAuthStore } from "@/stores/auth"; -export function useBackendUrl(): string | undefined { +export function useBackendUrl(): string | null { const backendUrl = useAuthStore((s) => s.backendUrl); return backendUrl ?? conf().BACKEND_URL; } diff --git a/src/pages/parts/admin/TMDBTestPart.tsx b/src/pages/parts/admin/TMDBTestPart.tsx index a7f8fa50..d760c948 100644 --- a/src/pages/parts/admin/TMDBTestPart.tsx +++ b/src/pages/parts/admin/TMDBTestPart.tsx @@ -25,7 +25,7 @@ export function TMDBTestPart() { errorText: "", }); - if (tmdbApiKey.length === 0) { + if (!tmdbApiKey || tmdbApiKey.length === 0) { return setStatus({ hasTested: true, success: false, diff --git a/src/pages/parts/settings/SidebarPart.tsx b/src/pages/parts/settings/SidebarPart.tsx index 13db06fe..98404c84 100644 --- a/src/pages/parts/settings/SidebarPart.tsx +++ b/src/pages/parts/settings/SidebarPart.tsx @@ -14,7 +14,7 @@ import { useAuthStore } from "@/stores/auth"; const rem = 16; -function SecureBadge(props: { url: string | undefined }) { +function SecureBadge(props: { url: string | null }) { const { t } = useTranslation(); const secure = props.url ? props.url.startsWith("https://") : false; return ( From fa8548d3c28b94b9e18c012cd83b84493fb0d459 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sun, 3 Mar 2024 18:37:57 +0000 Subject: [PATCH 09/46] Default config.js to not have TMDB set --- public/config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/config.js b/public/config.js index a0681d06..feb65e84 100644 --- a/public/config.js +++ b/public/config.js @@ -4,7 +4,7 @@ window.__CONFIG__ = { VITE_CORS_PROXY_URL: "", // The READ API key to access TMDB - VITE_TMDB_READ_API_KEY: "CHANGEME", + VITE_TMDB_READ_API_KEY: "", // The DMCA email displayed in the footer, null to hide the DMCA link VITE_DMCA_EMAIL: null, @@ -16,5 +16,5 @@ window.__CONFIG__ = { VITE_BACKEND_URL: null, // A comma separated list of disallowed IDs in the case of a DMCA claim - in the format "series-" and "movie-" - VITE_DISALLOWED_IDS: "" + VITE_DISALLOWED_IDS: "", }; From 228ac6fd6ccdee8aafad6550fdb9c85ad1f361a4 Mon Sep 17 00:00:00 2001 From: EPScorp Date: Fri, 1 Mar 2024 18:26:59 +0000 Subject: [PATCH 10/46] Translated using Weblate (French) Currently translated at 98.1% (321 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/fr/ Author: EPScorp --- src/assets/locales/fr.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/assets/locales/fr.json b/src/assets/locales/fr.json index 36b51133..b1e47761 100644 --- a/src/assets/locales/fr.json +++ b/src/assets/locales/fr.json @@ -117,8 +117,7 @@ "loading": "Chargement...", "noResults": "Nous n'avons rien trouvé !", "placeholder": { - "default": "Que voulez-vous voir ?", - "extra": [] + "default": "Que voulez-vous voir ?" }, "sectionTitle": "Résultats de la recherche" }, @@ -131,7 +130,9 @@ }, "morning": { "default": "Que voulez-vous regarder ce matin ?", - "extra": ["Les films, c'est comme les voyages : ça nous ouvre l'esprit"] + "extra": [ + "Les films, c'est comme les voyages : ça nous ouvre l'esprit" + ] }, "night": { "default": "Que voulez-vous regarder ce soir ?", @@ -163,7 +164,7 @@ }, "notFound": { "badge": "Introuvable", - "goHome": "Retourer à l'accueil", + "goHome": "Retourner à l'accueil", "message": "Nous avons cherché partout : sous les poubelles, dans le placard, derrière le proxy, mais nous n'avons finalement pas trouvé la page que vous cherchez.", "title": "Impossible de trouver cette page" }, From dc043901721cd0a0ed893de9c8f715737e72007d Mon Sep 17 00:00:00 2001 From: Jamie Poznanski Date: Fri, 1 Mar 2024 08:29:53 +0000 Subject: [PATCH 11/46] Translated using Weblate (Italian) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/it/ Author: Jamie Poznanski --- src/assets/locales/it.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/it.json b/src/assets/locales/it.json index 7b0b93f6..603061d1 100644 --- a/src/assets/locales/it.json +++ b/src/assets/locales/it.json @@ -30,7 +30,7 @@ "passphraseFrameLabel": "Frase password", "title": "La tua frase password" }, - "hasAccount": "Hai già un account? <0>Accedi ", + "hasAccount": "Hai già un account? <0>Accedi.", "login": { "description": "Inserisci la tua frase password per accedere al vostro account", "deviceLengthError": "Inserisci un nome per il dispositivo", @@ -57,6 +57,8 @@ }, "host": "Ti stai collegando a <0>{{hostname}} - conferma la tua fiducia prima di creare un account", "no": "Indietro", + "noHost": "Il server non è configurato, quindi non si può creare un account", + "noHostTitle": "Server non è configurato!", "title": "Ti fidi di questo server?", "yes": "Mi fido di questo server" }, From 05741ed6329ff1aeeab53cb58278ad5c118db2cf Mon Sep 17 00:00:00 2001 From: blikje Date: Thu, 29 Feb 2024 23:45:19 +0000 Subject: [PATCH 12/46] Translated using Weblate (Dutch) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/nl/ Author: blikje --- src/assets/locales/nl.json | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/assets/locales/nl.json b/src/assets/locales/nl.json index 5b1f2750..d5ca62c6 100644 --- a/src/assets/locales/nl.json +++ b/src/assets/locales/nl.json @@ -57,6 +57,8 @@ }, "host": "Je gaat zo verbinden met <0>{{hostname}}, check even of je deze link vertrouwt", "no": "Vorige pagina", + "noHost": "De server is nog niet geconfigureerd, daarom kunt u geen account aanmaken", + "noHostTitle": "Server niet geconfigureerd!", "title": "Vertrouw je deze server?", "yes": "Ik vertrouw deze server" }, @@ -118,7 +120,12 @@ "noResults": "We konden helaas niets vinden!", "placeholder": { "default": "Wat wil je graag kijken?", - "extra": [] + "extra": [ + "Wat wil je verkennen?", + "Wat staat er op jouw kijklijst?", + "Wat is jouw favoriete film?", + "Wat is jouw favoriete serie?" + ] }, "sectionTitle": "Zoekresultaten" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "Waar wil je deze ochtend naar kijken?", - "extra": ["Ik hoor dat Before Sunrise goed is"] + "extra": [ + "Ik hoor dat Before Sunrise goed is" + ] }, "night": { "default": "Wat wil je vanavond bekijken?", - "extra": ["Moe? Ik hoor dat The Exorcist goed is."] + "extra": [ + "Moe? Ik hoor dat The Exorcist goed is." + ] } } }, @@ -176,10 +187,10 @@ "back": "Terug", "explainer": "Door gebruik te maken van de browserextensie kun je de beste streams krijgen. Met slechts een eenvoudige installatie.", "explainerIos": "Helaas, de browserextensie is niet ondersteund op iOS. Druk op Terug om een andere optie te kiezen.", - "extensionHelp": "Als je de extensie hebt geïnstalleerd maar niet wordt gedetecteerd, Open dan de extensie via het extensies menu in je browser en volg de stappen op het scherm.", + "extensionHelp": "Als je de extensie hebt geïnstalleerd maar niet wordt gedetecteerd, open dan de extensie via het extensies menu in je browser en volg de stappen op het scherm.", "linkChrome": "Installeer de Chrome-extensie", "linkFirefox": "Installeer de Firefox-extensie", - "notDetecting": "Geïnstalleerd op Chrome maar wordt niet weergegeven? Probeer de pagina opnieuw te laden!", + "notDetecting": "Geïnstalleerd op Chrome, maar de site detecteert het niet? Probeer de pagina opnieuw te laden!", "notDetectingAction": "Pagina opnieuw laden", "status": { "disallowed": "Extensie is niet ingeschakeld voor deze pagina", @@ -207,7 +218,7 @@ "title": "Laten we een nieuwe proxy instellen" }, "start": { - "explainer": "Om de beste mogelijke streams te krijgen, moet je kiezen welke streamingmethode je wilt gebruiken.", + "explainer": "Om de beste streams mogelijk te krijgen, moet je kiezen welke streammethode je wilt gebruiken.", "options": { "default": { "text": "Ik wil geen streams van goede kwaliteit, <0 /> <1>Gebruik de standaardinstellingen." @@ -241,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "HLS-afspeellijstlink kopiëren", "disclaimer": "Downloads worden direct bij de bron opgehaald. movie-web heeft geen controle over het bestand dat je ontvangt.", "downloadSubtitle": "Download huidige ondertiteling", "downloadVideo": "Download filmpje", From 7f859e0bfd889e482e6b30d900b107554342c986 Mon Sep 17 00:00:00 2001 From: Raymond Nee Date: Fri, 1 Mar 2024 03:27:14 +0000 Subject: [PATCH 13/46] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/zh_Hans/ Author: Raymond Nee --- src/assets/locales/zh.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/assets/locales/zh.json b/src/assets/locales/zh.json index a7648288..248da095 100644 --- a/src/assets/locales/zh.json +++ b/src/assets/locales/zh.json @@ -57,6 +57,8 @@ }, "host": "您正在连接到 <0>{{hostname}} - 在创建账户前,确保您信任它", "no": "返回", + "noHost": "服务器尚未进行配置,因此您无法创建账户", + "noHostTitle": "未配置服务器!", "title": "您是否信任这个服务器?", "yes": "我信任这个服务器" }, From dcfbf6b2669a5e78059154a7e877dc66ef580f57 Mon Sep 17 00:00:00 2001 From: Aayush Shah Date: Thu, 29 Feb 2024 23:44:32 +0000 Subject: [PATCH 14/46] Translated using Weblate (Nepali) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ne/ Author: Aayush Shah --- src/assets/locales/ne.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/assets/locales/ne.json b/src/assets/locales/ne.json index 985d5189..9250fbc9 100644 --- a/src/assets/locales/ne.json +++ b/src/assets/locales/ne.json @@ -57,6 +57,8 @@ }, "host": "तपाइँ <0>{{hostname}} मा कनेक्ट हुनुहुन्छ - कृपया खाता बनाउनु अघि तपाइँ यसलाई विश्वास गर्नुहुन्छ भनेर पुष्टि गर्नुहोस्", "no": "पछाडी जाउ", + "noHost": "सर्भर कन्फिगर गरिएको छैन, त्यसैले तपाईंले खाता सिर्जना गर्न सक्नुहुन्न", + "noHostTitle": "सर्भर कन्फिगर गरिएको छैन!", "title": "के तपाइँ यो सर्भरमा भरोसा गर्नुहुन्छ?", "yes": "म यो सर्भरलाई भरोसा गर्छु" }, From 2804b2addd89d9d5ebe4051cd53b9aa4a7cad8ce Mon Sep 17 00:00:00 2001 From: n1ck Date: Fri, 1 Mar 2024 10:10:42 +0000 Subject: [PATCH 15/46] Translated using Weblate (Spanish) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/es/ Author: n1ck --- src/assets/locales/es.json | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/assets/locales/es.json b/src/assets/locales/es.json index a57cd198..d664c598 100644 --- a/src/assets/locales/es.json +++ b/src/assets/locales/es.json @@ -57,6 +57,8 @@ }, "host": "Te estás conectando a <0>{{hostname}} - por favor, confirma si confías en este antes de crear una cuenta", "no": "Regresar", + "noHost": "El servidor no se ha configurado, por lo tanto, no puede crear una cuenta", + "noHostTitle": "¡El servidor no está configurado!", "title": "¿Confías en este servidor?", "yes": "Confío en este servidor" }, @@ -118,7 +120,12 @@ "noResults": "¡No pudimos encontrar nada!", "placeholder": { "default": "¿Qué te gustaría ver?", - "extra": [] + "extra": [ + "¿Qué quieres explorar?", + "¿Qué hay en tu lista de reproducción?", + "¿Cuál es tu película favorita?", + "¿Cuál es tu serie favorita?" + ] }, "sectionTitle": "Resultados de búsqueda" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "¿Qué te gustaría ver esta mañana?", - "extra": ["Escuché que “Antes del amanecer” es buena"] + "extra": [ + "Escuché que “Antes del amanecer” es buena" + ] }, "night": { "default": "¿Qué te gustaría ver esta noche?", - "extra": ["¿Cansado? Escuché que “El Exorcista” es buena."] + "extra": [ + "¿Cansado? Escuché que “El Exorcista” es buena." + ] } } }, From 2a3ae861cc1cafa94996a25d39479d0d6c22fa2b Mon Sep 17 00:00:00 2001 From: Aayush Shah Date: Thu, 29 Feb 2024 23:45:50 +0000 Subject: [PATCH 16/46] Translated using Weblate (Hindi) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/hi/ Author: Aayush Shah --- src/assets/locales/hi.json | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/assets/locales/hi.json b/src/assets/locales/hi.json index 7f1dfe00..eab0a337 100644 --- a/src/assets/locales/hi.json +++ b/src/assets/locales/hi.json @@ -57,6 +57,8 @@ }, "host": "आप <0>{{hostname}} से कनेक्ट हो रहे हैं - खाता बनाने से पहले कृपया पुष्टि करें कि आप इस पर भरोसा करते हैं", "no": "पीछे जाये", + "noHost": "सर्वर कॉन्फ़िगर नहीं किया गया है, इसलिए आप खाता नहीं बना सकते", + "noHostTitle": "सर्वर कॉन्फ़िगर नहीं है!", "title": "क्या आपको इस सर्वर पर भरोसा है?", "yes": "मुझे इस सर्वर पर भरोसा है" }, @@ -118,7 +120,12 @@ "noResults": "हमें कुछ नहीं मिला!", "placeholder": { "default": "क्या देखना चाहते हो?", - "extra": [] + "extra": [ + "आप क्या अन्वेषण करना चाहते हैं?", + "आपकी वॉचलिस्ट में क्या है?", + "आपकी पसंदीदा फिल्म कौनसी है?", + "आपकी पसंदीदा सीरीज़ कौन सी है?" + ] }, "sectionTitle": "खोज के परिणाम" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "आप आज सुबह को क्या देखना चाहेंगे?", - "extra": ["मैंने सुना है सूर्योदय से पहले ठीक है"] + "extra": [ + "मैंने सुना है सूर्योदय से पहले ठीक है" + ] }, "night": { "default": "आप आज रात को क्या देखना चाहेंगे?", - "extra": ["थके हुए हो? मैंने सुना एक्सोरसिस्ट अच्छी मूवी है।"] + "extra": [ + "थके हुए हो? मैंने सुना एक्सोरसिस्ट अच्छी मूवी है।" + ] } } }, @@ -241,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "HLS प्लेलिस्ट लिंक कॉपी करें", "disclaimer": "डाउनलोड सीधे प्रदाता से लिए जाते हैं। मूवी-वेब का इस पर नियंत्रण नहीं है कि डाउनलोड कैसे प्रदान किए जाते हैं।", "downloadSubtitle": "वर्तमान उपशीर्षक डाउनलोड करें", "downloadVideo": "वीडियो डाउनलोड करें", From 00700408fb0f1f4655c6c2a3675116ee0667474a Mon Sep 17 00:00:00 2001 From: Mehdi Date: Fri, 1 Mar 2024 16:15:24 +0000 Subject: [PATCH 17/46] Translated using Weblate (Persian) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/fa/ Author: Mehdi --- src/assets/locales/fa.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/assets/locales/fa.json b/src/assets/locales/fa.json index 5b4a0ba8..ef11d120 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -57,6 +57,8 @@ }, "host": "شما در حال اتصال به <0>{{hostname}} هستید - لطفا قبل از ایجاد حساب کاربری خود از اعتماد به آن اطمینان حاصل کنید", "no": "بازگشت", + "noHost": "سرور پیکربندی نشده، بنابرین نمیتوانید حسابی ایجاد کنید", + "noHostTitle": "سرور پیکر بندی نشده!", "title": "آیا به این سرور اعتماد دارید؟", "yes": "بله اعتماد دارم" }, From e24697f7238e1a23579da30d16a93a3b2d45369d Mon Sep 17 00:00:00 2001 From: NidaleNieve Date: Sat, 2 Mar 2024 01:26:01 +0000 Subject: [PATCH 18/46] Translated using Weblate (Icelandic) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/is/ Author: NidaleNieve --- src/assets/locales/is-IS.json | 46 +++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/assets/locales/is-IS.json b/src/assets/locales/is-IS.json index d76ad65f..dde299fb 100644 --- a/src/assets/locales/is-IS.json +++ b/src/assets/locales/is-IS.json @@ -1,9 +1,9 @@ { "about": { - "description": "movie-web er vefforrit sem leitar á netinu að straumum. Markmið liðsins er naumhyggju nálgun á að horfa á efni.", + "description": "movie-web er vefforrit sem leitar á netinu að streymum. Markmið liðsins er naumhyggju nálgun á að horfa á efni.", "faqTitle": "Algengar spurningar", "q1": { - "body": "movie-web hýsir ekki neitt efni. Þegar þú ýtir á eitthvað til að horfa á, leitað er á netinu fyrir það efni (Þú getur séð hvaða heimild við erum að nota á hleðslu skjánum og í 'myndbands heimildir' flipanum). Skrár eru aldrei settar in af movie-web, allt er í gegnum leitarvél.", + "body": "movie-web hýsir ekki neitt efni. Þegar þú ýtir á eitthvað til að horfa á, er leitað á netinu fyrir það efni (Þú getur séð hvaða heimild við erum að nota á hleðslu skjánum og í 'myndbands heimildir' flipanum). Skrár eru aldrei settar inn af movie-web, allt er í gegnum leitarvél.", "title": "Hvaðan kemur efnið?" }, "q2": { @@ -11,7 +11,7 @@ "title": "Hvar get ég beðið um þætti eða myndir?" }, "q3": { - "body": "Okkar leitar niðurstöður eru knúnar af The Movie Database (TMDB) og eru sýndar þótt að okkar heimildir hafa ekki efnið.", + "body": "Leitarniðurstöður okkar eru knúnar af The Movie Database (TMDB) og eru sýndar þótt að heimildir okkar hafa ekki efnið.", "title": "Leitarniðurstöðurnar sýna þættina eða myndina, af hverju get ég ekki spilað það?" }, "title": "Um movie-web" @@ -57,6 +57,8 @@ }, "host": "Þú ert að tengjast við <0>{{hostname}} - vinsamlegast staðfestu að þú treystir því áður en þú býrð til reikning", "no": "Fara til baka", + "noHost": "Netjónninn hefur ekki verið stilltur, þess vegna getur þú ekki búið til reikning", + "noHostTitle": "Netþjónn ekki stilltur!", "title": "Treystir þú þessum netþjóni?", "yes": "Ég treysti þessum netþjóni" }, @@ -82,13 +84,21 @@ "disclaimer": "Fyrirvari", "disclaimerText": "movie-web hýsir engar skrár, það tengist eingöngu þjónustu þriðja aðila. Lagleg atriði ættu að vera rædd við skráarhýsinga og veitanda. movie-web er ekki ábyrg fyrir neinum skrám sýndar af myndbands veitöndum." }, + "links": { + "discord": "Discord", + "dmca": "DMCA", + "github": "GitHub" + }, "tagline": "Horfðu á uppáhalds þætti og myndirnar þínar með þessu opna hugbúnaða forriti." }, "global": { + "name": "movie-web", "pages": { "about": "Um", + "dmca": "DMCA", "login": "Skrá inn", "onboarding": "Setja upp", + "pagetitle": "{{title}} - movie-web", "register": "Skrá", "settings": "Stillingar" } @@ -110,7 +120,12 @@ "noResults": "Við gátum ekki fundið neitt!", "placeholder": { "default": "Hvað viltu horfa á?", - "extra": [] + "extra": [ + "Hvað viltu kanna?", + "Hvað er á áhorfslistanum þínum?", + "Hvað er uppáhalds bíómyndin þín?", + "Hvað er uppáhalds þáttaröðin þín?" + ] }, "sectionTitle": "Leitar niðurstöður" }, @@ -123,11 +138,15 @@ }, "morning": { "default": "Hvað myndirðu vilja horfa á þessum morgni?", - "extra": ["Ég heyrði að Before Sunrise sé góð"] + "extra": [ + "Ég heyrði að Before Sunrise sé góð" + ] }, "night": { "default": "Hvað myndirðu vilja horfa á í nótt?", - "extra": ["Þreytt? Ég heyrði að The Exorcist sé góð."] + "extra": [ + "Þreytt? Ég heyrði að The Exorcist sé góð." + ] } } }, @@ -191,7 +210,8 @@ "errorConnection": "Gat ekki tengst umboð", "errorInvalidUrl": "Ekki gildur hlekkur", "errorNotProxy": "Bjóst við umboði en fékk heimasíðu", - "label": "Umboðs hlekkur" + "label": "Umboðs hlekkur", + "placeholder": "https://" }, "link": "Lærðu hvernig þú býrð til umboð", "submit": "Staðfesta umboð", @@ -232,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "Afrita HLS spilalista hlekk", "disclaimer": "Niðurhalningar eru teknar beint frá heimildini. movie-web hefur engan kraft yfir hvernig niðurhalningarnar eru gefnar.", "downloadSubtitle": "Hlaða niður nú verandi texta", "downloadVideo": "Hlaða niður myndbandi", @@ -372,7 +393,10 @@ } }, "time": { - "remaining": "{{timeLeft}} er eftir • Þú klárar {{timeFinished, datetime}}" + "regular": "{{timeWatched}} / {{duration}}", + "remaining": "{{timeLeft}} er eftir • Þú klárar {{timeFinished, datetime}}", + "shortRegular": "{{timeWatched}}", + "shortRemaining": "-{{timeLeft}}" }, "turnstile": { "description": "Vinsamlegast sannreyndu að þú sért manneskja með því að klára Captcha-ið til hægri. Þetta er til þess að halda movie-web öruggu!", @@ -383,7 +407,8 @@ }, "screens": { "dmca": { - "text": "Velkomin á sambands síðu movie-web! Við virðum hugverkarétt og viljum ræða einhver höfundarréttar áhyggjur fljótt. Ef að þú trúir að höfundarréttur þíns verks hefur verið misnotaður á okkar síðu, vinsamlegast sentu ítarlega DMCA tilkynningu til netfangsing fyrir neðan þennan texta. Vinsamlegast láttu fylgja með lýsingu af höfundaréttavarna efninu, tengiliða upplýsingat þínar, og yfirlýsingu um góða trú. Við erum staðráðin í að leysa þessi mál tafarlaust og þökkum samstarf þitt við að halda movie-web stað sem virðir sköpunargáfu og höfundarrétt." + "text": "Velkomin á sambands síðu movie-web! Við virðum hugverkarétt og viljum ræða einhver höfundarréttar áhyggjur fljótt. Ef að þú trúir að höfundarréttur þíns verks hefur verið misnotaður á okkar síðu, vinsamlegast sentu ítarlega DMCA tilkynningu til netfangsing fyrir neðan þennan texta. Vinsamlegast láttu fylgja með lýsingu af höfundaréttavarna efninu, tengiliða upplýsingat þínar, og yfirlýsingu um góða trú. Við erum staðráðin í að leysa þessi mál tafarlaust og þökkum samstarf þitt við að halda movie-web stað sem virðir sköpunargáfu og höfundarrétt.", + "title": "DMCA" }, "loadingApp": "Hlaðandi forriti", "loadingUser": "Hlaðandi þínum reikningi", @@ -482,7 +507,8 @@ "description": "Til að láta forritið virka, allri umboð er beint í gegnum umboð. Virktu þetta ef þú villt koma með þína eigin starfsmenn. <0>Leiðbeiningar.", "emptyState": "Engir starfsmenn komnir, bættu við einum fyir neðan þennan texta", "label": "Notaðu sérsniðaða umboðs starfsmenn", - "urlLabel": "Starfsmanna hlekkir" + "urlLabel": "Starfsmanna hlekkir", + "urlPlaceholder": "https://" } }, "preferences": { From 5e0b434ea722530f0b8233b0c606badd9ddbae40 Mon Sep 17 00:00:00 2001 From: aryiu Date: Sat, 2 Mar 2024 19:24:01 +0000 Subject: [PATCH 19/46] Added translation using Weblate (Valencian) Author: aryiu --- src/assets/locales/ca@valencia.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/assets/locales/ca@valencia.json diff --git a/src/assets/locales/ca@valencia.json b/src/assets/locales/ca@valencia.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/src/assets/locales/ca@valencia.json @@ -0,0 +1 @@ +{} From 49fe07b20808d2e776f10bfce2db5b122c2b274c Mon Sep 17 00:00:00 2001 From: Mehdi Date: Sat, 2 Mar 2024 06:22:08 +0000 Subject: [PATCH 20/46] Translated using Weblate (Persian) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/fa/ Author: Mehdi --- src/assets/locales/fa.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/locales/fa.json b/src/assets/locales/fa.json index ef11d120..16e6a8a3 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -73,7 +73,7 @@ } }, "errors": { - "badge": "مشکلی پیش آمده", + "badge": "مشکلی رخ داده", "details": "جزئیات خطا", "reloadPage": "صفحه را دوباره بارگذاری کنید", "showError": "نمایش جزئیات خطا", From 9c03cef9419b69c4df36b0ed94428d0bab9792f4 Mon Sep 17 00:00:00 2001 From: Fluhfi Date: Sat, 2 Mar 2024 02:19:27 +0000 Subject: [PATCH 21/46] Translated using Weblate (Punjabi) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/pa/ Author: Fluhfi --- src/assets/locales/pa.json | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/assets/locales/pa.json b/src/assets/locales/pa.json index ebc8887d..bb0d0812 100644 --- a/src/assets/locales/pa.json +++ b/src/assets/locales/pa.json @@ -57,6 +57,8 @@ }, "host": "ਤੁਸੀਂ <0>{{hostname}} ਨਾਲ ਜੁੜ ਰਹੇ ਹੋ - ਕਿਰਪਾ ਕਰਕੇ ਖਾਤਾ ਬਣਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਤੁਸੀਂ ਇਸ 'ਤੇ ਭਰੋਸਾ ਕਰਦੇ ਹੋ", "no": "ਵਾਪਸ ਜਾਓ", + "noHost": "ਸਰਵਰ ਕੌਂਫਿਗਰ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ, ਇਸਲਈ ਤੁਸੀਂ ਖਾਤਾ ਨਹੀਂ ਬਣਾ ਸਕਦੇ ਹੋ", + "noHostTitle": "ਸਰਵਰ ਕੌਂਫਿਗਰ ਨਹੀਂ ਕੀਤਾ ਗਿਆ!", "title": "ਕੀ ਤੁਸੀਂ ਇਸ ਸਰਵਰ 'ਤੇ ਭਰੋਸਾ ਕਰਦੇ ਹੋ?", "yes": "ਮੈਨੂੰ ਇਸ ਸਰਵਰ 'ਤੇ ਭਰੋਸਾ ਹੈ" }, @@ -118,7 +120,12 @@ "noResults": "ਅਸੀਂ ਕੁਝ ਵੀ ਨਹੀਂ ਲੱਭ ਸਕੇ!", "placeholder": { "default": "ਤੁਸੀਂ ਕੀ ਦੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?", - "extra": [] + "extra": [ + "ਤੁਸੀਂ ਕੀ ਪੜਚੋਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?", + "ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ ਸੂਚੀ ਵਿੱਚ ਕੀ ਹੈ?", + "ਤੁਹਾਡੀ ਮਨਪਸੰਦ ਫਿਲਮ ਕਿਹੜੀ ਹੈ?", + "ਤੁਹਾਡੀ ਮਨਪਸੰਦ ਲੜੀ ਕਿਹੜੀ ਹੈ?" + ] }, "sectionTitle": "ਖੋਜ ਨਤੀਜੇ" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "ਤੁਸੀਂ ਅੱਜ ਸਵੇਰੇ ਕੀ ਦੇਖਣਾ ਚਾਹੋਗੇ?", - "extra": ["ਮੈਂ ਸੁਣਦਾ ਹਾਂ ਕਿ ਸੂਰਜ ਚੜ੍ਹਨ ਤੋਂ ਪਹਿਲਾਂ ਚੰਗਾ ਹੁੰਦਾ ਹੈ"] + "extra": [ + "ਮੈਂ ਸੁਣਦਾ ਹਾਂ ਕਿ ਸੂਰਜ ਚੜ੍ਹਨ ਤੋਂ ਪਹਿਲਾਂ ਚੰਗਾ ਹੁੰਦਾ ਹੈ" + ] }, "night": { "default": "ਤੁਸੀਂ ਅੱਜ ਰਾਤ ਕੀ ਦੇਖਣਾ ਚਾਹੋਗੇ?", - "extra": ["ਥੱਕ ਗਏ? ਮੈਂ ਸੁਣਿਆ ਹੈ ਕਿ Exorcist ਚੰਗਾ ਹੈ."] + "extra": [ + "ਥੱਕ ਗਏ? ਮੈਂ ਸੁਣਿਆ ਹੈ ਕਿ Exorcist ਚੰਗਾ ਹੈ." + ] } } }, @@ -241,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "HLS ਪਲੇਲਿਸਟ ਲਿੰਕ ਕਾਪੀ ਕਰੋ", "disclaimer": "ਡਾਊਨਲੋਡ ਸਿੱਧੇ ਪ੍ਰਦਾਤਾ ਤੋਂ ਲਏ ਜਾਂਦੇ ਹਨ. ਮੂਵੀ-ਵੈੱਬ ਦਾ ਇਸ 'ਤੇ ਕੰਟਰੋਲ ਨਹੀਂ ਹੈ ਕਿ ਡਾਊਨਲੋਡ ਕਿਵੇਂ ਪ੍ਰਦਾਨ ਕੀਤੇ ਜਾਂਦੇ ਹਨ.", "downloadSubtitle": "ਮੌਜੂਦਾ ਉਪਸਿਰਲੇਖ ਡਾਊਨਲੋਡ ਕਰੋ", "downloadVideo": "ਵੀਡੀਓ ਡਾਊਨਲੋਡ ਕਰੋ", From f89759e9b97da8002ddc10216624e42a0595ad0b Mon Sep 17 00:00:00 2001 From: aryiu Date: Sat, 2 Mar 2024 15:25:46 +0000 Subject: [PATCH 22/46] Translated using Weblate (Catalan) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ca/ Author: aryiu --- src/assets/locales/ca.json | 82 +++++++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 11 deletions(-) diff --git a/src/assets/locales/ca.json b/src/assets/locales/ca.json index a8d7e05d..6d663790 100644 --- a/src/assets/locales/ca.json +++ b/src/assets/locales/ca.json @@ -57,6 +57,8 @@ }, "host": "Us esteu connectant a <0>{{hostname}}. Confirmeu que hi confieu abans de crear un compte", "no": "Torna", + "noHost": "El servidor no s'ha configurat, per tant, no es pot crear un compte", + "noHostTitle": "El servidor no està configurat!", "title": "Confieu en aquest servidor?", "yes": "Confie en aquest servidor" }, @@ -95,6 +97,7 @@ "about": "Quant a", "dmca": "DMCA", "login": "Inicia sessió", + "onboarding": "Configura", "pagetitle": "{{title}} - movie-web", "register": "Registra", "settings": "Configuració" @@ -117,7 +120,12 @@ "noResults": "No hem pogut trobar res!", "placeholder": { "default": "Què voleu mirar?", - "extra": [] + "extra": [ + "Què voleu explorar?", + "Què hi ha a la vostra llista de seguiment?", + "Quina és la vostra pel·lícula preferida?", + "Quina és la vostra sèrie preferida?" + ] }, "sectionTitle": "Resultats de la cerca" }, @@ -130,11 +138,15 @@ }, "morning": { "default": "Què us agradaria mirar aquest matí?", - "extra": ["He sentit que «Abans de l'alba» és bona"] + "extra": [ + "He sentit que «Abans de l'alba» és bona" + ] }, "night": { "default": "Què us agradaria mirar aquesta nit?", - "extra": ["Esteu cansat? He sentit que «L'exorcista» és bona."] + "extra": [ + "Esteu cansat? He sentit que «L'exorcista» és bona." + ] } } }, @@ -167,22 +179,37 @@ "onboarding": { "defaultConfirm": { "cancel": "Cancel·la", + "confirm": "Usa la configuració per defecte", + "description": "La configuració per defecte no té els millors fluxos i pot ser insuportablement lenta.", "title": "Segur?" }, "extension": { "back": "Torna", + "explainer": "Mitjançant l'extensió del navegador, podeu obtenir els millors fluxos que oferim. Amb només una simple instal·lació.", + "explainerIos": "Lamentablement, l'extensió del navegador no és compatible amb iOS, premeu Torna per a triar una altra opció.", + "extensionHelp": "Si heu instal·lat l'extensió, però no es detecta, obriu l'extensió al menú d'extensions del navegador i seguiu els passos en pantalla.", "linkChrome": "Instal·la l'extensió de Chrome", "linkFirefox": "Instal·la l'extensió de Firefox", + "notDetecting": "S'ha instal·lat a Chrome, però el lloc no el detecta? Proveu de recarregar la pàgina.", "notDetectingAction": "Recarrega la pàgina", "status": { - "disallowedAction": "Activa l'extensió" + "disallowed": "L'extensió no està activada per a aquesta pàgina", + "disallowedAction": "Activa l'extensió", + "failed": "No s'ha pogut sol·licitar l'estat", + "loading": "Esperant que instal·leu l'extensió", + "outdated": "La versió de l'extensió és massa antiga", + "success": "L'extensió funciona com s'esperava!" }, - "submit": "Continua" + "submit": "Continua", + "title": "Comencem amb una extensió" }, "proxy": { "back": "Torna", + "explainer": "Amb el mètode del servidor intermediari, podeu obtenir fluxos d'alta qualitat fent un servidor intermediari propi.", "input": { + "errorConnection": "No s'ha pogut connectar al servidor intermediari", "errorInvalidUrl": "URL no vàlid", + "errorNotProxy": "S'esperava un servidor intermediari, però és un lloc web", "label": "URL del servidor intermediari", "placeholder": "https://" }, @@ -191,15 +218,25 @@ "title": "Fem un nou servidor intermediari" }, "start": { + "explainer": "Per a obtenir els millors fluxos possibles, haureu de triar quin mètode de transmissió voleu utilitzar.", "options": { + "default": { + "text": "No vull fluxos de bona qualitat,<0 /> <1>utilitza la configuració per defecte" + }, "extension": { "action": "Instal·la l'extensió", - "quality": "Millor qualitat" + "description": "Instal·leu l'extensió del navegador i accediu a les millors fonts.", + "quality": "Millor qualitat", + "title": "Extensió del navegador" }, "proxy": { - "action": "Configura el servidor intermediari" + "action": "Configura el servidor intermediari", + "description": "Configureu un servidor intermediari en només 5 minuts i accediu a bones fonts.", + "quality": "Bona qualitat", + "title": "Servidor intermediari personalitzat" } - } + }, + "title": "Configurem el movie-web" } }, "overlays": { @@ -215,10 +252,11 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "Copia l'enllaç de la llista HLS", "disclaimer": "Les baixades s'obtenen directament del proveïdor. movie-web no té control sobre com es proporcionen les baixades.", "downloadSubtitle": "Baixa els subtítols actuals", "downloadVideo": "Baixa el vídeo", - "hlsDisclaimer": "Les baixades s'obtenen directament del proveïdor. movie-web no té control sobre com es proporcionen les baixades. Tingueu en compte que esteu baixant una llista de reproducció HLS, destinada als usuaris familiaritzats amb la transmissió multimèdia avançada.", + "hlsDisclaimer": "Les baixades s'obtenen directament del proveïdor. movie-web no té control sobre com es proporcionen les baixades.

Tingueu en compte que esteu baixant una llista de reproducció HLS, no es recomana baixar-la si no esteu familiaritzat amb formats de transmissió avançats. Proveu diferents fonts per a diferents formats.", "onAndroid": { "1": "Per a baixar-lo a Android, feu clic al botó de baixada i, a la pàgina nova, manteniu premut el vídeo i, a continuació, seleccioneu Desa.", "shortTitle": "Baixa / Android", @@ -301,8 +339,15 @@ }, "dmca": { "badge": "Eliminat", + "text": "Aquest contingut ja no està disponible a causa d'un avís de retirada o d'una reclamació de drets d'autor.", "title": "El contingut s'ha eliminat" }, + "extensionPermission": { + "badge": "Falta el permís", + "button": "Utilitza l'extensió", + "text": "Teniu l'extensió del navegador, però necessitem el vostre permís per a començar a utilitzar l'extensió.", + "title": "Configureu l'extensió" + }, "failed": { "badge": "Ha fallat", "homeButton": "Vés a l'inici", @@ -436,11 +481,25 @@ }, "setup": { "doSetup": "Configura", + "errorStatus": { + "description": "Sembla que heu de revisar un o més elements de la configuració.", + "title": "S'ha de revisar algun element" + }, + "itemError": "Hi ha alguna cosa malament en la configuració. Torneu a fer la configuració per a solucionar-ho.", "items": { "default": "Configuració per defecte", - "extension": "Extensió" + "extension": "Extensió", + "proxy": "Servidor personalitzat" }, - "redoSetup": "Reconfigura" + "redoSetup": "Reconfigura", + "successStatus": { + "description": "Tot està preparat perquè comenceu a mirar el vostre contingut preferit.", + "title": "Tot està configurat!" + }, + "unsetStatus": { + "description": "Feu clic al botó de la dreta per a iniciar el procés de configuració.", + "title": "No heu fet la configuració" + } }, "title": "Connexions", "workers": { @@ -456,6 +515,7 @@ "language": "Llengua de l'aplicació", "languageDescription": "La llengua s'aplica a tota l'aplicació.", "thumbnail": "Genera miniatures", + "thumbnailDescription": "Majoritàriament, els vídeos no tenen miniatures. Podeu activar aquesta opció per a generar-les sobre la marxa, però poden alentir el vídeo.", "thumbnailLabel": "Genera miniatures", "title": "Configuració" }, From 56413183b67f001fc06a1e8d6c6a3afcb6d432a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matic=20Bon=C4=8Dina?= Date: Sun, 3 Mar 2024 09:23:21 +0000 Subject: [PATCH 23/46] Translated using Weblate (Slovenian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/sl/ Author: Matic Bončina --- src/assets/locales/sl.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/assets/locales/sl.json b/src/assets/locales/sl.json index 4b1a9f70..4b048f45 100644 --- a/src/assets/locales/sl.json +++ b/src/assets/locales/sl.json @@ -57,6 +57,8 @@ }, "host": "Povezujete se z <0>{{hostname}} - pred ustvarjanjem računa potrdite, da mu zaupate", "no": "Nazaj", + "noHost": "Strežnik ni nastavljen, zato ustvarjanje profila ni mogoče", + "noHostTitle": "Strežnik ni nastavljen!", "title": "Ali zaupate temu strežniku?", "yes": "Zaupam strežniku" }, From dc4ce9b91fb098c561d2524004a85be84e436138 Mon Sep 17 00:00:00 2001 From: aryiu Date: Sat, 2 Mar 2024 19:42:16 +0000 Subject: [PATCH 24/46] Translated using Weblate (Catalan) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ca/ Author: aryiu --- src/assets/locales/ca.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/ca.json b/src/assets/locales/ca.json index 6d663790..aa0888bb 100644 --- a/src/assets/locales/ca.json +++ b/src/assets/locales/ca.json @@ -3,7 +3,7 @@ "description": "movie-web és una aplicació web que cerca fluxos a internet. L'equip té com a objectiu un enfocament majoritàriament minimalista del consum de contingut.", "faqTitle": "Preguntes freqüents", "q1": { - "body": "movie-web no allotja cap contingut. Quan feu clic a alguna cosa per a mirar-la, es busca a Internet el contingut seleccionat (a la pantalla de càrrega i a la pestanya «Fonts de vídeo» podeu veure quina font utilitzeu). movie-web mai hi puja contingut, tot és a través d'aquest mecanisme de cerca.", + "body": "movie-web no allotja cap contingut. Quan feu clic a un contingut per a mirar-lo, es busca a Internet (a la pantalla de càrrega i a la pestanya «Fonts de vídeo» podeu veure quina font utilitzeu). movie-web mai hi puja contingut, tot és a través d'aquest mecanisme de cerca.", "title": "D'on prové el contingut?" }, "q2": { @@ -503,7 +503,7 @@ }, "title": "Connexions", "workers": { - "addButton": "Afig un «worker»", + "addButton": "Afegeix un «worker»", "description": "Per fer funcionar l'aplicació, tot el trànsit s'encamina a través de servidors intermediaris. Activeu-ho si voleu portar els vostres propis «workers». <0>Instruccions.", "emptyState": "Encara no hi ha «workers», afegiu-ne un a continuació", "label": "Utilitza «workers» intermediaris personalitzats", From 078777f952879aa8cab6fdabc0b7aee0f141d6e8 Mon Sep 17 00:00:00 2001 From: aryiu Date: Sat, 2 Mar 2024 19:30:55 +0000 Subject: [PATCH 25/46] Translated using Weblate (Valencian) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ca@valencia/ Author: aryiu --- src/assets/locales/ca@valencia.json | 548 +++++++++++++++++++++++++++- 1 file changed, 547 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/ca@valencia.json b/src/assets/locales/ca@valencia.json index 0967ef42..8f883342 100644 --- a/src/assets/locales/ca@valencia.json +++ b/src/assets/locales/ca@valencia.json @@ -1 +1,547 @@ -{} +{ + "about": { + "description": "movie-web és una aplicació web que cerca fluxos a internet. L'equip té com a objectiu un enfocament majoritàriament minimalista del consum de contingut.", + "faqTitle": "Preguntes freqüents", + "q1": { + "body": "movie-web no allotja cap contingut. Quan feu clic en un contingut per a mirar-lo, es busca a Internet (a la pantalla de càrrega i a la pestanya «Fonts de vídeo» podeu mirar quina font utilitzeu). movie-web mai puja contingut, tot és a través del mecanisme de cerca.", + "title": "D'on prové el contingut?" + }, + "q2": { + "body": "No és possible sol·licitar un programa o una pel·lícula, movie-web no gestiona cap contingut. Tot el contingut es visualitza a través de fonts a internet.", + "title": "On puc sol·licitar un programa o una pel·lícula?" + }, + "q3": { + "body": "Els resultats de cerca funcionen amb The Movie Database (TMDB) i es mostren independentment de si les nostres fonts realment tenen el contingut.", + "title": "Els resultats de la cerca mostren el programa o la pel·lícula, per què no puc reproduir-lo?" + }, + "title": "Sobre movie-web" + }, + "actions": { + "copied": "S'ha copiat", + "copy": "Copia" + }, + "auth": { + "createAccount": "Encara no teniu un compte? <0>Creeu un compte.", + "deviceNameLabel": "Nom del dispositiu", + "deviceNamePlaceholder": "Telèfon personal", + "generate": { + "description": "La frase de contrasenya actua com a nom d'usuari i contrasenya. Assegureu-vos de mantindre-la segura, ja que haureu d'introduir-la per a iniciar la sessió al vostre compte", + "next": "He desat la frase de contrasenya", + "passphraseFrameLabel": "Frase de contrasenya", + "title": "La vostra frase de contrasenya" + }, + "hasAccount": "Ja teniu un compte? <0>Inicieu sessió ací.", + "login": { + "description": "Introduïu la vostra frase de contrasenya per a iniciar sessió al vostre compte", + "deviceLengthError": "Introduïu un nom per al dispositiu", + "passphraseLabel": "Frase de contrasenya de 12 paraules", + "passphrasePlaceholder": "Frase de contrasenya", + "submit": "Inicia sessió", + "title": "Inicieu sessió al vostre compte", + "validationError": "Frase de contrasenya incorrecta o incompleta" + }, + "register": { + "information": { + "color1": "Color de perfil 1", + "color2": "Color de perfil 2", + "header": "Introduïu un nom per al dispositiu i trieu els colors i la icona d'usuari que vulgueu", + "icon": "Icona d'usuari", + "next": "Següent", + "title": "Informació del compte" + } + }, + "trust": { + "failed": { + "text": "L'heu configurada correctament?", + "title": "No s'ha pogut accedir al servidor" + }, + "host": "Esteu connectant-vos a <0>{{hostname}}. Confirmeu que hi confieu abans de crear un compte", + "no": "Torna", + "noHost": "El servidor no s'ha configurat, per tant, no es pot crear un compte", + "noHostTitle": "El servidor no està configurat!", + "title": "Confieu en este servidor?", + "yes": "Confie en este servidor" + }, + "verify": { + "description": "Introduïu la vostra frase de contrasenya anterior per a confirmar que l'heu desat, i crear el compte", + "invalidData": "La data no és vàlida", + "noMatch": "La frase de contrasenya no coincideix", + "passphraseLabel": "Frase de contrasenya de 12 paraules", + "recaptchaFailed": "Ha fallat la validació de ReCaptcha", + "register": "Crea el compte", + "title": "Confirmeu la frase de contrasenya" + } + }, + "errors": { + "badge": "S'ha trencat", + "details": "Detalls de l'error", + "reloadPage": "Recarrega la pàgina", + "showError": "Mostra els detalls de l'error", + "title": "Hem trobat un error!" + }, + "footer": { + "legal": { + "disclaimer": "Avís d'exempció de responsabilitat", + "disclaimerText": "movie-web no allotja cap fitxer, només enllaça a serveis de tercers. Els problemes legals s'han d'abordar amb qui allotja i els proveïdors de fitxers. movie-web no es fa responsable del contingut mostrat pels proveïdors de vídeo." + }, + "links": { + "discord": "Discord", + "dmca": "DMCA", + "github": "GitHub" + }, + "tagline": "Mireu els vostres programes i pel·lícules preferits amb esta aplicació de codi obert de reproducció en temps real." + }, + "global": { + "name": "movie-web", + "pages": { + "about": "Quant a", + "dmca": "DMCA", + "login": "Inicia sessió", + "onboarding": "Configura", + "pagetitle": "{{title}} - movie-web", + "register": "Registra", + "settings": "Configuració" + } + }, + "home": { + "bookmarks": { + "sectionTitle": "Marcadors" + }, + "continueWatching": { + "sectionTitle": "Continueu mirant" + }, + "mediaList": { + "stopEditing": "Deixa d'editar" + }, + "search": { + "allResults": "Això és tot el que tenim!", + "failed": "No s'ha pogut trobar cap contingut, torneu-ho a provar!", + "loading": "S'està carregant…", + "noResults": "No hem pogut trobar res!", + "placeholder": { + "default": "Què voleu mirar?", + "extra": [ + "Què voleu explorar?", + "Què hi ha a la vostra llista de seguiment?", + "Quina és la vostra pel·lícula preferida?", + "Quina és la vostra sèrie preferida?" + ] + }, + "sectionTitle": "Resultats de la cerca" + }, + "titles": { + "day": { + "default": "Què vos agradaria mirar esta vesprada?", + "extra": [ + "Voleu aventura? Jurassic Park podria ser l'elecció perfecta." + ] + }, + "morning": { + "default": "Què vos agradaria mirar este matí?", + "extra": [ + "He sentit que «Abans de l'alba» és bona" + ] + }, + "night": { + "default": "Què vos agradaria mirar esta nit?", + "extra": [ + "Esteu cansat? He sentit que «L'exorcista» és bona." + ] + } + } + }, + "media": { + "episodeDisplay": "T{{season}} E{{episode}}", + "types": { + "movie": "Pel·lícula", + "show": "Sèrie/Programa" + } + }, + "navigation": { + "banner": { + "offline": "Comproveu la connexió a internet" + }, + "menu": { + "about": "Quant a nosaltres", + "donation": "Feu una donació", + "logout": "Tanca la sessió", + "register": "Sincronitza al núvol", + "settings": "Configuració", + "support": "Ajuda" + } + }, + "notFound": { + "badge": "No s'ha trobat", + "goHome": "Torna a l'inici", + "message": "Hem mirat per tot arreu: davall de les papereres, a l'armari, darrere del servidor intermediari, però al remat no hem pogut trobar la pàgina que busqueu.", + "title": "No s'ha pogut trobar la pàgina" + }, + "onboarding": { + "defaultConfirm": { + "cancel": "Cancel·la", + "confirm": "Usa la configuració per defecte", + "description": "La configuració per defecte no té els millors fluxos i pot ser insuportablement lenta.", + "title": "Segur?" + }, + "extension": { + "back": "Torna", + "explainer": "Mitjançant l'extensió del navegador, podeu obtindre els millors fluxos que oferim. Amb només una simple instal·lació.", + "explainerIos": "Lamentablement, l'extensió del navegador no és compatible amb iOS, premeu Torna per a triar una altra opció.", + "extensionHelp": "Si heu instal·lat l'extensió, però no es detecta, obriu l'extensió al menú d'extensions del navegador i seguiu els passos en pantalla.", + "linkChrome": "Instal·la l'extensió de Chrome", + "linkFirefox": "Instal·la l'extensió de Firefox", + "notDetecting": "S'ha instal·lat a Chrome, però el lloc no el detecta? Proveu de recarregar la pàgina.", + "notDetectingAction": "Recarrega la pàgina", + "status": { + "disallowed": "L'extensió no està activada per a esta pàgina", + "disallowedAction": "Activa l'extensió", + "failed": "No s'ha pogut sol·licitar l'estat", + "loading": "Esperant que instal·leu l'extensió", + "outdated": "La versió de l'extensió és massa antiga", + "success": "L'extensió funciona com s'esperava!" + }, + "submit": "Continua", + "title": "Comencem amb una extensió" + }, + "proxy": { + "back": "Torna", + "explainer": "Amb el mètode del servidor intermediari, podeu obtindre fluxos d'alta qualitat fent un servidor intermediari propi.", + "input": { + "errorConnection": "No s'ha pogut connectar al servidor intermediari", + "errorInvalidUrl": "URL no vàlid", + "errorNotProxy": "S'esperava un servidor intermediari, però és un lloc web", + "label": "URL del servidor intermediari", + "placeholder": "https://" + }, + "link": "Com fer un servidor intermediari", + "submit": "Envia el servidor intermediari", + "title": "Fem un nou servidor intermediari" + }, + "start": { + "explainer": "Per a obtindre els millors fluxos possibles, haureu de triar quin mètode de transmissió voleu utilitzar.", + "options": { + "default": { + "text": "No vull fluxos de bona qualitat,<0 /> <1>utilitza la configuració per defecte" + }, + "extension": { + "action": "Instal·la l'extensió", + "description": "Instal·leu l'extensió del navegador i accediu a les millors fonts.", + "quality": "Millor qualitat", + "title": "Extensió del navegador" + }, + "proxy": { + "action": "Configura el servidor intermediari", + "description": "Configureu un servidor intermediari en només 5 minuts i accediu a bones fonts.", + "quality": "Bona qualitat", + "title": "Servidor intermediari personalitzat" + } + }, + "title": "Configurem el movie-web" + } + }, + "overlays": { + "close": "Tanca" + }, + "player": { + "back": { + "default": "Torna a l'inici", + "short": "Torna" + }, + "casting": { + "enabled": "S'està emetent al dispositiu…" + }, + "menus": { + "downloads": { + "copyHlsPlaylist": "Copia l'enllaç de la llista HLS", + "disclaimer": "Les baixades s'obtenen directament del proveïdor. movie-web no té control sobre com es proporcionen les baixades.", + "downloadSubtitle": "Baixa els subtítols actuals", + "downloadVideo": "Baixa el vídeo", + "hlsDisclaimer": "Les baixades s'obtenen directament del proveïdor. movie-web no té control sobre com es proporcionen les baixades.

Tingueu en compte que esteu baixant una llista de reproducció HLS, no es recomana baixar-la si no esteu familiaritzat amb formats de transmissió avançats. Proveu diferents fonts per a diferents formats.", + "onAndroid": { + "1": "Per a baixar-lo a Android, feu clic al botó de baixada i, a la pàgina nova, manteniu premut el vídeo i, a continuació, seleccioneu Desa.", + "shortTitle": "Baixa / Android", + "title": "Baixada a Android" + }, + "onIos": { + "1": "Per a baixar a iOS, feu clic al botó de baixada i, a la pàgina nova, feu clic a /> i, a continuació, Desa als Arxius .", + "shortTitle": "Baixa / iOS", + "title": "Baixada a iOS" + }, + "onPc": { + "1": "En un PC, feu clic al botó de baixada i, a la pàgina nova, feu clic amb el botó dret al vídeo i seleccioneu Anomena i desa el vídeo", + "shortTitle": "Baixa / PC", + "title": "Baixada a un PC" + }, + "title": "Baixa" + }, + "episodes": { + "button": "Episodi", + "emptyState": "No hi ha episodis en esta temporada, torneu-ho a comprovar més tard!", + "episodeBadge": "E{{episode}}", + "loadingError": "Error en carregar la temporada", + "loadingList": "S'està carregant…", + "loadingTitle": "S'està carregant…", + "unairedEpisodes": "Un o més episodis d'esta temporada s'han desactivat perquè encara no s'han emés." + }, + "playback": { + "speedLabel": "Velocitat de la reproducció", + "title": "Configuració de la reproducció" + }, + "quality": { + "automaticLabel": "Qualitat automàtica", + "hint": "Podeu provar a <0>canviar la font per a obtindre diferents opcions de qualitat.", + "iosNoQuality": "A causa de les limitacions definides per Apple, la selecció de qualitat no està disponible a iOS per a esta font. Podeu provar a <0>canviar a una altra font per a obtindre diferents opcions de qualitat.", + "title": "Qualitat" + }, + "settings": { + "downloadItem": "Baixa", + "enableSubtitles": "Activa els subtítols", + "experienceSection": "Experiència de visualització", + "playbackItem": "Configuració de la reproducció", + "qualityItem": "Qualitat", + "sourceItem": "Fonts de vídeo", + "subtitleItem": "Configuració dels subtítols", + "videoSection": "Configuració de vídeo" + }, + "sources": { + "failed": { + "text": "S'ha produït un error en intentar trobar vídeos, proveu una font diferent.", + "title": "No s'ha pogut obtindre" + }, + "noEmbeds": { + "text": "No hem pogut trobar cap incrustat, proveu una font diferent.", + "title": "No s'ha trobat cap incrustació" + }, + "noStream": { + "text": "esta font no té fluxos per a esta pel·lícula o programa.", + "title": "Cap flux" + }, + "title": "Fonts", + "unknownOption": "Desconeguda" + }, + "subtitles": { + "customChoice": "Selecciona un fitxer de subtítols", + "customizeLabel": "Personalitza", + "offChoice": "Desactivats", + "settings": { + "backlink": "Subtítols personalitzats", + "delay": "Retard dels subtítols", + "fixCapitals": "Corregeix les majúscules/minúscules" + }, + "title": "Subtítols", + "unknownLanguage": "Desconeguda" + } + }, + "metadata": { + "api": { + "text": "No s'han pogut carregar les metadades de l'API, comproveu la connexió a Internet.", + "title": "No s'han pogut carregar les metadades de l'API" + }, + "dmca": { + "badge": "Eliminat", + "text": "este contingut ja no està disponible a causa d'un avís de retirada o d'una reclamació de drets d'autor.", + "title": "El contingut s'ha eliminat" + }, + "extensionPermission": { + "badge": "Falta el permís", + "button": "Utilitza l'extensió", + "text": "Teniu l'extensió del navegador, però necessitem el vostre permís per a començar a utilitzar l'extensió.", + "title": "Configureu l'extensió" + }, + "failed": { + "badge": "Ha fallat", + "homeButton": "Vés a l'inici", + "text": "No s'han pogut carregar les metadades del contingut des de TMDB. Comproveu si TMDB no funciona o està bloquejat a la vostra connexió a Internet.", + "title": "Ha fallat la càrrega de les metadades" + }, + "notFound": { + "badge": "No s'ha trobat", + "homeButton": "Torna a l'inici", + "text": "No hem pogut trobar el contingut sol·licitat. O bé s'ha eliminat o bé heu alterat l'URL.", + "title": "No s'ha trobat el contingut." + } + }, + "nextEpisode": { + "cancel": "Cancel·la", + "next": "Episodi següent" + }, + "playbackError": { + "badge": "Error en la reproducció", + "errors": { + "errorAborted": "S'ha interromput l'obtenció del contingut per petició de l'usuari.", + "errorDecode": "Tot i haver-se determinat prèviament que era utilitzable, s'ha produït un error en intentar descodificar el recurs multimèdia.", + "errorGenericMedia": "S'ha produït un error desconegut al contingut.", + "errorNetwork": "S'ha produït algun tipus d'error de xarxa que ha impedit que el contingut s'obtinga correctament, tot i haver estat disponibles prèviament.", + "errorNotSupported": "El contingut o el proveïdor del contingut no és compatible." + }, + "homeButton": "Torna a l'inici", + "text": "S'ha produït un error en intentar reproduir el contingut. Torneu-ho a provar.", + "title": "No s'ha pogut reproduir el vídeo!" + }, + "scraping": { + "items": { + "failure": "S'ha produït un error", + "notFound": "No té el vídeo", + "pending": "S'estan cercant vídeos…" + }, + "notFound": { + "badge": "No s'ha trobat", + "detailsButton": "Mostra els detalls", + "homeButton": "Torna a l'inici", + "text": "Hem buscat a través dels nostres proveïdors i no trobem el contingut que busqueu! No allotgem contingut i no tenim control sobre què hi ha disponible. Feu clic a «Mostra els detalls» a continuació per a més informació.", + "title": "No s'ha pogut trobar" + } + }, + "time": { + "regular": "{{timeWatched}} / {{duration}}", + "remaining": "{{timeLeft}} restants • Acaba a les {{timeFinished, datetime}}", + "shortRegular": "{{timeWatched}}", + "shortRemaining": "-{{timeLeft}}" + }, + "turnstile": { + "description": "Verifiqueu que sou humà completant el Captcha de la dreta. Ho fem per a mantindre segura movie-web!", + "error": "No s'ha pogut verificar la humanitat. Torneu-ho a provar.", + "title": "Necessitem verificar que sou humà.", + "verifyingHumanity": "Verificant la vostra humanitat…" + } + }, + "screens": { + "dmca": { + "text": "Vos donem la benvinguda a la pàgina de contacte DMCA de movie-web! Respectem els drets de propietat intel·lectual i volem resoldre qualsevol problema de drets d'autor ràpidament. Si creieu que la vostra obra protegida per drets d'autor s'ha utilitzat incorrectament a la nostra plataforma, envieu un avís detallat de la DMCA al correu electrònic següent. Incloeu una descripció del material protegit per drets d'autor, les vostres dades de contacte i una declaració de creença de bona fe. Ens comprometem a resoldre estes assumptes amb agilitat i agraïm la vostra col·laboració per a mantindre movie-web en un lloc que respecta la creativitat i els drets d'autor.", + "title": "DMCA" + }, + "loadingApp": "S'està carregant l'aplicació", + "loadingUser": "S'està carregant el perfil", + "loadingUserError": { + "logout": "Tanca la sessió", + "reset": "Restableix el servidor personalitzat", + "text": "Ha fallat la càrrega del perfil", + "textWithReset": "Error en carregar el vostre perfil des del servidor personalitzat, voleu restablir el servidor per defecte?" + }, + "migration": { + "failed": "La migració de les dades ha fallat.", + "inProgress": "Espereu, estem migrant les vostres dades. No hauria de tardar massa." + } + }, + "settings": { + "account": { + "accountDetails": { + "deviceNameLabel": "Nom del dispositiu", + "deviceNamePlaceholder": "Telèfon personal", + "editProfile": "Edita", + "logoutButton": "Tanca la sessió" + }, + "actions": { + "delete": { + "button": "Elimina el compte", + "confirmButton": "Elimina el compte", + "confirmDescription": "Segur que voleu eliminar el compte? Es perdran totes les dades!", + "confirmTitle": "Segur?", + "text": "esta acció és irreversible. Totes les dades s'eliminaran i no es podrà recuperar res.", + "title": "Elimina el compte" + }, + "title": "Accions" + }, + "devices": { + "deviceNameLabel": "Nom del dispositiu", + "failed": "La càrrega de sessions ha fallat", + "removeDevice": "Elimina", + "title": "Dispositiu" + }, + "profile": { + "finish": "Finalitza l'edició", + "firstColor": "Color de perfil 1", + "secondColor": "Color de perfil dos", + "title": "Edita la foto de perfil", + "userIcon": "Icona d'usuari" + }, + "register": { + "cta": "Comença", + "text": "Compartiu el progrés de la visualització entre dispositius i manteniu-los sincronitzats.", + "title": "Sincronització amb el núvol" + }, + "title": "Compte" + }, + "appearance": { + "activeTheme": "Actiu", + "themes": { + "blue": "Blau", + "default": "Per defecte", + "gray": "Gris", + "red": "Vermell", + "teal": "Verd blavós" + }, + "title": "Aparença" + }, + "connections": { + "server": { + "description": "Si voleu connectar-vos a un rerefons personalitzat per a emmagatzemar les vostres dades, activeu-ho i proporcioneu l'URL. <0>Instruccions.", + "label": "Servidor personalitzat", + "urlLabel": "URL del servidor personalitzat" + }, + "setup": { + "doSetup": "Configura", + "errorStatus": { + "description": "Sembla que heu de revisar un o més elements de la configuració.", + "title": "S'ha de revisar algun element" + }, + "itemError": "Hi ha alguna cosa malament en la configuració. Torneu a fer la configuració per a solucionar-ho.", + "items": { + "default": "Configuració per defecte", + "extension": "Extensió", + "proxy": "Servidor personalitzat" + }, + "redoSetup": "Reconfigura", + "successStatus": { + "description": "Tot està preparat perquè comenceu a mirar el vostre contingut preferit.", + "title": "Tot està configurat!" + }, + "unsetStatus": { + "description": "Feu clic al botó de la dreta per a iniciar el procés de configuració.", + "title": "No heu fet la configuració" + } + }, + "title": "Connexions", + "workers": { + "addButton": "Afig un «worker»", + "description": "Per fer funcionar l'aplicació, tot el trànsit s'encamina a través de servidors intermediaris. Activeu-ho si voleu portar els vostres propis «workers». <0>Instruccions.", + "emptyState": "Encara no hi ha «workers», afegiu-ne un a continuació", + "label": "Utilitza «workers» intermediaris personalitzats", + "urlLabel": "URL dels «workers»", + "urlPlaceholder": "https://" + } + }, + "preferences": { + "language": "Llengua de l'aplicació", + "languageDescription": "La llengua s'aplica a tota l'aplicació.", + "thumbnail": "Genera miniatures", + "thumbnailDescription": "Majoritàriament, els vídeos no tenen miniatures. Podeu activar esta opció per a generar-les sobre la marxa, però poden alentir el vídeo.", + "thumbnailLabel": "Genera miniatures", + "title": "Configuració" + }, + "reset": "Restableix", + "save": "Desa", + "sidebar": { + "info": { + "appVersion": "Versió de l'aplicació", + "backendUrl": "URL del rerefons", + "backendVersion": "Versió del rerefons", + "hostname": "Nom de l'amfitrió", + "insecure": "Insegur", + "notLoggedIn": "No heu iniciat sessió", + "secure": "Segur", + "title": "Informació de l'aplicació", + "unknownVersion": "Desconeguda", + "userId": "ID d'usuari" + } + }, + "subtitles": { + "backgroundLabel": "Opacitat del fons", + "colorLabel": "Color", + "previewQuote": "No he de tindre por. La por és l'assassina de la ment.", + "textSizeLabel": "Grandària del text", + "title": "Subtítols" + }, + "unsaved": "Hi ha canvis sense desar" + } +} From 8a973b1d89a93a2f5edd853c28e11d8601b9e16c Mon Sep 17 00:00:00 2001 From: Mehdi Date: Sun, 3 Mar 2024 18:40:54 +0000 Subject: [PATCH 26/46] Translated using Weblate (Persian) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/fa/ Author: Mehdi --- src/assets/locales/fa.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/locales/fa.json b/src/assets/locales/fa.json index 16e6a8a3..a2c31320 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -117,7 +117,7 @@ "allResults": "همه چیزی بود که داشتیم!", "failed": "چیزی پیدا نشد، دوباره تلاش کنید!", "loading": "در حال بارگذاری...", - "noResults": "چیزی پیدا نکردیم!", + "noResults": "نتونستیم چیزی پیدا کنیم!", "placeholder": { "default": "چه می‌خواهید تماشا کنید؟", "extra": [ From bada1d12cfd71f9c33c916ab68cb01a6a38b1b09 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sun, 3 Mar 2024 19:13:30 +0000 Subject: [PATCH 27/46] Add Catalan (Valencia) --- src/assets/languages.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/assets/languages.ts b/src/assets/languages.ts index 3068c640..e575d454 100644 --- a/src/assets/languages.ts +++ b/src/assets/languages.ts @@ -2,6 +2,7 @@ import ar from "@/assets/locales/ar.json"; import bg from "@/assets/locales/bg.json"; import bn from "@/assets/locales/bn.json"; import ca from "@/assets/locales/ca.json"; +import caVl from "@/assets/locales/ca@valencia.json"; import cs from "@/assets/locales/cs.json"; import de from "@/assets/locales/de.json"; import el from "@/assets/locales/el.json"; @@ -46,6 +47,7 @@ import zh from "@/assets/locales/zh.json"; export const locales = { en, ca, + "ca-ES": caVl, cs, de, fr, From f33bc583eac7dab285013f244828dd865af9a21b Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Sun, 3 Mar 2024 22:47:51 +0200 Subject: [PATCH 28/46] fix: when navigating to own pages, use `useNavigate()` --- src/components/buttons/Button.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/buttons/Button.tsx b/src/components/buttons/Button.tsx index f5c81b8d..8502e506 100644 --- a/src/components/buttons/Button.tsx +++ b/src/components/buttons/Button.tsx @@ -1,5 +1,6 @@ import classNames from "classnames"; import { ReactNode, useCallback } from "react"; +import { useNavigate } from "react-router-dom"; import { Icon, Icons } from "@/components/Icon"; import { Spinner } from "@/components/layout/Spinner"; @@ -20,6 +21,7 @@ interface Props { } export function Button(props: Props) { + const navigate = useNavigate(); const { onClick, href, loading } = props; const cb = useCallback( ( @@ -31,10 +33,14 @@ export function Button(props: Props) { if (loading) return; if (href && !onClick) { event.preventDefault(); - window.open(href, "_blank", "noreferrer"); + if (!href.includes("http")) { + navigate(href); + } else { + window.open(href, "_blank", "noreferrer"); + } } else onClick?.(event); }, - [onClick, href, loading], + [loading, href, onClick, navigate], ); let colorClasses = "bg-white hover:bg-gray-200 text-black"; From de2e3e6aed10aa643295a2a540865a9bd81e16ec Mon Sep 17 00:00:00 2001 From: MovieWebIPFS <161489517+MovieWebIPFS@users.noreply.github.com> Date: Sat, 2 Mar 2024 19:39:03 +0000 Subject: [PATCH 29/46] feat: allow setting 'base' via VITE_BASE_URL this sets the default to `/` which results in this patch not breaking behavior. This is being used to set base as a relative path to enable hosting movie-web at any non-root location --- vite.config.mts | 1 + 1 file changed, 1 insertion(+) diff --git a/vite.config.mts b/vite.config.mts index 264871b0..c9e63ade 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -24,6 +24,7 @@ const captioningPackages = [ export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd()); return { + base: env.VITE_BASE_URL || '/', plugins: [ million.vite({ auto: true, mute: true }), handlebars({ From 256f9f9df90df04c3236e09481f53222693a9fba Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Tue, 5 Mar 2024 00:33:31 +0200 Subject: [PATCH 30/46] feat: add season/episode to the start of title --- .../internals/{MediaSession.ts => MediaSession.tsx} | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) rename src/components/player/internals/{MediaSession.ts => MediaSession.tsx} (93%) diff --git a/src/components/player/internals/MediaSession.ts b/src/components/player/internals/MediaSession.tsx similarity index 93% rename from src/components/player/internals/MediaSession.ts rename to src/components/player/internals/MediaSession.tsx index e5127c0e..1dc7e737 100644 --- a/src/components/player/internals/MediaSession.ts +++ b/src/components/player/internals/MediaSession.tsx @@ -104,9 +104,15 @@ export function MediaSession() { ) return; - const title = data.meta?.episode?.title ?? data.meta?.title ?? ""; - const artist = - data.meta?.type === "movie" ? undefined : data.meta?.title ?? ""; + let title: string | undefined; + let artist: string | undefined; + + if (data.meta?.type === "movie") { + title = data.meta?.title; + } else if (data.meta?.type === "show") { + artist = data.meta?.title; + title = `S${data.meta?.season?.number} E${data.meta?.episode?.number}: ${data.meta?.episode?.title}`; + } navigator.mediaSession.metadata = new MediaMetadata({ title, @@ -170,6 +176,7 @@ export function MediaSession() { data.meta?.title, data.meta?.type, data.meta?.poster, + data.meta?.season?.number, ]); return null; } From b74a4cd4c6de215b4021b3b084bc7cf054f291b6 Mon Sep 17 00:00:00 2001 From: Isra Date: Wed, 6 Mar 2024 10:56:06 -0600 Subject: [PATCH 31/46] Make x-button more visible --- src/components/buttons/IconPatch.tsx | 2 +- themes/default.ts | 59 +++++++++------------------- 2 files changed, 19 insertions(+), 42 deletions(-) diff --git a/src/components/buttons/IconPatch.tsx b/src/components/buttons/IconPatch.tsx index b9a7e525..945c91bb 100644 --- a/src/components/buttons/IconPatch.tsx +++ b/src/components/buttons/IconPatch.tsx @@ -25,7 +25,7 @@ export function IconPatch(props: IconPatchProps) { return (
diff --git a/themes/default.ts b/themes/default.ts index c7d32617..1854b6f1 100644 --- a/themes/default.ts +++ b/themes/default.ts @@ -31,7 +31,7 @@ const tokens = { c200: "#8A293B", c300: "#812435", c400: "#701B2B", - } + }, }, blue: { c50: "#ADADF5", @@ -43,7 +43,7 @@ const tokens = { c600: "#1B1B41", c700: "#171736", c800: "#101020", - c900: "#0B0B13" + c900: "#0B0B13", }, purple: { c50: "#D5AAFF", @@ -55,7 +55,7 @@ const tokens = { c600: "#411F64", c700: "#31184A", c800: "#221134", - c900: "#160B22" + c900: "#160B22", }, ash: { c50: "#7F8D9B", @@ -67,7 +67,7 @@ const tokens = { c600: "#172532", c700: "#131E29", c800: "#101820", - c900: "#0C1216" + c900: "#0C1216", }, shade: { c50: "#676790", @@ -77,11 +77,11 @@ const tokens = { c400: "#272741", c500: "#1E1E32", c600: "#171728", - c700: "#131322", + c700: "#000000", c800: "#0F0F1B", - c900: "#0A0A12" - } -} + c900: "#0A0A12", + }, +}; export const defaultTheme = { extend: { @@ -94,31 +94,29 @@ export const defaultTheme = { // Branding pill: { - background: tokens.shade.c300, - backgroundHover: tokens.shade.c200, + background: tokens.shade.c400, + backgroundHover: tokens.shade.c500, highlight: tokens.blue.c200, - - activeBackground: tokens.shade.c300, }, - + // meta data for the theme itself global: { accentA: tokens.blue.c200, accentB: tokens.blue.c300, }, - + // light bar lightBar: { light: tokens.blue.c400, }, - + // Buttons buttons: { toggle: tokens.purple.c300, toggleDisabled: tokens.ash.c500, danger: tokens.semantic.rose.c300, dangerHover: tokens.semantic.rose.c200, - + secondary: tokens.ash.c700, secondaryText: tokens.semantic.silver.c300, secondaryHover: tokens.ash.c700, @@ -130,7 +128,7 @@ export const defaultTheme = { cancel: tokens.ash.c500, cancelHover: tokens.ash.c300, }, - + // only used for body colors/textures background: { main: tokens.shade.c900, @@ -140,11 +138,6 @@ export const defaultTheme = { accentB: tokens.blue.c500, }, - // Modals - modal: { - background: tokens.shade.c800, - }, - // typography type: { logo: tokens.purple.c100, @@ -154,7 +147,6 @@ export const defaultTheme = { divider: tokens.ash.c500, secondary: tokens.ash.c100, danger: tokens.semantic.red.c100, - success: tokens.semantic.green.c100, link: tokens.purple.c100, linkHover: tokens.purple.c50, }, @@ -162,7 +154,6 @@ export const defaultTheme = { // search bar search: { background: tokens.shade.c500, - hoverBackground: tokens.shade.c600, focused: tokens.shade.c400, placeholder: tokens.shade.c100, icon: tokens.shade.c100, @@ -233,28 +224,14 @@ export const defaultTheme = { }, saveBar: { - background: tokens.shade.c800 - } + background: tokens.shade.c800, + }, }, - // Utilities utils: { divider: tokens.ash.c300, }, - // Onboarding - onboarding: { - bar: tokens.shade.c400, - barFilled: tokens.purple.c300, - divider: tokens.shade.c200, - card: tokens.shade.c800, - cardHover: tokens.shade.c700, - border: tokens.shade.c600, - good: tokens.purple.c100, - best: tokens.semantic.yellow.c100, - link: tokens.purple.c100, - }, - // Error page errors: { card: tokens.shade.c800, @@ -290,7 +267,7 @@ export const defaultTheme = { autoPlay: { background: tokens.ash.c700, - hover: tokens.ash.c500 + hover: tokens.ash.c500, }, scraping: { From 7159b76344948ef9b98e83013ae0c39beea0f95a Mon Sep 17 00:00:00 2001 From: Isra Date: Wed, 6 Mar 2024 10:58:38 -0600 Subject: [PATCH 32/46] Add onboarding styles to default theme --- themes/default.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/themes/default.ts b/themes/default.ts index 1854b6f1..7d08a6f3 100644 --- a/themes/default.ts +++ b/themes/default.ts @@ -228,6 +228,24 @@ export const defaultTheme = { }, }, + // Utilities + utils: { + divider: tokens.ash.c300, + }, + + // Onboarding + onboarding: { + bar: tokens.shade.c400, + barFilled: tokens.purple.c300, + divider: tokens.shade.c200, + card: tokens.shade.c800, + cardHover: tokens.shade.c700, + border: tokens.shade.c600, + good: tokens.purple.c100, + best: tokens.semantic.yellow.c100, + link: tokens.purple.c100, + }, + utils: { divider: tokens.ash.c300, }, From a652be9a8674ab6348a414a137e0fdb9111a19b3 Mon Sep 17 00:00:00 2001 From: Isra Date: Wed, 6 Mar 2024 10:59:29 -0600 Subject: [PATCH 33/46] Fix --- themes/default.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/themes/default.ts b/themes/default.ts index 7d08a6f3..46134815 100644 --- a/themes/default.ts +++ b/themes/default.ts @@ -105,6 +105,11 @@ export const defaultTheme = { accentB: tokens.blue.c300, }, + // Modals + modal: { + background: tokens.shade.c800, + }, + // light bar lightBar: { light: tokens.blue.c400, @@ -246,10 +251,6 @@ export const defaultTheme = { link: tokens.purple.c100, }, - utils: { - divider: tokens.ash.c300, - }, - // Error page errors: { card: tokens.shade.c800, From 4a5d537679da19d901a17d4896bc42c73d62e87f Mon Sep 17 00:00:00 2001 From: Isra Date: Wed, 6 Mar 2024 11:01:46 -0600 Subject: [PATCH 34/46] Revert all color changes --- themes/default.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/themes/default.ts b/themes/default.ts index 46134815..93a0673e 100644 --- a/themes/default.ts +++ b/themes/default.ts @@ -77,7 +77,7 @@ const tokens = { c400: "#272741", c500: "#1E1E32", c600: "#171728", - c700: "#000000", + c700: "#131322", c800: "#0F0F1B", c900: "#0A0A12", }, @@ -94,9 +94,11 @@ export const defaultTheme = { // Branding pill: { - background: tokens.shade.c400, - backgroundHover: tokens.shade.c500, + background: tokens.shade.c300, + backgroundHover: tokens.shade.c200, highlight: tokens.blue.c200, + + activeBackground: tokens.shade.c300, }, // meta data for the theme itself @@ -105,11 +107,6 @@ export const defaultTheme = { accentB: tokens.blue.c300, }, - // Modals - modal: { - background: tokens.shade.c800, - }, - // light bar lightBar: { light: tokens.blue.c400, @@ -143,6 +140,11 @@ export const defaultTheme = { accentB: tokens.blue.c500, }, + // Modals + modal: { + background: tokens.shade.c800, + }, + // typography type: { logo: tokens.purple.c100, @@ -152,6 +154,7 @@ export const defaultTheme = { divider: tokens.ash.c500, secondary: tokens.ash.c100, danger: tokens.semantic.red.c100, + success: tokens.semantic.green.c100, link: tokens.purple.c100, linkHover: tokens.purple.c50, }, @@ -159,6 +162,7 @@ export const defaultTheme = { // search bar search: { background: tokens.shade.c500, + hoverBackground: tokens.shade.c600, focused: tokens.shade.c400, placeholder: tokens.shade.c100, icon: tokens.shade.c100, From e09c04b57bfedf8b1fd99034e2c60aeba592c65a Mon Sep 17 00:00:00 2001 From: ssssobek Date: Sun, 10 Mar 2024 20:14:48 +0100 Subject: [PATCH 35/46] Add blurred backgroud for subtitles --- src/assets/locales/en.json | 1 + src/assets/locales/pl.json | 1 + .../player/atoms/settings/CaptionSettingsView.tsx | 12 ++++++++++++ src/components/player/base/SubtitleView.tsx | 4 ++++ src/pages/parts/settings/CaptionsPart.tsx | 13 +++++++++++++ src/stores/subtitles/index.ts | 8 ++++++++ 6 files changed, 39 insertions(+) diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index 55922380..dc4d6ed1 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -533,6 +533,7 @@ }, "subtitles": { "backgroundLabel": "Background opacity", + "backgroundBlurLabel": "Background blur", "colorLabel": "Color", "previewQuote": "I must not fear. Fear is the mind-killer.", "textSizeLabel": "Text size", diff --git a/src/assets/locales/pl.json b/src/assets/locales/pl.json index a653e4f9..843e2201 100644 --- a/src/assets/locales/pl.json +++ b/src/assets/locales/pl.json @@ -525,6 +525,7 @@ }, "subtitles": { "backgroundLabel": "Krycie tła", + "backgroundBlurLabel": "Rozmycie tła", "colorLabel": "Kolor", "previewQuote": "Nie wolno mi się bać. Strach zabija myślenie.", "textSizeLabel": "Rozmiar czcionki", diff --git a/src/components/player/atoms/settings/CaptionSettingsView.tsx b/src/components/player/atoms/settings/CaptionSettingsView.tsx index 5515946d..936e693d 100644 --- a/src/components/player/atoms/settings/CaptionSettingsView.tsx +++ b/src/components/player/atoms/settings/CaptionSettingsView.tsx @@ -262,6 +262,18 @@ export function CaptionSettingsView({ id }: { id: string }) { value={styling.backgroundOpacity * 100} textTransformer={(s) => `${s}%`} /> + + updateStyling({ + backgroundBlur: Math.round(v / 4) * 4, + }) + } + value={styling.backgroundBlur} + textTransformer={(s) => `${s}px`} + /> `${s}%`} /> + + props.setStyling({ + ...props.styling, + backgroundBlur: Math.round(v / 4) * 4, + }) + } + value={props.styling.backgroundBlur} + textTransformer={(s) => `${s}px`} + /> { @@ -62,6 +68,8 @@ export const useSubtitleStore = create( set((s) => { if (newStyling.backgroundOpacity !== undefined) s.styling.backgroundOpacity = newStyling.backgroundOpacity; + if (newStyling.backgroundBlur !== undefined) + s.styling.backgroundBlur = newStyling.backgroundBlur; if (newStyling.color !== undefined) s.styling.color = newStyling.color.toLowerCase(); if (newStyling.size !== undefined) From ca180ab9ea171e49e903d9e97f72f52451a245cf Mon Sep 17 00:00:00 2001 From: ssssobek Date: Sun, 10 Mar 2024 23:10:25 +0100 Subject: [PATCH 36/46] Go back to using percentages instead of pixels --- .../player/atoms/settings/CaptionSettingsView.tsx | 12 ++++-------- src/components/player/base/SubtitleView.tsx | 2 +- src/pages/parts/settings/CaptionsPart.tsx | 11 ++++------- src/stores/subtitles/index.ts | 2 +- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/components/player/atoms/settings/CaptionSettingsView.tsx b/src/components/player/atoms/settings/CaptionSettingsView.tsx index 936e693d..2e78ed7a 100644 --- a/src/components/player/atoms/settings/CaptionSettingsView.tsx +++ b/src/components/player/atoms/settings/CaptionSettingsView.tsx @@ -264,15 +264,11 @@ export function CaptionSettingsView({ id }: { id: string }) { /> - updateStyling({ - backgroundBlur: Math.round(v / 4) * 4, - }) - } - value={styling.backgroundBlur} - textTransformer={(s) => `${s}px`} + onChange={(v) => updateStyling({ backgroundBlur: v / 100 })} + value={styling.backgroundBlur * 100} + textTransformer={(s) => `${s}%`} /> diff --git a/src/pages/parts/settings/CaptionsPart.tsx b/src/pages/parts/settings/CaptionsPart.tsx index 3a16dd25..a6f8ddb5 100644 --- a/src/pages/parts/settings/CaptionsPart.tsx +++ b/src/pages/parts/settings/CaptionsPart.tsx @@ -94,16 +94,13 @@ export function CaptionsPart(props: { /> - props.setStyling({ - ...props.styling, - backgroundBlur: Math.round(v / 4) * 4, - }) + props.setStyling({ ...props.styling, backgroundBlur: v / 100 }) } - value={props.styling.backgroundBlur} - textTransformer={(s) => `${s}px`} + value={props.styling.backgroundBlur * 100} + textTransformer={(s) => `${s}%`} /> Date: Sun, 10 Mar 2024 23:56:06 +0100 Subject: [PATCH 37/46] Set the default background blur to 50% --- src/stores/subtitles/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/subtitles/index.ts b/src/stores/subtitles/index.ts index b1b535d1..31e59836 100644 --- a/src/stores/subtitles/index.ts +++ b/src/stores/subtitles/index.ts @@ -56,7 +56,7 @@ export const useSubtitleStore = create( color: "#ffffff", backgroundOpacity: 0.5, size: 1, - backgroundBlur: 0, + backgroundBlur: 0.5, }, resetSubtitleSpecificSettings() { set((s) => { From 9cb614701713550c47c9a97a7bfd154bad85ed5d Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sun, 10 Mar 2024 23:09:09 +0000 Subject: [PATCH 38/46] Bump version to 4.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fe2cc3d0..40537337 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "movie-web", - "version": "4.5.1", + "version": "4.6.0", "private": true, "homepage": "https://github.com/movie-web/movie-web", "scripts": { From 27297227e65a8bb2b03f93f937320188d8e1d588 Mon Sep 17 00:00:00 2001 From: Juled Zaganjori Date: Sun, 3 Mar 2024 21:13:03 +0000 Subject: [PATCH 39/46] Added translation using Weblate (Albanian) Author: Juled Zaganjori --- src/assets/locales/sq-AL.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/assets/locales/sq-AL.json diff --git a/src/assets/locales/sq-AL.json b/src/assets/locales/sq-AL.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/src/assets/locales/sq-AL.json @@ -0,0 +1 @@ +{} From 90e1d3c36929ae76012b98c349b0aa4dba16fb4b Mon Sep 17 00:00:00 2001 From: chaos Date: Sun, 3 Mar 2024 22:46:02 +0000 Subject: [PATCH 40/46] Translated using Weblate (Estonian) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/et/ Author: chaos --- src/assets/locales/et.json | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/assets/locales/et.json b/src/assets/locales/et.json index 8819ce15..d609a173 100644 --- a/src/assets/locales/et.json +++ b/src/assets/locales/et.json @@ -57,6 +57,8 @@ }, "host": "Ühendate <0>{{hostname}} - enne konto tegemist kinnitage, et usaldate seda", "no": "Tagasi", + "noHost": "Server ei ole konfigureeritud, seega ei saa kontot luua", + "noHostTitle": "Server ei ole konfigureeritud!", "title": "Kas usaldate seda serverit?", "yes": "Usaldan seda serverit" }, @@ -118,7 +120,12 @@ "noResults": "Me ei leidnud midagi!", "placeholder": { "default": "Mida tahate vaadata?", - "extra": [] + "extra": [ + "Mida soovite uurida?", + "Mis on teie nimekirjas?", + "Milline on teie lemmikfilm?", + "Milline on teie lemmiksari?" + ] }, "sectionTitle": "Otsingutulemused" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "Mida te soovite täna hommikul vaadata?", - "extra": ["Ma kuulsin, et Before Sunrise on hea"] + "extra": [ + "Ma kuulsin, et Before Sunrise on hea" + ] }, "night": { "default": "Mida te soovite täna õhtul vaadata?", - "extra": ["Väsinud? Olen kuulnud, et The Exorcist on hea."] + "extra": [ + "Väsinud? Olen kuulnud, et The Exorcist on hea." + ] } } }, @@ -241,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "Kopeeri HLS esitusloendi link", "disclaimer": "Allalaadimine toimub otse teenusepakkujalt. movie-web ei saa kontrollida, kuidas allalaadimine toimub.", "downloadSubtitle": "Laadige alla praegune subtiiter", "downloadVideo": "Lae alla video", From 7ffb904f9e75a6a3d103da41ac76fa5aba18d117 Mon Sep 17 00:00:00 2001 From: aryiu Date: Mon, 4 Mar 2024 20:08:40 +0000 Subject: [PATCH 41/46] Translated using Weblate (Valencian) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ca@valencia/ Author: aryiu --- src/assets/locales/ca@valencia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/locales/ca@valencia.json b/src/assets/locales/ca@valencia.json index 8f883342..078c7a10 100644 --- a/src/assets/locales/ca@valencia.json +++ b/src/assets/locales/ca@valencia.json @@ -437,7 +437,7 @@ "confirmButton": "Elimina el compte", "confirmDescription": "Segur que voleu eliminar el compte? Es perdran totes les dades!", "confirmTitle": "Segur?", - "text": "esta acció és irreversible. Totes les dades s'eliminaran i no es podrà recuperar res.", + "text": "Esta acció és irreversible. Totes les dades s'eliminaran i no es podrà recuperar res.", "title": "Elimina el compte" }, "title": "Accions" From 5754215725e8263f104c27171dcf9d9ebf88a07a Mon Sep 17 00:00:00 2001 From: Matias Bubello Date: Tue, 5 Mar 2024 23:16:17 +0000 Subject: [PATCH 42/46] Translated using Weblate (Spanish) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/es/ Author: Matias Bubello --- src/assets/locales/es.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/assets/locales/es.json b/src/assets/locales/es.json index d664c598..ecc105d0 100644 --- a/src/assets/locales/es.json +++ b/src/assets/locales/es.json @@ -12,7 +12,7 @@ }, "q3": { "body": "Nuestros resultados de búsqueda están alimentados por The Movie Database (TMDB) y se muestran independientemente de si nuestras fuentes realmente tienen el contenido.", - "title": "Los resultados de búsqueda muestran la serie o película, ¿por qué no puedo reproducirla?" + "title": "Los resultados de búsqueda muestran la serie o película, ¿Por qué no puedo reproducirla?" }, "title": "Acerca de movie-web" }, @@ -181,7 +181,7 @@ "cancel": "Cancelar", "confirm": "Usar configuración por defecto", "description": "La configuración predeterminada no tiene las mejores transmisiones y puede ser insoportablemente lenta.", - "title": "Estás seguro?" + "title": "¿Estás seguro?" }, "extension": { "back": "Volver atrás", @@ -399,7 +399,7 @@ "shortRemaining": "-{{timeLeft}}" }, "turnstile": { - "description": "Por favor, confirma que eres humano completando el Captcha. Esto es para mantener movie-web seguro!", + "description": "Por favor, confirma que eres humano completando el Captcha. ¡Esto es para mantener movie-web seguro!", "error": "Ha habido un error al verificar tu humanidad. Por favor, prueba de nuevo.", "title": "Necesitamos verificar que eres humano.", "verifyingHumanity": "Verificando tu hunanidad…" @@ -494,7 +494,7 @@ "redoSetup": "Rehacer configuración", "successStatus": { "description": "Todo lo necesario está en su sitio para que empieces a ver tu contenido favorito.", - "title": "Todo está configurado!" + "title": "¡Todo está configurado!" }, "unsetStatus": { "description": "Haga clic en el botón a la derecha para iniciar el proceso de configuración.", From dd0b9f60c9e21adf0f9f2f65b67c9b6043ccee2c Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 6 Mar 2024 12:44:33 +0000 Subject: [PATCH 43/46] Translated using Weblate (Russian) Currently translated at 100.0% (327 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ru/ Author: Alex --- src/assets/locales/ru.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/ru.json b/src/assets/locales/ru.json index 69eb43be..d332d111 100644 --- a/src/assets/locales/ru.json +++ b/src/assets/locales/ru.json @@ -57,6 +57,8 @@ }, "host": "Вы подключаетесь к <0>{{hostname}} - пожалуйста, подтвердите, что вы доверяете ему, прежде чем создавать учётную запись", "no": "Вернуться назад", + "noHost": "Сервер не был настроен, поэтому вы не можете создать учётную запись", + "noHostTitle": "Сервер не настроен!", "title": "Вы доверяете этому серверу?", "yes": "Я доверяю этому серверу" }, @@ -118,7 +120,12 @@ "noResults": "Мы ничего не нашли!", "placeholder": { "default": "Что вы хотите посмотреть?", - "extra": [] + "extra": [ + "Что вы хотите исследовать?", + "Что в вашем списке?", + "Какой ваш любимый фильм?", + "Какой ваш любимый сериал?" + ] }, "sectionTitle": "Результаты поиска" }, @@ -131,7 +138,9 @@ }, "morning": { "default": "Что бы вы хотели посмотреть этим утром?", - "extra": ["Слышали, что «Перед рассветом» – отличный фильм"] + "extra": [ + "Слышали, что «Перед рассветом» – отличный фильм" + ] }, "night": { "default": "Что бы вы хотели посмотреть этим вечером?", From 3cab6ab3c3d7a624ed8aa4d025f63d4fb820ac47 Mon Sep 17 00:00:00 2001 From: Jimin Date: Fri, 8 Mar 2024 02:02:16 +0000 Subject: [PATCH 44/46] Translated using Weblate (Korean) Currently translated at 99.6% (326 of 327 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ko/ Author: Jimin --- src/assets/locales/ko.json | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/assets/locales/ko.json b/src/assets/locales/ko.json index f4b48fb1..16d7fb9a 100644 --- a/src/assets/locales/ko.json +++ b/src/assets/locales/ko.json @@ -57,6 +57,8 @@ }, "host": "<0>{{hostname}}에 연결 중입니다 - 계정을 만들기 전에 신뢰하는지 확인해 주세요", "no": "뒤로 가기", + "noHost": "서버가 구성되어 있지 않기 때문에 계정을 만들 수 없습니다", + "noHostTitle": "서버가 구성되지 않았습니다!", "title": "이 서버를 신뢰하십니까?", "yes": "네, 신뢰합니다" }, @@ -118,7 +120,12 @@ "noResults": "검색결과가 없습니다!", "placeholder": { "default": "무엇을 보고 싶으신가요?", - "extra": [] + "extra": [ + "무엇을 탐험하고 싶으신가요?", + null, + "당신이 가장 좋아하는 영화는?", + "당신이 가장 좋아하는 시리즈는?" + ] }, "sectionTitle": "검색 결과" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "오늘 아침에 무엇을 보고 싶으신가요?", - "extra": ["Before Sunrise가 좋다고 들었어요"] + "extra": [ + "Before Sunrise가 좋다고 들었어요" + ] }, "night": { "default": "오늘 밤에 무엇을 보고 싶으신가요?", - "extra": ["피곤하신가요? The Exorcist가 좋다고 들었어요."] + "extra": [ + "피곤하신가요? The Exorcist가 좋다고 들었어요." + ] } } }, @@ -241,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "HLS 플레이리스트 링크 복사하기", "disclaimer": "다운로드는 제공업체에서 직접 가져옵니다. movie-web은 다운로드 제공 방식을 통제할 수 없습니다.", "downloadSubtitle": "현재 자막 다운로드", "downloadVideo": "영상 다운로드", From 57a747099e01b540a69794cc22496d8c2ee1ef86 Mon Sep 17 00:00:00 2001 From: chaos Date: Sun, 10 Mar 2024 23:08:01 +0000 Subject: [PATCH 45/46] Translated using Weblate (Estonian) Currently translated at 100.0% (328 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/et/ Author: chaos --- src/assets/locales/et.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/locales/et.json b/src/assets/locales/et.json index d609a173..50d4f8b4 100644 --- a/src/assets/locales/et.json +++ b/src/assets/locales/et.json @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Tausta hägusus", "backgroundLabel": "Tausta läbipaistmatus", "colorLabel": "Värv", "previewQuote": "Ma ei tohi karta. Hirm on meelemõrvar.", From cfaf2130e4b9cbf9f321bc5e2c24187b6038f81e Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 10 Mar 2024 23:14:11 +0000 Subject: [PATCH 46/46] Deleted translation using Weblate (Albanian) Author: admin --- src/assets/locales/sq-AL.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/assets/locales/sq-AL.json diff --git a/src/assets/locales/sq-AL.json b/src/assets/locales/sq-AL.json deleted file mode 100644 index 0967ef42..00000000 --- a/src/assets/locales/sq-AL.json +++ /dev/null @@ -1 +0,0 @@ -{}