From f4dd6f95a4d76c7c523347d2f72f52d8589b777d Mon Sep 17 00:00:00 2001 From: Joao Melo Date: Mon, 25 Mar 2024 17:59:11 +0000 Subject: [PATCH 001/101] Fix #241: Last episode completed does not save After ending episode or clicking on next episode, store state wasn't updating. Changed NextEpisodeButton and which series episodes are displayed --- .../player/atoms/NextEpisodeButton.tsx | 16 +++++++++++++++- src/stores/progress/utils.ts | 13 ++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index caaf7ef9..906b6829 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -7,6 +7,7 @@ import { usePlayerMeta } from "@/components/player/hooks/usePlayerMeta"; import { Transition } from "@/components/utils/Transition"; import { PlayerMeta } from "@/stores/player/slices/source"; import { usePlayerStore } from "@/stores/player/store"; +import { useProgressStore } from "@/stores/progress"; function shouldShowNextEpisodeButton( time: number, @@ -55,6 +56,7 @@ export function NextEpisodeButton(props: { const setShouldStartFromBeginning = usePlayerStore( (s) => s.setShouldStartFromBeginning, ); + const updateItem = useProgressStore((s) => s.updateItem); let show = false; if (showingState === "always") show = true; @@ -79,7 +81,19 @@ export function NextEpisodeButton(props: { setShouldStartFromBeginning(true); setDirectMeta(metaCopy); props.onChange?.(metaCopy); - }, [setDirectMeta, nextEp, meta, props, setShouldStartFromBeginning]); + const defaultProgress = { duration: 0, watched: 0 }; + updateItem({ + meta: metaCopy, + progress: defaultProgress, + }); + }, [ + setDirectMeta, + nextEp, + meta, + props, + setShouldStartFromBeginning, + updateItem, + ]); if (!meta?.episode || !nextEp) return null; if (metaType !== "show") return null; diff --git a/src/stores/progress/utils.ts b/src/stores/progress/utils.ts index 9a439141..6ea09462 100644 --- a/src/stores/progress/utils.ts +++ b/src/stores/progress/utils.ts @@ -46,6 +46,15 @@ function progressIsAcceptableRange(duration: number, watched: number): boolean { return true; } +function isFirstEpisodeOfShow( + item: ProgressMediaItem, + episode: ProgressEpisodeItem, +): boolean { + const seasonId = episode.seasonId; + const season = item.seasons[seasonId]; + return season.number === 1 && episode.number === 1; +} + export function shouldShowProgress( item: ProgressMediaItem, ): ShowProgressResult { @@ -66,8 +75,10 @@ export function shouldShowProgress( .sort((a, b) => b.updatedAt - a.updatedAt) .filter( (epi) => - !progressIsNotStarted(epi.progress.duration, epi.progress.watched), + !progressIsNotStarted(epi.progress.duration, epi.progress.watched) || + !isFirstEpisodeOfShow(item, epi), )[0]; + const season = item.seasons[ep?.seasonId]; if (!ep || !season) return { From c4f68615cd2fc0efe959506e4747439ff6165f87 Mon Sep 17 00:00:00 2001 From: Honkertonken <94032937+Honkertonken@users.noreply.github.com> Date: Wed, 27 Mar 2024 18:20:57 +0530 Subject: [PATCH 002/101] Update tmdb.ts --- src/backend/metadata/tmdb.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index b143b312..88412c84 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -173,12 +173,17 @@ export async function multiSearch( language: "en-US", page: 1, }); - // filter out results that aren't movies or shows - const results = data.results.filter( - (r) => - r.media_type === TMDBContentTypes.MOVIE || - r.media_type === TMDBContentTypes.TV, - ); + const currentDate = new Date(); + // filter out results that aren't movies or shows or are unreleased + const results = data.results.filter((r) => { + if (r.media_type === TMDBContentTypes.MOVIE) { + return new Date(r.release_date) <= currentDate; + } + if (r.media_type === TMDBContentTypes.TV) { + return new Date(r.first_air_date) <= currentDate; + } + return false; + }); return results; } From e431626bfa767b5c8c1e2b328a39171b1c9d912b Mon Sep 17 00:00:00 2001 From: Honkertonken <94032937+Honkertonken@users.noreply.github.com> Date: Wed, 27 Mar 2024 23:19:12 +0530 Subject: [PATCH 003/101] Update MediaCard.tsx --- src/components/media/MediaCard.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/media/MediaCard.tsx b/src/components/media/MediaCard.tsx index cad3ae6a..ac6c243c 100644 --- a/src/components/media/MediaCard.tsx +++ b/src/components/media/MediaCard.tsx @@ -35,10 +35,14 @@ function MediaCardContent({ const { t } = useTranslation(); const percentageString = `${Math.round(percentage ?? 0).toFixed(0)}%`; - const canLink = linkable && !closable; + const canLink = linkable && !closable && !!media.year; const dotListContent = [t(`media.types.${media.type}`)]; - if (media.year) dotListContent.push(media.year.toFixed()); + if (media.year) { + dotListContent.push(media.year.toFixed()); + } else { + dotListContent.push(t("Unreleased")); + } return (
{content}; + if (!props.linkable || !props.media.year) return {content}; return ( Date: Wed, 27 Mar 2024 23:19:35 +0530 Subject: [PATCH 004/101] Revert "Update tmdb.ts" This reverts commit c4f68615cd2fc0efe959506e4747439ff6165f87. --- src/backend/metadata/tmdb.ts | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index 88412c84..b143b312 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -173,17 +173,12 @@ export async function multiSearch( language: "en-US", page: 1, }); - const currentDate = new Date(); - // filter out results that aren't movies or shows or are unreleased - const results = data.results.filter((r) => { - if (r.media_type === TMDBContentTypes.MOVIE) { - return new Date(r.release_date) <= currentDate; - } - if (r.media_type === TMDBContentTypes.TV) { - return new Date(r.first_air_date) <= currentDate; - } - return false; - }); + // filter out results that aren't movies or shows + const results = data.results.filter( + (r) => + r.media_type === TMDBContentTypes.MOVIE || + r.media_type === TMDBContentTypes.TV, + ); return results; } From 4386772404de469d3980252fc38aa327a95846a6 Mon Sep 17 00:00:00 2001 From: Honkertonken <94032937+Honkertonken@users.noreply.github.com> Date: Thu, 28 Mar 2024 13:27:05 +0530 Subject: [PATCH 005/101] Update MediaCard.tsx --- src/components/media/MediaCard.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/media/MediaCard.tsx b/src/components/media/MediaCard.tsx index ac6c243c..ce4eeffe 100644 --- a/src/components/media/MediaCard.tsx +++ b/src/components/media/MediaCard.tsx @@ -35,13 +35,15 @@ function MediaCardContent({ const { t } = useTranslation(); const percentageString = `${Math.round(percentage ?? 0).toFixed(0)}%`; - const canLink = linkable && !closable && !!media.year; + const currentYear = new Date().getFullYear(); + const isReleased = media.year && media.year < currentYear; + const canLink = linkable && !closable && isReleased; const dotListContent = [t(`media.types.${media.type}`)]; - if (media.year) { + if (isReleased) { dotListContent.push(media.year.toFixed()); } else { - dotListContent.push(t("Unreleased")); + dotListContent.push(t("media.unreleased")); } return ( @@ -146,7 +148,9 @@ function MediaCardContent({ export function MediaCard(props: MediaCardProps) { const content = ; - const canLink = props.linkable && !props.closable; + const currentYear = new Date().getFullYear(); + const isReleased = props.media.year && props.media.year < currentYear; + const canLink = props.linkable && !props.closable && isReleased; let link = canLink ? `/media/${encodeURIComponent(mediaItemToId(props.media))}` @@ -161,7 +165,7 @@ export function MediaCard(props: MediaCardProps) { } } - if (!props.linkable || !props.media.year) return {content}; + if (!canLink) return {content}; return ( Date: Thu, 28 Mar 2024 13:36:56 +0530 Subject: [PATCH 006/101] Update MediaCard.tsx --- src/components/media/MediaCard.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/media/MediaCard.tsx b/src/components/media/MediaCard.tsx index ce4eeffe..937ff1c6 100644 --- a/src/components/media/MediaCard.tsx +++ b/src/components/media/MediaCard.tsx @@ -36,11 +36,11 @@ function MediaCardContent({ const percentageString = `${Math.round(percentage ?? 0).toFixed(0)}%`; const currentYear = new Date().getFullYear(); - const isReleased = media.year && media.year < currentYear; - const canLink = linkable && !closable && isReleased; + const canLink = + linkable && !closable && media.year && media.year < currentYear; const dotListContent = [t(`media.types.${media.type}`)]; - if (isReleased) { + if (media.year && media.year < currentYear) { dotListContent.push(media.year.toFixed()); } else { dotListContent.push(t("media.unreleased")); @@ -149,8 +149,11 @@ export function MediaCard(props: MediaCardProps) { const content = ; const currentYear = new Date().getFullYear(); - const isReleased = props.media.year && props.media.year < currentYear; - const canLink = props.linkable && !props.closable && isReleased; + const canLink = + props.linkable && + !props.closable && + props.media.year && + props.media.year < currentYear; let link = canLink ? `/media/${encodeURIComponent(mediaItemToId(props.media))}` From d82de1f7c89c214ec983bc244f4f1d3381410342 Mon Sep 17 00:00:00 2001 From: Captain Jack Sparrow <163903675+sussy-code@users.noreply.github.com> Date: Thu, 28 Mar 2024 05:17:17 -0400 Subject: [PATCH 007/101] Better scrape error text for extension (#1042) * Add better scrape error messages for the extension * Remove config.js silly me * Polish and resolve issues * Update src/pages/parts/player/ScrapeErrorPart.tsx Co-authored-by: William Oldham * Update src/pages/parts/player/ScrapeErrorPart.tsx Co-authored-by: William Oldham * Update src/pages/parts/player/ScrapeErrorPart.tsx Co-authored-by: William Oldham * Update src/pages/parts/player/ScrapeErrorPart.tsx Co-authored-by: William Oldham * Update src/pages/parts/player/ScrapeErrorPart.tsx Co-authored-by: William Oldham * Update src/pages/parts/player/ScrapeErrorPart.tsx Co-authored-by: William Oldham * Fix duplicate button value * Resolve issues * Ok now i fixed it all * Apply suggestions from code review * I am dum --------- Co-authored-by: Cooper Ransom Co-authored-by: William Oldham --- index.html | 2 +- src/assets/locales/en.json | 7 +++ src/pages/onboarding/OnboardingExtension.tsx | 23 +------- src/pages/parts/player/ScrapeErrorPart.tsx | 61 +++++++++++++++++++- src/utils/extension.ts | 20 +++++++ 5 files changed, 90 insertions(+), 23 deletions(-) create mode 100644 src/utils/extension.ts diff --git a/index.html b/index.html index 1d1c3577..4555b17a 100644 --- a/index.html +++ b/index.html @@ -162,4 +162,4 @@ - \ No newline at end of file + diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index eeda3629..ab128219 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -388,6 +388,13 @@ "homeButton": "Go home", "text": "We have searched through our providers and cannot find the media you are looking for! We do not host the media and have no control over what is available. Please click 'Show details' below for more details.", "title": "We couldn't find that" + }, + "extensionFailure": { + "badge": "Extension disabled", + "homeButton": "Go home", + "enableExtension": "Enable extension", + "title": "Please enable the extension", + "text": "You've installed the movie-web extension. To start using it, you need to enable the extension for this site." } }, "time": { diff --git a/src/pages/onboarding/OnboardingExtension.tsx b/src/pages/onboarding/OnboardingExtension.tsx index db351dda..66e662e2 100644 --- a/src/pages/onboarding/OnboardingExtension.tsx +++ b/src/pages/onboarding/OnboardingExtension.tsx @@ -2,8 +2,7 @@ import { ReactNode, useCallback, useEffect, useMemo, useState } from "react"; import { Trans, useTranslation } from "react-i18next"; import { useAsyncFn, useInterval } from "react-use"; -import { isAllowedExtensionVersion } from "@/backend/extension/compatibility"; -import { extensionInfo, sendPage } from "@/backend/extension/messaging"; +import { sendPage } from "@/backend/extension/messaging"; import { Button } from "@/components/buttons/Button"; import { Icon, Icons } from "@/components/Icon"; import { Loading } from "@/components/layout/Loading"; @@ -22,24 +21,8 @@ import { ExtensionDetectionResult, detectExtensionInstall, } from "@/utils/detectFeatures"; - -type ExtensionStatus = - | "unknown" - | "failed" - | "disallowed" - | "noperms" - | "outdated" - | "success"; - -async function getExtensionState(): Promise { - const info = await extensionInfo(); - if (!info) return "unknown"; // cant talk to extension - if (!info.success) return "failed"; // extension failed to respond - if (!info.allowed) return "disallowed"; // extension is not enabled on this page - if (!info.hasPermission) return "noperms"; // extension has no perms to do it's tasks - if (!isAllowedExtensionVersion(info.version)) return "outdated"; // extension is too old - return "success"; // no problems -} +import { getExtensionState } from "@/utils/extension"; +import type { ExtensionStatus } from "@/utils/extension"; function RefreshBar() { const { t } = useTranslation(); diff --git a/src/pages/parts/player/ScrapeErrorPart.tsx b/src/pages/parts/player/ScrapeErrorPart.tsx index 127a69a6..bc1f78e6 100644 --- a/src/pages/parts/player/ScrapeErrorPart.tsx +++ b/src/pages/parts/player/ScrapeErrorPart.tsx @@ -1,7 +1,8 @@ -import { useMemo } from "react"; -import { useTranslation } from "react-i18next"; +import { useEffect, useMemo, useState } from "react"; +import { Trans, useTranslation } from "react-i18next"; import { useLocation } from "react-router-dom"; +import { sendPage } from "@/backend/extension/messaging"; import { Button } from "@/components/buttons/Button"; import { Icons } from "@/components/Icon"; import { IconPill } from "@/components/layout/IconPill"; @@ -10,6 +11,8 @@ import { Paragraph } from "@/components/text/Paragraph"; import { Title } from "@/components/text/Title"; import { ScrapingItems, ScrapingSegment } from "@/hooks/useProviderScrape"; import { ErrorContainer, ErrorLayout } from "@/pages/layouts/ErrorLayout"; +import { getExtensionState } from "@/utils/extension"; +import type { ExtensionStatus } from "@/utils/extension"; import { getProviderApiUrls } from "@/utils/proxyUrls"; import { ErrorCardInModal } from "../errors/ErrorCard"; @@ -25,6 +28,8 @@ export function ScrapeErrorPart(props: ScrapeErrorPartProps) { const { t } = useTranslation(); const modal = useModal("error"); const location = useLocation(); + const [extensionState, setExtensionState] = + useState("unknown"); const error = useMemo(() => { const data = props.data; @@ -42,6 +47,58 @@ export function ScrapeErrorPart(props: ScrapeErrorPartProps) { return str; }, [props, location]); + useEffect(() => { + getExtensionState().then((state: ExtensionStatus) => { + setExtensionState(state); + }); + }, [t]); + + if (extensionState === "disallowed") { + return ( + + + + {t("player.scraping.extensionFailure.badge")} + + {t("player.scraping.extensionFailure.title")} + + + ), + }} + /> + +
+ + +
+
+
+ ); + } + return ( diff --git a/src/utils/extension.ts b/src/utils/extension.ts new file mode 100644 index 00000000..8874146b --- /dev/null +++ b/src/utils/extension.ts @@ -0,0 +1,20 @@ +import { isAllowedExtensionVersion } from "@/backend/extension/compatibility"; +import { extensionInfo } from "@/backend/extension/messaging"; + +export type ExtensionStatus = + | "unknown" + | "failed" + | "disallowed" + | "noperms" + | "outdated" + | "success"; + +export async function getExtensionState(): Promise { + const info = await extensionInfo(); + if (!info) return "unknown"; // cant talk to extension + if (!info.success) return "failed"; // extension failed to respond + if (!info.allowed) return "disallowed"; // extension is not enabled on this page + if (!info.hasPermission) return "noperms"; // extension has no perms to do it's tasks + if (!isAllowedExtensionVersion(info.version)) return "outdated"; // extension is too old + return "success"; // no problems +} From bfee71f44620e4d66e338f0f7e86303a811916c1 Mon Sep 17 00:00:00 2001 From: Honkertonken <94032937+Honkertonken@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:47:18 +0530 Subject: [PATCH 008/101] Update MediaCard.tsx --- src/components/media/MediaCard.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/media/MediaCard.tsx b/src/components/media/MediaCard.tsx index 937ff1c6..563e4d9b 100644 --- a/src/components/media/MediaCard.tsx +++ b/src/components/media/MediaCard.tsx @@ -37,10 +37,12 @@ function MediaCardContent({ const currentYear = new Date().getFullYear(); const canLink = - linkable && !closable && media.year && media.year < currentYear; + linkable && !closable && media.year && media.year <= currentYear; const dotListContent = [t(`media.types.${media.type}`)]; - if (media.year && media.year < currentYear) { + if (media.year && media.year > currentYear) { + dotListContent.push(`${media.year}`, t("media.unreleased")); + } else if (media.year) { dotListContent.push(media.year.toFixed()); } else { dotListContent.push(t("media.unreleased")); @@ -153,7 +155,7 @@ export function MediaCard(props: MediaCardProps) { props.linkable && !props.closable && props.media.year && - props.media.year < currentYear; + props.media.year <= currentYear; let link = canLink ? `/media/${encodeURIComponent(mediaItemToId(props.media))}` From 20202d2216c216ed9dc3e854081c6c4b3b9aef62 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Thu, 28 Mar 2024 13:39:18 +0000 Subject: [PATCH 009/101] Add logic for same year not released and fix language string --- src/assets/locales/en.json | 1 + src/backend/metadata/getmeta.ts | 4 +-- src/backend/metadata/tmdb.ts | 9 ++++--- src/backend/metadata/types/tmdb.ts | 2 +- src/components/media/MediaCard.tsx | 42 +++++++++++++++++++++--------- src/utils/mediaTypes.ts | 1 + 6 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index ab128219..bc042462 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -148,6 +148,7 @@ }, "media": { "episodeDisplay": "S{{season}} E{{episode}}", + "unreleased": "Unreleased", "types": { "movie": "Movie", "show": "Show" diff --git a/src/backend/metadata/getmeta.ts b/src/backend/metadata/getmeta.ts index add1089e..3da79ac2 100644 --- a/src/backend/metadata/getmeta.ts +++ b/src/backend/metadata/getmeta.ts @@ -43,7 +43,7 @@ export function formatTMDBMetaResult( title: movie.title, object_type: mediaTypeToTMDB(type), poster: getMediaPoster(movie.poster_path) ?? undefined, - original_release_year: new Date(movie.release_date).getFullYear(), + original_release_date: new Date(movie.release_date), }; } if (type === MWMediaType.SERIES) { @@ -58,7 +58,7 @@ export function formatTMDBMetaResult( title: v.name, })), poster: getMediaPoster(show.poster_path) ?? undefined, - original_release_year: new Date(show.first_air_date).getFullYear(), + original_release_date: new Date(show.first_air_date), }; } diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index b143b312..67c7d56f 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -66,7 +66,7 @@ export function formatTMDBMeta( return { title: media.title, id: media.id.toString(), - year: media.original_release_year?.toString(), + year: media.original_release_date?.getFullYear()?.toString(), poster: media.poster, type, seasons: seasons as any, @@ -94,7 +94,8 @@ export function formatTMDBMetaToMediaItem(media: TMDBMediaResult): MediaItem { return { title: media.title, id: media.id.toString(), - year: media.original_release_year ?? 0, + year: media.original_release_date?.getFullYear() ?? 0, + release_date: media.original_release_date, poster: media.poster, type, }; @@ -260,7 +261,7 @@ export function formatTMDBSearchResult( title: show.name, poster: getMediaPoster(show.poster_path), id: show.id, - original_release_year: new Date(show.first_air_date).getFullYear(), + original_release_date: new Date(show.first_air_date), object_type: mediatype, }; } @@ -271,7 +272,7 @@ export function formatTMDBSearchResult( title: movie.title, poster: getMediaPoster(movie.poster_path), id: movie.id, - original_release_year: new Date(movie.release_date).getFullYear(), + original_release_date: new Date(movie.release_date), object_type: mediatype, }; } diff --git a/src/backend/metadata/types/tmdb.ts b/src/backend/metadata/types/tmdb.ts index 1071d96c..5d082f55 100644 --- a/src/backend/metadata/types/tmdb.ts +++ b/src/backend/metadata/types/tmdb.ts @@ -20,7 +20,7 @@ export type TMDBMediaResult = { title: string; poster?: string; id: number; - original_release_year?: number; + original_release_date?: Date; object_type: TMDBContentTypes; seasons?: TMDBSeasonShort[]; }; diff --git a/src/components/media/MediaCard.tsx b/src/components/media/MediaCard.tsx index 563e4d9b..17ada085 100644 --- a/src/components/media/MediaCard.tsx +++ b/src/components/media/MediaCard.tsx @@ -1,4 +1,5 @@ import classNames from "classnames"; +import { useCallback } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; @@ -24,6 +25,20 @@ export interface MediaCardProps { onClose?: () => void; } +function checkReleased(media: MediaItem): boolean { + const isReleasedYear = Boolean( + media.year && media.year <= new Date().getFullYear(), + ); + const isReleasedDate = Boolean( + media.release_date && media.release_date <= new Date(), + ); + + // If the media has a release date, use that, otherwise use the year + const isReleased = media.release_date ? isReleasedDate : isReleasedYear; + + return isReleased; +} + function MediaCardContent({ media, linkable, @@ -35,16 +50,17 @@ function MediaCardContent({ const { t } = useTranslation(); const percentageString = `${Math.round(percentage ?? 0).toFixed(0)}%`; - const currentYear = new Date().getFullYear(); - const canLink = - linkable && !closable && media.year && media.year <= currentYear; + const isReleased = useCallback(() => checkReleased(media), [media]); + + const canLink = linkable && !closable && isReleased(); const dotListContent = [t(`media.types.${media.type}`)]; - if (media.year && media.year > currentYear) { - dotListContent.push(`${media.year}`, t("media.unreleased")); - } else if (media.year) { + + if (media.year) { dotListContent.push(media.year.toFixed()); - } else { + } + + if (!isReleased()) { dotListContent.push(t("media.unreleased")); } @@ -150,12 +166,12 @@ function MediaCardContent({ export function MediaCard(props: MediaCardProps) { const content = ; - const currentYear = new Date().getFullYear(); - const canLink = - props.linkable && - !props.closable && - props.media.year && - props.media.year <= currentYear; + const isReleased = useCallback( + () => checkReleased(props.media), + [props.media], + ); + + const canLink = props.linkable && !props.closable && isReleased(); let link = canLink ? `/media/${encodeURIComponent(mediaItemToId(props.media))}` diff --git a/src/utils/mediaTypes.ts b/src/utils/mediaTypes.ts index f577ca5f..c81b1ac0 100644 --- a/src/utils/mediaTypes.ts +++ b/src/utils/mediaTypes.ts @@ -2,6 +2,7 @@ export interface MediaItem { id: string; title: string; year?: number; + release_date?: Date; poster?: string; type: "show" | "movie"; } From de907cb313525cd29117b375ac6ea9dfcaefb869 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Fri, 29 Mar 2024 18:32:15 +0100 Subject: [PATCH 010/101] bump version and providers --- package.json | 4 ++-- pnpm-lock.yaml | 58 +++++++++++++++++++++++++------------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index 4eb7951a..5a1d5ca4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "movie-web", - "version": "4.6.2", + "version": "4.6.3", "private": true, "homepage": "https://github.com/movie-web/movie-web", "scripts": { @@ -29,7 +29,7 @@ "@formkit/auto-animate": "^0.8.1", "@headlessui/react": "^1.7.17", "@ladjs/country-language": "^1.0.3", - "@movie-web/providers": "^2.2.3", + "@movie-web/providers": "^2.2.5", "@noble/hashes": "^1.3.3", "@plasmohq/messaging": "^0.6.1", "@react-spring/web": "^9.7.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 313fae85..11d4f458 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,8 +22,8 @@ dependencies: specifier: ^1.0.3 version: 1.0.3 '@movie-web/providers': - specifier: ^2.2.3 - version: 2.2.3 + specifier: ^2.2.5 + version: 2.2.5 '@noble/hashes': specifier: ^1.3.3 version: 1.3.3 @@ -274,7 +274,7 @@ devDependencies: version: 0.5.9(prettier@3.1.1) rollup-plugin-visualizer: specifier: ^5.11.0 - version: 5.11.0(@rollup/wasm-node@4.13.0) + version: 5.11.0(@rollup/wasm-node@4.13.2) tailwind-scrollbar: specifier: ^3.0.5 version: 3.0.5(tailwindcss@3.4.0) @@ -1942,8 +1942,8 @@ packages: engines: {node: '>= 14'} dev: false - /@movie-web/providers@2.2.3: - resolution: {integrity: sha512-0axy02Zzlk7Tvtalc/Ebv9u5vzUPVWmQm0Ts5+6l6KPU41JUdLnFgmOl0yf0lbNeHRNSTx5SDlvWcYNL8rgpyA==} + /@movie-web/providers@2.2.5: + resolution: {integrity: sha512-/mBtU79uf2pfPwgkqKjoyuHGdDgHjKyGGVtd7xd0EQ5ds6ox5y2bSp4XtQRjZ7rZgyAh0aYFElAsY8SC+Nkz5g==} dependencies: cheerio: 1.0.0-rc.12 cookie: 0.6.0 @@ -2068,7 +2068,7 @@ packages: engines: {node: '>=14.0.0'} dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.13.0): + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.13.2): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2081,36 +2081,36 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-module-imports': 7.22.15 - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.13.0) - rollup: /@rollup/wasm-node@4.13.0 + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.13.2) + rollup: /@rollup/wasm-node@4.13.2 dev: true - /@rollup/plugin-node-resolve@11.2.1(@rollup/wasm-node@4.13.0): + /@rollup/plugin-node-resolve@11.2.1(@rollup/wasm-node@4.13.2): resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.13.0) + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.13.2) '@types/resolve': 1.17.1 builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.4 - rollup: /@rollup/wasm-node@4.13.0 + rollup: /@rollup/wasm-node@4.13.2 dev: true - /@rollup/plugin-replace@2.4.2(@rollup/wasm-node@4.13.0): + /@rollup/plugin-replace@2.4.2(@rollup/wasm-node@4.13.2): resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.13.0) + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.13.2) magic-string: 0.25.9 - rollup: /@rollup/wasm-node@4.13.0 + rollup: /@rollup/wasm-node@4.13.2 dev: true - /@rollup/pluginutils@3.1.0(@rollup/wasm-node@4.13.0): + /@rollup/pluginutils@3.1.0(@rollup/wasm-node@4.13.2): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2119,11 +2119,11 @@ packages: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: /@rollup/wasm-node@4.13.0 + rollup: /@rollup/wasm-node@4.13.2 dev: true - /@rollup/wasm-node@4.13.0: - resolution: {integrity: sha512-oFX11wzU7RTaiW06WBtRpzIVN/oaG0I3XkevNO0brBklYnY9zpLhTfksN4b+TdBt6CfXV/KdVhdWLbb0fQIR7A==} + /@rollup/wasm-node@4.13.2: + resolution: {integrity: sha512-4JXYomW63fBnXseG2mFkZwaNMDK0PkNamj9WD6H96FqEEl9ov3VjG3MK9UcOAj7Ap9o2weqSSCVng+QsxBeKfw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: @@ -5112,7 +5112,7 @@ packages: '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) '@babel/types': 7.23.6 kleur: 4.1.5 - rollup: /@rollup/wasm-node@4.13.0 + rollup: /@rollup/wasm-node@4.13.2 unplugin: 1.5.1 transitivePeerDependencies: - supports-color @@ -6040,7 +6040,7 @@ packages: glob: 7.2.3 dev: true - /rollup-plugin-terser@7.0.2(@rollup/wasm-node@4.13.0): + /rollup-plugin-terser@7.0.2(@rollup/wasm-node@4.13.2): resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser peerDependencies: @@ -6048,12 +6048,12 @@ packages: dependencies: '@babel/code-frame': 7.23.5 jest-worker: 26.6.2 - rollup: /@rollup/wasm-node@4.13.0 + rollup: /@rollup/wasm-node@4.13.2 serialize-javascript: 4.0.0 terser: 5.19.3 dev: true - /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.13.0): + /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.13.2): resolution: {integrity: sha512-exM0Ms2SN3AgTzMeW7y46neZQcyLY7eKwWAop1ZoRTCZwyrIRdMMJ6JjToAJbML77X/9N8ZEpmXG4Z/Clb9k8g==} engines: {node: '>=14'} hasBin: true @@ -6065,7 +6065,7 @@ packages: dependencies: open: 8.4.2 picomatch: 2.3.1 - rollup: /@rollup/wasm-node@4.13.0 + rollup: /@rollup/wasm-node@4.13.2 source-map: 0.7.4 yargs: 17.7.2 dev: true @@ -7051,7 +7051,7 @@ packages: '@types/node': 20.10.5 esbuild: 0.19.10 postcss: 8.4.32 - rollup: /@rollup/wasm-node@4.13.0 + rollup: /@rollup/wasm-node@4.13.2 optionalDependencies: fsevents: 2.3.3 dev: true @@ -7313,9 +7313,9 @@ packages: '@babel/core': 7.23.6 '@babel/preset-env': 7.23.6(@babel/core@7.23.6) '@babel/runtime': 7.23.6 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.13.0) - '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.13.0) - '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.13.0) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.13.2) + '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.13.2) + '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.13.2) '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.12.0 common-tags: 1.8.2 @@ -7324,8 +7324,8 @@ packages: glob: 7.2.3 lodash: 4.17.21 pretty-bytes: 5.6.0 - rollup: /@rollup/wasm-node@4.13.0 - rollup-plugin-terser: 7.0.2(@rollup/wasm-node@4.13.0) + rollup: /@rollup/wasm-node@4.13.2 + rollup-plugin-terser: 7.0.2(@rollup/wasm-node@4.13.2) source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 From 83cf6855d51a49ba35a48e3b0ef84fcc3f4c0e2d Mon Sep 17 00:00:00 2001 From: superlincoln953 Date: Fri, 15 Mar 2024 02:43:53 +0000 Subject: [PATCH 011/101] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (328 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/zh_Hant/ Author: superlincoln953 --- src/assets/locales/zh-Hant.json | 81 +++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/src/assets/locales/zh-Hant.json b/src/assets/locales/zh-Hant.json index 1d140961..58d3eafe 100644 --- a/src/assets/locales/zh-Hant.json +++ b/src/assets/locales/zh-Hant.json @@ -57,6 +57,8 @@ }, "host": "您正在連線到 <0>{{hostname}} - 在建立帳戶之前,請確保您信任它", "no": "返回", + "noHost": "因為沒有配置伺服器,所以你不能夠創建帳戶", + "noHostTitle": "没有配置伺服器!", "title": "您是否信任這個伺服器?", "yes": "我信任這個伺服器" }, @@ -71,7 +73,7 @@ } }, "errors": { - "badge": "它已損壞", + "badge": "它壞了", "details": "錯誤詳情", "reloadPage": "重新加載頁面", "showError": "顯示錯誤詳情", @@ -118,22 +120,33 @@ "noResults": "我们找不到任何结果!", "placeholder": { "default": "您想看什麼?", - "extra": [] + "extra": [ + "你想探索什麼?", + "你的觀看清單有甚麼電影/電視劇?", + "你最喜愛的電影是甚麽?", + "你最喜愛的電視劇是甚麽?" + ] }, "sectionTitle": "搜索結果" }, "titles": { "day": { "default": "您今天下午想看什麼?", - "extra": ["想要來場冒險嗎?《侏羅紀公園》可能是完美選擇。"] + "extra": [ + "想要來場冒險嗎?《侏羅紀公園》可能是完美選擇。" + ] }, "morning": { "default": "您今天早上想看什麼?", - "extra": ["我聽說《情留半天》不錯"] + "extra": [ + "我聽說《情留半天》不錯" + ] }, "night": { "default": "您今晚想看什麼?", - "extra": ["疲倦了嗎?我聽說《驅魔人》不錯。"] + "extra": [ + "疲倦了嗎?我聽說《驅魔人》不錯。" + ] } } }, @@ -150,7 +163,7 @@ }, "menu": { "about": "關於我們", - "donation": "捐", + "donation": "捐錢", "logout": "登出", "register": "同步到雲端", "settings": "設定", @@ -167,32 +180,32 @@ "defaultConfirm": { "cancel": "取消", "confirm": "使用預設設置", - "description": "默認設置沒有最好的直播,並且可能慢得令人難以忍受。", + "description": "默認設置沒有最好的串流,並且可能慢得令人難以忍受。", "title": "您確定嗎?" }, "extension": { "back": "返回", - "explainer": "使用瀏覽器擴展程式,您可以獲得我們提供的最佳直播。只需簡單的安裝。", - "explainerIos": "不幸的是,iOS 不支援瀏覽器擴展程式,按 返回 選擇其他選項。", - "extensionHelp": "如果您已安裝該擴展程式,但未檢測到該擴展程式, 請通過瀏覽器的擴展程式功能表打開該擴展 程式 ,然後按照螢幕上的步驟操作。", - "linkChrome": "安裝 Chrome 擴展程式", - "linkFirefox": "安裝 Firefox 擴展程式", + "explainer": "使用瀏覽器擴充功能,您可以獲得我們提供的最佳直播。只需簡單的安裝。", + "explainerIos": "不幸的是,iOS 不支援瀏覽器擴充功能,按 返回 選擇其他選項。", + "extensionHelp": "如果您已安裝該擴充功能,但未檢測到該擴充功能, 請通過瀏覽器的擴充功能功能表打開該擴展 程式 ,然後按照螢幕上的步驟操作。", + "linkChrome": "安裝 Chrome 擴充功能", + "linkFirefox": "安裝 Firefox 擴充功能", "notDetecting": "安裝在 Chrome 上,但網站沒有檢測到它?嘗試重新載入頁面!", "notDetectingAction": "重新加載頁面", "status": { - "disallowed": "未為此頁面啟用擴展程式", - "disallowedAction": "啟用擴展程式", + "disallowed": "未為此頁面啟用瀏覽器擴充功能", + "disallowedAction": "啟用瀏覽器擴充功能", "failed": "無法請求狀態", - "loading": "等待您安裝擴展程式", - "outdated": "擴展程式版本太舊", - "success": "擴展程式正在按預期工作!" + "loading": "等待您安裝瀏覽器擴充功能", + "outdated": "瀏覽器擴充功能版本太舊", + "success": "瀏覽器擴充功能正在正常運作!" }, "submit": "繼續", - "title": "讓我們從擴展程式開始" + "title": "讓我們從瀏覽器擴充功能開始" }, "proxy": { "back": "返回", - "explainer": "使用代理伺服器,您可以通過製作自定代理伺服器來獲得高品質的直播。", + "explainer": "使用代理伺服器,您可以通過製作自定代理伺服器來獲得高品質的串流。", "input": { "errorConnection": "無法連接到代理伺服器", "errorInvalidUrl": "URL 無效", @@ -208,17 +221,17 @@ "explainer": "為了獲得最好的流媒體,您需要選擇您想使用的流媒體方法。", "options": { "default": { - "text": "我不想要高品質的流,<0 /> <1> 使用預設設置" + "text": "我不想要高品質的串流,<0 /> <1> 使用預設設置" }, "extension": { - "action": "安裝擴展程式", - "description": "安裝瀏覽器擴展程式並訪問最佳資源。", + "action": "安裝瀏覽器擴充功能", + "description": "安裝瀏覽器擴充功能來使用最佳資源。", "quality": "最好的品質", - "title": "瀏覽器擴展程式" + "title": "瀏覽器擴充功能" }, "proxy": { "action": "設置代理伺服器", - "description": "只需 5 分鐘即可設置代理伺服器並訪問優質資源。", + "description": "只需 5 分鐘即可設置代理伺服器並訪問優質來源。", "quality": "好品質", "title": "自訂代理伺服器" } @@ -239,7 +252,8 @@ }, "menus": { "downloads": { - "disclaimer": "下載直接從供應商處獲取。movie-web 無法控制下載的提供方式。", + "copyHlsPlaylist": "複製 HLS 播放清單鏈接", + "disclaimer": "視頻直接從供應商處獲取。movie-web 無法控制下載的提供方式。", "downloadSubtitle": "下載當前字幕", "downloadVideo": "下載視頻", "hlsDisclaimer": "下載直接從供應商處獲取。movie-web 無法控制下載的提供方式。

請注意,您正在下載 HLS 播放清單, 如果您不熟悉高級流媒體格式,則不建議下載 。嘗試使用不同格式的不同來源。", @@ -261,10 +275,10 @@ "title": "下載" }, "episodes": { - "button": "分集", - "emptyState": "該季暫無分集,請稍後再來!", + "button": "集數", + "emptyState": "該季暫無集數,請稍後再來!", "episodeBadge": "E{{episode}}", - "loadingError": "加載分集時出錯", + "loadingError": "加載集數時出錯", "loadingList": "載入中...", "loadingTitle": "載入中...", "unairedEpisodes": "本季中的一集或多集已因尚未播出而被禁用。" @@ -276,7 +290,7 @@ "quality": { "automaticLabel": "自動品質", "hint": "您可以嘗試<0>切換源以獲得不同的質量選項。", - "iosNoQuality": "由於 Apple 定義的限制,此來源的品質選擇在 iOS 上不可用。您可以嘗試<0>切換到另一個來源以獲得不同的質量選項。", + "iosNoQuality": "由於 Apple 的限制,此來源的品質選擇在 iOS 上不可用。您可以嘗試<0>切換到另一個來源以獲得不同的質量選項。", "title": "品質" }, "settings": { @@ -330,9 +344,9 @@ }, "extensionPermission": { "badge": "缺少權限", - "button": "使用擴展程式", + "button": "使用瀏覽器擴充功能", "text": "您已安裝瀏覽器擴展,但我們需要您的許可才能啟用它。", - "title": "配置擴展程式" + "title": "配置瀏覽器擴充功能" }, "failed": { "badge": "失敗", @@ -386,9 +400,9 @@ }, "turnstile": { "description": "請通過右側的驗證碼來確認您是人類。這是為了保護 movie-web 的安全!", - "error": "無法驗證您的人類身份。請再試一次。", + "error": "無法驗證您是一個人類。請再試一次。", "title": "我們需要驗證您是否為人類。", - "verifyingHumanity": "正在驗證您的人類身份..." + "verifyingHumanity": "正在驗證您是不是一個人類..." } }, "screens": { @@ -522,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "背景模糊", "backgroundLabel": "背景不透明度", "colorLabel": "顏色", "previewQuote": "我絕不能害怕。 恐懼會扼殺思維能力。", From 759f9d54378d1b4fcdb161acba21a556d5af3cfd Mon Sep 17 00:00:00 2001 From: dimii27 Date: Fri, 15 Mar 2024 10:47:30 +0000 Subject: [PATCH 012/101] Translated using Weblate (Romanian) Currently translated at 89.0% (292 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ro/ Author: dimii27 --- src/assets/locales/ro.json | 82 +++++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 5 deletions(-) diff --git a/src/assets/locales/ro.json b/src/assets/locales/ro.json index 9a0ba2d9..4aa14f6f 100644 --- a/src/assets/locales/ro.json +++ b/src/assets/locales/ro.json @@ -57,6 +57,8 @@ }, "host": "Vă conectați la <0>{{hostname}} - vă rugăm să confirmați că aveți încredere înainte de a vă crea un cont", "no": "Întoarce-te", + "noHost": "Serverul nu a fost configurat, deci nu vă puteți crea un cont", + "noHostTitle": "Serverul nu este configurat!", "title": "Ai încredere în acest server?", "yes": "Am încredere în acest server" }, @@ -79,6 +81,7 @@ }, "footer": { "legal": { + "disclaimer": "Declinare a răspunderii", "disclaimerText": "movie-web nu găzduiește niciun fișier, ci doar trimite la servicii terțe. Problemele juridice ar trebui abordate cu gazdele și furnizorii de fișiere. movie-web nu este responsabil pentru niciun fișier media afișat de furnizorii de video." }, "links": { @@ -94,6 +97,7 @@ "about": "Despre", "dmca": "DMCA", "login": "Log in", + "onboarding": "Setup", "pagetitle": "{{title}} - movie-web", "register": "Inregistreaza-te", "settings": "Setări" @@ -116,7 +120,12 @@ "noResults": "Nu am putut găsi nimic!", "placeholder": { "default": "La ce dorești să te uiți?", - "extra": [] + "extra": [ + "Ce vrei să explorezi?", + "Ce e pe lista ta de urmărire?", + "Care e filmul tău preferat?", + "Care e serialul tău preferat?" + ] }, "sectionTitle": "Rezultate de căutare" }, @@ -129,11 +138,15 @@ }, "morning": { "default": "La ce dorești să te in uiți dimineață aceasta?", - "extra": ["Aud că Before Sunrise este bun"] + "extra": [ + "Aud că Before Sunrise este bun" + ] }, "night": { "default": "La ce dorești să te uiți în astă seară?", - "extra": ["Obosit? Aud că The Exorcist is good."] + "extra": [ + "Obosit? Aud că The Exorcist is good." + ] } } }, @@ -163,6 +176,65 @@ "message": "Ne-am uitat peste tot: sub pubele, în dulap, În spatele proxy-ului dar din păcate nu am găsit pagina pe care dumneavoastră o căutați.", "title": "N-am putut găsi pagina" }, + "onboarding": { + "defaultConfirm": { + "cancel": "Anulare", + "confirm": "Folosește setup-ul implicit", + "description": "Setupul implicit nu are cele mai bune stream-uri și poate fi insuportabil de încet.", + "title": "Sunteți sigur(ă)?" + }, + "extension": { + "back": "Înapoi", + "explainer": "Folosind această extensie de browser, puteți obține cele mai bune stream-uri pe care le avem de oferit. Cu doar o simplă instalare.", + "explainerIos": "Din păcate, extensia de browser nu e suportată pe iOS, Apăsați Înapoi pentru a alege altă opțiune.", + "extensionHelp": "Dacă ați instalat extensia dar nu e detectată, deschideți extensia din meniul extensiilor al browserului dvs. și urmăriți pașii de pe ecran.", + "linkChrome": "Instalare extensie pentru Chrome", + "linkFirefox": "Instalare extensie pentru Firefox", + "notDetecting": "Instalată pe Chrome dar site-ul nu o detectează? Încerați să reîmprospătați pagina!", + "notDetectingAction": "Reîmporospătare pagină", + "status": { + "disallowed": "Extensia nu e activată pentru această pagină", + "disallowedAction": "Activare extensie", + "failed": "Nu s-a putut obține statusul", + "loading": "Așteptăm să vă instalați extensia", + "outdated": "Versiunea extensiei este prea veche", + "success": "Extensia funcționează conform așteptărilor!" + }, + "submit": "Continuare", + "title": "Să începem cu o extensie" + }, + "proxy": { + "back": "Înapoi", + "explainer": "Cu metoda proxy, puteți obține stream-uri de calitate prin a face un proxy cu autoservire.", + "input": { + "errorConnection": "Nu s-a putut conecta la proxy", + "errorInvalidUrl": "URL invalid", + "errorNotProxy": "Proxi așteptat, primit un sitw web în schimb", + "label": "URL-ul proxy-ului", + "placeholder": "https://" + }, + "link": "Învață cum se face un proxy", + "submit": "Validare proxy", + "title": "Să facem un proxy nou" + }, + "start": { + "explainer": "Pentru a obține cele mai bune stream-uri posibile, va trebui să alegeți ce metodă de streaming vreți să folosiți.", + "options": { + "default": { + "text": "Nu vreau stream-uri de calitate,<0 /> <1>folosire setup implicit" + }, + "extension": { + "action": "Instalare extensie", + "description": "Instalați extensia browser și obțineți acces la cele mai bune surse.", + "quality": "Cea mai bună calitate", + "title": "Extensie browser" + }, + "proxy": { + "action": "Configurare proxy" + } + } + } + }, "overlays": { "close": "Închide" }, @@ -398,7 +470,7 @@ }, "connections": { "server": { - "description": "Dacă doriți să vă conectați la un backend personalizat pentru a vă stoca datele, activați acest lucru și furnizați adresa URL.", + "description": "Dacă doriți să vă conectați la un backend personalizat pentru a vă stoca datele, activați acest lucru și furnizați adresa URL. <0>Instrucțiuni.", "label": "Server personalizat", "urlLabel": "Adresa URL personalizată a serverului" }, @@ -410,7 +482,7 @@ "title": "Conexiuni", "workers": { "addButton": "Adaugă un nou muncitor", - "description": "Pentru ca aplicația să funcționeze, tot traficul este direcționat prin proxy. Activați acest lucru dacă doriți să vă aduceți proprii lucrători.", + "description": "Pentru ca aplicația să funcționeze, tot traficul este direcționat prin proxy. Activați acest lucru dacă doriți să vă aduceți proprii lucrători. <0>Instrucțiuni.", "emptyState": "Niciun muncitor incă, adaugă unu", "label": "Utilizați lucrători proxy personalizați", "urlLabel": "Adresele URL ale lucrătorilor", From a8263ec27ef0bc82913db168f0cd5310188a099c Mon Sep 17 00:00:00 2001 From: dimii27 Date: Sun, 17 Mar 2024 14:06:23 +0000 Subject: [PATCH 013/101] Translated using Weblate (Spanish) Currently translated at 100.0% (328 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/es/ Author: dimii27 --- src/assets/locales/es.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/locales/es.json b/src/assets/locales/es.json index ecc105d0..551ebaf3 100644 --- a/src/assets/locales/es.json +++ b/src/assets/locales/es.json @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Desefoque de fondo", "backgroundLabel": "Opacidad del fondo", "colorLabel": "Color", "previewQuote": "No debo temer. El miedo es el asesino de la mente.", From 12fd425ca69e629cb700717bafdaed500cfe3cfb Mon Sep 17 00:00:00 2001 From: Thais Palmer Date: Sat, 16 Mar 2024 23:32:14 +0000 Subject: [PATCH 014/101] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (328 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/pt_BR/ Author: Thais Palmer --- src/assets/locales/pt-BR.json | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/assets/locales/pt-BR.json b/src/assets/locales/pt-BR.json index 24cbe831..20dc49a6 100644 --- a/src/assets/locales/pt-BR.json +++ b/src/assets/locales/pt-BR.json @@ -57,6 +57,8 @@ }, "host": "Você está se conectando a <0>{{hostname}} - por favor, confirme se confia nele antes de criar uma conta", "no": "Voltar", + "noHost": "O servidor não foi configurado, portanto você não pode criar uma conta", + "noHostTitle": "Servidor não configurado!", "title": "Você confia neste servidor?", "yes": "Eu confio neste servidor" }, @@ -118,7 +120,12 @@ "noResults": "Não conseguimos encontrar nada!", "placeholder": { "default": "O que você quer assistir?", - "extra": [] + "extra": [ + "O que você gostaria de explorar?", + "O que está na sua lista para assistir?", + "Qual o seu filme favorito?", + "Qual a sua série favorita?" + ] }, "sectionTitle": "Resultados da pesquisa" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "O que você gostaria de assistir esta manhã?", - "extra": ["Ouvi dizer que Antes do Amanhecer é bom"] + "extra": [ + "Ouvi dizer que Antes do Amanhecer é bom" + ] }, "night": { "default": "O que você gostaria de assistir esta noite?", - "extra": ["Cansado? Ouvi dizer que O Exorcista é bom."] + "extra": [ + "Cansado? Ouvi dizer que O Exorcista é bom." + ] } } }, @@ -525,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Desfoque de fundo", "backgroundLabel": "Opacidade do fundo", "colorLabel": "Cor", "previewQuote": "Eu não devo ter medo. Medo é o assassino da mente.", From 3bf85c27bd4476013c492b4d0ab21e6e1aa4a570 Mon Sep 17 00:00:00 2001 From: Daanii Kusnanta Date: Sat, 16 Mar 2024 19:56:53 +0000 Subject: [PATCH 015/101] Translated using Weblate (Indonesian) Currently translated at 76.8% (252 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/id/ Author: Daanii Kusnanta --- src/assets/locales/id.json | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/assets/locales/id.json b/src/assets/locales/id.json index de2153ca..977f1107 100644 --- a/src/assets/locales/id.json +++ b/src/assets/locales/id.json @@ -95,6 +95,7 @@ "about": "Tentang", "dmca": "DMCA", "login": "Masuk", + "onboarding": "Penyiapan", "pagetitle": "{{title}} - movie-web", "register": "Daftar", "settings": "Pengaturan" @@ -117,7 +118,12 @@ "noResults": "Kami tidak dapat menemukan apapun!", "placeholder": { "default": "Apa yang ingin anda tonton?", - "extra": [] + "extra": [ + "Apa yang ingin kamu jelajahi?", + "Ada apa di daftar tontonmu?", + "Apa film favoritmu?", + "Apa serial favoritmu?" + ] }, "sectionTitle": "Hasil pencarian" }, @@ -130,11 +136,15 @@ }, "morning": { "default": "Apa yang ingin anda tonton pagi ini?", - "extra": ["Kayaknya film Before Sunrise bagus deh"] + "extra": [ + "Kayaknya film Before Sunrise bagus deh" + ] }, "night": { "default": "Apa yang ingin anda tonton malam ini?", - "extra": ["Capek? Katanya The Exocist rekomended."] + "extra": [ + "Capek? Katanya The Exocist rekomended." + ] } } }, @@ -164,6 +174,16 @@ "message": "Kami sudah mencari dimana-mana: di bawah tempat sampah, di lemari, di belakang server proxy, tapi tetap gagal menemukan halaman yang anda cari.", "title": "Gagal menemukan halaman" }, + "onboarding": { + "defaultConfirm": { + "cancel": "Batal", + "title": "Apa kamu yakin?" + }, + "extension": { + "back": "Kembali", + "explainerIos": "Sayangnya, ekstensi browser tidak didukung di iOS, Tekan Kembali untuk memilih opsi lain." + } + }, "overlays": { "close": "Tutup" }, From 7ed49b2e8f35c4bf6a778cc2d3456852b37def18 Mon Sep 17 00:00:00 2001 From: dimii27 Date: Sun, 17 Mar 2024 13:40:02 +0000 Subject: [PATCH 016/101] Translated using Weblate (Romanian) Currently translated at 100.0% (328 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ro/ Author: dimii27 --- src/assets/locales/ro.json | 61 ++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/src/assets/locales/ro.json b/src/assets/locales/ro.json index 4aa14f6f..c40f6475 100644 --- a/src/assets/locales/ro.json +++ b/src/assets/locales/ro.json @@ -97,7 +97,7 @@ "about": "Despre", "dmca": "DMCA", "login": "Log in", - "onboarding": "Setup", + "onboarding": "Configurație", "pagetitle": "{{title}} - movie-web", "register": "Inregistreaza-te", "settings": "Setări" @@ -122,7 +122,7 @@ "default": "La ce dorești să te uiți?", "extra": [ "Ce vrei să explorezi?", - "Ce e pe lista ta de urmărire?", + "Ce e pe lista dvs. de urmărire?", "Care e filmul tău preferat?", "Care e serialul tău preferat?" ] @@ -179,19 +179,19 @@ "onboarding": { "defaultConfirm": { "cancel": "Anulare", - "confirm": "Folosește setup-ul implicit", - "description": "Setupul implicit nu are cele mai bune stream-uri și poate fi insuportabil de încet.", + "confirm": "Folosește configurația implicită", + "description": "Configurația implicită nu are cele mai bune fluxuri și poate fi insuportabil de înceată.", "title": "Sunteți sigur(ă)?" }, "extension": { "back": "Înapoi", - "explainer": "Folosind această extensie de browser, puteți obține cele mai bune stream-uri pe care le avem de oferit. Cu doar o simplă instalare.", + "explainer": "Folosind această extensie de browser, puteți obține cele mai bune fluxuri pe care le avem de oferit. Cu doar o simplă instalare.", "explainerIos": "Din păcate, extensia de browser nu e suportată pe iOS, Apăsați Înapoi pentru a alege altă opțiune.", "extensionHelp": "Dacă ați instalat extensia dar nu e detectată, deschideți extensia din meniul extensiilor al browserului dvs. și urmăriți pașii de pe ecran.", "linkChrome": "Instalare extensie pentru Chrome", "linkFirefox": "Instalare extensie pentru Firefox", "notDetecting": "Instalată pe Chrome dar site-ul nu o detectează? Încerați să reîmprospătați pagina!", - "notDetectingAction": "Reîmporospătare pagină", + "notDetectingAction": "Reîncarcă pagina", "status": { "disallowed": "Extensia nu e activată pentru această pagină", "disallowedAction": "Activare extensie", @@ -205,11 +205,11 @@ }, "proxy": { "back": "Înapoi", - "explainer": "Cu metoda proxy, puteți obține stream-uri de calitate prin a face un proxy cu autoservire.", + "explainer": "Cu metoda proxy, puteți obține fluxuri de calitate prin a face un proxy cu autoservire.", "input": { "errorConnection": "Nu s-a putut conecta la proxy", "errorInvalidUrl": "URL invalid", - "errorNotProxy": "Proxi așteptat, primit un sitw web în schimb", + "errorNotProxy": "Am așteptat un proxy dar am primit un site web", "label": "URL-ul proxy-ului", "placeholder": "https://" }, @@ -218,10 +218,10 @@ "title": "Să facem un proxy nou" }, "start": { - "explainer": "Pentru a obține cele mai bune stream-uri posibile, va trebui să alegeți ce metodă de streaming vreți să folosiți.", + "explainer": "Pentru a obține cele mai bune fluxuri posibile, va trebui să alegeți ce metodă de streaming vreți să folosiți.", "options": { "default": { - "text": "Nu vreau stream-uri de calitate,<0 /> <1>folosire setup implicit" + "text": "Nu vreau fluxuri de calitate,<0 /> <1>folosește configurația implicită" }, "extension": { "action": "Instalare extensie", @@ -230,9 +230,13 @@ "title": "Extensie browser" }, "proxy": { - "action": "Configurare proxy" + "action": "Configurare proxy", + "description": "Configurați un proxy în doar 5 minute și obținți acces la resurse grozave.", + "quality": "Calitate bună", + "title": "Proxy personalizat" } - } + }, + "title": "Hai să configurăm movie-web" } }, "overlays": { @@ -248,10 +252,11 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "Copiere link către lista de redare HLS", "disclaimer": "Descărcările sunt luate direct de la furnizor. Movie-web nu are control cum descărcările sunt furnizate.", "downloadSubtitle": "Descărcați subtitlul curente", "downloadVideo": "Descarcă video", - "hlsDisclaimer": "Descărcările sunt preluate direct de la furnizor. movie-web nu are control asupra modului în care sunt furnizate descărcările. Vă rugăm să rețineți că descărcați o listă de redare HLS, aceasta este destinată utilizatorilor familiar cu streamingul avansat.", + "hlsDisclaimer": "Descărcările sunt preluate direct de la furnizor. movie-web nu are control asupra modului în care sunt furnizate descărcările.

Vă rugăm să rețineți că descărcați o listă de redare HLS, nu este recomandat să o descărcați dacă nu sunteți familiari cu formate avasate de streaming. Încercați surse diferite pentru formate diferte.", "onAndroid": { "1": "Pentru a descărca pe android, apăsați butonul de descărcare apoi în pagina nouă,apăsați și țineți pe video, apoi selectați salvează.", "shortTitle": "Descărcare / Android", @@ -308,8 +313,8 @@ "title": "Nu a fost găsită nicio încorporare" }, "noStream": { - "text": "Sursa asta nu are nicio sursă de streaming pentru filmul său spectacolul.", - "title": "Niciun stream" + "text": "Sursa aceasta nu are niciun flux pentru acest film sau serial.", + "title": "Niciun flux" }, "title": "Surse", "unknownOption": "Necunoscut" @@ -475,8 +480,25 @@ "urlLabel": "Adresa URL personalizată a serverului" }, "setup": { + "doSetup": "Configurează", "errorStatus": { + "description": "Se pare că unul sau mai multe obiecte din această configurație au nevoie de atenția ta.", "title": "Ceva are nevoie de atenția ta" + }, + "itemError": "Ceva nu e bine cu această setare. Parcurge configurația din nou pentru a o corecta.", + "items": { + "default": "Configurație implicită", + "extension": "Extensie", + "proxy": "Proxy personalizat" + }, + "redoSetup": "Refă configurația", + "successStatus": { + "description": "Toate sunt la locul lor ca să începeți să urmariți conținutul preferat.", + "title": "Totul este pregătit!" + }, + "unsetStatus": { + "description": "Apăsați butonul din dreapta pentru a începe procesul de configurare.", + "title": "Nu ați parcurs configurația" } }, "title": "Conexiuni", @@ -489,6 +511,14 @@ "urlPlaceholder": "https://" } }, + "preferences": { + "language": "Limba aplicației", + "languageDescription": "Limba aplicată întregii aplicații.", + "thumbnail": "Generați pictograme", + "thumbnailDescription": "De cele mai multe ori videoclipurile nu au pictograme. Puteți activa această setare pentru a le genera din mers, dar vă pot încetini videoclipul.", + "thumbnailLabel": "Generați pictograme", + "title": "Preferințe" + }, "reset": "Resetare", "save": "Salvează", "sidebar": { @@ -506,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Blurarea fundalului", "backgroundLabel": "Opacitatea fundalului", "colorLabel": "Culoare", "previewQuote": "nu trebuie să mă tem. Frica este ucigașul minții.", From 1d97dca90cf2a0b1d85f9c0e5c85a728ed53fe47 Mon Sep 17 00:00:00 2001 From: LeBron James Date: Sun, 17 Mar 2024 22:49:09 +0000 Subject: [PATCH 017/101] Translated using Weblate (Turkish) Currently translated at 98.4% (323 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/tr/ Author: LeBron James --- src/assets/locales/tr.json | 125 +++++++++++++++++++++++++++++++++++-- 1 file changed, 121 insertions(+), 4 deletions(-) diff --git a/src/assets/locales/tr.json b/src/assets/locales/tr.json index 5d8a24b3..cf225f91 100644 --- a/src/assets/locales/tr.json +++ b/src/assets/locales/tr.json @@ -57,6 +57,8 @@ }, "host": "<0>{{hostname}} adlı sunucuya bağlanıyorsunuz - lütfen hesap oluşturmadan önce sunucuya güvendiğinizi onaylayın", "no": "Geri dön", + "noHost": "Sunucu henüz yapılandırılmadığı için hesap oluşturamazsınız", + "noHostTitle": "Sunucu kullanılamıyor!", "title": "Bu sunucuya güveniyor musunuz?", "yes": "Bu sunucuya güveniyorum" }, @@ -118,7 +120,12 @@ "noResults": "Hiçbir şey bulamadık!", "placeholder": { "default": "Ne izlemek istersiniz?", - "extra": [] + "extra": [ + "Ne keşfetmek istiyorsunuz?", + "İzleme listenizde neler var?", + "Favori filmin ne?", + "En sevdiğiniz dizi ne?" + ] }, "sectionTitle": "Arama sonuçları" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "Bu sabah ne izlemek istersiniz?", - "extra": ["Before Sunrise'a iyi diyorlar"] + "extra": [ + "Before Sunrise'a iyi diyorlar" + ] }, "night": { "default": "Bu akşam ne izlemek istersiniz?", - "extra": ["Yoruldun mu? The Exorcist'e iyi diyorlar."] + "extra": [ + "Yoruldun mu? The Exorcist'e iyi diyorlar." + ] } } }, @@ -165,6 +176,69 @@ "message": "Her yere baktık: bazanın altına, dolabın içine hatta ara sunucuya ama maalesef aradığınız sayfayı bulamadık.", "title": "Sayfa bulunamadı" }, + "onboarding": { + "defaultConfirm": { + "cancel": "İptal Et", + "confirm": "Ön Tanımlı Ayarları Kullan", + "description": "Varsayılan ayarlar en iyi akış hizmetlerini sunmayabilir ve oldukça yavaş olabilir.", + "title": "Emin misiniz?" + }, + "extension": { + "back": "Geri Dön", + "explainer": "Tarayıcı uzantısını kullanarak, size sunduğumuz en iyi akışlara erişebilirsiniz. Kurulumu ise oldukça basit.", + "explainerIos": "Ne yazık ki, tarayıcı uzantısı iOS cihazlarında desteklenmemektedir. Geri Dön düğmesine basarak başka bir seçenek seçebilirsiniz.", + "extensionHelp": "Eklenti yüklediyseniz ancak algılamıyorsa, tarayıcınızın uzantı menüsünden eklentiyi açın ve ekran adımları takip edin.", + "linkChrome": "Chrome uzantısını yükleyin", + "linkFirefox": "Firefox uzantısını yükleyin", + "notDetecting": "Chrome'a yüklendi, ancak site algılamıyor mu? Sayfayı yenileyin!", + "notDetectingAction": "Sayfayı yenile", + "status": { + "disallowed": "Bu sayfa için uzantı etkinleştirilmemiş", + "disallowedAction": "Uzantıyı etkinleştir", + "failed": "Durum bilgisi alınamadı", + "loading": "Uzantıyı yüklemenizi bekliyoruz", + "outdated": "Uzantınız çok eski", + "success": "Uzantı sorunsuz çalışıyor!" + }, + "submit": "Devam Et", + "title": "Hadi bir uzantıyla başlayalım" + }, + "proxy": { + "back": "Geri Dön", + "explainer": "Ara sunucu yöntemiyle, yüksek kalitede yayınlara kolayca erişin.", + "input": { + "errorConnection": "Proxy'ye bağlanılamadı", + "errorInvalidUrl": "Geçerli bir URL değil", + "errorNotProxy": "Proxy bekleniyordu, web sitesine yönlendirildi", + "label": "Proxy URL", + "placeholder": "https://" + }, + "link": "Proxy oluşturmayı öğrenin", + "submit": "Proxy'yi Gönder", + "title": "Hadi yeni bir proxy oluşturalım" + }, + "start": { + "explainer": "En iyi akış deneyimi için kullanmak istediğiniz akış yöntemini seçmeniz gerekiyor.", + "options": { + "default": { + "text": "Yüksek kaliteli akış istemiyorum,<0 /> <1>varsayılan ayarı kullanın" + }, + "extension": { + "action": "Uzantıyı Yükle", + "description": "En iyi kaynaklara erişmek için tarayıcı uzantısını yükleyin.", + "quality": "En yüksek kalite", + "title": "Tarayıcı uzantısı" + }, + "proxy": { + "action": "Proxy'yi Kur", + "description": "Sadece 5 dakikada proxy kurun ve harika kaynaklara erişin.", + "quality": "İyi kalite", + "title": "Özel Proxy" + } + }, + "title": "movie-web ile sizi hazır hale getirelim" + } + }, "overlays": { "close": "Kapat" }, @@ -178,10 +252,11 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "HLS oynatma listesi bağlantısını kopyala", "disclaimer": "İndirme bağlantıları doğrudan sağlayıcının kendisinden alınır. movie-web'in sağlanan indirme bağlantıları üzerinde hiçbir konrolü yoktur.", "downloadSubtitle": "Geçerli altyazıyı indir", "downloadVideo": "Videoyu indir", - "hlsDisclaimer": "İndirme bağlantıları doğrudan sağlayıcının kendisinden alınır. movie-web'in sağlanan indirme bağlantıları üzerinde hiçbir konrolü yoktur. Lütfen bir HLS oynatma listesi indirdiğinizi unutmayın; bu, gelişmiş multimedya akışına aşina olan kullanıcılara yöneliktir.", + "hlsDisclaimer": "İndirmeler doğrudan sağlayıcıdan alınır. movie-web, indirmelerin nasıl sağlanacağı üzerinde kontrole sahip değildir.

Lütfen bir HLS oynatma listesi indirdiğinizi unutmayın; ileri seviye bilginiz yoksa indirmeniz önerilmez. akış biçimleri. Farklı formatlar için farklı kaynakları deneyin.", "onAndroid": { "1": "Android'e indirmek için önce indir butonuna basın, sonra açılan yeni sayfada video üzerine basılı tutun, ardından Videoyu indir seçeneğini seçin.", "shortTitle": "İndir / Android", @@ -262,6 +337,17 @@ "text": "API üstverisi yüklenemedi, lütfen internet bağlantınızı kontrol edin.", "title": "API üstverisi yüklenemedi" }, + "dmca": { + "badge": "Kaldırıldı", + "text": "Üzgünüz, bu içerik telif hakkı ihlali veya yayından kaldırma bildirimi nedeniyle kullanılamıyor.", + "title": "İçerik kaldırıldı" + }, + "extensionPermission": { + "badge": "İzin Gerekli", + "button": "Uzantıyı kullanın", + "text": "Tarayıcı uzantısını yüklemişsiniz, ancak uzantıyı kullanmaya başlamak için izninize ihtiyacımız var.", + "title": "Uzantıyı Kişiselleştir" + }, "failed": { "badge": "Başarısız oldu", "homeButton": "Ana sayfaya dön", @@ -393,6 +479,28 @@ "label": "Özel sunucu", "urlLabel": "Özel sunucu URL'si" }, + "setup": { + "doSetup": "Başlayın", + "errorStatus": { + "description": "Kurulumda dikkat etmeniz gereken bir veya daha fazla öğe var gibi görünüyor.", + "title": "Dikkatinizi gerektiren bir şey var" + }, + "itemError": "Kurulum sırasında bir hata oluşmuş olabilir. Sorunu çözmek için kurulum adımlarını tekrar izleyin.", + "items": { + "default": "Varsayılan ayarlar", + "extension": "Tarayıcı uzantısı", + "proxy": "Özel Proxy" + }, + "redoSetup": "Kurulumu tekrar yapın", + "successStatus": { + "description": "Sevdiğiniz şeyleri izlemek için her şey hazır. Başlayın ve keyfini çıkarın.", + "title": "Tamam!" + }, + "unsetStatus": { + "description": "Kurulum sürecini başlatmak için lütfen sağdaki düğmeye tıklayın.", + "title": "Başlamak için kurulumu tamamlamanız gerekiyor." + } + }, "title": "Bağlantılar", "workers": { "addButton": "Yeni işleyici ekle", @@ -403,6 +511,14 @@ "urlPlaceholder": "https://" } }, + "preferences": { + "language": "Uygulama dili", + "languageDescription": "Uygulamanın tamamı için seçili dil", + "thumbnail": "Küçük resimler oluştur", + "thumbnailDescription": "Çoğu video için ön izleme görseli bulunmaz. Bu ayarı etkinleştirerek anında oluşturulmasını sağlayabilirsiniz, ancak bu videonuzu yavaşlatabilir.", + "thumbnailLabel": "Küçük resimler oluştur", + "title": "Ayarlar" + }, "reset": "Sıfırla", "save": "Kaydet", "sidebar": { @@ -420,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Arka plan bulanıklığı", "backgroundLabel": "Arka plan opaklığı", "colorLabel": "Renk", "previewQuote": "Korkmamalıyım. Korku aklın katilidir.", From 274f9dc888a27f60688440b9c7cf86e9a2f8c421 Mon Sep 17 00:00:00 2001 From: superlincoln953 Date: Mon, 18 Mar 2024 01:46:14 +0000 Subject: [PATCH 018/101] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (328 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/zh_Hant/ Author: superlincoln953 --- src/assets/locales/zh-Hant.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/assets/locales/zh-Hant.json b/src/assets/locales/zh-Hant.json index 58d3eafe..3680258f 100644 --- a/src/assets/locales/zh-Hant.json +++ b/src/assets/locales/zh-Hant.json @@ -1,6 +1,6 @@ { "about": { - "description": "movie-web 是一款在互聯網上搜尋流媒體的網路應用程式。團隊致力於讓使用者以最簡約的方式消費內容。", + "description": "movie-web 是一款在互聯網上搜尋串流媒體的網路應用程式。團隊致力於讓使用者以最簡約的方式觀看內容。", "faqTitle": "常見問題", "q1": { "body": "movie-web 不託管任何內容。您點選觀看內容時,系統均從互聯網搜尋(在加載提示頁和“視頻源”選項卡中,您可以看到正在使用的源)。媒體從未在 movie-web 中上傳,所有內容均通過搜索機制而得。", @@ -12,7 +12,7 @@ }, "q3": { "body": "我們的搜尋結果由電影資料庫(TMDB)驅動,無論視訊來源是否有對應內容,都會顯示結果。", - "title": "搜尋結果中已顯示了影視劇或其他節目,為何我無法播放?" + "title": "搜尋結果中已顯示了電視劇或其他節目,為何我無法播放?" }, "title": "關於 movie-web" }, @@ -22,18 +22,18 @@ }, "auth": { "createAccount": "還沒有帳戶? <0>建立一個", - "deviceNameLabel": "設備名稱", + "deviceNameLabel": "裝置名稱", "deviceNamePlaceholder": "我的手機", "generate": { "description": "您的密碼短語相當於使用者名稱與密碼。由於您需要輸入它來登入帳戶,請確保將其存放到安全位置", - "next": "我已儲存密碼短語", + "next": "我已經儲存密碼短語", "passphraseFrameLabel": "密碼短語", "title": "您的密碼短語" }, "hasAccount": "已經擁有帳戶? <0>點此登入。 ", "login": { "description": "請輸入密碼短語以登入您的帳戶", - "deviceLengthError": "請輸入設備名稱", + "deviceLengthError": "請輸入裝置名稱", "passphraseLabel": "12 字密碼短語", "passphrasePlaceholder": "密碼短語", "submit": "登入", @@ -89,7 +89,7 @@ "dmca": "DMCA", "github": "GitHub" }, - "tagline": "使用這個開源流媒體應用程序觀看您最喜歡的節目和電影。" + "tagline": "使用這個開源串流媒體應用程式觀看您最喜歡的節目和電影。" }, "global": { "name": "movie-web", @@ -145,7 +145,7 @@ "night": { "default": "您今晚想看什麼?", "extra": [ - "疲倦了嗎?我聽說《驅魔人》不錯。" + "你疲倦嗎?我聽說《驅魔人》不錯。" ] } } @@ -218,7 +218,7 @@ "title": "讓我們創建一個新的代理伺服器" }, "start": { - "explainer": "為了獲得最好的流媒體,您需要選擇您想使用的流媒體方法。", + "explainer": "為了獲得最好的串流媒體,您需要選擇您想使用的串流方法。", "options": { "default": { "text": "我不想要高品質的串流,<0 /> <1> 使用預設設置" @@ -248,7 +248,7 @@ "short": "後退" }, "casting": { - "enabled": "正在投放到設備…" + "enabled": "正在投放到裝置…" }, "menus": { "downloads": { @@ -345,7 +345,7 @@ "extensionPermission": { "badge": "缺少權限", "button": "使用瀏覽器擴充功能", - "text": "您已安裝瀏覽器擴展,但我們需要您的許可才能啟用它。", + "text": "您已安裝瀏覽器擴展功能,但我們需要您的許可才能啟用它。", "title": "配置瀏覽器擴充功能" }, "failed": { @@ -382,7 +382,7 @@ "items": { "failure": "發生錯誤", "notFound": "沒有視頻", - "pending": "檢查影片..." + "pending": "尋找影片中..." }, "notFound": { "badge": "未找到", @@ -444,7 +444,7 @@ }, "devices": { "deviceNameLabel": "設備名稱", - "failed": "無法載入階段", + "failed": "無法載入", "removeDevice": "刪除", "title": "設備" }, @@ -517,7 +517,7 @@ "thumbnail": "生成縮圖", "thumbnailDescription": "大多數時候,視頻沒有縮圖。您可以啟用此設置以即時生成它們,但它們會使您的視頻變慢。", "thumbnailLabel": "生成縮圖", - "title": "偏好" + "title": "偏好設定" }, "reset": "重置", "save": "保存", @@ -530,7 +530,7 @@ "insecure": "不安全", "notLoggedIn": "您尚未登錄", "secure": "安全", - "title": "應用資訊", + "title": "應用程式的資訊", "unknownVersion": "未知", "userId": "使用者ID" } From 6681a4471bec8c36949e3effdcfe53e00a377909 Mon Sep 17 00:00:00 2001 From: aryiu Date: Sun, 17 Mar 2024 14:54:37 +0000 Subject: [PATCH 019/101] Translated using Weblate (Catalan) Currently translated at 100.0% (328 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ca/ Author: aryiu --- src/assets/locales/ca.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/locales/ca.json b/src/assets/locales/ca.json index aa0888bb..1d91529a 100644 --- a/src/assets/locales/ca.json +++ b/src/assets/locales/ca.json @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Difuminat del fons", "backgroundLabel": "Opacitat del fons", "colorLabel": "Color", "previewQuote": "No he de tenir por. La por és l'assassina de la ment.", From dbcf060d4c7fbeeae6d0b36579ad1fdbed4c41e7 Mon Sep 17 00:00:00 2001 From: aryiu Date: Sun, 17 Mar 2024 14:54:44 +0000 Subject: [PATCH 020/101] Translated using Weblate (Valencian) Currently translated at 100.0% (328 of 328 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 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/locales/ca@valencia.json b/src/assets/locales/ca@valencia.json index 078c7a10..f39f3230 100644 --- a/src/assets/locales/ca@valencia.json +++ b/src/assets/locales/ca@valencia.json @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Difuminat del fons", "backgroundLabel": "Opacitat del fons", "colorLabel": "Color", "previewQuote": "No he de tindre por. La por és l'assassina de la ment.", From 4afd7dea1392a64e391f2dd4075f03559926c37f Mon Sep 17 00:00:00 2001 From: Mehdi Date: Tue, 19 Mar 2024 06:14:07 +0000 Subject: [PATCH 021/101] Translated using Weblate (Persian) Currently translated at 100.0% (328 of 328 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 26f59428..0a7d91f9 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -89,7 +89,7 @@ "dmca": "DMCA", "github": "گیت هاب" }, - "tagline": "فیلم و سریال مورد علاقه‌تان را با این برنامه استریم متن باز تماشا کنید." + "tagline": "فیلم و سریال مورد علاقه‌تان را با این برنامه استریم اوپن سورس تماشا کنید." }, "global": { "name": "مووی-وب", From b73a24d357ad8809eb8c4aaed0d350adaec4b94a Mon Sep 17 00:00:00 2001 From: Jamie Poznanski Date: Tue, 26 Mar 2024 10:50:05 +0000 Subject: [PATCH 022/101] Translated using Weblate (Italian) Currently translated at 100.0% (329 of 329 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/it/ Author: Jamie Poznanski --- src/assets/locales/it.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/locales/it.json b/src/assets/locales/it.json index 875b44d5..43a17451 100644 --- a/src/assets/locales/it.json +++ b/src/assets/locales/it.json @@ -294,6 +294,7 @@ "title": "Qualità" }, "settings": { + "audioItem": "Audio", "downloadItem": "Scarica", "enableSubtitles": "Abilita i sottotitoli", "experienceSection": "Esperienza di visione", From bf26e171d65d4db74667ab7c55aa659a283b8c75 Mon Sep 17 00:00:00 2001 From: n1ck Date: Tue, 26 Mar 2024 09:53:49 +0000 Subject: [PATCH 023/101] Translated using Weblate (Spanish) Currently translated at 100.0% (329 of 329 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/es/ Author: n1ck --- src/assets/locales/es.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/locales/es.json b/src/assets/locales/es.json index 551ebaf3..415606b7 100644 --- a/src/assets/locales/es.json +++ b/src/assets/locales/es.json @@ -294,6 +294,7 @@ "title": "Calidad" }, "settings": { + "audioItem": "Audio", "downloadItem": "Descargar", "enableSubtitles": "Habilitar subtítulos", "experienceSection": "Experiencia de visualización", From 72e6c1cf2ca202c354c5949925babee4b582104a Mon Sep 17 00:00:00 2001 From: Thais Palmer Date: Mon, 25 Mar 2024 23:26:38 +0000 Subject: [PATCH 024/101] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (329 of 329 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/pt_BR/ Author: Thais Palmer --- src/assets/locales/pt-BR.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/locales/pt-BR.json b/src/assets/locales/pt-BR.json index 20dc49a6..83675407 100644 --- a/src/assets/locales/pt-BR.json +++ b/src/assets/locales/pt-BR.json @@ -294,6 +294,7 @@ "title": "Qualidade" }, "settings": { + "audioItem": "Áudio", "downloadItem": "Baixar", "enableSubtitles": "Ativar Legendas", "experienceSection": "Experiência de visualização", From 2761f1ebfd5e11560640b8c9effee6b4e5e305e1 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 26 Mar 2024 15:34:32 +0000 Subject: [PATCH 025/101] Translated using Weblate (Russian) Currently translated at 100.0% (329 of 329 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ru/ Author: Alex --- src/assets/locales/ru.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/locales/ru.json b/src/assets/locales/ru.json index 03186f65..50957e82 100644 --- a/src/assets/locales/ru.json +++ b/src/assets/locales/ru.json @@ -294,6 +294,7 @@ "title": "Качество" }, "settings": { + "audioItem": "Аудио", "downloadItem": "Скачать", "enableSubtitles": "Включить субтитры", "experienceSection": "Впечатления от просмотра", From f4c932192623c6dd8dd360b036d9ef0ad0342465 Mon Sep 17 00:00:00 2001 From: n1ck Date: Tue, 26 Mar 2024 09:56:06 +0000 Subject: [PATCH 026/101] Translated using Weblate (Galician) Currently translated at 100.0% (329 of 329 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/gl/ Author: n1ck --- src/assets/locales/gl.json | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/assets/locales/gl.json b/src/assets/locales/gl.json index 854d1261..ea8f38bf 100644 --- a/src/assets/locales/gl.json +++ b/src/assets/locales/gl.json @@ -57,6 +57,8 @@ }, "host": "Estaste a conectar a <0>{{hostname}} - por favor, confirma se confías antes de crear a conta", "no": "Regresar", + "noHost": "O servidor non está configurado, polo que non podes crear unha conta", + "noHostTitle": "O servidor non está configurado!", "title": "Confías neste servidor?", "yes": "Si, si que confío neste servidor" }, @@ -118,7 +120,12 @@ "noResults": "Non atopamos nada!", "placeholder": { "default": "Que che gustaría ver?", - "extra": [] + "extra": [ + "Qué queres explorar?", + "Que está na túa lista se seguimiento?", + "Cal é a túa película favorita?", + "Cal é a túa serie favorita?" + ] }, "sectionTitle": "Resultados da busca" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "Que che gustaría ver esta mañá?", - "extra": ["Escoitei que “Antes del amanecer” é boa"] + "extra": [ + "Escoitei que “Antes del amanecer” é boa" + ] }, "night": { "default": "Que che gustaría ver esta noite?", - "extra": ["Canso? Escoitei que “El Exorcista” é boa."] + "extra": [ + "Canso? Escoitei que “El Exorcista” é boa." + ] } } }, @@ -241,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "Copiar a ligazón da lista HLS", "disclaimer": "As descargas proveñen do provedor. movie-web non ten control sobre as descargas e a súa procedencia.", "downloadSubtitle": "Descargar subtítulos actuais", "downloadVideo": "Descargar video", @@ -282,6 +294,7 @@ "title": "Calidade" }, "settings": { + "audioItem": "Audio", "downloadItem": "Descargar", "enableSubtitles": "Activar subtítulos", "experienceSection": "Configuración de experiencia", @@ -524,6 +537,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Desenfoque do fondo", "backgroundLabel": "Opacidade do fondo", "colorLabel": "Cór", "previewQuote": "Non debo temer. O medo é o asasino da mente.", From fe46806ce58f9e5703b0cf5bc9b4bcdcd5de4e0a Mon Sep 17 00:00:00 2001 From: thehairy Date: Tue, 26 Mar 2024 18:39:57 +0000 Subject: [PATCH 027/101] Translated using Weblate (German) Currently translated at 100.0% (330 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/de/ Author: thehairy --- src/assets/locales/de.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/de.json b/src/assets/locales/de.json index d6155652..2f0c89eb 100644 --- a/src/assets/locales/de.json +++ b/src/assets/locales/de.json @@ -320,8 +320,9 @@ "unknownOption": "Unbekannt" }, "subtitles": { - "customChoice": "Untertitel aus Datei wählen", + "customChoice": "Untertiteldatei auswählen oder hier ablegen", "customizeLabel": "Anpassen", + "dropSubtitleFile": "Untertiteldatei hier ablegen", "offChoice": "Aus", "settings": { "backlink": "Eigene Untertitel", From 6d884f5d34525dece3b187bc2f2b6baca0315f5a Mon Sep 17 00:00:00 2001 From: teaishealthy Date: Tue, 26 Mar 2024 18:37:14 +0000 Subject: [PATCH 028/101] Translated using Weblate (German) Currently translated at 100.0% (330 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/de/ Author: teaishealthy --- src/assets/locales/de.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/locales/de.json b/src/assets/locales/de.json index 2f0c89eb..8392a10c 100644 --- a/src/assets/locales/de.json +++ b/src/assets/locales/de.json @@ -294,6 +294,7 @@ "title": "Qualität" }, "settings": { + "audioItem": "Audio", "downloadItem": "Download", "enableSubtitles": "Untettitel aktivieren", "experienceSection": "Anzeigeerlebnis", From f259b8aac37c1517090492e77020eb67cdefd10f Mon Sep 17 00:00:00 2001 From: Jamie Poznanski Date: Tue, 26 Mar 2024 18:37:35 +0000 Subject: [PATCH 029/101] Translated using Weblate (Italian) Currently translated at 100.0% (330 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/it/ Author: Jamie Poznanski --- src/assets/locales/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/it.json b/src/assets/locales/it.json index 43a17451..e4c02043 100644 --- a/src/assets/locales/it.json +++ b/src/assets/locales/it.json @@ -321,8 +321,9 @@ "unknownOption": "Sconosciuto" }, "subtitles": { - "customChoice": "Selezionare i sottotitoli dal file", + "customChoice": "Trascina o carica il file", "customizeLabel": "Personalizzare", + "dropSubtitleFile": "Trascina il file dei sottotitoli qui", "offChoice": "Spento", "settings": { "backlink": "Sottotitoli personalizzati", From d2d6b466279cfda82bcc78d999a9e68a81fb6e8f Mon Sep 17 00:00:00 2001 From: Jakub Herda Date: Tue, 26 Mar 2024 18:47:17 +0000 Subject: [PATCH 030/101] Translated using Weblate (Polish) Currently translated at 99.3% (328 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/pl/ Author: Jakub Herda --- src/assets/locales/pl.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/pl.json b/src/assets/locales/pl.json index c04669dc..d44d014b 100644 --- a/src/assets/locales/pl.json +++ b/src/assets/locales/pl.json @@ -57,6 +57,8 @@ }, "host": "Łączysz się z <0>{{hostname}} - przed utworzeniem konta potwierdź że ufasz temu serwerowi", "no": "Wstecz", + "noHost": "Serwer nie został skonfigurowany, więc nie można utworzyć konta", + "noHostTitle": "Serwer nie skonfigurowany!", "title": "Ufasz temu serwerowi?", "yes": "Ufam temu serwerowi" }, @@ -117,7 +119,13 @@ "loading": "Wczytywanie...", "noResults": "Nie mogliśmy niczego znaleźć!", "placeholder": { - "default": "Co chciałbyś obejrzeć?" + "default": "Co chciałbyś obejrzeć?", + "extra": [ + "Co chcesz odkryć?", + "Co znajduje się na Twojej liście do obejrzenia?", + "Jaki jest twój ulubiony film?", + "Jaki jest twój ulubiony serial?" + ] }, "sectionTitle": "Wyniki wyszukiwania" }, @@ -244,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "Kopiuj link do listy odtwarzania HLS", "disclaimer": "Pliki do pobrania są pobierane bezpośrednio od dostawcy. movie-web nie ma kontroli nad sposobem dostarczania plików do pobrania.", "downloadSubtitle": "Pobierz aktualne napisy", "downloadVideo": "Pobierz wideo", @@ -285,6 +294,7 @@ "title": "Jakość" }, "settings": { + "audioItem": "Dźwięk", "downloadItem": "Pobierz", "enableSubtitles": "Włącz napisy", "experienceSection": "Odtwarzanie", @@ -313,6 +323,7 @@ "subtitles": { "customChoice": "Wybierz napisy z pliku", "customizeLabel": "Dostosuj", + "dropSubtitleFile": "Przeciągnij i upuść plik z napisami tutaj", "offChoice": "Wyłączone", "settings": { "backlink": "Własne napisy", From ea86c0c347a0fe7c5cb9f45317f5ca7ab986b35c Mon Sep 17 00:00:00 2001 From: 5Litt <5Litt@users.noreply.weblate.movie-web.app> Date: Tue, 26 Mar 2024 19:03:19 +0000 Subject: [PATCH 031/101] Translated using Weblate (Czech) Currently translated at 100.0% (328 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/cs/ Author: 5Litt <5Litt@users.noreply.weblate.movie-web.app> --- src/assets/locales/cs.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/assets/locales/cs.json b/src/assets/locales/cs.json index 97802c0f..927e366a 100644 --- a/src/assets/locales/cs.json +++ b/src/assets/locales/cs.json @@ -122,7 +122,7 @@ "default": "Co si přejete sledovat?", "extra": [ "Co chcete objevit?", - null, + "Co je na vašem seznamu sledovaných filmů?", "Jaký je váš oblíbený film?", "Jaký je tvůj oblíbený seriál?" ] @@ -139,7 +139,7 @@ "morning": { "default": "Na co byste se chtěli dnes ráno dívat?", "extra": [ - "Slyšel jsem, že Před úsvitem je super." + "Slyšel jsem, že Před úsvitem je super" ] }, "night": { @@ -187,9 +187,10 @@ "back": "Zpět", "explainer": "Pomocí rozšíření prohlížeče můžete získat nejlepší streamy, které nabízíme. S pouhou instalací.", "explainerIos": "Bohužel rozšíření není podporováno na iOS. Stiskněte Zpět pro výběr jiné možnosti.", - "extensionHelp": "Pokud jste rozšíření nainstalovali, ale nebylo zjištěno. Otevřete rozšíření pomocí nabídky rozšíření ve vašem prohlížeči a postupujte podle pokynů na obrazovce.", + "extensionHelp": "Pokud jste rozšíření nainstalovali, ale nebylo zjištěno, otevřete rozšíření pomocí nabídky rozšíření ve vašem prohlížeči a postupujte podle pokynů na obrazovce.", "linkChrome": "Instalovat rozšíření pro Chrome", "linkFirefox": "Instalovat rozšíření pro Firefox", + "notDetecting": "Nainstalováno na Chromu, ale stránka to nezaznamenala? Skuste přenačíst stránku!", "notDetectingAction": "Obnovit stránku", "status": { "disallowed": "Rozšíření není pro tuto stránku povoleno", @@ -251,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "Zkopírovat link HLS playlistu", "disclaimer": "Stahování probíhá přímo u poskytovatele. movie-web nemá kontrolu nad tím, jak jsou stahování poskytovány.", "downloadSubtitle": "Stáhnout aktuální titulky", "downloadVideo": "Stáhnout video", @@ -534,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Rozostření pozadí", "backgroundLabel": "Neprůhlednost pozadí", "colorLabel": "Barva", "previewQuote": "Nesmím se bát. Strach zabíjí myšlení.", From 7a84b0377f85903b7720899aa1a685882ba47098 Mon Sep 17 00:00:00 2001 From: Origaming Date: Tue, 26 Mar 2024 18:56:28 +0000 Subject: [PATCH 032/101] Translated using Weblate (French) Currently translated at 100.0% (330 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/fr/ Author: Origaming --- src/assets/locales/fr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/fr.json b/src/assets/locales/fr.json index 0daba5a3..344f5a80 100644 --- a/src/assets/locales/fr.json +++ b/src/assets/locales/fr.json @@ -294,6 +294,7 @@ "title": "Qualité" }, "settings": { + "audioItem": "Audio", "downloadItem": "Télécharger", "enableSubtitles": "Activer les sous-titres", "experienceSection": "Expérience de visionnage", @@ -320,8 +321,9 @@ "unknownOption": "Inconnu" }, "subtitles": { - "customChoice": "Importer des sous-titres depuis un fichier", + "customChoice": "Glisser ou charger un fichier", "customizeLabel": "Personnaliser", + "dropSubtitleFile": "Glisser le fichier des sous-titres ici", "offChoice": "Désactivé", "settings": { "backlink": "Sous-titres personnalisés", From 559279e73397575d6682eb4af204a68758958e15 Mon Sep 17 00:00:00 2001 From: blikje Date: Tue, 26 Mar 2024 22:45:55 +0000 Subject: [PATCH 033/101] Translated using Weblate (Dutch) Currently translated at 100.0% (330 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/nl/ Author: blikje --- src/assets/locales/nl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/nl.json b/src/assets/locales/nl.json index 14f0ced6..1551de4f 100644 --- a/src/assets/locales/nl.json +++ b/src/assets/locales/nl.json @@ -294,6 +294,7 @@ "title": "Kwaliteit" }, "settings": { + "audioItem": "Audio", "downloadItem": "Download", "enableSubtitles": "Ondertitels inschakelen", "experienceSection": "Kijk-ervaring", @@ -320,8 +321,9 @@ "unknownOption": "Onbekend" }, "subtitles": { - "customChoice": "Selecteer ondertiteling uit bestand", + "customChoice": "Sleep of upload bestand", "customizeLabel": "Aanpassen", + "dropSubtitleFile": "Sleep ondertitelbestand naar hier", "offChoice": "Uit", "settings": { "backlink": "Aangepaste ondertiteling", From f3104d2927df75b54d395edb7b82f67c9a1595aa Mon Sep 17 00:00:00 2001 From: Jakub Herda Date: Tue, 26 Mar 2024 18:49:41 +0000 Subject: [PATCH 034/101] Translated using Weblate (Polish) Currently translated at 100.0% (330 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/pl/ Author: Jakub Herda --- src/assets/locales/pl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/pl.json b/src/assets/locales/pl.json index d44d014b..1f5d39d3 100644 --- a/src/assets/locales/pl.json +++ b/src/assets/locales/pl.json @@ -190,7 +190,7 @@ "extensionHelp": "Jeżeli zainstalowałeś rozszerzenie, ale nie zostało ono wykryte, otwórz rozszerzenie za pomocą menu rozszerzeń przeglądarki i postępuj zgodnie z instrukcjami wyświetlanymi na ekranie.", "linkChrome": "Zainstaluj rozszerzenie na Chrome", "linkFirefox": "Zainstaluj rozszerzenie na Firefox", - "notDetecting": "Zainstalowano na Chrome, ale się nie wyświetla? Spróbuj odświeżyć stronę!", + "notDetecting": "Zainstalowano w Chrome, ale strona go nie wykrywa? Spróbuj odświeżyć stronę!", "notDetectingAction": "Odśwież stronę", "status": { "disallowed": "Rozszerzenie nie jest włączone dla tej strony", @@ -321,7 +321,7 @@ "unknownOption": "Nieznany" }, "subtitles": { - "customChoice": "Wybierz napisy z pliku", + "customChoice": "Wrzuć lub prześlij plik", "customizeLabel": "Dostosuj", "dropSubtitleFile": "Przeciągnij i upuść plik z napisami tutaj", "offChoice": "Wyłączone", From 4f880b2a79a11cf21b64436c6f87f042be5ae4d3 Mon Sep 17 00:00:00 2001 From: n1ck Date: Tue, 26 Mar 2024 19:45:41 +0000 Subject: [PATCH 035/101] Translated using Weblate (Spanish) Currently translated at 100.0% (330 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/es/ Author: n1ck --- src/assets/locales/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/es.json b/src/assets/locales/es.json index 415606b7..c9f319c8 100644 --- a/src/assets/locales/es.json +++ b/src/assets/locales/es.json @@ -321,8 +321,9 @@ "unknownOption": "Desconocida" }, "subtitles": { - "customChoice": "Seleccionar subtítulo del archivo", + "customChoice": "Sube o arrastra un archivo", "customizeLabel": "Personalizar", + "dropSubtitleFile": "Suelta el archivo de subtítulos aquí", "offChoice": "Apagado", "settings": { "backlink": "Subtítulos personalizados", From 367750898adb20a8e892577192e0ecb951c530d1 Mon Sep 17 00:00:00 2001 From: Thais Palmer Date: Wed, 27 Mar 2024 18:06:40 +0000 Subject: [PATCH 036/101] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (330 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/pt_BR/ Author: Thais Palmer --- src/assets/locales/pt-BR.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/pt-BR.json b/src/assets/locales/pt-BR.json index 83675407..147aabd0 100644 --- a/src/assets/locales/pt-BR.json +++ b/src/assets/locales/pt-BR.json @@ -321,8 +321,9 @@ "unknownOption": "Desconhecido" }, "subtitles": { - "customChoice": "Selecione arquivo de legenda", + "customChoice": "Solte ou faça upload do arquivo", "customizeLabel": "Personalizar", + "dropSubtitleFile": "Solte o arquivo da legenda aqui", "offChoice": "Desativadas", "settings": { "backlink": "Legendas personalizadas", From b816142ac5394ecf75b636420d95d94a7fa9264c Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 27 Mar 2024 21:54:07 +0000 Subject: [PATCH 037/101] Translated using Weblate (Russian) Currently translated at 99.6% (329 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ru/ Author: Alex --- src/assets/locales/ru.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/locales/ru.json b/src/assets/locales/ru.json index 50957e82..b0d255a3 100644 --- a/src/assets/locales/ru.json +++ b/src/assets/locales/ru.json @@ -323,6 +323,7 @@ "subtitles": { "customChoice": "Выбрать субтитры из файла", "customizeLabel": "Настроить", + "dropSubtitleFile": "Перетащите файл субтитров", "offChoice": "Выключить", "settings": { "backlink": "Пользовательские субтитры", From e203c1418a41424d9e377367e1e8fecd2aaf50a2 Mon Sep 17 00:00:00 2001 From: Mehdi Date: Wed, 27 Mar 2024 08:08:25 +0000 Subject: [PATCH 038/101] Translated using Weblate (Persian) Currently translated at 100.0% (330 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/fa/ Author: Mehdi --- src/assets/locales/fa.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/fa.json b/src/assets/locales/fa.json index 0a7d91f9..766e3c35 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -294,6 +294,7 @@ "title": "کیفیت" }, "settings": { + "audioItem": "صدا", "downloadItem": "دانلود", "enableSubtitles": "فعال کردن زیرنویس", "experienceSection": "تجربه مشاهده", @@ -320,8 +321,9 @@ "unknownOption": "ناشناخته" }, "subtitles": { - "customChoice": "انتخاب زیرنویس از فایل", + "customChoice": "فایل را رها یا آپلود کنید", "customizeLabel": "شخصی سازی", + "dropSubtitleFile": "فایل زیرنویس را اینجا بکشید", "offChoice": "خاموش", "settings": { "backlink": "زیرنویس سفارشی", From 9dc5d484bec7dcbe8fd2d39c819b135e4924464c Mon Sep 17 00:00:00 2001 From: n1ck Date: Tue, 26 Mar 2024 19:46:18 +0000 Subject: [PATCH 039/101] Translated using Weblate (Galician) Currently translated at 100.0% (330 of 330 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/gl/ Author: n1ck --- src/assets/locales/gl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/gl.json b/src/assets/locales/gl.json index ea8f38bf..fc8b18d4 100644 --- a/src/assets/locales/gl.json +++ b/src/assets/locales/gl.json @@ -321,8 +321,9 @@ "unknownOption": "Descoñecido" }, "subtitles": { - "customChoice": "Seleccionar subtítulos dende o arquivo", + "customChoice": "Sube ou arrastra o arquivo", "customizeLabel": "Personalizar", + "dropSubtitleFile": "Solta o arquivo de subtítulos aquí", "offChoice": "Apagar", "settings": { "backlink": "Subtítulos personalizados", From e063ad5e028e089f839fa29ea25a36eb375e7061 Mon Sep 17 00:00:00 2001 From: thehairy Date: Thu, 28 Mar 2024 09:41:40 +0000 Subject: [PATCH 040/101] Translated using Weblate (German) Currently translated at 100.0% (335 of 335 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/de/ Author: thehairy --- src/assets/locales/de.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/assets/locales/de.json b/src/assets/locales/de.json index 8392a10c..210b5970 100644 --- a/src/assets/locales/de.json +++ b/src/assets/locales/de.json @@ -381,6 +381,13 @@ "title": "Hoppla, etwas ist schiefgegangen!" }, "scraping": { + "extensionFailure": { + "badge": "Erweiterung deaktiviert", + "enableExtension": "Erweiterung aktivieren", + "homeButton": "Zur Startseite", + "text": "Du hast die movie-webe Erweiterung installiert. Um die Erweiterung zu benutzen, musst du sie für diese Seite aktivieren.", + "title": "Bitte aktiviere die Erweiterung" + }, "items": { "failure": "Ein Fehler ist aufgetreten", "notFound": "Video nicht gefunden", From 33b77c475b61aec4276d80137b5a4c56f109365e Mon Sep 17 00:00:00 2001 From: blikje Date: Thu, 28 Mar 2024 09:37:21 +0000 Subject: [PATCH 041/101] Translated using Weblate (Dutch) Currently translated at 100.0% (335 of 335 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/nl/ Author: blikje --- src/assets/locales/nl.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/assets/locales/nl.json b/src/assets/locales/nl.json index 1551de4f..6f58ffc6 100644 --- a/src/assets/locales/nl.json +++ b/src/assets/locales/nl.json @@ -381,6 +381,13 @@ "title": "Oeps, hier ging iets mis!" }, "scraping": { + "extensionFailure": { + "badge": "Extensie uitgeschakeld", + "enableExtension": "Extensie inschakelen", + "homeButton": "Naar hoofdpagina", + "text": "Je hebt de movie-web extensie geïnstalleerd. Om deze te gebruiken, moet je de extensie inschakelen voor deze site.", + "title": "Activeer alstublieft de extensie" + }, "items": { "failure": "Daar ging iets mis", "notFound": "Er is geen video gevonden", From 080a80245a79e5457277c69fdd9c8735c7d1dc64 Mon Sep 17 00:00:00 2001 From: Jamie Poznanski Date: Thu, 28 Mar 2024 13:59:25 +0000 Subject: [PATCH 042/101] Translated using Weblate (Italian) Currently translated at 100.0% (335 of 335 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/it/ Author: Jamie Poznanski --- src/assets/locales/it.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/assets/locales/it.json b/src/assets/locales/it.json index e4c02043..8114204e 100644 --- a/src/assets/locales/it.json +++ b/src/assets/locales/it.json @@ -381,6 +381,13 @@ "title": "Impossibile riprodurre il video!" }, "scraping": { + "extensionFailure": { + "badge": "L'estensione è disabilitata", + "enableExtension": "Abilita l'estensione", + "homeButton": "Torna alla pagina iniziale", + "text": "Avete installato l'estensione movie-web. Per iniziare a usarla, è necessario abilitare l'estensione per questo sito.", + "title": "Abilita l'estensione" + }, "items": { "failure": "Si è verificato un errore", "notFound": "Non ha il video", From 483cfe4e7fd68ffc3a81d8157958eb537376cb32 Mon Sep 17 00:00:00 2001 From: Mehdi Date: Thu, 28 Mar 2024 18:09:58 +0000 Subject: [PATCH 043/101] Translated using Weblate (Persian) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/fa/ Author: Mehdi --- src/assets/locales/fa.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/fa.json b/src/assets/locales/fa.json index 766e3c35..cfe2e853 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -155,7 +155,8 @@ "types": { "movie": "فیلم", "show": "سریال" - } + }, + "unreleased": "منتشر نشده" }, "navigation": { "banner": { @@ -381,6 +382,13 @@ "title": "پخش ویدئو موفقیت آمیز نبود!" }, "scraping": { + "extensionFailure": { + "badge": "اکستنشن غیر فعال شد", + "enableExtension": "اکستنشن را فعال کنید", + "homeButton": "خانه", + "text": "شما اکستنشن مووی-وب را نصب کردید. برای شروع استفاده از ان، شما نیاز به فعال کردن آن دارید", + "title": "لطفا اکستنشن را فعال کنید" + }, "items": { "failure": "مشکلی پیش آمده", "notFound": "این ویدیو وجود ندارد", From 8a17c3d38ebcb85b37249463c854a6d81419ebd2 Mon Sep 17 00:00:00 2001 From: Mehdi Date: Fri, 29 Mar 2024 08:58:37 +0000 Subject: [PATCH 044/101] Translated using Weblate (Persian) Currently translated at 100.0% (336 of 336 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 cfe2e853..99d7aaa4 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -73,7 +73,7 @@ } }, "errors": { - "badge": "مشکلی رخ داده", + "badge": "مشکلی رخ داد", "details": "جزئیات خطا", "reloadPage": "صفحه را دوباره بارگذاری کنید", "showError": "نمایش جزئیات خطا", From 0cf04f803d590c87f5f3a018703fefd49f2282fa Mon Sep 17 00:00:00 2001 From: chaos Date: Fri, 29 Mar 2024 09:35:07 +0000 Subject: [PATCH 045/101] Translated using Weblate (Estonian) Currently translated at 99.4% (334 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/et/ Author: chaos --- src/assets/locales/et.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/et.json b/src/assets/locales/et.json index 50d4f8b4..93865de7 100644 --- a/src/assets/locales/et.json +++ b/src/assets/locales/et.json @@ -155,7 +155,8 @@ "types": { "movie": "Film", "show": "Saade" - } + }, + "unreleased": "Avaldamata" }, "navigation": { "banner": { @@ -294,6 +295,7 @@ "title": "Kvaliteet" }, "settings": { + "audioItem": "Audio", "downloadItem": "Lae alla", "enableSubtitles": "Luba Subtiitrid", "experienceSection": "Vaatamise kogemus", @@ -320,8 +322,9 @@ "unknownOption": "Teadmata" }, "subtitles": { - "customChoice": "Vali subtiitrid failist", + "customChoice": "Kukuta või vali subtiitri fail", "customizeLabel": "Kohanda", + "dropSubtitleFile": "Kukuta subtiitri fail siia", "offChoice": "Välja", "settings": { "backlink": "Kohandatud subtiitrid", @@ -379,6 +382,11 @@ "title": "Video mängimine ebaōnnestus!" }, "scraping": { + "extensionFailure": { + "badge": "Brauserilaiendus väljalülitatud", + "homeButton": "Tagasi", + "text": "Olete allalaadinud movie-web'i brauserilaiendue. Selle kasutamiseks peate vajutama brauserilaienduse peale ning andma ligipääsu praegusele saidile." + }, "items": { "failure": "Tekkis viga", "notFound": "Ei ole videot", From 43c912dd3330fd349fcab86439510cc491816088 Mon Sep 17 00:00:00 2001 From: LeBron James Date: Fri, 29 Mar 2024 10:04:24 +0000 Subject: [PATCH 046/101] Translated using Weblate (Turkish) Currently translated at 98.8% (332 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/tr/ Author: LeBron James --- src/assets/locales/tr.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/tr.json b/src/assets/locales/tr.json index cf225f91..084f2575 100644 --- a/src/assets/locales/tr.json +++ b/src/assets/locales/tr.json @@ -155,7 +155,8 @@ "types": { "movie": "Film", "show": "Dizi" - } + }, + "unreleased": "Yayınlanmamış" }, "navigation": { "banner": { @@ -294,6 +295,7 @@ "title": "Kalite" }, "settings": { + "audioItem": "Ses", "downloadItem": "İndir", "enableSubtitles": "Altyazıları Etkinleştir", "experienceSection": "İzleme deneyimi", @@ -320,8 +322,9 @@ "unknownOption": "Bilinmeyen" }, "subtitles": { - "customChoice": "Altyazı dosyası yükle", + "customChoice": "Dosya sürükleyin veya yükleyin", "customizeLabel": "Seçenekler", + "dropSubtitleFile": "Altyazı dosyasını buraya sürükleyin", "offChoice": "Kapat", "settings": { "backlink": "Kişisel altyazılar", @@ -379,6 +382,13 @@ "title": "Video oynatılamadı!" }, "scraping": { + "extensionFailure": { + "badge": "Eklenti devre dışı", + "enableExtension": "Eklentiyi etkinleştir", + "homeButton": "Eve git", + "text": "movie-web uzantısını kurdunuz. Kullanmaya başlamak için, uzantıyı bu site için etkinleştirmeniz gerekiyor.", + "title": "Lütfen eklentiyi etkinleştirin" + }, "items": { "failure": "Hata oluştu", "notFound": "Video mevcut değil", From 70eb8f381ccd4b213739f998a3f9bddd3bfb0869 Mon Sep 17 00:00:00 2001 From: chaos Date: Fri, 29 Mar 2024 09:49:40 +0000 Subject: [PATCH 047/101] Translated using Weblate (Estonian) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/et/ Author: chaos --- src/assets/locales/et.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/et.json b/src/assets/locales/et.json index 93865de7..bd9456c2 100644 --- a/src/assets/locales/et.json +++ b/src/assets/locales/et.json @@ -384,8 +384,10 @@ "scraping": { "extensionFailure": { "badge": "Brauserilaiendus väljalülitatud", + "enableExtension": "Lülita brauserilaiendus sisse", "homeButton": "Tagasi", - "text": "Olete allalaadinud movie-web'i brauserilaiendue. Selle kasutamiseks peate vajutama brauserilaienduse peale ning andma ligipääsu praegusele saidile." + "text": "Olete allalaadinud movie-web'i brauserilaiendue. Selle kasutamiseks peate vajutama brauserilaienduse peale ning andma ligipääsu praegusele saidile.", + "title": "Palun lülita brauserilaiendus sisse" }, "items": { "failure": "Tekkis viga", From 469e11868128f4f60bfeb8c61438f625c8ab20f1 Mon Sep 17 00:00:00 2001 From: LeBron James Date: Fri, 29 Mar 2024 10:18:32 +0000 Subject: [PATCH 048/101] Translated using Weblate (Turkish) Currently translated at 98.8% (332 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/tr/ Author: LeBron James --- src/assets/locales/tr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/locales/tr.json b/src/assets/locales/tr.json index 084f2575..b5398f15 100644 --- a/src/assets/locales/tr.json +++ b/src/assets/locales/tr.json @@ -508,7 +508,7 @@ }, "unsetStatus": { "description": "Kurulum sürecini başlatmak için lütfen sağdaki düğmeye tıklayın.", - "title": "Başlamak için kurulumu tamamlamanız gerekiyor." + "title": "Kurulumu tamamlamadınız" } }, "title": "Bağlantılar", From 5150e6c7ff5d65ed13206fefe6a6dc52d2e98a72 Mon Sep 17 00:00:00 2001 From: LeBron James Date: Fri, 29 Mar 2024 10:24:16 +0000 Subject: [PATCH 049/101] Translated using Weblate (Turkish) Currently translated at 99.1% (333 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/tr/ Author: LeBron James --- src/assets/locales/tr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/locales/tr.json b/src/assets/locales/tr.json index b5398f15..9b9f0238 100644 --- a/src/assets/locales/tr.json +++ b/src/assets/locales/tr.json @@ -526,7 +526,7 @@ "languageDescription": "Uygulamanın tamamı için seçili dil", "thumbnail": "Küçük resimler oluştur", "thumbnailDescription": "Çoğu video için ön izleme görseli bulunmaz. Bu ayarı etkinleştirerek anında oluşturulmasını sağlayabilirsiniz, ancak bu videonuzu yavaşlatabilir.", - "thumbnailLabel": "Küçük resimler oluştur", + "thumbnailLabel": "Küçük resim oluştur", "title": "Ayarlar" }, "reset": "Sıfırla", From 737a0b034d50e52354576b2afb3ae6250ee4ffc9 Mon Sep 17 00:00:00 2001 From: Jamie Poznanski Date: Fri, 29 Mar 2024 12:33:51 +0000 Subject: [PATCH 050/101] Translated using Weblate (Italian) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/it/ Author: Jamie Poznanski --- src/assets/locales/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/it.json b/src/assets/locales/it.json index 8114204e..98d1b8bc 100644 --- a/src/assets/locales/it.json +++ b/src/assets/locales/it.json @@ -155,7 +155,8 @@ "types": { "movie": "Film", "show": "Serie" - } + }, + "unreleased": "Inedito" }, "navigation": { "banner": { From 4ee32a9dd9696f1cfbfdc48aaf27369d31c8de6c Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 29 Mar 2024 14:59:06 +0000 Subject: [PATCH 051/101] Translated using Weblate (Russian) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ru/ Author: Alex --- src/assets/locales/ru.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/ru.json b/src/assets/locales/ru.json index b0d255a3..fddc32ca 100644 --- a/src/assets/locales/ru.json +++ b/src/assets/locales/ru.json @@ -155,7 +155,8 @@ "types": { "movie": "Фильм", "show": "Сериал" - } + }, + "unreleased": "Ожидается" }, "navigation": { "banner": { @@ -321,7 +322,7 @@ "unknownOption": "Неизвестный" }, "subtitles": { - "customChoice": "Выбрать субтитры из файла", + "customChoice": "Перетащите или загрузите файл", "customizeLabel": "Настроить", "dropSubtitleFile": "Перетащите файл субтитров", "offChoice": "Выключить", @@ -381,6 +382,13 @@ "title": "Не удалось воспроизвести видео!" }, "scraping": { + "extensionFailure": { + "badge": "Расширение отключено", + "enableExtension": "Включить расширение", + "homeButton": "Вернуться на главную", + "text": "Вы установили расширение movie-web. Чтобы начать его использовать, необходимо включить расширение для этого сайта.", + "title": "Пожалуйста, включите расширение" + }, "items": { "failure": "Возникла ошибка", "notFound": "Такого видео нет", From d006ed9a4924dc681eb79ad6c1bee268a49b3dd7 Mon Sep 17 00:00:00 2001 From: lonelil <51315646+lonelil@users.noreply.github.com> Date: Sun, 31 Mar 2024 23:05:50 +0800 Subject: [PATCH 052/101] add sync fork workflow --- .github/workflows/sync.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/sync.yml diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml new file mode 100644 index 00000000..a051bf19 --- /dev/null +++ b/.github/workflows/sync.yml @@ -0,0 +1,26 @@ +name: Sync fork + +permissions: + contents: write + +on: + schedule: + - cron: "0 0 * * *" + workflow_dispatch: + +jobs: + sync: + name: Sync fork + runs-on: ubuntu-latest + if: ${{ github.event.repository.fork }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Sync fork + run: gh repo sync ${{ github.repository }} + env: + GH_TOKEN: ${{ github.token }} + + - uses: gautamkrishnar/keepalive-workflow@v1 From 6a905bf517a459d4d082012c791e45e790b9b718 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Sun, 31 Mar 2024 20:20:10 +0200 Subject: [PATCH 053/101] Also route hls audio tracks through extension --- src/backend/extension/messaging.ts | 1 + src/components/player/display/base.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/backend/extension/messaging.ts b/src/backend/extension/messaging.ts index c280f9bd..bf0e3253 100644 --- a/src/backend/extension/messaging.ts +++ b/src/backend/extension/messaging.ts @@ -9,6 +9,7 @@ import { ExtensionMakeRequestResponse } from "@/backend/extension/plasmo"; export const RULE_IDS = { PREPARE_STREAM: 1, SET_DOMAINS_HLS: 2, + SET_DOMAINS_HLS_AUDIO: 3, }; // for some reason, about 500 ms is needed after diff --git a/src/components/player/display/base.ts b/src/components/player/display/base.ts index 8e155f69..8322b82b 100644 --- a/src/components/player/display/base.ts +++ b/src/components/player/display/base.ts @@ -191,6 +191,21 @@ export function makeVideoElementDisplayInterface(): DisplayInterface { }, }); }); + hls.on(Hls.Events.AUDIO_TRACK_LOADED, async (_, data) => { + const chunkUrlsDomains = data.details.fragments.map( + (v) => new URL(v.url).hostname, + ); + const chunkUrls = [...new Set(chunkUrlsDomains)]; + + await setDomainRule({ + ruleId: RULE_IDS.SET_DOMAINS_HLS_AUDIO, + targetDomains: chunkUrls, + requestHeaders: { + ...src.preferredHeaders, + ...src.headers, + }, + }); + }); } }); hls.on(Hls.Events.LEVEL_SWITCHED, () => { From 0ae96309c7bbbd7f1f77357beb43c91f22b0d646 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 30 Mar 2024 00:46:32 +0000 Subject: [PATCH 054/101] Translated using Weblate (Russian) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ru/ Author: Alex --- src/assets/locales/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/locales/ru.json b/src/assets/locales/ru.json index fddc32ca..d80dc553 100644 --- a/src/assets/locales/ru.json +++ b/src/assets/locales/ru.json @@ -322,7 +322,7 @@ "unknownOption": "Неизвестный" }, "subtitles": { - "customChoice": "Перетащите или загрузите файл", + "customChoice": "Перетащите файл или нажмите для загрузки", "customizeLabel": "Настроить", "dropSubtitleFile": "Перетащите файл субтитров", "offChoice": "Выключить", From 35c6d252686ddd5559c964f28a81c1588203b102 Mon Sep 17 00:00:00 2001 From: Dave Date: Sat, 30 Mar 2024 07:59:55 +0000 Subject: [PATCH 055/101] Translated using Weblate (Indonesian) Currently translated at 76.1% (256 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/id/ Author: Dave --- src/assets/locales/id.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/id.json b/src/assets/locales/id.json index 977f1107..8dc72922 100644 --- a/src/assets/locales/id.json +++ b/src/assets/locales/id.json @@ -57,6 +57,7 @@ }, "host": "Anda ingin terhubung ke <0>{{hostname}} - mohon konfirmasi anda mempercayai server ini sebelum anda membuat akun", "no": "Kembali", + "noHostTitle": "Server belum dikonfigurasi!", "title": "Apakah anda mempercayai server ini?", "yes": "Saya percaya" }, @@ -181,7 +182,13 @@ }, "extension": { "back": "Kembali", - "explainerIos": "Sayangnya, ekstensi browser tidak didukung di iOS, Tekan Kembali untuk memilih opsi lain." + "explainerIos": "Sayangnya, ekstensi browser tidak didukung di iOS, Tekan Kembali untuk memilih opsi lain.", + "notDetectingAction": "Muat ulang halaman", + "status": { + "disallowed": "Ekstensi tidak diaktifkan untuk halaman ini", + "disallowedAction": "Aktifkan ekstensi", + "outdated": "Versi ekstensi terlalu tua" + } } }, "overlays": { From f20fe984d3feff35b42b266aca61de4aa818b919 Mon Sep 17 00:00:00 2001 From: Dave Date: Sat, 30 Mar 2024 08:00:58 +0000 Subject: [PATCH 056/101] Translated using Weblate (Indonesian) Currently translated at 77.6% (261 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/id/ Author: Dave --- src/assets/locales/id.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/id.json b/src/assets/locales/id.json index 8dc72922..724ca2eb 100644 --- a/src/assets/locales/id.json +++ b/src/assets/locales/id.json @@ -187,7 +187,26 @@ "status": { "disallowed": "Ekstensi tidak diaktifkan untuk halaman ini", "disallowedAction": "Aktifkan ekstensi", - "outdated": "Versi ekstensi terlalu tua" + "outdated": "Versi ekstensi terlalu tua", + "success": "Ekstensi bekerja sesuai harapan!" + }, + "submit": "Lanjutkan", + "title": "Mari mulai dengan ekstensi" + }, + "proxy": { + "back": "Kembali", + "input": { + "errorInvalidUrl": "URL tidak valid", + "placeholder": "https://" + }, + "link": "Belajar cara membuat proxy", + "title": "Mari buat proxy baru" + }, + "start": { + "options": { + "extension": { + "action": "Instal ekstensi" + } } } }, From 232fb7e8955d215a87935f5fe96158b3ea4e8f75 Mon Sep 17 00:00:00 2001 From: Thais Palmer Date: Sat, 30 Mar 2024 16:20:27 +0000 Subject: [PATCH 057/101] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/pt_BR/ Author: Thais Palmer --- src/assets/locales/pt-BR.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/pt-BR.json b/src/assets/locales/pt-BR.json index 147aabd0..eea7d5d2 100644 --- a/src/assets/locales/pt-BR.json +++ b/src/assets/locales/pt-BR.json @@ -155,7 +155,8 @@ "types": { "movie": "Filme", "show": "Série" - } + }, + "unreleased": "Não lançado" }, "navigation": { "banner": { @@ -381,6 +382,13 @@ "title": "Falha ao reproduzir o vídeo!" }, "scraping": { + "extensionFailure": { + "badge": "Extensão desativada", + "enableExtension": "Ativar extensão", + "homeButton": "Ir para o início", + "text": "Você instalou a extensão movie-web. Para começar a usá-la, você precisa ativar a extensão neste site.", + "title": "Por favor, ative a extensão" + }, "items": { "failure": "Ocorreu um erro", "notFound": "Não tem o vídeo", From caf5faeb49f2a916c47783259d97151de1610b08 Mon Sep 17 00:00:00 2001 From: Dave Date: Sun, 31 Mar 2024 06:28:12 +0000 Subject: [PATCH 058/101] Translated using Weblate (Indonesian) Currently translated at 83.3% (280 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/id/ Author: Dave --- src/assets/locales/id.json | 115 +++++++++++++++++++++++-------------- 1 file changed, 72 insertions(+), 43 deletions(-) diff --git a/src/assets/locales/id.json b/src/assets/locales/id.json index 724ca2eb..1de99a31 100644 --- a/src/assets/locales/id.json +++ b/src/assets/locales/id.json @@ -4,7 +4,7 @@ "faqTitle": "Pertanyaan umum", "q1": { "body": "movie-web tidak menyimpan berkas media apapun. Ketika anda mengklik sesuatu untuk ditonton, aplikasi akan mencari berkas media di internet (saat media dimuat dan pada tab 'sumber media' anda dapat melihat sumber mana yang digunakan). movie-web tidak pernah mengunggah media apapun, semua media didapat melalui mekanisme pencarian di internet.", - "title": "Dari mana konten media di sini berasal?" + "title": "Dari mana konten berasal?" }, "q2": { "body": "Kami tidak menerima permintaan penambahan serial televisi atau film, movie-web tidak mengelola konten apapun. Semua konten ditonton melalui sumber-sumber dari internet.", @@ -26,24 +26,24 @@ "deviceNamePlaceholder": "Perangkat personal", "generate": { "description": "Kombinasi kata ini berfungsi sebagai nama pengguna sekaligus kata sandi anda. Pastikan untuk menyimpannya dengan aman karena anda memerlukannya untuk masuk ke akun anda", - "next": "Saya sudah menyimpan kombinasi kata di atas", + "next": "Saya sudah menyimpan kombinasi kata", "passphraseFrameLabel": "Kombinasi kata", - "title": "Kombinasi kata anda" + "title": "Kombinasi kata Anda" }, "hasAccount": "Sudah memiliki akun? <0>Masuk disini.", "login": { - "description": "Mohon masukkan kombinasi kata anda untuk masuk ke akun anda", + "description": "Mohon masukkan kombinasi kata anda untuk masuk ke akun Anda", "deviceLengthError": "Mohon masukkan nama perangkat", "passphraseLabel": "12 kombinasi kata unik", "passphrasePlaceholder": "Kombinasi kata", "submit": "Masuk", - "title": "Masuk ke akun anda", - "validationError": "Kombinasi kata unik salah" + "title": "Masuk ke akun Anda", + "validationError": "Kombinasi kata salah atau tidak lengkap" }, "register": { "information": { - "color1": "Gradasi warna profil pertama", - "color2": "Gradasi warna profil kedua", + "color1": "Warna profil pertama", + "color2": "Warna profil kedua", "header": "Masukkan nama perangkat anda lalu pilih warna latar belakang dan ikon pengguna yang ingin anda gunakan", "icon": "Ikon pengguna", "next": "Berikutnya", @@ -52,30 +52,31 @@ }, "trust": { "failed": { - "text": "Apakah anda mengkonfigurasi server dengan benar?", + "text": "Apakah Anda mengkonfigurasi server dengan benar?", "title": "Gagal terhubung dengan server" }, - "host": "Anda ingin terhubung ke <0>{{hostname}} - mohon konfirmasi anda mempercayai server ini sebelum anda membuat akun", + "host": "Anda ingin terhubung ke <0>{{hostname}} - mohon konfirmasi Anda mempercayai server ini sebelum Anda membuat akun", "no": "Kembali", + "noHost": "Server belum dikonfigurasi, maka dari itu Anda tidak dapat membuat akun", "noHostTitle": "Server belum dikonfigurasi!", - "title": "Apakah anda mempercayai server ini?", - "yes": "Saya percaya" + "title": "Apakah Anda mempercayai server ini?", + "yes": "Saya percaya server ini" }, "verify": { - "description": "Mohon masukkan kombinasi kata pribadi anda sebelumnya untuk mengonfirmasi bahwa anda telah menyimpannya untuk melanjutkan proses pembuatan akun", + "description": "Mohon masukkan kombinasi kata pribadi Anda sebelumnya untuk mengonfirmasi bahwa Anda telah menyimpannya untuk melanjutkan proses pembuatan akun", "invalidData": "Data tidak valid", "noMatch": "Kombinasi kata tidak cocok", - "passphraseLabel": "12 kombinasi kata pribadi anda", + "passphraseLabel": "12 kombinasi kata Anda", "recaptchaFailed": "Validasi reCaptcha gagal", "register": "Buat akun", - "title": "Konfirmasi kombinasi kata pribadi anda" + "title": "Konfirmasi kombinasi kata Anda" } }, "errors": { "badge": "Terjadi masalah", - "details": "Detail eror", + "details": "Rincian kesalahan", "reloadPage": "Muat ulang halaman", - "showError": "Lihat detail eror", + "showError": "Lihat rincian kesalahan", "title": "Kami mengalami galat!" }, "footer": { @@ -88,7 +89,7 @@ "dmca": "DMCA", "github": "GitHub" }, - "tagline": "Tonton serial televisi dan film favorit anda dengan aplikasi streaming open source ini." + "tagline": "Tonton serial televisi dan film favorit anda dengan aplikasi streaming sumber terbuka ini." }, "global": { "name": "movie-web", @@ -110,7 +111,7 @@ "sectionTitle": "Lanjut menonton" }, "mediaList": { - "stopEditing": "Berhenti mengubah" + "stopEditing": "Berhenti menyunting" }, "search": { "allResults": "Hanya itu yang kami punya!", @@ -132,19 +133,19 @@ "day": { "default": "Apa yang ingin anda tonton sore ini?", "extra": [ - "Lagi pengen nonton genre Adventure? Jurassic Park mungkin cocok buat anda." + "Merasa suka bertualang? Jurassic Park mungkin pilihan cocok untuk Anda." ] }, "morning": { - "default": "Apa yang ingin anda tonton pagi ini?", + "default": "Apa yang ingin Anda tonton pagi ini?", "extra": [ - "Kayaknya film Before Sunrise bagus deh" + "Saya dengar film Before Sunrise bagus" ] }, "night": { - "default": "Apa yang ingin anda tonton malam ini?", + "default": "Apa yang ingin Anda tonton malam ini?", "extra": [ - "Capek? Katanya The Exocist rekomended." + "Capek? Saya dengar The Exocist bagus." ] } } @@ -154,11 +155,12 @@ "types": { "movie": "Film", "show": "Serial TV" - } + }, + "unreleased": "Belum dirilis" }, "navigation": { "banner": { - "offline": "Periksa koneksi internet anda" + "offline": "Periksa koneksi internet Anda" }, "menu": { "about": "Tentang kami", @@ -172,40 +174,65 @@ "notFound": { "badge": "Tidak ditemukan", "goHome": "Kembali", - "message": "Kami sudah mencari dimana-mana: di bawah tempat sampah, di lemari, di belakang server proxy, tapi tetap gagal menemukan halaman yang anda cari.", + "message": "Kami sudah mencari dimana-mana: di bawah tempat sampah, di lemari, di belakang server proxy, tetapi tidak dapat menemukan halaman yang Anda cari.", "title": "Gagal menemukan halaman" }, "onboarding": { "defaultConfirm": { "cancel": "Batal", - "title": "Apa kamu yakin?" + "confirm": "Gunakan pengaturan bawaan", + "description": "Pengaturan bawaan tidak memiliki streaming terbaik dan bisa menjadi sangat lambat.", + "title": "Apa Anda yakin?" }, "extension": { "back": "Kembali", + "explainer": "Menggunakan ekstensi browser, Anda dapat mendapatkan streaming terbaik yang kami tawarkan. Dengan instalasi sederhana.", "explainerIos": "Sayangnya, ekstensi browser tidak didukung di iOS, Tekan Kembali untuk memilih opsi lain.", + "extensionHelp": "Jika Anda telah menginstal ekstensi tetapi tidak terdeteksi, buka ekstensi melalui menu ekstensi browser Anda dan ikuti instruksi di layar.", + "linkChrome": "Instal ekstensi Chrome", + "linkFirefox": "Instal ekstensi Firefox", + "notDetecting": "Terinstal di Chrome tetapi situs tidak mendeteksinya? Coba muat ulang halaman!", "notDetectingAction": "Muat ulang halaman", "status": { "disallowed": "Ekstensi tidak diaktifkan untuk halaman ini", "disallowedAction": "Aktifkan ekstensi", + "failed": "Gagal meminta status", + "loading": "Menunggu Anda menginstal ekstensi", "outdated": "Versi ekstensi terlalu tua", - "success": "Ekstensi bekerja sesuai harapan!" + "success": "Ekstensi berkerja sesuai harapan!" }, "submit": "Lanjutkan", "title": "Mari mulai dengan ekstensi" }, "proxy": { "back": "Kembali", + "explainer": "Menggunakan metode proxy, Anda dapat mendapatkan streaming berkualitas baik dengan membuat layanan proxy mandiri.", "input": { + "errorConnection": "Tidak dapat terhubung ke proxy", "errorInvalidUrl": "URL tidak valid", + "errorNotProxy": "Mengharapkan proxy tapi menerima situs", + "label": "URL proxy", "placeholder": "https://" }, "link": "Belajar cara membuat proxy", "title": "Mari buat proxy baru" }, "start": { + "explainer": "Untuk mendapatkan streaming terbaik, Anda perlu memilih metode streaming yang Anda ingin gunakan.", "options": { + "default": { + "text": "Saya tidak menginginkan streaming kualitas baik, <0 /> <1>gunakan pengaturan bawaan" + }, "extension": { - "action": "Instal ekstensi" + "action": "Instal ekstensi", + "description": "Instal ekstensi browser dan dapatkan akses ke sumber terbaik.", + "quality": "Kualitas terbaik", + "title": "Ekstensi browser" + }, + "proxy": { + "action": "Atur proxy", + "description": "Atur proxy dalam hanya 5 menit dan dapatkan akses ke sumber terbaik.", + "quality": "Kualitas baik" } } } @@ -223,12 +250,13 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "Salin tautan daftar putar HLS", "disclaimer": "Tautan unduhan diambil langsung dari penyedia pihak ketiga. Aplikasi ini tidak memiliki kendali bagaimana unduhan disediakan.", - "downloadSubtitle": "Unduh subtitle", + "downloadSubtitle": "Unduh subtitle saat ini", "downloadVideo": "Unduh media", - "hlsDisclaimer": "Tautan unduhan diambil langsung dari penyedia pihak ketiga. Aplikasi ini tidak memiliki kendali bagaimana unduhan disediakan. Harap diperhatikan, anda akan mengunduh HLS playlist, media ini hanya ditunjukan bagi pengguna tingkat lanjut.", + "hlsDisclaimer": "Unduhan didapatkan langsung dari penyedia. movie-web tidak memiliki kendali bagaimana unduan disediakan.

Harap diperhatikan bahwa Anda mengunduh daftar putar HLS, ini tidak direkomendasikan untuk diunduh jika Anda tidak terbiasa dengan format streaming tingkat lanjutCoba sumber berbeda untuk format berbeda.", "onAndroid": { - "1": "Untuk mengunduh di Android, klik tombol unduh, lalu di halaman baru klik dan tahan pada video, lalu pilih save.", + "1": "Untuk mengunduh di Android, klik tombol unduh, lalu di halaman baru klik dan tahan pada video, lalu pilih simpan.", "shortTitle": "Unduh / Android", "title": "Unduh di Android" }, @@ -246,11 +274,12 @@ }, "episodes": { "button": "Episode", - "emptyState": "Tidak ada episode di season ini, check lagi nanti!", + "emptyState": "Tidak ada episode di season ini, periksa kembali nanti!", "episodeBadge": "E{{episode}}", - "loadingError": "Eror memuat season", + "loadingError": "Gagal memuat season", "loadingList": "Memuat...", - "loadingTitle": "Memuat..." + "loadingTitle": "Memuat...", + "unairedEpisodes": "Satu atau lebih episode dalam season ini telah dinonaktifkan karena mereka belum ditayangkan." }, "playback": { "speedLabel": "Kecepatan pemutar", @@ -258,13 +287,13 @@ }, "quality": { "automaticLabel": "Otomatis", - "hint": "Anda dapat mencoba <0>mengganti sumber media untuk mendapatkan opsi kualitas yang berbeda.", - "iosNoQuality": "Karena keterbatasan dari Apple, opsi kualitas pada sumber ini tidak tersedia untuk iOS. Anda dapat mencoba <0>mengganti sumber media untuk mendapatkan opsi kualitas yang berbeda.", + "hint": "Anda dapat mencoba <0>mengganti sumber untuk mendapatkan opsi kualitas yang berbeda.", + "iosNoQuality": "Karena keterbatasan dari Apple, opsi kualitas pada sumber ini tidak tersedia untuk iOS. Anda dapat mencoba <0>mengganti sumber untuk mendapatkan opsi kualitas yang berbeda.", "title": "Kualitas" }, "settings": { "downloadItem": "Unduh", - "enableSubtitles": "Hidupkan subtitle", + "enableSubtitles": "Aktifkan subtitle", "experienceSection": "Pengaturan tambahan", "playbackItem": "Pengaturan pemutar", "qualityItem": "Kualitas", @@ -274,22 +303,22 @@ }, "sources": { "failed": { - "text": "Terjadi galat saat mencoba mencari media, mohon pilih sumber yang lain.", + "text": "Terjadi galat saat mencoba mencari media, mohon pilih sumber lain.", "title": "Gagal memuat data" }, "noEmbeds": { - "text": "Kami tidak dapat menemukan tautan, mohon pilih sumber yang lain.", + "text": "Kami tidak dapat menemukan tautan, mohon pilih sumber lain.", "title": "Tautan tidak ditemukan" }, "noStream": { - "text": "Sumber ini tidak memiliki media untuk film atau seri yang anda cari.", + "text": "Sumber ini tidak memiliki media untuk film atau seri yang Anda cari.", "title": "Tidak ada media" }, "title": "Sumber", "unknownOption": "Tidak diketahui" }, "subtitles": { - "customChoice": "Pilih subtitle dari file", + "customChoice": "Jatuhkan atau unggah berkas", "customizeLabel": "Sesuaikan", "offChoice": "Matikan", "settings": { From 5355791486c06286d0f8d4e2150d59b5950e4264 Mon Sep 17 00:00:00 2001 From: Mehdi Date: Sun, 31 Mar 2024 10:24:32 +0000 Subject: [PATCH 059/101] Translated using Weblate (Persian) Currently translated at 100.0% (336 of 336 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 99d7aaa4..01c46a84 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -386,7 +386,7 @@ "badge": "اکستنشن غیر فعال شد", "enableExtension": "اکستنشن را فعال کنید", "homeButton": "خانه", - "text": "شما اکستنشن مووی-وب را نصب کردید. برای شروع استفاده از ان، شما نیاز به فعال کردن آن دارید", + "text": "شما اکستنشن مووی-وب را نصب کردید. برای شروع استفاده از ان، نیاز به فعال کردن آن دارید", "title": "لطفا اکستنشن را فعال کنید" }, "items": { From 20cec61eac8f671fd92cdad8746d7f533f68a668 Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Sun, 31 Mar 2024 21:55:06 +0300 Subject: [PATCH 060/101] feat: add autoplay preference for extension users --- .eslintrc.js | 1 + package.json | 1 + pnpm-lock.yaml | 1698 ++++++++++++++++- src/assets/locales/en.json | 3 + .../player/atoms/NextEpisodeButton.tsx | 19 +- src/hooks/useSettingsState.ts | 16 +- src/pages/Settings.tsx | 28 +- src/pages/parts/settings/PreferencesPart.tsx | 45 + src/stores/preferences/index.tsx | 8 + 9 files changed, 1784 insertions(+), 35 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index e9b54595..f27e359d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -103,6 +103,7 @@ module.exports = { allowSeparatedGroups: true } ], + "import/no-extraneous-dependencies": ["error", {"devDependencies": true}], ...a11yOff } }; diff --git a/package.json b/package.json index 5a1d5ca4..7dcac197 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "@types/crypto-js": "^4.2.1", "@types/dompurify": "^3.0.5", "@types/fscreen": "^1.0.4", + "@types/lodash": "^4.17.0", "@types/lodash.isequal": "^4.5.8", "@types/lodash.merge": "^4.6.9", "@types/lodash.throttle": "^4.1.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11d4f458..ceddbb39 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -167,6 +167,9 @@ devDependencies: '@types/fscreen': specifier: ^1.0.4 version: 1.0.4 + '@types/lodash': + specifier: ^4.17.0 + version: 4.17.0 '@types/lodash.isequal': specifier: ^4.5.8 version: 4.5.8 @@ -331,6 +334,14 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} engines: {node: '>=10'} @@ -358,10 +369,23 @@ packages: '@babel/highlight': 7.23.4 chalk: 2.4.2 + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + dev: true + /@babel/compat-data@7.23.5: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} + /@babel/compat-data@7.24.1: + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core@7.23.6: resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} engines: {node: '>=6.9.0'} @@ -384,6 +408,29 @@ packages: transitivePeerDependencies: - supports-color + /@babel/core@7.24.3: + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.23.6: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} @@ -393,6 +440,16 @@ packages: '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 + /@babel/generator@7.24.1: + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -435,6 +492,24 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.6): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} @@ -447,6 +522,18 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.3): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.23.6): resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} engines: {node: '>=6.9.0'} @@ -459,6 +546,18 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.24.3): + resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.6): resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} peerDependencies: @@ -474,6 +573,21 @@ packages: - supports-color dev: true + /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.3): + resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} @@ -504,6 +618,13 @@ packages: dependencies: '@babel/types': 7.23.0 + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} @@ -517,6 +638,20 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} @@ -528,6 +663,11 @@ packages: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.6): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} @@ -540,6 +680,18 @@ packages: '@babel/helper-wrap-function': 7.22.20 dev: true + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.3): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} @@ -552,6 +704,18 @@ packages: '@babel/helper-optimise-call-expression': 7.22.5 dev: true + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} @@ -579,6 +743,11 @@ packages: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} @@ -606,6 +775,17 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helpers@7.24.1: + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.22.13: resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} engines: {node: '>=6.9.0'} @@ -623,6 +803,16 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: true + /@babel/parser@7.23.0: resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} @@ -638,6 +828,14 @@ packages: dependencies: '@babel/types': 7.23.6 + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} @@ -648,6 +846,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} engines: {node: '>=6.9.0'} @@ -660,6 +868,18 @@ packages: '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.6) dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) + dev: true + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==} engines: {node: '>=6.9.0'} @@ -671,6 +891,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} @@ -680,6 +911,15 @@ packages: '@babel/core': 7.23.6 dev: true + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + dev: true + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.6): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -689,6 +929,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.6): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -698,6 +947,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.6): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -708,6 +966,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.3): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -717,6 +985,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -726,6 +1003,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} engines: {node: '>=6.9.0'} @@ -736,6 +1022,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} engines: {node: '>=6.9.0'} @@ -746,6 +1042,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -755,6 +1061,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -764,6 +1079,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} @@ -782,6 +1106,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -791,6 +1124,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.6): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -800,6 +1142,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -809,6 +1160,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -818,6 +1178,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.6): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -827,6 +1196,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.6): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -837,6 +1215,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.3): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.6): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -847,6 +1235,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} @@ -867,6 +1265,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.3): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} engines: {node: '>=6.9.0'} @@ -877,6 +1286,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==} engines: {node: '>=6.9.0'} @@ -890,6 +1309,19 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.3): + resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} engines: {node: '>=6.9.0'} @@ -902,6 +1334,18 @@ packages: '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} engines: {node: '>=6.9.0'} @@ -912,6 +1356,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} engines: {node: '>=6.9.0'} @@ -922,6 +1376,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} engines: {node: '>=6.9.0'} @@ -933,6 +1397,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} engines: {node: '>=6.9.0'} @@ -945,6 +1420,18 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.6): resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} engines: {node: '>=6.9.0'} @@ -963,6 +1450,23 @@ packages: globals: 11.12.0 dev: true + /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} engines: {node: '>=6.9.0'} @@ -974,6 +1478,17 @@ packages: '@babel/template': 7.22.15 dev: true + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/template': 7.24.0 + dev: true + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} engines: {node: '>=6.9.0'} @@ -984,6 +1499,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} engines: {node: '>=6.9.0'} @@ -995,6 +1520,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} engines: {node: '>=6.9.0'} @@ -1005,6 +1541,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} engines: {node: '>=6.9.0'} @@ -1016,6 +1562,17 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} engines: {node: '>=6.9.0'} @@ -1027,6 +1584,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} engines: {node: '>=6.9.0'} @@ -1038,6 +1606,17 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.6): resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} engines: {node: '>=6.9.0'} @@ -1049,6 +1628,17 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} engines: {node: '>=6.9.0'} @@ -1061,6 +1651,18 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} engines: {node: '>=6.9.0'} @@ -1072,6 +1674,17 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} engines: {node: '>=6.9.0'} @@ -1082,6 +1695,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} engines: {node: '>=6.9.0'} @@ -1093,6 +1716,17 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} engines: {node: '>=6.9.0'} @@ -1103,6 +1737,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} engines: {node: '>=6.9.0'} @@ -1114,6 +1758,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} @@ -1126,6 +1781,18 @@ packages: '@babel/helper-simple-access': 7.22.5 dev: true + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-simple-access': 7.22.5 + dev: true + /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} engines: {node: '>=6.9.0'} @@ -1139,6 +1806,19 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true + /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} engines: {node: '>=6.9.0'} @@ -1150,6 +1830,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.6): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} @@ -1161,6 +1852,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.3): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} engines: {node: '>=6.9.0'} @@ -1171,6 +1873,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} engines: {node: '>=6.9.0'} @@ -1182,6 +1894,17 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} engines: {node: '>=6.9.0'} @@ -1193,6 +1916,17 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} engines: {node: '>=6.9.0'} @@ -1207,6 +1941,19 @@ packages: '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} engines: {node: '>=6.9.0'} @@ -1218,6 +1965,17 @@ packages: '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} engines: {node: '>=6.9.0'} @@ -1229,6 +1987,17 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} engines: {node: '>=6.9.0'} @@ -1241,6 +2010,18 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} engines: {node: '>=6.9.0'} @@ -1251,6 +2032,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} engines: {node: '>=6.9.0'} @@ -1262,6 +2053,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} engines: {node: '>=6.9.0'} @@ -1275,6 +2077,19 @@ packages: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) dev: true + /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) + dev: true + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} engines: {node: '>=6.9.0'} @@ -1285,6 +2100,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} engines: {node: '>=6.9.0'} @@ -1316,6 +2141,17 @@ packages: regenerator-transform: 0.15.2 dev: true + /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + regenerator-transform: 0.15.2 + dev: true + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} engines: {node: '>=6.9.0'} @@ -1326,6 +2162,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} engines: {node: '>=6.9.0'} @@ -1336,6 +2182,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} engines: {node: '>=6.9.0'} @@ -1347,6 +2203,17 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} engines: {node: '>=6.9.0'} @@ -1357,6 +2224,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} engines: {node: '>=6.9.0'} @@ -1367,6 +2244,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} engines: {node: '>=6.9.0'} @@ -1377,6 +2264,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.6): resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} engines: {node: '>=6.9.0'} @@ -1400,6 +2297,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} engines: {node: '>=6.9.0'} @@ -1411,6 +2318,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} engines: {node: '>=6.9.0'} @@ -1422,6 +2340,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} engines: {node: '>=6.9.0'} @@ -1433,6 +2362,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + /@babel/preset-env@7.23.6(@babel/core@7.23.6): resolution: {integrity: sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==} engines: {node: '>=6.9.0'} @@ -1524,6 +2464,97 @@ packages: - supports-color dev: true + /@babel/preset-env@7.24.3(@babel/core@7.24.3): + resolution: {integrity: sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.24.1 + '@babel/core': 7.24.3 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.3) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.3) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.3) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.3) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.3) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.3) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3) + core-js-compat: 3.36.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.6): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: @@ -1535,6 +2566,17 @@ packages: esutils: 2.0.3 dev: true + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.3): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.0 + esutils: 2.0.3 + dev: true + /@babel/preset-typescript@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} engines: {node: '>=6.9.0'} @@ -1565,6 +2607,13 @@ packages: dependencies: regenerator-runtime: 0.14.0 + /@babel/runtime@7.24.1: + resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: true + /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} @@ -1573,6 +2622,15 @@ packages: '@babel/parser': 7.23.6 '@babel/types': 7.23.6 + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + dev: true + /@babel/traverse@7.23.6: resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} engines: {node: '>=6.9.0'} @@ -1590,6 +2648,24 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.23.0: resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} @@ -1606,6 +2682,15 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + /@esbuild/aix-ppc64@0.19.10: resolution: {integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==} engines: {node: '>=12'} @@ -1913,19 +2998,38 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.19 + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 dev: true /@jridgewell/sourcemap-codec@1.4.15: @@ -1937,6 +3041,13 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@ladjs/country-language@1.0.3: resolution: {integrity: sha512-FJROu9/hh4eqVAGDyfL8vpv6Vb0qKHX1ozYLRZ+beUzD5xFf+3r0J+SVIWKviEa7W524Qvqou+ta1WrsRgzxGw==} engines: {node: '>= 14'} @@ -2068,7 +3179,7 @@ packages: engines: {node: '>=14.0.0'} dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.13.2): + /@rollup/plugin-babel@5.3.1(@babel/core@7.24.3)(@rollup/wasm-node@4.13.2): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2079,8 +3190,8 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-imports': 7.22.15 + '@babel/core': 7.24.3 + '@babel/helper-module-imports': 7.24.3 '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.13.2) rollup: /@rollup/wasm-node@4.13.2 dev: true @@ -2096,7 +3207,7 @@ packages: builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.4 + resolve: 1.22.8 rollup: /@rollup/wasm-node@4.13.2 dev: true @@ -2169,7 +3280,7 @@ packages: ejs: 3.1.9 json5: 2.2.3 magic-string: 0.25.9 - string.prototype.matchall: 4.0.9 + string.prototype.matchall: 4.0.11 dev: true /@types/babel__core@7.20.5: @@ -2268,23 +3379,23 @@ packages: /@types/lodash.isequal@4.5.8: resolution: {integrity: sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==} dependencies: - '@types/lodash': 4.14.202 + '@types/lodash': 4.17.0 dev: true /@types/lodash.merge@4.6.9: resolution: {integrity: sha512-23sHDPmzd59kUgWyKGiOMO2Qb9YtqRO/x4IhkgNUiPQ1+5MUVqi6bCZeq9nBJ17msjIMbEIO5u+XW4Kz6aGUhQ==} dependencies: - '@types/lodash': 4.14.202 + '@types/lodash': 4.17.0 dev: true /@types/lodash.throttle@4.1.9: resolution: {integrity: sha512-PCPVfpfueguWZQB7pJQK890F2scYKoDUL3iM522AptHWn7d5NQmeS/LTEHIcLr5PaTzl3dK2Z0xSUHHTHwaL5g==} dependencies: - '@types/lodash': 4.14.202 + '@types/lodash': 4.17.0 dev: true - /@types/lodash@4.14.202: - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + /@types/lodash@4.17.0: + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} dev: true /@types/node-forge@1.3.10: @@ -2298,6 +3409,12 @@ packages: dependencies: undici-types: 5.26.5 + /@types/node@20.12.2: + resolution: {integrity: sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==} + dependencies: + undici-types: 5.26.5 + dev: true + /@types/pako@2.0.3: resolution: {integrity: sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q==} dev: true @@ -2354,7 +3471,7 @@ packages: /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 20.10.5 + '@types/node': 20.12.2 dev: true /@types/scheduler@0.16.3: @@ -2584,6 +3701,13 @@ packages: resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} hasBin: true + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true /agent-base@7.1.0: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} @@ -2684,6 +3808,14 @@ packages: is-array-buffer: 3.0.2 dev: true + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + /array-includes@3.1.6: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} @@ -2784,6 +3916,20 @@ packages: is-shared-array-buffer: 1.0.2 dev: true + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true + /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true @@ -2792,8 +3938,8 @@ packages: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} dev: true /asynciterator.prototype@1.0.0: @@ -2831,6 +3977,13 @@ packages: engines: {node: '>= 0.4'} dev: true + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + /axe-core@4.7.0: resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} engines: {node: '>=4'} @@ -2842,6 +3995,19 @@ packages: dequal: 2.0.3 dev: true + /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.3): + resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.24.1 + '@babel/core': 7.24.3 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.6): resolution: {integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==} peerDependencies: @@ -2855,6 +4021,18 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + core-js-compat: 3.36.1 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.6): resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} peerDependencies: @@ -2878,6 +4056,17 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.3): + resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + transitivePeerDependencies: + - supports-color + dev: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -2942,6 +4131,17 @@ packages: node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001603 + electron-to-chromium: 1.4.722 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -2970,6 +4170,17 @@ packages: get-intrinsic: 1.2.1 dev: true + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2983,6 +4194,10 @@ packages: /caniuse-lite@1.0.30001571: resolution: {integrity: sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==} + /caniuse-lite@1.0.30001603: + resolution: {integrity: sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==} + dev: true + /chai@4.3.10: resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} engines: {node: '>=4'} @@ -3166,6 +4381,12 @@ packages: browserslist: 4.22.2 dev: true + /core-js-compat@3.36.1: + resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + dependencies: + browserslist: 4.23.0 + dev: true + /core-js@3.34.0: resolution: {integrity: sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==} requiresBuild: true @@ -3254,6 +4475,33 @@ packages: whatwg-url: 14.0.0 dev: true + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -3323,6 +4571,15 @@ packages: has-property-descriptors: 1.0.0 dev: true + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -3451,6 +4708,10 @@ packages: /electron-to-chromium@1.4.616: resolution: {integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==} + /electron-to-chromium@1.4.722: + resolution: {integrity: sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -3522,6 +4783,70 @@ packages: which-typed-array: 1.1.11 dev: true + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + /es-iterator-helpers@1.0.15: resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} dependencies: @@ -3541,6 +4866,13 @@ packages: safe-array-concat: 1.0.1 dev: true + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -3550,6 +4882,15 @@ packages: has-tostringtag: 1.0.0 dev: true + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: @@ -4134,7 +5475,7 @@ packages: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs.realpath@1.0.0: @@ -4206,6 +5547,17 @@ packages: has-symbols: 1.0.3 dev: true + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + /get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} dev: true @@ -4228,6 +5580,15 @@ packages: get-intrinsic: 1.2.1 dev: true + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + /get-tsconfig@4.7.2: resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} dependencies: @@ -4357,11 +5718,22 @@ packages: get-intrinsic: 1.2.1 dev: true + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: true + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} @@ -4374,6 +5746,13 @@ packages: has-symbols: 1.0.3 dev: true + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} @@ -4388,6 +5767,13 @@ packages: function-bind: 1.1.2 dev: true + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /hls.js@1.5.7: resolution: {integrity: sha512-Hnyf7ojTBtXHeOW1/t6wCBJSiK1WpoKF9yg7juxldDx8u3iswrkPt2wbOA/1NiwU4j27DSIVoIEJRAhcdMef/A==} dev: false @@ -4525,6 +5911,15 @@ packages: side-channel: 1.0.4 dev: true + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + dev: true + /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: @@ -4539,6 +5934,14 @@ packages: is-typed-array: 1.1.12 dev: true + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: true @@ -4587,6 +5990,13 @@ packages: hasown: 2.0.0 dev: true + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -4655,6 +6065,11 @@ packages: engines: {node: '>= 0.4'} dev: true + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -4703,6 +6118,13 @@ packages: call-bind: 1.0.2 dev: true + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: true + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -4734,6 +6156,13 @@ packages: which-typed-array: 1.1.11 dev: true + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + dev: true + /is-weakmap@2.0.1: resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} dev: true @@ -4795,7 +6224,7 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.4 + async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -4805,7 +6234,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.10.5 + '@types/node': 20.12.2 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -5308,6 +6737,10 @@ packages: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -5323,6 +6756,16 @@ packages: object-keys: 1.1.1 dev: true + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + /object.entries@1.1.7: resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} @@ -5535,6 +6978,11 @@ packages: pathe: 1.1.1 dev: true + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + /postcss-import@15.1.0(postcss@8.4.32): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -5949,6 +7397,10 @@ packages: /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: true + /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: @@ -5964,6 +7416,16 @@ packages: functions-have-names: 1.2.3 dev: true + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} @@ -6019,6 +7481,15 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /resolve@2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true @@ -6046,11 +7517,11 @@ packages: peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 jest-worker: 26.6.2 rollup: /@rollup/wasm-node@4.13.2 serialize-javascript: 4.0.0 - terser: 5.19.3 + terser: 5.30.0 dev: true /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.13.2): @@ -6135,6 +7606,16 @@ packages: isarray: 2.0.5 dev: true + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true @@ -6147,6 +7628,15 @@ packages: is-regex: 1.1.4 dev: true + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true @@ -6190,6 +7680,18 @@ packages: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: false + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} @@ -6199,6 +7701,16 @@ packages: has-property-descriptors: 1.0.0 dev: true + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + /set-harmonic-interval@1.0.1: resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} engines: {node: '>=6.9'} @@ -6228,6 +7740,16 @@ packages: object-inspect: 1.12.3 dev: true + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true @@ -6346,6 +7868,24 @@ packages: strip-ansi: 7.1.0 dev: true + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: true + /string.prototype.matchall@4.0.9: resolution: {integrity: sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==} dependencies: @@ -6368,6 +7908,16 @@ packages: es-abstract: 1.22.1 dev: true + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: @@ -6376,6 +7926,14 @@ packages: es-abstract: 1.22.1 dev: true + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: @@ -6384,6 +7942,15 @@ packages: es-abstract: 1.22.1 dev: true + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + /stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} @@ -6567,13 +8134,13 @@ packages: unique-string: 2.0.0 dev: true - /terser@5.19.3: - resolution: {integrity: sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==} + /terser@5.30.0: + resolution: {integrity: sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.11.2 + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -6734,6 +8301,15 @@ packages: is-typed-array: 1.1.12 dev: true + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + /typed-array-byte-length@1.0.0: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} @@ -6744,6 +8320,17 @@ packages: is-typed-array: 1.1.12 dev: true + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + /typed-array-byte-offset@1.0.0: resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} engines: {node: '>= 0.4'} @@ -6755,6 +8342,18 @@ packages: is-typed-array: 1.1.12 dev: true + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: @@ -6763,6 +8362,18 @@ packages: is-typed-array: 1.1.12 dev: true + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -6838,6 +8449,11 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + /unpacker@1.0.1: resolution: {integrity: sha512-0HTljwp8+JBdITpoHcK1LWi7X9U2BspUmWv78UWZh7NshYhbh1nec8baY/iSbe2OQTZ2bhAtVdnr6/BTD0DKVg==} dev: false @@ -6882,6 +8498,17 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -7271,6 +8898,17 @@ packages: has-tostringtag: 1.0.0 dev: true + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -7310,10 +8948,10 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) - '@babel/core': 7.23.6 - '@babel/preset-env': 7.23.6(@babel/core@7.23.6) - '@babel/runtime': 7.23.6 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.13.2) + '@babel/core': 7.24.3 + '@babel/preset-env': 7.24.3(@babel/core@7.24.3) + '@babel/runtime': 7.24.1 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.3)(@rollup/wasm-node@4.13.2) '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.13.2) '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.13.2) '@surma/rollup-plugin-off-main-thread': 2.2.3 diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index bc042462..cf86111b 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -523,6 +523,9 @@ "thumbnail": "Generate thumbnails", "thumbnailDescription": "Most of the time, videos don't have thumbnails. You can enable this setting to generate them on the fly but they can make your video slower.", "thumbnailLabel": "Generate thumbnails", + "autoplay": "Autoplay", + "autoplayDescription": "Automatically play the next episode in a series after reaching the end. This feature is reserved only for extension users.", + "autoplayLabel": "Autoplay", "title": "Preferences" }, "reset": "Reset", diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index 906b6829..a6eb33a7 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -1,12 +1,15 @@ import classNames from "classnames"; -import { useCallback } from "react"; +import { debounce, throttle } from "lodash"; +import { useCallback, useEffect } from "react"; import { useTranslation } from "react-i18next"; +import { isExtensionActiveCached } from "@/backend/extension/messaging"; import { Icon, Icons } from "@/components/Icon"; import { usePlayerMeta } from "@/components/player/hooks/usePlayerMeta"; import { Transition } from "@/components/utils/Transition"; import { PlayerMeta } from "@/stores/player/slices/source"; import { usePlayerStore } from "@/stores/player/store"; +import { usePreferencesStore } from "@/stores/preferences"; import { useProgressStore } from "@/stores/progress"; function shouldShowNextEpisodeButton( @@ -57,6 +60,7 @@ export function NextEpisodeButton(props: { (s) => s.setShouldStartFromBeginning, ); const updateItem = useProgressStore((s) => s.updateItem); + const enableAutoplay = usePreferencesStore((s) => s.enableAutoplay); let show = false; if (showingState === "always") show = true; @@ -95,6 +99,19 @@ export function NextEpisodeButton(props: { updateItem, ]); + useEffect(() => { + if (!enableAutoplay || !meta || !nextEp || metaType !== "show") return; + const halfPercent = duration / 100; + const isEnding = time >= duration - halfPercent && duration !== 0; + + const debouncedLoadNextEpisode = throttle(debounce(loadNextEpisode), 300); + if (isEnding && isExtensionActiveCached()) debouncedLoadNextEpisode(); + + return () => { + debouncedLoadNextEpisode.cancel(); + }; + }, [duration, enableAutoplay, loadNextEpisode, meta, metaType, nextEp, time]); + if (!meta?.episode || !nextEp) return null; if (metaType !== "show") return null; diff --git a/src/hooks/useSettingsState.ts b/src/hooks/useSettingsState.ts index 8e540a19..eb8cd73f 100644 --- a/src/hooks/useSettingsState.ts +++ b/src/hooks/useSettingsState.ts @@ -51,6 +51,7 @@ export function useSettingsState( } | undefined, enableThumbnails: boolean, + enableAutoplay: boolean, ) { const [proxyUrlsState, setProxyUrls, resetProxyUrls, proxyUrlsChanged] = useDerived(proxyUrls); @@ -84,6 +85,12 @@ export function useSettingsState( resetEnableThumbnails, enableThumbnailsChanged, ] = useDerived(enableThumbnails); + const [ + enableAutoplayState, + setEnableAutoplayState, + resetEnableAutoplay, + enableAutoplayChanged, + ] = useDerived(enableAutoplay); function reset() { resetTheme(); @@ -95,6 +102,7 @@ export function useSettingsState( resetDeviceName(); resetProfile(); resetEnableThumbnails(); + resetEnableAutoplay(); } const changed = @@ -105,7 +113,8 @@ export function useSettingsState( backendUrlChanged || proxyUrlsChanged || profileChanged || - enableThumbnailsChanged; + enableThumbnailsChanged || + enableAutoplayChanged; return { reset, @@ -150,5 +159,10 @@ export function useSettingsState( set: setEnableThumbnailsState, changed: enableThumbnailsChanged, }, + enableAutoplay: { + state: enableAutoplayState, + set: setEnableAutoplayState, + changed: enableAutoplayChanged, + }, }; } diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx index b6bf4fc4..7d2e30de 100644 --- a/src/pages/Settings.tsx +++ b/src/pages/Settings.tsx @@ -122,6 +122,9 @@ export function SettingsPage() { const enableThumbnails = usePreferencesStore((s) => s.enableThumbnails); const setEnableThumbnails = usePreferencesStore((s) => s.setEnableThumbnails); + const enableAutoplay = usePreferencesStore((s) => s.enableAutoplay); + const setEnableAutoplay = usePreferencesStore((s) => s.setEnableAutoplay); + const account = useAuthStore((s) => s.account); const updateProfile = useAuthStore((s) => s.setAccountProfile); const updateDeviceName = useAuthStore((s) => s.updateDeviceName); @@ -144,6 +147,7 @@ export function SettingsPage() { backendUrlSetting, account?.profile, enableThumbnails, + enableAutoplay, ); useEffect(() => { @@ -196,6 +200,7 @@ export function SettingsPage() { } setEnableThumbnails(state.enableThumbnails.state); + setEnableAutoplay(state.enableAutoplay.state); setAppLanguage(state.appLanguage.state); setTheme(state.theme.state); setSubStyling(state.subtitleStyling.state); @@ -217,18 +222,33 @@ export function SettingsPage() { setBackendUrl(url); } }, [ - state, account, backendUrl, setEnableThumbnails, + state.enableThumbnails.state, + state.enableAutoplay.state, + state.appLanguage.state, + state.appLanguage.changed, + state.theme.state, + state.theme.changed, + state.subtitleStyling.state, + state.proxyUrls.state, + state.proxyUrls.changed, + state.profile.state, + state.profile.changed, + state.backendUrl.changed, + state.backendUrl.state, + state.deviceName.changed, + state.deviceName.state, + setEnableAutoplay, setAppLanguage, setTheme, setSubStyling, + setProxySet, updateDeviceName, updateProfile, - setProxySet, - setBackendUrl, logout, + setBackendUrl, ]); return ( @@ -266,6 +286,8 @@ export function SettingsPage() { setLanguage={state.appLanguage.set} enableThumbnails={state.enableThumbnails.state} setEnableThumbnails={state.enableThumbnails.set} + enableAutoplay={state.enableAutoplay.state} + setEnableAutoplay={state.enableAutoplay.set} />
diff --git a/src/pages/parts/settings/PreferencesPart.tsx b/src/pages/parts/settings/PreferencesPart.tsx index 2c1c5f37..8cf2c565 100644 --- a/src/pages/parts/settings/PreferencesPart.tsx +++ b/src/pages/parts/settings/PreferencesPart.tsx @@ -1,5 +1,7 @@ import { useTranslation } from "react-i18next"; +import { useAsync } from "react-use"; +import { isExtensionActive } from "@/backend/extension/messaging"; import { Toggle } from "@/components/buttons/Toggle"; import { FlagIcon } from "@/components/FlagIcon"; import { Dropdown } from "@/components/form/Dropdown"; @@ -7,14 +9,31 @@ import { Heading1 } from "@/components/utils/Text"; import { appLanguageOptions } from "@/setup/i18n"; import { getLocaleInfo, sortLangCodes } from "@/utils/language"; +function useIsExtensionActive() { + const { loading, value } = useAsync(async () => { + const extensionStatus = (await isExtensionActive()) ? "success" : "unset"; + return extensionStatus === "success"; + }, []); + + return { + loading, + active: value, + }; +} + export function PreferencesPart(props: { language: string; setLanguage: (l: string) => void; enableThumbnails: boolean; setEnableThumbnails: (v: boolean) => void; + enableAutoplay: boolean; + setEnableAutoplay: (v: boolean) => void; }) { const { t } = useTranslation(); const sorted = sortLangCodes(appLanguageOptions.map((item) => item.code)); + const { loading, active } = useIsExtensionActive(); + + const extensionActive = active && !loading; const options = appLanguageOptions .sort((a, b) => sorted.indexOf(a.code) - sorted.indexOf(b.code)) @@ -62,6 +81,32 @@ export function PreferencesPart(props: {

+
+

+ {t("settings.preferences.autoplay")} +

+

+ {t("settings.preferences.autoplayDescription")} +

+
+ extensionActive + ? props.setEnableAutoplay(!props.enableAutoplay) + : null + } + className="bg-dropdown-background hover:bg-dropdown-hoverBackground select-none my-4 cursor-pointer space-x-3 flex items-center max-w-[25rem] py-3 px-4 rounded-lg" + style={{ + pointerEvents: extensionActive ? "auto" : "none", + opacity: extensionActive ? 1 : 0.5, + cursor: extensionActive ? "pointer" : "not-allowed", + }} + > + +

+ {t("settings.preferences.autoplayLabel")} +

+
+
); } diff --git a/src/stores/preferences/index.tsx b/src/stores/preferences/index.tsx index 65fae22d..ce198388 100644 --- a/src/stores/preferences/index.tsx +++ b/src/stores/preferences/index.tsx @@ -5,6 +5,8 @@ import { immer } from "zustand/middleware/immer"; export interface PreferencesStore { enableThumbnails: boolean; setEnableThumbnails(v: boolean): void; + enableAutoplay: boolean; + setEnableAutoplay(v: boolean): void; } export const usePreferencesStore = create( @@ -16,6 +18,12 @@ export const usePreferencesStore = create( s.enableThumbnails = v; }); }, + enableAutoplay: false, + setEnableAutoplay(v) { + set((s) => { + s.enableAutoplay = v; + }); + }, })), { name: "__MW::preferences", From 05a714d50fed695a81ce1437f0c4ce4a628b5a36 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Sun, 31 Mar 2024 21:00:42 +0200 Subject: [PATCH 061/101] bump versions --- package.json | 4 +-- pnpm-lock.yaml | 75 +++++++++++++++++++++++++++++--------------------- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 5a1d5ca4..945ef93a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "movie-web", - "version": "4.6.3", + "version": "4.6.4", "private": true, "homepage": "https://github.com/movie-web/movie-web", "scripts": { @@ -29,7 +29,7 @@ "@formkit/auto-animate": "^0.8.1", "@headlessui/react": "^1.7.17", "@ladjs/country-language": "^1.0.3", - "@movie-web/providers": "^2.2.5", + "@movie-web/providers": "^2.2.6", "@noble/hashes": "^1.3.3", "@plasmohq/messaging": "^0.6.1", "@react-spring/web": "^9.7.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11d4f458..a762277b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,8 +22,8 @@ dependencies: specifier: ^1.0.3 version: 1.0.3 '@movie-web/providers': - specifier: ^2.2.5 - version: 2.2.5 + specifier: ^2.2.6 + version: 2.2.6 '@noble/hashes': specifier: ^1.3.3 version: 1.3.3 @@ -1942,20 +1942,19 @@ packages: engines: {node: '>= 14'} dev: false - /@movie-web/providers@2.2.5: - resolution: {integrity: sha512-/mBtU79uf2pfPwgkqKjoyuHGdDgHjKyGGVtd7xd0EQ5ds6ox5y2bSp4XtQRjZ7rZgyAh0aYFElAsY8SC+Nkz5g==} + /@movie-web/providers@2.2.6: + resolution: {integrity: sha512-wBsg4oa1HoPal498oGfBr9pJbFO7bPr73WXGfbTdhuFfCTYxF0mK91DORr4CfxMxmNp19Bnt6FR6ss7mzsVGlA==} + requiresBuild: true dependencies: cheerio: 1.0.0-rc.12 cookie: 0.6.0 crypto-js: 4.2.0 form-data: 4.0.0 - iso-639-1: 3.1.0 + iso-639-1: 3.1.2 nanoid: 3.3.7 - node-fetch: 2.7.0 + node-fetch: 3.3.2 set-cookie-parser: 2.6.0 unpacker: 1.0.1 - transitivePeerDependencies: - - encoding dev: false /@noble/hashes@1.3.3: @@ -3246,6 +3245,11 @@ packages: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: false + /data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -4028,6 +4032,14 @@ packages: reusify: 1.0.4 dev: true + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + dev: false + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -4114,6 +4126,13 @@ packages: combined-stream: 1.0.8 mime-types: 2.1.35 + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true @@ -4766,8 +4785,8 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /iso-639-1@3.1.0: - resolution: {integrity: sha512-rWcHp9dcNbxa5C8jA/cxFlWNFNwy5Vup0KcFvgA8sPQs9ZeJHj/Eq0Y8Yz2eL8XlWYpxw4iwh9FfTeVxyqdRMw==} + /iso-639-1@3.1.2: + resolution: {integrity: sha512-Le7BRl3Jt9URvaiEHJCDEdvPZCfhiQoXnFgLAWNRhzFMwRFdWO7/5tLRQbiPzE394I9xd7KdRCM7S6qdOhwG5A==} engines: {node: '>=6.0'} dev: false @@ -5234,20 +5253,22 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + /node-fetch-native@1.4.0: resolution: {integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==} dev: false - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + /node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - whatwg-url: 5.0.0 + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 dev: false /node-forge@1.3.1: @@ -6647,10 +6668,6 @@ packages: url-parse: 1.5.10 dev: true - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: @@ -7166,8 +7183,9 @@ packages: xml-name-validator: 5.0.0 dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + /web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} dev: false /webidl-conversions@4.0.2: @@ -7208,13 +7226,6 @@ packages: webidl-conversions: 7.0.0 dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - /whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: From 34168a7037d3817293ab864b2b7e9fbe91d0cb19 Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Mon, 1 Apr 2024 00:43:00 +0300 Subject: [PATCH 062/101] feat: add autoplay configurability with `VITE_ALLOW_AUTOPLAY` and custom proxy --- Dockerfile | 2 ++ src/assets/locales/en.json | 2 +- .../player/atoms/NextEpisodeButton.tsx | 10 +++++++++- src/pages/Settings.tsx | 16 +--------------- src/pages/parts/settings/PreferencesPart.tsx | 17 ++++++++++++----- src/setup/config.ts | 4 ++++ 6 files changed, 29 insertions(+), 22 deletions(-) diff --git a/Dockerfile b/Dockerfile index 12b13f98..5f837bd3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,6 +23,7 @@ ARG ONBOARDING_PROXY_INSTALL_LINK ARG DISALLOWED_IDS ARG CDN_REPLACEMENTS ARG TURNSTILE_KEY +ARG ALLOW_AUTOPLAY="false" ENV VITE_PWA_ENABLED=${PWA_ENABLED} ENV VITE_GA_ID=${GA_ID} @@ -39,6 +40,7 @@ ENV VITE_ONBOARDING_PROXY_INSTALL_LINK=${ONBOARDING_PROXY_INSTALL_LINK} ENV VITE_DISALLOWED_IDS=${DISALLOWED_IDS} ENV VITE_CDN_REPLACEMENTS=${CDN_REPLACEMENTS} ENV VITE_TURNSTILE_KEY=${TURNSTILE_KEY} +ENV VITE_ALLOW_AUTOPLAY=${ALLOW_AUTOPLAY} COPY . ./ RUN pnpm run build diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index cf86111b..0ed81ef8 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -524,7 +524,7 @@ "thumbnailDescription": "Most of the time, videos don't have thumbnails. You can enable this setting to generate them on the fly but they can make your video slower.", "thumbnailLabel": "Generate thumbnails", "autoplay": "Autoplay", - "autoplayDescription": "Automatically play the next episode in a series after reaching the end. This feature is reserved only for extension users.", + "autoplayDescription": "Automatically play the next episode in a series after reaching the end. Can be enabled by users with the browser extension, a custom proxy, or with the default setup if allowed by the host.", "autoplayLabel": "Autoplay", "title": "Preferences" }, diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index a6eb33a7..60ba63eb 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -7,6 +7,8 @@ import { isExtensionActiveCached } from "@/backend/extension/messaging"; import { Icon, Icons } from "@/components/Icon"; import { usePlayerMeta } from "@/components/player/hooks/usePlayerMeta"; import { Transition } from "@/components/utils/Transition"; +import { conf } from "@/setup/config"; +import { useAuthStore } from "@/stores/auth"; import { PlayerMeta } from "@/stores/player/slices/source"; import { usePlayerStore } from "@/stores/player/store"; import { usePreferencesStore } from "@/stores/preferences"; @@ -105,7 +107,13 @@ export function NextEpisodeButton(props: { const isEnding = time >= duration - halfPercent && duration !== 0; const debouncedLoadNextEpisode = throttle(debounce(loadNextEpisode), 300); - if (isEnding && isExtensionActiveCached()) debouncedLoadNextEpisode(); + const allowAutoplay = Boolean( + conf().ALLOW_AUTOPLAY || + isExtensionActiveCached() || + useAuthStore.getState().proxySet, + ); + + if (isEnding && allowAutoplay) debouncedLoadNextEpisode(); return () => { debouncedLoadNextEpisode.cancel(); diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx index 7d2e30de..997fa3ed 100644 --- a/src/pages/Settings.tsx +++ b/src/pages/Settings.tsx @@ -225,21 +225,7 @@ export function SettingsPage() { account, backendUrl, setEnableThumbnails, - state.enableThumbnails.state, - state.enableAutoplay.state, - state.appLanguage.state, - state.appLanguage.changed, - state.theme.state, - state.theme.changed, - state.subtitleStyling.state, - state.proxyUrls.state, - state.proxyUrls.changed, - state.profile.state, - state.profile.changed, - state.backendUrl.changed, - state.backendUrl.state, - state.deviceName.changed, - state.deviceName.state, + state, setEnableAutoplay, setAppLanguage, setTheme, diff --git a/src/pages/parts/settings/PreferencesPart.tsx b/src/pages/parts/settings/PreferencesPart.tsx index 8cf2c565..f81e0c9e 100644 --- a/src/pages/parts/settings/PreferencesPart.tsx +++ b/src/pages/parts/settings/PreferencesPart.tsx @@ -6,7 +6,9 @@ import { Toggle } from "@/components/buttons/Toggle"; import { FlagIcon } from "@/components/FlagIcon"; import { Dropdown } from "@/components/form/Dropdown"; import { Heading1 } from "@/components/utils/Text"; +import { conf } from "@/setup/config"; import { appLanguageOptions } from "@/setup/i18n"; +import { useAuthStore } from "@/stores/auth"; import { getLocaleInfo, sortLangCodes } from "@/utils/language"; function useIsExtensionActive() { @@ -34,6 +36,11 @@ export function PreferencesPart(props: { const { loading, active } = useIsExtensionActive(); const extensionActive = active && !loading; + const allowAutoplay = Boolean( + conf().ALLOW_AUTOPLAY || + extensionActive || + useAuthStore.getState().proxySet, + ); const options = appLanguageOptions .sort((a, b) => sorted.indexOf(a.code) - sorted.indexOf(b.code)) @@ -90,18 +97,18 @@ export function PreferencesPart(props: {

- extensionActive + allowAutoplay ? props.setEnableAutoplay(!props.enableAutoplay) : null } className="bg-dropdown-background hover:bg-dropdown-hoverBackground select-none my-4 cursor-pointer space-x-3 flex items-center max-w-[25rem] py-3 px-4 rounded-lg" style={{ - pointerEvents: extensionActive ? "auto" : "none", - opacity: extensionActive ? 1 : 0.5, - cursor: extensionActive ? "pointer" : "not-allowed", + pointerEvents: allowAutoplay ? "auto" : "none", + opacity: allowAutoplay ? 1 : 0.5, + cursor: allowAutoplay ? "pointer" : "not-allowed", }} > - +

{t("settings.preferences.autoplayLabel")}

diff --git a/src/setup/config.ts b/src/setup/config.ts index a71b997c..751540e3 100644 --- a/src/setup/config.ts +++ b/src/setup/config.ts @@ -23,6 +23,7 @@ interface Config { ONBOARDING_CHROME_EXTENSION_INSTALL_LINK: string; ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK: string; ONBOARDING_PROXY_INSTALL_LINK: string; + ALLOW_AUTOPLAY: boolean; } export interface RuntimeConfig { @@ -39,6 +40,7 @@ export interface RuntimeConfig { TURNSTILE_KEY: string | null; CDN_REPLACEMENTS: Array; HAS_ONBOARDING: boolean; + ALLOW_AUTOPLAY: boolean; ONBOARDING_CHROME_EXTENSION_INSTALL_LINK: string | null; ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK: string | null; ONBOARDING_PROXY_INSTALL_LINK: string | null; @@ -64,6 +66,7 @@ const env: Record = { TURNSTILE_KEY: import.meta.env.VITE_TURNSTILE_KEY, CDN_REPLACEMENTS: import.meta.env.VITE_CDN_REPLACEMENTS, HAS_ONBOARDING: import.meta.env.VITE_HAS_ONBOARDING, + ALLOW_AUTOPLAY: import.meta.env.VITE_ALLOW_AUTOPLAY, }; function coerceUndefined(value: string | null | undefined): string | undefined { @@ -109,6 +112,7 @@ export function conf(): RuntimeConfig { .filter((v) => v.length > 0), NORMAL_ROUTER: getKey("NORMAL_ROUTER", "false") === "true", HAS_ONBOARDING: getKey("HAS_ONBOARDING", "true") === "true", + ALLOW_AUTOPLAY: getKey("ALLOW_AUTOPLAY", "false") === "true", TURNSTILE_KEY: getKey("TURNSTILE_KEY"), DISALLOWED_IDS: getKey("DISALLOWED_IDS", "") .split(",") From 84bddd2e4d76dc3bf61055492ab3960cfd2b6c78 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Mon, 1 Apr 2024 00:31:40 +0200 Subject: [PATCH 063/101] bump versions --- package.json | 4 ++-- pnpm-lock.yaml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 945ef93a..55e2714e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "movie-web", - "version": "4.6.4", + "version": "4.6.5", "private": true, "homepage": "https://github.com/movie-web/movie-web", "scripts": { @@ -29,7 +29,7 @@ "@formkit/auto-animate": "^0.8.1", "@headlessui/react": "^1.7.17", "@ladjs/country-language": "^1.0.3", - "@movie-web/providers": "^2.2.6", + "@movie-web/providers": "^2.2.7", "@noble/hashes": "^1.3.3", "@plasmohq/messaging": "^0.6.1", "@react-spring/web": "^9.7.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a762277b..bf20eab0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,8 +22,8 @@ dependencies: specifier: ^1.0.3 version: 1.0.3 '@movie-web/providers': - specifier: ^2.2.6 - version: 2.2.6 + specifier: ^2.2.7 + version: 2.2.7 '@noble/hashes': specifier: ^1.3.3 version: 1.3.3 @@ -1942,8 +1942,8 @@ packages: engines: {node: '>= 14'} dev: false - /@movie-web/providers@2.2.6: - resolution: {integrity: sha512-wBsg4oa1HoPal498oGfBr9pJbFO7bPr73WXGfbTdhuFfCTYxF0mK91DORr4CfxMxmNp19Bnt6FR6ss7mzsVGlA==} + /@movie-web/providers@2.2.7: + resolution: {integrity: sha512-XwU1IkXrF7e99JtC5Tna00/yuRECqEyBo8bhTtVE6ZFLYj3YQXVm2sdHjcyerjbyAsXvKGeikWEkrvHofTUjDA==} requiresBuild: true dependencies: cheerio: 1.0.0-rc.12 From f0df8c3efbf426ead2f34d6ca083be400d50d2d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 17:55:25 +0000 Subject: [PATCH 064/101] Bump vite from 5.0.12 to 5.0.13 Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.12 to 5.0.13. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.0.13/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.0.13/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 92 +++++++++++++++++++++++++------------------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/package.json b/package.json index 55e2714e..178a0055 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "tailwindcss-themer": "^4.0.0", "type-fest": "^4.8.3", "typescript": "^5.3.3", - "vite": "^5.0.12", + "vite": "^5.0.13", "vite-plugin-checker": "^0.6.2", "vite-plugin-package-version": "^1.1.0", "vite-plugin-pwa": "^0.17.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf20eab0..21f909f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -214,7 +214,7 @@ devDependencies: version: 6.15.0(eslint@8.56.0)(typescript@5.3.3) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.2.1(vite@5.0.12) + version: 4.2.1(vite@5.0.13) autoprefixer: specifier: ^10.4.16 version: 10.4.16(postcss@8.4.32) @@ -274,7 +274,7 @@ devDependencies: version: 0.5.9(prettier@3.1.1) rollup-plugin-visualizer: specifier: ^5.11.0 - version: 5.11.0(@rollup/wasm-node@4.13.2) + version: 5.11.0(@rollup/wasm-node@4.14.0) tailwind-scrollbar: specifier: ^3.0.5 version: 3.0.5(tailwindcss@3.4.0) @@ -291,20 +291,20 @@ devDependencies: specifier: ^5.3.3 version: 5.3.3 vite: - specifier: ^5.0.12 - version: 5.0.12(@types/node@20.10.5) + specifier: ^5.0.13 + version: 5.0.13(@types/node@20.10.5) vite-plugin-checker: specifier: ^0.6.2 - version: 0.6.2(eslint@8.56.0)(typescript@5.3.3)(vite@5.0.12) + version: 0.6.2(eslint@8.56.0)(typescript@5.3.3)(vite@5.0.13) vite-plugin-package-version: specifier: ^1.1.0 - version: 1.1.0(vite@5.0.12) + version: 1.1.0(vite@5.0.13) vite-plugin-pwa: specifier: ^0.17.4 - version: 0.17.4(vite@5.0.12)(workbox-build@7.0.0)(workbox-window@7.0.0) + version: 0.17.4(vite@5.0.13)(workbox-build@7.0.0)(workbox-window@7.0.0) vite-plugin-static-copy: specifier: ^1.0.0 - version: 1.0.0(vite@5.0.12) + version: 1.0.0(vite@5.0.13) vitest: specifier: ^1.1.0 version: 1.1.0(@types/node@20.10.5)(jsdom@23.0.1) @@ -2067,7 +2067,7 @@ packages: engines: {node: '>=14.0.0'} dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.13.2): + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.14.0): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2080,36 +2080,36 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-module-imports': 7.22.15 - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.13.2) - rollup: /@rollup/wasm-node@4.13.2 + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.0) + rollup: /@rollup/wasm-node@4.14.0 dev: true - /@rollup/plugin-node-resolve@11.2.1(@rollup/wasm-node@4.13.2): + /@rollup/plugin-node-resolve@11.2.1(@rollup/wasm-node@4.14.0): resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.13.2) + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.0) '@types/resolve': 1.17.1 builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.4 - rollup: /@rollup/wasm-node@4.13.2 + rollup: /@rollup/wasm-node@4.14.0 dev: true - /@rollup/plugin-replace@2.4.2(@rollup/wasm-node@4.13.2): + /@rollup/plugin-replace@2.4.2(@rollup/wasm-node@4.14.0): resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.13.2) + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.0) magic-string: 0.25.9 - rollup: /@rollup/wasm-node@4.13.2 + rollup: /@rollup/wasm-node@4.14.0 dev: true - /@rollup/pluginutils@3.1.0(@rollup/wasm-node@4.13.2): + /@rollup/pluginutils@3.1.0(@rollup/wasm-node@4.14.0): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2118,11 +2118,11 @@ packages: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: /@rollup/wasm-node@4.13.2 + rollup: /@rollup/wasm-node@4.14.0 dev: true - /@rollup/wasm-node@4.13.2: - resolution: {integrity: sha512-4JXYomW63fBnXseG2mFkZwaNMDK0PkNamj9WD6H96FqEEl9ov3VjG3MK9UcOAj7Ap9o2weqSSCVng+QsxBeKfw==} + /@rollup/wasm-node@4.14.0: + resolution: {integrity: sha512-efST/LGEoabKrDzCgA26GJFSJ6B7y9qA6DY1lGUDamfObWtEjrsybaD0CoUZetpHaSFf/rv4ulYg80iWLyYrcQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: @@ -2502,7 +2502,7 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-react@4.2.1(vite@5.0.12): + /@vitejs/plugin-react@4.2.1(vite@5.0.13): resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -2513,7 +2513,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.6) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.0.12(@types/node@20.10.5) + vite: 5.0.13(@types/node@20.10.5) transitivePeerDependencies: - supports-color dev: true @@ -5131,7 +5131,7 @@ packages: '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) '@babel/types': 7.23.6 kleur: 4.1.5 - rollup: /@rollup/wasm-node@4.13.2 + rollup: /@rollup/wasm-node@4.14.0 unplugin: 1.5.1 transitivePeerDependencies: - supports-color @@ -6061,7 +6061,7 @@ packages: glob: 7.2.3 dev: true - /rollup-plugin-terser@7.0.2(@rollup/wasm-node@4.13.2): + /rollup-plugin-terser@7.0.2(@rollup/wasm-node@4.14.0): resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser peerDependencies: @@ -6069,12 +6069,12 @@ packages: dependencies: '@babel/code-frame': 7.23.5 jest-worker: 26.6.2 - rollup: /@rollup/wasm-node@4.13.2 + rollup: /@rollup/wasm-node@4.14.0 serialize-javascript: 4.0.0 terser: 5.19.3 dev: true - /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.13.2): + /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.14.0): resolution: {integrity: sha512-exM0Ms2SN3AgTzMeW7y46neZQcyLY7eKwWAop1ZoRTCZwyrIRdMMJ6JjToAJbML77X/9N8ZEpmXG4Z/Clb9k8g==} engines: {node: '>=14'} hasBin: true @@ -6086,7 +6086,7 @@ packages: dependencies: open: 8.4.2 picomatch: 2.3.1 - rollup: /@rollup/wasm-node@4.13.2 + rollup: /@rollup/wasm-node@4.14.0 source-map: 0.7.4 yargs: 17.7.2 dev: true @@ -6933,7 +6933,7 @@ packages: debug: 4.3.4 pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.0.12(@types/node@20.10.5) + vite: 5.0.13(@types/node@20.10.5) transitivePeerDependencies: - '@types/node' - less @@ -6945,7 +6945,7 @@ packages: - terser dev: true - /vite-plugin-checker@0.6.2(eslint@8.56.0)(typescript@5.3.3)(vite@5.0.12): + /vite-plugin-checker@0.6.2(eslint@8.56.0)(typescript@5.3.3)(vite@5.0.13): resolution: {integrity: sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==} engines: {node: '>=14.16'} peerDependencies: @@ -6991,22 +6991,22 @@ packages: strip-ansi: 6.0.1 tiny-invariant: 1.3.1 typescript: 5.3.3 - vite: 5.0.12(@types/node@20.10.5) + vite: 5.0.13(@types/node@20.10.5) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.8 vscode-uri: 3.0.7 dev: true - /vite-plugin-package-version@1.1.0(vite@5.0.12): + /vite-plugin-package-version@1.1.0(vite@5.0.13): resolution: {integrity: sha512-TPoFZXNanzcaKCIrC3e2L/TVRkkRLB6l4RPN/S7KbG7rWfyLcCEGsnXvxn6qR7fyZwXalnnSN/I9d6pSFjHpEA==} peerDependencies: vite: '>=2.0.0-beta.69' dependencies: - vite: 5.0.12(@types/node@20.10.5) + vite: 5.0.13(@types/node@20.10.5) dev: true - /vite-plugin-pwa@0.17.4(vite@5.0.12)(workbox-build@7.0.0)(workbox-window@7.0.0): + /vite-plugin-pwa@0.17.4(vite@5.0.13)(workbox-build@7.0.0)(workbox-window@7.0.0): resolution: {integrity: sha512-j9iiyinFOYyof4Zk3Q+DtmYyDVBDAi6PuMGNGq6uGI0pw7E+LNm9e+nQ2ep9obMP/kjdWwzilqUrlfVRj9OobA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -7017,14 +7017,14 @@ packages: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.0.12(@types/node@20.10.5) + vite: 5.0.13(@types/node@20.10.5) workbox-build: 7.0.0 workbox-window: 7.0.0 transitivePeerDependencies: - supports-color dev: true - /vite-plugin-static-copy@1.0.0(vite@5.0.12): + /vite-plugin-static-copy@1.0.0(vite@5.0.13): resolution: {integrity: sha512-kMlrB3WDtC5GzFedNIPkpjnOAr8M11PfWOiUaONrUZ3AqogTsOmIhTt6w7Fh311wl8pN81ld7sfuOEogFJ9N8A==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: @@ -7034,11 +7034,11 @@ packages: fast-glob: 3.3.1 fs-extra: 11.1.1 picocolors: 1.0.0 - vite: 5.0.12(@types/node@20.10.5) + vite: 5.0.13(@types/node@20.10.5) dev: true - /vite@5.0.12(@types/node@20.10.5): - resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} + /vite@5.0.13(@types/node@20.10.5): + resolution: {integrity: sha512-/9ovhv2M2dGTuA+dY93B9trfyWMDRQw2jdVBhHNP6wr0oF34wG2i/N55801iZIpgUpnHDm4F/FabGQLyc+eOgg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7068,7 +7068,7 @@ packages: '@types/node': 20.10.5 esbuild: 0.19.10 postcss: 8.4.32 - rollup: /@rollup/wasm-node@4.13.2 + rollup: /@rollup/wasm-node@4.14.0 optionalDependencies: fsevents: 2.3.3 dev: true @@ -7118,7 +7118,7 @@ packages: strip-literal: 1.3.0 tinybench: 2.5.1 tinypool: 0.8.1 - vite: 5.0.12(@types/node@20.10.5) + vite: 5.0.13(@types/node@20.10.5) vite-node: 1.1.0(@types/node@20.10.5) why-is-node-running: 2.2.2 transitivePeerDependencies: @@ -7324,9 +7324,9 @@ packages: '@babel/core': 7.23.6 '@babel/preset-env': 7.23.6(@babel/core@7.23.6) '@babel/runtime': 7.23.6 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.13.2) - '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.13.2) - '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.13.2) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.14.0) + '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.14.0) + '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.14.0) '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.12.0 common-tags: 1.8.2 @@ -7335,8 +7335,8 @@ packages: glob: 7.2.3 lodash: 4.17.21 pretty-bytes: 5.6.0 - rollup: /@rollup/wasm-node@4.13.2 - rollup-plugin-terser: 7.0.2(@rollup/wasm-node@4.13.2) + rollup: /@rollup/wasm-node@4.14.0 + rollup-plugin-terser: 7.0.2(@rollup/wasm-node@4.14.0) source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 From 855e594c0924bd72212f3d0535754b3b9b7f3f11 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Fri, 5 Apr 2024 19:16:46 +0200 Subject: [PATCH 065/101] Fix switching from hls source to hls source --- src/components/player/display/base.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/player/display/base.ts b/src/components/player/display/base.ts index 8322b82b..b1eb616f 100644 --- a/src/components/player/display/base.ts +++ b/src/components/player/display/base.ts @@ -83,7 +83,8 @@ export function makeVideoElementDisplayInterface(): DisplayInterface { function reportAudioTracks() { if (!hls) return; - const currentTrack = hls.audioTracks[hls.audioTrack]; + const currentTrack = hls.audioTracks?.[hls.audioTrack ?? 0]; + if (!currentTrack) return; emit("changedaudiotrack", { id: currentTrack.id.toString(), label: currentTrack.name, @@ -129,6 +130,7 @@ export function makeVideoElementDisplayInterface(): DisplayInterface { } function setupSource(vid: HTMLVideoElement, src: LoadableSource) { + hls = null; if (src.type === "hls") { if (canPlayHlsNatively(vid)) { vid.src = processCdnLink(src.url); From f046728434f7e2d482fea8dce1aabd97658fa986 Mon Sep 17 00:00:00 2001 From: Raymond Nee Date: Sun, 31 Mar 2024 19:23:13 +0000 Subject: [PATCH 066/101] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (336 of 336 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 | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/zh.json b/src/assets/locales/zh.json index d7b66e1a..fafe4590 100644 --- a/src/assets/locales/zh.json +++ b/src/assets/locales/zh.json @@ -155,7 +155,8 @@ "types": { "movie": "电影", "show": "电视节目" - } + }, + "unreleased": "未发布" }, "navigation": { "banner": { @@ -294,6 +295,7 @@ "title": "质量" }, "settings": { + "audioItem": "音频", "downloadItem": "下载", "enableSubtitles": "启用字幕", "experienceSection": "观看体验", @@ -320,8 +322,9 @@ "unknownOption": "未知" }, "subtitles": { - "customChoice": "从文件选取字幕", + "customChoice": "拖入或上传文件", "customizeLabel": "自定义", + "dropSubtitleFile": "将字幕拖入这里", "offChoice": "关闭", "settings": { "backlink": "自定义字幕", @@ -379,6 +382,13 @@ "title": "视频播放失败!" }, "scraping": { + "extensionFailure": { + "badge": "扩展程序已禁用", + "enableExtension": "启用扩展程序", + "homeButton": "返回首页", + "text": "您已经安装 movie-web 扩展程序。要开始使用,您需要为此站点启用扩展。", + "title": "请启用扩展程序" + }, "items": { "failure": "发生了错误", "notFound": "没有视频", From 01687da4df7d9e8230b8f22bcb3e4e0bf2869dbd Mon Sep 17 00:00:00 2001 From: superlincoln Date: Tue, 2 Apr 2024 06:56:46 +0000 Subject: [PATCH 067/101] Translated using Weblate (German) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/de/ Author: superlincoln --- src/assets/locales/de.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/de.json b/src/assets/locales/de.json index 210b5970..a7e52e54 100644 --- a/src/assets/locales/de.json +++ b/src/assets/locales/de.json @@ -155,7 +155,8 @@ "types": { "movie": "Film", "show": "Serie" - } + }, + "unreleased": "Unveröffentlicht" }, "navigation": { "banner": { From b8fec30d29e46aa1a64687a60c3e1bc98060ab09 Mon Sep 17 00:00:00 2001 From: superlincoln Date: Tue, 2 Apr 2024 06:55:50 +0000 Subject: [PATCH 068/101] Translated using Weblate (Dutch) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/nl/ Author: superlincoln --- src/assets/locales/nl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/nl.json b/src/assets/locales/nl.json index 6f58ffc6..8260f0d1 100644 --- a/src/assets/locales/nl.json +++ b/src/assets/locales/nl.json @@ -155,7 +155,8 @@ "types": { "movie": "Film", "show": "Serie" - } + }, + "unreleased": "Niet uitgebracht" }, "navigation": { "banner": { From 377f6740b516200ce74e33292a79305ab959f3da Mon Sep 17 00:00:00 2001 From: superlincoln Date: Tue, 2 Apr 2024 07:12:40 +0000 Subject: [PATCH 069/101] Translated using Weblate (Korean) Currently translated at 100.0% (328 of 328 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ko/ Author: superlincoln --- src/assets/locales/ko.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/ko.json b/src/assets/locales/ko.json index 16d7fb9a..1f7c8015 100644 --- a/src/assets/locales/ko.json +++ b/src/assets/locales/ko.json @@ -122,7 +122,7 @@ "default": "무엇을 보고 싶으신가요?", "extra": [ "무엇을 탐험하고 싶으신가요?", - null, + "관심 목록에 무엇이 있나요?", "당신이 가장 좋아하는 영화는?", "당신이 가장 좋아하는 시리즈는?" ] @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "배경 흐림", "backgroundLabel": "배경 투명도", "colorLabel": "색상", "previewQuote": "두려워해서는 안 됩니다. 두려움은 마음을 죽이는 존재입니다.", From 0077a5ace7b6257db99d122ec59eb9178bb28beb Mon Sep 17 00:00:00 2001 From: superlincoln Date: Tue, 2 Apr 2024 06:28:40 +0000 Subject: [PATCH 070/101] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/zh_Hant/ Author: superlincoln --- src/assets/locales/zh-Hant.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/zh-Hant.json b/src/assets/locales/zh-Hant.json index 3680258f..ce4e410a 100644 --- a/src/assets/locales/zh-Hant.json +++ b/src/assets/locales/zh-Hant.json @@ -155,7 +155,8 @@ "types": { "movie": "電影", "show": "節目" - } + }, + "unreleased": "尚未上映" }, "navigation": { "banner": { @@ -294,6 +295,7 @@ "title": "品質" }, "settings": { + "audioItem": "音頻", "downloadItem": "下載", "enableSubtitles": "啟用字幕", "experienceSection": "觀看體驗", @@ -320,8 +322,9 @@ "unknownOption": "未知" }, "subtitles": { - "customChoice": "從檔案中選擇字幕", + "customChoice": "把字幕檔案拖入或上傳", "customizeLabel": "自訂", + "dropSubtitleFile": "將字幕檔案拖曳到這裡", "offChoice": "關閉", "settings": { "backlink": "自訂字幕", @@ -379,6 +382,13 @@ "title": "無法播放視頻!" }, "scraping": { + "extensionFailure": { + "badge": "擴充功能已被禁用", + "enableExtension": "啟用擴充功能", + "homeButton": "回到首頁", + "text": "您已安裝該擴充功能, 你要啟用擴充程式去用它。", + "title": "請啟用擴充功能" + }, "items": { "failure": "發生錯誤", "notFound": "沒有視頻", From 38d32b294ea4cc0e9ad8092a383df4b76f8503e5 Mon Sep 17 00:00:00 2001 From: Mehdi Date: Tue, 2 Apr 2024 18:53:05 +0000 Subject: [PATCH 071/101] Translated using Weblate (Persian) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/fa/ Author: Mehdi --- src/assets/locales/fa.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/fa.json b/src/assets/locales/fa.json index 01c46a84..50e9b2d6 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -467,7 +467,7 @@ }, "register": { "cta": "شروع کنید", - "text": "پیشرفت تماشای خود را بین دستگاه‌ها به اشتراک بگذارید و آنها را با یکدیگر همگام سازی کنید.", + "text": "جریان تماشای خود را بین دستگاه‌ها به اشتراک بگذارید و آنها را با یکدیگر همگام سازی کنید.", "title": "همگام سازی" }, "title": "حساب کاربری" @@ -487,7 +487,7 @@ "server": { "description": "اگر میخواید به یک بک-اند سفارشی برای ذخیره داده متصل شوید، با فعال و ارائه استفاده این لینک ادامه دهید. <0>دستورالعمل ها.", "label": "سرور سفارشی", - "urlLabel": "لینک سرور سفارشی" + "urlLabel": "لینک سرور کاستوم" }, "setup": { "doSetup": "راه اندازی کنید", From ae4adddee6dd15ed73492fec940206c6c80ce1a7 Mon Sep 17 00:00:00 2001 From: Aayush Shah Date: Wed, 3 Apr 2024 06:33:42 +0000 Subject: [PATCH 072/101] Translated using Weblate (Nepali) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/ne/ Author: Aayush Shah --- src/assets/locales/ne.json | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/ne.json b/src/assets/locales/ne.json index 9250fbc9..519af811 100644 --- a/src/assets/locales/ne.json +++ b/src/assets/locales/ne.json @@ -155,7 +155,8 @@ "types": { "movie": "चलचित्र", "show": "कार्यक्रम" - } + }, + "unreleased": "रिलीज नभएको" }, "navigation": { "banner": { @@ -294,6 +295,7 @@ "title": "क्वालिटी" }, "settings": { + "audioItem": "आवाज", "downloadItem": "डाउनलोड", "enableSubtitles": "उपशीर्षकहरू सक्षम गर्नुहोस्", "experienceSection": "हेर्ने अनुभव", @@ -320,8 +322,9 @@ "unknownOption": "अज्ञात" }, "subtitles": { - "customChoice": "फाइलबाट उपशीर्षक चयन गर्नुहोस्", + "customChoice": "ड्रप वा फाइल अपलोड गर्नुहोस्", "customizeLabel": "अनुकूलन गर्नुहोस्", + "dropSubtitleFile": "सबटाइटल फाइल यहाँ छोड्नुहोस्", "offChoice": "बन्द", "settings": { "backlink": "अनुकूलन उपशीर्षकहरू", @@ -379,6 +382,13 @@ "title": "भिडियो प्ले गर्न असफल भयो!" }, "scraping": { + "extensionFailure": { + "badge": "एक्स्टेन्सन बन्द छ", + "enableExtension": "एक्स्टेन्सन सक्षम गर्नुहोस्", + "homeButton": "होम् जाउँ", + "text": "तपाईंले चलचित्र-वेब एक्स्टेन्सन स्थापना गर्नुभएको छ। यसलाई प्रयोग गर्न सुरु गर्न, तपाईंले यो साइटको लागिएक्स्टेन्सन सक्षम गर्न आवश्यक छ।", + "title": "कृपया एक्स्टेन्सन सक्षम गर्नुहोस्" + }, "items": { "failure": "त्रुटि भयो", "notFound": "भिडियो छैन", @@ -536,6 +546,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "पृष्ठभूमि धमिलो", "backgroundLabel": "पृष्ठभूमि अस्पष्टता", "colorLabel": "रङ", "previewQuote": "म डराउनु हुँदैन। डर दिमागको हत्यारा हो।", From 53de238bd3155a2d0faf926c9f0f7baeeafe614f Mon Sep 17 00:00:00 2001 From: Aayush Shah Date: Wed, 3 Apr 2024 06:42:48 +0000 Subject: [PATCH 073/101] Translated using Weblate (Hindi) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/hi/ Author: Aayush Shah --- src/assets/locales/hi.json | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/assets/locales/hi.json b/src/assets/locales/hi.json index eab0a337..1b5c4a2d 100644 --- a/src/assets/locales/hi.json +++ b/src/assets/locales/hi.json @@ -155,7 +155,8 @@ "types": { "movie": "मूवी", "show": "शृंखला" - } + }, + "unreleased": "रिलीज़ नहीं हुवा" }, "navigation": { "banner": { @@ -172,7 +173,7 @@ }, "notFound": { "badge": "नहीं मिला", - "goHome": "घर वापिस जा रहा हूँ", + "goHome": "घर वापिस जाइये", "message": "हमने हर जगह देखा: डिब्बे के नीचे, कोठरी में, प्रॉक्सी के पीछे लेकिन अंततः वह पेज नहीं मिला जिसे आप ढूंढ रहे थे।", "title": "वह पृष्ठ नहीं मिल सका" }, @@ -294,6 +295,7 @@ "title": "गुणवत्ता" }, "settings": { + "audioItem": "ऑडियो", "downloadItem": "डाउनलोड", "enableSubtitles": "उपशीर्षक सक्षम करें", "experienceSection": "देखने का अनुभव", @@ -320,8 +322,9 @@ "unknownOption": "अज्ञात" }, "subtitles": { - "customChoice": "फ़ाइल से उपशीर्षक चुनें", + "customChoice": "फ़ाइल ड्रॉप या अपलोड करें", "customizeLabel": "अनुकूलित करें", + "dropSubtitleFile": "उपशीर्षक फ़ाइल यहां छोड़ें", "offChoice": "बंद", "settings": { "backlink": "कस्टम उपशीर्षक", @@ -379,6 +382,13 @@ "title": "वीडियो चलाने में विफल!" }, "scraping": { + "extensionFailure": { + "badge": "एक्सटेंशन बन्द हें", + "enableExtension": "एक्सटेंशन सक्षम करें", + "homeButton": "घर जाओ", + "text": "आपने मूवी-वेब एक्सटेंशन इंस्टॉल कर लिया है. इसका उपयोग शुरू करने के लिए, आपको इस साइट के लिए एक्सटेंशन सक्षम करना होगा।", + "title": "कृपया एक्सटेंशनको सक्षम करें" + }, "items": { "failure": "त्रुटि हुई", "notFound": "वीडियो नहीं है", @@ -536,6 +546,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "पृष्ठभूमि धुंधला", "backgroundLabel": "पृष्ठभूमि अस्पष्टता", "colorLabel": "रंग", "previewQuote": "मुझे डरना नहीं चाहिए. डर मन हत्यारा है।", From d014bcee55954d13a8d05ef79789dbe6f6d16b7a Mon Sep 17 00:00:00 2001 From: Matic Boncina <476328473@express.ninja> Date: Fri, 5 Apr 2024 07:03:52 +0000 Subject: [PATCH 074/101] Translated using Weblate (Slovenian) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/sl/ Author: Matic Boncina <476328473@express.ninja> --- src/assets/locales/sl.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/sl.json b/src/assets/locales/sl.json index 958b2ba7..09dd8dcb 100644 --- a/src/assets/locales/sl.json +++ b/src/assets/locales/sl.json @@ -155,7 +155,8 @@ "types": { "movie": "Film", "show": "Serija" - } + }, + "unreleased": "Neizdano" }, "navigation": { "banner": { @@ -294,6 +295,7 @@ "title": "Kvaliteta" }, "settings": { + "audioItem": "Zvok", "downloadItem": "Prenesi", "enableSubtitles": "Vklopi podnapise", "experienceSection": "Izkušnje ogleda", @@ -320,8 +322,9 @@ "unknownOption": "Neznano" }, "subtitles": { - "customChoice": "Izberi podnapise iz datoteke", + "customChoice": "Povleci in naloži datoteko", "customizeLabel": "Prilagodi", + "dropSubtitleFile": "Povleci datoteko s podnapisi tukaj", "offChoice": "Off", "settings": { "backlink": "Podnapisi po meri", @@ -379,6 +382,13 @@ "title": "Ni uspelo predvajati videoposnetka!" }, "scraping": { + "extensionFailure": { + "badge": "Razširitev brskalnika je onemogočena", + "enableExtension": "Vklopi razširitev brskalnika", + "homeButton": "Pojdi domov", + "text": "Namestili ste razširitev movie-web. Če jo želite začeti uporabljati, morate razširitev omogočiti za to spletno mesto.", + "title": "Prosim vklopite razširitev brskalnika" + }, "items": { "failure": "Zgodila se je napaka", "notFound": "Nima videoposnetka", From c0edae8a36e34d339355ccd2fb5429de9020cbad Mon Sep 17 00:00:00 2001 From: Jorrin Date: Fri, 5 Apr 2024 20:10:41 +0200 Subject: [PATCH 075/101] bump versions --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 178a0055..d70f0143 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "movie-web", - "version": "4.6.5", + "version": "4.6.6", "private": true, "homepage": "https://github.com/movie-web/movie-web", "scripts": { @@ -29,7 +29,7 @@ "@formkit/auto-animate": "^0.8.1", "@headlessui/react": "^1.7.17", "@ladjs/country-language": "^1.0.3", - "@movie-web/providers": "^2.2.7", + "@movie-web/providers": "^2.2.9", "@noble/hashes": "^1.3.3", "@plasmohq/messaging": "^0.6.1", "@react-spring/web": "^9.7.3", From bd9db1dc80b7a0d6a5e2a7fd67700d1abe0b6dbe Mon Sep 17 00:00:00 2001 From: Jorrin Date: Fri, 5 Apr 2024 20:12:39 +0200 Subject: [PATCH 076/101] Update pnpm-lock.yaml --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21f909f3..e3e47434 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,8 +22,8 @@ dependencies: specifier: ^1.0.3 version: 1.0.3 '@movie-web/providers': - specifier: ^2.2.7 - version: 2.2.7 + specifier: ^2.2.9 + version: 2.2.9 '@noble/hashes': specifier: ^1.3.3 version: 1.3.3 @@ -1942,8 +1942,8 @@ packages: engines: {node: '>= 14'} dev: false - /@movie-web/providers@2.2.7: - resolution: {integrity: sha512-XwU1IkXrF7e99JtC5Tna00/yuRECqEyBo8bhTtVE6ZFLYj3YQXVm2sdHjcyerjbyAsXvKGeikWEkrvHofTUjDA==} + /@movie-web/providers@2.2.9: + resolution: {integrity: sha512-NHsyplM9Oe4DK3lIkNaEk0CqoQ6IqlaWXeDh01jj+DH4I4EJjSD4ow7OTeAC+BLz3Gwj6fh/vaE2WBGevPTDkQ==} requiresBuild: true dependencies: cheerio: 1.0.0-rc.12 From 9d4be2cb55193e217c451226a1fad5f4e1ed82bb Mon Sep 17 00:00:00 2001 From: Jorrin Date: Mon, 8 Apr 2024 16:32:33 +0200 Subject: [PATCH 077/101] Select default audio language based on setting --- src/components/player/display/base.ts | 9 ++++++++- src/stores/player/slices/source.ts | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/player/display/base.ts b/src/components/player/display/base.ts index b1eb616f..ebaa12da 100644 --- a/src/components/player/display/base.ts +++ b/src/components/player/display/base.ts @@ -12,6 +12,7 @@ import { } from "@/components/player/display/displayInterface"; import { handleBuffered } from "@/components/player/utils/handleBuffered"; import { getMediaErrorDetails } from "@/components/player/utils/mediaErrorDetails"; +import { useLanguageStore } from "@/stores/language"; import { LoadableSource, SourceQuality, @@ -83,7 +84,13 @@ export function makeVideoElementDisplayInterface(): DisplayInterface { function reportAudioTracks() { if (!hls) return; - const currentTrack = hls.audioTracks?.[hls.audioTrack ?? 0]; + const currentLanguage = useLanguageStore.getState().language; + const audioTracks = hls.audioTracks; + const languageTrack = audioTracks.find((v) => v.lang === currentLanguage); + if (languageTrack) { + hls.audioTrack = audioTracks.indexOf(languageTrack); + } + const currentTrack = audioTracks?.[hls.audioTrack ?? 0]; if (!currentTrack) return; emit("changedaudiotrack", { id: currentTrack.id.toString(), diff --git a/src/stores/player/slices/source.ts b/src/stores/player/slices/source.ts index eb2ce9e1..5cbfc6db 100644 --- a/src/stores/player/slices/source.ts +++ b/src/stores/player/slices/source.ts @@ -169,6 +169,8 @@ export const createSourceSlice: MakeSlice = (set, get) => ({ s.captionList = captions; s.interface.error = undefined; s.status = playerStatus.PLAYING; + s.audioTracks = []; + s.currentAudioTrack = null; }); const store = get(); store.redisplaySource(startAt); From 2722a7db96e8da69d7a5dd8ae42173986ac87b60 Mon Sep 17 00:00:00 2001 From: Vijay <74645268+vijaysingh2219@users.noreply.github.com> Date: Wed, 10 Apr 2024 21:24:29 +0530 Subject: [PATCH 078/101] Fix keyboard event handling in KeyboardEvents component - Changed the condition from 'k' to 'keyL' for 'j', 'l', 'm', 'f', 'c', 'r' keys to handle uppercase keys properly. - Fixed the condition for toggling play/pause to work with both ' ' and 'k' keys. This commit addresses issues with keyboard event handling and ensures proper functionality with both uppercase and lowercase keys. --- .../player/internals/KeyboardEvents.tsx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/components/player/internals/KeyboardEvents.tsx b/src/components/player/internals/KeyboardEvents.tsx index 3a833e76..af2724c9 100644 --- a/src/components/player/internals/KeyboardEvents.tsx +++ b/src/components/player/internals/KeyboardEvents.tsx @@ -71,9 +71,10 @@ export function KeyboardEvents() { return; const k = evt.key; + const keyL = evt.key.toLowerCase(); // Volume - if (["ArrowUp", "ArrowDown", "m"].includes(k)) { + if (["ArrowUp", "ArrowDown", "m", "M"].includes(k)) { dataRef.current.setShowVolume(true); if (volumeDebounce.current) clearTimeout(volumeDebounce.current); @@ -89,7 +90,7 @@ export function KeyboardEvents() { dataRef.current.setVolume( (dataRef.current.mediaPlaying?.volume || 0) - 0.15, ); - if (k === "m") dataRef.current.toggleMute(); + if (keyL === "m") dataRef.current.toggleMute(); // Video playback speed if (k === ">" || k === "<") { @@ -106,9 +107,9 @@ export function KeyboardEvents() { dataRef.current.display?.setTime(dataRef.current.time + 5); if (k === "ArrowLeft") dataRef.current.display?.setTime(dataRef.current.time - 5); - if (k === "j") + if (keyL === "j") dataRef.current.display?.setTime(dataRef.current.time - 10); - if (k === "l") + if (keyL === "l") dataRef.current.display?.setTime(dataRef.current.time + 10); if (k === "." && dataRef.current.mediaPlaying?.isPaused) dataRef.current.display?.setTime(dataRef.current.time + 1); @@ -116,18 +117,18 @@ export function KeyboardEvents() { dataRef.current.display?.setTime(dataRef.current.time - 1); // Utils - if (k === "f") dataRef.current.display?.toggleFullscreen(); - if (k === " ") + if (keyL === "f") dataRef.current.display?.toggleFullscreen(); + if (k === " " || keyL === "k") dataRef.current.display?.[ dataRef.current.mediaPlaying.isPaused ? "play" : "pause" ](); if (k === "Escape") dataRef.current.router.close(); // captions - if (k === "c") dataRef.current.toggleLastUsed().catch(() => {}); // ignore errors + if (keyL === "c") dataRef.current.toggleLastUsed().catch(() => {}); // ignore errors // Do a barrell roll! - if (k === "r") { + if (keyL === "r") { if (dataRef.current.isRolling || evt.ctrlKey || evt.metaKey) return; dataRef.current.setIsRolling(true); From c8fa561c7f73682be58e5e7140f5d5ad4b753d87 Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Wed, 10 Apr 2024 20:25:45 +0300 Subject: [PATCH 079/101] fix: remove unnecessary lodash functions and use setInterval instead --- .eslintrc.js | 1 - package.json | 1 - .../player/atoms/NextEpisodeButton.tsx | 29 +++++++++---------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index f27e359d..e9b54595 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -103,7 +103,6 @@ module.exports = { allowSeparatedGroups: true } ], - "import/no-extraneous-dependencies": ["error", {"devDependencies": true}], ...a11yOff } }; diff --git a/package.json b/package.json index 22501a81..d70f0143 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,6 @@ "@types/crypto-js": "^4.2.1", "@types/dompurify": "^3.0.5", "@types/fscreen": "^1.0.4", - "@types/lodash": "^4.17.0", "@types/lodash.isequal": "^4.5.8", "@types/lodash.merge": "^4.6.9", "@types/lodash.throttle": "^4.1.9", diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index 60ba63eb..07d89068 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -1,5 +1,4 @@ import classNames from "classnames"; -import { debounce, throttle } from "lodash"; import { useCallback, useEffect } from "react"; import { useTranslation } from "react-i18next"; @@ -102,23 +101,23 @@ export function NextEpisodeButton(props: { ]); useEffect(() => { - if (!enableAutoplay || !meta || !nextEp || metaType !== "show") return; - const halfPercent = duration / 100; - const isEnding = time >= duration - halfPercent && duration !== 0; + if (!enableAutoplay || metaType !== "show") return; - const debouncedLoadNextEpisode = throttle(debounce(loadNextEpisode), 300); - const allowAutoplay = Boolean( - conf().ALLOW_AUTOPLAY || - isExtensionActiveCached() || - useAuthStore.getState().proxySet, - ); + const interval = setInterval(() => { + const onePercent = duration / 100; + const isEnding = time >= duration - onePercent && duration !== 0; - if (isEnding && allowAutoplay) debouncedLoadNextEpisode(); + const allowAutoplay = Boolean( + conf().ALLOW_AUTOPLAY || + isExtensionActiveCached() || + useAuthStore.getState().proxySet, + ); - return () => { - debouncedLoadNextEpisode.cancel(); - }; - }, [duration, enableAutoplay, loadNextEpisode, meta, metaType, nextEp, time]); + if (isEnding && allowAutoplay) loadNextEpisode(); + }, 250); + + return () => clearInterval(interval); + }, [duration, enableAutoplay, loadNextEpisode, metaType, time]); if (!meta?.episode || !nextEp) return null; if (metaType !== "show") return null; From 92afd6616691208d65d6a08db28c1486baf82de7 Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Wed, 10 Apr 2024 20:27:08 +0300 Subject: [PATCH 080/101] chore: update pnpm-lock.yaml --- pnpm-lock.yaml | 65 ++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ee32f44..d0740a26 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -167,9 +167,6 @@ devDependencies: '@types/fscreen': specifier: ^1.0.4 version: 1.0.4 - '@types/lodash': - specifier: ^4.17.0 - version: 4.17.0 '@types/lodash.isequal': specifier: ^4.5.8 version: 4.5.8 @@ -277,7 +274,7 @@ devDependencies: version: 0.5.9(prettier@3.1.1) rollup-plugin-visualizer: specifier: ^5.11.0 - version: 5.11.0(@rollup/wasm-node@4.14.0) + version: 5.11.0(@rollup/wasm-node@4.14.1) tailwind-scrollbar: specifier: ^3.0.5 version: 3.0.5(tailwindcss@3.4.0) @@ -3178,7 +3175,7 @@ packages: engines: {node: '>=14.0.0'} dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.14.0): + /@rollup/plugin-babel@5.3.1(@babel/core@7.24.3)(@rollup/wasm-node@4.14.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -3189,38 +3186,38 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-imports': 7.22.15 - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.0) - rollup: /@rollup/wasm-node@4.14.0 + '@babel/core': 7.24.3 + '@babel/helper-module-imports': 7.24.3 + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.1) + rollup: /@rollup/wasm-node@4.14.1 dev: true - /@rollup/plugin-node-resolve@11.2.1(@rollup/wasm-node@4.14.0): + /@rollup/plugin-node-resolve@11.2.1(@rollup/wasm-node@4.14.1): resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.0) + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.1) '@types/resolve': 1.17.1 builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.4 - rollup: /@rollup/wasm-node@4.14.0 + resolve: 1.22.8 + rollup: /@rollup/wasm-node@4.14.1 dev: true - /@rollup/plugin-replace@2.4.2(@rollup/wasm-node@4.14.0): + /@rollup/plugin-replace@2.4.2(@rollup/wasm-node@4.14.1): resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.0) + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.1) magic-string: 0.25.9 - rollup: /@rollup/wasm-node@4.14.0 + rollup: /@rollup/wasm-node@4.14.1 dev: true - /@rollup/pluginutils@3.1.0(@rollup/wasm-node@4.14.0): + /@rollup/pluginutils@3.1.0(@rollup/wasm-node@4.14.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -3229,11 +3226,11 @@ packages: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: /@rollup/wasm-node@4.14.0 + rollup: /@rollup/wasm-node@4.14.1 dev: true - /@rollup/wasm-node@4.14.0: - resolution: {integrity: sha512-efST/LGEoabKrDzCgA26GJFSJ6B7y9qA6DY1lGUDamfObWtEjrsybaD0CoUZetpHaSFf/rv4ulYg80iWLyYrcQ==} + /@rollup/wasm-node@4.14.1: + resolution: {integrity: sha512-w5GZ2p1F7tOop6WJxa5x0Ot1s6eVPKOlEo5hmWT3KGxv0naGqiGJa/fz7S/it06nzgS3fmkDbtDfpAYwqOMKRQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: @@ -6560,7 +6557,7 @@ packages: '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) '@babel/types': 7.23.6 kleur: 4.1.5 - rollup: /@rollup/wasm-node@4.14.0 + rollup: /@rollup/wasm-node@4.14.1 unplugin: 1.5.1 transitivePeerDependencies: - supports-color @@ -7532,7 +7529,7 @@ packages: glob: 7.2.3 dev: true - /rollup-plugin-terser@7.0.2(@rollup/wasm-node@4.14.0): + /rollup-plugin-terser@7.0.2(@rollup/wasm-node@4.14.1): resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser peerDependencies: @@ -7540,12 +7537,12 @@ packages: dependencies: '@babel/code-frame': 7.24.2 jest-worker: 26.6.2 - rollup: /@rollup/wasm-node@4.14.0 + rollup: /@rollup/wasm-node@4.14.1 serialize-javascript: 4.0.0 terser: 5.30.0 dev: true - /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.14.0): + /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.14.1): resolution: {integrity: sha512-exM0Ms2SN3AgTzMeW7y46neZQcyLY7eKwWAop1ZoRTCZwyrIRdMMJ6JjToAJbML77X/9N8ZEpmXG4Z/Clb9k8g==} engines: {node: '>=14'} hasBin: true @@ -7557,7 +7554,7 @@ packages: dependencies: open: 8.4.2 picomatch: 2.3.1 - rollup: /@rollup/wasm-node@4.14.0 + rollup: /@rollup/wasm-node@4.14.1 source-map: 0.7.4 yargs: 17.7.2 dev: true @@ -8695,7 +8692,7 @@ packages: '@types/node': 20.10.5 esbuild: 0.19.10 postcss: 8.4.32 - rollup: /@rollup/wasm-node@4.14.0 + rollup: /@rollup/wasm-node@4.14.1 optionalDependencies: fsevents: 2.3.3 dev: true @@ -8959,12 +8956,12 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) - '@babel/core': 7.23.6 - '@babel/preset-env': 7.23.6(@babel/core@7.23.6) - '@babel/runtime': 7.23.6 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.14.0) - '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.14.0) - '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.14.0) + '@babel/core': 7.24.3 + '@babel/preset-env': 7.24.3(@babel/core@7.24.3) + '@babel/runtime': 7.24.1 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.3)(@rollup/wasm-node@4.14.1) + '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.14.1) + '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.14.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.12.0 common-tags: 1.8.2 @@ -8973,8 +8970,8 @@ packages: glob: 7.2.3 lodash: 4.17.21 pretty-bytes: 5.6.0 - rollup: /@rollup/wasm-node@4.14.0 - rollup-plugin-terser: 7.0.2(@rollup/wasm-node@4.14.0) + rollup: /@rollup/wasm-node@4.14.1 + rollup-plugin-terser: 7.0.2(@rollup/wasm-node@4.14.1) source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 From 9044b4407fbb2c7ea1b32b40f41a2c5fae07196b Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Wed, 10 Apr 2024 20:37:36 +0300 Subject: [PATCH 081/101] chore: remove whitespace --- src/assets/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index 0ed81ef8..3a1cd0d0 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -524,7 +524,7 @@ "thumbnailDescription": "Most of the time, videos don't have thumbnails. You can enable this setting to generate them on the fly but they can make your video slower.", "thumbnailLabel": "Generate thumbnails", "autoplay": "Autoplay", - "autoplayDescription": "Automatically play the next episode in a series after reaching the end. Can be enabled by users with the browser extension, a custom proxy, or with the default setup if allowed by the host.", + "autoplayDescription": "Automatically play the next episode in a series after reaching the end. Can be enabled by users with the browser extension, a custom proxy, or with the default setup if allowed by the host.", "autoplayLabel": "Autoplay", "title": "Preferences" }, From 5275c56725f07f7f2d5b4e2628b942bca068b87d Mon Sep 17 00:00:00 2001 From: Vijay <74645268+vijaysingh2219@users.noreply.github.com> Date: Wed, 10 Apr 2024 22:26:18 +0530 Subject: [PATCH 082/101] Implement functionality to open URL in new tab on middle click Added handleClick function to check for middle mouse button (event.button === 1), opening the URL in a new tab using window.open. Improves user experience by offering an alternative method to open URLs without leaving the current page. --- src/components/player/base/BackLink.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/player/base/BackLink.tsx b/src/components/player/base/BackLink.tsx index a965751f..23bcb668 100644 --- a/src/components/player/base/BackLink.tsx +++ b/src/components/player/base/BackLink.tsx @@ -1,3 +1,4 @@ +import React from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; @@ -7,11 +8,23 @@ export function BackLink(props: { url: string }) { const { t } = useTranslation(); const navigate = useNavigate(); + const handleClick = (event: React.MouseEvent) => { + event.preventDefault(); + // Check if center mouse button is clicked + if (event.button === 1) { + // Open the URL in a new tab + window.open(props.url, "_blank"); + } else { + // Navigate normally for other clicks + navigate(props.url); + } + }; return (
+
); } From 8a9def00ded6382aa268b51252344a174255db09 Mon Sep 17 00:00:00 2001 From: Megh Rathod Date: Thu, 11 Apr 2024 23:34:40 +0530 Subject: [PATCH 084/101] fix: tmdb fetch failure due ISP blocks in India Signed-off-by: Megh Rathod --- src/backend/metadata/tmdb.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index 67c7d56f..2e11bf73 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -143,7 +143,7 @@ export function decodeTMDBId( }; } -const baseURL = "https://api.themoviedb.org/3"; +const baseURL = "https://api.tmdb.org/3"; const apiKey = conf().TMDB_READ_API_KEY; From e46ca235165859baf4ce0f80fc00c48db0eddf76 Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Fri, 12 Apr 2024 00:01:57 +0300 Subject: [PATCH 085/101] chore: clean up code and remove intervals --- .../player/atoms/NextEpisodeButton.tsx | 28 +++++--------- src/pages/parts/settings/PreferencesPart.tsx | 38 +++++-------------- src/utils/autoplay.ts | 11 ++++++ 3 files changed, 30 insertions(+), 47 deletions(-) create mode 100644 src/utils/autoplay.ts diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index 07d89068..75ef65b0 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -1,17 +1,15 @@ import classNames from "classnames"; -import { useCallback, useEffect } from "react"; +import { useCallback, useEffect, useRef } from "react"; import { useTranslation } from "react-i18next"; -import { isExtensionActiveCached } from "@/backend/extension/messaging"; import { Icon, Icons } from "@/components/Icon"; import { usePlayerMeta } from "@/components/player/hooks/usePlayerMeta"; import { Transition } from "@/components/utils/Transition"; -import { conf } from "@/setup/config"; -import { useAuthStore } from "@/stores/auth"; import { PlayerMeta } from "@/stores/player/slices/source"; import { usePlayerStore } from "@/stores/player/store"; import { usePreferencesStore } from "@/stores/preferences"; import { useProgressStore } from "@/stores/progress"; +import { isAutoplayAllowed } from "@/utils/autoplay"; function shouldShowNextEpisodeButton( time: number, @@ -64,6 +62,7 @@ export function NextEpisodeButton(props: { const enableAutoplay = usePreferencesStore((s) => s.enableAutoplay); let show = false; + const hasAutoplayed = useRef(false); if (showingState === "always") show = true; else if (showingState === "hover" && props.controlsShowing) show = true; if (isHidden || status !== "playing" || duration === 0) show = false; @@ -102,21 +101,14 @@ export function NextEpisodeButton(props: { useEffect(() => { if (!enableAutoplay || metaType !== "show") return; + const onePercent = duration / 100; + const isEnding = time >= duration - onePercent && duration !== 0; - const interval = setInterval(() => { - const onePercent = duration / 100; - const isEnding = time >= duration - onePercent && duration !== 0; - - const allowAutoplay = Boolean( - conf().ALLOW_AUTOPLAY || - isExtensionActiveCached() || - useAuthStore.getState().proxySet, - ); - - if (isEnding && allowAutoplay) loadNextEpisode(); - }, 250); - - return () => clearInterval(interval); + if (duration === 0) hasAutoplayed.current = false; + if (isEnding && isAutoplayAllowed() && !hasAutoplayed.current) { + hasAutoplayed.current = true; + loadNextEpisode(); + } }, [duration, enableAutoplay, loadNextEpisode, metaType, time]); if (!meta?.episode || !nextEp) return null; diff --git a/src/pages/parts/settings/PreferencesPart.tsx b/src/pages/parts/settings/PreferencesPart.tsx index f81e0c9e..efead293 100644 --- a/src/pages/parts/settings/PreferencesPart.tsx +++ b/src/pages/parts/settings/PreferencesPart.tsx @@ -1,28 +1,14 @@ +import classNames from "classnames"; import { useTranslation } from "react-i18next"; -import { useAsync } from "react-use"; -import { isExtensionActive } from "@/backend/extension/messaging"; import { Toggle } from "@/components/buttons/Toggle"; import { FlagIcon } from "@/components/FlagIcon"; import { Dropdown } from "@/components/form/Dropdown"; import { Heading1 } from "@/components/utils/Text"; -import { conf } from "@/setup/config"; import { appLanguageOptions } from "@/setup/i18n"; -import { useAuthStore } from "@/stores/auth"; +import { isAutoplayAllowed } from "@/utils/autoplay"; import { getLocaleInfo, sortLangCodes } from "@/utils/language"; -function useIsExtensionActive() { - const { loading, value } = useAsync(async () => { - const extensionStatus = (await isExtensionActive()) ? "success" : "unset"; - return extensionStatus === "success"; - }, []); - - return { - loading, - active: value, - }; -} - export function PreferencesPart(props: { language: string; setLanguage: (l: string) => void; @@ -33,14 +19,8 @@ export function PreferencesPart(props: { }) { const { t } = useTranslation(); const sorted = sortLangCodes(appLanguageOptions.map((item) => item.code)); - const { loading, active } = useIsExtensionActive(); - const extensionActive = active && !loading; - const allowAutoplay = Boolean( - conf().ALLOW_AUTOPLAY || - extensionActive || - useAuthStore.getState().proxySet, - ); + const allowAutoplay = isAutoplayAllowed(); const options = appLanguageOptions .sort((a, b) => sorted.indexOf(a.code) - sorted.indexOf(b.code)) @@ -101,12 +81,12 @@ export function PreferencesPart(props: { ? props.setEnableAutoplay(!props.enableAutoplay) : null } - className="bg-dropdown-background hover:bg-dropdown-hoverBackground select-none my-4 cursor-pointer space-x-3 flex items-center max-w-[25rem] py-3 px-4 rounded-lg" - style={{ - pointerEvents: allowAutoplay ? "auto" : "none", - opacity: allowAutoplay ? 1 : 0.5, - cursor: allowAutoplay ? "pointer" : "not-allowed", - }} + className={classNames( + "bg-dropdown-background hover:bg-dropdown-hoverBackground select-none my-4 cursor-pointer space-x-3 flex items-center max-w-[25rem] py-3 px-4 rounded-lg", + allowAutoplay ? "cursor-pointer" : "cursor-not-allowed", + allowAutoplay ? "opacity-100" : "opacity-50", + allowAutoplay ? "pointer-events-auto" : "pointer-events-none", + )} >

diff --git a/src/utils/autoplay.ts b/src/utils/autoplay.ts new file mode 100644 index 00000000..aee01ffb --- /dev/null +++ b/src/utils/autoplay.ts @@ -0,0 +1,11 @@ +import { isExtensionActiveCached } from "@/backend/extension/messaging"; +import { conf } from "@/setup/config"; +import { useAuthStore } from "@/stores/auth"; + +export function isAutoplayAllowed() { + return Boolean( + conf().ALLOW_AUTOPLAY || + isExtensionActiveCached() || + useAuthStore.getState().proxySet, + ); +} From ed451763ed3fe05423b97e728d99fe888ac7eedd Mon Sep 17 00:00:00 2001 From: qtchaos <72168435+qtchaos@users.noreply.github.com> Date: Fri, 12 Apr 2024 00:04:19 +0300 Subject: [PATCH 086/101] chore: clean up classNames --- src/pages/parts/settings/PreferencesPart.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/parts/settings/PreferencesPart.tsx b/src/pages/parts/settings/PreferencesPart.tsx index efead293..71f9c5f8 100644 --- a/src/pages/parts/settings/PreferencesPart.tsx +++ b/src/pages/parts/settings/PreferencesPart.tsx @@ -83,9 +83,9 @@ export function PreferencesPart(props: { } className={classNames( "bg-dropdown-background hover:bg-dropdown-hoverBackground select-none my-4 cursor-pointer space-x-3 flex items-center max-w-[25rem] py-3 px-4 rounded-lg", - allowAutoplay ? "cursor-pointer" : "cursor-not-allowed", - allowAutoplay ? "opacity-100" : "opacity-50", - allowAutoplay ? "pointer-events-auto" : "pointer-events-none", + allowAutoplay + ? "cursor-pointer opacity-100 pointer-events-auto" + : "cursor-not-allowed opacity-50 pointer-events-none", )} > From 1ec51699d1bfcda0d284f97d7d90c4aa9b614d47 Mon Sep 17 00:00:00 2001 From: Megh Rathod Date: Fri, 12 Apr 2024 11:33:18 +0530 Subject: [PATCH 087/101] fix: add alternate tmdb endpoint to fix errors when main url is blocked Signed-off-by: Megh Rathod --- src/backend/metadata/tmdb.ts | 44 +++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index 2e11bf73..0f01d684 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -143,7 +143,8 @@ export function decodeTMDBId( }; } -const baseURL = "https://api.tmdb.org/3"; +const otherUrl = "https://api.tmdb.org/3"; +let baseURL = "https://api.themoviedb.org/3"; const apiKey = conf().TMDB_READ_API_KEY; @@ -155,13 +156,40 @@ const headers = { 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, - params: { - ...params, - }, - }); + const controller = new AbortController(); + const { signal } = controller; + + const timeoutId = + baseURL === otherUrl + ? setTimeout(() => controller.abort(), 15000) + : setTimeout(() => controller.abort(), 3000); + let res: Promise; + + try { + res = await mwFetch(encodeURI(url), { + headers, + baseURL, + params: { + ...params, + }, + signal, + }); + clearTimeout(timeoutId); + } catch (err) { + if (baseURL !== otherUrl) { + baseURL = otherUrl; + res = await mwFetch(encodeURI(url), { + headers, + baseURL, + params: { + ...params, + }, + }); + } else { + res = Promise.reject(); + } + } + return res; } From 76d906c95a6de6cc0043d8c4c5c3fcddba7f895e Mon Sep 17 00:00:00 2001 From: Megh Rathod Date: Fri, 12 Apr 2024 23:29:42 +0530 Subject: [PATCH 088/101] fix: use AbortSignal.timeout instead of setTimeout Signed-off-by: Megh Rathod --- src/backend/metadata/tmdb.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index 0f01d684..f9d21c6c 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -156,13 +156,6 @@ const headers = { async function get(url: string, params?: object): Promise { if (!apiKey) throw new Error("TMDB API key not set"); - const controller = new AbortController(); - const { signal } = controller; - - const timeoutId = - baseURL === otherUrl - ? setTimeout(() => controller.abort(), 15000) - : setTimeout(() => controller.abort(), 3000); let res: Promise; try { @@ -172,9 +165,8 @@ async function get(url: string, params?: object): Promise { params: { ...params, }, - signal, + signal: AbortSignal.timeout(baseURL !== otherUrl ? 5000 : 30000), }); - clearTimeout(timeoutId); } catch (err) { if (baseURL !== otherUrl) { baseURL = otherUrl; From 0e3f82df302693d70e622666022877793a6ef1a9 Mon Sep 17 00:00:00 2001 From: Megh Rathod Date: Sun, 14 Apr 2024 15:14:14 +0530 Subject: [PATCH 089/101] Return values instead of promise Co-authored-by: William Oldham --- src/backend/metadata/tmdb.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index f9d21c6c..2e675f10 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -156,10 +156,10 @@ const headers = { async function get(url: string, params?: object): Promise { if (!apiKey) throw new Error("TMDB API key not set"); - let res: Promise; + let res: T; try { - res = await mwFetch(encodeURI(url), { + res = await mwFetch(encodeURI(url), { headers, baseURL, params: { @@ -170,7 +170,7 @@ async function get(url: string, params?: object): Promise { } catch (err) { if (baseURL !== otherUrl) { baseURL = otherUrl; - res = await mwFetch(encodeURI(url), { + res = await mwFetch(encodeURI(url), { headers, baseURL, params: { From 995c855ac2b77001b2541b3010bb944076ec6bf8 Mon Sep 17 00:00:00 2001 From: Megh Rathod Date: Sun, 14 Apr 2024 16:19:51 +0530 Subject: [PATCH 090/101] added useFallback to decide which TMDB url to use Signed-off-by: Megh Rathod --- src/backend/metadata/tmdb.ts | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index 2e675f10..67a79490 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -143,8 +143,9 @@ export function decodeTMDBId( }; } +const baseURL = "https://api.themoviedb.org/3"; const otherUrl = "https://api.tmdb.org/3"; -let baseURL = "https://api.themoviedb.org/3"; +let useFallback = false; const apiKey = conf().TMDB_READ_API_KEY; @@ -155,33 +156,26 @@ const headers = { async function get(url: string, params?: object): Promise { if (!apiKey) throw new Error("TMDB API key not set"); - let res: T; - try { res = await mwFetch(encodeURI(url), { headers, - baseURL, + baseURL: !useFallback ? baseURL : otherUrl, params: { ...params, }, - signal: AbortSignal.timeout(baseURL !== otherUrl ? 5000 : 30000), + signal: AbortSignal.timeout(!useFallback ? 5000 : 30000), }); } catch (err) { - if (baseURL !== otherUrl) { - baseURL = otherUrl; - res = await mwFetch(encodeURI(url), { - headers, - baseURL, - params: { - ...params, - }, - }); - } else { - res = Promise.reject(); - } + useFallback = true; + res = await mwFetch(encodeURI(url), { + headers, + baseURL: otherUrl, + params: { + ...params, + }, + }); } - return res; } From 90c4365422b225a4ab6fe429872e35cbdb5c4231 Mon Sep 17 00:00:00 2001 From: Seun Taiwo Date: Sat, 13 Apr 2024 09:28:13 +0100 Subject: [PATCH 091/101] Fixed next episode button not showing next season --- src/assets/locales/en.json | 3 +- .../player/atoms/NextEpisodeButton.tsx | 79 ++++++++++++++++++- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index bc042462..e0d33ff5 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -362,7 +362,8 @@ }, "nextEpisode": { "cancel": "Cancel", - "next": "Next episode" + "next": "Next episode", + "nextSeason": "Next season" }, "playbackError": { "badge": "Playback error", diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index 906b6829..29d424c7 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -1,7 +1,10 @@ import classNames from "classnames"; import { useCallback } from "react"; import { useTranslation } from "react-i18next"; +import { useAsync } from "react-use"; +import { getMetaFromId } from "@/backend/metadata/getmeta"; +import { MWMediaType, MWSeasonMeta } from "@/backend/metadata/types/mw"; import { Icon, Icons } from "@/components/Icon"; import { usePlayerMeta } from "@/components/player/hooks/usePlayerMeta"; import { Transition } from "@/components/utils/Transition"; @@ -9,6 +12,8 @@ import { PlayerMeta } from "@/stores/player/slices/source"; import { usePlayerStore } from "@/stores/player/store"; import { useProgressStore } from "@/stores/progress"; +import { hasAired } from "../utils/aired"; + function shouldShowNextEpisodeButton( time: number, duration: number, @@ -39,6 +44,45 @@ function Button(props: { ); } +function useSeasons(mediaId: string, isLastEpisode: boolean = false) { + const state = useAsync(async () => { + if (isLastEpisode) { + const data = await getMetaFromId(MWMediaType.SERIES, mediaId ?? ""); + if (data?.meta.type !== MWMediaType.SERIES) return null; + return data.meta.seasons; + } + }, [mediaId, isLastEpisode]); + + return state; +} + +function useNextSeasonEpisode( + nextSeason: MWSeasonMeta | undefined, + mediaId: string, +) { + const state = useAsync(async () => { + if (nextSeason) { + const data = await getMetaFromId( + MWMediaType.SERIES, + mediaId ?? "", + nextSeason?.id, + ); + if (data?.meta.type !== MWMediaType.SERIES) return null; + + const nextSeasonEpisodes = data?.meta?.seasonData?.episodes + .filter((episode) => hasAired(episode.air_date)) + .map((episode) => ({ + number: episode.number, + title: episode.title, + tmdbId: episode.id, + })); + + if (nextSeasonEpisodes.length > 0) return nextSeasonEpisodes[0]; + } + }, [mediaId, nextSeason?.id]); + return state; +} + export function NextEpisodeButton(props: { controlsShowing: boolean; onChange?: (meta: PlayerMeta) => void; @@ -58,6 +102,20 @@ export function NextEpisodeButton(props: { ); const updateItem = useProgressStore((s) => s.updateItem); + const isLastEpisode = + meta?.episode?.number === meta?.episodes?.at(-1)?.number; + + const seasons = useSeasons(meta?.tmdbId ?? "", isLastEpisode); + + const nextSeason = seasons.value?.find( + (season) => season.number === (meta?.season?.number ?? 0) + 1, + ); + + const nextSeasonEpisode = useNextSeasonEpisode( + nextSeason, + meta?.tmdbId ?? "", + ); + let show = false; if (showingState === "always") show = true; else if (showingState === "hover" && props.controlsShowing) show = true; @@ -70,14 +128,23 @@ export function NextEpisodeButton(props: { ? bottom : "bottom-[calc(3rem+env(safe-area-inset-bottom))]"; - const nextEp = meta?.episodes?.find( - (v) => v.number === (meta?.episode?.number ?? 0) + 1, - ); + const nextEp = isLastEpisode + ? nextSeasonEpisode.value + : meta?.episodes?.find( + (v) => v.number === (meta?.episode?.number ?? 0) + 1, + ); const loadNextEpisode = useCallback(() => { if (!meta || !nextEp) return; const metaCopy = { ...meta }; metaCopy.episode = nextEp; + metaCopy.season = + isLastEpisode && nextSeason + ? { + ...nextSeason, + tmdbId: nextSeason.id, + } + : metaCopy.season; setShouldStartFromBeginning(true); setDirectMeta(metaCopy); props.onChange?.(metaCopy); @@ -93,6 +160,8 @@ export function NextEpisodeButton(props: { props, setShouldStartFromBeginning, updateItem, + isLastEpisode, + nextSeason, ]); if (!meta?.episode || !nextEp) return null; @@ -121,7 +190,9 @@ export function NextEpisodeButton(props: { className="bg-buttons-primary hover:bg-buttons-primaryHover text-buttons-primaryText flex justify-center items-center" > - {t("player.nextEpisode.next")} + {isLastEpisode && nextEp + ? t("player.nextEpisode.nextSeason") + : t("player.nextEpisode.next")}

From 926018310e0cb5fad8dc0f61ea7bd23b3adf0dd9 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sun, 14 Apr 2024 21:29:45 +0100 Subject: [PATCH 092/101] Fix TMDB code --- src/backend/metadata/tmdb.ts | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index 67a79490..331f022f 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -143,40 +143,37 @@ export function decodeTMDBId( }; } -const baseURL = "https://api.themoviedb.org/3"; -const otherUrl = "https://api.tmdb.org/3"; -let useFallback = false; +const tmdbBaseUrl1 = "https://api.themoviedb.org/3"; +const tmdbBaseUrl2 = "https://api.tmdb.org/3"; const apiKey = conf().TMDB_READ_API_KEY; -const headers = { +const tmdbHeaders = { accept: "application/json", Authorization: `Bearer ${apiKey}`, }; async function get(url: string, params?: object): Promise { if (!apiKey) throw new Error("TMDB API key not set"); - let res: T; try { - res = await mwFetch(encodeURI(url), { - headers, - baseURL: !useFallback ? baseURL : otherUrl, + return await mwFetch(encodeURI(url), { + headers: tmdbHeaders, + baseURL: tmdbBaseUrl1, params: { ...params, }, - signal: AbortSignal.timeout(!useFallback ? 5000 : 30000), + signal: AbortSignal.timeout(5000), }); } catch (err) { - useFallback = true; - res = await mwFetch(encodeURI(url), { - headers, - baseURL: otherUrl, + return mwFetch(encodeURI(url), { + headers: tmdbHeaders, + baseURL: tmdbBaseUrl2, params: { ...params, }, + signal: AbortSignal.timeout(30000), }); } - return res; } export async function multiSearch( From 2a827bd0a4f78d3a0bc5c7c2155a0695f60c65a7 Mon Sep 17 00:00:00 2001 From: Mehdi Date: Sat, 6 Apr 2024 12:35:15 +0000 Subject: [PATCH 093/101] Translated using Weblate (Persian) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/fa/ Author: Mehdi --- src/assets/locales/fa.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/assets/locales/fa.json b/src/assets/locales/fa.json index 50e9b2d6..3d4d92b8 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -372,10 +372,10 @@ "badge": "مشکلی در پخش به وجود آمده", "errors": { "errorAborted": "دریافت محتوا با درخواست کاربر لغو شد.", - "errorDecode": "با وجود اینکه قبلا مشخص شده بود که قابل استفاده است، یک خطا در هنگام تلاش برای رمزگشایی رسانه رخ داد که باعث مشکل شد.", + "errorDecode": "با وجود اینکه قبلا مشخص شده بود که قابل استفاده است، یک خطا در هنگام تلاش برای رمزگشایی محتوا رخ داد که باعث مشکل شد.", "errorGenericMedia": "خطای محتوای ناشناخته رخ داد.", "errorNetwork": "با وجود اینکه قبلا در دسترس بود، نوعی خطای شبکه رخ داد که مانع از دریافت محتوا شد.", - "errorNotSupported": "محتوا یا ارائه دهنده رسانه پشتیبانی نمی‌شود." + "errorNotSupported": "محتوا یا ارائه دهنده محتوا پشتیبانی نمی‌شود." }, "homeButton": "بازگشت به خانه", "text": "مشکلی در پخش محتوا وجود داشت. لطفا دوباره تلاش کنید.", @@ -398,7 +398,7 @@ "badge": "پیدا نشد", "detailsButton": "نمایش جزئیات", "homeButton": "بازگشت به خانه", - "text": "ما در ارائه دهندگان جستجو کرده ایم ولی نمی توانیم محتوایی را که به دنبال آن را هستید پیدا کنیم! ما رسانه ها را میزبانی نمی کنیم و هیچ کنترلی بر آنچه در دسترس است نداریم. لطفا برای جزئیات بیشتر روی \"نمایش جزئیات\" در زیر کلیک کنید.", + "text": "ما در ارائه دهندگان جستجو کرده ایم ولی نمی توانیم محتوایی را که به دنبال آن را هستید پیدا کنیم! ما محتواها را میزبانی نمی کنیم و هیچ کنترلی بر آنچه در دسترس است نداریم. لطفا برای جزئیات بیشتر روی \"نمایش جزئیات\" در زیر کلیک کنید.", "title": "نتونستیم پیداش کنیم" } }, @@ -503,7 +503,7 @@ }, "redoSetup": "تنظیم مجدد", "successStatus": { - "description": "همه چیز برای شروع تماشای محتوای مورد علاقه‌تان آماده است.", + "description": "همه چیز برای شروع تماشای فیلم مورد علاقه‌تان آماده است.", "title": "همه چیز تنظیم شده است!" }, "unsetStatus": { @@ -516,7 +516,7 @@ "addButton": "اضافه کردن worker جدید", "description": "برای ایجاد عملکرد برنامه، تمام ترافیک از طریق پروکسی ها هدایت می شود. اگر میخواید این کار انجام دهید حتما از worker های خودتان استفاده کنید. <0>دستورالعمل ها.", "emptyState": "هنوز هیچ worker ای وجود ندارد، یکی اضافه کنید", - "label": "استفاده از worker های پروکسی سفارشی", + "label": "از پروکسی worker کاستوم استفاده کنید", "urlLabel": "لینک worker ها", "urlPlaceholder": "https://" } @@ -525,7 +525,7 @@ "language": "زبان برنامه", "languageDescription": "زبان برای کل برنامه اعمال شد.", "thumbnail": "ایجاد تامبنیل", - "thumbnailDescription": "بیشتر اوقات، ویدیوها تامبنیل ندارند. شما می توانید این تنظیم را فعال کنید تا آنها را در لحظه تولید کنید، اما آنها می توانند ویدیوی شما را کندتر کنند.", + "thumbnailDescription": "بیشتر اوقات، ویدیوها تامبنیل ندارند. شما می توانید این تنظیم را فعال کنید تا آنها را در لحظه ببینید، اما آنها می توانند ویدیوی شما را کندتر کنند.", "thumbnailLabel": "ایجاد تامبنیل", "title": "اولویت ها" }, @@ -536,8 +536,8 @@ "appVersion": "نسخه برنامه", "backendUrl": "لینک بک-اند", "backendVersion": "نسخه بک-اند", - "hostname": "نام میزبان", - "insecure": "نا امن", + "hostname": "نام هاست", + "insecure": "ناامن", "notLoggedIn": "شما وارد نشده اید", "secure": "امن", "title": "اطلاعات برنامه", @@ -551,7 +551,7 @@ "colorLabel": "رنگ", "previewQuote": "نباید بترسم، ترس قاتل ذهن است.", "textSizeLabel": "اندازه متن", - "title": "زیرنویس" + "title": "زیرنویسها" }, "unsaved": "شما تغییرات ذخیره نشده دارید" } From 8da9db2c83d8b0b268817718355035b779d64165 Mon Sep 17 00:00:00 2001 From: Mehdi Date: Mon, 8 Apr 2024 11:29:37 +0000 Subject: [PATCH 094/101] Translated using Weblate (Persian) Currently translated at 100.0% (336 of 336 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 3d4d92b8..6b6edd81 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -312,7 +312,7 @@ }, "noEmbeds": { "text": "نتوانستیم اطلاعات را پیدا کنیم، لطفا منبع دیگری را امتحان کنید.", - "title": "اطلاعات پیدا نشد" + "title": "هیج اطلاعاتی پیدا نشد" }, "noStream": { "text": "فیلم یا سریال شما در این منبع وجود ندارد.", From 612c98c2467cf964074ca7fd9f40139a5d7fec4a Mon Sep 17 00:00:00 2001 From: Erwann Lagouche Date: Wed, 10 Apr 2024 17:31:48 +0000 Subject: [PATCH 095/101] Translated using Weblate (French) Currently translated at 100.0% (336 of 336 strings) Translation: movie-web/website Translate-URL: https://weblate.476328473.xyz/projects/movie-web/website/fr/ Author: Erwann Lagouche --- src/assets/locales/fr.json | 104 ++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 48 deletions(-) diff --git a/src/assets/locales/fr.json b/src/assets/locales/fr.json index 344f5a80..02861233 100644 --- a/src/assets/locales/fr.json +++ b/src/assets/locales/fr.json @@ -7,7 +7,7 @@ "title": "D'où vient le contenu ?" }, "q2": { - "body": "Il est impossible de demander un film ou une série car movie-web ne gère aucun contenu. Le contenu est récupéré en explorant d'autres sites sur Internet.", + "body": "Il est impossible de demander un film ou une série, car movie-web ne gère aucun contenu. Le contenu est récupéré en explorant d'autres sites sur Internet.", "title": "Où puis-je demander une série ou un film ?" }, "q3": { @@ -25,26 +25,26 @@ "deviceNameLabel": "Nom de l'appareil", "deviceNamePlaceholder": "Téléphone personnel", "generate": { - "description": "Le nom d'utilisateur et le mot de passe sont obtenus à partir de votre passphrase. Vous devrez la saisir pour accéder à votre compte, alors gardez-la précieusement", - "next": "J'ai sauvegardé ma passphrase", - "passphraseFrameLabel": "Passphrase", - "title": "Votre passphrase" + "description": "Le nom d'utilisateur et le mot de passe sont obtenus à partir de votre phrase d'accès. Vous devrez la saisir pour accéder à votre compte, alors gardez-la précieusement", + "next": "J'ai sauvegardé ma phrase d'accès", + "passphraseFrameLabel": "Phrase d'accès", + "title": "Votre phrase d'accès" }, "hasAccount": "Avez-vous déjà un compte ? <0>Connectez-vous ici.", "login": { - "description": "Veuillez saisir votre passphrase pour accéder à votre compte", + "description": "Veuillez saisir votre phrase d'accès pour accéder à votre compte", "deviceLengthError": "Veuillez saisir un nom d'appareil", - "passphraseLabel": "Passphrase de 12 mots", - "passphrasePlaceholder": "Passphrase", + "passphraseLabel": "Phrase d'accès de 12 mots", + "passphrasePlaceholder": "Phrase d'accès", "submit": "Se connecter", "title": "Connectez-vous à votre compte", - "validationError": "Passphrase incorrecte ou incomplète" + "validationError": "Phrase d'accès incorrecte ou incomplète" }, "register": { "information": { "color1": "Première couleur de profil", "color2": "Seconde couleur de profil", - "header": "Veuillez entrer un nom pour votre appareil, choisir une couleur et une icône utilisateur de votre choix", + "header": "Veuillez entrer un nom pour votre appareil, choisir vos couleurs et une icône utilisateur de votre choix", "icon": "Icône d'utilisateur", "next": "Suivant", "title": "Informations du compte" @@ -63,13 +63,13 @@ "yes": "Je fais confiance à ce serveur" }, "verify": { - "description": "Veuillez saisir votre passphrase pour confirmer que vous l'avez enregistrée et pour créer votre compte", + "description": "Veuillez saisir votre phrase d'accès pour confirmer que vous l'avez enregistrée et pour créer votre compte", "invalidData": "Les données ne sont pas valides", - "noMatch": "La passphrase ne correspond pas", - "passphraseLabel": "Votre passphrase de 12 mots", - "recaptchaFailed": "La validation ReCaptcha a échouée", + "noMatch": "La phrase d'accès ne correspond pas", + "passphraseLabel": "Votre phrase d'accès de 12 mots", + "recaptchaFailed": "La validation ReCaptcha a échoué", "register": "Créer un compte", - "title": "Resaisissez votre passphrase" + "title": "Ressaisissez votre phrase d'accès" } }, "errors": { @@ -82,7 +82,7 @@ "footer": { "legal": { "disclaimer": "Avertissement", - "disclaimerText": "Le site movie-web ne stocke pas de fichiers, mais propose des liens vers des services externes. Les problèmes juridiques doivent être traités avec les fournisseurs et les hébergeurs de fichiers. Les fichiers multimédias diffusés par les fournisseurs de vidéos ne sont pas couverts par movie-web." + "disclaimerText": "movie-web ne stocke pas de fichiers, mais propose des liens vers des services externes. Les problèmes juridiques doivent être traités avec les fournisseurs et les hébergeurs de fichiers. Les fichiers multimédias diffusés par les fournisseurs de vidéos ne sont pas couverts par movie-web." }, "links": { "discord": "Discord", @@ -115,14 +115,14 @@ }, "search": { "allResults": "C'est tout ce que nous avons !", - "failed": "Le média n'a pas été trouvé, veuillez réessayez !", + "failed": "Le média n'a pas été trouvé, veuillez réessayer !", "loading": "Chargement...", "noResults": "Nous n'avons rien trouvé !", "placeholder": { "default": "Que voulez-vous voir ?", "extra": [ "Que voulez-vous explorer ?", - "Que y a-t-il dans votre liste de lecture?", + "Qu'y a-t-il dans votre liste de lecture ?", "Quel est votre film préféré ?", "Quelle est votre série préférée ?" ] @@ -155,11 +155,12 @@ "types": { "movie": "Film", "show": "Série" - } + }, + "unreleased": "Non publié" }, "navigation": { "banner": { - "offline": "Vérifiez votre connexion internet" + "offline": "Veuillez vérifier votre connexion internet" }, "menu": { "about": "À propos de nous", @@ -173,24 +174,24 @@ "notFound": { "badge": "Introuvable", "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.", + "message": "Nous avons cherché partout : sous les poubelles, dans le placard, derrière le proxy, mais nous n'avons pas pu trouver la page que vous cherchez.", "title": "Impossible de trouver cette page" }, "onboarding": { "defaultConfirm": { "cancel": "Annuler", "confirm": "Utiliser la configuration par défaut", - "description": "La configuration par défaut n'offre pas les meilleurs flux et peut être insupportablement lente.", + "description": "La configuration par défaut n'offre pas les meilleurs flux et peut-être insupportablement lente.", "title": "Êtes-vous sûr ?" }, "extension": { "back": "Revenir en arrière", "explainer": "En utilisant l'extension de navigateur, vous pouvez obtenir les meilleurs flux que nous avons à offrir. Avec juste une simple installation.", - "explainerIos": "Malheureusement, l'extension web n'est pas prise en charge sur iOS, appuyez sur Revenir en arrière pour choisir une autre option.", - "extensionHelp": "Si vous avez installé l'extension mais qu'elle n'est pas détectée, ouvrez l'extension via le menu des extensions de votre navigateur et suivez les étapes à l'écran.", + "explainerIos": "Malheureusement, l'extension web n'est pas prise en charge sur iOS, appuyez sur Retour pour choisir une autre option.", + "extensionHelp": "Si vous avez installé l'extension, mais qu'elle n'est pas détectée, ouvrez l'extension via le menu des extensions de votre navigateur et suivez les étapes à l'écran.", "linkChrome": "Installer l'extension Chrome", "linkFirefox": "Installer l'extension Firefox", - "notDetecting": "L'extension est installée sur Chrome mais le site ne la détecte pas ? Essayez de rafraîchir la page !", + "notDetecting": "L'extension est installée sur Chrome, mais le site ne la détecte pas ? Essayez de rafraîchir la page !", "notDetectingAction": "Rafraîchir la page", "status": { "disallowed": "L'extension n'est pas activée pour cette page", @@ -204,12 +205,12 @@ "title": "Commençons par une extension" }, "proxy": { - "back": "Revenir en arrière", + "back": "Retour", "explainer": "Avec la méthode du proxy, vous pouvez obtenir des flux de bonne qualité en créant un proxy en libre-service.", "input": { "errorConnection": "Impossible de se connecter au proxy", "errorInvalidUrl": "URL non valide", - "errorNotProxy": "Je m'attendais à un proxy mais j'ai obtenu un site Web", + "errorNotProxy": "Je m'attendais à un proxy, mais j'ai obtenu un site Web", "label": "URL du proxy", "placeholder": "https://" }, @@ -221,17 +222,17 @@ "explainer": "Pour obtenir les meilleurs flux possibles, vous devrez choisir la méthode de streaming que vous souhaitez utiliser.", "options": { "default": { - "text": "Je ne veux pas de flux de bonne qualité,<0 /> <1>Utiliser le flux par défaut" + "text": "Je ne veux pas de flux de bonne qualité,<0 /> <1>utiliser le flux par défaut" }, "extension": { "action": "Installer l'extension", "description": "Installez l'extension pour navigateur et accédez aux meilleures sources.", - "quality": "Meilleur qualité", + "quality": "Meilleure qualité", "title": "Extension du navigateur" }, "proxy": { "action": "Configurez le proxy", - "description": "Configurez un proxy en seulement 5 minutes et accédez à d'excellentes sources.", + "description": "Configurez un proxy en seulement cinq minutes et accédez à d'excellentes sources.", "quality": "Bonne qualité", "title": "Proxy personnalisé" } @@ -256,14 +257,14 @@ "disclaimer": "Les téléchargements sont effectués directement par le fournisseur. movie-web n'a aucun contrôle sur la manière dont les téléchargements sont effectués.", "downloadSubtitle": "Télécharger les sous-titres", "downloadVideo": "Télécharger la vidéo", - "hlsDisclaimer": "Les téléchargements sont effectués directement auprès du fournisseur. movie-web n'a aucun contrôle sur la façon dont les téléchargements sont fournis.

Veuillez noter que vous téléchargez une liste de lecture HLS, il n'est pas recommandé de la télécharger si vous n'êtes pas familier avec les formats de streaming avancés. . Essayez différentes sources pour différents formats.", + "hlsDisclaimer": "Les téléchargements sont effectués directement auprès du fournisseur. movie-web n'a aucun contrôle sur la façon dont les téléchargements sont fournis.

Veuillez noter que vous téléchargez une liste de lecture HLS, il n'est pas recommandé de la télécharger si vous n'êtes pas familier avec les formats de streaming avancés. Essayez différentes sources pour différents formats.", "onAndroid": { - "1": "Pour télécharger sur Android, cliquez sur le bouton de téléchargement puis, sur la nouvelle page, tapez et maintenez sur la vidéo, puis sélectionnez enregistrer.", + "1": "Pour télécharger sur Android, cliquez sur le bouton de téléchargement, puis, sur la nouvelle page, tapez et maintenez sur la vidéo, et sélectionnez enregistrer.", "shortTitle": "Télécharger / Android", "title": "Téléchargement sur Android" }, "onIos": { - "1": "Pour télécharger sur iOS, cliquez sur le bouton de téléchargement puis, sur la nouvelle page, cliquez sur , puis Enregistrer dans les fichiers .", + "1": "Pour télécharger sur iOS, cliquez sur le bouton de téléchargement, puis, sur la nouvelle page, cliquez sur , et Enregistrer dans les fichiers .", "shortTitle": "Télécharger / iOS", "title": "Télécharger sur iOS" }, @@ -281,7 +282,7 @@ "loadingError": "Erreur lors du chargement de la saison", "loadingList": "Chargement...", "loadingTitle": "Chargement...", - "unairedEpisodes": "Un ou plusieurs épisodes de cette saison ont été désactivés car ils n'ont pas encore été diffusés." + "unairedEpisodes": "Un ou plusieurs épisodes de cette saison ont été désactivés, car ils n'ont pas encore été diffusés." }, "playback": { "speedLabel": "Vitesse de lecture", @@ -290,7 +291,7 @@ "quality": { "automaticLabel": "Qualité automatique", "hint": "Vous pouvez essayer de <0>changer de source pour obtenir différentes options de qualité.", - "iosNoQuality": "En raison des limitations définies par Apple, la sélection de la qualité n'est pas disponible sur iOS pour cette source. Vous pouvez essayer <0>de passer à une autre source pour obtenir des options de qualité différentes.", + "iosNoQuality": "En raison des limitations définies par Apple, la sélection de la qualité n'est pas disponible sur iOS pour cette source. Vous pouvez essayer <0>de changer de source pour obtenir des options de qualité différentes.", "title": "Qualité" }, "settings": { @@ -311,7 +312,7 @@ }, "noEmbeds": { "text": "Nous n'avons pas trouvé de liens, veuillez essayer une autre source.", - "title": "Pas d'embeds trouvés" + "title": "Pas d'intégrations (embeds) trouvées" }, "noStream": { "text": "Cette source n'a pas de flux pour ce film ou cette série.", @@ -374,13 +375,20 @@ "errorDecode": "Bien qu'elle ait été jugée utilisable, une erreur s'est produite lors de la tentative de décodage de la ressource multimédia, ce qui a entraîné une erreur.", "errorGenericMedia": "Une erreur de média inconnue est survenue.", "errorNetwork": "Une erreur de réseau s'est produite qui a empêché la récupération du média, bien qu'il ait été disponible auparavant.", - "errorNotSupported": "L'objet du media ou de la source du média n'est pas supporté." + "errorNotSupported": "L'objet du média ou de la source du média n'est pas supporté." }, "homeButton": "Revenir à l'accueil", "text": "Une erreur s'est produite lors de la lecture du média. Veuillez réessayer.", "title": "Oups, c'est coupé !" }, "scraping": { + "extensionFailure": { + "badge": "Extension désactivée", + "enableExtension": "Activer l'extension", + "homeButton": "Revenir à l'accueil", + "text": "Vous avez installé l'extension movie-web. Pour commencer à l'utiliser, vous devez activer l'extension pour ce site.", + "title": "Veuillez activer l'extension" + }, "items": { "failure": "Une erreur est survenue", "notFound": "N'a pas la vidéo", @@ -409,7 +417,7 @@ }, "screens": { "dmca": { - "text": "Bienvenue sur la page de contact DMCA de movie-web ! Nous respectons les droits de propriété intellectuelle et souhaitons répondre rapidement à toute question relative aux droits d'auteur. Si vous pensez que votre œuvre protégée par des droits d'auteur a été utilisée de manière inappropriée sur notre plateforme, veuillez envoyer une notification DMCA détaillée à l'adresse électronique ci-dessous. Veuillez inclure une description du matériel protégé par des droits d'auteur, vos coordonnées et une déclaration de bonne foi. Nous nous engageons à résoudre ces problèmes rapidement et vous remercions de votre coopération pour que movie-web reste un lieu respectueux de la créativité et des droits d'auteur.", + "text": "Bienvenue sur la page de contact DMCA de movie-web ! Nous respectons les droits de propriété intellectuelle et souhaitons répondre rapidement à toute question relative aux droits d'auteur. Si vous pensez que votre œuvre protégée par des droits d'auteur a été utilisée de manière inappropriée sur notre plateforme, veuillez envoyer une notification DMCA détaillée à l'adresse électronique ci-dessous. Veuillez inclure une description du matériel protégé par des droits d'auteur, vos coordonnées et une déclaration de bonne foi. Nous nous engageons à résoudre ces problèmes rapidement et vous remercions pour votre coopération pour que movie-web reste un lieu respectueux de la créativité et des droits d'auteur.", "title": "DMCA" }, "loadingApp": "Chargement de l'application", @@ -421,7 +429,7 @@ "textWithReset": "Echec du chargement de votre profil à partir de votre serveur personnalisé, souhaitez-vous revenir au serveur par défaut ?" }, "migration": { - "failed": "La migration de vos données a échouée.", + "failed": "La migration de vos données a échoué.", "inProgress": "Veuillez patienter, nous sommes en train de migrer vos données. Cela ne devrait pas prendre longtemps." } }, @@ -458,7 +466,7 @@ "userIcon": "Icône de l'utilisateur" }, "register": { - "cta": "Démarrer", + "cta": "Commencer", "text": "Partagez la progression de vos films et séries entre vos appareils et gardez-les synchronisés.", "title": "Synchroniser au Cloud" }, @@ -471,7 +479,7 @@ "default": "Défaut", "gray": "Gris", "red": "Rouge", - "teal": "Saphir" + "teal": "Bleu canard" }, "title": "Apparence" }, @@ -495,8 +503,8 @@ }, "redoSetup": "Refaire la configuration", "successStatus": { - "description": "Tout est réuni pour que vous puissiez commencer à regarder vos médias préférés.", - "title": "Tout est mis en place !" + "description": "Tout prêt pour que vous puissiez commencer à regarder vos médias préférés.", + "title": "Tout est en place !" }, "unsetStatus": { "description": "Pour commencer le processus de configuration, veuillez cliquer sur le bouton à droite.", @@ -514,11 +522,11 @@ } }, "preferences": { - "language": "Language de l'application", + "language": "Langage de l'application", "languageDescription": "Langue appliquée à l’ensemble de l’application.", - "thumbnail": "Générer des miniatures", + "thumbnail": "Générer les miniatures", "thumbnailDescription": "La plupart du temps, les vidéos n'ont pas de miniatures. Vous pouvez activer ce paramètre pour les générer à la volée, mais ils peuvent ralentir votre vidéo.", - "thumbnailLabel": "Générer des miniatures", + "thumbnailLabel": "Générer les miniatures", "title": "Préférences" }, "reset": "Réinitialiser", @@ -526,7 +534,7 @@ "sidebar": { "info": { "appVersion": "Version de l'application", - "backendUrl": "URL de Backend", + "backendUrl": "URL du Backend", "backendVersion": "Version du Backend", "hostname": "Nom d'hôte", "insecure": "Non sécurisé", @@ -539,7 +547,7 @@ }, "subtitles": { "backgroundBlurLabel": "Flou d'arrière-plan", - "backgroundLabel": "Opacité du fond", + "backgroundLabel": "Opacité de l'arrière-plan", "colorLabel": "Couleur", "previewQuote": "Plus l'obscurité est profonde, plus la lumière brille.", "textSizeLabel": "Taille des textes", From 8eeb200558c4bd65e50c7d175e5c7cbf6bbe941f Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sun, 14 Apr 2024 21:51:56 +0100 Subject: [PATCH 096/101] Bump provider to 2.3.0 --- package.json | 2 +- pnpm-lock.yaml | 59 +++++++++++++++++++++++++------------------------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index d70f0143..6fe84190 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@formkit/auto-animate": "^0.8.1", "@headlessui/react": "^1.7.17", "@ladjs/country-language": "^1.0.3", - "@movie-web/providers": "^2.2.9", + "@movie-web/providers": "^2.3.0", "@noble/hashes": "^1.3.3", "@plasmohq/messaging": "^0.6.1", "@react-spring/web": "^9.7.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0740a26..54dd87b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,8 +22,8 @@ dependencies: specifier: ^1.0.3 version: 1.0.3 '@movie-web/providers': - specifier: ^2.2.9 - version: 2.2.9 + specifier: ^2.3.0 + version: 2.3.0 '@noble/hashes': specifier: ^1.3.3 version: 1.3.3 @@ -274,7 +274,7 @@ devDependencies: version: 0.5.9(prettier@3.1.1) rollup-plugin-visualizer: specifier: ^5.11.0 - version: 5.11.0(@rollup/wasm-node@4.14.1) + version: 5.11.0(@rollup/wasm-node@4.14.2) tailwind-scrollbar: specifier: ^3.0.5 version: 3.0.5(tailwindcss@3.4.0) @@ -3050,8 +3050,8 @@ packages: engines: {node: '>= 14'} dev: false - /@movie-web/providers@2.2.9: - resolution: {integrity: sha512-NHsyplM9Oe4DK3lIkNaEk0CqoQ6IqlaWXeDh01jj+DH4I4EJjSD4ow7OTeAC+BLz3Gwj6fh/vaE2WBGevPTDkQ==} + /@movie-web/providers@2.3.0: + resolution: {integrity: sha512-jr3C9alAODEyxgWSBMZ6LlrubrZCfpraTuunf7sPpY19WcV8rHbfz1kxeLdBXC2BqPfgQmipVr+KsXvCQqKhXw==} requiresBuild: true dependencies: cheerio: 1.0.0-rc.12 @@ -3175,7 +3175,7 @@ packages: engines: {node: '>=14.0.0'} dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.24.3)(@rollup/wasm-node@4.14.1): + /@rollup/plugin-babel@5.3.1(@babel/core@7.24.3)(@rollup/wasm-node@4.14.2): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -3188,36 +3188,36 @@ packages: dependencies: '@babel/core': 7.24.3 '@babel/helper-module-imports': 7.24.3 - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.1) - rollup: /@rollup/wasm-node@4.14.1 + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.2) + rollup: /@rollup/wasm-node@4.14.2 dev: true - /@rollup/plugin-node-resolve@11.2.1(@rollup/wasm-node@4.14.1): + /@rollup/plugin-node-resolve@11.2.1(@rollup/wasm-node@4.14.2): resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.1) + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.2) '@types/resolve': 1.17.1 builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.8 - rollup: /@rollup/wasm-node@4.14.1 + rollup: /@rollup/wasm-node@4.14.2 dev: true - /@rollup/plugin-replace@2.4.2(@rollup/wasm-node@4.14.1): + /@rollup/plugin-replace@2.4.2(@rollup/wasm-node@4.14.2): resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.1) + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.14.2) magic-string: 0.25.9 - rollup: /@rollup/wasm-node@4.14.1 + rollup: /@rollup/wasm-node@4.14.2 dev: true - /@rollup/pluginutils@3.1.0(@rollup/wasm-node@4.14.1): + /@rollup/pluginutils@3.1.0(@rollup/wasm-node@4.14.2): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -3226,11 +3226,11 @@ packages: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: /@rollup/wasm-node@4.14.1 + rollup: /@rollup/wasm-node@4.14.2 dev: true - /@rollup/wasm-node@4.14.1: - resolution: {integrity: sha512-w5GZ2p1F7tOop6WJxa5x0Ot1s6eVPKOlEo5hmWT3KGxv0naGqiGJa/fz7S/it06nzgS3fmkDbtDfpAYwqOMKRQ==} + /@rollup/wasm-node@4.14.2: + resolution: {integrity: sha512-iwZbxtvP/0icwPWExUZWfA3A2jqQkDY38E8R5onRY2ALFmom0k7e37n9WDcJMMRcx/pdenfN8NaSohzX9LiDEQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: @@ -6557,7 +6557,7 @@ packages: '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) '@babel/types': 7.23.6 kleur: 4.1.5 - rollup: /@rollup/wasm-node@4.14.1 + rollup: /@rollup/wasm-node@4.14.2 unplugin: 1.5.1 transitivePeerDependencies: - supports-color @@ -7529,7 +7529,7 @@ packages: glob: 7.2.3 dev: true - /rollup-plugin-terser@7.0.2(@rollup/wasm-node@4.14.1): + /rollup-plugin-terser@7.0.2(@rollup/wasm-node@4.14.2): resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser peerDependencies: @@ -7537,12 +7537,12 @@ packages: dependencies: '@babel/code-frame': 7.24.2 jest-worker: 26.6.2 - rollup: /@rollup/wasm-node@4.14.1 + rollup: /@rollup/wasm-node@4.14.2 serialize-javascript: 4.0.0 terser: 5.30.0 dev: true - /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.14.1): + /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.14.2): resolution: {integrity: sha512-exM0Ms2SN3AgTzMeW7y46neZQcyLY7eKwWAop1ZoRTCZwyrIRdMMJ6JjToAJbML77X/9N8ZEpmXG4Z/Clb9k8g==} engines: {node: '>=14'} hasBin: true @@ -7554,7 +7554,7 @@ packages: dependencies: open: 8.4.2 picomatch: 2.3.1 - rollup: /@rollup/wasm-node@4.14.1 + rollup: /@rollup/wasm-node@4.14.2 source-map: 0.7.4 yargs: 17.7.2 dev: true @@ -8692,7 +8692,7 @@ packages: '@types/node': 20.10.5 esbuild: 0.19.10 postcss: 8.4.32 - rollup: /@rollup/wasm-node@4.14.1 + rollup: /@rollup/wasm-node@4.14.2 optionalDependencies: fsevents: 2.3.3 dev: true @@ -8959,9 +8959,9 @@ packages: '@babel/core': 7.24.3 '@babel/preset-env': 7.24.3(@babel/core@7.24.3) '@babel/runtime': 7.24.1 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.3)(@rollup/wasm-node@4.14.1) - '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.14.1) - '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.14.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.3)(@rollup/wasm-node@4.14.2) + '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.14.2) + '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.14.2) '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.12.0 common-tags: 1.8.2 @@ -8970,8 +8970,8 @@ packages: glob: 7.2.3 lodash: 4.17.21 pretty-bytes: 5.6.0 - rollup: /@rollup/wasm-node@4.14.1 - rollup-plugin-terser: 7.0.2(@rollup/wasm-node@4.14.1) + rollup: /@rollup/wasm-node@4.14.2 + rollup-plugin-terser: 7.0.2(@rollup/wasm-node@4.14.2) source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 @@ -9016,7 +9016,6 @@ packages: /workbox-google-analytics@7.0.0: resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} - deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained dependencies: workbox-background-sync: 7.0.0 workbox-core: 7.0.0 From dad968ee0f095b077f4febe253f346bb28b33765 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sun, 14 Apr 2024 21:52:06 +0100 Subject: [PATCH 097/101] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6fe84190..b9482526 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "movie-web", - "version": "4.6.6", + "version": "4.7.0", "private": true, "homepage": "https://github.com/movie-web/movie-web", "scripts": { From a9d80ddf243aab52844a82fce1afdd5f1bbe88b0 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Mon, 15 Apr 2024 20:10:44 +0100 Subject: [PATCH 098/101] Use vanilla AbortController for compat --- src/backend/metadata/tmdb.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index 331f022f..1cbb24f1 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -153,6 +153,12 @@ const tmdbHeaders = { Authorization: `Bearer ${apiKey}`, }; +function abortOnTimeout(timeout: number): AbortSignal { + const controller = new AbortController(); + setTimeout(() => controller.abort(), timeout); + return controller.signal; +} + async function get(url: string, params?: object): Promise { if (!apiKey) throw new Error("TMDB API key not set"); try { @@ -162,7 +168,7 @@ async function get(url: string, params?: object): Promise { params: { ...params, }, - signal: AbortSignal.timeout(5000), + signal: abortOnTimeout(5000), }); } catch (err) { return mwFetch(encodeURI(url), { @@ -171,7 +177,7 @@ async function get(url: string, params?: object): Promise { params: { ...params, }, - signal: AbortSignal.timeout(30000), + signal: abortOnTimeout(30000), }); } } From 5fbe5d1ff57f51736ec17fad539a9b3cee9f6eda Mon Sep 17 00:00:00 2001 From: Jorrin Date: Fri, 19 Apr 2024 19:26:29 +0200 Subject: [PATCH 099/101] fix tmdb 404 request --- src/components/player/atoms/NextEpisodeButton.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index 270d03f0..ca92f418 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -49,7 +49,7 @@ function Button(props: { function useSeasons(mediaId: string, isLastEpisode: boolean = false) { const state = useAsync(async () => { if (isLastEpisode) { - const data = await getMetaFromId(MWMediaType.SERIES, mediaId ?? ""); + const data = await getMetaFromId(MWMediaType.SERIES, mediaId); if (data?.meta.type !== MWMediaType.SERIES) return null; return data.meta.seasons; } @@ -64,9 +64,10 @@ function useNextSeasonEpisode( ) { const state = useAsync(async () => { if (nextSeason) { + if (!mediaId) return; const data = await getMetaFromId( MWMediaType.SERIES, - mediaId ?? "", + mediaId, nextSeason?.id, ); if (data?.meta.type !== MWMediaType.SERIES) return null; @@ -106,7 +107,9 @@ export function NextEpisodeButton(props: { const enableAutoplay = usePreferencesStore((s) => s.enableAutoplay); const isLastEpisode = - meta?.episode?.number === meta?.episodes?.at(-1)?.number; + !meta?.episode?.number || !meta?.episodes?.at(-1)?.number + ? false + : meta.episode.number === meta.episodes.at(-1)!.number; const seasons = useSeasons(meta?.tmdbId ?? "", isLastEpisode); From cfa3cfd0725c6ba24c56fdecd2745ca20952ae78 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Fri, 19 Apr 2024 19:28:49 +0200 Subject: [PATCH 100/101] check for undefined --- src/components/player/atoms/NextEpisodeButton.tsx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index ca92f418..b32454b8 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -46,9 +46,13 @@ function Button(props: { ); } -function useSeasons(mediaId: string, isLastEpisode: boolean = false) { +function useSeasons( + mediaId: string | undefined, + isLastEpisode: boolean = false, +) { const state = useAsync(async () => { if (isLastEpisode) { + if (!mediaId) return; const data = await getMetaFromId(MWMediaType.SERIES, mediaId); if (data?.meta.type !== MWMediaType.SERIES) return null; return data.meta.seasons; @@ -60,7 +64,7 @@ function useSeasons(mediaId: string, isLastEpisode: boolean = false) { function useNextSeasonEpisode( nextSeason: MWSeasonMeta | undefined, - mediaId: string, + mediaId: string | undefined, ) { const state = useAsync(async () => { if (nextSeason) { @@ -111,16 +115,13 @@ export function NextEpisodeButton(props: { ? false : meta.episode.number === meta.episodes.at(-1)!.number; - const seasons = useSeasons(meta?.tmdbId ?? "", isLastEpisode); + const seasons = useSeasons(meta?.tmdbId, isLastEpisode); const nextSeason = seasons.value?.find( (season) => season.number === (meta?.season?.number ?? 0) + 1, ); - const nextSeasonEpisode = useNextSeasonEpisode( - nextSeason, - meta?.tmdbId ?? "", - ); + const nextSeasonEpisode = useNextSeasonEpisode(nextSeason, meta?.tmdbId); let show = false; const hasAutoplayed = useRef(false); From 0a15bb20235bc90580024e09947280938cee2b48 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Sat, 20 Apr 2024 11:36:38 +0200 Subject: [PATCH 101/101] consistent returns --- src/components/player/atoms/NextEpisodeButton.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index b32454b8..b6e39d8e 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -52,7 +52,7 @@ function useSeasons( ) { const state = useAsync(async () => { if (isLastEpisode) { - if (!mediaId) return; + if (!mediaId) return null; const data = await getMetaFromId(MWMediaType.SERIES, mediaId); if (data?.meta.type !== MWMediaType.SERIES) return null; return data.meta.seasons; @@ -68,7 +68,7 @@ function useNextSeasonEpisode( ) { const state = useAsync(async () => { if (nextSeason) { - if (!mediaId) return; + if (!mediaId) return null; const data = await getMetaFromId( MWMediaType.SERIES, mediaId,