From a077fd21cc279aa2eeac7c8fe868d61e071d3769 Mon Sep 17 00:00:00 2001 From: lostbit Date: Thu, 29 Aug 2024 09:54:12 +0200 Subject: [PATCH 01/45] Add default choice to collection display order --- src/components/metadataEditor/metadataEditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index b40a858b6b..4503e1cf10 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -717,7 +717,7 @@ function setFieldVisibilities(context, item) { showElement('#fldDisplayOrder', context); hideElement('.seriesDisplayOrderDescription', context); - context.querySelector('#selectDisplayOrder').innerHTML = ''; + context.querySelector('#selectDisplayOrder').innerHTML = ''; } else if (item.Type === 'Series') { showElement('#fldDisplayOrder', context); showElement('.seriesDisplayOrderDescription', context); From f7fcf44f94c6d71d417d0ef7985a7d76c167f293 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Sun, 8 Sep 2024 20:12:37 +0300 Subject: [PATCH 02/45] Add global Api hooks --- src/hooks/api/libraryHooks/index.ts | 1 + src/hooks/api/libraryHooks/useGetDownload.ts | 38 ++++++++++++++++++ src/hooks/api/liveTvHooks/index.ts | 5 +++ .../api/liveTvHooks/useCancelSeriesTimer.ts | 23 +++++++++++ src/hooks/api/liveTvHooks/useCancelTimer.ts | 23 +++++++++++ src/hooks/api/liveTvHooks/useGetChannel.ts | 40 +++++++++++++++++++ .../api/liveTvHooks/useGetSeriesTimer.ts | 34 ++++++++++++++++ src/hooks/api/liveTvHooks/useGetTimer.ts | 34 ++++++++++++++++ src/hooks/api/videosHooks/index.ts | 1 + .../videosHooks/useDeleteAlternateSources.ts | 23 +++++++++++ 10 files changed, 222 insertions(+) create mode 100644 src/hooks/api/libraryHooks/index.ts create mode 100644 src/hooks/api/libraryHooks/useGetDownload.ts create mode 100644 src/hooks/api/liveTvHooks/index.ts create mode 100644 src/hooks/api/liveTvHooks/useCancelSeriesTimer.ts create mode 100644 src/hooks/api/liveTvHooks/useCancelTimer.ts create mode 100644 src/hooks/api/liveTvHooks/useGetChannel.ts create mode 100644 src/hooks/api/liveTvHooks/useGetSeriesTimer.ts create mode 100644 src/hooks/api/liveTvHooks/useGetTimer.ts create mode 100644 src/hooks/api/videosHooks/index.ts create mode 100644 src/hooks/api/videosHooks/useDeleteAlternateSources.ts diff --git a/src/hooks/api/libraryHooks/index.ts b/src/hooks/api/libraryHooks/index.ts new file mode 100644 index 0000000000..53dadb17fd --- /dev/null +++ b/src/hooks/api/libraryHooks/index.ts @@ -0,0 +1 @@ +export * from './useGetDownload'; diff --git a/src/hooks/api/libraryHooks/useGetDownload.ts b/src/hooks/api/libraryHooks/useGetDownload.ts new file mode 100644 index 0000000000..031e0e49b8 --- /dev/null +++ b/src/hooks/api/libraryHooks/useGetDownload.ts @@ -0,0 +1,38 @@ +import type { AxiosRequestConfig } from 'axios'; +import type { LibraryApiGetDownloadRequest } from '@jellyfin/sdk/lib/generated-client'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; +import { queryOptions, useQuery } from '@tanstack/react-query'; +import { type JellyfinApiContext, useApi } from 'hooks/useApi'; + +const getDownload = async ( + apiContext: JellyfinApiContext, + params: LibraryApiGetDownloadRequest, + options?: AxiosRequestConfig +) => { + const { api, user } = apiContext; + if (!api) throw new Error('No API instance available'); + if (!user?.Id) throw new Error('No User ID provided'); + + const response = await getLibraryApi(api).getDownload( + params, + options + ); + return response.data; +}; + +export const getDownloadQuery = ( + apiContext: JellyfinApiContext, + params: LibraryApiGetDownloadRequest +) => queryOptions({ + queryKey: ['Download', params.itemId], + queryFn: ({ signal }) => + getDownload(apiContext, params, { signal }), + enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.itemId +}); + +export const useGetDownload = ( + params: LibraryApiGetDownloadRequest +) => { + const apiContext = useApi(); + return useQuery(getDownloadQuery(apiContext, params)); +}; diff --git a/src/hooks/api/liveTvHooks/index.ts b/src/hooks/api/liveTvHooks/index.ts new file mode 100644 index 0000000000..458bb62e07 --- /dev/null +++ b/src/hooks/api/liveTvHooks/index.ts @@ -0,0 +1,5 @@ +export * from './useCancelSeriesTimer'; +export * from './useCancelTimer'; +export * from './useGetChannel'; +export * from './useGetSeriesTimer'; +export * from './useGetTimer'; diff --git a/src/hooks/api/liveTvHooks/useCancelSeriesTimer.ts b/src/hooks/api/liveTvHooks/useCancelSeriesTimer.ts new file mode 100644 index 0000000000..85c98b00e5 --- /dev/null +++ b/src/hooks/api/liveTvHooks/useCancelSeriesTimer.ts @@ -0,0 +1,23 @@ +import type { LiveTvApiCancelSeriesTimerRequest } from '@jellyfin/sdk/lib/generated-client'; +import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api'; +import { useMutation } from '@tanstack/react-query'; +import { type JellyfinApiContext, useApi } from 'hooks/useApi'; + +const cancelSeriesTimer = async ( + apiContext: JellyfinApiContext, + params: LiveTvApiCancelSeriesTimerRequest +) => { + const { api } = apiContext; + if (api) { + const response = await getLiveTvApi(api).cancelSeriesTimer(params); + return response.data; + } +}; + +export const useCancelSeriesTimer = () => { + const apiContext = useApi(); + return useMutation({ + mutationFn: (params: LiveTvApiCancelSeriesTimerRequest) => + cancelSeriesTimer(apiContext, params) + }); +}; diff --git a/src/hooks/api/liveTvHooks/useCancelTimer.ts b/src/hooks/api/liveTvHooks/useCancelTimer.ts new file mode 100644 index 0000000000..7ef8985cba --- /dev/null +++ b/src/hooks/api/liveTvHooks/useCancelTimer.ts @@ -0,0 +1,23 @@ +import type { LiveTvApiCancelTimerRequest } from '@jellyfin/sdk/lib/generated-client'; +import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api'; +import { useMutation } from '@tanstack/react-query'; +import { type JellyfinApiContext, useApi } from 'hooks/useApi'; + +const cancelTimer = async ( + apiContext: JellyfinApiContext, + params: LiveTvApiCancelTimerRequest +) => { + const { api } = apiContext; + if (api) { + const response = await getLiveTvApi(api).cancelTimer(params); + return response.data; + } +}; + +export const useCancelTimer = () => { + const apiContext = useApi(); + return useMutation({ + mutationFn: (params: LiveTvApiCancelTimerRequest) => + cancelTimer(apiContext, params) + }); +}; diff --git a/src/hooks/api/liveTvHooks/useGetChannel.ts b/src/hooks/api/liveTvHooks/useGetChannel.ts new file mode 100644 index 0000000000..93e241880c --- /dev/null +++ b/src/hooks/api/liveTvHooks/useGetChannel.ts @@ -0,0 +1,40 @@ +import type { AxiosRequestConfig } from 'axios'; +import type { LiveTvApiGetChannelRequest } from '@jellyfin/sdk/lib/generated-client'; +import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api'; +import { queryOptions, useQuery } from '@tanstack/react-query'; +import { type JellyfinApiContext, useApi } from 'hooks/useApi'; + +const getChannel = async ( + apiContext: JellyfinApiContext, + params: LiveTvApiGetChannelRequest, + options?: AxiosRequestConfig +) => { + const { api, user } = apiContext; + if (!api) throw new Error('No API instance available'); + if (!user?.Id) throw new Error('No User ID provided'); + + const response = await getLiveTvApi(api).getChannel( + { + userId: user.Id, + ...params + }, + options + ); + return response.data; +}; + +export const getChannelQuery = ( + apiContext: JellyfinApiContext, + params: LiveTvApiGetChannelRequest +) => queryOptions({ + queryKey: ['Channel', params.channelId], + queryFn: ({ signal }) => getChannel(apiContext, params, { signal }), + enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.channelId +}); + +export const useGetChannel = ( + params: LiveTvApiGetChannelRequest +) => { + const apiContext = useApi(); + return useQuery(getChannelQuery(apiContext, params)); +}; diff --git a/src/hooks/api/liveTvHooks/useGetSeriesTimer.ts b/src/hooks/api/liveTvHooks/useGetSeriesTimer.ts new file mode 100644 index 0000000000..d7342902a2 --- /dev/null +++ b/src/hooks/api/liveTvHooks/useGetSeriesTimer.ts @@ -0,0 +1,34 @@ +import type { AxiosRequestConfig } from 'axios'; +import type { LiveTvApiGetSeriesTimerRequest } from '@jellyfin/sdk/lib/generated-client'; +import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api'; +import { queryOptions, useQuery } from '@tanstack/react-query'; +import { type JellyfinApiContext, useApi } from 'hooks/useApi'; + +const getSeriesTimer = async ( + apiContext: JellyfinApiContext, + params: LiveTvApiGetSeriesTimerRequest, + options?: AxiosRequestConfig +) => { + const { api } = apiContext; + if (!api) throw new Error('No API instance available'); + const response = await getLiveTvApi(api).getSeriesTimer( + params, + options + ); + + return response.data; +}; + +export const getSeriesTimerQuery = ( + apiContext: JellyfinApiContext, + params: LiveTvApiGetSeriesTimerRequest +) => queryOptions({ + queryKey: ['SeriesTimer', params.timerId], + queryFn: ({ signal }) => getSeriesTimer(apiContext, params, { signal }), + enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.timerId +}); + +export const useGetSeriesTimer = (requestParameters: LiveTvApiGetSeriesTimerRequest) => { + const apiContext = useApi(); + return useQuery(getSeriesTimerQuery(apiContext, requestParameters)); +}; diff --git a/src/hooks/api/liveTvHooks/useGetTimer.ts b/src/hooks/api/liveTvHooks/useGetTimer.ts new file mode 100644 index 0000000000..f219dea059 --- /dev/null +++ b/src/hooks/api/liveTvHooks/useGetTimer.ts @@ -0,0 +1,34 @@ +import type { AxiosRequestConfig } from 'axios'; +import type { LiveTvApiGetTimerRequest } from '@jellyfin/sdk/lib/generated-client'; +import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api'; +import { queryOptions, useQuery } from '@tanstack/react-query'; +import { type JellyfinApiContext, useApi } from 'hooks/useApi'; + +const getTimer = async ( + currentApi: JellyfinApiContext, + params: LiveTvApiGetTimerRequest, + options?: AxiosRequestConfig +) => { + const { api } = currentApi; + if (!api) throw new Error('No API instance available'); + const response = await getLiveTvApi(api).getTimer( + params, + options + ); + + return response.data; +}; + +export const getTimerQuery = ( + apiContext: JellyfinApiContext, + params: LiveTvApiGetTimerRequest +) => queryOptions({ + queryKey: ['Timer', params.timerId], + queryFn: ({ signal }) => getTimer(apiContext, params, { signal }), + enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.timerId +}); + +export const useGetTimer = (requestParameters: LiveTvApiGetTimerRequest) => { + const apiContext = useApi(); + return useQuery(getTimerQuery(apiContext, requestParameters)); +}; diff --git a/src/hooks/api/videosHooks/index.ts b/src/hooks/api/videosHooks/index.ts new file mode 100644 index 0000000000..1c600b2209 --- /dev/null +++ b/src/hooks/api/videosHooks/index.ts @@ -0,0 +1 @@ +export * from './useDeleteAlternateSources'; diff --git a/src/hooks/api/videosHooks/useDeleteAlternateSources.ts b/src/hooks/api/videosHooks/useDeleteAlternateSources.ts new file mode 100644 index 0000000000..c504c1bef9 --- /dev/null +++ b/src/hooks/api/videosHooks/useDeleteAlternateSources.ts @@ -0,0 +1,23 @@ +import type { VideosApiDeleteAlternateSourcesRequest } from '@jellyfin/sdk/lib/generated-client'; +import { getVideosApi } from '@jellyfin/sdk/lib/utils/api/videos-api'; +import { useMutation } from '@tanstack/react-query'; +import { type JellyfinApiContext, useApi } from 'hooks/useApi'; + +const deleteAlternateSources = async ( + apiContext: JellyfinApiContext, + params: VideosApiDeleteAlternateSourcesRequest +) => { + const { api } = apiContext; + if (api) { + const response = await getVideosApi(api).deleteAlternateSources(params); + return response.data; + } +}; + +export const useDeleteAlternateSources = () => { + const apiContext = useApi(); + return useMutation({ + mutationFn: (params: VideosApiDeleteAlternateSourcesRequest) => + deleteAlternateSources(apiContext, params) + }); +}; From 690b1fbed549d316d09b0cf124269fdd54fa4989 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Sun, 8 Sep 2024 20:15:20 +0300 Subject: [PATCH 03/45] Add detail view buttons --- .../buttons/CancelSeriesTimerButton.tsx | 66 ++++++ .../components/buttons/CancelTimerButton.tsx | 58 +++++ .../components/buttons/DownloadButton.tsx | 42 ++++ .../components/buttons/InstantMixButton.tsx | 28 +++ .../components/buttons/MoreCommandsButton.tsx | 221 ++++++++++++++++++ .../components/buttons/PlayOrResumeButton.tsx | 87 +++++++ .../components/buttons/PlayTrailerButton.tsx | 28 +++ .../components/buttons/ShuffleButton.tsx | 29 +++ .../buttons/SplitVersionsButton.tsx | 65 ++++++ .../details/hooks/api/useGetItemByType.ts | 63 +++++ src/components/itemContextMenu.js | 9 +- 11 files changed, 692 insertions(+), 4 deletions(-) create mode 100644 src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx create mode 100644 src/apps/experimental/features/details/components/buttons/CancelTimerButton.tsx create mode 100644 src/apps/experimental/features/details/components/buttons/DownloadButton.tsx create mode 100644 src/apps/experimental/features/details/components/buttons/InstantMixButton.tsx create mode 100644 src/apps/experimental/features/details/components/buttons/MoreCommandsButton.tsx create mode 100644 src/apps/experimental/features/details/components/buttons/PlayOrResumeButton.tsx create mode 100644 src/apps/experimental/features/details/components/buttons/PlayTrailerButton.tsx create mode 100644 src/apps/experimental/features/details/components/buttons/ShuffleButton.tsx create mode 100644 src/apps/experimental/features/details/components/buttons/SplitVersionsButton.tsx create mode 100644 src/apps/experimental/features/details/hooks/api/useGetItemByType.ts diff --git a/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx b/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx new file mode 100644 index 0000000000..7f3acd1678 --- /dev/null +++ b/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx @@ -0,0 +1,66 @@ +import React, { FC, useCallback } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { IconButton } from '@mui/material'; +import DeleteIcon from '@mui/icons-material/Delete'; + +import { useCancelSeriesTimer } from 'hooks/api/liveTvHooks'; +import globalize from 'lib/globalize'; +import loading from 'components/loading/loading'; +import toast from 'components/toast/toast'; +import confirm from 'components/confirm/confirm'; + +interface CancelSeriesTimerButtonProps { + itemId: string; +} + +const CancelSeriesTimerButton: FC = ({ + itemId +}) => { + const navigate = useNavigate(); + const cancelSeriesTimer = useCancelSeriesTimer(); + + const onCancelSeriesTimerClick = useCallback(() => { + confirm({ + text: globalize.translate('MessageConfirmRecordingCancellation'), + primary: 'delete', + confirmText: globalize.translate('HeaderCancelSeries'), + cancelText: globalize.translate('HeaderKeepSeries') + }) + .then(function () { + loading.show(); + cancelSeriesTimer.mutate( + { + timerId: itemId + }, + { + onSuccess: async () => { + toast(globalize.translate('SeriesCancelled')); + loading.hide(); + navigate('/livetv.html'); + }, + onError: (err: unknown) => { + console.error( + '[cancelSeriesTimer] failed to cancel series timer', + err + ); + } + } + ); + }) + .catch(() => { + // confirm dialog closed + }); + }, [cancelSeriesTimer, navigate, itemId]); + + return ( + + + + ); +}; + +export default CancelSeriesTimerButton; diff --git a/src/apps/experimental/features/details/components/buttons/CancelTimerButton.tsx b/src/apps/experimental/features/details/components/buttons/CancelTimerButton.tsx new file mode 100644 index 0000000000..0687df7f5d --- /dev/null +++ b/src/apps/experimental/features/details/components/buttons/CancelTimerButton.tsx @@ -0,0 +1,58 @@ +import React, { FC, useCallback } from 'react'; +import { IconButton } from '@mui/material'; +import StopIcon from '@mui/icons-material/Stop'; +import { useQueryClient } from '@tanstack/react-query'; +import { useCancelTimer } from 'hooks/api/liveTvHooks'; +import globalize from 'lib/globalize'; +import loading from 'components/loading/loading'; +import toast from 'components/toast/toast'; + +interface CancelTimerButtonProps { + timerId: string; + queryKey?: string[]; +} + +const CancelTimerButton: FC = ({ + timerId, + queryKey +}) => { + const queryClient = useQueryClient(); + const cancelTimer = useCancelTimer(); + + const onCancelTimerClick = useCallback(() => { + loading.show(); + cancelTimer.mutate( + { + timerId: timerId + }, + { + onSuccess: async () => { + toast(globalize.translate('RecordingCancelled')); + loading.hide(); + await queryClient.invalidateQueries({ + queryKey + }); + }, + + onError: (err: unknown) => { + console.error( + '[cancelTimer] failed to cancel timer', + err + ); + } + } + ); + }, [cancelTimer, queryClient, queryKey, timerId]); + + return ( + + + + ); +}; + +export default CancelTimerButton; diff --git a/src/apps/experimental/features/details/components/buttons/DownloadButton.tsx b/src/apps/experimental/features/details/components/buttons/DownloadButton.tsx new file mode 100644 index 0000000000..284984239e --- /dev/null +++ b/src/apps/experimental/features/details/components/buttons/DownloadButton.tsx @@ -0,0 +1,42 @@ +import React, { FC, useCallback } from 'react'; +import { IconButton } from '@mui/material'; +import FileDownloadIcon from '@mui/icons-material/FileDownload'; +import { useGetDownload } from 'hooks/api/libraryHooks'; +import globalize from 'lib/globalize'; +import { download } from 'scripts/fileDownloader'; +import type { NullableString } from 'types/base/common/shared/types'; + +interface DownloadButtonProps { + itemId: string; + itemServerId: NullableString, + itemName: NullableString, + itemPath: NullableString, +} + +const DownloadButton: FC = ({ itemId, itemServerId, itemName, itemPath }) => { + const { data: downloadHref } = useGetDownload({ itemId }); + + const onDownloadClick = useCallback(async () => { + download([ + { + url: downloadHref, + itemId: itemId, + serverId: itemServerId, + title: itemName, + filename: itemPath?.replace(/^.*[\\/]/, '') + } + ]); + }, [downloadHref, itemId, itemName, itemPath, itemServerId]); + + return ( + + + + ); +}; + +export default DownloadButton; diff --git a/src/apps/experimental/features/details/components/buttons/InstantMixButton.tsx b/src/apps/experimental/features/details/components/buttons/InstantMixButton.tsx new file mode 100644 index 0000000000..9cb223178f --- /dev/null +++ b/src/apps/experimental/features/details/components/buttons/InstantMixButton.tsx @@ -0,0 +1,28 @@ +import React, { FC, useCallback } from 'react'; +import { IconButton } from '@mui/material'; +import ExploreIcon from '@mui/icons-material/Explore'; +import { playbackManager } from 'components/playback/playbackmanager'; +import globalize from 'lib/globalize'; +import type { ItemDto } from 'types/base/models/item-dto'; + +interface InstantMixButtonProps { + item?: ItemDto; +} + +const InstantMixButton: FC = ({ item }) => { + const onInstantMixClick = useCallback(() => { + playbackManager.instantMix(item); + }, [item]); + + return ( + + + + ); +}; + +export default InstantMixButton; diff --git a/src/apps/experimental/features/details/components/buttons/MoreCommandsButton.tsx b/src/apps/experimental/features/details/components/buttons/MoreCommandsButton.tsx new file mode 100644 index 0000000000..e679f9e772 --- /dev/null +++ b/src/apps/experimental/features/details/components/buttons/MoreCommandsButton.tsx @@ -0,0 +1,221 @@ +import React, { FC, useCallback, useMemo } from 'react'; +import { IconButton } from '@mui/material'; +import MoreVertIcon from '@mui/icons-material/MoreVert'; +import { useQueryClient } from '@tanstack/react-query'; +import { useApi } from 'hooks/useApi'; +import { useGetItemByType } from '../../hooks/api/useGetItemByType'; +import globalize from 'lib/globalize'; +import itemContextMenu from 'components/itemContextMenu'; +import { playbackManager } from 'components/playback/playbackmanager'; +import { appRouter } from 'components/router/appRouter'; + +import { ItemKind } from 'types/base/models/item-kind'; +import type { NullableString } from 'types/base/common/shared/types'; +import type { ItemDto } from 'types/base/models/item-dto'; + +interface PlayAllFromHereOptions { + item: ItemDto; + items: ItemDto[]; + serverId: NullableString; + queue?: boolean; +} + +function playAllFromHere(opts: PlayAllFromHereOptions) { + const { item, items, serverId, queue } = opts; + + const ids = []; + + let foundCard = false; + let startIndex; + + for (let i = 0, length = items?.length; i < length; i++) { + if (items[i] === item) { + foundCard = true; + startIndex = i; + } + if (foundCard || !queue) { + ids.push(items[i].Id); + } + } + + if (!ids.length) { + return; + } + + if (queue) { + return playbackManager.queue({ + ids, + serverId + }); + } else { + return playbackManager.play({ + ids, + serverId, + startIndex + }); + } +} + +export interface ContextMenuOpts { + open?: boolean; + play?: boolean; + playAllFromHere?: boolean; + queueAllFromHere?: boolean; + cancelTimer?: boolean; + record?: boolean; + deleteItem?: boolean; + shuffle?: boolean; + instantMix?: boolean; + share?: boolean; + stopPlayback?: boolean; + clearQueue?: boolean; + queue?: boolean; + playlist?: boolean; + edit?: boolean; + editImages?: boolean; + editSubtitles?: boolean; + identify?: boolean; + moremediainfo?: boolean; + openAlbum?: boolean; + openArtist?: boolean; + openLyrics?: boolean; +} + +interface MoreCommandsButtonProps { + className?: string; + itemType: ItemKind; + selectedItemId?: string; + itemId?: string; + items?: ItemDto[] | null; + collectionId?: NullableString; + playlistId?: NullableString; + canEditPlaylist?: boolean; + itemPlaylistItemId?: NullableString; + contextMenuOpts?: ContextMenuOpts; + queryKey?: string[]; +} + +const MoreCommandsButton: FC = ({ + className, + itemType, + selectedItemId, + itemId, + collectionId, + playlistId, + canEditPlaylist, + itemPlaylistItemId, + contextMenuOpts, + items, + queryKey +}) => { + const { user } = useApi(); + const queryClient = useQueryClient(); + const { data: item } = useGetItemByType({ + itemType, + itemId: selectedItemId || itemId + }); + const parentId = item?.SeasonId || item?.SeriesId || item?.ParentId; + + const playlistItem = useMemo(() => { + let PlaylistItemId: string | null = null; + let PlaylistIndex = -1; + let PlaylistItemCount = 0; + + if (playlistId) { + PlaylistItemId = itemPlaylistItemId || null; + + if (items?.length) { + PlaylistItemCount = items.length; + PlaylistIndex = items.findIndex(listItem => listItem.PlaylistItemId === PlaylistItemId); + } + } + return { PlaylistItemId, PlaylistIndex, PlaylistItemCount }; + }, [itemPlaylistItemId, items, playlistId]); + + const defaultMenuOptions = useMemo(() => { + return { + + item: { + ...item, + ...playlistItem + }, + user: user, + play: true, + queue: true, + playAllFromHere: item?.Type === ItemKind.Season || !item?.IsFolder, + queueAllFromHere: !item?.IsFolder, + canEditPlaylist: canEditPlaylist, + playlistId: playlistId, + collectionId: collectionId, + ...contextMenuOpts + }; + }, [canEditPlaylist, collectionId, contextMenuOpts, item, playlistId, playlistItem, user]); + + const onMoreCommandsClick = useCallback( + async (e: React.MouseEvent) => { + itemContextMenu + .show({ + ...defaultMenuOptions, + positionTo: e.currentTarget + }) + .then(async function (result) { + if (result.command === 'playallfromhere') { + console.log('handleItemClick', { + item, + items: items || [], + serverId: item?.ServerId + }); + playAllFromHere({ + item: item || {}, + items: items || [], + serverId: item?.ServerId + }); + } else if (result.command === 'queueallfromhere') { + playAllFromHere({ + item: item || {}, + items: items || [], + serverId: item?.ServerId, + queue: true + }); + } else if (result.deleted) { + if (result?.itemId !== itemId) { + await queryClient.invalidateQueries({ + queryKey + }); + } else if (parentId) { + appRouter.showItem(parentId, item?.ServerId); + } else { + await appRouter.goHome(); + } + } else if (result.updated) { + await queryClient.invalidateQueries({ + queryKey + }); + } + }) + .catch(() => { + /* no-op */ + }); + }, + [defaultMenuOptions, item, itemId, items, parentId, queryClient, queryKey] + ); + + if ( + item + && itemContextMenu.getCommands(defaultMenuOptions).length + ) { + return ( + + + + ); + } + + return null; +}; + +export default MoreCommandsButton; diff --git a/src/apps/experimental/features/details/components/buttons/PlayOrResumeButton.tsx b/src/apps/experimental/features/details/components/buttons/PlayOrResumeButton.tsx new file mode 100644 index 0000000000..faed1104cc --- /dev/null +++ b/src/apps/experimental/features/details/components/buttons/PlayOrResumeButton.tsx @@ -0,0 +1,87 @@ +import React, { FC, useCallback, useMemo } from 'react'; +import { IconButton } from '@mui/material'; +import PlayArrowIcon from '@mui/icons-material/PlayArrow'; +import ReplayIcon from '@mui/icons-material/Replay'; +import { useQueryClient } from '@tanstack/react-query'; +import { useApi } from 'hooks/useApi'; +import { getChannelQuery } from 'hooks/api/liveTvHooks/useGetChannel'; +import globalize from 'lib/globalize'; +import { playbackManager } from 'components/playback/playbackmanager'; +import type { ItemDto } from 'types/base/models/item-dto'; +import { ItemKind } from 'types/base/models/item-kind'; +import itemHelper from 'components/itemHelper'; + +interface PlayOrResumeButtonProps { + item: ItemDto; + isResumable?: boolean; + selectedMediaSourceId?: string | null; + selectedAudioTrack?: number; + selectedSubtitleTrack?: number; +} + +const PlayOrResumeButton: FC = ({ + item, + isResumable, + selectedMediaSourceId, + selectedAudioTrack, + selectedSubtitleTrack +}) => { + const apiContext = useApi(); + const queryClient = useQueryClient(); + + const playOptions = useMemo(() => { + if (itemHelper.supportsMediaSourceSelection(item)) { + return { + startPositionTicks: + item.UserData && isResumable ? + item.UserData.PlaybackPositionTicks : + 0, + mediaSourceId: selectedMediaSourceId, + audioStreamIndex: selectedAudioTrack || null, + subtitleStreamIndex: selectedSubtitleTrack + }; + } + }, [ + item, + isResumable, + selectedMediaSourceId, + selectedAudioTrack, + selectedSubtitleTrack + ]); + + const onPlayClick = useCallback(async () => { + if (item.Type === ItemKind.Program && item.ChannelId) { + const channel = await queryClient.fetchQuery( + getChannelQuery(apiContext, { + channelId: item.ChannelId + }) + ); + playbackManager.play({ + items: [channel] + }); + return; + } + + playbackManager.play({ + items: [item], + ...playOptions + }); + }, [apiContext, item, playOptions, queryClient]); + + return ( + + {isResumable ? : } + + ); +}; + +export default PlayOrResumeButton; diff --git a/src/apps/experimental/features/details/components/buttons/PlayTrailerButton.tsx b/src/apps/experimental/features/details/components/buttons/PlayTrailerButton.tsx new file mode 100644 index 0000000000..0c82c06690 --- /dev/null +++ b/src/apps/experimental/features/details/components/buttons/PlayTrailerButton.tsx @@ -0,0 +1,28 @@ +import React, { FC, useCallback } from 'react'; +import { IconButton } from '@mui/material'; +import TheatersIcon from '@mui/icons-material/Theaters'; +import { playbackManager } from 'components/playback/playbackmanager'; +import globalize from 'lib/globalize'; +import type { ItemDto } from 'types/base/models/item-dto'; + +interface PlayTrailerButtonProps { + item?: ItemDto; +} + +const PlayTrailerButton: FC = ({ item }) => { + const onPlayTrailerClick = useCallback(async () => { + await playbackManager.playTrailers(item); + }, [item]); + + return ( + + + + ); +}; + +export default PlayTrailerButton; diff --git a/src/apps/experimental/features/details/components/buttons/ShuffleButton.tsx b/src/apps/experimental/features/details/components/buttons/ShuffleButton.tsx new file mode 100644 index 0000000000..258e26fc79 --- /dev/null +++ b/src/apps/experimental/features/details/components/buttons/ShuffleButton.tsx @@ -0,0 +1,29 @@ +import React, { FC, useCallback } from 'react'; +import { IconButton } from '@mui/material'; +import ShuffleIcon from '@mui/icons-material/Shuffle'; + +import { playbackManager } from 'components/playback/playbackmanager'; +import globalize from 'lib/globalize'; +import type { ItemDto } from 'types/base/models/item-dto'; + +interface ShuffleButtonProps { + item: ItemDto; +} + +const ShuffleButton: FC = ({ item }) => { + const shuffle = useCallback(() => { + playbackManager.shuffle(item); + }, [item]); + + return ( + + + + ); +}; + +export default ShuffleButton; diff --git a/src/apps/experimental/features/details/components/buttons/SplitVersionsButton.tsx b/src/apps/experimental/features/details/components/buttons/SplitVersionsButton.tsx new file mode 100644 index 0000000000..b7bb101693 --- /dev/null +++ b/src/apps/experimental/features/details/components/buttons/SplitVersionsButton.tsx @@ -0,0 +1,65 @@ +import React, { FC, useCallback } from 'react'; +import { IconButton } from '@mui/material'; +import CallSplitIcon from '@mui/icons-material/CallSplit'; +import { useQueryClient } from '@tanstack/react-query'; +import { useDeleteAlternateSources } from 'hooks/api/videosHooks'; +import globalize from 'lib/globalize'; +import confirm from 'components/confirm/confirm'; +import loading from 'components/loading/loading'; + +interface SplitVersionsButtonProps { + paramId: string; + queryKey?: string[]; +} + +const SplitVersionsButton: FC = ({ + paramId, + queryKey +}) => { + const queryClient = useQueryClient(); + const deleteAlternateSources = useDeleteAlternateSources(); + + const splitVersions = useCallback(() => { + confirm({ + title: globalize.translate('HeaderSplitMediaApart'), + text: globalize.translate('MessageConfirmSplitMediaSources') + }) + .then(function () { + loading.show(); + deleteAlternateSources.mutate( + { + itemId: paramId + }, + { + onSuccess: async () => { + loading.hide(); + await queryClient.invalidateQueries({ + queryKey + }); + }, + onError: (err: unknown) => { + console.error( + '[splitVersions] failed to delete Videos', + err + ); + } + } + ); + }) + .catch(() => { + // confirm dialog closed + }); + }, [deleteAlternateSources, paramId, queryClient, queryKey]); + + return ( + + + + ); +}; + +export default SplitVersionsButton; diff --git a/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts b/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts new file mode 100644 index 0000000000..dc72771b40 --- /dev/null +++ b/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts @@ -0,0 +1,63 @@ +import type { AxiosRequestConfig } from 'axios'; +import { getUserLibraryApi } from '@jellyfin/sdk/lib/utils/api/user-library-api'; +import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api'; +import { useQuery } from '@tanstack/react-query'; +import { type JellyfinApiContext, useApi } from 'hooks/useApi'; +import type { ItemDto } from 'types/base/models/item-dto'; +import type{ NullableString } from 'types/base/common/shared/types'; +import { ItemKind } from 'types/base/models/item-kind'; + +const getItemByType = async ( + apiContext: JellyfinApiContext, + itemType: ItemKind, + itemId: NullableString, + options?: AxiosRequestConfig +) => { + const { api, user } = apiContext; + if (!api) throw new Error('No API instance available'); + if (!user?.Id) throw new Error('No User ID provided'); + if (!itemId) throw new Error('No item ID provided'); + + let response; + switch (itemType) { + case ItemKind.Timer: { + response = await getLiveTvApi(api).getTimer( + { timerId: itemId }, + options + ); + break; + } + case ItemKind.SeriesTimer: + response = await getLiveTvApi(api).getSeriesTimer( + { timerId: itemId }, + options + ); + break; + default: { + response = await getUserLibraryApi(api).getItem( + { userId: user.Id, itemId }, + options + ); + break; + } + } + return response.data as ItemDto; +}; + +interface UseGetItemByTypeProps { + itemType: ItemKind; + itemId: NullableString; +} + +export const useGetItemByType = ({ + itemType, + itemId +}: UseGetItemByTypeProps) => { + const apiContext = useApi(); + return useQuery({ + queryKey: ['ItemByType', { itemType, itemId }], + queryFn: ({ signal }) => + getItemByType(apiContext, itemType, itemId, { signal }), + enabled: !!apiContext.api && !!apiContext.user?.Id && !!itemId + }); +}; diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index ee70af15cf..42b6885fab 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -351,12 +351,13 @@ export function getCommands(options) { return commands; } -function getResolveFunction(resolve, id, changed, deleted) { +function getResolveFunction(resolve, commandId, changed, deleted, itemId) { return function () { resolve({ - command: id, + command: commandId, updated: changed, - deleted: deleted + deleted: deleted, + itemId: itemId }); }; } @@ -533,7 +534,7 @@ function executeCommand(item, id, options) { getResolveFunction(resolve, id)(); break; case 'delete': - deleteItem(apiClient, item).then(getResolveFunction(resolve, id, true, true), getResolveFunction(resolve, id)); + deleteItem(apiClient, item).then(getResolveFunction(resolve, id, true, true, itemId), getResolveFunction(resolve, id)); break; case 'share': navigator.share({ From 49b0ba3071bb77bee9fff31d346c737c0cf70163 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Mon, 9 Sep 2024 02:30:21 +0300 Subject: [PATCH 04/45] apply suggestion Co-authored-by: dmitrylyzo <56478732+dmitrylyzo@users.noreply.github.com> --- .../details/components/buttons/CancelSeriesTimerButton.tsx | 2 ++ .../details/components/buttons/CancelTimerButton.tsx | 2 ++ .../details/components/buttons/MoreCommandsButton.tsx | 6 ++---- .../details/components/buttons/PlayOrResumeButton.tsx | 2 +- .../features/details/components/buttons/ShuffleButton.tsx | 2 +- .../details/components/buttons/SplitVersionsButton.tsx | 5 ++++- .../features/details/hooks/api/useGetItemByType.ts | 6 ++---- src/strings/en-us.json | 3 +++ 8 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx b/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx index 7f3acd1678..2f9cb360b7 100644 --- a/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx +++ b/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx @@ -39,6 +39,8 @@ const CancelSeriesTimerButton: FC = ({ navigate('/livetv.html'); }, onError: (err: unknown) => { + loading.hide(); + toast(globalize.translate('MessageCancelSeriesTimerError')); console.error( '[cancelSeriesTimer] failed to cancel series timer', err diff --git a/src/apps/experimental/features/details/components/buttons/CancelTimerButton.tsx b/src/apps/experimental/features/details/components/buttons/CancelTimerButton.tsx index 0687df7f5d..0745bc204e 100644 --- a/src/apps/experimental/features/details/components/buttons/CancelTimerButton.tsx +++ b/src/apps/experimental/features/details/components/buttons/CancelTimerButton.tsx @@ -35,6 +35,8 @@ const CancelTimerButton: FC = ({ }, onError: (err: unknown) => { + loading.hide(); + toast(globalize.translate('MessageCancelTimerError')); console.error( '[cancelTimer] failed to cancel timer', err diff --git a/src/apps/experimental/features/details/components/buttons/MoreCommandsButton.tsx b/src/apps/experimental/features/details/components/buttons/MoreCommandsButton.tsx index e679f9e772..e767712364 100644 --- a/src/apps/experimental/features/details/components/buttons/MoreCommandsButton.tsx +++ b/src/apps/experimental/features/details/components/buttons/MoreCommandsButton.tsx @@ -82,7 +82,6 @@ export interface ContextMenuOpts { } interface MoreCommandsButtonProps { - className?: string; itemType: ItemKind; selectedItemId?: string; itemId?: string; @@ -96,7 +95,6 @@ interface MoreCommandsButtonProps { } const MoreCommandsButton: FC = ({ - className, itemType, selectedItemId, itemId, @@ -112,7 +110,7 @@ const MoreCommandsButton: FC = ({ const queryClient = useQueryClient(); const { data: item } = useGetItemByType({ itemType, - itemId: selectedItemId || itemId + itemId: selectedItemId || itemId || '' }); const parentId = item?.SeasonId || item?.SeriesId || item?.ParentId; @@ -206,7 +204,7 @@ const MoreCommandsButton: FC = ({ ) { return ( diff --git a/src/apps/experimental/features/details/components/buttons/PlayOrResumeButton.tsx b/src/apps/experimental/features/details/components/buttons/PlayOrResumeButton.tsx index faed1104cc..a52453656f 100644 --- a/src/apps/experimental/features/details/components/buttons/PlayOrResumeButton.tsx +++ b/src/apps/experimental/features/details/components/buttons/PlayOrResumeButton.tsx @@ -70,7 +70,7 @@ const PlayOrResumeButton: FC = ({ return ( = ({ item }) => { return ( diff --git a/src/apps/experimental/features/details/components/buttons/SplitVersionsButton.tsx b/src/apps/experimental/features/details/components/buttons/SplitVersionsButton.tsx index b7bb101693..6754281be0 100644 --- a/src/apps/experimental/features/details/components/buttons/SplitVersionsButton.tsx +++ b/src/apps/experimental/features/details/components/buttons/SplitVersionsButton.tsx @@ -6,6 +6,7 @@ import { useDeleteAlternateSources } from 'hooks/api/videosHooks'; import globalize from 'lib/globalize'; import confirm from 'components/confirm/confirm'; import loading from 'components/loading/loading'; +import toast from 'components/toast/toast'; interface SplitVersionsButtonProps { paramId: string; @@ -38,8 +39,10 @@ const SplitVersionsButton: FC = ({ }); }, onError: (err: unknown) => { + loading.hide(); + toast(globalize.translate('MessageSplitVersionsError')); console.error( - '[splitVersions] failed to delete Videos', + '[splitVersions] failed to split versions', err ); } diff --git a/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts b/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts index dc72771b40..3cb2a9c716 100644 --- a/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts +++ b/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts @@ -4,19 +4,17 @@ import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api'; import { useQuery } from '@tanstack/react-query'; import { type JellyfinApiContext, useApi } from 'hooks/useApi'; import type { ItemDto } from 'types/base/models/item-dto'; -import type{ NullableString } from 'types/base/common/shared/types'; import { ItemKind } from 'types/base/models/item-kind'; const getItemByType = async ( apiContext: JellyfinApiContext, itemType: ItemKind, - itemId: NullableString, + itemId: string, options?: AxiosRequestConfig ) => { const { api, user } = apiContext; if (!api) throw new Error('No API instance available'); if (!user?.Id) throw new Error('No User ID provided'); - if (!itemId) throw new Error('No item ID provided'); let response; switch (itemType) { @@ -46,7 +44,7 @@ const getItemByType = async ( interface UseGetItemByTypeProps { itemType: ItemKind; - itemId: NullableString; + itemId: string; } export const useGetItemByType = ({ diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 560b469b90..f75735aa21 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1045,6 +1045,9 @@ "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?", "MessageAreYouSureYouWishToRemoveMediaFolder": "Are you sure you wish to remove this media folder?", "MessageBrowsePluginCatalog": "Browse our plugin catalog to view available plugins.", + "MessageCancelSeriesTimerError": "An error occurred while cancel series timer", + "MessageCancelTimerError": "An error occurred while cancel timer", + "MessageSplitVersionsError": "An error occurred while split versions", "MessageChangeRecordingPath": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.", "MessageConfirmAppExit": "Do you want to exit?", "MessageConfirmDeleteGuideProvider": "Are you sure you wish to delete this guide provider?", From 1c18fa8fb2e18c277ae38487418096aea15573a6 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Tue, 10 Sep 2024 04:46:48 +0300 Subject: [PATCH 05/45] apply suggestion Co-authored-by: dmitrylyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/strings/en-us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/en-us.json b/src/strings/en-us.json index f75735aa21..eed6dc6722 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1047,7 +1047,6 @@ "MessageBrowsePluginCatalog": "Browse our plugin catalog to view available plugins.", "MessageCancelSeriesTimerError": "An error occurred while cancel series timer", "MessageCancelTimerError": "An error occurred while cancel timer", - "MessageSplitVersionsError": "An error occurred while split versions", "MessageChangeRecordingPath": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.", "MessageConfirmAppExit": "Do you want to exit?", "MessageConfirmDeleteGuideProvider": "Are you sure you wish to delete this guide provider?", @@ -1100,6 +1099,7 @@ "MessageRenameMediaFolder": "Renaming a media library will cause all metadata to be lost, proceed with caution.", "MessageRepositoryInstallDisclaimer": "WARNING: Installing a third party plugin repository carries risks. It may contain unstable or malicious code, and may change at any time. Only install repositories from authors that you trust.", "MessageSent": "Message sent.", + "MessageSplitVersionsError": "An error occurred while split versions", "MessageSyncPlayCreateGroupDenied": "Permission required to create a group.", "MessageSyncPlayDisabled": "SyncPlay disabled.", "MessageSyncPlayEnabled": "SyncPlay enabled.", From c5bbd5bca9fbf54e6bb035fa7c85b0b1b01ac159 Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Tue, 24 Sep 2024 04:15:12 +0300 Subject: [PATCH 06/45] apply suggestion Co-authored-by: Bill Thornton --- .../details/hooks/api/useGetItemByType.ts | 5 ++-- src/hooks/api/libraryHooks/useGetDownload.ts | 26 ++++++++----------- .../api/liveTvHooks/useCancelSeriesTimer.ts | 9 ++++--- src/hooks/api/liveTvHooks/useCancelTimer.ts | 9 ++++--- src/hooks/api/liveTvHooks/useGetChannel.ts | 21 ++++++++------- .../api/liveTvHooks/useGetSeriesTimer.ts | 23 ++++++++-------- src/hooks/api/liveTvHooks/useGetTimer.ts | 19 +++++++------- .../videosHooks/useDeleteAlternateSources.ts | 9 ++++--- src/strings/en-us.json | 6 ++--- 9 files changed, 64 insertions(+), 63 deletions(-) diff --git a/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts b/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts index 3cb2a9c716..c2966e97d4 100644 --- a/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts +++ b/src/apps/experimental/features/details/hooks/api/useGetItemByType.ts @@ -13,8 +13,9 @@ const getItemByType = async ( options?: AxiosRequestConfig ) => { const { api, user } = apiContext; - if (!api) throw new Error('No API instance available'); - if (!user?.Id) throw new Error('No User ID provided'); + + if (!api) throw new Error('[getItemByType] No API instance available'); + if (!user?.Id) throw new Error('[getItemByType] No User ID provided'); let response; switch (itemType) { diff --git a/src/hooks/api/libraryHooks/useGetDownload.ts b/src/hooks/api/libraryHooks/useGetDownload.ts index 031e0e49b8..a57b7b4c01 100644 --- a/src/hooks/api/libraryHooks/useGetDownload.ts +++ b/src/hooks/api/libraryHooks/useGetDownload.ts @@ -10,29 +10,25 @@ const getDownload = async ( options?: AxiosRequestConfig ) => { const { api, user } = apiContext; - if (!api) throw new Error('No API instance available'); - if (!user?.Id) throw new Error('No User ID provided'); - const response = await getLibraryApi(api).getDownload( - params, - options - ); + if (!api) throw new Error('[getDownload] No API instance available'); + if (!user?.Id) throw new Error('[getDownload] No User ID provided'); + + const response = await getLibraryApi(api).getDownload(params, options); return response.data; }; export const getDownloadQuery = ( apiContext: JellyfinApiContext, params: LibraryApiGetDownloadRequest -) => queryOptions({ - queryKey: ['Download', params.itemId], - queryFn: ({ signal }) => - getDownload(apiContext, params, { signal }), - enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.itemId -}); +) => + queryOptions({ + queryKey: ['Download', params.itemId], + queryFn: ({ signal }) => getDownload(apiContext, params, { signal }), + enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.itemId + }); -export const useGetDownload = ( - params: LibraryApiGetDownloadRequest -) => { +export const useGetDownload = (params: LibraryApiGetDownloadRequest) => { const apiContext = useApi(); return useQuery(getDownloadQuery(apiContext, params)); }; diff --git a/src/hooks/api/liveTvHooks/useCancelSeriesTimer.ts b/src/hooks/api/liveTvHooks/useCancelSeriesTimer.ts index 85c98b00e5..20747299ea 100644 --- a/src/hooks/api/liveTvHooks/useCancelSeriesTimer.ts +++ b/src/hooks/api/liveTvHooks/useCancelSeriesTimer.ts @@ -8,10 +8,11 @@ const cancelSeriesTimer = async ( params: LiveTvApiCancelSeriesTimerRequest ) => { const { api } = apiContext; - if (api) { - const response = await getLiveTvApi(api).cancelSeriesTimer(params); - return response.data; - } + + if (!api) throw new Error('[cancelSeriesTimer] No API instance available'); + + const response = await getLiveTvApi(api).cancelSeriesTimer(params); + return response.data; }; export const useCancelSeriesTimer = () => { diff --git a/src/hooks/api/liveTvHooks/useCancelTimer.ts b/src/hooks/api/liveTvHooks/useCancelTimer.ts index 7ef8985cba..ed5b7846bf 100644 --- a/src/hooks/api/liveTvHooks/useCancelTimer.ts +++ b/src/hooks/api/liveTvHooks/useCancelTimer.ts @@ -8,10 +8,11 @@ const cancelTimer = async ( params: LiveTvApiCancelTimerRequest ) => { const { api } = apiContext; - if (api) { - const response = await getLiveTvApi(api).cancelTimer(params); - return response.data; - } + + if (!api) throw new Error('[cancelTimer] No API instance available'); + + const response = await getLiveTvApi(api).cancelTimer(params); + return response.data; }; export const useCancelTimer = () => { diff --git a/src/hooks/api/liveTvHooks/useGetChannel.ts b/src/hooks/api/liveTvHooks/useGetChannel.ts index 93e241880c..53b119d485 100644 --- a/src/hooks/api/liveTvHooks/useGetChannel.ts +++ b/src/hooks/api/liveTvHooks/useGetChannel.ts @@ -10,8 +10,9 @@ const getChannel = async ( options?: AxiosRequestConfig ) => { const { api, user } = apiContext; - if (!api) throw new Error('No API instance available'); - if (!user?.Id) throw new Error('No User ID provided'); + + if (!api) throw new Error('[getChannel] No API instance available'); + if (!user?.Id) throw new Error('[getChannel] No User ID provided'); const response = await getLiveTvApi(api).getChannel( { @@ -26,15 +27,15 @@ const getChannel = async ( export const getChannelQuery = ( apiContext: JellyfinApiContext, params: LiveTvApiGetChannelRequest -) => queryOptions({ - queryKey: ['Channel', params.channelId], - queryFn: ({ signal }) => getChannel(apiContext, params, { signal }), - enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.channelId -}); +) => + queryOptions({ + queryKey: ['Channel', params.channelId], + queryFn: ({ signal }) => getChannel(apiContext, params, { signal }), + enabled: + !!apiContext.api && !!apiContext.user?.Id && !!params.channelId + }); -export const useGetChannel = ( - params: LiveTvApiGetChannelRequest -) => { +export const useGetChannel = (params: LiveTvApiGetChannelRequest) => { const apiContext = useApi(); return useQuery(getChannelQuery(apiContext, params)); }; diff --git a/src/hooks/api/liveTvHooks/useGetSeriesTimer.ts b/src/hooks/api/liveTvHooks/useGetSeriesTimer.ts index d7342902a2..91e43baf72 100644 --- a/src/hooks/api/liveTvHooks/useGetSeriesTimer.ts +++ b/src/hooks/api/liveTvHooks/useGetSeriesTimer.ts @@ -10,25 +10,26 @@ const getSeriesTimer = async ( options?: AxiosRequestConfig ) => { const { api } = apiContext; - if (!api) throw new Error('No API instance available'); - const response = await getLiveTvApi(api).getSeriesTimer( - params, - options - ); + if (!api) throw new Error('[getSeriesTimer] No API instance available'); + + const response = await getLiveTvApi(api).getSeriesTimer(params, options); return response.data; }; export const getSeriesTimerQuery = ( apiContext: JellyfinApiContext, params: LiveTvApiGetSeriesTimerRequest -) => queryOptions({ - queryKey: ['SeriesTimer', params.timerId], - queryFn: ({ signal }) => getSeriesTimer(apiContext, params, { signal }), - enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.timerId -}); +) => + queryOptions({ + queryKey: ['SeriesTimer', params.timerId], + queryFn: ({ signal }) => getSeriesTimer(apiContext, params, { signal }), + enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.timerId + }); -export const useGetSeriesTimer = (requestParameters: LiveTvApiGetSeriesTimerRequest) => { +export const useGetSeriesTimer = ( + requestParameters: LiveTvApiGetSeriesTimerRequest +) => { const apiContext = useApi(); return useQuery(getSeriesTimerQuery(apiContext, requestParameters)); }; diff --git a/src/hooks/api/liveTvHooks/useGetTimer.ts b/src/hooks/api/liveTvHooks/useGetTimer.ts index f219dea059..f328ebfd7a 100644 --- a/src/hooks/api/liveTvHooks/useGetTimer.ts +++ b/src/hooks/api/liveTvHooks/useGetTimer.ts @@ -10,23 +10,22 @@ const getTimer = async ( options?: AxiosRequestConfig ) => { const { api } = currentApi; - if (!api) throw new Error('No API instance available'); - const response = await getLiveTvApi(api).getTimer( - params, - options - ); + if (!api) throw new Error('[getTimer] No API instance available'); + + const response = await getLiveTvApi(api).getTimer(params, options); return response.data; }; export const getTimerQuery = ( apiContext: JellyfinApiContext, params: LiveTvApiGetTimerRequest -) => queryOptions({ - queryKey: ['Timer', params.timerId], - queryFn: ({ signal }) => getTimer(apiContext, params, { signal }), - enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.timerId -}); +) => + queryOptions({ + queryKey: ['Timer', params.timerId], + queryFn: ({ signal }) => getTimer(apiContext, params, { signal }), + enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.timerId + }); export const useGetTimer = (requestParameters: LiveTvApiGetTimerRequest) => { const apiContext = useApi(); diff --git a/src/hooks/api/videosHooks/useDeleteAlternateSources.ts b/src/hooks/api/videosHooks/useDeleteAlternateSources.ts index c504c1bef9..6378a236a9 100644 --- a/src/hooks/api/videosHooks/useDeleteAlternateSources.ts +++ b/src/hooks/api/videosHooks/useDeleteAlternateSources.ts @@ -8,10 +8,11 @@ const deleteAlternateSources = async ( params: VideosApiDeleteAlternateSourcesRequest ) => { const { api } = apiContext; - if (api) { - const response = await getVideosApi(api).deleteAlternateSources(params); - return response.data; - } + + if (!api) throw new Error('[deleteAlternateSources] No API instance available'); + + const response = await getVideosApi(api).deleteAlternateSources(params); + return response.data; }; export const useDeleteAlternateSources = () => { diff --git a/src/strings/en-us.json b/src/strings/en-us.json index eed6dc6722..a707b0a3c8 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1045,8 +1045,8 @@ "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?", "MessageAreYouSureYouWishToRemoveMediaFolder": "Are you sure you wish to remove this media folder?", "MessageBrowsePluginCatalog": "Browse our plugin catalog to view available plugins.", - "MessageCancelSeriesTimerError": "An error occurred while cancel series timer", - "MessageCancelTimerError": "An error occurred while cancel timer", + "MessageCancelSeriesTimerError": "An error occurred while canceling the series timer", + "MessageCancelTimerError": "An error occurred while canceling the timer", "MessageChangeRecordingPath": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.", "MessageConfirmAppExit": "Do you want to exit?", "MessageConfirmDeleteGuideProvider": "Are you sure you wish to delete this guide provider?", @@ -1099,7 +1099,7 @@ "MessageRenameMediaFolder": "Renaming a media library will cause all metadata to be lost, proceed with caution.", "MessageRepositoryInstallDisclaimer": "WARNING: Installing a third party plugin repository carries risks. It may contain unstable or malicious code, and may change at any time. Only install repositories from authors that you trust.", "MessageSent": "Message sent.", - "MessageSplitVersionsError": "An error occurred while split versions", + "MessageSplitVersionsError": "An error occurred while splitting versions", "MessageSyncPlayCreateGroupDenied": "Permission required to create a group.", "MessageSyncPlayDisabled": "SyncPlay disabled.", "MessageSyncPlayEnabled": "SyncPlay enabled.", From 74c735dbd0327d67927ffb99413368ce953ba55a Mon Sep 17 00:00:00 2001 From: David Murdoch <187813+davidmurdoch@users.noreply.github.com> Date: Wed, 24 May 2023 15:50:09 -0400 Subject: [PATCH 07/45] Fix movies Shuffle button --- src/controllers/movies/movies.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 717d197e74..ea71569e35 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -31,11 +31,11 @@ export default function (view, params, tabContent, options) { } function shuffle() { - ApiClient.getItem( - ApiClient.getCurrentUserId(), - params.topParentId - ).then((item) => { - playbackManager.shuffle(item); + isLoading = true; + loading.show(); + const newQuery = { ...query, SortBy: 'Random' }; + return ApiClient.getItems(ApiClient.getCurrentUserId(), newQuery).then(({ Items }) => { + playbackManager.shuffle(Items[0]); }); } From f52ac7a96dd6c633674ada9579197a26e3ea7760 Mon Sep 17 00:00:00 2001 From: David Murdoch <187813+davidmurdoch@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:43:23 -0400 Subject: [PATCH 08/45] Limit number of results returned since we only use 1 --- src/controllers/movies/movies.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index ea71569e35..889a95ffb1 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -33,7 +33,7 @@ export default function (view, params, tabContent, options) { function shuffle() { isLoading = true; loading.show(); - const newQuery = { ...query, SortBy: 'Random' }; + const newQuery = { ...query, SortBy: 'Random', Limit: 1 }; return ApiClient.getItems(ApiClient.getCurrentUserId(), newQuery).then(({ Items }) => { playbackManager.shuffle(Items[0]); }); From bb78451102cffdedaa98a2281c6461ae8bf59307 Mon Sep 17 00:00:00 2001 From: David Murdoch <187813+davidmurdoch@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:49:41 -0400 Subject: [PATCH 09/45] Update src/controllers/movies/movies.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/controllers/movies/movies.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 889a95ffb1..42da3a7142 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -36,6 +36,8 @@ export default function (view, params, tabContent, options) { const newQuery = { ...query, SortBy: 'Random', Limit: 1 }; return ApiClient.getItems(ApiClient.getCurrentUserId(), newQuery).then(({ Items }) => { playbackManager.shuffle(Items[0]); + }).finally(() => { + isLoading = false; }); } From 6b14f2531ba215154f8453586525d55407292e63 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 19:49:34 +0000 Subject: [PATCH 10/45] Update dependency @types/react to v18.3.8 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d86bc72eb3..932b580334 100644 --- a/package-lock.json +++ b/package-lock.json @@ -77,7 +77,7 @@ "@types/loadable__component": "5.13.9", "@types/lodash-es": "4.17.12", "@types/markdown-it": "14.1.2", - "@types/react": "18.3.7", + "@types/react": "18.3.8", "@types/react-dom": "18.3.0", "@types/sortablejs": "1.15.8", "@typescript-eslint/eslint-plugin": "5.62.0", @@ -6549,9 +6549,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.7.tgz", - "integrity": "sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==", + "version": "18.3.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz", + "integrity": "sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -30242,9 +30242,9 @@ "dev": true }, "@types/react": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.7.tgz", - "integrity": "sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==", + "version": "18.3.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz", + "integrity": "sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==", "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" diff --git a/package.json b/package.json index 2dad1c0a5f..ae579c41df 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@types/loadable__component": "5.13.9", "@types/lodash-es": "4.17.12", "@types/markdown-it": "14.1.2", - "@types/react": "18.3.7", + "@types/react": "18.3.8", "@types/react-dom": "18.3.0", "@types/sortablejs": "1.15.8", "@typescript-eslint/eslint-plugin": "5.62.0", From b32290c92d9ec21dd74b84032345c03722e93e1c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 19:49:45 +0000 Subject: [PATCH 11/45] Update dependency postcss to v8.4.47 --- package-lock.json | 63 +++++++++-------------------------------------- package.json | 2 +- 2 files changed, 12 insertions(+), 53 deletions(-) diff --git a/package-lock.json b/package-lock.json index d86bc72eb3..66e1d6efe9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -106,7 +106,7 @@ "html-webpack-plugin": "5.6.0", "jsdom": "25.0.0", "mini-css-extract-plugin": "2.9.1", - "postcss": "8.4.42", + "postcss": "8.4.47", "postcss-loader": "8.1.1", "postcss-preset-env": "10.0.3", "postcss-scss": "4.0.9", @@ -16838,9 +16838,9 @@ } }, "node_modules/postcss": { - "version": "8.4.42", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.42.tgz", - "integrity": "sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -16859,8 +16859,8 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -25649,34 +25649,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite/node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/vitest": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", @@ -37727,14 +37699,14 @@ "dev": true }, "postcss": { - "version": "8.4.42", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.42.tgz", - "integrity": "sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "requires": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" } }, "postcss-attribute-case-insensitive": { @@ -43647,19 +43619,6 @@ "fsevents": "~2.3.3", "postcss": "^8.4.43", "rollup": "^4.20.0" - }, - "dependencies": { - "postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - } - } } }, "vite-node": { diff --git a/package.json b/package.json index 2dad1c0a5f..8f290d4c17 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "html-webpack-plugin": "5.6.0", "jsdom": "25.0.0", "mini-css-extract-plugin": "2.9.1", - "postcss": "8.4.42", + "postcss": "8.4.47", "postcss-loader": "8.1.1", "postcss-preset-env": "10.0.3", "postcss-scss": "4.0.9", From ce4aded6545752fb2a34b7cef23b4f62cfb533d8 Mon Sep 17 00:00:00 2001 From: David Murdoch <187813+davidmurdoch@users.noreply.github.com> Date: Thu, 26 Sep 2024 16:15:18 -0400 Subject: [PATCH 12/45] Update src/controllers/movies/movies.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/controllers/movies/movies.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 42da3a7142..a8eabfce2b 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -33,9 +33,12 @@ export default function (view, params, tabContent, options) { function shuffle() { isLoading = true; loading.show(); - const newQuery = { ...query, SortBy: 'Random', Limit: 1 }; + const newQuery = { ...query, SortBy: 'Random', StartIndex: 0, Limit: 300 }; return ApiClient.getItems(ApiClient.getCurrentUserId(), newQuery).then(({ Items }) => { - playbackManager.shuffle(Items[0]); + playbackManager.play({ + items: Items, + autoplay: true + }); }).finally(() => { isLoading = false; }); From f2b9f8e9f7163fb1807b1bc96492f00ecb5e63a0 Mon Sep 17 00:00:00 2001 From: BromTeque Date: Thu, 26 Sep 2024 19:47:53 +0000 Subject: [PATCH 13/45] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)=20Translation:=20Jellyfin/Jellyfin=20Web=20Tran?= =?UTF-8?q?slate-URL:=20https://translate.jellyfin.org/projects/jellyfin/j?= =?UTF-8?q?ellyfin-web/nb=5FNO/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/strings/nb.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/strings/nb.json b/src/strings/nb.json index fd3d328087..d0e1dee15d 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -1011,7 +1011,7 @@ "Filters": "Filtre", "HeaderExternalIds": "Eksterne IDer", "HeaderFetcherSettings": "Henteinnstillinger", - "TabServer": "Server", + "TabServer": "Tjener", "TabStreaming": "Strømming", "TagsValue": "Tagger: {0}", "ThemeSongs": "Temamusikk", @@ -1949,5 +1949,14 @@ "LabelWidthResolutionsHelp": "Kommaseparert liste over breddene (px) som trickplay-bilder vil bli generert med. Alle bilder skal genereres proporsjonalt med kilden, så en bredde på 320 på en 16:9-video ender opp på rundt 320x180.", "LabelTileWidthHelp": "Maksimalt antall bilder per rad i X-retningen.", "LabelTileHeightHelp": "Maksimalt antall bilder per kolonne i Y-retningen.", - "LabelJpegQualityHelp": "JPEG-komprimeringskvaliteten for trickplay-bilder." + "LabelJpegQualityHelp": "JPEG-komprimeringskvaliteten for trickplay-bilder.", + "LabelAudioTagSettings": "Innstillinger for lydtager", + "LabelCustomTagDelimiters": "Egendefinert skilletegn for tagger", + "LabelCustomTagDelimitersHelp": "Tegn som skal behandles som skilletegn for å separere tagger.", + "LabelDelimiterWhitelist": "Hviteliste for skilletegn", + "LabelDelimiterWhitelistHelp": "Objekter som skal ekskluderes fra tagdeling. Ett objekt per linje.", + "PreferNonstandardArtistsTag": "Foretrekk ARTISTER-tag om tilgjengelig", + "PreferNonstandardArtistsTagHelp": "Bruk ikke-standard ARTISTS-taggen istedenfor ARTIST-taggen når den er tilgjengelig.", + "UseCustomTagDelimiters": "Bruk egendefinert skilletegn for tagger", + "UseCustomTagDelimitersHelp": "Del artist- og sjanger-tagger med egendefinert tegn." } From 15fc00cf435955a52e05831d32e9a0a15f0090cc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 00:35:17 +0000 Subject: [PATCH 14/45] Update dependency sass to v1.79.2 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d86bc72eb3..200a7d8355 100644 --- a/package-lock.json +++ b/package-lock.json @@ -110,7 +110,7 @@ "postcss-loader": "8.1.1", "postcss-preset-env": "10.0.3", "postcss-scss": "4.0.9", - "sass": "1.79.1", + "sass": "1.79.2", "sass-loader": "16.0.1", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", @@ -20195,9 +20195,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.1.tgz", - "integrity": "sha512-+mA7svoNKeL0DiJqZGeR/ZGUu8he4I8o3jyUcOFyo4eBJrwNgIMmAEwCMo/N2Y3wdjOBcRzoNxZIOtrtMX8EXg==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.2.tgz", + "integrity": "sha512-YmT1aoF1MwHsZEu/eXhbAJNsPGAhNP4UixW9ckEwWCvPcVdVF0/C104OGDVEqtoctKq0N+wM20O/rj+sSPsWeg==", "dev": true, "license": "MIT", "dependencies": { @@ -39732,9 +39732,9 @@ "dev": true }, "sass": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.1.tgz", - "integrity": "sha512-+mA7svoNKeL0DiJqZGeR/ZGUu8he4I8o3jyUcOFyo4eBJrwNgIMmAEwCMo/N2Y3wdjOBcRzoNxZIOtrtMX8EXg==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.2.tgz", + "integrity": "sha512-YmT1aoF1MwHsZEu/eXhbAJNsPGAhNP4UixW9ckEwWCvPcVdVF0/C104OGDVEqtoctKq0N+wM20O/rj+sSPsWeg==", "dev": true, "requires": { "chokidar": "^4.0.0", diff --git a/package.json b/package.json index 2dad1c0a5f..d9990d28db 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "postcss-loader": "8.1.1", "postcss-preset-env": "10.0.3", "postcss-scss": "4.0.9", - "sass": "1.79.1", + "sass": "1.79.2", "sass-loader": "16.0.1", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", From f4e2402fbc56a9a1b447f3daf4ba54dca80d3dc5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 04:33:27 +0000 Subject: [PATCH 15/45] Update dependency sass-embedded to v1.79.2 --- package-lock.json | 334 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 168 insertions(+), 168 deletions(-) diff --git a/package-lock.json b/package-lock.json index 932b580334..8f44310bd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -136,7 +136,7 @@ "yarn": "YARN NO LONGER USED - use npm instead." }, "optionalDependencies": { - "sass-embedded": "1.79.1" + "sass-embedded": "1.79.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -20213,9 +20213,9 @@ } }, "node_modules/sass-embedded": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.1.tgz", - "integrity": "sha512-UIgG9sHZZ1fT28bxOGi6RUTyvuNvnNQ5nUCdeDGOiS+pGhxLNMdoSFd1cwF8cF5+JUfS6PK8TVAc+aNX4Q3ZGQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.2.tgz", + "integrity": "sha512-PYnPJJJcZ79NBLhC72MfZ+EWLkTIA2pizTEiNTtxXjLmqtKNkXO+TL9qXgTmot4F72ERVZqjQjBQUcfkNbXg/w==", "license": "MIT", "optional": true, "dependencies": { @@ -20234,32 +20234,32 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.79.1", - "sass-embedded-android-arm64": "1.79.1", - "sass-embedded-android-ia32": "1.79.1", - "sass-embedded-android-riscv64": "1.79.1", - "sass-embedded-android-x64": "1.79.1", - "sass-embedded-darwin-arm64": "1.79.1", - "sass-embedded-darwin-x64": "1.79.1", - "sass-embedded-linux-arm": "1.79.1", - "sass-embedded-linux-arm64": "1.79.1", - "sass-embedded-linux-ia32": "1.79.1", - "sass-embedded-linux-musl-arm": "1.79.1", - "sass-embedded-linux-musl-arm64": "1.79.1", - "sass-embedded-linux-musl-ia32": "1.79.1", - "sass-embedded-linux-musl-riscv64": "1.79.1", - "sass-embedded-linux-musl-x64": "1.79.1", - "sass-embedded-linux-riscv64": "1.79.1", - "sass-embedded-linux-x64": "1.79.1", - "sass-embedded-win32-arm64": "1.79.1", - "sass-embedded-win32-ia32": "1.79.1", - "sass-embedded-win32-x64": "1.79.1" + "sass-embedded-android-arm": "1.79.2", + "sass-embedded-android-arm64": "1.79.2", + "sass-embedded-android-ia32": "1.79.2", + "sass-embedded-android-riscv64": "1.79.2", + "sass-embedded-android-x64": "1.79.2", + "sass-embedded-darwin-arm64": "1.79.2", + "sass-embedded-darwin-x64": "1.79.2", + "sass-embedded-linux-arm": "1.79.2", + "sass-embedded-linux-arm64": "1.79.2", + "sass-embedded-linux-ia32": "1.79.2", + "sass-embedded-linux-musl-arm": "1.79.2", + "sass-embedded-linux-musl-arm64": "1.79.2", + "sass-embedded-linux-musl-ia32": "1.79.2", + "sass-embedded-linux-musl-riscv64": "1.79.2", + "sass-embedded-linux-musl-x64": "1.79.2", + "sass-embedded-linux-riscv64": "1.79.2", + "sass-embedded-linux-x64": "1.79.2", + "sass-embedded-win32-arm64": "1.79.2", + "sass-embedded-win32-ia32": "1.79.2", + "sass-embedded-win32-x64": "1.79.2" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.1.tgz", - "integrity": "sha512-p6TaAOFUDx3DjK3i8Y3c4rNXnSJZcivYL+CojMefHZgJNm7PS0mrpzr4a0kkD25saZO208r+Fa258ax1+GzEvA==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.2.tgz", + "integrity": "sha512-oBy6lRjCHvNThNbXJ8/P02tZQYnvaI3sR0aZ86DoHiMGMFaijwvXrzwkZWJZ6LxysuBXlfRh0nRWQuwWBCIt/A==", "cpu": [ "arm" ], @@ -20273,9 +20273,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.1.tgz", - "integrity": "sha512-q+Q1GdLCTVazpfX/vKJGRQJTjZwSkcViUThzSOtCDwNK6vMbJB3x6CHmHmKWYnjceA2y73QRgs9kR+NDLZoPLQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.2.tgz", + "integrity": "sha512-msFtFD9QGPKH3wnrgj8bc/UMCpKGBUHpCTzMz1JSUDZapD3T/sSJSqkuywu3smawqd77tBKkr+34HX+ot9jNew==", "cpu": [ "arm64" ], @@ -20289,9 +20289,9 @@ } }, "node_modules/sass-embedded-android-ia32": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.1.tgz", - "integrity": "sha512-bp4x5gjv1Wq5cAur8iKYZShfG27XUS/nrhqJU0PN2EGqu+YTklYR4ouoR4yZDFXjNA7RKmqqzJE+8Jks5cVnGA==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.2.tgz", + "integrity": "sha512-dtIAVmRdx+rMq0Bk4MG6AbcD/YfDfz2UIljzxnKp1kmZcU9vxcYbtx8c9T68qF3/JZx0rX6KSKwVRXjfLIxmVg==", "cpu": [ "ia32" ], @@ -20305,9 +20305,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.1.tgz", - "integrity": "sha512-1BJT4XtWvQeCjFUzNg1+Xa8RtIP8p2odBF5ly4i7ON6pHHYknjbpHTXIXFkz5sgLReFue9q/bsKIgvSPHMgkIg==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.2.tgz", + "integrity": "sha512-XHe+ft67aeLdwyRId14NhJYQT6GdsGQdX2rH31HSJw2z8Xdzl2kbESw3QRPYpoIw+nPCt9ItJV6BoTaDszOc2A==", "cpu": [ "riscv64" ], @@ -20321,9 +20321,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.1.tgz", - "integrity": "sha512-eqqDI9hOLNpbdEtBG7uJoAnim5xvscjlUTqHsqGlkddTdnXjwgcUDeqmc3z4iFr1wq7bZpb+xz6FM3MJxeLa7g==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.2.tgz", + "integrity": "sha512-1Es9PhGVCgT7BuXLMwxHv1h/Z6Oku5oN/zP2gkKycLgQwXRdz6c3jjvnveLpMgM8IhyWm1M4ELAYZ+3Agby0zg==", "cpu": [ "x64" ], @@ -20337,9 +20337,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.1.tgz", - "integrity": "sha512-6co9oRwPmyvEC9I5SyW+NHOQKLmVfQZVbYWvFQl3EPLsUCTQ88dVteQwPdpm+3MY0GNjLjjVppeyAsmWHjUmjQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.2.tgz", + "integrity": "sha512-89Oe60sneLTjqw7HwgDRdgQp3XFOe96GxM7HoQUFupl0a/xwOechDDTIIKqjZlx3CTwG4gijTufw4TlA2nROsw==", "cpu": [ "arm64" ], @@ -20353,9 +20353,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.1.tgz", - "integrity": "sha512-9rFlxTj5gxtxA1EBkO3dJ1W70Zebpw28wHUs/wByrT1FqR6+uPnyLOWwt5WJLc4AoS1LLQz/ZeknxL/mKI+GrA==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.2.tgz", + "integrity": "sha512-b7jL2tcRFowuQU1VsPbktYJgaOy2I7xOf4PT0kv0okvgAzlr1lWCrWBJd1Ef1etu3jkkR713WkE08Jdr6jb37w==", "cpu": [ "x64" ], @@ -20369,9 +20369,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.1.tgz", - "integrity": "sha512-Qdc94coLXxQ4NNS9DT+V9RtJ7TnttRhaNFR79ZU8RtZ1jHTWLnnC1rEDm1Br3btOy7op3eplFpJahfNZPRFKug==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.2.tgz", + "integrity": "sha512-fW3E1OZDy6AXRjcW1Rx6AEHquNNF7TbtJjfU/IkJdS3hRUuJK03vvJduDYD3zCjr4EqKyuok+E+nYEnuIdyYrQ==", "cpu": [ "arm" ], @@ -20385,9 +20385,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.1.tgz", - "integrity": "sha512-7LyLZ9XJU/9CAzCrWWFhqGEK620tYoNxMIpqX1yfNUiDGoolXfs1WDpxEiXqQaw4DmcPeAkqqAs8tg7qekDXBg==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.2.tgz", + "integrity": "sha512-t4RoNDnvTlvMO+UjTiuKJef4MiGyzO2YBVxb0k5Vsc82SFdCaNeqVsb1TlWcsmZA1uREmN+4XUPk25TTYYH92w==", "cpu": [ "arm64" ], @@ -20401,9 +20401,9 @@ } }, "node_modules/sass-embedded-linux-ia32": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.1.tgz", - "integrity": "sha512-9ZsVRSZJvUT6gNL1wS54cRdNqGfpi32zGh4q/Q62AKbAqmNb+BvuQT4TsBLuIEMDaR75Z1xvj1iArguD/LX00A==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.2.tgz", + "integrity": "sha512-RXNqN4kKwQAELRTzVZe4KGAyZgRNZaZ5pslsPIPa2sJUCHnbGyhN+4NZBR/vZWWyb2q3Ps2kpM9FvOhYh72vgg==", "cpu": [ "ia32" ], @@ -20417,9 +20417,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.1.tgz", - "integrity": "sha512-4MBu1aFvGE45CYii6dbdce3nPNc8CKcQ0spf7r6DeEn19NWJ0dNkYMTIa8Xy+TwZ1uS92g8E+M/aXmwQlRXQCA==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.2.tgz", + "integrity": "sha512-3IJ6L3UnLTVx4eheKqU9CcjwKyobTfSn9F3WdlWzxOH4SXSf7EYbfKpvwNHyZ8QJ7mRcndJOWU5Efuak12fl0w==", "cpu": [ "arm" ], @@ -20433,9 +20433,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.1.tgz", - "integrity": "sha512-4iNhJgeyyZrsBA/RwSiTRaxPSsHpvjr8I+oN6E0OpEzyY62QIxhQGGf1A73fOs6tJLw58ba14tAm/bblGefLFQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.2.tgz", + "integrity": "sha512-/5wZ4skLIfhjei8WQ1HbOxXIrHHyW5ZBvD3Bay5k+YOH9chWqU3IVOl3q3ZY/MK+Exz99IBAV3/6ei11l6igoA==", "cpu": [ "arm64" ], @@ -20449,9 +20449,9 @@ } }, "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.1.tgz", - "integrity": "sha512-5CF4mrbrnrtpKcoxuJnF6SryOqjyCdXyPJ6U6PjOUYEA1T1Cd/sE0cB+wswTQRgPVrYQO1d9c0eSEY1gZijp0g==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.2.tgz", + "integrity": "sha512-6Edl93bBC0l8+/WaxisBocEQI6fe3Buce9ZiUy2yF6fLTuX2vZn4zx6T2/sb5+EbD0K2ZFuDkDeNwWWZvz4H4g==", "cpu": [ "ia32" ], @@ -20465,9 +20465,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.1.tgz", - "integrity": "sha512-ZOVpi6c0vfD0vBBtmQqwd4+gGbrnsKnuyrh2ghoNbwg4oMHo85S0rCUR/3Uny6oFDKnTTJkWjamig3gy6ygzYQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.2.tgz", + "integrity": "sha512-r/++4Cwsr56qXlcqc5/2W7PqjQGOSLhz7Lf1BBBNqesMjTjBc1ZTBEQaIs+uHCNCAkl2BvVRHsR4UigzSQyz+A==", "cpu": [ "riscv64" ], @@ -20481,9 +20481,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.1.tgz", - "integrity": "sha512-0lcQZ7hZ6/gBoJ/Od7BX33Q3jr9oGaQxJfYZ0wmCK4qSu3S06UoBTELy9Njv51h+JaWJFUwzROay8bGWrEVuLQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.2.tgz", + "integrity": "sha512-A9hSRjRrioxmiVgwt5UVqgWJPsO0YK5DJZTzkAotHGIAp84/xYy1MSsT596vyjj0IFx2VEfHtPHi0+wGW9nEoQ==", "cpu": [ "x64" ], @@ -20497,9 +20497,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.1.tgz", - "integrity": "sha512-KQED61FrdYvW0YEMncBsak/PshpGkdPpzLLGXjdUqKqe6Tiv8/zqrlD8GC8CIvSBRxZs7ybyFMPi1KyjnvtUdQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.2.tgz", + "integrity": "sha512-beffwiBsw25kOYSKhEZNmmh2x7c9yAIXolD+wLWAc59nuOPYziDDh4mMa1z8P90ffyHPf13QeTom+Sv5vQve4w==", "cpu": [ "riscv64" ], @@ -20513,9 +20513,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.1.tgz", - "integrity": "sha512-s4QSuvdNrQq00XB2t3Dt+B05rc5cvONnveHijaXtqS+yb98tvNvDiozVfS20k4k1eklhoBC8FBm165RAXDGEuA==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.2.tgz", + "integrity": "sha512-EsbuwjzVnKihisZp0a+fVFhzUFfS/pesfhReElalzXHKeKHiHQhnY5+cRJuNi/4u03kroVXDUrcpI2FsVVIxfw==", "cpu": [ "x64" ], @@ -20529,9 +20529,9 @@ } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.1.tgz", - "integrity": "sha512-S7gzwMAvevFEJGZaWNltfJtvi8LCceWNs94b8uHQhmq8F/YFRy/iNPVAVB3SvnvBrIk8Iy2X6AXWoneLHFsNfg==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.2.tgz", + "integrity": "sha512-b6v4cFEgp/DtoDt+OKO6dd4NtuuemAGuI70RQ+R1iIqEioe3AWNi4i6c4uHWfj3eJwWXD9IX1iCPCGPILoQwUw==", "cpu": [ "arm64" ], @@ -20545,9 +20545,9 @@ } }, "node_modules/sass-embedded-win32-ia32": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.1.tgz", - "integrity": "sha512-UjxQ6KtO3UthJMvjlVaE3QiO76wRXLcM/gejSp2cgYUVRHYXFr88z0XjQiZc9mJEuvHi69BvvmpCjN4iptKO5A==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.2.tgz", + "integrity": "sha512-WxPytzrV3D3wD6CMy+4XWfQhQ7zHuJHw9n0z4dvA6w26v0VUSIEGWO/f0Zb6f3ddVZWCv44PBfmMVVCxm32etw==", "cpu": [ "ia32" ], @@ -20561,9 +20561,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.1.tgz", - "integrity": "sha512-hN9fO2Z5c5YhvF/p31PM4861y6wglwc11/K5vTaGwDKkhfVrKoT2iMGC9r0GshsP9D/LV8s+StoFe3NLYYp8Qg==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.2.tgz", + "integrity": "sha512-47KA0lXz11MuQeAjclua5FM7o2ebVz+YHmaQs4zZ13daec76IAMGexoe+KodkueDlGpMbWdhgfcyJVT6aGqQgQ==", "cpu": [ "x64" ], @@ -39760,9 +39760,9 @@ } }, "sass-embedded": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.1.tgz", - "integrity": "sha512-UIgG9sHZZ1fT28bxOGi6RUTyvuNvnNQ5nUCdeDGOiS+pGhxLNMdoSFd1cwF8cF5+JUfS6PK8TVAc+aNX4Q3ZGQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.2.tgz", + "integrity": "sha512-PYnPJJJcZ79NBLhC72MfZ+EWLkTIA2pizTEiNTtxXjLmqtKNkXO+TL9qXgTmot4F72ERVZqjQjBQUcfkNbXg/w==", "optional": true, "requires": { "@bufbuild/protobuf": "^2.0.0", @@ -39770,26 +39770,26 @@ "colorjs.io": "^0.5.0", "immutable": "^4.0.0", "rxjs": "^7.4.0", - "sass-embedded-android-arm": "1.79.1", - "sass-embedded-android-arm64": "1.79.1", - "sass-embedded-android-ia32": "1.79.1", - "sass-embedded-android-riscv64": "1.79.1", - "sass-embedded-android-x64": "1.79.1", - "sass-embedded-darwin-arm64": "1.79.1", - "sass-embedded-darwin-x64": "1.79.1", - "sass-embedded-linux-arm": "1.79.1", - "sass-embedded-linux-arm64": "1.79.1", - "sass-embedded-linux-ia32": "1.79.1", - "sass-embedded-linux-musl-arm": "1.79.1", - "sass-embedded-linux-musl-arm64": "1.79.1", - "sass-embedded-linux-musl-ia32": "1.79.1", - "sass-embedded-linux-musl-riscv64": "1.79.1", - "sass-embedded-linux-musl-x64": "1.79.1", - "sass-embedded-linux-riscv64": "1.79.1", - "sass-embedded-linux-x64": "1.79.1", - "sass-embedded-win32-arm64": "1.79.1", - "sass-embedded-win32-ia32": "1.79.1", - "sass-embedded-win32-x64": "1.79.1", + "sass-embedded-android-arm": "1.79.2", + "sass-embedded-android-arm64": "1.79.2", + "sass-embedded-android-ia32": "1.79.2", + "sass-embedded-android-riscv64": "1.79.2", + "sass-embedded-android-x64": "1.79.2", + "sass-embedded-darwin-arm64": "1.79.2", + "sass-embedded-darwin-x64": "1.79.2", + "sass-embedded-linux-arm": "1.79.2", + "sass-embedded-linux-arm64": "1.79.2", + "sass-embedded-linux-ia32": "1.79.2", + "sass-embedded-linux-musl-arm": "1.79.2", + "sass-embedded-linux-musl-arm64": "1.79.2", + "sass-embedded-linux-musl-ia32": "1.79.2", + "sass-embedded-linux-musl-riscv64": "1.79.2", + "sass-embedded-linux-musl-x64": "1.79.2", + "sass-embedded-linux-riscv64": "1.79.2", + "sass-embedded-linux-x64": "1.79.2", + "sass-embedded-win32-arm64": "1.79.2", + "sass-embedded-win32-ia32": "1.79.2", + "sass-embedded-win32-x64": "1.79.2", "supports-color": "^8.1.1", "varint": "^6.0.0" }, @@ -39812,123 +39812,123 @@ } }, "sass-embedded-android-arm": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.1.tgz", - "integrity": "sha512-p6TaAOFUDx3DjK3i8Y3c4rNXnSJZcivYL+CojMefHZgJNm7PS0mrpzr4a0kkD25saZO208r+Fa258ax1+GzEvA==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.2.tgz", + "integrity": "sha512-oBy6lRjCHvNThNbXJ8/P02tZQYnvaI3sR0aZ86DoHiMGMFaijwvXrzwkZWJZ6LxysuBXlfRh0nRWQuwWBCIt/A==", "optional": true }, "sass-embedded-android-arm64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.1.tgz", - "integrity": "sha512-q+Q1GdLCTVazpfX/vKJGRQJTjZwSkcViUThzSOtCDwNK6vMbJB3x6CHmHmKWYnjceA2y73QRgs9kR+NDLZoPLQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.2.tgz", + "integrity": "sha512-msFtFD9QGPKH3wnrgj8bc/UMCpKGBUHpCTzMz1JSUDZapD3T/sSJSqkuywu3smawqd77tBKkr+34HX+ot9jNew==", "optional": true }, "sass-embedded-android-ia32": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.1.tgz", - "integrity": "sha512-bp4x5gjv1Wq5cAur8iKYZShfG27XUS/nrhqJU0PN2EGqu+YTklYR4ouoR4yZDFXjNA7RKmqqzJE+8Jks5cVnGA==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.2.tgz", + "integrity": "sha512-dtIAVmRdx+rMq0Bk4MG6AbcD/YfDfz2UIljzxnKp1kmZcU9vxcYbtx8c9T68qF3/JZx0rX6KSKwVRXjfLIxmVg==", "optional": true }, "sass-embedded-android-riscv64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.1.tgz", - "integrity": "sha512-1BJT4XtWvQeCjFUzNg1+Xa8RtIP8p2odBF5ly4i7ON6pHHYknjbpHTXIXFkz5sgLReFue9q/bsKIgvSPHMgkIg==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.2.tgz", + "integrity": "sha512-XHe+ft67aeLdwyRId14NhJYQT6GdsGQdX2rH31HSJw2z8Xdzl2kbESw3QRPYpoIw+nPCt9ItJV6BoTaDszOc2A==", "optional": true }, "sass-embedded-android-x64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.1.tgz", - "integrity": "sha512-eqqDI9hOLNpbdEtBG7uJoAnim5xvscjlUTqHsqGlkddTdnXjwgcUDeqmc3z4iFr1wq7bZpb+xz6FM3MJxeLa7g==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.2.tgz", + "integrity": "sha512-1Es9PhGVCgT7BuXLMwxHv1h/Z6Oku5oN/zP2gkKycLgQwXRdz6c3jjvnveLpMgM8IhyWm1M4ELAYZ+3Agby0zg==", "optional": true }, "sass-embedded-darwin-arm64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.1.tgz", - "integrity": "sha512-6co9oRwPmyvEC9I5SyW+NHOQKLmVfQZVbYWvFQl3EPLsUCTQ88dVteQwPdpm+3MY0GNjLjjVppeyAsmWHjUmjQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.2.tgz", + "integrity": "sha512-89Oe60sneLTjqw7HwgDRdgQp3XFOe96GxM7HoQUFupl0a/xwOechDDTIIKqjZlx3CTwG4gijTufw4TlA2nROsw==", "optional": true }, "sass-embedded-darwin-x64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.1.tgz", - "integrity": "sha512-9rFlxTj5gxtxA1EBkO3dJ1W70Zebpw28wHUs/wByrT1FqR6+uPnyLOWwt5WJLc4AoS1LLQz/ZeknxL/mKI+GrA==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.2.tgz", + "integrity": "sha512-b7jL2tcRFowuQU1VsPbktYJgaOy2I7xOf4PT0kv0okvgAzlr1lWCrWBJd1Ef1etu3jkkR713WkE08Jdr6jb37w==", "optional": true }, "sass-embedded-linux-arm": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.1.tgz", - "integrity": "sha512-Qdc94coLXxQ4NNS9DT+V9RtJ7TnttRhaNFR79ZU8RtZ1jHTWLnnC1rEDm1Br3btOy7op3eplFpJahfNZPRFKug==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.2.tgz", + "integrity": "sha512-fW3E1OZDy6AXRjcW1Rx6AEHquNNF7TbtJjfU/IkJdS3hRUuJK03vvJduDYD3zCjr4EqKyuok+E+nYEnuIdyYrQ==", "optional": true }, "sass-embedded-linux-arm64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.1.tgz", - "integrity": "sha512-7LyLZ9XJU/9CAzCrWWFhqGEK620tYoNxMIpqX1yfNUiDGoolXfs1WDpxEiXqQaw4DmcPeAkqqAs8tg7qekDXBg==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.2.tgz", + "integrity": "sha512-t4RoNDnvTlvMO+UjTiuKJef4MiGyzO2YBVxb0k5Vsc82SFdCaNeqVsb1TlWcsmZA1uREmN+4XUPk25TTYYH92w==", "optional": true }, "sass-embedded-linux-ia32": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.1.tgz", - "integrity": "sha512-9ZsVRSZJvUT6gNL1wS54cRdNqGfpi32zGh4q/Q62AKbAqmNb+BvuQT4TsBLuIEMDaR75Z1xvj1iArguD/LX00A==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.2.tgz", + "integrity": "sha512-RXNqN4kKwQAELRTzVZe4KGAyZgRNZaZ5pslsPIPa2sJUCHnbGyhN+4NZBR/vZWWyb2q3Ps2kpM9FvOhYh72vgg==", "optional": true }, "sass-embedded-linux-musl-arm": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.1.tgz", - "integrity": "sha512-4MBu1aFvGE45CYii6dbdce3nPNc8CKcQ0spf7r6DeEn19NWJ0dNkYMTIa8Xy+TwZ1uS92g8E+M/aXmwQlRXQCA==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.2.tgz", + "integrity": "sha512-3IJ6L3UnLTVx4eheKqU9CcjwKyobTfSn9F3WdlWzxOH4SXSf7EYbfKpvwNHyZ8QJ7mRcndJOWU5Efuak12fl0w==", "optional": true }, "sass-embedded-linux-musl-arm64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.1.tgz", - "integrity": "sha512-4iNhJgeyyZrsBA/RwSiTRaxPSsHpvjr8I+oN6E0OpEzyY62QIxhQGGf1A73fOs6tJLw58ba14tAm/bblGefLFQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.2.tgz", + "integrity": "sha512-/5wZ4skLIfhjei8WQ1HbOxXIrHHyW5ZBvD3Bay5k+YOH9chWqU3IVOl3q3ZY/MK+Exz99IBAV3/6ei11l6igoA==", "optional": true }, "sass-embedded-linux-musl-ia32": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.1.tgz", - "integrity": "sha512-5CF4mrbrnrtpKcoxuJnF6SryOqjyCdXyPJ6U6PjOUYEA1T1Cd/sE0cB+wswTQRgPVrYQO1d9c0eSEY1gZijp0g==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.2.tgz", + "integrity": "sha512-6Edl93bBC0l8+/WaxisBocEQI6fe3Buce9ZiUy2yF6fLTuX2vZn4zx6T2/sb5+EbD0K2ZFuDkDeNwWWZvz4H4g==", "optional": true }, "sass-embedded-linux-musl-riscv64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.1.tgz", - "integrity": "sha512-ZOVpi6c0vfD0vBBtmQqwd4+gGbrnsKnuyrh2ghoNbwg4oMHo85S0rCUR/3Uny6oFDKnTTJkWjamig3gy6ygzYQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.2.tgz", + "integrity": "sha512-r/++4Cwsr56qXlcqc5/2W7PqjQGOSLhz7Lf1BBBNqesMjTjBc1ZTBEQaIs+uHCNCAkl2BvVRHsR4UigzSQyz+A==", "optional": true }, "sass-embedded-linux-musl-x64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.1.tgz", - "integrity": "sha512-0lcQZ7hZ6/gBoJ/Od7BX33Q3jr9oGaQxJfYZ0wmCK4qSu3S06UoBTELy9Njv51h+JaWJFUwzROay8bGWrEVuLQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.2.tgz", + "integrity": "sha512-A9hSRjRrioxmiVgwt5UVqgWJPsO0YK5DJZTzkAotHGIAp84/xYy1MSsT596vyjj0IFx2VEfHtPHi0+wGW9nEoQ==", "optional": true }, "sass-embedded-linux-riscv64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.1.tgz", - "integrity": "sha512-KQED61FrdYvW0YEMncBsak/PshpGkdPpzLLGXjdUqKqe6Tiv8/zqrlD8GC8CIvSBRxZs7ybyFMPi1KyjnvtUdQ==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.2.tgz", + "integrity": "sha512-beffwiBsw25kOYSKhEZNmmh2x7c9yAIXolD+wLWAc59nuOPYziDDh4mMa1z8P90ffyHPf13QeTom+Sv5vQve4w==", "optional": true }, "sass-embedded-linux-x64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.1.tgz", - "integrity": "sha512-s4QSuvdNrQq00XB2t3Dt+B05rc5cvONnveHijaXtqS+yb98tvNvDiozVfS20k4k1eklhoBC8FBm165RAXDGEuA==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.2.tgz", + "integrity": "sha512-EsbuwjzVnKihisZp0a+fVFhzUFfS/pesfhReElalzXHKeKHiHQhnY5+cRJuNi/4u03kroVXDUrcpI2FsVVIxfw==", "optional": true }, "sass-embedded-win32-arm64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.1.tgz", - "integrity": "sha512-S7gzwMAvevFEJGZaWNltfJtvi8LCceWNs94b8uHQhmq8F/YFRy/iNPVAVB3SvnvBrIk8Iy2X6AXWoneLHFsNfg==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.2.tgz", + "integrity": "sha512-b6v4cFEgp/DtoDt+OKO6dd4NtuuemAGuI70RQ+R1iIqEioe3AWNi4i6c4uHWfj3eJwWXD9IX1iCPCGPILoQwUw==", "optional": true }, "sass-embedded-win32-ia32": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.1.tgz", - "integrity": "sha512-UjxQ6KtO3UthJMvjlVaE3QiO76wRXLcM/gejSp2cgYUVRHYXFr88z0XjQiZc9mJEuvHi69BvvmpCjN4iptKO5A==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.2.tgz", + "integrity": "sha512-WxPytzrV3D3wD6CMy+4XWfQhQ7zHuJHw9n0z4dvA6w26v0VUSIEGWO/f0Zb6f3ddVZWCv44PBfmMVVCxm32etw==", "optional": true }, "sass-embedded-win32-x64": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.1.tgz", - "integrity": "sha512-hN9fO2Z5c5YhvF/p31PM4861y6wglwc11/K5vTaGwDKkhfVrKoT2iMGC9r0GshsP9D/LV8s+StoFe3NLYYp8Qg==", + "version": "1.79.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.2.tgz", + "integrity": "sha512-47KA0lXz11MuQeAjclua5FM7o2ebVz+YHmaQs4zZ13daec76IAMGexoe+KodkueDlGpMbWdhgfcyJVT6aGqQgQ==", "optional": true }, "sass-loader": { diff --git a/package.json b/package.json index ae579c41df..cb91541ab5 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "whatwg-fetch": "3.6.20" }, "optionalDependencies": { - "sass-embedded": "1.79.1" + "sass-embedded": "1.79.2" }, "browserslist": [ "last 2 Firefox versions", From 83e59ec22985939219ea4a3473d566f5930d0968 Mon Sep 17 00:00:00 2001 From: Janes Resnik Date: Fri, 27 Sep 2024 06:37:34 +0000 Subject: [PATCH 16/45] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index fc7d68a372..811b5b2137 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1954,5 +1954,11 @@ "ReplaceTrickplayImages": "Ersetzen vorhandener Trickplay-Bilder", "LabelSaveTrickplayLocally": "Trickplay-Bilder bei den Medien speichern", "LabelSaveTrickplayLocallyHelp": "Wenn Sie Trickplay-Bilder in Medienordnern speichern, werden sie bei Ihren Medien abgelegt und ermöglichen so eine einfache Migration und den Zugriff.", - "RenderPgsSubtitle": "Experimentelles PGS-Untertitel-Rendering" + "RenderPgsSubtitle": "Experimentelles PGS-Untertitel-Rendering", + "LabelAudioTagSettings": "Audio-Tag Einstellungen", + "LabelCustomTagDelimitersHelp": "Zeichen die zur Trennung von Tags verwendet werden sollen.", + "LabelDelimiterWhitelistHelp": "Artikel, die vom Tag-Splitting ausgeschlossen werden sollen. Ein Artikel pro Zeile.", + "PreferNonstandardArtistsTag": "Bevorzuge KÜNSTLER-Tag, falls vorhanden", + "PreferNonstandardArtistsTagHelp": "Verwenden Sie den nicht standardisierten ARTISTS-Tag anstelle des ARTIST-Tags, sofern verfügbar.", + "UseCustomTagDelimitersHelp": "Trennen Sie Künstler-/Genre-Tags mit benutzerdefinierten Zeichen." } From d4cc33f0ee54b35b31d17ddddd0bc5a885dafe9b Mon Sep 17 00:00:00 2001 From: Janes Resnik Date: Fri, 27 Sep 2024 08:57:26 +0000 Subject: [PATCH 17/45] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/de.json b/src/strings/de.json index 811b5b2137..94ecb84cc7 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -134,8 +134,8 @@ "Disc": "Disk", "Disconnect": "Verbindung trennen", "Display": "Anzeige", - "DisplayInMyMedia": "Auf Homescreen anzeigen", - "DisplayInOtherHomeScreenSections": "Bereiche wie 'Neueste Medien' oder 'Weiterschauen' auf dem Homescreen anzeigen", + "DisplayInMyMedia": "Auf Startbildschirm anzeigen", + "DisplayInOtherHomeScreenSections": "Bereiche wie 'Neueste Medien' oder 'Weiterschauen' auf dem Startbildschirm anzeigen", "DisplayMissingEpisodesWithinSeasons": "Fehlende Folgen innerhalb von Staffeln anzeigen", "DisplayMissingEpisodesWithinSeasonsHelp": "Dies muss in den Servereinstellungen auch für TV-Bibliotheken aktiviert werden.", "DisplayModeHelp": "Wähle den für die Oberfläche zu verwendenden Layoutstil.", From 4c31742cc50c19702f2c1610c2bcfc0d6c4d210b Mon Sep 17 00:00:00 2001 From: viown <48097677+viown@users.noreply.github.com> Date: Tue, 24 Sep 2024 20:09:17 +0300 Subject: [PATCH 18/45] Fix incorrect audio & subtitle index on next track --- src/components/playback/playbackmanager.js | 57 ++++++++++++++-------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index e14aa062d1..b51046d340 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2407,20 +2407,20 @@ class PlaybackManager { }); } - function rankStreamType(prevIndex, prevSource, mediaSource, streamType, isSecondarySubtitle) { + function rankStreamType(prevIndex, prevSource, mediaStreams, trackOptions, streamType, isSecondarySubtitle) { if (prevIndex == -1) { console.debug(`AutoSet ${streamType} - No Stream Set`); if (streamType == 'Subtitle') { if (isSecondarySubtitle) { - mediaSource.DefaultSecondarySubtitleStreamIndex = -1; + trackOptions.DefaultSecondarySubtitleStreamIndex = -1; } else { - mediaSource.DefaultSubtitleStreamIndex = -1; + trackOptions.DefaultSubtitleStreamIndex = -1; } } return; } - if (!prevSource.MediaStreams || !mediaSource.MediaStreams) { + if (!prevSource.MediaStreams || !mediaStreams) { console.debug(`AutoSet ${streamType} - No MediaStreams`); return; } @@ -2446,7 +2446,7 @@ class PlaybackManager { } let newRelIndex = 0; - for (const stream of mediaSource.MediaStreams) { + for (const stream of mediaStreams) { if (stream.Type != streamType) continue; let score = 0; @@ -2469,38 +2469,38 @@ class PlaybackManager { console.debug(`AutoSet ${streamType} - Using ${bestStreamIndex} score ${bestStreamScore}.`); if (streamType == 'Subtitle') { if (isSecondarySubtitle) { - mediaSource.DefaultSecondarySubtitleStreamIndex = bestStreamIndex; + trackOptions.DefaultSecondarySubtitleStreamIndex = bestStreamIndex; } else { - mediaSource.DefaultSubtitleStreamIndex = bestStreamIndex; + trackOptions.DefaultSubtitleStreamIndex = bestStreamIndex; } } if (streamType == 'Audio') { - mediaSource.DefaultAudioStreamIndex = bestStreamIndex; + trackOptions.DefaultAudioStreamIndex = bestStreamIndex; } } else { console.debug(`AutoSet ${streamType} - Threshold not met. Using default.`); } } - function autoSetNextTracks(prevSource, mediaSource, audio, subtitle) { + function autoSetNextTracks(prevSource, mediaStreams, trackOptions, audio, subtitle) { try { if (!prevSource) return; - if (!mediaSource) { - console.warn('AutoSet - No mediaSource'); + if (!mediaStreams) { + console.warn('AutoSet - No mediaStreams'); return; } if (audio && typeof prevSource.DefaultAudioStreamIndex == 'number') { - rankStreamType(prevSource.DefaultAudioStreamIndex, prevSource, mediaSource, 'Audio'); + rankStreamType(prevSource.DefaultAudioStreamIndex, prevSource, mediaStreams, trackOptions, 'Audio'); } if (subtitle && typeof prevSource.DefaultSubtitleStreamIndex == 'number') { - rankStreamType(prevSource.DefaultSubtitleStreamIndex, prevSource, mediaSource, 'Subtitle'); + rankStreamType(prevSource.DefaultSubtitleStreamIndex, prevSource, mediaStreams, trackOptions, 'Subtitle'); } if (subtitle && typeof prevSource.DefaultSecondarySubtitleStreamIndex == 'number') { - rankStreamType(prevSource.DefaultSecondarySubtitleStreamIndex, prevSource, mediaSource, 'Subtitle', true); + rankStreamType(prevSource.DefaultSecondarySubtitleStreamIndex, prevSource, mediaStreams, trackOptions, 'Subtitle', true); } } catch (e) { console.error(`AutoSet - Caught unexpected error: ${e}`); @@ -2572,12 +2572,18 @@ class PlaybackManager { }); } - return Promise.all([promise, player.getDeviceProfile(item)]).then(function (responses) { + const apiClient = ServerConnections.getApiClient(item.ServerId); + const mediaSourceId = playOptions.mediaSourceId || item.Id; + const getMediaStreams = apiClient.getItem(apiClient.getCurrentUserId(), mediaSourceId) + .then(fullItem => { + return fullItem.MediaStreams; + }); + + return Promise.all([promise, player.getDeviceProfile(item), apiClient.getCurrentUser(), getMediaStreams]).then(function (responses) { const deviceProfile = responses[1]; + const user = responses[2]; + const mediaStreams = responses[3]; - const apiClient = ServerConnections.getApiClient(item.ServerId); - - const mediaSourceId = playOptions.mediaSourceId; const audioStreamIndex = playOptions.audioStreamIndex; const subtitleStreamIndex = playOptions.subtitleStreamIndex; const options = { @@ -2600,9 +2606,20 @@ class PlaybackManager { // this reference was only needed by sendPlaybackListToPlayer playOptions.items = null; + const trackOptions = {}; + + autoSetNextTracks(prevSource, mediaStreams, trackOptions, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections); + if (trackOptions.DefaultAudioStreamIndex != null) { + options.audioStreamIndex = trackOptions.DefaultAudioStreamIndex; + } + if (trackOptions.DefaultSubtitleStreamIndex != null) { + options.subtitleStreamIndex = trackOptions.DefaultSubtitleStreamIndex; + } + return getPlaybackMediaSource(player, apiClient, deviceProfile, item, mediaSourceId, options).then(async (mediaSource) => { - const user = await apiClient.getCurrentUser(); - autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections); + if (trackOptions.DefaultSecondarySubtitleStreamIndex != null) { + mediaSource.DefaultSecondarySubtitleStreamIndex = trackOptions.DefaultSecondarySubtitleStreamIndex; + } if (mediaSource.DefaultSubtitleStreamIndex == null || mediaSource.DefaultSubtitleStreamIndex < 0) { mediaSource.DefaultSubtitleStreamIndex = mediaSource.DefaultSecondarySubtitleStreamIndex; From 3fcf53d6554b2e33b7ecb2e00f68a727a02d399f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 12:04:44 +0000 Subject: [PATCH 19/45] Update dependency @mui/x-date-pickers to v7.18.0 --- package-lock.json | 32 ++++++++++++++++---------------- package.json | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index beac21530c..5114db2697 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@jellyfin/sdk": "0.0.0-unstable.202409260501", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", - "@mui/x-date-pickers": "7.17.0", + "@mui/x-date-pickers": "7.18.0", "@react-hook/resize-observer": "2.0.2", "@tanstack/react-query": "5.56.2", "@tanstack/react-query-devtools": "5.56.2", @@ -5493,14 +5493,14 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@mui/x-date-pickers": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.17.0.tgz", - "integrity": "sha512-3mIw1uOZU/yKweZsVAo9QnwVFzLHqXgXG1TbGbDJ4AU6FhN2TCUlR9tzKHSlYdAHZ0bEWDS1/bgeGsQC7skXMA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.18.0.tgz", + "integrity": "sha512-12tXIoMj9vpS8fS/bS3kWPCoVrH38vNGCxgplI0vOnUrN9rJuYJz3agLPJe1S0xciTw+9W8ZSe3soaW+owoz1Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", "@mui/utils": "^5.16.6", - "@mui/x-internals": "7.17.0", + "@mui/x-internals": "7.18.0", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -5518,7 +5518,7 @@ "@emotion/styled": "^11.8.1", "@mui/material": "^5.15.14 || ^6.0.0", "@mui/system": "^5.15.14 || ^6.0.0", - "date-fns": "^2.25.0 || ^3.2.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", "dayjs": "^1.10.7", "luxon": "^3.0.2", @@ -5559,9 +5559,9 @@ } }, "node_modules/@mui/x-internals": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.17.0.tgz", - "integrity": "sha512-FLlAGSJl/vsuaA/8hPGazXFppyzIzxApJJDZMoTS0geUmHd0hyooISV2ltllLmrZ/DGtHhI08m8GGnHL6/vVeg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz", + "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", @@ -29570,13 +29570,13 @@ } }, "@mui/x-date-pickers": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.17.0.tgz", - "integrity": "sha512-3mIw1uOZU/yKweZsVAo9QnwVFzLHqXgXG1TbGbDJ4AU6FhN2TCUlR9tzKHSlYdAHZ0bEWDS1/bgeGsQC7skXMA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.18.0.tgz", + "integrity": "sha512-12tXIoMj9vpS8fS/bS3kWPCoVrH38vNGCxgplI0vOnUrN9rJuYJz3agLPJe1S0xciTw+9W8ZSe3soaW+owoz1Q==", "requires": { "@babel/runtime": "^7.25.6", "@mui/utils": "^5.16.6", - "@mui/x-internals": "7.17.0", + "@mui/x-internals": "7.18.0", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -29584,9 +29584,9 @@ } }, "@mui/x-internals": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.17.0.tgz", - "integrity": "sha512-FLlAGSJl/vsuaA/8hPGazXFppyzIzxApJJDZMoTS0geUmHd0hyooISV2ltllLmrZ/DGtHhI08m8GGnHL6/vVeg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz", + "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==", "requires": { "@babel/runtime": "^7.25.6", "@mui/utils": "^5.16.6" diff --git a/package.json b/package.json index 0285482d5e..56e2ce613a 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "@jellyfin/sdk": "0.0.0-unstable.202409260501", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", - "@mui/x-date-pickers": "7.17.0", + "@mui/x-date-pickers": "7.18.0", "@react-hook/resize-observer": "2.0.2", "@tanstack/react-query": "5.56.2", "@tanstack/react-query-devtools": "5.56.2", From 0c1616fd4e9da52f543fd794d4272910d3d5df46 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 17:03:55 +0000 Subject: [PATCH 20/45] Update dependency sass-loader to v16.0.2 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 594ba87e00..d1904884f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,7 +111,7 @@ "postcss-preset-env": "10.0.3", "postcss-scss": "4.0.9", "sass": "1.79.2", - "sass-loader": "16.0.1", + "sass-loader": "16.0.2", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", "style-loader": "4.0.0", @@ -20603,9 +20603,9 @@ } }, "node_modules/sass-loader": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.1.tgz", - "integrity": "sha512-xACl1ToTsKnL9Ce5yYpRxrLj9QUDCnwZNhzpC7tKiFyA8zXsd3Ap+HGVnbCgkdQcm43E+i6oKAWBsvGA6ZoiMw==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", "dev": true, "license": "MIT", "dependencies": { @@ -39904,9 +39904,9 @@ "optional": true }, "sass-loader": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.1.tgz", - "integrity": "sha512-xACl1ToTsKnL9Ce5yYpRxrLj9QUDCnwZNhzpC7tKiFyA8zXsd3Ap+HGVnbCgkdQcm43E+i6oKAWBsvGA6ZoiMw==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", "dev": true, "requires": { "neo-async": "^2.6.2" diff --git a/package.json b/package.json index 98cdc04250..bc44b49688 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "postcss-preset-env": "10.0.3", "postcss-scss": "4.0.9", "sass": "1.79.2", - "sass-loader": "16.0.1", + "sass-loader": "16.0.2", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", "style-loader": "4.0.0", From 0780bc360bdde59847902f896d4fcc8803e7c7b0 Mon Sep 17 00:00:00 2001 From: Max Bruch Date: Fri, 27 Sep 2024 18:21:16 +0000 Subject: [PATCH 21/45] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index 94ecb84cc7..651b7d6c66 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1960,5 +1960,8 @@ "LabelDelimiterWhitelistHelp": "Artikel, die vom Tag-Splitting ausgeschlossen werden sollen. Ein Artikel pro Zeile.", "PreferNonstandardArtistsTag": "Bevorzuge KÜNSTLER-Tag, falls vorhanden", "PreferNonstandardArtistsTagHelp": "Verwenden Sie den nicht standardisierten ARTISTS-Tag anstelle des ARTIST-Tags, sofern verfügbar.", - "UseCustomTagDelimitersHelp": "Trennen Sie Künstler-/Genre-Tags mit benutzerdefinierten Zeichen." + "UseCustomTagDelimitersHelp": "Trennen Sie Künstler-/Genre-Tags mit benutzerdefinierten Zeichen.", + "LabelCustomTagDelimiters": "Benutzerdefinierte Tag-Begrenzung", + "LabelDelimiterWhitelist": "Trennzeichen Whitelist", + "UseCustomTagDelimiters": "Benutzerdefinierte Tag-Begrenzung verwenden" } From 0945097208fdfe68c33f6eee7be07f22ba274d75 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2024 00:56:50 +0000 Subject: [PATCH 22/45] Update dependency sass-embedded to v1.79.3 --- package-lock.json | 334 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 168 insertions(+), 168 deletions(-) diff --git a/package-lock.json b/package-lock.json index 594ba87e00..7fc53121a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -136,7 +136,7 @@ "yarn": "YARN NO LONGER USED - use npm instead." }, "optionalDependencies": { - "sass-embedded": "1.79.2" + "sass-embedded": "1.79.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -20213,9 +20213,9 @@ } }, "node_modules/sass-embedded": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.2.tgz", - "integrity": "sha512-PYnPJJJcZ79NBLhC72MfZ+EWLkTIA2pizTEiNTtxXjLmqtKNkXO+TL9qXgTmot4F72ERVZqjQjBQUcfkNbXg/w==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.3.tgz", + "integrity": "sha512-zUve2qCn6uSOMZnZazLzrDWq//OQWFle5G45vJjv3B/ADIA3TXVgqHqN3u7D2vGajOGREz0HN5nhliSoKmQqZA==", "license": "MIT", "optional": true, "dependencies": { @@ -20234,32 +20234,32 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.79.2", - "sass-embedded-android-arm64": "1.79.2", - "sass-embedded-android-ia32": "1.79.2", - "sass-embedded-android-riscv64": "1.79.2", - "sass-embedded-android-x64": "1.79.2", - "sass-embedded-darwin-arm64": "1.79.2", - "sass-embedded-darwin-x64": "1.79.2", - "sass-embedded-linux-arm": "1.79.2", - "sass-embedded-linux-arm64": "1.79.2", - "sass-embedded-linux-ia32": "1.79.2", - "sass-embedded-linux-musl-arm": "1.79.2", - "sass-embedded-linux-musl-arm64": "1.79.2", - "sass-embedded-linux-musl-ia32": "1.79.2", - "sass-embedded-linux-musl-riscv64": "1.79.2", - "sass-embedded-linux-musl-x64": "1.79.2", - "sass-embedded-linux-riscv64": "1.79.2", - "sass-embedded-linux-x64": "1.79.2", - "sass-embedded-win32-arm64": "1.79.2", - "sass-embedded-win32-ia32": "1.79.2", - "sass-embedded-win32-x64": "1.79.2" + "sass-embedded-android-arm": "1.79.3", + "sass-embedded-android-arm64": "1.79.3", + "sass-embedded-android-ia32": "1.79.3", + "sass-embedded-android-riscv64": "1.79.3", + "sass-embedded-android-x64": "1.79.3", + "sass-embedded-darwin-arm64": "1.79.3", + "sass-embedded-darwin-x64": "1.79.3", + "sass-embedded-linux-arm": "1.79.3", + "sass-embedded-linux-arm64": "1.79.3", + "sass-embedded-linux-ia32": "1.79.3", + "sass-embedded-linux-musl-arm": "1.79.3", + "sass-embedded-linux-musl-arm64": "1.79.3", + "sass-embedded-linux-musl-ia32": "1.79.3", + "sass-embedded-linux-musl-riscv64": "1.79.3", + "sass-embedded-linux-musl-x64": "1.79.3", + "sass-embedded-linux-riscv64": "1.79.3", + "sass-embedded-linux-x64": "1.79.3", + "sass-embedded-win32-arm64": "1.79.3", + "sass-embedded-win32-ia32": "1.79.3", + "sass-embedded-win32-x64": "1.79.3" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.2.tgz", - "integrity": "sha512-oBy6lRjCHvNThNbXJ8/P02tZQYnvaI3sR0aZ86DoHiMGMFaijwvXrzwkZWJZ6LxysuBXlfRh0nRWQuwWBCIt/A==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.3.tgz", + "integrity": "sha512-rrdaVDkKBLUqzdqlBFamUbeuLG+8r/QLXHIgz4qPhIDqceJH6ds0Vzrae9Ef6DhYfMatOg2xiScdatwQ8Yl/hA==", "cpu": [ "arm" ], @@ -20273,9 +20273,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.2.tgz", - "integrity": "sha512-msFtFD9QGPKH3wnrgj8bc/UMCpKGBUHpCTzMz1JSUDZapD3T/sSJSqkuywu3smawqd77tBKkr+34HX+ot9jNew==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.3.tgz", + "integrity": "sha512-Wqm/WKHIDQl7w7eIQRO/GQ7EXfnwNpipCyJL7Xtb15vSAV64J4/0D/esy6GOPlVG+qcu8/XN8NV7Bf5wZ2ExUw==", "cpu": [ "arm64" ], @@ -20289,9 +20289,9 @@ } }, "node_modules/sass-embedded-android-ia32": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.2.tgz", - "integrity": "sha512-dtIAVmRdx+rMq0Bk4MG6AbcD/YfDfz2UIljzxnKp1kmZcU9vxcYbtx8c9T68qF3/JZx0rX6KSKwVRXjfLIxmVg==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.3.tgz", + "integrity": "sha512-6rDmH0O7hjBP04/xBAFzSYYMU/7MrQYCak4541BZIbIfa2uw0x/8+mB7lZjdgFsBrFjcpdVCPhZPUE6Y50c00A==", "cpu": [ "ia32" ], @@ -20305,9 +20305,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.2.tgz", - "integrity": "sha512-XHe+ft67aeLdwyRId14NhJYQT6GdsGQdX2rH31HSJw2z8Xdzl2kbESw3QRPYpoIw+nPCt9ItJV6BoTaDszOc2A==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.3.tgz", + "integrity": "sha512-B/PgB0AfTCvOlF1g89raJTwTXIUQUM3OXDWqEKIlJEZM1Yao91i8ZkyrFkDMzT4G5sETy4o8pgK+qE9+7bFlug==", "cpu": [ "riscv64" ], @@ -20321,9 +20321,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.2.tgz", - "integrity": "sha512-1Es9PhGVCgT7BuXLMwxHv1h/Z6Oku5oN/zP2gkKycLgQwXRdz6c3jjvnveLpMgM8IhyWm1M4ELAYZ+3Agby0zg==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.3.tgz", + "integrity": "sha512-a5cpo9Yw4xnX32Uo3WfMZLaTVnI/h2n7U3K3eTygyj707yhGkUB0i+qxldzCw8MmKivIu9irG6O4kmnRjW6f7g==", "cpu": [ "x64" ], @@ -20337,9 +20337,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.2.tgz", - "integrity": "sha512-89Oe60sneLTjqw7HwgDRdgQp3XFOe96GxM7HoQUFupl0a/xwOechDDTIIKqjZlx3CTwG4gijTufw4TlA2nROsw==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.3.tgz", + "integrity": "sha512-imafD0nlVz5FJhqBqxUbG5rK4E3cu1GxhMZ5VhKm0k4t5jFQo+3OjN7sHT4Ee2Mk1g8sjr5dtq5enDU4fs6lXA==", "cpu": [ "arm64" ], @@ -20353,9 +20353,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.2.tgz", - "integrity": "sha512-b7jL2tcRFowuQU1VsPbktYJgaOy2I7xOf4PT0kv0okvgAzlr1lWCrWBJd1Ef1etu3jkkR713WkE08Jdr6jb37w==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.3.tgz", + "integrity": "sha512-pjciT1FcMUMA4rWdpyZYSwMOvxk5JP7R6vy7TzvqkUEqXxP9FTflYnAiwgYUDVTpngHHqRxTjdyW+e+h2L9dHw==", "cpu": [ "x64" ], @@ -20369,9 +20369,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.2.tgz", - "integrity": "sha512-fW3E1OZDy6AXRjcW1Rx6AEHquNNF7TbtJjfU/IkJdS3hRUuJK03vvJduDYD3zCjr4EqKyuok+E+nYEnuIdyYrQ==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.3.tgz", + "integrity": "sha512-n0bDtzABPE5YaL9wSLxNPiQMl1zArsGblHJyED6fEHz41m+OkCTopfO8IVjcf+MBrK/j11gonxiIGWO+fNOxvg==", "cpu": [ "arm" ], @@ -20385,9 +20385,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.2.tgz", - "integrity": "sha512-t4RoNDnvTlvMO+UjTiuKJef4MiGyzO2YBVxb0k5Vsc82SFdCaNeqVsb1TlWcsmZA1uREmN+4XUPk25TTYYH92w==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.3.tgz", + "integrity": "sha512-ODo8ghwk6KHxchgwxq4CwgfYwWdreEbsQoukeEgRKxHcuLB9XF6tol9pGlfrc8sYox48Vp5WDCZuzgoo6rJ6tg==", "cpu": [ "arm64" ], @@ -20401,9 +20401,9 @@ } }, "node_modules/sass-embedded-linux-ia32": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.2.tgz", - "integrity": "sha512-RXNqN4kKwQAELRTzVZe4KGAyZgRNZaZ5pslsPIPa2sJUCHnbGyhN+4NZBR/vZWWyb2q3Ps2kpM9FvOhYh72vgg==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.3.tgz", + "integrity": "sha512-oC3rUyIE6mEm2etsc4CuNu6IVmB6CoSM4KsubxzCD3S37QFXq8wYbI0t9iiDdTkKb5Iu+vUyhn+tYJRVHg0tvw==", "cpu": [ "ia32" ], @@ -20417,9 +20417,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.2.tgz", - "integrity": "sha512-3IJ6L3UnLTVx4eheKqU9CcjwKyobTfSn9F3WdlWzxOH4SXSf7EYbfKpvwNHyZ8QJ7mRcndJOWU5Efuak12fl0w==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.3.tgz", + "integrity": "sha512-TOUYMtDs9xoMsJSEEr7NjtcVCqVpg1eSOQHXXruJ1kiYfxwmHrCYTjTLoefbZ29mWqIq8NUaXJG4rZNDK6NzRA==", "cpu": [ "arm" ], @@ -20433,9 +20433,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.2.tgz", - "integrity": "sha512-/5wZ4skLIfhjei8WQ1HbOxXIrHHyW5ZBvD3Bay5k+YOH9chWqU3IVOl3q3ZY/MK+Exz99IBAV3/6ei11l6igoA==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.3.tgz", + "integrity": "sha512-Q9/5lsrK/JnQci3DwxZ9PGIIrRxuo/bySv+gbyVp8Kb7gdkZcEsY7HkxaBJfwVEwpZSGAyCviyZDHDMILjliOw==", "cpu": [ "arm64" ], @@ -20449,9 +20449,9 @@ } }, "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.2.tgz", - "integrity": "sha512-6Edl93bBC0l8+/WaxisBocEQI6fe3Buce9ZiUy2yF6fLTuX2vZn4zx6T2/sb5+EbD0K2ZFuDkDeNwWWZvz4H4g==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.3.tgz", + "integrity": "sha512-T2uERh3gs9eWUzdkDadPuYbelQJQLZyX8myutUd4fxyrQ7ToQRBwcMoynEjl48DBHnM0oRiJUHrV9uFuJ+fmRA==", "cpu": [ "ia32" ], @@ -20465,9 +20465,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.2.tgz", - "integrity": "sha512-r/++4Cwsr56qXlcqc5/2W7PqjQGOSLhz7Lf1BBBNqesMjTjBc1ZTBEQaIs+uHCNCAkl2BvVRHsR4UigzSQyz+A==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.3.tgz", + "integrity": "sha512-XTuYtTBPFeEjydS2GsIUkMztzXIiz13noknE7m1yAbVxOchu9jD9FCLAdK9pVPPki+9BiLSxsutYwOcQn8atqQ==", "cpu": [ "riscv64" ], @@ -20481,9 +20481,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.2.tgz", - "integrity": "sha512-A9hSRjRrioxmiVgwt5UVqgWJPsO0YK5DJZTzkAotHGIAp84/xYy1MSsT596vyjj0IFx2VEfHtPHi0+wGW9nEoQ==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.3.tgz", + "integrity": "sha512-gDHfaPlxT/XQTMbfb2y+U6zDMuI8pfapVXTYlUrgYhKH2KoICclIvahhjFii5i5+1dHpfGzjgYKBqI3nvZsYFg==", "cpu": [ "x64" ], @@ -20497,9 +20497,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.2.tgz", - "integrity": "sha512-beffwiBsw25kOYSKhEZNmmh2x7c9yAIXolD+wLWAc59nuOPYziDDh4mMa1z8P90ffyHPf13QeTom+Sv5vQve4w==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.3.tgz", + "integrity": "sha512-NONTa//1ZfxA87+Zjp3rabL+Z9gM67FJBdktRKXXMBAce5i8eCj/eqJGUOGPjYxtvxtQw77cex0qMr9SZnX6ww==", "cpu": [ "riscv64" ], @@ -20513,9 +20513,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.2.tgz", - "integrity": "sha512-EsbuwjzVnKihisZp0a+fVFhzUFfS/pesfhReElalzXHKeKHiHQhnY5+cRJuNi/4u03kroVXDUrcpI2FsVVIxfw==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.3.tgz", + "integrity": "sha512-drlUqMMw222+f/T5sNrIAv+z0vQwLkO4zAlDmf4biLdWIloPP/3plTodAkMyfagNcvA8jG2jN414pJXBI3zK6w==", "cpu": [ "x64" ], @@ -20529,9 +20529,9 @@ } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.2.tgz", - "integrity": "sha512-b6v4cFEgp/DtoDt+OKO6dd4NtuuemAGuI70RQ+R1iIqEioe3AWNi4i6c4uHWfj3eJwWXD9IX1iCPCGPILoQwUw==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.3.tgz", + "integrity": "sha512-gYz0IUb0fLkHUbhq+HR52wvQfG75Zu1s48/v48TqC+b04H/01k2eiawp/Ec1f+lhpIL/pr5+n5jWR6CjkxPdnQ==", "cpu": [ "arm64" ], @@ -20545,9 +20545,9 @@ } }, "node_modules/sass-embedded-win32-ia32": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.2.tgz", - "integrity": "sha512-WxPytzrV3D3wD6CMy+4XWfQhQ7zHuJHw9n0z4dvA6w26v0VUSIEGWO/f0Zb6f3ddVZWCv44PBfmMVVCxm32etw==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.3.tgz", + "integrity": "sha512-fbDTyzbqRc+xCWZ+YHSDt2WvGk5PW2K0SjyHuwes/Fls1+wdO4iHIukE/pD+HSWytYrtCqhe7EFq5Ug5HxGTLg==", "cpu": [ "ia32" ], @@ -20561,9 +20561,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.2.tgz", - "integrity": "sha512-47KA0lXz11MuQeAjclua5FM7o2ebVz+YHmaQs4zZ13daec76IAMGexoe+KodkueDlGpMbWdhgfcyJVT6aGqQgQ==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.3.tgz", + "integrity": "sha512-vvfr6wyCaHvdQbGS8UkYab6DXc1FKJRYFT5aFE3QTVqbzCqmJ5tf80E4+gvB99nljLtMjwKR1d332iWI9KDLhw==", "cpu": [ "x64" ], @@ -39732,9 +39732,9 @@ } }, "sass-embedded": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.2.tgz", - "integrity": "sha512-PYnPJJJcZ79NBLhC72MfZ+EWLkTIA2pizTEiNTtxXjLmqtKNkXO+TL9qXgTmot4F72ERVZqjQjBQUcfkNbXg/w==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.3.tgz", + "integrity": "sha512-zUve2qCn6uSOMZnZazLzrDWq//OQWFle5G45vJjv3B/ADIA3TXVgqHqN3u7D2vGajOGREz0HN5nhliSoKmQqZA==", "optional": true, "requires": { "@bufbuild/protobuf": "^2.0.0", @@ -39742,26 +39742,26 @@ "colorjs.io": "^0.5.0", "immutable": "^4.0.0", "rxjs": "^7.4.0", - "sass-embedded-android-arm": "1.79.2", - "sass-embedded-android-arm64": "1.79.2", - "sass-embedded-android-ia32": "1.79.2", - "sass-embedded-android-riscv64": "1.79.2", - "sass-embedded-android-x64": "1.79.2", - "sass-embedded-darwin-arm64": "1.79.2", - "sass-embedded-darwin-x64": "1.79.2", - "sass-embedded-linux-arm": "1.79.2", - "sass-embedded-linux-arm64": "1.79.2", - "sass-embedded-linux-ia32": "1.79.2", - "sass-embedded-linux-musl-arm": "1.79.2", - "sass-embedded-linux-musl-arm64": "1.79.2", - "sass-embedded-linux-musl-ia32": "1.79.2", - "sass-embedded-linux-musl-riscv64": "1.79.2", - "sass-embedded-linux-musl-x64": "1.79.2", - "sass-embedded-linux-riscv64": "1.79.2", - "sass-embedded-linux-x64": "1.79.2", - "sass-embedded-win32-arm64": "1.79.2", - "sass-embedded-win32-ia32": "1.79.2", - "sass-embedded-win32-x64": "1.79.2", + "sass-embedded-android-arm": "1.79.3", + "sass-embedded-android-arm64": "1.79.3", + "sass-embedded-android-ia32": "1.79.3", + "sass-embedded-android-riscv64": "1.79.3", + "sass-embedded-android-x64": "1.79.3", + "sass-embedded-darwin-arm64": "1.79.3", + "sass-embedded-darwin-x64": "1.79.3", + "sass-embedded-linux-arm": "1.79.3", + "sass-embedded-linux-arm64": "1.79.3", + "sass-embedded-linux-ia32": "1.79.3", + "sass-embedded-linux-musl-arm": "1.79.3", + "sass-embedded-linux-musl-arm64": "1.79.3", + "sass-embedded-linux-musl-ia32": "1.79.3", + "sass-embedded-linux-musl-riscv64": "1.79.3", + "sass-embedded-linux-musl-x64": "1.79.3", + "sass-embedded-linux-riscv64": "1.79.3", + "sass-embedded-linux-x64": "1.79.3", + "sass-embedded-win32-arm64": "1.79.3", + "sass-embedded-win32-ia32": "1.79.3", + "sass-embedded-win32-x64": "1.79.3", "supports-color": "^8.1.1", "varint": "^6.0.0" }, @@ -39784,123 +39784,123 @@ } }, "sass-embedded-android-arm": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.2.tgz", - "integrity": "sha512-oBy6lRjCHvNThNbXJ8/P02tZQYnvaI3sR0aZ86DoHiMGMFaijwvXrzwkZWJZ6LxysuBXlfRh0nRWQuwWBCIt/A==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.3.tgz", + "integrity": "sha512-rrdaVDkKBLUqzdqlBFamUbeuLG+8r/QLXHIgz4qPhIDqceJH6ds0Vzrae9Ef6DhYfMatOg2xiScdatwQ8Yl/hA==", "optional": true }, "sass-embedded-android-arm64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.2.tgz", - "integrity": "sha512-msFtFD9QGPKH3wnrgj8bc/UMCpKGBUHpCTzMz1JSUDZapD3T/sSJSqkuywu3smawqd77tBKkr+34HX+ot9jNew==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.3.tgz", + "integrity": "sha512-Wqm/WKHIDQl7w7eIQRO/GQ7EXfnwNpipCyJL7Xtb15vSAV64J4/0D/esy6GOPlVG+qcu8/XN8NV7Bf5wZ2ExUw==", "optional": true }, "sass-embedded-android-ia32": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.2.tgz", - "integrity": "sha512-dtIAVmRdx+rMq0Bk4MG6AbcD/YfDfz2UIljzxnKp1kmZcU9vxcYbtx8c9T68qF3/JZx0rX6KSKwVRXjfLIxmVg==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.3.tgz", + "integrity": "sha512-6rDmH0O7hjBP04/xBAFzSYYMU/7MrQYCak4541BZIbIfa2uw0x/8+mB7lZjdgFsBrFjcpdVCPhZPUE6Y50c00A==", "optional": true }, "sass-embedded-android-riscv64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.2.tgz", - "integrity": "sha512-XHe+ft67aeLdwyRId14NhJYQT6GdsGQdX2rH31HSJw2z8Xdzl2kbESw3QRPYpoIw+nPCt9ItJV6BoTaDszOc2A==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.3.tgz", + "integrity": "sha512-B/PgB0AfTCvOlF1g89raJTwTXIUQUM3OXDWqEKIlJEZM1Yao91i8ZkyrFkDMzT4G5sETy4o8pgK+qE9+7bFlug==", "optional": true }, "sass-embedded-android-x64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.2.tgz", - "integrity": "sha512-1Es9PhGVCgT7BuXLMwxHv1h/Z6Oku5oN/zP2gkKycLgQwXRdz6c3jjvnveLpMgM8IhyWm1M4ELAYZ+3Agby0zg==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.3.tgz", + "integrity": "sha512-a5cpo9Yw4xnX32Uo3WfMZLaTVnI/h2n7U3K3eTygyj707yhGkUB0i+qxldzCw8MmKivIu9irG6O4kmnRjW6f7g==", "optional": true }, "sass-embedded-darwin-arm64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.2.tgz", - "integrity": "sha512-89Oe60sneLTjqw7HwgDRdgQp3XFOe96GxM7HoQUFupl0a/xwOechDDTIIKqjZlx3CTwG4gijTufw4TlA2nROsw==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.3.tgz", + "integrity": "sha512-imafD0nlVz5FJhqBqxUbG5rK4E3cu1GxhMZ5VhKm0k4t5jFQo+3OjN7sHT4Ee2Mk1g8sjr5dtq5enDU4fs6lXA==", "optional": true }, "sass-embedded-darwin-x64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.2.tgz", - "integrity": "sha512-b7jL2tcRFowuQU1VsPbktYJgaOy2I7xOf4PT0kv0okvgAzlr1lWCrWBJd1Ef1etu3jkkR713WkE08Jdr6jb37w==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.3.tgz", + "integrity": "sha512-pjciT1FcMUMA4rWdpyZYSwMOvxk5JP7R6vy7TzvqkUEqXxP9FTflYnAiwgYUDVTpngHHqRxTjdyW+e+h2L9dHw==", "optional": true }, "sass-embedded-linux-arm": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.2.tgz", - "integrity": "sha512-fW3E1OZDy6AXRjcW1Rx6AEHquNNF7TbtJjfU/IkJdS3hRUuJK03vvJduDYD3zCjr4EqKyuok+E+nYEnuIdyYrQ==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.3.tgz", + "integrity": "sha512-n0bDtzABPE5YaL9wSLxNPiQMl1zArsGblHJyED6fEHz41m+OkCTopfO8IVjcf+MBrK/j11gonxiIGWO+fNOxvg==", "optional": true }, "sass-embedded-linux-arm64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.2.tgz", - "integrity": "sha512-t4RoNDnvTlvMO+UjTiuKJef4MiGyzO2YBVxb0k5Vsc82SFdCaNeqVsb1TlWcsmZA1uREmN+4XUPk25TTYYH92w==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.3.tgz", + "integrity": "sha512-ODo8ghwk6KHxchgwxq4CwgfYwWdreEbsQoukeEgRKxHcuLB9XF6tol9pGlfrc8sYox48Vp5WDCZuzgoo6rJ6tg==", "optional": true }, "sass-embedded-linux-ia32": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.2.tgz", - "integrity": "sha512-RXNqN4kKwQAELRTzVZe4KGAyZgRNZaZ5pslsPIPa2sJUCHnbGyhN+4NZBR/vZWWyb2q3Ps2kpM9FvOhYh72vgg==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.3.tgz", + "integrity": "sha512-oC3rUyIE6mEm2etsc4CuNu6IVmB6CoSM4KsubxzCD3S37QFXq8wYbI0t9iiDdTkKb5Iu+vUyhn+tYJRVHg0tvw==", "optional": true }, "sass-embedded-linux-musl-arm": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.2.tgz", - "integrity": "sha512-3IJ6L3UnLTVx4eheKqU9CcjwKyobTfSn9F3WdlWzxOH4SXSf7EYbfKpvwNHyZ8QJ7mRcndJOWU5Efuak12fl0w==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.3.tgz", + "integrity": "sha512-TOUYMtDs9xoMsJSEEr7NjtcVCqVpg1eSOQHXXruJ1kiYfxwmHrCYTjTLoefbZ29mWqIq8NUaXJG4rZNDK6NzRA==", "optional": true }, "sass-embedded-linux-musl-arm64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.2.tgz", - "integrity": "sha512-/5wZ4skLIfhjei8WQ1HbOxXIrHHyW5ZBvD3Bay5k+YOH9chWqU3IVOl3q3ZY/MK+Exz99IBAV3/6ei11l6igoA==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.3.tgz", + "integrity": "sha512-Q9/5lsrK/JnQci3DwxZ9PGIIrRxuo/bySv+gbyVp8Kb7gdkZcEsY7HkxaBJfwVEwpZSGAyCviyZDHDMILjliOw==", "optional": true }, "sass-embedded-linux-musl-ia32": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.2.tgz", - "integrity": "sha512-6Edl93bBC0l8+/WaxisBocEQI6fe3Buce9ZiUy2yF6fLTuX2vZn4zx6T2/sb5+EbD0K2ZFuDkDeNwWWZvz4H4g==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.3.tgz", + "integrity": "sha512-T2uERh3gs9eWUzdkDadPuYbelQJQLZyX8myutUd4fxyrQ7ToQRBwcMoynEjl48DBHnM0oRiJUHrV9uFuJ+fmRA==", "optional": true }, "sass-embedded-linux-musl-riscv64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.2.tgz", - "integrity": "sha512-r/++4Cwsr56qXlcqc5/2W7PqjQGOSLhz7Lf1BBBNqesMjTjBc1ZTBEQaIs+uHCNCAkl2BvVRHsR4UigzSQyz+A==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.3.tgz", + "integrity": "sha512-XTuYtTBPFeEjydS2GsIUkMztzXIiz13noknE7m1yAbVxOchu9jD9FCLAdK9pVPPki+9BiLSxsutYwOcQn8atqQ==", "optional": true }, "sass-embedded-linux-musl-x64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.2.tgz", - "integrity": "sha512-A9hSRjRrioxmiVgwt5UVqgWJPsO0YK5DJZTzkAotHGIAp84/xYy1MSsT596vyjj0IFx2VEfHtPHi0+wGW9nEoQ==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.3.tgz", + "integrity": "sha512-gDHfaPlxT/XQTMbfb2y+U6zDMuI8pfapVXTYlUrgYhKH2KoICclIvahhjFii5i5+1dHpfGzjgYKBqI3nvZsYFg==", "optional": true }, "sass-embedded-linux-riscv64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.2.tgz", - "integrity": "sha512-beffwiBsw25kOYSKhEZNmmh2x7c9yAIXolD+wLWAc59nuOPYziDDh4mMa1z8P90ffyHPf13QeTom+Sv5vQve4w==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.3.tgz", + "integrity": "sha512-NONTa//1ZfxA87+Zjp3rabL+Z9gM67FJBdktRKXXMBAce5i8eCj/eqJGUOGPjYxtvxtQw77cex0qMr9SZnX6ww==", "optional": true }, "sass-embedded-linux-x64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.2.tgz", - "integrity": "sha512-EsbuwjzVnKihisZp0a+fVFhzUFfS/pesfhReElalzXHKeKHiHQhnY5+cRJuNi/4u03kroVXDUrcpI2FsVVIxfw==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.3.tgz", + "integrity": "sha512-drlUqMMw222+f/T5sNrIAv+z0vQwLkO4zAlDmf4biLdWIloPP/3plTodAkMyfagNcvA8jG2jN414pJXBI3zK6w==", "optional": true }, "sass-embedded-win32-arm64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.2.tgz", - "integrity": "sha512-b6v4cFEgp/DtoDt+OKO6dd4NtuuemAGuI70RQ+R1iIqEioe3AWNi4i6c4uHWfj3eJwWXD9IX1iCPCGPILoQwUw==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.3.tgz", + "integrity": "sha512-gYz0IUb0fLkHUbhq+HR52wvQfG75Zu1s48/v48TqC+b04H/01k2eiawp/Ec1f+lhpIL/pr5+n5jWR6CjkxPdnQ==", "optional": true }, "sass-embedded-win32-ia32": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.2.tgz", - "integrity": "sha512-WxPytzrV3D3wD6CMy+4XWfQhQ7zHuJHw9n0z4dvA6w26v0VUSIEGWO/f0Zb6f3ddVZWCv44PBfmMVVCxm32etw==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.3.tgz", + "integrity": "sha512-fbDTyzbqRc+xCWZ+YHSDt2WvGk5PW2K0SjyHuwes/Fls1+wdO4iHIukE/pD+HSWytYrtCqhe7EFq5Ug5HxGTLg==", "optional": true }, "sass-embedded-win32-x64": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.2.tgz", - "integrity": "sha512-47KA0lXz11MuQeAjclua5FM7o2ebVz+YHmaQs4zZ13daec76IAMGexoe+KodkueDlGpMbWdhgfcyJVT6aGqQgQ==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.3.tgz", + "integrity": "sha512-vvfr6wyCaHvdQbGS8UkYab6DXc1FKJRYFT5aFE3QTVqbzCqmJ5tf80E4+gvB99nljLtMjwKR1d332iWI9KDLhw==", "optional": true }, "sass-loader": { diff --git a/package.json b/package.json index 98cdc04250..9171ce6340 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "whatwg-fetch": "3.6.20" }, "optionalDependencies": { - "sass-embedded": "1.79.2" + "sass-embedded": "1.79.3" }, "browserslist": [ "last 2 Firefox versions", From fd465f16882b1e509986597580402aa2fbcf398f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2024 03:49:34 +0000 Subject: [PATCH 23/45] Update dependency sass to v1.79.3 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1904884f5..8e9486d606 100644 --- a/package-lock.json +++ b/package-lock.json @@ -110,7 +110,7 @@ "postcss-loader": "8.1.1", "postcss-preset-env": "10.0.3", "postcss-scss": "4.0.9", - "sass": "1.79.2", + "sass": "1.79.3", "sass-loader": "16.0.2", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", @@ -20195,9 +20195,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.2.tgz", - "integrity": "sha512-YmT1aoF1MwHsZEu/eXhbAJNsPGAhNP4UixW9ckEwWCvPcVdVF0/C104OGDVEqtoctKq0N+wM20O/rj+sSPsWeg==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.3.tgz", + "integrity": "sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA==", "dev": true, "license": "MIT", "dependencies": { @@ -39704,9 +39704,9 @@ "dev": true }, "sass": { - "version": "1.79.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.2.tgz", - "integrity": "sha512-YmT1aoF1MwHsZEu/eXhbAJNsPGAhNP4UixW9ckEwWCvPcVdVF0/C104OGDVEqtoctKq0N+wM20O/rj+sSPsWeg==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.3.tgz", + "integrity": "sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA==", "dev": true, "requires": { "chokidar": "^4.0.0", diff --git a/package.json b/package.json index bc44b49688..6468c6c1fb 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "postcss-loader": "8.1.1", "postcss-preset-env": "10.0.3", "postcss-scss": "4.0.9", - "sass": "1.79.2", + "sass": "1.79.3", "sass-loader": "16.0.2", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", From 46f0307d6e77d8629f66243620843fad73a778b6 Mon Sep 17 00:00:00 2001 From: Kityn Date: Sat, 28 Sep 2024 05:11:44 +0000 Subject: [PATCH 24/45] Translated using Weblate (Polish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/ --- src/strings/pl.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/pl.json b/src/strings/pl.json index 79adcc28b3..fbde81eb3c 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -1963,5 +1963,8 @@ "LabelCustomTagDelimitersHelp": "Znaki, które należy traktować jako ograniczniki oddzielające tagi.", "PreferNonstandardArtistsTagHelp": "Jeśli jest dostępny, użyj niestandardowego tagu WYKONAWCY zamiast tagu WYKONAWCA.", "UseCustomTagDelimitersHelp": "Podziel tagi wykonawcy/gatunku za pomocą niestandardowych znaków.", - "LabelCustomTagDelimiters": "Niestandardowy ogranicznik tagów" + "LabelCustomTagDelimiters": "Niestandardowy ogranicznik tagów", + "MessageCancelSeriesTimerError": "Wystąpił błąd podczas anulowania timera serialu", + "MessageCancelTimerError": "Wystąpił błąd podczas anulowania timera", + "MessageSplitVersionsError": "Wystąpił błąd podczas podziału wersji" } From 290207bdb780ef205e7cf55b7bdd914e2e7b19c8 Mon Sep 17 00:00:00 2001 From: Bas <44002186+854562@users.noreply.github.com> Date: Sat, 28 Sep 2024 07:14:03 +0000 Subject: [PATCH 25/45] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 877b9191a1..d71f6ad90b 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1962,5 +1962,8 @@ "UseCustomTagDelimiters": "Aangepast scheidingsteken voor tags gebruiken", "UseCustomTagDelimitersHelp": "Artiest- en genre-tags splitsen met aangepaste tekens.", "PreferNonstandardArtistsTagHelp": "Gebruik de incourante ARTISTS-tag in plaats van de ARTIST-tag indien beschikbaar.", - "PreferNonstandardArtistsTag": "ARTISTS-tag verkiezen indien beschikbaar" + "PreferNonstandardArtistsTag": "ARTISTS-tag verkiezen indien beschikbaar", + "MessageCancelTimerError": "Er is een fout opgetreden bij het annuleren van de tijdklok", + "MessageSplitVersionsError": "Er is een fout opgetreden bij het splitsen van de versies", + "MessageCancelSeriesTimerError": "Er is een fout opgetreden bij het annuleren van de serietijdklok" } From a5035baaf74ce68680d0e5ac03b8d393333efe87 Mon Sep 17 00:00:00 2001 From: Nyanmisaka <799610810@qq.com> Date: Sat, 28 Sep 2024 07:13:20 +0000 Subject: [PATCH 26/45] Translated using Weblate (Chinese (Simplified Han script)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 9de2ea7460..3587f7dcc2 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1963,5 +1963,8 @@ "LabelDelimiterWhitelistHelp": "从标签分隔中排除的项目。每行一项。", "PreferNonstandardArtistsTag": "可用时首选的艺术家标签", "PreferNonstandardArtistsTagHelp": "如果可用,使用非标准的艺术家标签代替艺术家标签。", - "UseCustomTagDelimitersHelp": "使用自定义字符分割\"艺术家/类型\"标签。" + "UseCustomTagDelimitersHelp": "使用自定义字符分割\"艺术家/类型\"标签。", + "MessageCancelSeriesTimerError": "取消节目计时器时发生错误", + "MessageCancelTimerError": "取消计时器时发生错误", + "MessageSplitVersionsError": "分割版本时发生错误" } From bddb631b083898999590b37275fa40fcf0ee5916 Mon Sep 17 00:00:00 2001 From: Andreas Lundin Date: Sat, 28 Sep 2024 09:36:17 +0000 Subject: [PATCH 27/45] Translated using Weblate (Swedish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/ --- src/strings/sv.json | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/strings/sv.json b/src/strings/sv.json index d1b508d6c9..52da440f96 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -1754,9 +1754,9 @@ "AllowSegmentDeletion": "Radera segment", "AllowSegmentDeletionHelp": "Radera gamla segment efter att de har laddats ner av användaren. Detta förhindrar att hela den transkodade filen behöver lagras på hårddisken. Stäng av detta om du upplever uppspelningsproblem.", "LabelThrottleDelaySeconds": "Begränsa efter", - "LabelThrottleDelaySecondsHelp": "Tid i sekunder efter vilken transkodern kommer att strypas. Måste vara tillräckligt stor för att klienten ska kunna upprätthålla en sund buffert. Fungerar endast om strypning är aktiverat.", - "LabelSegmentKeepSeconds": "Tid för att behålla segment", - "LabelSegmentKeepSecondsHelp": "Tid i sekunder där segment ska sparas efter laddats ner av användaren. Fungerar endast om segmentradering är aktiverat.", + "LabelThrottleDelaySecondsHelp": "Tid i sekunder efter vilken transkodern kommer att strypas. Måste vara tillräckligt stor för att klienten ska kunna upprätthålla en tillräcklig buffert. Fungerar endast om strypning är aktiverat.", + "LabelSegmentKeepSeconds": "Tid att behålla segment", + "LabelSegmentKeepSecondsHelp": "Tid i sekunder då segment ska sparas efter att ha laddats ner av användaren. Fungerar endast om segmentradering är aktiverat.", "LabelDeveloper": "Utväcklare", "Notifications": "Notifieringar", "UserMenu": "Användarmeny", @@ -1912,7 +1912,7 @@ "LabelDuration": "Varaktighet", "LabelDropLyricsHere": "Släpp sångtext här, eller klicka för att bläddra.", "LabelIsSynced": "Är synkroniserad", - "AllowTonemappingSoftwareHelp": "Tonmappning kan konvertera det dynamiska omfånget för en video från HDR till SDR samtidigt som bilddetaljer och färger bibehålls, vilket är mycket viktig information för att representera den ursprungliga scenen. Fungerar för närvarande endast med 10-bitars HDR10- och HLG-videor.", + "AllowTonemappingSoftwareHelp": "Tonmappning kan konvertera det dynamiska omfånget för en video från HDR till SDR samtidigt som bilddetaljer och färger bibehålls, vilket är mycket viktig information för att representera den ursprungliga scenen. Fungerar för närvarande endast med 10-bitars HDR10-, DoVi- och HLG-videor.", "HeaderPreviewLyrics": "Förhandsgranska sångtext", "LibraryInvalidItemIdError": "Biblioteket är i ett ogiltigt tillstånd och kan inte redigeras. Det är möjligt att du stött på en bugg: sökvägen i databasen är inte rätt sökväg i filsystemet.", "MoveToTop": "Flytta längst upp", @@ -1938,5 +1938,7 @@ "FallbackMaxStreamingBitrateHelp": "Den högsta uppspelningsbithastigheten används ifall ffprobe inte lyckas fastställa källans bithastighet. Detta gör så att klienter inte efterfrågar en för hög omkodningsbithastighet, vilket kan resultera i att mediespelaren kraschar och överbelastar omkodaren.", "LabelAllowFmp4TranscodingContainer": "Tillåt fMP4 omkodningscontainer", "LabelAlwaysRemuxMp3AudioFiles": "Remux:a alltid MP3-ljudfiler", - "LabelAlwaysRemuxFlacAudioFiles": "Remux:a alltid FLAC-ljudfiler" + "LabelAlwaysRemuxFlacAudioFiles": "Remux:a alltid FLAC-ljudfiler", + "AllowFmp4TranscodingContainerHelp": "Tillåt fMP4-omkodande container för denna tuner för att stödja HEVC- och HDR-kodat innehåll. Inte alla tuners är kompatibla med denna sortens container. Avaktivera detta valet ifall du upplever problem med uppspelning.", + "AllowStreamSharingHelp": "Tillåt Jellyfin att duplicera MPEG-transportströmmen från tunern, och att dela den duplicerade strömmen till sina klienter. Detta är användbart när tunern har en maxgräns för antalet strömmar, men kan samtidigt orsaka problem med uppspelning." } From 6afd7a3d98011720c0a1c6855bb8c455a1b3a349 Mon Sep 17 00:00:00 2001 From: lostb1t Date: Sat, 28 Sep 2024 16:36:01 +0200 Subject: [PATCH 28/45] Use DateModifed for label --- src/components/metadataEditor/metadataEditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index 4503e1cf10..c7441ca309 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -717,7 +717,7 @@ function setFieldVisibilities(context, item) { showElement('#fldDisplayOrder', context); hideElement('.seriesDisplayOrderDescription', context); - context.querySelector('#selectDisplayOrder').innerHTML = ''; + context.querySelector('#selectDisplayOrder').innerHTML = ''; } else if (item.Type === 'Series') { showElement('#fldDisplayOrder', context); showElement('.seriesDisplayOrderDescription', context); From f7c2a273e3eb6a4a82c6da41afed507d2619db6a Mon Sep 17 00:00:00 2001 From: lostb1t Date: Sat, 28 Sep 2024 18:26:22 +0200 Subject: [PATCH 29/45] Add translations string for DateMosified --- src/strings/en-us.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 5d09fc16ce..babe1b6a8e 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -187,6 +187,7 @@ "DailyAt": "Daily at {0}", "Data": "Data", "DateAdded": "Date added", + "DateModified": "Date modified", "DatePlayed": "Date played", "DeathDateValue": "Died: {0}", "Default": "Default", From 7a0e3b7df7a43d9976b46ec434ba36aa7ed51733 Mon Sep 17 00:00:00 2001 From: Fahim Murshed Date: Sat, 28 Sep 2024 21:59:03 +0000 Subject: [PATCH 30/45] Translated using Weblate (Bengali (Bangladesh)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bn_BD/ --- src/strings/bn_BD.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/bn_BD.json b/src/strings/bn_BD.json index b38c26a550..c7a4e8f65e 100644 --- a/src/strings/bn_BD.json +++ b/src/strings/bn_BD.json @@ -326,5 +326,10 @@ "ColorPrimaries": "কালার প্রাইমারি", "AllowCollectionManagement": "এই ব্যবহারকারীকে কালেকশন্স গুলি পরিচালনা করার অনুমতি দিন", "AllowSegmentDeletion": "অংশগুলি মুছে ফেলুন", - "AllowSegmentDeletionHelp": "পুরানো বিভাগগুলি ক্লায়েন্টের কাছে পাঠানোর পরে মুছে ফেলুন। এটি ডিস্কে পুরো ট্রান্সকোডেড ফাইল সংরক্ষণ করতে বাধা দেয়। এটি কেবল থ্রোটলিং সক্ষম করে কাজ করবে। আপনি যদি প্লেব্যাক সমস্যার সম্মুখীন হন তবে এটি বন্ধ করুন।" + "AllowSegmentDeletionHelp": "পুরানো বিভাগগুলি ক্লায়েন্টের কাছে পাঠানোর পরে মুছে ফেলুন। এটি ডিস্কে পুরো ট্রান্সকোডেড ফাইল সংরক্ষণ করতে বাধা দেয়। এটি কেবল থ্রোটলিং সক্ষম করে কাজ করবে। আপনি যদি প্লেব্যাক সমস্যার সম্মুখীন হন তবে এটি বন্ধ করুন।", + "AirPlay": "এয়ারপ্লে", + "AllowContentWithTagsHelp": "শুধুমাত্র নির্দিষ্ট ট্যাগগুলির মধ্যে অন্তত একটি সহ মিডিয়া দেখান।", + "Alternate": "বিকল্প", + "AllowSubtitleManagement": "এই ব্যবহারকারীকে সাবটাইটেল সম্পাদনা করার অনুমতি দিন", + "AllowFmp4TranscodingContainerHelp": "HEVC এবং HDR বিষয়বস্তু সক্ষম করতে এই টিউনারটির জন্য fMP4 ট্রান্সকোডিং কন্টেইনারকে অনুমতি দিন। সমস্ত টিউনার এই ধারকটির সাথে সামঞ্জস্যপূর্ণ নয়৷ আপনি যদি প্লেব্যাক সমস্যা অনুভব করেন তবে এটি অক্ষম করুন।" } From 1114b19b00db6616827c3d2148e21aeeb2f90bfb Mon Sep 17 00:00:00 2001 From: Bas <44002186+854562@users.noreply.github.com> Date: Sun, 29 Sep 2024 06:34:39 +0000 Subject: [PATCH 31/45] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index d71f6ad90b..cebcb545cd 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1965,5 +1965,6 @@ "PreferNonstandardArtistsTag": "ARTISTS-tag verkiezen indien beschikbaar", "MessageCancelTimerError": "Er is een fout opgetreden bij het annuleren van de tijdklok", "MessageSplitVersionsError": "Er is een fout opgetreden bij het splitsen van de versies", - "MessageCancelSeriesTimerError": "Er is een fout opgetreden bij het annuleren van de serietijdklok" + "MessageCancelSeriesTimerError": "Er is een fout opgetreden bij het annuleren van de serietijdklok", + "DateModified": "Datum gewijzigd" } From 055baa4efa0a88babd3108e1501b0b6beca85fe2 Mon Sep 17 00:00:00 2001 From: Kityn Date: Sun, 29 Sep 2024 09:57:45 +0000 Subject: [PATCH 32/45] Translated using Weblate (Polish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/ --- src/strings/pl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/pl.json b/src/strings/pl.json index fbde81eb3c..8812e9afff 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -1966,5 +1966,6 @@ "LabelCustomTagDelimiters": "Niestandardowy ogranicznik tagów", "MessageCancelSeriesTimerError": "Wystąpił błąd podczas anulowania timera serialu", "MessageCancelTimerError": "Wystąpił błąd podczas anulowania timera", - "MessageSplitVersionsError": "Wystąpił błąd podczas podziału wersji" + "MessageSplitVersionsError": "Wystąpił błąd podczas podziału wersji", + "DateModified": "Data modyfikacji" } From c05550daf82b39a635731b60913719dc25fa7c59 Mon Sep 17 00:00:00 2001 From: felix920506 Date: Sun, 29 Sep 2024 15:58:27 +0000 Subject: [PATCH 33/45] Translated using Weblate (Chinese (Traditional Han script)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/ --- src/strings/zh-tw.json | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index 74709037cc..d7f640167f 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -1939,5 +1939,30 @@ "LabelDropLyricsHere": "將歌詞拖曳至此處,或點擊以瀏覽。", "LabelAlwaysRemuxFlacAudioFiles": "總是重新封裝 FLAC 音訊", "LabelAlwaysRemuxMp3AudioFiles": "總是重新封裝 MP3 音訊", - "LabelDisableVbrAudioEncoding": "停用可變位元率 (VBR) 音訊編碼" + "LabelDisableVbrAudioEncoding": "停用可變位元率 (VBR) 音訊編碼", + "DateModified": "修改日期", + "FallbackMaxStreamingBitrateHelp": "當 ffprobe 無法判斷來源位元率時,將使用最大串流位元率。可以避免用戶端請求過高的轉檔位元率,進而導致播放失敗或編碼器過載。", + "LabelAudioTagSettings": "音訊標籤設定", + "LabelCustomTagDelimiters": "自訂標籤分隔字元", + "LabelCustomTagDelimitersHelp": "用來分隔標籤的字元。", + "LabelFallbackMaxStreamingBitrate": "備用最大串流位元率 (Mbps)", + "LabelAllowFmp4TranscodingContainer": "允許使用 fMP4 容器轉檔", + "MessageCancelSeriesTimerError": "取消節目計時器時發生錯誤", + "MessageCancelTimerError": "取消計時器時發生錯誤", + "MessageSplitVersionsError": "分割版本時發生錯誤", + "LabelLyricDownloaders": "歌詞下載器", + "LyricDownloadersHelp": "啟用並依照偏好排序字幕下載器。", + "RenderPgsSubtitle": "實驗性 PGS 字幕渲染", + "RenderPgsSubtitleHelp": "在用戶端渲染 PGS 字幕,代替伺服器端燒錄字幕。以降低用戶端效能為代價避免伺服器端轉檔。", + "PreferNonstandardArtistsTag": "可用時偏好 ARTISTS 標籤", + "PreferNonstandardArtistsTagHelp": "可用時使用非標準的 ARTISTS 標籤代替 ARTIST 標籤。", + "ReplaceTrickplayImages": "替換現有的快轉縮圖", + "UseCustomTagDelimiters": "使用自訂標籤分隔字元", + "UseCustomTagDelimitersHelp": "使用自訂的字元分割藝術家、風格標籤。", + "AllowFmp4TranscodingContainerHelp": "允許使用 fMP4 容器轉檔來自此解碼器的內容以啟用 HEVC 和 HDR。並非所有解碼器都和此容器相容。如果遇到播放問題,請停用此設定。", + "LabelSaveTrickplayLocally": "將快轉縮圖儲存在媒體旁邊", + "LabelSaveTrickplayLocallyHelp": "將快轉縮圖儲存在媒體資料夾會將它們放在媒體旁邊,以便遷移和存取。", + "VideoCodecTagNotSupported": "不支援的視訊編碼標籤", + "LabelDelimiterWhitelist": "分隔字元白名單", + "LabelDelimiterWhitelistHelp": "從標籤分隔中排除的項目。每行一項。" } From f88a7ccfdec4d4f33a2e48397d03e4b87a69a4fd Mon Sep 17 00:00:00 2001 From: Nyanmisaka <799610810@qq.com> Date: Sun, 29 Sep 2024 17:49:12 +0000 Subject: [PATCH 34/45] Translated using Weblate (Chinese (Simplified Han script)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 3587f7dcc2..3969b117f4 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1966,5 +1966,6 @@ "UseCustomTagDelimitersHelp": "使用自定义字符分割\"艺术家/类型\"标签。", "MessageCancelSeriesTimerError": "取消节目计时器时发生错误", "MessageCancelTimerError": "取消计时器时发生错误", - "MessageSplitVersionsError": "分割版本时发生错误" + "MessageSplitVersionsError": "分割版本时发生错误", + "DateModified": "修改日期" } From 87e37557dd36091711f1ccd6615a6d35708ff4bb Mon Sep 17 00:00:00 2001 From: felix920506 Date: Mon, 30 Sep 2024 00:46:52 +0000 Subject: [PATCH 35/45] Translated using Weblate (Chinese (Traditional Han script)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/ --- src/strings/zh-tw.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index d7f640167f..cc3dbbd668 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -1964,5 +1964,7 @@ "LabelSaveTrickplayLocallyHelp": "將快轉縮圖儲存在媒體資料夾會將它們放在媒體旁邊,以便遷移和存取。", "VideoCodecTagNotSupported": "不支援的視訊編碼標籤", "LabelDelimiterWhitelist": "分隔字元白名單", - "LabelDelimiterWhitelistHelp": "從標籤分隔中排除的項目。每行一項。" + "LabelDelimiterWhitelistHelp": "從標籤分隔中排除的項目。每行一項。", + "AllowStreamSharingHelp": "允許 Jellyfin 複製解碼器中的 MPEGTS 串流並共用給多個用戶端。當解碼器有總串流數量限制時很有用,但是可能導致播放問題。", + "LabelAllowStreamSharing": "允許串流共用" } From 8f952c4bf5bc21ad9e0f5673f224ddf9b18e27b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Mon, 30 Sep 2024 06:13:29 +0000 Subject: [PATCH 36/45] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index 397cf4a5b2..7fac2a9281 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1858,7 +1858,7 @@ "LabelEncodingFormatOptions": "Možnosti formátu kódování", "EncodingFormatHelp": "Vyberte formát, do kterého by měly být překódovány videa. Pokud není k dispozici hardwarová akcelerace pro vybraný formát, bude použito softwarové kódování. Kódování do formátu H.264 bude vždy povoleno.", "LabelTrickplayAccelEncoding": "Povolit hardwarově akcelerované kódování MJPEG", - "LabelTrickplayAccelEncodingHelp": "Tato možnost je momentálně dostupná pouze při použití QSV, VAAPI a VideoToolbox. Nemá vliv na ostatní hardwarovou akceleraci.", + "LabelTrickplayAccelEncodingHelp": "Tato možnost je momentálně dostupná pouze při použití QSV, VA-API, VideoToolbox a RKMPP. Nemá vliv na ostatní hardwarovou akceleraci.", "EnableLibrary": "Povolit knihovnu", "EnableLibraryHelp": "Vypnutím knihovny ji skryjete ze všech míst, kde je uživateli zobrazena.", "ConfirmDeleteLyrics": "Písně budou odstraněny ze systému i knihovny médií. Opravdu chcete pokračovat?", @@ -1950,5 +1950,22 @@ "AllowFmp4TranscodingContainerHelp": "Povolením kontejneru fMP4 pro překódování umožníte tomuto tuneru pracovat s obsahem ve formátu HEVC a s HDR. Kompatibilní jsou jen některé tunery. Pokud máte potíže s přehráváním, tuto možnost vypněte.", "LabelSaveTrickplayLocally": "Uložit obrázky trickplay k médiím", "LabelSaveTrickplayLocallyHelp": "Uložením obrázků trickplay do složek s médii se usnadní jejich přesun a přístup k nim.", - "ReplaceTrickplayImages": "Nahradit existující obrázky trickplay" + "ReplaceTrickplayImages": "Nahradit existující obrázky trickplay", + "MessageCancelSeriesTimerError": "Při rušení časovače seriálu došlo k chybě", + "DateModified": "Datum upravení", + "LabelAudioTagSettings": "Nastavení zvukových značek", + "LabelCustomTagDelimiters": "Vlastní oddělovač značek", + "LabelCustomTagDelimitersHelp": "Znaky, které budou považovány za oddělovače značek.", + "LabelDelimiterWhitelistHelp": "Položky, které budou vyloučeny z rozdělování značek. Každý řádek je jedna položka.", + "LabelDelimiterWhitelist": "Seznam výjimek při oddělování", + "LabelLyricDownloaders": "Stahovače textů písní", + "LyricDownloadersHelp": "Povolit a seřadit své stahovače textů písní podle preferovaného pořadí.", + "MessageCancelTimerError": "Při rušení časovače došlo k chybě", + "MessageSplitVersionsError": "Při rozdělování verzí došlo k chybě", + "PreferNonstandardArtistsTag": "Preferovat značku ARTISTS, pokud existuje", + "PreferNonstandardArtistsTagHelp": "Použít nestandardní značku ARTISTS místo ARTIST, pokud je k dispozici.", + "RenderPgsSubtitle": "Experimentální rendrování titulků ve formátu PGS", + "RenderPgsSubtitleHelp": "Zda má klient zobrazit titulky ve formátu PGS místo jejich vypálení do obrazu. Můžete se tak vyhnout překódování na serveru výměnou za horší výkon klienta.", + "UseCustomTagDelimiters": "Použít vlastní oddělovač značek", + "UseCustomTagDelimitersHelp": "Rozdělit značky pro umělce a žánry pomocí vlastních znaků." } From ff256abb2774e9d3de0deaf3b5fe012bdeb0cd7b Mon Sep 17 00:00:00 2001 From: millallo Date: Mon, 30 Sep 2024 07:47:02 +0000 Subject: [PATCH 37/45] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/it.json b/src/strings/it.json index 7da27be2d9..15562745c0 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1943,5 +1943,8 @@ "EnableHi10pHelp": "Abilita per evitare la transcodifica dei video H.264 a 10 bit. Disabilitare quest'opzione se il video mostra fotogrammi vuoti.", "LabelSaveTrickplayLocally": "Salva le immagini trickplay accanto ai media", "LabelSaveTrickplayLocallyHelp": "Salvare le immagini trickplay nella stessa cartella del video ti permetterà di spostarle e accederle più facilmente.", - "ReplaceTrickplayImages": "Sostituisci le immagini trickplay" + "ReplaceTrickplayImages": "Sostituisci le immagini trickplay", + "FallbackMaxStreamingBitrateHelp": "Il bitrate massimo dello streaming viene utilizzato quando ffprobe non è in grado di determinare il bitrate sorgente. Ciò aiuta a impedire che i client richiedano un bitrate di transcodifica troppo alto che potrebbe causare il fallimento del player e il sovraccarico dell'encoder.", + "LabelFallbackMaxStreamingBitrate": "Bitrate massimo di ripiego (Mbps)", + "DateModified": "Data di modifica" } From acd67807692a2f83db2ed6d8be078c4d21f37188 Mon Sep 17 00:00:00 2001 From: l00d3r Date: Mon, 30 Sep 2024 09:33:47 +0000 Subject: [PATCH 38/45] Translated using Weblate (Estonian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/ --- src/strings/et.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/strings/et.json b/src/strings/et.json index 0dbf9fbfbc..99be5853b6 100644 --- a/src/strings/et.json +++ b/src/strings/et.json @@ -1938,5 +1938,18 @@ "PriorityNormal": "Normaalväärtus", "PriorityAboveNormal": "Üle normaalväärtuse", "LabelTileWidthHelp": "Piltide maksimaalne arv ühe ruudu kohta X-suunas.", - "ExtractTrickplayImagesHelp": "Trickplay-pildid on sarnased peatükkide piltidega, kuid need hõlmavad kogu sisu. Neid kasutatakse videote skriinimisel eelvaate kuvamiseks." + "ExtractTrickplayImagesHelp": "Trickplay-pildid on sarnased peatükkide piltidega, kuid need hõlmavad kogu sisu. Neid kasutatakse videote skriinimisel eelvaate kuvamiseks.", + "LabelDelimiterWhitelistHelp": "Üksused, mida siltideks jagamisel ignoreeritakse. Iga üksus omaette real.", + "PreferNonstandardArtistsTag": "Eelista ARTISTS silti kui see saadaval on", + "LabelAudioTagSettings": "Audiosiltide seadistused", + "DateModified": "Muutmiskuupäev", + "LabelCustomTagDelimiters": "Kohandatud siltide eraldaja", + "LabelCustomTagDelimitersHelp": "Tähemärgid mida kasutatakse siltide eraldajana.", + "LabelDelimiterWhitelist": "Lubatud eraldusmärgid", + "MessageCancelSeriesTimerError": "Sarja taimeri tühistamisel ilmnes viga", + "MessageCancelTimerError": "Taimeri tühistamisel ilmnes viga", + "MessageSplitVersionsError": "Versioonideks jagamisel tekkis viga", + "PreferNonstandardArtistsTagHelp": "Kasuta ARTIST sildi asemel ebastandartset ARTISTS silti kui see saadaval on.", + "UseCustomTagDelimiters": "Kasuta kohandatud siltide eraldajat", + "UseCustomTagDelimitersHelp": "Kasuta siltideks jagamisel kohandatud tähemärke." } From 0728bad2229931c611c23ac40ed751c5827fae7c Mon Sep 17 00:00:00 2001 From: nextlooper42 Date: Mon, 30 Sep 2024 11:33:58 +0000 Subject: [PATCH 39/45] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index a8e9b41ab4..0d3f4a05d5 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1256,7 +1256,7 @@ "OnWakeFromSleep": "Pri prebúdzaní zo spánku", "WeeklyAt": "{0}s na {1}", "DailyAt": "Denne o {0}", - "LastSeen": "Naposledy videný {0}", + "LastSeen": "Posledná aktivita {0}", "PersonRole": "ako {0}", "ListPaging": "{0}-{1} z {2}", "WriteAccessRequired": "Server vyžaduje práva na zapisovanie do tohoto priečinku. Prosím, uistite sa že má práva na zapisovanie a skúste to znova.", @@ -1899,5 +1899,33 @@ "Regional": "Regionálne", "AlternateDVD": "Alternatívne DVD", "LabelSelectPreferredTranscodeVideoCodec": "Preferovaný video kodek pre prekódovanie", - "HeaderNextItem": "Nasleduje {0}" + "HeaderNextItem": "Nasleduje {0}", + "DisableVbrAudioEncodingHelp": "Zabrániť serveru kódovať zvuk pomocou VBR pre tohto klienta.", + "DateModified": "Dátum úpravy", + "HeaderAudioAdvanced": "Pokročilé nastavenia zvuku", + "HeaderPreviewLyrics": "Náhľad textov piesní", + "LabelAllowStreamSharing": "Povoliť zdieľanie streamu", + "LabelDuration": "Dĺžka", + "LabelDisableVbrAudioEncoding": "Zakázať kódovanie zvuku VBR", + "LabelEnablePlugin": "Povoliť zásuvný modul", + "LabelInstalled": "Nainštalované", + "LabelNotInstalled": "Nie je nainštalované", + "LabelRepository": "Repozitár", + "MediaInfoRotation": "Rotácia", + "MoveToBottom": "Presunúť na spodnú časť", + "MoveToTop": "Presunúť na vrchnú časť", + "PreferNonstandardArtistsTagHelp": "Ak je to možné, použiť neštandardnú značku ARTISTS namiesto značky ARTIST.", + "PreviewLyrics": "Náhľad textov piesní", + "Reset": "Resetovať", + "ReplaceTrickplayImages": "Nahradiť existujúce obrázky trickplay", + "LabelLyricDownloaders": "Sťahovače textov piesní", + "EditLyrics": "Upraviť texty piesní", + "HeaderAddLyrics": "Pridať texty piesní", + "HeaderUploadLyrics": "Nahrať texty piesní", + "LabelIsSynced": "Je synchronizovaný", + "NoLyricsSearchResultsFound": "Nenašli sa žiadne texty piesní.", + "PluginLoadRepoError": "Pri získavaní údajov o zásuvnom module z repozitáru došlo k chybe.", + "LabelAudioTagSettings": "Nastavenia zvukových štítkov", + "LyricDownloadersHelp": "Povoliť a zoradiť preferované sťahovače titulkov podľa priority.", + "SearchForLyrics": "Vyhľadávať texty piesní" } From 43f8a3f50c9a1e1ee309aa7a24b8c29802332e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Guerre?= Date: Mon, 30 Sep 2024 13:08:40 +0000 Subject: [PATCH 40/45] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 5c004e36bd..89495bb1e1 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1860,7 +1860,7 @@ "PlaybackError.NO_MEDIA_ERROR": "Impossible de trouver une source multimédia valide à lire.", "PlaybackError.PLAYER_ERROR": "La lecture a échoué en raison d'une erreur fatale du lecteur.", "LabelTrickplayAccelEncoding": "Activer l'encodage MJPEG accéléré par le matériel", - "LabelTrickplayAccelEncodingHelp": "Actuellement disponible uniquement sur QSV et VAAPI, cette option n'a aucun effet sur les autres méthodes d'accélération matérielle.", + "LabelTrickplayAccelEncodingHelp": "Actuellement disponible uniquement avec QSV, VA-API, VideoToolbox et RKMPP, cette option n'a aucun effet sur les autres méthodes d'accélération matérielle.", "ErrorDeletingLyrics": "Une erreur est survenu lors de la suppression des paroles du serveur. S'il vous plaît verifier que Jellyfin peut modifier les fichier dans le dossier multimedia et réessayez.", "HeaderDeleteLyrics": "Suppression des paroles", "ConfirmDeleteLyrics": "En supprimant ces paroles vous les supprimez a la fois de votre systeme de fichier et de votre bibliothèque. Êtes vous sure de vouloir continuez ?", From 2aaf520378dd479d582ca938b793898c46e3bf67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Mesk=C3=B3?= Date: Mon, 30 Sep 2024 13:01:05 +0000 Subject: [PATCH 41/45] Translated using Weblate (Hungarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/ --- src/strings/hu.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/hu.json b/src/strings/hu.json index 27132877e1..a000a8be7f 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1868,5 +1868,10 @@ "Creator": "Készítő", "Editor": "Szerkesztő", "EnableDtsHelp": "Csak akkor engedélyezze, hogyha az eszköze támogatja a DTS-t vagy ha csatlakoztatott egy megfelelő audió vevőkészüléket. Ellenkező esetben visszajátszási problémákat okozhat.", - "Author": "Szerző" + "Author": "Szerző", + "AllowStreamSharingHelp": "Engedélyezés, hogy a Jellyfin megkettőzze a tunerből származó mpegts adatfolyamot, és megossza azt a kliensekkel. Ez akkor hasznos, ha a tuner korlátozott számú adatfolyamot támogat, de ez egyéb lejátszási problémákat okozhat.", + "AllowFmp4TranscodingContainerHelp": "Az fMP4 átkódolási konténer engedélyezése ehhez a tunerhez, a HEVC és HDR tartalmak engedélyezéséhez. Nem minden tuner kompatibilis ezzel a tárolóval. Tiltsa le, ha lejátszási problémákat tapasztal.", + "Alternate": "Alternatív", + "AlternateDVD": "Alternatív DVD", + "AllowTonemappingSoftwareHelp": "A tónusleképzés képes a HDR videók dinamika tartományát SDR tartományba átalakítani, miközben megtartja a kép színét és részleteit, ami elengedhetetlen az eredeti jelenet megőrzéséhez. Jelenleg csak 10 bites HDR10, HLG és DoVi tartalmakon működik." } From b291b4ff733c81e7e40c19b97e82eda22a0e70d0 Mon Sep 17 00:00:00 2001 From: nextlooper42 Date: Mon, 30 Sep 2024 11:43:00 +0000 Subject: [PATCH 42/45] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index 0d3f4a05d5..3e7aaf5213 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1861,7 +1861,7 @@ "EnableLibraryHelp": "Zakázaním knižnice ju skryjete zo všetkých zobrazení používateľa.", "Lyrics": "Texty piesní", "LabelTrickplayAccelEncoding": "Povoliť hardvérovú akceleráciu kódovania MJPEG", - "LabelTrickplayAccelEncodingHelp": "Táto možnosť je v súčasnosti dostupná len pre QSV a VAAPI, na ostatné metódy hardvérovej akcelerácie nemá žiadny vplyv.", + "LabelTrickplayAccelEncodingHelp": "Táto možnosť je v súčasnosti k dispozícii len pre QSV, VA-API, VideoToolbox a RKMPP, na ostatné metódy hardvérovej akcelerácie nemá žiadny vplyv.", "DeleteLyrics": "Odstrániť texty piesní", "ConfirmDeleteLyrics": "Texty piesní budú odstránené zo systému a aj z knižnice médií. Ste si istí, že chcete pokračovať?", "ErrorDeletingLyrics": "Pri odstraňovaní textov piesní zo servera došlo k chybe. Skontrolujte, či má Jellyfin prístup na zápis do priečinka médií, a skúste to znova.", @@ -1927,5 +1927,25 @@ "PluginLoadRepoError": "Pri získavaní údajov o zásuvnom module z repozitáru došlo k chybe.", "LabelAudioTagSettings": "Nastavenia zvukových štítkov", "LyricDownloadersHelp": "Povoliť a zoradiť preferované sťahovače titulkov podľa priority.", - "SearchForLyrics": "Vyhľadávať texty piesní" + "SearchForLyrics": "Vyhľadávať texty piesní", + "EnableHi10pHelp": "Povoľte, aby ste zabránili prekódovaniu 10-bitových videí kodeku H.264. Túto možnosť zakážte, ak sa vo videu zobrazujú prázdne snímky.", + "LabelTrickplayKeyFrameOnlyExtractionHelp": "Extrahovať iba kľúčové snímky pre výrazne rýchlejšie spracovanie na úkor presnosti časovania. Ak nakonfigurovaný hardvérový dekodér nepodporuje tento režim, použije sa namiesto neho softvérový dekodér.", + "FallbackMaxStreamingBitrateHelp": "Maximálny dátový tok sa používa ako záložná hodnota, keď ffprobe nedokáže určiť dátový tok zdrojového streamu. Pomáha to zabrániť tomu, aby klienti požadovali príliš vysoký dátový tok prekódovania, čo by mohlo spôsobiť zlyhanie prehrávača a preťaženie kodéra.", + "EnableHi10p": "Povoliť profil H.264 High 10", + "LabelAllowFmp4TranscodingContainer": "Povoliť kontajner fMP4 na prekódovanie", + "LabelAlwaysRemuxFlacAudioFiles": "Vždy remuxovať zvukové súbory FLAC", + "LabelAlwaysRemuxMp3AudioFiles": "Vždy remuxovať zvukové súbory MP3", + "LabelSaveTrickplayLocallyHelp": "Uložením obrázkov trickplay do priečinkov médií sa uľahčí ich migrácia a prístup k nim.", + "LibraryInvalidItemIdError": "Knižnica je v neplatnom stave a nie je možné ju upravovať. Pravdepodobne sa stretávate s chybou: cesta v databáze nie je správna cesta v súborovom systéme.", + "SelectPreferredTranscodeVideoCodecHelp": "Vybrať preferovaný kodek videa, do ktorého sa má prekódovať. Ak preferovaný kodek nie je podporovaný, server použije ďalší najlepší dostupný kodek.", + "LabelCustomTagDelimiters": "Vlastný oddeľovač tagov", + "LabelCustomTagDelimitersHelp": "Znaky, ktoré sa majú považovať za oddeľovače na oddelenie tagov.", + "LabelDelimiterWhitelist": "Biela listina oddeľovačov", + "RenderPgsSubtitleHelp": "Určite, či má klient vykresľovať titulky formátu PGS namiesto použitia vpálených titulkov. Tým sa možno vyhnúť prekódovaniu na strane servera výmenou za horší výkon na strane klienta.", + "AllowFmp4TranscodingContainerHelp": "Povolením kontajneru fMP4 pre prekódovanie umožníte tomuto tuneru spracovať obsah vo formáte HEVC a HDR. Nie všetky tunery sú kompatibilné s týmto kontajnerom. Ak sa vyskytnú problémy s prehrávaním, zakažte ho.", + "AllowStreamSharingHelp": "Umožniť aplikácii Jellyfin duplikovať mpegts stream z tunera a zdieľať tento duplikovaný stream so svojimi klientmi. Je to užitočné, keď má tuner limit celkového počtu streamov, ale môže to spôsobiť aj problémy s prehrávaním.", + "AndOtherArtists": "{0} a {1} ďalších umelcov.", + "AlwaysRemuxMp3AudioFilesHelp": "Ak máte súbory, ktorých časové značky váš prehliadač vypočítava nepresne, povoľte túto možnosť ako dočasné riešenie.", + "AlwaysRemuxFlacAudioFilesHelp": "Ak máte súbory, ktoré prehliadač odmieta prehrávať alebo pri ktorých nepresne počíta časové značky, povoľte túto funkciu ako dočasné riešenie.", + "AllowTonemappingSoftwareHelp": "Mapovanie tónov dokáže transformovať dynamický rozsah videa z HDR na SDR pri zachovaní detailov obrazu a farieb, ktoré sú veľmi dôležitými informáciami na zobrazenie pôvodnej scény. V súčasnosti funguje len s 10bitovými videami HDR10, HLG a DoVi." } From f341b11c96a66cf62b5ded9e7d1be0a66cfd632d Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Mon, 30 Sep 2024 22:02:54 +0800 Subject: [PATCH 43/45] Fix the broken LoginAttemptsBeforeLockout fixes a typo made in be891c3 Signed-off-by: nyanmisaka --- src/apps/dashboard/routes/users/profile.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/dashboard/routes/users/profile.tsx b/src/apps/dashboard/routes/users/profile.tsx index 92ef21cf5d..58a1be2e50 100644 --- a/src/apps/dashboard/routes/users/profile.tsx +++ b/src/apps/dashboard/routes/users/profile.tsx @@ -168,8 +168,8 @@ const UserEdit = () => { (page.querySelector('.chkRemoteAccess') as HTMLInputElement).checked = user.Policy?.EnableRemoteAccess == null || user.Policy?.EnableRemoteAccess; (page.querySelector('#txtRemoteClientBitrateLimit') as HTMLInputElement).value = user.Policy?.RemoteClientBitrateLimit && user.Policy?.RemoteClientBitrateLimit > 0 ? (user.Policy?.RemoteClientBitrateLimit / 1e6).toLocaleString(undefined, { maximumFractionDigits: 6 }) : ''; - (page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value = String(user.Policy?.MaxActiveSessions) || '0'; - (page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value = String(user.Policy?.SyncPlayAccess) || '0'; + (page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value = String(user.Policy?.LoginAttemptsBeforeLockout) || '-1'; + (page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value = String(user.Policy?.MaxActiveSessions) || '0'; if (window.ApiClient.isMinServerVersion('10.6.0')) { (page.querySelector('#selectSyncPlayAccess') as HTMLSelectElement).value = String(user.Policy?.SyncPlayAccess); } From c7f494d7b9fa2592f9b1bd4ac1cffc6ce5987634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Guerre?= Date: Mon, 30 Sep 2024 15:40:25 +0000 Subject: [PATCH 44/45] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 89495bb1e1..5d651781b9 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1928,5 +1928,7 @@ "HeaderUploadLyrics": "Téléverser des paroles", "DisableVbrAudioEncodingHelp": "Empêche le serveur d'encoder l'audio avec VBR pour ce client.", "EnableHi10p": "Active le profil H.264 High 10", - "EnableHi10pHelp": "Activer pour éviter l'encodage des vidéos H.264 10-bits. Désactiver cette option si la vidéo affiche des images vides." + "EnableHi10pHelp": "Activer pour éviter l'encodage des vidéos H.264 10-bits. Désactiver cette option si la vidéo affiche des images vides.", + "AlwaysRemuxFlacAudioFilesHelp": "Si votre navigateur refuse de lire des fichiers ou s'il calcule incorrectement l'horodatage, activer ceci en guise d'alternative.", + "AlwaysRemuxMp3AudioFilesHelp": "Si votre navigateur calcule incorrectement l'horodatage de certains fichiers, activer ceci en guise d'alternative." } From 171dc0937313d6277bdf679741c4ec78868358f7 Mon Sep 17 00:00:00 2001 From: nextlooper42 Date: Mon, 30 Sep 2024 13:44:06 +0000 Subject: [PATCH 45/45] Translated using Weblate (Slovak) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sk/ --- src/strings/sk.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/sk.json b/src/strings/sk.json index 3e7aaf5213..af21e7faf2 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1947,5 +1947,10 @@ "AndOtherArtists": "{0} a {1} ďalších umelcov.", "AlwaysRemuxMp3AudioFilesHelp": "Ak máte súbory, ktorých časové značky váš prehliadač vypočítava nepresne, povoľte túto možnosť ako dočasné riešenie.", "AlwaysRemuxFlacAudioFilesHelp": "Ak máte súbory, ktoré prehliadač odmieta prehrávať alebo pri ktorých nepresne počíta časové značky, povoľte túto funkciu ako dočasné riešenie.", - "AllowTonemappingSoftwareHelp": "Mapovanie tónov dokáže transformovať dynamický rozsah videa z HDR na SDR pri zachovaní detailov obrazu a farieb, ktoré sú veľmi dôležitými informáciami na zobrazenie pôvodnej scény. V súčasnosti funguje len s 10bitovými videami HDR10, HLG a DoVi." + "AllowTonemappingSoftwareHelp": "Mapovanie tónov dokáže transformovať dynamický rozsah videa z HDR na SDR pri zachovaní detailov obrazu a farieb, ktoré sú veľmi dôležitými informáciami na zobrazenie pôvodnej scény. V súčasnosti funguje len s 10bitovými videami HDR10, HLG a DoVi.", + "LabelDropLyricsHere": "Pretiahnite texty piesní sem alebo kliknutím vyberte súbor.", + "LabelFallbackMaxStreamingBitrate": "Záložný maximálny dátový tok (Mbps)", + "LabelSaveTrickplayLocally": "Uložit obrázky trickplay k médiám", + "LabelDelimiterWhitelistHelp": "Položky, ktoré sa majú vylúčiť z oddelovania tagov. Jedna položka na riadok.", + "LabelNoChangelog": "Pre túto verziu nie je k dispozícii žiadny zoznam zmien." }