diff --git a/.github/workflows/docker_dev.yml b/.github/workflows/docker_dev.yml
index 05ba6d6d6..db5961ed4 100644
--- a/.github/workflows/docker_dev.yml
+++ b/.github/workflows/docker_dev.yml
@@ -15,9 +15,9 @@ on:
- '**.md'
workflow_dispatch:
inputs:
- tags:
+ tag:
required: true
- description: 'Tags to deploy to'
+ description: 'Tag to deploy to'
env:
# Use docker.io for Docker Hub if empty
@@ -70,6 +70,7 @@ jobs:
- run: yarn build
- name: Docker meta
+ if: github.event_name != 'pull_request'
id: meta
uses: docker/metadata-action@v4
with:
@@ -78,7 +79,8 @@ jobs:
# generate Docker tags based on the following events/attributes
tags: |
type=ref,event=pr
- tpye=raw,value=dev,priority=1
+ type=raw,value=${{ github.event.inputs.tag }}, prefix=test-,enable=${{ github.event.inputs.tag != '' }}
+ tpye=raw,value=dev,priority=1,enable=${{ github.event.inputs.tag == '' }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
@@ -95,6 +97,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
+ if: github.event_name != 'pull_request'
uses: docker/build-push-action@v3
with:
platforms: linux/amd64,linux/arm64,linux/arm/v7
diff --git a/Dockerfile b/Dockerfile
index 42bdaa5a1..4480896d7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,25 +1,18 @@
FROM node:16-alpine
WORKDIR /app
-RUN apk add tzdata
-
ENV NEXT_TELEMETRY_DISABLED 1
ENV NODE_ENV production
-RUN addgroup --system --gid 1001 nodejs
-RUN adduser --system --uid 1001 nextjs
-
COPY next.config.js ./
COPY public ./public
COPY package.json ./package.json
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
-COPY --chown=nextjs:nodejs .next/standalone ./
-COPY --chown=nextjs:nodejs .next/static ./.next/static
-
-USER nextjs
+COPY .next/standalone ./
+COPY .next/static ./.next/static
EXPOSE 7575
diff --git a/README.md b/README.md
index e6cccbef6..9699df517 100644
--- a/README.md
+++ b/README.md
@@ -21,7 +21,7 @@
Join the discord! — Don't forget to star the repo if you are enjoying the project!
- Demo ↗️ • Install ➡️ • Read the Wiki 📄
+ Demo ↗️ • Install ➡️ • Read the Docs 📄
---
@@ -33,7 +33,7 @@ Homarr is a simple and lightweight homepage for your server, that helps you easi
It integrates with the services you use to display information on the homepage (E.g. Show upcoming Sonarr/Radarr releases).
-For a full list of integrations look at: [wiki/integrations](https://github.com/ajnart/homarr/wiki/Integrations)
+For a full list of integrations, [head over to our documentation](https://homarr.vercel.app/docs/advanced-features/integrations).
If you have any questions about Homarr or want to share information with us, please go to one of the following places:
@@ -42,7 +42,7 @@ If you have any questions about Homarr or want to share information with us, ple
*Before you file an [issue](https://github.com/ajnart/homarr/issues/new/choose), make sure you have the read [known issues](#-known-issues) section.*
-**For more information, [read the wiki!](https://github.com/ajnart/homarr/wiki)**
+**For more information, [read the documentation!](https://homarr.vercel.app/docs/about)**
Table of Contents
@@ -64,9 +64,9 @@ If you have any questions about Homarr or want to share information with us, ple
## ✨ Features
- Integrates with services you use.
-- Search the web direcetly from your homepage.
+- Search the web directly from your homepage.
- Real-time status indicator for every service.
-- Automatically finds icons while you type the name of a serivce.
+- Automatically finds icons while you type the name of a service.
- Widgets that can display all types of information.
- Easy deployment with Docker.
- Very light-weight and fast.
@@ -195,7 +195,7 @@ SOFTWARE.
---
- Thank you for visiting! For more information read the wiki!
+ Thank you for visiting! For more information read the documentation!
diff --git a/data/configs/default.json b/data/configs/default.json
index d159270a2..3f2acea0d 100644
--- a/data/configs/default.json
+++ b/data/configs/default.json
@@ -15,12 +15,6 @@
"modules": {
"Search Bar": {
"enabled": true
- },
- "Date": {
- "enabled": false
- },
- "Docker": {
- "enabled": true
}
}
}
\ No newline at end of file
diff --git a/data/constants.ts b/data/constants.ts
index cc319bc33..6c0bbd854 100644
--- a/data/constants.ts
+++ b/data/constants.ts
@@ -1,2 +1,2 @@
export const REPO_URL = 'ajnart/homarr';
-export const CURRENT_VERSION = 'v0.8.2';
+export const CURRENT_VERSION = 'v0.9.1';
diff --git a/next.config.js b/next.config.js
index 7344769da..b91c26880 100644
--- a/next.config.js
+++ b/next.config.js
@@ -5,6 +5,12 @@ const withBundleAnalyzer = require('@next/bundle-analyzer')({
});
module.exports = withBundleAnalyzer({
+ images: {
+ domains: ['cdn.jsdelivr.net'],
+ },
reactStrictMode: false,
+ experimental: {
+ outputStandalone: true,
+ },
output: 'standalone',
});
diff --git a/package.json b/package.json
index d84e6b1ae..d98b109d2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "homarr",
- "version": "0.8.2",
+ "version": "0.9.1",
"description": "Homarr - A homepage for your server.",
"license": "MIT",
"repository": {
@@ -30,37 +30,45 @@
"@dnd-kit/core": "^6.0.5",
"@dnd-kit/sortable": "^7.0.1",
"@dnd-kit/utilities": "^3.2.0",
- "@mantine/core": "^4.2.12",
- "@mantine/dates": "^4.2.12",
- "@mantine/dropzone": "^4.2.12",
- "@mantine/form": "^4.2.12",
- "@mantine/hooks": "^4.2.12",
- "@mantine/next": "^4.2.12",
- "@mantine/notifications": "^4.2.12",
- "@mantine/prism": "^4.2.12",
+ "@emotion/react": "^11.10.0",
+ "@emotion/server": "^11.10.0",
+ "@mantine/carousel": "^5.1.0",
+ "@mantine/core": "^5.1.0",
+ "@mantine/dates": "^5.1.0",
+ "@mantine/dropzone": "^5.1.0",
+ "@mantine/form": "^5.1.0",
+ "@mantine/hooks": "^5.1.0",
+ "@mantine/modals": "^5.1.0",
+ "@mantine/next": "^5.1.0",
+ "@mantine/notifications": "^5.1.0",
+ "@mantine/prism": "^5.0.0",
"@nivo/core": "^0.79.0",
"@nivo/line": "^0.79.1",
- "@tabler/icons": "^1.76.0",
+ "@tabler/icons": "^1.78.0",
+ "add": "^2.0.6",
"axios": "^0.27.2",
+ "consola": "^2.15.3",
"cookies-next": "^2.1.1",
"dayjs": "^1.11.4",
"dockerode": "^3.3.2",
+ "embla-carousel-react": "^7.0.0",
"framer-motion": "^6.5.1",
"js-file-download": "^0.4.12",
- "next": "12.2.0",
+ "next": "12.1.6",
"prism-react-renderer": "^1.3.5",
"react": "^18.2.0",
"react-dom": "^18.2.0",
+ "sharp": "^0.30.7",
"systeminformation": "^5.12.1",
"uuid": "^8.3.2",
"yarn": "^1.22.19"
},
"devDependencies": {
- "@next/bundle-analyzer": "12.2.0",
- "@next/eslint-plugin-next": "12.2.0",
+ "@next/bundle-analyzer": "^12.1.4",
+ "@next/eslint-plugin-next": "^12.1.4",
"@types/dockerode": "^3.3.9",
- "@types/node": "^18.0.6",
- "@types/react": "^18.0.15",
+ "@types/node": "17.0.1",
+ "@types/react": "17.0.1",
"@types/uuid": "^8.3.4",
"@typescript-eslint/eslint-plugin": "^5.30.7",
"@typescript-eslint/parser": "^5.30.7",
diff --git a/src/components/AppShelf/AddAppShelfItem.tsx b/src/components/AppShelf/AddAppShelfItem.tsx
index 2d41feaee..135224a27 100644
--- a/src/components/AppShelf/AddAppShelfItem.tsx
+++ b/src/components/AppShelf/AddAppShelfItem.tsx
@@ -8,8 +8,9 @@ import {
LoadingOverlay,
Modal,
MultiSelect,
- ScrollArea,
+ PasswordInput,
Select,
+ Stack,
Switch,
Tabs,
TextInput,
@@ -17,10 +18,10 @@ import {
Tooltip,
} from '@mantine/core';
import { useForm } from '@mantine/form';
-import { useDebouncedValue } from '@mantine/hooks';
-import { IconApps as Apps } from '@tabler/icons';
+import { IconApps } from '@tabler/icons';
import { useEffect, useState } from 'react';
import { v4 as uuidv4 } from 'uuid';
+import { useDebouncedValue } from '@mantine/hooks';
import { useConfig } from '../../tools/state';
import { tryMatchPort, ServiceTypeList, StatusCodes } from '../../tools/types';
import Tip from '../layout/Tip';
@@ -38,18 +39,18 @@ export function AddItemShelfButton(props: any) {
>
- setOpened(true)}
- >
-
-
-
-
+
+ setOpened(true)}
+ >
+
+
+
>
);
}
@@ -77,7 +78,7 @@ function MatchService(name: string, form: any) {
}
}
-const DEFAULT_ICON = '/favicon.svg';
+const DEFAULT_ICON = '/favicon.png';
export function AddAppShelfItemForm(props: { setOpened: (b: boolean) => void } & any) {
const { setOpened } = props;
@@ -85,25 +86,26 @@ export function AddAppShelfItemForm(props: { setOpened: (b: boolean) => void } &
const [isLoading, setLoading] = useState(false);
// Extract all the categories from the services in config
- const categoryList = config.services.reduce((acc, cur) => {
+ const InitialCategories = config.services.reduce((acc, cur) => {
if (cur.category && !acc.includes(cur.category)) {
acc.push(cur.category);
}
return acc;
}, [] as string[]);
+ const [categories, setCategories] = useState(InitialCategories);
const form = useForm({
initialValues: {
id: props.id ?? uuidv4(),
type: props.type ?? 'Other',
- category: props.category ?? undefined,
+ category: props.category ?? null,
name: props.name ?? '',
icon: props.icon ?? DEFAULT_ICON,
url: props.url ?? '',
- apiKey: props.apiKey ?? (undefined as unknown as string),
- username: props.username ?? (undefined as unknown as string),
- password: props.password ?? (undefined as unknown as string),
- openedUrl: props.openedUrl ?? (undefined as unknown as string),
+ apiKey: props.apiKey ?? undefined,
+ username: props.username ?? undefined,
+ password: props.password ?? undefined,
+ openedUrl: props.openedUrl ?? undefined,
status: props.status ?? ['200'],
newTab: props.newTab ?? true,
},
@@ -133,7 +135,13 @@ export function AddAppShelfItemForm(props: { setOpened: (b: boolean) => void } &
const [debounced, cancel] = useDebouncedValue(form.values.name, 250);
useEffect(() => {
- if (form.values.name !== debounced || form.values.icon !== DEFAULT_ICON) return;
+ if (
+ form.values.name !== debounced ||
+ form.values.icon !== DEFAULT_ICON ||
+ form.values.type !== 'Other'
+ ) {
+ return;
+ }
MatchIcon(form.values.name, form);
MatchService(form.values.name, form);
tryMatchPort(form.values.name, form);
@@ -150,7 +158,7 @@ export function AddAppShelfItemForm(props: { setOpened: (b: boolean) => void } &
return (
<>
-
+
void } &
+
);
}
+ // return console.log(e)} value="1" />;
return (
{
loadConfig(e ?? 'default');
setCookie('config-name', e ?? 'default', {
diff --git a/src/components/Config/LoadConfig.tsx b/src/components/Config/LoadConfig.tsx
index 6935c1f72..75d6972fa 100644
--- a/src/components/Config/LoadConfig.tsx
+++ b/src/components/Config/LoadConfig.tsx
@@ -1,68 +1,18 @@
-import { Group, Text, useMantineTheme, MantineTheme } from '@mantine/core';
-import {
- IconUpload as Upload,
- IconPhoto as Photo,
- IconX as X,
- IconCheck as Check,
- TablerIcon,
-} from '@tabler/icons';
-import { DropzoneStatus, FullScreenDropzone } from '@mantine/dropzone';
+import { Group, Text, useMantineTheme } from '@mantine/core';
+import { IconX as X, IconCheck as Check, IconX, IconPhoto, IconUpload } from '@tabler/icons';
import { showNotification } from '@mantine/notifications';
-import { useRef } from 'react';
-import { useRouter } from 'next/router';
import { setCookie } from 'cookies-next';
+import { Dropzone } from '@mantine/dropzone';
import { useConfig } from '../../tools/state';
import { Config } from '../../tools/types';
import { migrateToIdConfig } from '../../tools/migrate';
-function getIconColor(status: DropzoneStatus, theme: MantineTheme) {
- return status.accepted
- ? theme.colors[theme.primaryColor][theme.colorScheme === 'dark' ? 4 : 6]
- : status.rejected
- ? theme.colors.red[theme.colorScheme === 'dark' ? 4 : 6]
- : theme.colorScheme === 'dark'
- ? theme.colors.dark[0]
- : theme.colors.gray[7];
-}
-
-function ImageUploadIcon({
- status,
- ...props
-}: React.ComponentProps & { status: DropzoneStatus }) {
- if (status.accepted) {
- return ;
- }
-
- if (status.rejected) {
- return ;
- }
-
- return ;
-}
-
-export const dropzoneChildren = (status: DropzoneStatus, theme: MantineTheme) => (
-
-
-
-
-
- Drag images here or click to select files
-
-
- Attach as many files as you like, each file should not exceed 5mb
-
-
-
-);
-
export default function LoadConfigComponent(props: any) {
const { setConfig } = useConfig();
const theme = useMantineTheme();
- const router = useRouter();
- const openRef = useRef<() => void>();
return (
- {
files[0].text().then((e) => {
try {
@@ -100,7 +50,31 @@ export default function LoadConfigComponent(props: any) {
}}
accept={['application/json']}
>
- {(status) => dropzoneChildren(status, theme)}
-
+
+
+
+
+ Drag files here to upload a config. Support for JSON only.
+
+
+
+
+
+ This file format is not supported. Please only upload JSON.
+
+
+
+
+
+
+
);
}
diff --git a/src/components/Settings/AdvancedSettings.tsx b/src/components/Settings/AdvancedSettings.tsx
index 4c7d6a50e..877fc79c7 100644
--- a/src/components/Settings/AdvancedSettings.tsx
+++ b/src/components/Settings/AdvancedSettings.tsx
@@ -1,4 +1,4 @@
-import { TextInput, Group, Button } from '@mantine/core';
+import { TextInput, Button, Stack } from '@mantine/core';
import { useForm } from '@mantine/form';
import { useConfig } from '../../tools/state';
import { ColorSelector } from './ColorSelector';
@@ -37,14 +37,14 @@ export default function TitleChanger() {
};
return (
-
+
-
+
);
}
diff --git a/src/components/Settings/AppCardWidthSelector.tsx b/src/components/Settings/AppCardWidthSelector.tsx
index 945778e67..26b453cd3 100644
--- a/src/components/Settings/AppCardWidthSelector.tsx
+++ b/src/components/Settings/AppCardWidthSelector.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { Group, Text, Slider } from '@mantine/core';
+import { Text, Slider, Stack } from '@mantine/core';
import { useConfig } from '../../tools/state';
export function AppCardWidthSelector() {
@@ -16,7 +16,7 @@ export function AppCardWidthSelector() {
};
return (
-
+
App Width
setappCardWidth(value)}
/>
-
+
);
}
diff --git a/src/components/Settings/ColorSelector.tsx b/src/components/Settings/ColorSelector.tsx
index e7f175b3d..68a762989 100644
--- a/src/components/Settings/ColorSelector.tsx
+++ b/src/components/Settings/ColorSelector.tsx
@@ -1,5 +1,5 @@
import React, { useState } from 'react';
-import { ColorSwatch, Group, Popover, Text, useMantineTheme } from '@mantine/core';
+import { ColorSwatch, Grid, Group, Popover, Text, useMantineTheme } from '@mantine/core';
import { useConfig } from '../../tools/state';
import { useColorTheme } from '../../tools/color';
@@ -44,51 +44,43 @@ export function ColorSelector({ type }: ColorControlProps) {
};
const swatches = colors.map(({ color, swatch }) => (
- setConfigColor(color)}
- key={color}
- color={swatch}
- size={22}
- style={{ color: theme.white, cursor: 'pointer' }}
- />
+
+ setConfigColor(color)}
+ color={swatch}
+ size={22}
+ style={{ cursor: 'pointer' }}
+ />
+
));
return (
-
+
setOpened(false)}
- transitionDuration={0}
- target={
+ position="left"
+ withArrow
+ >
+
setOpened((o) => !o)}
size={22}
- style={{ display: 'block', cursor: 'pointer' }}
+ style={{ cursor: 'pointer' }}
/>
- }
- styles={{
- root: {
- marginRight: theme.spacing.xs,
- },
- body: {
- width: 152,
- backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.white,
- },
- arrow: {
- backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.white,
- },
- }}
- position="bottom"
- placement="end"
- withArrow
- arrowSize={3}
- >
- {swatches}
+
+
+
+ {swatches}
+
+
{type[0].toUpperCase() + type.slice(1)} color
diff --git a/src/components/Settings/CommonSettings.tsx b/src/components/Settings/CommonSettings.tsx
index 4d55eee18..739f65869 100644
--- a/src/components/Settings/CommonSettings.tsx
+++ b/src/components/Settings/CommonSettings.tsx
@@ -1,4 +1,4 @@
-import { Group, Text, SegmentedControl, TextInput } from '@mantine/core';
+import { Text, SegmentedControl, TextInput, Stack } from '@mantine/core';
import { useState } from 'react';
import { useConfig } from '../../tools/state';
import { ColorSchemeSwitch } from '../ColorSchemeToggle/ColorSchemeSwitch';
@@ -24,8 +24,8 @@ export default function CommonSettings(args: any) {
);
return (
-
-
+
+
Search engine
Use the prefixes !yt and !t in front of your query to search on YouTube or
@@ -74,13 +74,13 @@ export default function CommonSettings(args: any) {
/>
>
)}
-
+
Upload your config file by dragging and dropping it onto the page!
-
+
);
}
diff --git a/src/components/Settings/Credits.tsx b/src/components/Settings/Credits.tsx
index 1d6271479..73778b0d5 100644
--- a/src/components/Settings/Credits.tsx
+++ b/src/components/Settings/Credits.tsx
@@ -4,7 +4,7 @@ import { CURRENT_VERSION } from '../../../data/constants';
export default function Credits(props: any) {
return (
-
+
component="a" href="https://github.com/ajnart/homarr" size="lg">
diff --git a/src/components/Settings/ModuleEnabler.tsx b/src/components/Settings/ModuleEnabler.tsx
index ab07327b3..7b7378f32 100644
--- a/src/components/Settings/ModuleEnabler.tsx
+++ b/src/components/Settings/ModuleEnabler.tsx
@@ -1,14 +1,14 @@
-import { Checkbox, Group, SimpleGrid, Title } from '@mantine/core';
-import * as Modules from '../modules';
+import { Checkbox, SimpleGrid, Stack, Title } from '@mantine/core';
+import * as Modules from '../../modules';
import { useConfig } from '../../tools/state';
export default function ModuleEnabler(props: any) {
const { config, setConfig } = useConfig();
const modules = Object.values(Modules).map((module) => module);
return (
-
+
Module enabler
-
+
{modules.map((module) => (
))}
-
+
);
}
diff --git a/src/components/Settings/OpacitySelector.tsx b/src/components/Settings/OpacitySelector.tsx
index f94225cd8..9e6ca1594 100644
--- a/src/components/Settings/OpacitySelector.tsx
+++ b/src/components/Settings/OpacitySelector.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { Group, Text, Slider } from '@mantine/core';
+import { Text, Slider, Stack } from '@mantine/core';
import { useConfig } from '../../tools/state';
export function OpacitySelector() {
@@ -29,7 +29,7 @@ export function OpacitySelector() {
};
return (
-
+
App Opacity
setConfigOpacity(value)}
/>
-
+
);
}
diff --git a/src/components/Settings/SettingsMenu.tsx b/src/components/Settings/SettingsMenu.tsx
index fcd6d1b91..3d66ad73c 100644
--- a/src/components/Settings/SettingsMenu.tsx
+++ b/src/components/Settings/SettingsMenu.tsx
@@ -8,17 +8,21 @@ import Credits from './Credits';
function SettingsMenu(props: any) {
return (
-
-
+
+
+ Common
+ Customizations
+
+
-
-
+
+
-
+
);
}
@@ -40,18 +44,18 @@ export function SettingsMenuButton(props: any) {
- setOpened(true)}
- >
-
+
+ setOpened(true)}
+ >
-
-
+
+
>
);
}
diff --git a/src/components/Settings/ShadeSelector.tsx b/src/components/Settings/ShadeSelector.tsx
index ebd55e84d..addbf0906 100644
--- a/src/components/Settings/ShadeSelector.tsx
+++ b/src/components/Settings/ShadeSelector.tsx
@@ -1,5 +1,14 @@
import React, { useState } from 'react';
-import { ColorSwatch, Group, Popover, Text, useMantineTheme, MantineTheme } from '@mantine/core';
+import {
+ ColorSwatch,
+ Group,
+ Popover,
+ Text,
+ useMantineTheme,
+ MantineTheme,
+ Stack,
+ Grid,
+} from '@mantine/core';
import { useConfig } from '../../tools/state';
import { useColorTheme } from '../../tools/color';
@@ -31,36 +40,42 @@ export function ShadeSelector() {
};
const primarySwatches = primaryShades.map(({ swatch, shade }) => (
- setConfigShade(shade)}
- key={Number(shade)}
- color={swatch}
- size={22}
- style={{ color: theme.white, cursor: 'pointer' }}
- />
+
+ setConfigShade(shade)}
+ color={swatch}
+ size={22}
+ style={{ cursor: 'pointer' }}
+ />
+
));
const secondarySwatches = secondaryShades.map(({ swatch, shade }) => (
- setConfigShade(shade)}
- key={Number(shade)}
- color={swatch}
- size={22}
- style={{ color: theme.white, cursor: 'pointer' }}
- />
+
+ setConfigShade(shade)}
+ color={swatch}
+ size={22}
+ style={{ cursor: 'pointer' }}
+ />
+
));
return (
-
+
setOpened(false)}
- transitionDuration={0}
- target={
+ position="left"
+ withArrow
+ >
+
- }
- styles={{
- root: {
- marginRight: theme.spacing.xs,
- },
- body: {
- backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.white,
- },
- arrow: {
- backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.white,
- },
- }}
- position="bottom"
- placement="end"
- withArrow
- arrowSize={3}
- >
-
- {primarySwatches}
- {secondarySwatches}
-
+
+
+
+
+ {primarySwatches}
+ {secondarySwatches}
+
+
+
Shade
diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx
index 9c78905b9..7d675f5a8 100644
--- a/src/components/layout/Header.tsx
+++ b/src/components/layout/Header.tsx
@@ -1,9 +1,8 @@
import { Box, createStyles, Group, Header as Head } from '@mantine/core';
-import { useBooleanToggle } from '@mantine/hooks';
import { AddItemShelfButton } from '../AppShelf/AddAppShelfItem';
-import DockerMenuButton from '../modules/docker/DockerModule';
-import SearchBar from '../modules/search/SearchModule';
+import DockerMenuButton from '../../modules/docker/DockerModule';
+import SearchBar from '../../modules/search/SearchModule';
import { SettingsMenuButton } from '../Settings/SettingsMenu';
import { Logo } from './Logo';
@@ -23,9 +22,7 @@ const useStyles = createStyles((theme) => ({
}));
export function Header(props: any) {
- const [opened, toggleOpened] = useBooleanToggle(false);
const { classes, cx } = useStyles();
- const [hidden, toggleHidden] = useBooleanToggle(true);
return (
diff --git a/src/components/layout/Layout.tsx b/src/components/layout/Layout.tsx
index 0df7c4374..d91a3122d 100644
--- a/src/components/layout/Layout.tsx
+++ b/src/components/layout/Layout.tsx
@@ -18,6 +18,7 @@ export default function Layout({ children, style }: any) {
return (
}
navbar={widgetPosition ? : undefined}
aside={widgetPosition ? undefined : }
diff --git a/src/components/layout/Widgets.tsx b/src/components/layout/Widgets.tsx
index 8e1418fa0..307671011 100644
--- a/src/components/layout/Widgets.tsx
+++ b/src/components/layout/Widgets.tsx
@@ -1,16 +1,16 @@
-import { Group } from '@mantine/core';
-import { CalendarModule, DateModule, TotalDownloadsModule, WeatherModule } from '../modules';
-import { DashdotModule } from '../modules/dash.';
-import { ModuleWrapper } from '../modules/moduleWrapper';
+import { Stack } from '@mantine/core';
+import { CalendarModule, DateModule, TotalDownloadsModule, WeatherModule } from '../../modules';
+import { DashdotModule } from '../../modules/dashdot';
+import { ModuleWrapper } from '../../modules/moduleWrapper';
export default function Widgets(props: any) {
return (
-
+
-
+
);
}
diff --git a/src/components/modules/common/MediaDisplay.tsx b/src/components/modules/common/MediaDisplay.tsx
deleted file mode 100644
index 74373a6cc..000000000
--- a/src/components/modules/common/MediaDisplay.tsx
+++ /dev/null
@@ -1,193 +0,0 @@
-import {
- Image,
- Group,
- Title,
- Badge,
- Text,
- ActionIcon,
- Anchor,
- ScrollArea,
- createStyles,
-} from '@mantine/core';
-import { useMediaQuery } from '@mantine/hooks';
-import { IconLink as Link } from '@tabler/icons';
-import { useConfig } from '../../../tools/state';
-import { serviceItem } from '../../../tools/types';
-
-export interface IMedia {
- overview: string;
- imdbId?: any;
- artist?: string;
- title: string;
- poster?: string;
- genres: string[];
- seasonNumber?: number;
- episodeNumber?: number;
-}
-
-const useStyles = createStyles((theme) => ({
- overview: {
- [theme.fn.largerThan('sm')]: {
- width: 400,
- },
- },
-}));
-
-export function MediaDisplay(props: { media: IMedia }) {
- const { media }: { media: IMedia } = props;
- const { classes, cx } = useStyles();
- const phone = useMediaQuery('(min-width: 800px)');
- return (
-
-
- {media.poster && (
-
- )}
-
-
- {media.title}
- {media.imdbId && (
-
-
-
-
-
- )}
-
- {media.artist && (
-
- New release from {media.artist}
-
- )}
- {media.episodeNumber && media.seasonNumber && (
-
- Season {media.seasonNumber} episode {media.episodeNumber}
-
- )}
-
-
- {media.overview}
-
- {media.genres.slice(-5).map((genre: string, i: number) => (
-
- {genre}
-
- ))}
-
-
-
-
- );
-}
-
-export function ReadarrMediaDisplay(props: any) {
- const { media }: { media: any } = props;
- const { config } = useConfig();
- // Find lidarr in services
- const readarr = config.services.find((service: serviceItem) => service.type === 'Readarr');
- // Find a poster CoverType
- const poster = media.images.find((image: any) => image.coverType === 'cover');
- if (!readarr) {
- return null;
- }
- const baseUrl = new URL(readarr.url).origin;
- // Remove '/' from the end of the lidarr url
- const fullLink = `${baseUrl}${poster.url}`;
- // Return a movie poster containting the title and the description
- return (
-
- );
-}
-
-export function LidarrMediaDisplay(props: any) {
- const { media }: { media: any } = props;
- const { config } = useConfig();
- // Find lidarr in services
- const lidarr = config.services.find((service: serviceItem) => service.type === 'Lidarr');
- // Find a poster CoverType
- const poster = media.images.find((image: any) => image.coverType === 'cover');
- if (!lidarr) {
- return null;
- }
- const baseUrl = new URL(lidarr.url).origin;
- // Remove '/' from the end of the lidarr url
- const fullLink = poster ? `${baseUrl}${poster.url}` : undefined;
- // Return a movie poster containting the title and the description
- return (
-
- );
-}
-
-export function RadarrMediaDisplay(props: any) {
- const { media }: { media: any } = props;
- // Find a poster CoverType
- const poster = media.images.find((image: any) => image.coverType === 'poster');
- // Return a movie poster containting the title and the description
- return (
-
- );
-}
-
-export function SonarrMediaDisplay(props: any) {
- const { media }: { media: any } = props;
- // Find a poster CoverType
- const poster = media.series.images.find((image: any) => image.coverType === 'poster');
- // Return a movie poster containting the title and the description
- return (
-
- );
-}
diff --git a/src/components/modules/search/SearchModule.tsx b/src/components/modules/search/SearchModule.tsx
deleted file mode 100644
index 75a206097..000000000
--- a/src/components/modules/search/SearchModule.tsx
+++ /dev/null
@@ -1,127 +0,0 @@
-import { Kbd, createStyles, Autocomplete } from '@mantine/core';
-import { useDebouncedValue, useForm, useHotkeys } from '@mantine/hooks';
-import { useEffect, useRef, useState } from 'react';
-import {
- IconSearch as Search,
- IconBrandYoutube as BrandYoutube,
- IconDownload as Download,
-} from '@tabler/icons';
-import axios from 'axios';
-import { useConfig } from '../../../tools/state';
-import { IModule } from '../modules';
-
-const useStyles = createStyles((theme) => ({
- hide: {
- [theme.fn.smallerThan('sm')]: {
- display: 'none',
- },
- display: 'flex',
- alignItems: 'center',
- },
-}));
-
-export const SearchModule: IModule = {
- title: 'Search Bar',
- description: 'Show the current time and date in a card',
- icon: Search,
- component: SearchBar,
-};
-
-export default function SearchBar(props: any) {
- const { config, setConfig } = useConfig();
- const [opened, setOpened] = useState(false);
- const [icon, setIcon] = useState( );
- const queryUrl = config.settings.searchUrl ?? 'https://www.google.com/search?q=';
- const textInput = useRef();
- // Find a service with the type of 'Overseerr'
- const form = useForm({
- initialValues: {
- query: '',
- },
- });
-
- const [debounced, cancel] = useDebouncedValue(form.values.query, 250);
- const [results, setResults] = useState([]);
- useEffect(() => {
- if (form.values.query !== debounced || form.values.query === '') return;
- axios
- .get(`/api/modules/search?q=${form.values.query}`)
- .then((res) => setResults(res.data ?? []));
- }, [debounced]);
- useHotkeys([['ctrl+K', () => textInput.current && textInput.current.focus()]]);
- const { classes, cx } = useStyles();
- const rightSection = (
-
- Ctrl
- +
- K
-
- );
-
- // If enabled modules doesn't contain the module, return null
- // If module in enabled
-
- const exists = config.modules?.[SearchModule.title]?.enabled ?? false;
- if (!exists) {
- return null;
- }
-
- const autocompleteData = results.map((result) => ({
- label: result.phrase,
- value: result.phrase,
- }));
- return (
-
- );
-}
diff --git a/src/components/modules/system/SystemModule.tsx b/src/components/modules/system/SystemModule.tsx
deleted file mode 100644
index 8201f36cc..000000000
--- a/src/components/modules/system/SystemModule.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { Center, Group, RingProgress, Title, useMantineTheme } from '@mantine/core';
-import { IconCpu } from '@tabler/icons';
-import { useEffect, useState } from 'react';
-import axios from 'axios';
-import si from 'systeminformation';
-import { useListState } from '@mantine/hooks';
-import { IModule } from '../modules';
-import { useSetSafeInterval } from '../../../tools/hooks/useSetSafeInterval';
-
-export const SystemModule: IModule = {
- title: 'System info',
- description: 'Show the current CPU usage and memory usage',
- icon: IconCpu,
- component: SystemInfo,
-};
-
-interface ApiResponse {
- cpu: si.Systeminformation.CpuData;
- os: si.Systeminformation.OsData;
- memory: si.Systeminformation.MemData;
- load: si.Systeminformation.CurrentLoadData;
-}
-
-export default function SystemInfo(args: any) {
- const [data, setData] = useState();
- const setSafeInterval = useSetSafeInterval();
- // Refresh data every second
- useEffect(() => {
- setSafeInterval(() => {
- axios.get('/api/modules/systeminfo').then((res) => setData(res.data));
- }, 1000);
- }, []);
-
- // Update data every time data changes
- const [cpuLoadHistory, cpuLoadHistoryHandlers] =
- useListState([]);
-
- // useEffect(() => {
-
- // }, [data]);
-
- const theme = useMantineTheme();
- const currentLoad = data?.load?.currentLoad ?? 0;
-
- return (
-
-
- Current CPU load
- {`${currentLoad.toFixed(2)}%`} }
- thickness={15}
- roundCaps
- sections={[{ value: currentLoad ?? 0, color: 'cyan' }]}
- />
-
-
- );
-}
diff --git a/src/components/modules/system/index.ts b/src/components/modules/system/index.ts
deleted file mode 100644
index 75d1a257e..000000000
--- a/src/components/modules/system/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { SystemModule } from './SystemModule';
diff --git a/src/middleware.ts b/src/middleware.ts
deleted file mode 100644
index e3720397e..000000000
--- a/src/middleware.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { NextResponse } from 'next/server';
-import type { NextRequest } from 'next/server';
-
-// eslint-disable-next-line consistent-return
-export function middleware(request: NextRequest) {
- const cookie = request.cookies.get('password');
- const isPasswordCorrect = cookie === process.env.PASSWORD;
- if (
- !isPasswordCorrect &&
- request.nextUrl.pathname !== '/login' &&
- request.nextUrl.pathname !== '/api/configs/trylogin'
- ) {
- return NextResponse.rewrite(new URL('/login', request.url));
- }
-}
diff --git a/src/components/modules/modules.tsx b/src/modules/ModuleTypes.d.ts
similarity index 100%
rename from src/components/modules/modules.tsx
rename to src/modules/ModuleTypes.d.ts
diff --git a/src/components/modules/calendar/CalendarModule.tsx b/src/modules/calendar/CalendarModule.tsx
similarity index 72%
rename from src/components/modules/calendar/CalendarModule.tsx
rename to src/modules/calendar/CalendarModule.tsx
index f90784142..896faa940 100644
--- a/src/components/modules/calendar/CalendarModule.tsx
+++ b/src/modules/calendar/CalendarModule.tsx
@@ -12,16 +12,17 @@ import React, { useEffect, useState } from 'react';
import { Calendar } from '@mantine/dates';
import { IconCalendar as CalendarIcon } from '@tabler/icons';
import axios from 'axios';
-import { useConfig } from '../../../tools/state';
-import { IModule } from '../modules';
+import { useDisclosure } from '@mantine/hooks';
+import { useConfig } from '../../tools/state';
+import { IModule } from '../ModuleTypes';
import {
SonarrMediaDisplay,
RadarrMediaDisplay,
LidarrMediaDisplay,
ReadarrMediaDisplay,
} from '../common';
-import { serviceItem } from '../../../tools/types';
-import { useColorTheme } from '../../../tools/color';
+import { serviceItem } from '../../tools/types';
+import { useColorTheme } from '../../tools/color';
export const CalendarModule: IModule = {
title: 'Calendar',
@@ -170,7 +171,7 @@ function DayComponent(props: any) {
readarrmedias,
}: { renderdate: Date; sonarrmedias: []; radarrmedias: []; lidarrmedias: []; readarrmedias: [] } =
props;
- const [opened, setOpened] = useState(false);
+ const [opened, { close, open }] = useDisclosure(false);
const day = renderdate.getDate();
@@ -191,124 +192,129 @@ function DayComponent(props: any) {
const date = new Date(media.inCinemas);
return date.toDateString() === renderdate.toDateString();
});
- if (
- sonarrFiltered.length === 0 &&
- radarrFiltered.length === 0 &&
- lidarrFiltered.length === 0 &&
- readarrFiltered.length === 0
- ) {
+ const totalFiltered = [
+ ...readarrFiltered,
+ ...lidarrFiltered,
+ ...sonarrFiltered,
+ ...radarrFiltered,
+ ];
+ if (totalFiltered.length === 0) {
return {day}
;
}
return (
- {
- setOpened(true);
- }}
+
- {readarrFiltered.length > 0 && (
-
+
+ {readarrFiltered.length > 0 && (
+
+ )}
+ {radarrFiltered.length > 0 && (
+
+ )}
+ {sonarrFiltered.length > 0 && (
+
+ )}
+ {lidarrFiltered.length > 0 && (
+
+ )}
+ {day}
+
+
+
+ 1 ? totalFiltered.slice(0, 2).length * 150 : 200,
+ width: 400,
}}
- color="red"
- children={null}
- />
- )}
- {radarrFiltered.length > 0 && (
-
- )}
- {sonarrFiltered.length > 0 && (
-
- )}
- {lidarrFiltered.length > 0 && (
-
- )}
- setOpened(false)}
- opened={opened}
- target={day}
- >
-
+ >
{sonarrFiltered.map((media: any, index: number) => (
- {index < sonarrFiltered.length - 1 && }
+ {index < sonarrFiltered.length - 1 && }
))}
{radarrFiltered.length > 0 && sonarrFiltered.length > 0 && (
-
+
)}
{radarrFiltered.map((media: any, index: number) => (
- {index < radarrFiltered.length - 1 && }
+ {index < radarrFiltered.length - 1 && }
))}
{sonarrFiltered.length > 0 && lidarrFiltered.length > 0 && (
-
+
)}
{lidarrFiltered.map((media: any, index: number) => (
- {index < lidarrFiltered.length - 1 && }
+ {index < lidarrFiltered.length - 1 && }
))}
{lidarrFiltered.length > 0 && readarrFiltered.length > 0 && (
-
+
)}
{readarrFiltered.map((media: any, index: number) => (
- {index < readarrFiltered.length - 1 && }
+ {index < readarrFiltered.length - 1 && }
))}
-
-
+
+
);
}
diff --git a/src/components/modules/calendar/index.ts b/src/modules/calendar/index.ts
similarity index 100%
rename from src/components/modules/calendar/index.ts
rename to src/modules/calendar/index.ts
diff --git a/src/components/modules/calendar/mediaExample.ts b/src/modules/calendar/mediaExample.ts
similarity index 100%
rename from src/components/modules/calendar/mediaExample.ts
rename to src/modules/calendar/mediaExample.ts
diff --git a/src/modules/common/MediaDisplay.tsx b/src/modules/common/MediaDisplay.tsx
new file mode 100644
index 000000000..d00822776
--- /dev/null
+++ b/src/modules/common/MediaDisplay.tsx
@@ -0,0 +1,260 @@
+import { Badge, Button, Group, Image, Stack, Text, Title } from '@mantine/core';
+import { IconDownload, IconExternalLink, IconPlayerPlay } from '@tabler/icons';
+import { useState } from 'react';
+import { useColorTheme } from '../../tools/color';
+import { useConfig } from '../../tools/state';
+import { serviceItem } from '../../tools/types';
+import { RequestModal } from '../overseerr/RequestModal';
+import { Result } from '../overseerr/SearchResult';
+
+export interface IMedia {
+ overview: string;
+ imdbId?: any;
+ tmdbId?: any;
+ artist?: string;
+ title?: string;
+ type: 'movie' | 'tvshow' | 'book' | 'music' | 'overseer';
+ episodetitle?: string;
+ voteAverage?: string;
+ poster?: string;
+ genres: string[];
+ seasonNumber?: number;
+ plexUrl?: string;
+ episodeNumber?: number;
+ [key: string]: any;
+}
+
+export function OverseerrMediaDisplay(props: any) {
+ const { media }: { media: Result } = props;
+ const { config } = useConfig();
+ const service = config.services.find(
+ (service) => service.type === 'Overseerr' || service.type === 'Jellyseerr'
+ );
+
+ return (
+
+ );
+}
+
+export function ReadarrMediaDisplay(props: any) {
+ const { media }: { media: any } = props;
+ const { config } = useConfig();
+ // Find lidarr in services
+ const readarr = config.services.find((service: serviceItem) => service.type === 'Readarr');
+ // Find a poster CoverType
+ const poster = media.images.find((image: any) => image.coverType === 'cover');
+ if (!readarr) {
+ return null;
+ }
+ const baseUrl = readarr.openedUrl
+ ? new URL(readarr.openedUrl).origin
+ : new URL(readarr.url).origin;
+ // Remove '/' from the end of the lidarr url
+ const fullLink = poster ? `${baseUrl}${poster.url}` : undefined;
+ // Return a movie poster containting the title and the description
+ return (
+
+ );
+}
+
+export function LidarrMediaDisplay(props: any) {
+ const { media }: { media: any } = props;
+ const { config } = useConfig();
+ // Find lidarr in services
+ const lidarr = config.services.find((service: serviceItem) => service.type === 'Lidarr');
+ // Find a poster CoverType
+ const poster = media.images.find((image: any) => image.coverType === 'cover');
+ if (!lidarr) {
+ return null;
+ }
+ const baseUrl = lidarr.openedUrl ? new URL(lidarr.openedUrl).origin : new URL(lidarr.url).origin;
+ // Remove '/' from the end of the lidarr url
+ const fullLink = poster ? `${baseUrl}${poster.url}` : undefined;
+ // Return a movie poster containting the title and the description
+ return (
+
+ );
+}
+
+export function RadarrMediaDisplay(props: any) {
+ const { media }: { media: any } = props;
+ // Find a poster CoverType
+ return (
+ image.coverType === 'poster')?.url,
+ voteAverage: media.ratings.tmdb.value.toString(),
+ imdbId: media.imdbId,
+ type: 'movie',
+ }}
+ />
+ );
+}
+
+export function SonarrMediaDisplay(props: any) {
+ const { media }: { media: any } = props;
+ // Find a poster CoverType
+ const poster = media.series.images.find((image: any) => image.coverType === 'poster');
+ // Return a movie poster containting the title and the description
+ return (
+
+ );
+}
+
+export function MediaDisplay({ media }: { media: IMedia }) {
+ const [opened, setOpened] = useState(false);
+ const { secondaryColor } = useColorTheme();
+
+ return (
+
+
+
+
+
+ {media.title}
+
+
+ {media.type === 'tvshow' && (
+
+ s{media.seasonNumber}e{media.episodeNumber} - {media.episodetitle}
+
+ )}
+ {media.type === 'music' && (
+
+ {media.artist}
+
+ )}
+ {media.type === 'movie' && (
+
+ Radarr
+
+ )}
+ {media.type === 'book' && (
+
+ Readarr
+
+ )}
+ {media.genres.slice(0, 2).map((genre) => (
+
+ {genre}
+
+ ))}
+
+
+ {media.overview}
+
+
+
+ {media.plexUrl && (
+ }
+ >
+ Play
+
+ )}
+ {media.imdbId && (
+ }
+ >
+ IMDb
+
+ )}
+ {media.overseerrId && (
+ }
+ >
+ TMDb
+
+ )}
+ {media.type === 'overseer' && !media.overseerrResult?.mediaInfo?.mediaAddedAt && (
+ <>
+
+ setOpened(true)}
+ color={secondaryColor}
+ size="sm"
+ rightIcon={ }
+ >
+ Request
+
+ >
+ )}
+
+
+
+ );
+}
diff --git a/src/modules/common/examples/book.json b/src/modules/common/examples/book.json
new file mode 100644
index 000000000..9548309a4
--- /dev/null
+++ b/src/modules/common/examples/book.json
@@ -0,0 +1,57 @@
+{
+ "title": "Mika in Real Life",
+ "authorTitle": "jean, emiko Mika in Real Life",
+ "seriesTitle": "",
+ "disambiguation": "",
+ "authorId": 1,
+ "foreignBookId": "93584169",
+ "titleSlug": "93584169",
+ "monitored": true,
+ "anyEditionOk": false,
+ "ratings": {
+ "votes": 149,
+ "value": 4.15,
+ "popularity": 618.35
+ },
+ "releaseDate": "2022-08-09T00:00:00Z",
+ "pageCount": 384,
+ "genres": [
+ "fiction",
+ "romance",
+ "contemporary",
+ "adult",
+ "adult-fiction",
+ "chick-lit",
+ "womens-fiction",
+ "asian-literature",
+ "family",
+ "lgbt"
+ ],
+ "images": [
+ {
+ "url": "/MediaCover/Books/1/cover.jpg?lastWrite=637899714580000000",
+ "coverType": "cover",
+ "extension": ".jpg"
+ }
+ ],
+ "links": [
+ {
+ "url": "https://www.goodreads.com/work/editions/93584169",
+ "name": "Goodreads Editions"
+ },
+ {
+ "url": "https://www.goodreads.com/book/show/59430548-mika-in-real-life",
+ "name": "Goodreads Book"
+ }
+ ],
+ "statistics": {
+ "bookFileCount": 0,
+ "bookCount": 0,
+ "totalBookCount": 1,
+ "sizeOnDisk": 0,
+ "percentOfBooks": 0
+ },
+ "added": "2022-08-07T20:48:09Z",
+ "grabbed": false,
+ "id": 1
+}
\ No newline at end of file
diff --git a/src/modules/common/examples/movie.json b/src/modules/common/examples/movie.json
new file mode 100644
index 000000000..594b14c73
--- /dev/null
+++ b/src/modules/common/examples/movie.json
@@ -0,0 +1,70 @@
+{
+ "title": "The Tunnel to Summer, the Exit of Goodbyes",
+ "originalTitle": "夏へのトンネル、さよならの出口",
+ "originalLanguage": {
+ "id": 8,
+ "name": "Japanese"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 1,
+ "title": "Natsu e no Tunnel, Sayonara no Deguchi",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "tunnel to summer exit goodbyes",
+ "sizeOnDisk": 0,
+ "status": "announced",
+ "overview": "Tono Kaoru heard a rumor: The laws of space and time mean nothing to the Urashima Tunnel. If you find it, walk through and you'll find your heart's desire on the other side...in exchange for years of your own life. On the night Kaoru just so happens to find himself standing in front of a tunnel that looks suspiciously like the one the rumor describes, he finds himself thinking of Karen, the sister he lost in an accident five years ago. To Kaoru's surprise, he's been followed by the new transfer student Anzu Hanaki, who promises to help him experiment with the mysterious tunnel--but what does she want from Kaoru in exchange? And what will he have left to give, after the tunnel's done with him?",
+ "inCinemas": "2022-09-09T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/3x5gc6dHsfNqZryipu159IALEPH.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/zO3QSYs858SqiapafD7iJp17KVD.jpg"
+ }
+ ],
+ "website": "https://natsuton.com/",
+ "year": 2022,
+ "hasFile": false,
+ "youTubeTrailerId": "",
+ "studio": "Pony Canyon",
+ "path": "/data/Library/Movies/The Tunnel to Summer, the Exit of Goodbyes (2022)",
+ "qualityProfileId": 4,
+ "monitored": true,
+ "minimumAvailability": "announced",
+ "isAvailable": true,
+ "folderName": "/data/Library/Movies/The Tunnel to Summer, the Exit of Goodbyes (2022)",
+ "runtime": 0,
+ "cleanTitle": "thetunneltosummerexitgoodbyes",
+ "imdbId": "tt17382524",
+ "tmdbId": 916192,
+ "titleSlug": "916192",
+ "genres": [
+ "Animation",
+ "Drama",
+ "Mystery"
+ ],
+ "tags": [],
+ "added": "2022-07-05T07:50:42Z",
+ "ratings": {
+ "tmdb": {
+ "votes": 0,
+ "value": 0,
+ "type": "user"
+ }
+ },
+ "id": 1
+}
\ No newline at end of file
diff --git a/src/modules/common/examples/multiplemovies.json b/src/modules/common/examples/multiplemovies.json
new file mode 100644
index 000000000..d1f8dd71d
--- /dev/null
+++ b/src/modules/common/examples/multiplemovies.json
@@ -0,0 +1,3324 @@
+[
+ {
+ "title": "Sword Art Online the Movie -Progressive- Aria of a Starless Night",
+ "originalTitle": "劇場版 ソードアート・オンライン-プログレッシブ- 星なき夜のアリア",
+ "originalLanguage": {
+ "id": 8,
+ "name": "Japanese"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "Gekijō-ban Sword Art Online: Progressive Hoshi Naki Yoru no Aria",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1749
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "SAO Progressive",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1751
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "Gekijouban Sword Art Online: Progressive - Hoshinaki Yoru no Ari",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1752
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "Sōdo Āto Onrain",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1753
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "Sword Art Online the Movie: The Aria of the Night Without Stars",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1754
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "극장판 소드 아트 온라인 -프로그레시브-: 별 없는 밤의 아리아",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1755
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "소드 아트 온라인 프로그레시브",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1756
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "Sword Art Online: Progressive - Aria of a Starless Night",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1757
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "刀劍神域劇場版 - PROGRESSIVE - 無星夜的詠嘆調",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1758
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "ซอร์ดอาร์ตออนไลน์ โปรเกรสซีฟ เดอะมูฟวี่",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 28,
+ "name": "Thai"
+ },
+ "id": 1759
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "剧场版 刀剑神域 进击篇 无星之夜的咏叹调",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1760
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "Sword Art Online Progressive: Ária de Uma Noite Sem Estrelas",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1761
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "刀剑神域 进击篇 无星夜的咏叹调",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1776
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "Sword Art Online Progressive Movie: Hoshi Naki Yoru no Aria",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1788
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 170,
+ "title": "刀剑神域:无星之夜的咏叹调",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1826
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "sword art online movie progressive aria starless night",
+ "sizeOnDisk": 0,
+ "status": "released",
+ "overview": "One month after Kayaba Akihiko's game of death began, the death toll continues to rise, two thousand players having already lost their lives to the ultra-difficult VRMMO world of Sword Art Online. On the day of the strategy meeting to plan out the first-floor boss battle, Kirito, a solo player who vows to fight alone to get stronger, runs into a rare, high-level female player. She gracefully dispatches powerful monsters with a single rapier that flashes like a shooting star in the night...",
+ "inCinemas": "2021-10-30T00:00:00Z",
+ "physicalRelease": "2022-07-08T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/yD9RhgIVydQNBK7OLEbCWYcWMUd.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/2kvl6lcgoyAaf8cSRkzxE611u6T.jpg"
+ }
+ ],
+ "website": "https://sao-p.net",
+ "year": 2021,
+ "hasFile": false,
+ "youTubeTrailerId": "Jf6RyZkuVco",
+ "studio": "Aniplex",
+ "path": "/movies/Sword Art Online the Movie -Progressive- Aria of a Starless Night (2021)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": true,
+ "folderName": "/movies/Sword Art Online the Movie -Progressive- Aria of a Starless Night (2021)",
+ "runtime": 97,
+ "cleanTitle": "swordartonlinemovieprogressiveariastarlessnight",
+ "imdbId": "tt13424422",
+ "tmdbId": 761898,
+ "titleSlug": "761898",
+ "certification": "PG-13",
+ "genres": [
+ "Animation",
+ "Action",
+ "Fantasy"
+ ],
+ "tags": [],
+ "added": "2022-07-04T17:05:05Z",
+ "ratings": {
+ "imdb": {
+ "votes": 1048,
+ "value": 7.1,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 82,
+ "value": 8.341,
+ "type": "user"
+ }
+ },
+ "collection": {
+ "name": "Sword Art Online the Movie -Progressive-",
+ "tmdbId": 893713,
+ "images": []
+ },
+ "id": 170
+ },
+ {
+ "title": "Jujutsu Kaisen 0",
+ "originalTitle": "劇場版 呪術廻戦 0",
+ "originalLanguage": {
+ "id": 8,
+ "name": "Japanese"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 164,
+ "title": "Gekijō-ban Jujutsu Kaisen 0",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1672
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 164,
+ "title": "Gekijou-ban Jujutsu Kaisen 0",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1673
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 164,
+ "title": "극장판 주술회전 0",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1674
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 164,
+ "title": "Jujutsu Kaisen 0: The Movie",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1675
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 164,
+ "title": "呪術廻戦 0",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1676
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 164,
+ "title": "JUJUTSU KAISEN 0 the Movie",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1677
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 164,
+ "title": "劇場版 咒術迴戰 0",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1678
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 164,
+ "title": "Jujutsu Kaisen 0: Film",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 12,
+ "name": "Polish"
+ },
+ "id": 1845
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "jujutsu kaisen 0",
+ "sizeOnDisk": 0,
+ "status": "inCinemas",
+ "overview": "Yuta Okkotsu is a nervous high school student who is suffering from a serious problem—his childhood friend Rika has turned into a curse and won't leave him alone. Since Rika is no ordinary curse, his plight is noticed by Satoru Gojo, a teacher at Jujutsu High, a school where fledgling exorcists learn how to combat curses. Gojo convinces Yuta to enroll, but can he learn enough in time to confront the curse that haunts him?",
+ "inCinemas": "2021-12-24T00:00:00Z",
+ "physicalRelease": "2022-09-21T00:00:00Z",
+ "digitalRelease": "2022-09-21T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/3pTwMUEavTzVOh6yLN0aEwR7uSy.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/t9K8ycUBCplWiICDOKRNRYcEH9e.jpg"
+ }
+ ],
+ "website": "",
+ "year": 2021,
+ "hasFile": false,
+ "youTubeTrailerId": "2docezZl574",
+ "studio": "Toho",
+ "path": "/movies/Jujutsu Kaisen 0 (2021)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": false,
+ "folderName": "/movies/Jujutsu Kaisen 0 (2021)",
+ "runtime": 105,
+ "cleanTitle": "jujutsukaisen0",
+ "imdbId": "tt14331144",
+ "tmdbId": 810693,
+ "titleSlug": "810693",
+ "certification": "PG-13",
+ "genres": [
+ "Animation",
+ "Action",
+ "Fantasy"
+ ],
+ "tags": [],
+ "added": "2022-06-27T13:00:43Z",
+ "ratings": {
+ "imdb": {
+ "votes": 11063,
+ "value": 7.9,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 241,
+ "value": 7.8,
+ "type": "user"
+ },
+ "metacritic": {
+ "votes": 0,
+ "value": 72,
+ "type": "user"
+ },
+ "rottenTomatoes": {
+ "votes": 0,
+ "value": 98,
+ "type": "user"
+ }
+ },
+ "id": 164
+ },
+ {
+ "title": "Morbius",
+ "originalTitle": "Morbius",
+ "originalLanguage": {
+ "id": 1,
+ "name": "English"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 113,
+ "title": "Morbiuss",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1484
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 113,
+ "title": "暗夜博士:莫比亚斯",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1600
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "morbius",
+ "sizeOnDisk": 2130913775,
+ "status": "released",
+ "overview": "Dangerously ill with a rare blood disorder, and determined to save others suffering his same fate, Dr. Michael Morbius attempts a desperate gamble. What at first appears to be a radical success soon reveals itself to be a remedy potentially worse than the disease.",
+ "inCinemas": "2022-03-30T00:00:00Z",
+ "physicalRelease": "2022-06-14T00:00:00Z",
+ "digitalRelease": "2022-05-14T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/6JjfSchsU6daXk2AKX8EEBjO3Fm.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/gG9fTyDL03fiKnOpf2tr01sncnt.jpg"
+ }
+ ],
+ "website": "https://www.morbius.movie/",
+ "year": 2022,
+ "hasFile": true,
+ "youTubeTrailerId": "wG2TjtueeSU",
+ "studio": "Columbia Pictures",
+ "path": "/movies/Morbius (2022)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": true,
+ "folderName": "/movies/Morbius (2022)",
+ "runtime": 105,
+ "cleanTitle": "morbius",
+ "imdbId": "tt5108870",
+ "tmdbId": 526896,
+ "titleSlug": "526896",
+ "certification": "PG-13",
+ "genres": [
+ "Action",
+ "Science Fiction",
+ "Fantasy"
+ ],
+ "tags": [],
+ "added": "2022-02-11T19:39:55Z",
+ "ratings": {
+ "imdb": {
+ "votes": 92720,
+ "value": 5.2,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 2174,
+ "value": 6.4,
+ "type": "user"
+ },
+ "metacritic": {
+ "votes": 0,
+ "value": 35,
+ "type": "user"
+ },
+ "rottenTomatoes": {
+ "votes": 0,
+ "value": 16,
+ "type": "user"
+ }
+ },
+ "movieFile": {
+ "movieId": 113,
+ "relativePath": "Morbius (2022) WEBRip-1080p.mp4",
+ "path": "/movies/Morbius (2022)/Morbius (2022) WEBRip-1080p.mp4",
+ "size": 2130913775,
+ "dateAdded": "2022-05-17T03:04:01Z",
+ "sceneName": "Morbius.2022.1080p.WEBRip.x264-RARBG",
+ "indexerFlags": 1,
+ "quality": {
+ "quality": {
+ "id": 15,
+ "name": "WEBRip-1080p",
+ "source": "webrip",
+ "resolution": 1080,
+ "modifier": "none"
+ },
+ "revision": {
+ "version": 1,
+ "real": 0,
+ "isRepack": false
+ }
+ },
+ "mediaInfo": {
+ "audioBitrate": 224000,
+ "audioChannels": 5.1,
+ "audioCodec": "AAC",
+ "audioLanguages": "eng",
+ "audioStreamCount": 1,
+ "videoBitDepth": 8,
+ "videoBitrate": 2498238,
+ "videoCodec": "x264",
+ "videoDynamicRangeType": "",
+ "videoFps": 23.976,
+ "resolution": "1920x800",
+ "runTime": "1:44:09",
+ "scanType": "Progressive",
+ "subtitles": ""
+ },
+ "originalFilePath": "Morbius.2022.1080p.WEBRip.x264-RARBG/Morbius.2022.1080p.WEBRip.x264-RARBG.mp4",
+ "qualityCutoffNotMet": false,
+ "languages": [
+ {
+ "id": 1,
+ "name": "English"
+ }
+ ],
+ "releaseGroup": "RARBG",
+ "edition": "",
+ "id": 219
+ },
+ "id": 113
+ },
+ {
+ "title": "Rise",
+ "originalTitle": "En corps",
+ "originalLanguage": {
+ "id": 2,
+ "name": "French"
+ },
+ "alternateTitles": [],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "rise",
+ "sizeOnDisk": 0,
+ "status": "released",
+ "overview": "Elise thought she had the perfect life: an ideal boyfriend and a promising career as a ballet dancer. It all falls apart the day she catches him cheating on her with her stage backup; and after she suffers an injury on stage, it seems like she might not be able to dance ever again. A heartwarming and inspiring story that tells us how sometimes, the worst thing that could happen may turn out to be the best.",
+ "inCinemas": "2022-03-30T00:00:00Z",
+ "physicalRelease": "2022-08-03T00:00:00Z",
+ "digitalRelease": "2022-07-30T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/9lbVcQfSfcMewo03UM7knSvN31T.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/duCaYLwr7LOhGTcyhcZP94rd2BS.jpg"
+ }
+ ],
+ "website": "",
+ "year": 2022,
+ "hasFile": false,
+ "youTubeTrailerId": "",
+ "studio": "France 2 Cinéma",
+ "path": "/movies/Rise (2022)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": true,
+ "folderName": "/movies/Rise (2022)",
+ "runtime": 117,
+ "cleanTitle": "rise",
+ "imdbId": "tt13531468",
+ "tmdbId": 771077,
+ "titleSlug": "771077",
+ "genres": [
+ "Comedy",
+ "Drama"
+ ],
+ "tags": [],
+ "added": "2022-03-29T14:52:43Z",
+ "ratings": {
+ "imdb": {
+ "votes": 818,
+ "value": 7.5,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 167,
+ "value": 7.913,
+ "type": "user"
+ }
+ },
+ "id": 147
+ },
+ {
+ "title": "Fantastic Beasts: The Secrets of Dumbledore",
+ "originalTitle": "Fantastic Beasts: The Secrets of Dumbledore",
+ "originalLanguage": {
+ "id": 1,
+ "name": "English"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Фантастические твари и где они обитают 3",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 11,
+ "name": "Russian"
+ },
+ "id": 1251
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Φανταστικά Ζώα και που Βρίσκονται 3",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1252
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Les Animaux fantastiques - 3e partie",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 2,
+ "name": "French"
+ },
+ "id": 1253
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Fantastic Beasts 3",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1255
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Fantastická zvířata 3",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1256
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Фантастичні звірі 3",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1257
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Fantastiske Skabninger: Dumbledores Hemmeligheder",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1258
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "怪獸與鄧不利多的秘密",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1453
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Fantastyczne zwierzęta: Tajemnice Dumbledore'a",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 12,
+ "name": "Polish"
+ },
+ "id": 1482
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Fantastiskās būtnes: Dumidora noslēpumi",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1483
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Animales Fantásticos: Los Secretos de Dumbledore",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1540
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Fantastic Beasts 3 - The Secrets of Dumbledore",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1595
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Animali Fantastici - I Segreti Di Silente",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 5,
+ "name": "Italian"
+ },
+ "id": 1638
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Animali Fantastici 3 I Segreti Di Silente",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 5,
+ "name": "Italian"
+ },
+ "id": 1639
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "Les Animaux fantastiques 3 - Les Secrets de Dumbledore",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 2,
+ "name": "French"
+ },
+ "id": 1774
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 121,
+ "title": "神奇动物3:邓布利多之谜",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1823
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "fantastic beasts secrets dumbledore",
+ "sizeOnDisk": 9631363612,
+ "status": "released",
+ "overview": "Professor Albus Dumbledore knows the powerful, dark wizard Gellert Grindelwald is moving to seize control of the wizarding world. Unable to stop him alone, he entrusts magizoologist Newt Scamander to lead an intrepid team of wizards and witches. They soon encounter an array of old and new beasts as they clash with Grindelwald's growing legion of followers.",
+ "inCinemas": "2022-04-06T00:00:00Z",
+ "physicalRelease": "2022-06-28T00:00:00Z",
+ "digitalRelease": "2022-05-30T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/3c5GNLB4yRSLBby0trHoA1DSQxQ.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/zGLHX92Gk96O1DJvLil7ObJTbaL.jpg"
+ }
+ ],
+ "website": "https://www.fantasticbeasts.com",
+ "year": 2022,
+ "hasFile": true,
+ "youTubeTrailerId": "Fo6TfHkLW6Y",
+ "studio": "Warner Bros. Pictures",
+ "path": "/movies/Fantastic Beasts The Secrets of Dumbledore (2022)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": true,
+ "folderName": "/movies/Fantastic Beasts The Secrets of Dumbledore (2022)",
+ "runtime": 142,
+ "cleanTitle": "fantasticbeastssecretsdumbledore",
+ "imdbId": "tt4123432",
+ "tmdbId": 338953,
+ "titleSlug": "338953",
+ "certification": "PG-13",
+ "genres": [
+ "Fantasy",
+ "Adventure",
+ "Action"
+ ],
+ "tags": [],
+ "added": "2022-03-04T21:08:32Z",
+ "ratings": {
+ "imdb": {
+ "votes": 118753,
+ "value": 6.2,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 2455,
+ "value": 6.864,
+ "type": "user"
+ },
+ "metacritic": {
+ "votes": 0,
+ "value": 47,
+ "type": "user"
+ },
+ "rottenTomatoes": {
+ "votes": 0,
+ "value": 46,
+ "type": "user"
+ }
+ },
+ "movieFile": {
+ "movieId": 121,
+ "relativePath": "Fantastic Beasts The Secrets of Dumbledore (2022) WEBDL-1080p.mkv",
+ "path": "/movies/Fantastic Beasts The Secrets of Dumbledore (2022)/Fantastic Beasts The Secrets of Dumbledore (2022) WEBDL-1080p.mkv",
+ "size": 9631363612,
+ "dateAdded": "2022-05-30T09:12:04Z",
+ "sceneName": "Fantastic.Beasts.The.Secrets.of.Dumbledore.2022.1080p.HMAX.WEBRip.DDP5.1.Atmos.x264-SMURF",
+ "indexerFlags": 1,
+ "quality": {
+ "quality": {
+ "id": 3,
+ "name": "WEBDL-1080p",
+ "source": "webdl",
+ "resolution": 1080,
+ "modifier": "none"
+ },
+ "revision": {
+ "version": 1,
+ "real": 0,
+ "isRepack": false
+ }
+ },
+ "mediaInfo": {
+ "audioBitrate": 768000,
+ "audioChannels": 5.1,
+ "audioCodec": "EAC3 Atmos",
+ "audioLanguages": "eng",
+ "audioStreamCount": 1,
+ "videoBitDepth": 8,
+ "videoBitrate": 0,
+ "videoCodec": "x264",
+ "videoDynamicRangeType": "",
+ "videoFps": 23.976,
+ "resolution": "1920x816",
+ "runTime": "2:22:39",
+ "scanType": "Progressive",
+ "subtitles": "eng/eng/bul/cze/dan/spa/spa/fin/hrv/hun/mac/dut/nor/pol/por/por/rum/slo/slv/srp/swe/spa"
+ },
+ "originalFilePath": "Fantastic.Beasts.The.Secrets.of.Dumbledore.2022.1080p.HMAX.WEBRip.DDP5.1.Atmos.x264-SMURF/Fantastic.Beasts.The.Secrets.of.Dumbledore.2022.1080p.HMAX.WEB-DL.DDP5.1.Atmos.H.264-SMURF.mkv",
+ "qualityCutoffNotMet": false,
+ "languages": [
+ {
+ "id": 1,
+ "name": "English"
+ }
+ ],
+ "releaseGroup": "SMURF",
+ "edition": "",
+ "id": 223
+ },
+ "collection": {
+ "name": "Fantastic Beasts Collection",
+ "tmdbId": 435259,
+ "images": []
+ },
+ "id": 121
+ },
+ {
+ "title": "Doctor Strange in the Multiverse of Madness",
+ "originalTitle": "Doctor Strange in the Multiverse of Madness",
+ "originalLanguage": {
+ "id": 1,
+ "name": "English"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doctor Strange 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1504
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Доктор Стрэндж 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 11,
+ "name": "Russian"
+ },
+ "id": 1505
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doutor Estranho 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1506
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doctor Strange v multivesmíre šialenstva",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1507
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doctor Strange 2: El multiverso de la locura",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 3,
+ "name": "Spanish"
+ },
+ "id": 1508
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "মহাবিশ্বের পাগলামিতে অদ্ভুত চিকিৎসক",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1510
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "จอมเวทย์มหากาฬ ในมัลติเวิร์สมหาภัย",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 28,
+ "name": "Thai"
+ },
+ "id": 1511
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Marvel Studios' Doctor Strange in the Multiverse of Madness",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1512
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doctor Strange en el Multiverso de la Locura de Marvel Studios",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 3,
+ "name": "Spanish"
+ },
+ "id": 1513
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doktors Streindžs neprāta multivisumā",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1514
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doctor Strange in the Multitude of Madness 3D",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1515
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "닥터 스트레인지 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1531
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "奇異博士2: 失控多元宇宙",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1532
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Ο Δόκτωρ Στρέιντζ στο πολυσύμπαν της τρέλας",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1544
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doktor Streync 2: Multikainatın Dəliliklərində",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1566
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doctor Strange 2 - The Multiverse of Madness",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1664
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "奇异博士2:疯狂多元宇宙",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1665
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "奇異博士2:失控多重宇宙",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1667
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doutor Estranho no Multiverso da Loucura (2022)",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1668
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doctor Strange: Đa Vũ Trụ Hỗn Loạn",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1766
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Բժիշկ Սթրենջը Խելագարության Բազմաշխարհում",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1772
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Stellar Vortex",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1773
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "Doktor Strange 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 17,
+ "name": "Turkish"
+ },
+ "id": 1777
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "დოქტორი სტრეინჯი სიგიჟის მრავალსამყაროში",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1834
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "დოქტორი სტრეინჯი სიგიჟის მულტისამყაროში",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1835
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "마블 닥터 스트레인지: 대혼돈의 멀티버스",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1836
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 153,
+ "title": "닥터 스트레인지 대혼돈의 멀티버스",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1837
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "doctor strange in multiverse madness",
+ "sizeOnDisk": 9961899948,
+ "status": "released",
+ "overview": "Doctor Strange, with the help of mystical allies both old and new, traverses the mind-bending and dangerous alternate realities of the Multiverse to confront a mysterious new adversary.",
+ "inCinemas": "2022-05-04T00:00:00Z",
+ "physicalRelease": "2022-07-26T00:00:00Z",
+ "digitalRelease": "2022-06-22T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/9Gtg2DzBhmYamXBS1hKAhiwbBKS.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/wcKFYIiVDvRURrzglV9kGu7fpfY.jpg"
+ }
+ ],
+ "website": "https://www.marvel.com/movies/doctor-strange-in-the-multiverse-of-madness",
+ "year": 2022,
+ "hasFile": true,
+ "youTubeTrailerId": "Rf8LAYJSOL8",
+ "studio": "Marvel Studios",
+ "path": "/movies/Doctor Strange in the Multiverse of Madness (2022)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": true,
+ "folderName": "/movies/Doctor Strange in the Multiverse of Madness (2022)",
+ "runtime": 126,
+ "cleanTitle": "doctorstrangeinmultiversemadness",
+ "imdbId": "tt9419884",
+ "tmdbId": 453395,
+ "titleSlug": "453395",
+ "certification": "PG-13",
+ "genres": [
+ "Fantasy",
+ "Action",
+ "Adventure"
+ ],
+ "tags": [],
+ "added": "2022-05-03T20:20:14Z",
+ "ratings": {
+ "imdb": {
+ "votes": 336918,
+ "value": 7,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 5076,
+ "value": 7.5,
+ "type": "user"
+ },
+ "metacritic": {
+ "votes": 0,
+ "value": 60,
+ "type": "user"
+ },
+ "rottenTomatoes": {
+ "votes": 0,
+ "value": 74,
+ "type": "user"
+ }
+ },
+ "movieFile": {
+ "movieId": 153,
+ "relativePath": "Doctor Strange in the Multiverse of Madness (2022) WEBRip-1080p.mkv",
+ "path": "/movies/Doctor Strange in the Multiverse of Madness (2022)/Doctor Strange in the Multiverse of Madness (2022) WEBRip-1080p.mkv",
+ "size": 9961899948,
+ "dateAdded": "2022-06-22T00:45:05Z",
+ "sceneName": "Doctor.Strange.in.the.Multiverse.of.Madness.2022.1080p.WEBRip.DDP5.1.Atmos.x264-NOGRP",
+ "indexerFlags": 1,
+ "quality": {
+ "quality": {
+ "id": 15,
+ "name": "WEBRip-1080p",
+ "source": "webrip",
+ "resolution": 1080,
+ "modifier": "none"
+ },
+ "revision": {
+ "version": 1,
+ "real": 0,
+ "isRepack": false
+ }
+ },
+ "mediaInfo": {
+ "audioBitrate": 768000,
+ "audioChannels": 5.1,
+ "audioCodec": "EAC3 Atmos",
+ "audioLanguages": "eng",
+ "audioStreamCount": 1,
+ "videoBitDepth": 8,
+ "videoBitrate": 0,
+ "videoCodec": "x264",
+ "videoDynamicRangeType": "",
+ "videoFps": 23.976,
+ "resolution": "1920x804",
+ "runTime": "2:06:31",
+ "scanType": "Progressive",
+ "subtitles": "eng/eng"
+ },
+ "originalFilePath": "Doctor.Strange.in.the.Multiverse.of.Madness.2022.1080p.WEBRip.DDP5.1.Atmos.x264-NOGRP/Doctor.Strange.in.the.Multiverse.of.Madness.2022.1080p.WEBRip.DDP5.1.Atmos.x264-NOGRP.mkv",
+ "qualityCutoffNotMet": false,
+ "languages": [
+ {
+ "id": 1,
+ "name": "English"
+ }
+ ],
+ "releaseGroup": "NOGRP",
+ "edition": "",
+ "id": 224
+ },
+ "collection": {
+ "name": "Doctor Strange Collection",
+ "tmdbId": 618529,
+ "images": []
+ },
+ "id": 153
+ },
+ {
+ "title": "Top Gun: Maverick",
+ "originalTitle": "Top Gun: Maverick",
+ "originalLanguage": {
+ "id": 1,
+ "name": "English"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "Лучший стрелок 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 11,
+ "name": "Russian"
+ },
+ "id": 1611
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "Top Gun 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1612
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "Кращий стрілець 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1614
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "Top Gun 2 - Maverick",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 4,
+ "name": "German"
+ },
+ "id": 1615
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "Phi Công Siêu Đẳng Maverick",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1621
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "Кращий стрілець: Меверік",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1623
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "壮志凌云2:独行侠",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1671
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "Топ Ган: Мэверик",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 11,
+ "name": "Russian"
+ },
+ "id": 1729
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "توب قن: مافريك",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1763
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "Top Gun: Sayohatchi",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1764
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 160,
+ "title": "Топ ган: Маверик",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1765
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "top gun maverick",
+ "sizeOnDisk": 0,
+ "status": "released",
+ "overview": "After more than thirty years of service as one of the Navy’s top aviators, and dodging the advancement in rank that would ground him, Pete “Maverick” Mitchell finds himself training a detachment of TOP GUN graduates for a specialized mission the likes of which no living pilot has ever seen.",
+ "inCinemas": "2022-05-24T00:00:00Z",
+ "physicalRelease": "2022-10-05T00:00:00Z",
+ "digitalRelease": "2022-08-08T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/62HCnUTziyWcpDaBO2i1DX17ljH.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/odJ4hx6g6vBt4lBWKFD1tI8WS4x.jpg"
+ }
+ ],
+ "website": "https://www.topgunmovie.com",
+ "year": 2022,
+ "hasFile": false,
+ "youTubeTrailerId": "giXco2jaZ_4",
+ "studio": "Paramount",
+ "path": "/movies/Top Gun Maverick (2022)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": true,
+ "folderName": "/movies/Top Gun Maverick (2022)",
+ "runtime": 131,
+ "cleanTitle": "topgunmaverick",
+ "imdbId": "tt1745960",
+ "tmdbId": 361743,
+ "titleSlug": "361743",
+ "certification": "PG-13",
+ "genres": [
+ "Action",
+ "Drama"
+ ],
+ "tags": [],
+ "added": "2022-06-07T19:53:34Z",
+ "ratings": {
+ "imdb": {
+ "votes": 255677,
+ "value": 8.6,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 1811,
+ "value": 8.3,
+ "type": "user"
+ },
+ "metacritic": {
+ "votes": 0,
+ "value": 78,
+ "type": "user"
+ },
+ "rottenTomatoes": {
+ "votes": 0,
+ "value": 97,
+ "type": "user"
+ }
+ },
+ "collection": {
+ "name": "Top Gun Collection",
+ "tmdbId": 531330,
+ "images": []
+ },
+ "id": 160
+ },
+ {
+ "title": "Jurassic World Dominion",
+ "originalTitle": "Jurassic World Dominion",
+ "originalLanguage": {
+ "id": 1,
+ "name": "English"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Jurassic Park 6",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1872
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Jurassic World 3",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1873
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "쥬라기 공원 3",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1874
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Мир Юрского периода 3",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 11,
+ "name": "Russian"
+ },
+ "id": 1875
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Jurassic World 3: Dominion",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1876
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Jurassic World 3: Dominio",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1877
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Світ Юрського періоду 3",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1878
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Світ Юрського періоду: Домініон",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1879
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Мир Юрского периода: Власть",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 11,
+ "name": "Russian"
+ },
+ "id": 1880
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "จูราสสิค เวิลด์ ทวงคืนอาณาจักร",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 28,
+ "name": "Thai"
+ },
+ "id": 1881
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "La monde jurassique : Domination",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1882
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Monde jurassique : la domination",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1883
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "ジュラシックワールドドミニオン",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1884
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Thế Giới Khủng Long: Lãnh Địa",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1885
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Jurassic World 3 - Dominion (2022)",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1887
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "Jurassic World",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 2,
+ "name": "French"
+ },
+ "id": 1888
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 176,
+ "title": "侏儸紀世界:統霸天下",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1891
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "jurassic world dominion",
+ "sizeOnDisk": 3288297053,
+ "status": "released",
+ "overview": "Four years after Isla Nublar was destroyed, dinosaurs now live—and hunt—alongside humans all over the world. This fragile balance will reshape the future and determine, once and for all, whether human beings are to remain the apex predators on a planet they now share with history’s most fearsome creatures.",
+ "inCinemas": "2022-06-01T00:00:00Z",
+ "physicalRelease": "2022-08-25T00:00:00Z",
+ "digitalRelease": "2022-07-14T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/kAVRgw7GgK1CfYEJq8ME6EvRIgU.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/9eAn20y26wtB3aet7w9lHjuSgZ3.jpg"
+ }
+ ],
+ "website": "https://www.jurassicworld.com",
+ "year": 2022,
+ "hasFile": true,
+ "youTubeTrailerId": "DtQycgMD4HQ",
+ "studio": "Universal Pictures",
+ "path": "/movies/Jurassic World Dominion (2022)",
+ "qualityProfileId": 4,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": true,
+ "folderName": "/movies/Jurassic World Dominion (2022)",
+ "runtime": 147,
+ "cleanTitle": "jurassicworlddominion",
+ "imdbId": "tt8041270",
+ "tmdbId": 507086,
+ "titleSlug": "507086",
+ "certification": "PG-13",
+ "genres": [
+ "Adventure",
+ "Action",
+ "Science Fiction"
+ ],
+ "tags": [],
+ "added": "2022-08-03T22:37:52Z",
+ "ratings": {
+ "imdb": {
+ "votes": 105728,
+ "value": 5.7,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 2532,
+ "value": 7.1,
+ "type": "user"
+ },
+ "metacritic": {
+ "votes": 0,
+ "value": 38,
+ "type": "user"
+ },
+ "rottenTomatoes": {
+ "votes": 0,
+ "value": 30,
+ "type": "user"
+ }
+ },
+ "movieFile": {
+ "movieId": 176,
+ "relativePath": "Jurassic World Dominion (2022) Bluray-1080p.mp4",
+ "path": "/movies/Jurassic World Dominion (2022)/Jurassic World Dominion (2022) Bluray-1080p.mp4",
+ "size": 3288297053,
+ "dateAdded": "2022-08-03T22:40:58Z",
+ "sceneName": "Jurassic.World.3.Dominion.2022.EXTENDED.1080p.BluRay.H264.AAC-RARBG",
+ "indexerFlags": 1,
+ "quality": {
+ "quality": {
+ "id": 7,
+ "name": "Bluray-1080p",
+ "source": "bluray",
+ "resolution": 1080,
+ "modifier": "none"
+ },
+ "revision": {
+ "version": 1,
+ "real": 0,
+ "isRepack": false
+ }
+ },
+ "mediaInfo": {
+ "audioBitrate": 224000,
+ "audioChannels": 5.1,
+ "audioCodec": "AAC",
+ "audioLanguages": "eng",
+ "audioStreamCount": 1,
+ "videoBitDepth": 8,
+ "videoBitrate": 2497768,
+ "videoCodec": "x264",
+ "videoDynamicRangeType": "",
+ "videoFps": 23.976,
+ "resolution": "1920x960",
+ "runTime": "2:40:40",
+ "scanType": "Progressive",
+ "subtitles": ""
+ },
+ "originalFilePath": "Jurassic.World.3.Dominion.2022.EXTENDED.1080p.BluRay.H264.AAC-RARBG/Jurassic.World.3.Dominion.2022.EXTENDED.1080p.BluRay.H264.AAC-RARBG.mp4",
+ "qualityCutoffNotMet": false,
+ "languages": [
+ {
+ "id": 1,
+ "name": "English"
+ }
+ ],
+ "releaseGroup": "RARBG",
+ "edition": "EXTENDED",
+ "id": 232
+ },
+ "collection": {
+ "name": "Jurassic Park Collection",
+ "tmdbId": 328,
+ "images": []
+ },
+ "id": 176
+ },
+ {
+ "title": "Lightyear",
+ "originalTitle": "Lightyear",
+ "originalLanguage": {
+ "id": 1,
+ "name": "English"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Баз Светлинна година",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 29,
+ "name": "Bulgarian"
+ },
+ "id": 1580
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Buzz Astral",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 12,
+ "name": "Polish"
+ },
+ "id": 1581
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Buzz Lightyear",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 18,
+ "name": "Portuguese"
+ },
+ "id": 1582
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Lightyear - Cảnh Sát Vũ Trụ",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1583
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Bazs Gaismasgads",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1584
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "光年正傳",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1598
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "บัซ ไลท์เยียร์",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 28,
+ "name": "Thai"
+ },
+ "id": 1633
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "光年正传",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1635
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Buzz l'Éclair",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 2,
+ "name": "French"
+ },
+ "id": 1648
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Rakeťák",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1649
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Svjetlosni",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1650
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "लाइटईयर",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1651
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "שנות-אור",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1652
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "バズ・ライトイヤー",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1653
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Lightyear - La vera storia di Buzz",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 5,
+ "name": "Italian"
+ },
+ "id": 1654
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Базз Лайтер",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 11,
+ "name": "Russian"
+ },
+ "id": 1655
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "버즈 라이트이어",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1656
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Баз Светлосни",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1657
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "巴斯光年",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1658
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Işıkyılı",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 17,
+ "name": "Turkish"
+ },
+ "id": 1659
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "Bazz Layter",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1660
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "ბაზ ლაითერი",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1829
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 157,
+ "title": "სათამაშოების ისტორია: ბაზ ლაითერი",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1830
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "lightyear",
+ "sizeOnDisk": 4162236849,
+ "status": "released",
+ "overview": "Legendary Space Ranger Buzz Lightyear embarks on an intergalactic adventure alongside a group of ambitious recruits and his robot companion Sox.",
+ "inCinemas": "2022-06-15T00:00:00Z",
+ "physicalRelease": "2022-09-29T00:00:00Z",
+ "digitalRelease": "2022-08-03T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/ox4goZd956BxqJH6iLwhWPL9ct4.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/nW5fUbldp1DYf2uQ3zJTUdachOu.jpg"
+ }
+ ],
+ "website": "https://movies.disney.com/lightyear",
+ "year": 2022,
+ "hasFile": true,
+ "youTubeTrailerId": "0ir3Z8hLeHc",
+ "studio": "Walt Disney Pictures",
+ "path": "/movies/Lightyear (2022)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "announced",
+ "isAvailable": true,
+ "folderName": "/movies/Lightyear (2022)",
+ "runtime": 105,
+ "cleanTitle": "lightyear",
+ "imdbId": "tt10298810",
+ "tmdbId": 718789,
+ "titleSlug": "718789",
+ "certification": "PG",
+ "genres": [
+ "Animation",
+ "Science Fiction",
+ "Adventure"
+ ],
+ "tags": [],
+ "added": "2022-05-25T11:01:52Z",
+ "ratings": {
+ "imdb": {
+ "votes": 57059,
+ "value": 5.5,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 1405,
+ "value": 7.362,
+ "type": "user"
+ },
+ "metacritic": {
+ "votes": 0,
+ "value": 60,
+ "type": "user"
+ },
+ "rottenTomatoes": {
+ "votes": 0,
+ "value": 75,
+ "type": "user"
+ }
+ },
+ "movieFile": {
+ "movieId": 157,
+ "relativePath": "Lightyear (2022) WEBRip-1080p.mkv",
+ "path": "/movies/Lightyear (2022)/Lightyear (2022) WEBRip-1080p.mkv",
+ "size": 4162236849,
+ "dateAdded": "2022-07-14T12:39:18Z",
+ "sceneName": "Lightyear.2022.1080p.WEBRip.DD5.1.x264-EVO[TGx]",
+ "indexerFlags": 1,
+ "quality": {
+ "quality": {
+ "id": 15,
+ "name": "WEBRip-1080p",
+ "source": "webrip",
+ "resolution": 1080,
+ "modifier": "none"
+ },
+ "revision": {
+ "version": 1,
+ "real": 0,
+ "isRepack": false
+ }
+ },
+ "mediaInfo": {
+ "audioBitrate": 384000,
+ "audioChannels": 5.1,
+ "audioCodec": "AC3",
+ "audioLanguages": "eng",
+ "audioStreamCount": 1,
+ "videoBitDepth": 8,
+ "videoBitrate": 0,
+ "videoCodec": "x264",
+ "videoDynamicRangeType": "",
+ "videoFps": 23.976,
+ "resolution": "1920x804",
+ "runTime": "1:45:04",
+ "scanType": "Progressive",
+ "subtitles": ""
+ },
+ "originalFilePath": "Lightyear.2022.1080p.WEBRip.DD5.1.x264-EVO[TGx]/Lightyear.2022.1080p.WEBRip.DD5.1.x264-EVO.mkv",
+ "qualityCutoffNotMet": false,
+ "languages": [
+ {
+ "id": 1,
+ "name": "English"
+ }
+ ],
+ "releaseGroup": "EVO",
+ "edition": "",
+ "id": 227
+ },
+ "id": 157
+ },
+ {
+ "title": "Minions: The Rise of Gru",
+ "originalTitle": "Minions: The Rise of Gru",
+ "originalLanguage": {
+ "id": 1,
+ "name": "English"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "미니언즈: 라이즈 오브 그루",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1679
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Miljenici: Uspon Grua",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1680
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Käsilased 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1681
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions 2: Η Άνοδος του Γκρου",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1682
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minioni 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1683
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions: Historien om Gru",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 15,
+ "name": "Norwegian"
+ },
+ "id": 1684
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Mínimos 2: A Ascensão de Gru",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 18,
+ "name": "Portuguese"
+ },
+ "id": 1685
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Миньоны: Грювитация",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 11,
+ "name": "Russian"
+ },
+ "id": 1686
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Малци: Успон Груа",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1687
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Mimoni: Zloduch prichádza",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1688
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions: El origen de Gru",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 3,
+ "name": "Spanish"
+ },
+ "id": 1689
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minioner: Berättelsen om Gru",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1690
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions 2: Come Gru diventa cattivissimo",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 5,
+ "name": "Italian"
+ },
+ "id": 1691
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions 2: Historien om Gru",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1692
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1693
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions 2: Nace un villano",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1694
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions - Auf der Suche nach dem Mini-Boss",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 4,
+ "name": "German"
+ },
+ "id": 1695
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions 2: The Rise of Gru",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 7,
+ "name": "Dutch"
+ },
+ "id": 1696
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "迷你兵團 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1697
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions: Hoe Gru superschurk were",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 7,
+ "name": "Dutch"
+ },
+ "id": 1698
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "มินเนี่ยน 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 28,
+ "name": "Thai"
+ },
+ "id": 1699
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minyonlar 2: Gru'nun Yükselişi",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 17,
+ "name": "Turkish"
+ },
+ "id": 1726
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions: Nace un villano",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1734
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Մինիոններ. Գրուի վերելքը",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1787
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "Minions: KEBANGKITAN GRU",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1838
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "미니언즈 2",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1846
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 165,
+ "title": "小黄人大眼萌:神偷奶爸前传",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1860
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "minions rise gru",
+ "sizeOnDisk": 6621540111,
+ "status": "released",
+ "overview": "A fanboy of a supervillain supergroup known as the Vicious 6, Gru hatches a plan to become evil enough to join them, with the backup of his followers, the Minions.",
+ "inCinemas": "2022-06-29T00:00:00Z",
+ "physicalRelease": "2022-09-15T00:00:00Z",
+ "digitalRelease": "2022-08-02T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/wKiOkZTN9lUUUNZLmtnwubZYONg.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/nmGWzTLMXy9x7mKd8NKPLmHtWGa.jpg"
+ }
+ ],
+ "website": "https://www.minionsmovie.com/",
+ "year": 2022,
+ "hasFile": true,
+ "youTubeTrailerId": "HhIl_XJ-OGA",
+ "studio": "Universal Pictures",
+ "path": "/movies/Minions The Rise of Gru (2022)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": true,
+ "folderName": "/movies/Minions The Rise of Gru (2022)",
+ "runtime": 87,
+ "cleanTitle": "minionsrisegru",
+ "imdbId": "tt5113044",
+ "tmdbId": 438148,
+ "titleSlug": "438148",
+ "certification": "PG",
+ "genres": [
+ "Family",
+ "Animation",
+ "Adventure"
+ ],
+ "tags": [],
+ "added": "2022-06-27T13:00:47Z",
+ "ratings": {
+ "imdb": {
+ "votes": 29174,
+ "value": 6.8,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 1038,
+ "value": 7.8,
+ "type": "user"
+ },
+ "metacritic": {
+ "votes": 0,
+ "value": 56,
+ "type": "user"
+ },
+ "rottenTomatoes": {
+ "votes": 0,
+ "value": 70,
+ "type": "user"
+ }
+ },
+ "movieFile": {
+ "movieId": 165,
+ "relativePath": "Minions The Rise of Gru (2022) WEBRip-1080p.mkv",
+ "path": "/movies/Minions The Rise of Gru (2022)/Minions The Rise of Gru (2022) WEBRip-1080p.mkv",
+ "size": 6621540111,
+ "dateAdded": "2022-08-02T07:18:57Z",
+ "sceneName": "Minions.The.Rise.of.Gru.2022.1080p.AMZN.WEBRip.DDP5.1.Atmos.x264-NOGRP",
+ "indexerFlags": 1,
+ "quality": {
+ "quality": {
+ "id": 15,
+ "name": "WEBRip-1080p",
+ "source": "webrip",
+ "resolution": 1080,
+ "modifier": "none"
+ },
+ "revision": {
+ "version": 1,
+ "real": 0,
+ "isRepack": false
+ }
+ },
+ "mediaInfo": {
+ "audioBitrate": 768000,
+ "audioChannels": 5.1,
+ "audioCodec": "EAC3 Atmos",
+ "audioLanguages": "eng",
+ "audioStreamCount": 1,
+ "videoBitDepth": 8,
+ "videoBitrate": 0,
+ "videoCodec": "x264",
+ "videoDynamicRangeType": "",
+ "videoFps": 23.976,
+ "resolution": "1920x800",
+ "runTime": "1:27:35",
+ "scanType": "Progressive",
+ "subtitles": "eng/eng/fre"
+ },
+ "originalFilePath": "Minions.The.Rise.of.Gru.2022.1080p.AMZN.WEBRip.DDP5.1.Atmos.x264-NOGRP/Minions.The.Rise.of.Gru.2022.1080p.AMZN.WEBRip.DDP5.1.Atmos.x264-NOGRP.mkv",
+ "qualityCutoffNotMet": false,
+ "languages": [
+ {
+ "id": 1,
+ "name": "English"
+ }
+ ],
+ "releaseGroup": "NOGRP",
+ "edition": "",
+ "id": 230
+ },
+ "collection": {
+ "name": "Minions Collection",
+ "tmdbId": 544669,
+ "images": []
+ },
+ "id": 165
+ },
+ {
+ "title": "Thor: Love and Thunder",
+ "originalTitle": "Thor: Love and Thunder",
+ "originalLanguage": {
+ "id": 1,
+ "name": "English"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "Thor 4",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1735
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "雷神4:爱与雷霆",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1736
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "Тор 4",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 11,
+ "name": "Russian"
+ },
+ "id": 1737
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "থর: প্রেম এবং বজ্রপাত",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1738
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "Marvel Studios' Thor: Love and Thunder",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1739
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "Thor: Love and Thunder de Marvel Studios",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 3,
+ "name": "Spanish"
+ },
+ "id": 1740
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "Tors: Mīla un Pērkons",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1741
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "Thor : Amour et tonnerre de Marvel Studios",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1742
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "Marvel Studios' Thor: Tình Yêu và Sấm Sét",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1743
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "Thor: amor y trueno",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 3,
+ "name": "Spanish"
+ },
+ "id": 1745
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "თორი: სიყვარული და ჭექა-ქუხილი",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1746
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "토르 4",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1770
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "Թոր: Սեր և ամպրոպ",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1775
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "תור: אהבה ורעם",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1781
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "Thor: Cinta dan Guntur",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1790
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "마블 토르: 러브 앤 썬더",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1839
+ },
+ {
+ "sourceType": "tmdb",
+ "movieId": 168,
+ "title": "토르 러브 앤 썬더",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1840
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "thor love thunder",
+ "sizeOnDisk": 0,
+ "status": "inCinemas",
+ "overview": "After his retirement is interrupted by Gorr the God Butcher, a galactic killer who seeks the extinction of the gods, Thor enlists the help of King Valkyrie, Korg, and ex-girlfriend Jane Foster, who now inexplicably wields Mjolnir as the Mighty Thor. Together they embark upon a harrowing cosmic adventure to uncover the mystery of the God Butcher’s vengeance and stop him before it’s too late.",
+ "inCinemas": "2022-07-06T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/pIkRyD18kl4FhoCNQuWxWu5cBLM.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://image.tmdb.org/t/p/original/p1F51Lvj3sMopG948F5HsBbl43C.jpg"
+ }
+ ],
+ "website": "https://www.marvel.com/movies/thor-love-and-thunder",
+ "year": 2022,
+ "hasFile": false,
+ "youTubeTrailerId": "Go8nTmfrQd8",
+ "studio": "Marvel Studios",
+ "path": "/movies/Thor Love and Thunder (2022)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": false,
+ "folderName": "/movies/Thor Love and Thunder (2022)",
+ "runtime": 119,
+ "cleanTitle": "thorlovethunder",
+ "imdbId": "tt10648342",
+ "tmdbId": 616037,
+ "titleSlug": "616037",
+ "certification": "PG-13",
+ "genres": [
+ "Action",
+ "Adventure",
+ "Fantasy"
+ ],
+ "tags": [],
+ "added": "2022-07-04T17:04:57Z",
+ "ratings": {
+ "imdb": {
+ "votes": 146274,
+ "value": 6.8,
+ "type": "user"
+ },
+ "tmdb": {
+ "votes": 1695,
+ "value": 6.8,
+ "type": "user"
+ },
+ "metacritic": {
+ "votes": 0,
+ "value": 57,
+ "type": "user"
+ },
+ "rottenTomatoes": {
+ "votes": 0,
+ "value": 67,
+ "type": "user"
+ }
+ },
+ "collection": {
+ "name": "Thor Collection",
+ "tmdbId": 131296,
+ "images": []
+ },
+ "id": 168
+ },
+ {
+ "title": "Sword Art Online the Movie -Progressive- Scherzo of a Deep Night",
+ "originalTitle": "劇場版 ソードアート・オンライン プログレッシブ 冥き夕闇のスケルツォ",
+ "originalLanguage": {
+ "id": 8,
+ "name": "Japanese"
+ },
+ "alternateTitles": [
+ {
+ "sourceType": "tmdb",
+ "movieId": 169,
+ "title": "Sword Art Online Progressive",
+ "sourceId": 0,
+ "votes": 0,
+ "voteCount": 0,
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "id": 1748
+ }
+ ],
+ "secondaryYearSourceId": 0,
+ "sortTitle": "sword art online movie progressive scherzo deep night",
+ "sizeOnDisk": 0,
+ "status": "announced",
+ "overview": "",
+ "inCinemas": "2022-09-10T00:00:00Z",
+ "images": [
+ {
+ "coverType": "poster",
+ "url": "https://image.tmdb.org/t/p/original/1L904CSzPCEEpPcUoBWH4cjuGJW.jpg"
+ }
+ ],
+ "website": "",
+ "year": 2022,
+ "hasFile": false,
+ "youTubeTrailerId": "",
+ "studio": "Aniplex",
+ "path": "/movies/Sword Art Online the Movie -Progressive- Scherzo of a Deep Night (2022)",
+ "qualityProfileId": 1,
+ "monitored": true,
+ "minimumAvailability": "released",
+ "isAvailable": false,
+ "folderName": "/movies/Sword Art Online the Movie -Progressive- Scherzo of a Deep Night (2022)",
+ "runtime": 0,
+ "cleanTitle": "swordartonlinemovieprogressivescherzodeepnight",
+ "tmdbId": 893712,
+ "titleSlug": "893712",
+ "genres": [
+ "Animation",
+ "Action",
+ "Fantasy"
+ ],
+ "tags": [],
+ "added": "2022-07-04T17:05:01Z",
+ "ratings": {
+ "tmdb": {
+ "votes": 0,
+ "value": 0,
+ "type": "user"
+ }
+ },
+ "collection": {
+ "name": "Sword Art Online the Movie -Progressive-",
+ "tmdbId": 893713,
+ "images": []
+ },
+ "id": 169
+ }
+]
\ No newline at end of file
diff --git a/src/modules/common/examples/multipletvshows.json b/src/modules/common/examples/multipletvshows.json
new file mode 100644
index 000000000..7857b70ce
--- /dev/null
+++ b/src/modules/common/examples/multipletvshows.json
@@ -0,0 +1,409 @@
+{
+ "page": 1,
+ "totalPages": 2,
+ "totalResults": 21,
+ "results": [
+ {
+ "id": 66025,
+ "firstAirDate": "2016-06-14",
+ "genreIds": [
+ 80,
+ 18
+ ],
+ "mediaType": "tv",
+ "name": "Animal Kingdom",
+ "originCountry": [
+ "US"
+ ],
+ "originalLanguage": "en",
+ "originalName": "Animal Kingdom",
+ "overview": "Un jeune homme de dix-sept ans emménage avec la famille Cody après le décès de sa mère, une fratrie baignant dans la criminalité gouvernée d'une main de maître par la matriarche, Smurf.",
+ "popularity": 75.653,
+ "voteAverage": 7.7,
+ "voteCount": 318,
+ "backdropPath": "/eQJwfyMqSra10ck8HOoiCrbQR32.jpg",
+ "posterPath": "/rzvdKrnSRKPFI0pgqMQknDPpRC9.jpg",
+ "mediaInfo": {
+ "downloadStatus": [],
+ "downloadStatus4k": [],
+ "id": 217,
+ "mediaType": "tv",
+ "tmdbId": 66025,
+ "tvdbId": 304262,
+ "imdbId": null,
+ "status": 3,
+ "status4k": 1,
+ "createdAt": "2022-08-08T11:06:20.000Z",
+ "updatedAt": "2022-08-08T11:06:23.000Z",
+ "lastSeasonChange": "2022-08-08T11:06:20.000Z",
+ "mediaAddedAt": null,
+ "serviceId": 0,
+ "serviceId4k": null,
+ "externalServiceId": 56,
+ "externalServiceId4k": null,
+ "externalServiceSlug": "animal-kingdom-2016",
+ "externalServiceSlug4k": null,
+ "ratingKey": null,
+ "ratingKey4k": null,
+ "seasons": [],
+ "serviceUrl": "http://sonarr:8989/series/animal-kingdom-2016"
+ }
+ },
+ {
+ "id": 44629,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 18,
+ 53,
+ 80,
+ 9648
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Animal Kingdom",
+ "overview": "Une rue anonyme dans la banlieue de Melbourne. C’est là que vit la famille Cody. Profession: criminels. L’irruption parmi eux de Joshua, un neveu éloigné, offre à la police le moyen de les infiltrer. Il ne reste plus à Joshua qu’à choisir son camp...",
+ "popularity": 11.839,
+ "releaseDate": "2010-06-03",
+ "title": "Animal Kingdom",
+ "video": false,
+ "voteAverage": 6.8,
+ "voteCount": 643,
+ "backdropPath": "/dxOv6K3LNbZfQaGDyx7Tp94Koy.jpg",
+ "posterPath": "/qrVjc5JcaujL58SMMW9lqrp3bBX.jpg"
+ },
+ {
+ "id": 95731,
+ "firstAirDate": "2020-09-25",
+ "genreIds": [
+ 99
+ ],
+ "mediaType": "tv",
+ "name": "Au cœur de Disney's Animal Kingdom",
+ "originCountry": [],
+ "originalLanguage": "en",
+ "originalName": "Magic of Disney's Animal Kingdom",
+ "overview": "Au cœur d’Animal Kingdom narrée par Josh Gad, une célébrité parmi les fans de Disney, nous emmène en coulisses découvrir la magie de deux des animations animalières les plus visitées au monde : le parc à thème de Disney, Animal Kingdom, et The Seas with Nemo & Friends à Epcot. Les spectateurs s’approchent au plus près de créatures parmi les plus rares et les plus belles de la planète et rencontrent les experts en soins animaliers qui ont tissé des liens stupéfiants avec les 5 000 et plus animaux du parc. Chacun des huit épisodes plonge au cœur de l’endroit le plus magique sur Terre, dévoilant les multiples facettes de sa conception et de sa gestion.",
+ "popularity": 3.367,
+ "voteAverage": 8,
+ "voteCount": 4,
+ "backdropPath": "/gMTMnd54VVAbGiodBqMTGCjM3b2.jpg",
+ "posterPath": "/gvNTeRAfu4KN3dD5HUO4Nbnri07.jpg"
+ },
+ {
+ "id": 120862,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 35,
+ 18,
+ 10749
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "The Animal Kingdom",
+ "overview": "Tom Collier, jeune éditeur, a entretenu une liaison passionnée et intellectuelle avec une dessinatrice, Daisy Sage. Celle-ci ayant mis un terme à leur relation, il a fait la connaissance de Cecilia, qu'il a rapidement décidé d'épouser. Alors que les fiançailles sont annoncées, Daisy, toujours amoureuse, fait son retour, mais trop tard. Le mariage a lieu. Sous l'influence de Cecilia, Tom Collier, qui était un éditeur intègre et exigeant, fait de plus en plus de concessions commerciales. Daisy, elle demeure fidèle à elle-même. Tom Collier, se retrouve a évoluer, par amour pour sa femme, dans un milieu de conventions bourgeoises qui ne l'intéressent pas.",
+ "popularity": 2.102,
+ "releaseDate": "1932-12-28",
+ "title": "The Animal Kingdom",
+ "video": false,
+ "voteAverage": 6.3,
+ "voteCount": 13,
+ "backdropPath": "/5P1Hx46wvCVx9D9yT8M5rdUIHZB.jpg",
+ "posterPath": "/3sLWwNvS77xynAGLkbiHVXlO3UH.jpg"
+ },
+ {
+ "id": 311015,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 99
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Disney Parks: Disney's Animal Kingdom",
+ "overview": "",
+ "popularity": 1.208,
+ "releaseDate": "2010-01-01",
+ "title": "Disney Parks: Disney's Animal Kingdom",
+ "video": true,
+ "voteAverage": 9,
+ "voteCount": 2,
+ "backdropPath": null,
+ "posterPath": "/93OEKY5vnKqGFbOyHtUAdcEz8NV.jpg"
+ },
+ {
+ "id": 291774,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [],
+ "originalLanguage": "en",
+ "originalTitle": "Kenya 3D: Animal Kingdom",
+ "overview": "",
+ "popularity": 0.6,
+ "releaseDate": "2013-03-08",
+ "title": "Kenya 3D: Animal Kingdom",
+ "video": false,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": null,
+ "posterPath": null
+ },
+ {
+ "id": 640253,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [],
+ "originalLanguage": "it",
+ "originalTitle": "Animal Kingdom",
+ "overview": "",
+ "popularity": 0.6,
+ "releaseDate": "2016-11-12",
+ "title": "Animal Kingdom",
+ "video": false,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": null,
+ "posterPath": "/vJFK5cCcIh4X4op0oeK5iY2ibPv.jpg"
+ },
+ {
+ "id": 507434,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 27
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Animal Kingdom",
+ "overview": "",
+ "popularity": 0.6,
+ "releaseDate": "2017-02-25",
+ "title": "Animal Kingdom",
+ "video": false,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": "/8QxSJRLLw2m8ymrFsC2xJ26yd1n.jpg",
+ "posterPath": "/s77Q92boNGgkT2J5se3gwq5N8Xp.jpg"
+ },
+ {
+ "id": 775877,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [],
+ "originalLanguage": "en",
+ "originalTitle": "Disney's Animal Kingdom",
+ "overview": "",
+ "popularity": 0.6,
+ "releaseDate": "2004-05-12",
+ "title": "Disney's Animal Kingdom",
+ "video": true,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": null,
+ "posterPath": null
+ },
+ {
+ "id": 318575,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 99
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Nature: Love in the Animal Kingdom",
+ "overview": "",
+ "popularity": 0.655,
+ "releaseDate": "2013-11-06",
+ "title": "Nature: Love in the Animal Kingdom",
+ "video": true,
+ "voteAverage": 9.5,
+ "voteCount": 2,
+ "backdropPath": "/vx2dfrXPTn0dKoyIqCEgrGvzwkd.jpg",
+ "posterPath": "/1fd53UCxtLAItNI5jMtVetFuw6v.jpg"
+ },
+ {
+ "id": 743266,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [],
+ "originalLanguage": "en",
+ "originalTitle": "Animal Kingdom: Great Are Thy Works",
+ "overview": "",
+ "popularity": 0.6,
+ "releaseDate": "1993-01-01",
+ "title": "Animal Kingdom: Great Are Thy Works",
+ "video": false,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": null,
+ "posterPath": "/vjnsGLvymjG7dAIbjwzgFCdbhl6.jpg"
+ },
+ {
+ "id": 828152,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 99
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Disney's Animal Kingdom: Alive with Magic",
+ "overview": "",
+ "popularity": 0.6,
+ "releaseDate": "2017-06-27",
+ "title": "Disney's Animal Kingdom: Alive with Magic",
+ "video": false,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": null,
+ "posterPath": "/amzVT8T9Ju3KLCDnBq4Rhf3LO8j.jpg"
+ },
+ {
+ "id": 280391,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 12,
+ 35,
+ 16
+ ],
+ "originalLanguage": "fr",
+ "originalTitle": "Pourquoi j'ai pas mangé mon père",
+ "overview": "L’histoire trépidante d’Édouard, fils aîné du roi des simiens, qui, considéré à sa naissance comme trop malingre, est rejeté par sa tribu. Il grandit loin d’eux, auprès de son ami Ian, et, incroyablement ingénieux, il découvre le feu, la chasse, l’habitat moderne, l’amour et même… l’espoir. Généreux, il veut tout partager, révolutionne l’ordre établi, et mène son peuple avec éclat et humour vers la véritable humanité… celle où on ne mange pas son père.",
+ "popularity": 12.971,
+ "releaseDate": "2015-04-08",
+ "title": "Pourquoi j'ai pas mangé mon père",
+ "video": false,
+ "voteAverage": 5.3,
+ "voteCount": 303,
+ "backdropPath": "/msDLrSt7Ozpe6oOg4XJrsQJd2IE.jpg",
+ "posterPath": "/efpzs2g1uRNcP8wPbIKSRPPH0aC.jpg"
+ },
+ {
+ "id": 775559,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [],
+ "originalLanguage": "en",
+ "originalTitle": "A New species of Theme Park: Disney’s Animal Kingdom",
+ "overview": "",
+ "popularity": 0.6,
+ "releaseDate": "1998-04-14",
+ "title": "A New species of Theme Park: Disney’s Animal Kingdom",
+ "video": true,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": null,
+ "posterPath": null
+ },
+ {
+ "id": 775831,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [],
+ "originalLanguage": "en",
+ "originalTitle": "Disney Animal Kingdom Villas: A Village Comes to Life",
+ "overview": "",
+ "popularity": 0.6,
+ "releaseDate": "2007-06-14",
+ "title": "Disney Animal Kingdom Villas: A Village Comes to Life",
+ "video": true,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": null,
+ "posterPath": null
+ },
+ {
+ "id": 432906,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 99
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Out in Nature: Homosexual Behaviour in the Animal Kingdom",
+ "overview": "",
+ "popularity": 0.6,
+ "releaseDate": "2001-09-07",
+ "title": "Out in Nature: Homosexual Behaviour in the Animal Kingdom",
+ "video": false,
+ "voteAverage": 6.8,
+ "voteCount": 4,
+ "backdropPath": null,
+ "posterPath": "/jjxhR9ZxZ3vhauK8IDR6wIBlCLI.jpg"
+ },
+ {
+ "id": 128887,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 16,
+ 35
+ ],
+ "originalLanguage": "ja",
+ "originalTitle": "クレヨンしんちゃん オタケべ!カスカベ野生王国",
+ "overview": "",
+ "popularity": 5.365,
+ "releaseDate": "2009-04-18",
+ "title": "クレヨンしんちゃん オタケべ!カスカベ野生王国",
+ "video": false,
+ "voteAverage": 8.5,
+ "voteCount": 10,
+ "backdropPath": "/azvwXB25Wvbx2Cou3Th7lbnjrqP.jpg",
+ "posterPath": "/h7LipCtdCyBOKR1By5wSP2Ufy3c.jpg"
+ },
+ {
+ "id": 579733,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [],
+ "originalLanguage": "no",
+ "originalTitle": "Dyreriket",
+ "overview": "",
+ "popularity": 0.6,
+ "releaseDate": "2018-05-01",
+ "title": "Dyreriket",
+ "video": false,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": null,
+ "posterPath": null
+ },
+ {
+ "id": 111612,
+ "firstAirDate": "2018-10-12",
+ "genreIds": [
+ 10764
+ ],
+ "mediaType": "tv",
+ "name": "坂上どうぶつ王国",
+ "originCountry": [
+ "JP"
+ ],
+ "originalLanguage": "ja",
+ "originalName": "坂上どうぶつ王国",
+ "overview": "",
+ "popularity": 1.186,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": "/op8bK5R76L9QpwcVTnYG7nKXKsU.jpg",
+ "posterPath": "/2VPq9RYaDohOT8YqTibKZMMT2Ue.jpg"
+ },
+ {
+ "id": 156216,
+ "firstAirDate": "2022-01-17",
+ "genreIds": [
+ 16
+ ],
+ "mediaType": "tv",
+ "name": "动物王国的故事",
+ "originCountry": [
+ "CN"
+ ],
+ "originalLanguage": "zh",
+ "originalName": "动物王国的故事",
+ "overview": "",
+ "popularity": 0.6,
+ "voteAverage": 0,
+ "voteCount": 0,
+ "backdropPath": "/uxIJQnjzIQn2MGHk17nNhoIEkxU.jpg",
+ "posterPath": "/v90bqYZRUT30n22DdwahmW18LFn.jpg"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/modules/common/examples/music.json b/src/modules/common/examples/music.json
new file mode 100644
index 000000000..e9d7933e2
--- /dev/null
+++ b/src/modules/common/examples/music.json
@@ -0,0 +1,832 @@
+{
+ "title": "Celebrate",
+ "disambiguation": "",
+ "overview": "",
+ "artistId": 9,
+ "foreignAlbumId": "bfedab35-92b7-449b-adf0-875439ec9a85",
+ "monitored": true,
+ "anyReleaseOk": true,
+ "profileId": 1,
+ "duration": 1818062,
+ "albumType": "Album",
+ "secondaryTypes": [],
+ "mediumCount": 1,
+ "ratings": {
+ "votes": 1,
+ "value": 10
+ },
+ "releaseDate": "2022-07-27T00:00:00Z",
+ "releases": [
+ {
+ "id": 202,
+ "albumId": 32,
+ "foreignReleaseId": "22bd49a1-f858-427d-94ee-1788b54fb508",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "ONCE JAPAN限定盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 203,
+ "albumId": 32,
+ "foreignReleaseId": "52c73f5f-4f91-451b-96d1-3ac3ef9371ee",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "初回限定盤B",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 204,
+ "albumId": 32,
+ "foreignReleaseId": "5745040b-a5fa-4dae-ad31-0bce9d501e23",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "JEONGYEON盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 205,
+ "albumId": 32,
+ "foreignReleaseId": "006f9135-454b-4182-a057-47d1b002a282",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "NAYEON盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 206,
+ "albumId": 32,
+ "foreignReleaseId": "eeacd54b-a2bd-48f8-8d7c-3ab55b68f17c",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 81,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "NAYEON盤",
+ "mediumFormat": "CD"
+ },
+ {
+ "mediumNumber": 2,
+ "mediumName": "JEONGYEON盤",
+ "mediumFormat": "CD"
+ },
+ {
+ "mediumNumber": 3,
+ "mediumName": "MOMO盤",
+ "mediumFormat": "CD"
+ },
+ {
+ "mediumNumber": 4,
+ "mediumName": "SANA盤",
+ "mediumFormat": "CD"
+ },
+ {
+ "mediumNumber": 5,
+ "mediumName": "JIHYO盤",
+ "mediumFormat": "CD"
+ },
+ {
+ "mediumNumber": 6,
+ "mediumName": "MINA盤",
+ "mediumFormat": "CD"
+ },
+ {
+ "mediumNumber": 7,
+ "mediumName": "DAHYUN盤",
+ "mediumFormat": "CD"
+ },
+ {
+ "mediumNumber": 8,
+ "mediumName": "CHAEYOUNG盤",
+ "mediumFormat": "CD"
+ },
+ {
+ "mediumNumber": 9,
+ "mediumName": "TZUYU盤",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 9,
+ "disambiguation": "5th Anniversary Collection BOX",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan",
+ "Warner Music Japan",
+ "Warner Music Japan",
+ "Warner Music Japan",
+ "Warner Music Japan",
+ "Warner Music Japan",
+ "Warner Music Japan",
+ "Warner Music Japan",
+ "Warner Music Japan"
+ ],
+ "format": "9xCD",
+ "monitored": false
+ },
+ {
+ "id": 207,
+ "albumId": 32,
+ "foreignReleaseId": "8ddd43f0-859e-4cff-be7c-daf6806cc035",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "JIHYO盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 208,
+ "albumId": 32,
+ "foreignReleaseId": "ad8e0553-97de-499b-8010-85bd02c62859",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "TZUYU盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 209,
+ "albumId": 32,
+ "foreignReleaseId": "276bf831-8cae-49a0-bc50-479869d401ac",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "MOMO盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 210,
+ "albumId": 32,
+ "foreignReleaseId": "3d201058-deb0-4159-a82f-d9076a608036",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "MINA盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 211,
+ "albumId": 32,
+ "foreignReleaseId": "e1fbf96d-f83e-478c-be7d-f0f6dd5305d1",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "DAHYUN盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 212,
+ "albumId": 32,
+ "foreignReleaseId": "769a7006-763b-4cd8-8d1f-d389d52ec002",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "CHAEYOUNG盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 213,
+ "albumId": 32,
+ "foreignReleaseId": "42e74581-0ef3-4db9-8a20-ba8a3daa1cf0",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "初回限定盤A",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan",
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 214,
+ "albumId": 32,
+ "foreignReleaseId": "81bdf07f-61ad-4436-bfae-63cd1d9e700c",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "通常盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 215,
+ "albumId": 32,
+ "foreignReleaseId": "273b3ba1-88e8-4653-a542-c8b0489c1772",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 0,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "CD"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "SANA盤",
+ "country": [
+ "Japan"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "CD",
+ "monitored": false
+ },
+ {
+ "id": 216,
+ "albumId": 32,
+ "foreignReleaseId": "2442df5f-4090-452c-be7f-5885dffee8e2",
+ "title": "Celebrate",
+ "status": "Official",
+ "duration": 1818062,
+ "trackCount": 9,
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "Digital Media"
+ }
+ ],
+ "mediumCount": 1,
+ "disambiguation": "",
+ "country": [
+ "Algeria",
+ "Angola",
+ "Anguilla",
+ "Antigua and Barbuda",
+ "Argentina",
+ "Armenia",
+ "Australia",
+ "Austria",
+ "Azerbaijan",
+ "Bahamas",
+ "Bahrain",
+ "Barbados",
+ "Belgium",
+ "Belize",
+ "Benin",
+ "Bermuda",
+ "Bhutan",
+ "Bolivia",
+ "Bosnia and Herzegovina",
+ "Botswana",
+ "Brazil",
+ "Brunei",
+ "Bulgaria",
+ "Burkina Faso",
+ "Cambodia",
+ "Cameroon",
+ "Canada",
+ "Cape Verde",
+ "Cayman Islands",
+ "Chad",
+ "Chile",
+ "China",
+ "Colombia",
+ "Congo",
+ "Costa Rica",
+ "Côte d'Ivoire",
+ "Croatia",
+ "Cyprus",
+ "Czech Republic",
+ "Denmark",
+ "Dominica",
+ "Dominican Republic",
+ "Ecuador",
+ "Egypt",
+ "El Salvador",
+ "Estonia",
+ "Fiji",
+ "Finland",
+ "France",
+ "Gabon",
+ "Gambia",
+ "Georgia",
+ "Germany",
+ "Ghana",
+ "Greece",
+ "Grenada",
+ "Guatemala",
+ "Guinea-Bissau",
+ "Guyana",
+ "Honduras",
+ "Hong Kong",
+ "Hungary",
+ "Iceland",
+ "India",
+ "Indonesia",
+ "Iraq",
+ "Ireland",
+ "Israel",
+ "Italy",
+ "Jamaica",
+ "Japan",
+ "Jordan",
+ "Kazakhstan",
+ "Kenya",
+ "Kuwait",
+ "Kyrgyzstan",
+ "Laos",
+ "Latvia",
+ "Lebanon",
+ "Liberia",
+ "Libya",
+ "Lithuania",
+ "Luxembourg",
+ "Macao",
+ "North Macedonia",
+ "Madagascar",
+ "Malawi",
+ "Malaysia",
+ "Maldives",
+ "Mali",
+ "Malta",
+ "Mauritania",
+ "Mauritius",
+ "Mexico",
+ "Federated States of Micronesia",
+ "Moldova",
+ "Mongolia",
+ "Montserrat",
+ "Morocco",
+ "Mozambique",
+ "Myanmar",
+ "Namibia",
+ "Nepal",
+ "Netherlands",
+ "New Zealand",
+ "Nicaragua",
+ "Niger",
+ "Nigeria",
+ "Norway",
+ "Oman",
+ "Panama",
+ "Papua New Guinea",
+ "Paraguay",
+ "Peru",
+ "Philippines",
+ "Poland",
+ "Portugal",
+ "Qatar",
+ "Romania",
+ "Rwanda",
+ "Saint Kitts and Nevis",
+ "Saint Lucia",
+ "Saint Vincent and The Grenadines",
+ "Saudi Arabia",
+ "Senegal",
+ "Seychelles",
+ "Sierra Leone",
+ "Singapore",
+ "Slovakia",
+ "Slovenia",
+ "Solomon Islands",
+ "South Africa",
+ "Spain",
+ "Sri Lanka",
+ "Suriname",
+ "Eswatini",
+ "Sweden",
+ "Switzerland",
+ "Taiwan",
+ "Tajikistan",
+ "Tanzania",
+ "Thailand",
+ "Tonga",
+ "Trinidad and Tobago",
+ "Tunisia",
+ "Turkey",
+ "Turkmenistan",
+ "Turks and Caicos Islands",
+ "Uganda",
+ "Ukraine",
+ "United Arab Emirates",
+ "United Kingdom",
+ "United States",
+ "Uruguay",
+ "Uzbekistan",
+ "Vanuatu",
+ "Venezuela",
+ "Vietnam",
+ "British Virgin Islands",
+ "Yemen",
+ "Democratic Republic of the Congo",
+ "Zambia",
+ "Zimbabwe",
+ "Montenegro",
+ "Serbia",
+ "Kosovo"
+ ],
+ "label": [
+ "Warner Music Japan"
+ ],
+ "format": "Digital Media",
+ "monitored": true
+ }
+ ],
+ "genres": [],
+ "media": [
+ {
+ "mediumNumber": 1,
+ "mediumName": "",
+ "mediumFormat": "Digital Media"
+ }
+ ],
+ "artist": {
+ "artistMetadataId": 14,
+ "status": "continuing",
+ "ended": false,
+ "artistName": "TWICE",
+ "foreignArtistId": "8da127cc-c432-418f-b356-ef36210d82ac",
+ "tadbId": 0,
+ "discogsId": 0,
+ "overview": "Twice (Korean: 트와이스; RR: Teuwaiseu; Japanese: トゥワイス, Hepburn: To~uwaisu; commonly stylized in all caps as TWICE) is a South Korean girl group formed by JYP Entertainment. The group is composed of nine members: Nayeon, Jeongyeon, Momo, Sana, Jihyo, Mina, Dahyun, Chaeyoung, and Tzuyu. Twice was formed under the television program Sixteen (2015) and debuted on October 20, 2015, with the extended play (EP) The Story Begins.\nTwice rose to domestic fame in 2016 with their single \"Cheer Up\", which charted at number one on the Gaon Digital Chart, became the best-performing single of the year, and won \"Song of the Year\" at the Melon Music Awards and Mnet Asian Music Awards. Their next single, \"TT\", from their third EP Twicecoaster: Lane 1, topped the Gaon charts for four consecutive weeks. The EP was the highest selling Korean girl group album of 2016. Within 19 months after debut, Twice had already sold over 1.2 million units of their four EPs and special album. As of December 2020, the group has sold over 10 million albums cumulatively in South Korea and Japan, becoming the highest-selling K-Pop girl group of all time.The group debuted in Japan on June 28, 2017, under Warner Music Japan, with the release of a compilation album titled #Twice. The album charted at number 2 on the Oricon Albums Chart with the highest first-week album sales by a K-pop artist in Japan in two years. It was followed by the release of Twice's first original Japanese maxi single titled \"One More Time\" in October. Twice became the first Korean girl group to earn a platinum certification from the Recording Industry Association of Japan (RIAJ) for both an album and CD single in the same year. Twice ranked third in the Top Artist category of Billboard Japan's 2017 Year-end Rankings, and in 2019, they became the first Korean girl group to embark on a Japanese dome tour.\nTwice is the first female Korean act to simultaneously top both Billboard's World Albums and World Digital Song Sales charts with the release of their first studio album Twicetagram and its lead single \"Likey\" in 2017. With the release of their single \"Feel Special\" in 2019, Twice became the third female Korean act to chart into the Canadian Hot 100. After signing with Republic Records for American promotions as part of a partnership with JYP Entertainment, the group has charted into the US Billboard 200 with More & More and Eyes Wide Open in 2020 and Taste of Love and Formula of Love: O+T=<3 in 2021. Their first official English-language single, \"The Feels\", became their first song to enter the US Billboard Hot 100 and the UK Singles Chart, peaking at the 83rd and 80th positions of the charts, respectively. They have been dubbed the next \"Nation's Girl Group\", and their point choreography—including for \"Cheer Up\" (2016), \"TT\" (2016), \"Signal\" (2017), and \"What Is Love?\" (2018)—became dance crazes and viral memes imitated by many celebrities.",
+ "artistType": "Group",
+ "disambiguation": "South Korean girl group",
+ "links": [
+ {
+ "url": "https://www.generasia.com/wiki/Twice",
+ "name": "generasia"
+ },
+ {
+ "url": "http://twice.jype.com/",
+ "name": "jype"
+ },
+ {
+ "url": "https://twitter.com/JYPETWICE",
+ "name": "twitter"
+ },
+ {
+ "url": "https://www.facebook.com/JYPETWICE",
+ "name": "facebook"
+ },
+ {
+ "url": "https://www.instagram.com/twicetagram/",
+ "name": "instagram"
+ },
+ {
+ "url": "https://www.wikidata.org/wiki/Q20645861",
+ "name": "wikidata"
+ },
+ {
+ "url": "http://fans.jype.com/twice",
+ "name": "jype"
+ },
+ {
+ "url": "https://commons.wikimedia.org/wiki/File:Twice_performing_at_SAC_2016_02_(cropped).jpg",
+ "name": "wikimedia"
+ },
+ {
+ "url": "https://www.discogs.com/artist/4786543",
+ "name": "discogs"
+ },
+ {
+ "url": "https://www.last.fm/music/%ED%8A%B8%EC%99%80%EC%9D%B4%EC%8A%A4",
+ "name": "last"
+ },
+ {
+ "url": "https://www.last.fm/music/TWICE",
+ "name": "last"
+ },
+ {
+ "url": "https://commons.wikimedia.org/wiki/File:160507_Twice_guerrilla_concert.jpg",
+ "name": "wikimedia"
+ },
+ {
+ "url": "https://open.spotify.com/artist/7n2Ycct7Beij7Dj7meI4X0",
+ "name": "spotify"
+ },
+ {
+ "url": "http://www.twicejapan.com/",
+ "name": "twicejapan"
+ },
+ {
+ "url": "https://www.instagram.com/jypetwice_japan/",
+ "name": "instagram"
+ },
+ {
+ "url": "https://twitter.com/JYPETWICE_JAPAN",
+ "name": "twitter"
+ },
+ {
+ "url": "https://itunes.apple.com/jp/artist/id1203816887",
+ "name": "apple"
+ },
+ {
+ "url": "https://commons.wikimedia.org/wiki/File:(TV10)_%EC%97%AC%EC%9E%90%EC%B9%9C%EA%B5%AC%C2%B7%ED%8A%B8%EC%99%80%EC%9D%B4%EC%8A%A4%C2%B7%EB%B8%94%EB%9E%99%ED%95%91%ED%81%AC,_%EB%A0%88%EB%93%9C%EC%B9%B4%ED%8E%AB_%EA%B0%81%EC%96%91%EA%B0%81%EC%83%89_%ED%8C%A8%EC%85%98_%EC%97%B4%EC%A0%84_(2017_%EA%B3%A8%EB%93%A0%EB%94%94%EC%8A%A4%ED%81%AC_%EB%A0%88%EB%93%9C%EC%B9%B4%ED%8E%AB)_2m19s.jpg",
+ "name": "wikimedia"
+ },
+ {
+ "url": "https://itunes.apple.com/us/artist/id1203816887",
+ "name": "apple"
+ },
+ {
+ "url": "http://viaf.org/viaf/178150468353504172529",
+ "name": "viaf"
+ },
+ {
+ "url": "https://www.deezer.com/artist/161553",
+ "name": "deezer"
+ },
+ {
+ "url": "https://imvdb.com/n/twice",
+ "name": "imvdb"
+ },
+ {
+ "url": "https://listen.tidal.com/artist/3577941",
+ "name": "tidal"
+ },
+ {
+ "url": "https://www.youtube.com/TWICE",
+ "name": "youtube"
+ },
+ {
+ "url": "https://www.youtube.com/twicejapan_official",
+ "name": "youtube"
+ },
+ {
+ "url": "https://music.apple.com/mx/artist/1203816887",
+ "name": "apple"
+ },
+ {
+ "url": "https://www.imdb.com/name/nm9652049/",
+ "name": "imdb"
+ },
+ {
+ "url": "https://www.tiktok.com/@twice_tiktok_officialjp",
+ "name": "tiktok"
+ },
+ {
+ "url": "https://music.youtube.com/channel/UCAq0pFGa2w9SjxOq0ZxKVIw",
+ "name": "youtube"
+ }
+ ],
+ "images": [
+ {
+ "url": "http://assets.fanart.tv/fanart/music/8da127cc-c432-418f-b356-ef36210d82ac/musicbanner/twice-58fb678fb1219.jpg",
+ "coverType": "banner",
+ "extension": ".jpg"
+ },
+ {
+ "url": "http://assets.fanart.tv/fanart/music/8da127cc-c432-418f-b356-ef36210d82ac/artistbackground/twice-619421e3c57cc.jpg",
+ "coverType": "fanart",
+ "extension": ".jpg"
+ },
+ {
+ "url": "http://assets.fanart.tv/fanart/music/8da127cc-c432-418f-b356-ef36210d82ac/hdmusiclogo/twice-58d833d0a608a.png",
+ "coverType": "logo",
+ "extension": ".png"
+ },
+ {
+ "url": "http://assets.fanart.tv/fanart/music/8da127cc-c432-418f-b356-ef36210d82ac/artistthumb/twice-58fb69c0c2b00.jpg",
+ "coverType": "poster",
+ "extension": ".jpg"
+ }
+ ],
+ "path": "/data/Library/Music/TWICE",
+ "qualityProfileId": 1,
+ "metadataProfileId": 1,
+ "monitored": true,
+ "monitorNewItems": "all",
+ "genres": [
+ "Dance",
+ "Electronica",
+ "K-Pop",
+ "Pop",
+ "R&B"
+ ],
+ "cleanName": "twice",
+ "sortName": "twice",
+ "tags": [],
+ "added": "2022-07-30T19:32:06Z",
+ "ratings": {
+ "votes": 4,
+ "value": 9.5
+ },
+ "statistics": {
+ "albumCount": 0,
+ "trackFileCount": 0,
+ "trackCount": 0,
+ "totalTrackCount": 0,
+ "sizeOnDisk": 0,
+ "percentOfTracks": 0
+ },
+ "id": 9
+ },
+ "images": [
+ {
+ "url": "/MediaCover/Albums/32/cover.jpg?lastWrite=637927379160000000",
+ "coverType": "cover",
+ "extension": ".jpg",
+ "remoteUrl": "https://imagecache.lidarr.audio/v1/caa/22bd49a1-f858-427d-94ee-1788b54fb508/32961181216-1200.jpg"
+ }
+ ],
+ "links": [],
+ "statistics": {
+ "trackFileCount": 9,
+ "trackCount": 9,
+ "totalTrackCount": 9,
+ "sizeOnDisk": 74968875,
+ "percentOfTracks": 100
+ },
+ "grabbed": false,
+ "id": 32
+}
\ No newline at end of file
diff --git a/src/modules/common/examples/request.json b/src/modules/common/examples/request.json
new file mode 100644
index 000000000..486932600
--- /dev/null
+++ b/src/modules/common/examples/request.json
@@ -0,0 +1,47 @@
+{
+ "id": 634649,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 28,
+ 12,
+ 878
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Spider-Man: No Way Home",
+ "overview": "Après les événements liés à l'affrontement avec Mysterio, l'identité secrète de Spider-Man a été révélée. Il est poursuivi par le gouvernement américain, qui l'accuse du meurtre de Mysterio, et traqué par les médias. Cet événement a également des conséquences terribles sur la vie de sa petite-amie M.J. et de son meilleur ami Ned. Désemparé, Peter Parker demande alors de l'aide au docteur Strange. Ce dernier lance un sort pour que tout le monde oublie que Peter est Spider-Man. Mais les choses ne se passent pas comme prévu, et cette action altère la stabilité de l'espace-temps. Cela ouvre le « multivers », un concept terrifiant dont ils ne savent quasiment rien...",
+ "popularity": 1643.549,
+ "releaseDate": "2021-12-15",
+ "title": "Spider-Man: No Way Home",
+ "video": false,
+ "voteAverage": 8,
+ "voteCount": 14510,
+ "backdropPath": "/ocUp7DJBIc8VJgLEw1prcyK1dYv.jpg",
+ "posterPath": "/3SyG7dq2q0ollxJ4pSsrqcfRmVj.jpg",
+ "mediaInfo": {
+ "downloadStatus": [],
+ "downloadStatus4k": [],
+ "id": 91,
+ "mediaType": "movie",
+ "tmdbId": 634649,
+ "tvdbId": null,
+ "imdbId": null,
+ "status": 5,
+ "status4k": 1,
+ "createdAt": "2021-11-15T15:15:57.000Z",
+ "updatedAt": "2022-08-01T08:40:19.000Z",
+ "lastSeasonChange": "2021-11-15T15:15:57.000Z",
+ "mediaAddedAt": "2021-12-23T12:04:39.000Z",
+ "serviceId": 0,
+ "serviceId4k": null,
+ "externalServiceId": 89,
+ "externalServiceId4k": null,
+ "externalServiceSlug": "634649",
+ "externalServiceSlug4k": null,
+ "ratingKey": "823",
+ "ratingKey4k": null,
+ "seasons": [],
+ "plexUrl": "https://app.plex.tv/desktop#!/server/719240db84d0795f30baa1c7283588fea536bb21/details?key=%2Flibrary%2Fmetadata%2F823",
+ "serviceUrl": "http://radarr:7878/movie/634649"
+ }
+}
\ No newline at end of file
diff --git a/src/modules/common/examples/search-response.json b/src/modules/common/examples/search-response.json
new file mode 100644
index 000000000..3e7ab266f
--- /dev/null
+++ b/src/modules/common/examples/search-response.json
@@ -0,0 +1,490 @@
+{
+ "page": 1,
+ "totalPages": 43,
+ "totalResults": 847,
+ "results": [
+ {
+ "id": 66732,
+ "firstAirDate": "2016-07-15",
+ "genreIds": [
+ 18,
+ 10765,
+ 9648
+ ],
+ "mediaType": "tv",
+ "name": "Stranger Things",
+ "originCountry": [
+ "US"
+ ],
+ "originalLanguage": "en",
+ "originalName": "Stranger Things",
+ "overview": "Quand un jeune garçon disparaît, une petite ville découvre une affaire mystérieuse, des expériences secrètes, des forces surnaturelles terrifiantes... et une fillette.",
+ "popularity": 1750.831,
+ "voteAverage": 8.6,
+ "voteCount": 12763,
+ "backdropPath": "/56v2KjBlU4XaOv9rVYEQypROD7P.jpg",
+ "posterPath": "/r2w5UNf2mO2Mdl4q6HopuBms6XM.jpg",
+ "mediaInfo": {
+ "downloadStatus": [],
+ "downloadStatus4k": [],
+ "id": 202,
+ "mediaType": "tv",
+ "tmdbId": 66732,
+ "tvdbId": 305288,
+ "imdbId": null,
+ "status": 4,
+ "status4k": 1,
+ "createdAt": "2022-08-01T08:55:00.000Z",
+ "updatedAt": "2022-08-02T02:30:09.000Z",
+ "lastSeasonChange": "2022-08-01T08:55:00.000Z",
+ "mediaAddedAt": "2022-08-01T08:49:00.000Z",
+ "serviceId": 0,
+ "serviceId4k": null,
+ "externalServiceId": 42,
+ "externalServiceId4k": null,
+ "externalServiceSlug": "stranger-things",
+ "externalServiceSlug4k": null,
+ "ratingKey": "2012",
+ "ratingKey4k": null,
+ "seasons": [
+ {
+ "id": 166,
+ "seasonNumber": 1,
+ "status": 3,
+ "status4k": 1,
+ "createdAt": "2022-08-01T08:55:00.000Z",
+ "updatedAt": "2022-08-02T02:30:09.000Z"
+ },
+ {
+ "id": 167,
+ "seasonNumber": 2,
+ "status": 3,
+ "status4k": 1,
+ "createdAt": "2022-08-01T08:55:00.000Z",
+ "updatedAt": "2022-08-02T02:30:09.000Z"
+ },
+ {
+ "id": 168,
+ "seasonNumber": 3,
+ "status": 3,
+ "status4k": 1,
+ "createdAt": "2022-08-01T08:55:00.000Z",
+ "updatedAt": "2022-08-02T02:30:09.000Z"
+ },
+ {
+ "id": 169,
+ "seasonNumber": 4,
+ "status": 5,
+ "status4k": 1,
+ "createdAt": "2022-08-01T08:55:00.000Z",
+ "updatedAt": "2022-08-01T08:55:00.000Z"
+ }
+ ],
+ "plexUrl": "https://app.plex.tv/desktop#!/server/719240db84d0795f30baa1c7283588fea536bb21/details?key=%2Flibrary%2Fmetadata%2F2012",
+ "serviceUrl": "http://sonarr:8989/series/stranger-things"
+ }
+ },
+ {
+ "id": 74851,
+ "firstAirDate": "2017-10-27",
+ "genreIds": [
+ 10767
+ ],
+ "mediaType": "tv",
+ "name": "Beyond Stranger Things",
+ "originCountry": [
+ "US"
+ ],
+ "originalLanguage": "en",
+ "originalName": "Beyond Stranger Things",
+ "overview": "Les secrets de l'univers de \"Stranger Things 2\" sont révélés tandis que comédiens et artistes invités évoquent les derniers épisodes avec Jim Rash. Attention, spoilers !",
+ "popularity": 72.277,
+ "voteAverage": 7.5,
+ "voteCount": 74,
+ "backdropPath": "/qevaCqIekzc7Bp5f2kGAi92kO39.jpg",
+ "posterPath": "/rHCFO8RJ3Hg6a8KjWAsvAsa38hp.jpg"
+ },
+ {
+ "id": 182026,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 18
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Stranger Things",
+ "overview": "",
+ "popularity": 76.465,
+ "releaseDate": "2013-04-05",
+ "title": "Stranger Things",
+ "video": false,
+ "voteAverage": 8.6,
+ "voteCount": 51,
+ "backdropPath": null,
+ "posterPath": "/4TKdguyacjYrC1Hnbi3PjSP8r3M.jpg"
+ },
+ {
+ "id": 1865,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 12,
+ 28,
+ 14
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Pirates of the Caribbean: On Stranger Tides",
+ "overview": "Dans cette histoire pleine d’action, où vérité, trahison, jeunesse éternelle et mort forment un cocktail explosif, le capitaine Jack Sparrow retrouve une femme qu’il a connu autrefois. Leurs liens sont‐ils faits d’amour ou, cette femme n’est‐elle qu’une aventurière sans scrupules qui cherche à l’utiliser pour découvrir la légendaire Fontaine de Jouvence ? Lorsqu’elle l’oblige à embarquer à bord du Queen Anne’s Revenge, le bateau du terrible pirate Barbe‐Noire, Jack ne sait plus ce qu’il doit craindre le plus : Le redoutable maître du bateau ou cette femme surgit de son passé…",
+ "popularity": 251.27,
+ "releaseDate": "2011-05-14",
+ "title": "Pirates des Caraïbes : La Fontaine de jouvence",
+ "video": false,
+ "voteAverage": 6.5,
+ "voteCount": 12180,
+ "backdropPath": "/uzIGtyS6bbnJzGsPL93WCF1FWm8.jpg",
+ "posterPath": "/5JjjjGg24IGRXIQtaZkPU59acjV.jpg"
+ },
+ {
+ "id": 96608,
+ "firstAirDate": "2020-01-30",
+ "genreIds": [
+ 9648,
+ 80
+ ],
+ "mediaType": "tv",
+ "name": "Intimidation",
+ "originCountry": [
+ "GB"
+ ],
+ "originalLanguage": "en",
+ "originalName": "The Stranger",
+ "overview": "Adam Price mène une vie idyllique : il a un bon travail, deux fils merveilleux et son mariage semble sans faille. Mais son bonheur va soudainement voler en éclats lorsque « The Stranger » dévoile un secret choquant au sujet de sa femme.",
+ "popularity": 15.11,
+ "voteAverage": 7.4,
+ "voteCount": 283,
+ "backdropPath": "/97pA0UjBqqgcZFbREQL3U1BQDgX.jpg",
+ "posterPath": "/y9mX3A3O4SxffDIAlK8Li8AL8BD.jpg"
+ },
+ {
+ "id": 7183,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 53
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Perfect Stranger",
+ "overview": "Rowena est une journaliste d'investigation. Lorsqu'elle découvre que Harrison Hill, le très puissant publicitaire, est peut-être lié au meurtre de son amie, elle décide de mener son enquête. Pour se faire et l'approcher, elle va endosser deux identités, celle de Katherine, une intérimaire employée de sa société et Veronica, une jeune femme avec laquelle Hill flirte sur internet.",
+ "popularity": 20.863,
+ "releaseDate": "2007-04-11",
+ "title": "Dangereuse séduction",
+ "video": false,
+ "voteAverage": 5.8,
+ "voteCount": 756,
+ "backdropPath": "/sG7flxRI3ujV5t2scYpbmREVQbv.jpg",
+ "posterPath": "/jpQoXiLjTN8uqU9Ym9TMaz2D9aS.jpg"
+ },
+ {
+ "id": 99282,
+ "firstAirDate": "2020-04-13",
+ "genreIds": [
+ 18,
+ 9648,
+ 80
+ ],
+ "mediaType": "tv",
+ "name": "The Stranger",
+ "originCountry": [
+ "US"
+ ],
+ "originalLanguage": "en",
+ "originalName": "The Stranger",
+ "overview": "Un jeune conducteur sans scrupule prend un mystérieux passager d'Hollywood Hills. Sur 12 heures, les deux hommes naviguent dans les bas-fonds sordides de Los Angeles...",
+ "popularity": 7.158,
+ "voteAverage": 7.5,
+ "voteCount": 25,
+ "backdropPath": "/g8n6jB5Mkn6FUGQ5MbqEMIHrZba.jpg",
+ "posterPath": "/4KrCPwB6yNBR8Chg5quigrrUFCD.jpg"
+ },
+ {
+ "id": 10053,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 27,
+ 9648
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "When a Stranger Calls",
+ "overview": "Alors qu'elle garde des enfants, une étudiante est terrorisée par un homme qui la harcèle au téléphone en lui demandant si elle a bien vérifié que tout était normal avec les petits dont elle a la charge. Les policiers qu'elle a appelés finissent par localiser les appels et l'informent que ceux-ci proviennent de la maison où elle se trouve...",
+ "popularity": 18.475,
+ "releaseDate": "2006-02-03",
+ "title": "Terreur sur la Ligne",
+ "video": false,
+ "voteAverage": 5.7,
+ "voteCount": 873,
+ "backdropPath": "/lF3ojoSmCZgrh9nyy2lOxoWL7KD.jpg",
+ "posterPath": "/xva4IuEfaT6c8tZLpNK2LKCtNGf.jpg"
+ },
+ {
+ "id": 291151,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 53,
+ 27,
+ 9648
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "The Stranger",
+ "overview": "Un homme mystérieux à la recherche de sa femme arrive dans une petite ville du Canada, sa présence va quelque peu bouleverser l'apparente tranquillité qui y règne.",
+ "popularity": 7.932,
+ "releaseDate": "2014-06-12",
+ "title": "The Stranger",
+ "video": false,
+ "voteAverage": 4.7,
+ "voteCount": 77,
+ "backdropPath": "/plTx6iHNbLxNXKL4swZxl4RVT2w.jpg",
+ "posterPath": "/8YjSy1vG4yuuatgdAU1NbitA52F.jpg"
+ },
+ {
+ "id": 1262,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 35,
+ 18,
+ 14,
+ 10749
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Stranger Than Fiction",
+ "overview": "Un beau matin, Harold Crick, un obscur fonctionnaire du fisc, entend soudain une voix de femme qui se met à commenter tout ce qu'il vit, y compris ses pensées les plus intimes. Pour Harold, c'est un cauchemar qui dérègle sa vie parfaitement agencée, mais cela devient encore plus grave lorsque la voix annonce qu'il va bientôt mourir...Harold découvre que cette voix est celle d'une romancière, Karen Eiffel, qui s'efforce désespérément d'écrire la fin de ce qui pourrait être son meilleur livre. Il ne lui reste plus qu'à trouver comment tuer son personnage principal : Harold ! Elle ignore que celui-ci existe, qu'il entend ses mots et connaît le sort qu'elle lui réserve...Pour s'en sortir vivant, Harold doit changer son destin. Sa seule chance est de devenir un personnage de comédie, puisque ceux-ci ne sont jamais tués...",
+ "popularity": 12.475,
+ "releaseDate": "2006-09-09",
+ "title": "L'Incroyable Destin de Harold Crick",
+ "video": false,
+ "voteAverage": 7.3,
+ "voteCount": 1875,
+ "backdropPath": "/d9eONXYtCmQnPWw61w9pNMGlSzK.jpg",
+ "posterPath": "/hZpCDBXmKqDBBonBKGAcZ95Qmvi.jpg"
+ },
+ {
+ "id": 87692,
+ "firstAirDate": "2019-04-06",
+ "genreIds": [
+ 16,
+ 35,
+ 10765
+ ],
+ "mediaType": "tv",
+ "name": "Chou Kadou Girl",
+ "originCountry": [
+ "JP"
+ ],
+ "originalLanguage": "ja",
+ "originalName": "超可動ガール⅙ AMAZING STRANGER",
+ "overview": "Haruto est un otaku qui ne s'intéresse pas aux (vraies) filles en 3D ! Un jour, sa dernière acquisition, une figurine de son héroïne préférée Nona, se met à bouger toute seule. Ainsi commence la drôle de vie conjugale entre un otaku et un robot...",
+ "popularity": 11.422,
+ "voteAverage": 6.4,
+ "voteCount": 5,
+ "backdropPath": "/yl4Ltag61cTv0XtwbwMpvzxt7ov.jpg",
+ "posterPath": "/pPxakEs1TP6JhclPceGxHBoE8Ey.jpg"
+ },
+ {
+ "id": 455108,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 9648,
+ 18,
+ 27,
+ 36
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "The Little Stranger",
+ "overview": "Fils d’une modeste domestique, le docteur Faraday s’est construit une existence tranquille et respectable en devenant médecin de campagne. En 1947, lors d’un été particulièrement long et chaud, il est appelé au chevet d’une patiente à Hundreds Hall, où sa mère fut employée autrefois. Le domaine, qui appartient depuis plus de deux siècles à la famille Ayres, est aujourd’hui en piteux état, et ses habitants – la mère, son fils et sa fille – sont hantés par quelque chose de bien plus effrayant encore que le déclin de leurs finances. Faraday ne s’imagine pas à quel point le destin de cette famille et le sien sont liés, ni ce que cela a de terrifiant…",
+ "popularity": 12.538,
+ "releaseDate": "2018-08-30",
+ "title": "The Little Stranger",
+ "video": false,
+ "voteAverage": 5.7,
+ "voteCount": 216,
+ "backdropPath": "/eyrUZ6jvg1Qy3jUz5YH8U4UkFLP.jpg",
+ "posterPath": "/qm1KJU9coK2voDIFD6AUvSgVG56.jpg"
+ },
+ {
+ "id": 38166,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 28,
+ 18,
+ 53,
+ 9648
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "The Stranger",
+ "overview": "Un agent du F.B.I poursuit le témoin matériel d'une enquête classée secret défense.",
+ "popularity": 6.555,
+ "releaseDate": "2010-06-01",
+ "title": "The Stranger",
+ "video": false,
+ "voteAverage": 4.9,
+ "voteCount": 57,
+ "backdropPath": "/kjFC8S6y9wKiRXRpOPwQQu6e9cJ.jpg",
+ "posterPath": "/fXg4MXYruDKrssFmfzKlf2TINJb.jpg"
+ },
+ {
+ "id": 20246,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 80,
+ 18,
+ 9648,
+ 53
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "The Stranger",
+ "overview": "L'inspecteur Wilson, de la commission contre les crimes de guerre, décide de relâcher un ancien chef de camp d'extermination nazi, dans l'espoir qu'il le conduira jusqu'à son supérieur, Franz Kindler. L'Allemand, qui circule sous un nom d'emprunt, se rend dans la petite ville de Harper. L'inspecteur le suit. Se sachant surveillé, l'ex-détenu attire le policier dans le gymnase de l'école. Là, il l'assomme et se précipite dans la maison voisine, qui n'est autre que celle de Franz Kindler, aujourd'hui professeur dans ce collège, pour le prévenir de l'arrivée de la police…",
+ "popularity": 7.449,
+ "releaseDate": "1946-07-02",
+ "title": "Le Criminel",
+ "video": false,
+ "voteAverage": 7.3,
+ "voteCount": 449,
+ "backdropPath": "/eewSm2QKPMueCM3ix5r3aE5eIur.jpg",
+ "posterPath": "/ee3F8CvNMSJZvYiwW2DKSvU9rQj.jpg"
+ },
+ {
+ "id": 469,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 35,
+ 18
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Stranger Than Paradise",
+ "overview": "Eva, 16 ans, quitte la Hongrie et retrouve son cousin Willie, installé depuis 10 ans aux États-Unis. Inadaptés à cette terre de désillusions, ils partent de Miami découvrir le paradis de la Floride, royaume du jeu et dernier espoir d'un exil douloureux.",
+ "popularity": 9.713,
+ "releaseDate": "1984-10-01",
+ "title": "Stranger Than Paradise",
+ "video": false,
+ "voteAverage": 7.2,
+ "voteCount": 394,
+ "backdropPath": "/tAEV7htL9Yi0hMHtxlv2VAm9Rbe.jpg",
+ "posterPath": "/fxlMexOi2D64ugS07Sv2hJZYM3R.jpg"
+ },
+ {
+ "id": 45964,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 27,
+ 53,
+ 18,
+ 80,
+ 9648
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "When a Stranger Calls",
+ "overview": "Au cours d’une nuit où elle garde les enfants d’un couple marié, une baby-sitter se fait harceler au téléphone par un inconnu qui lui pose systématiquement la même question : « êtes-vous allée voir les enfants ? ». De plus en plus inquiète à mesure que les appels se succèdent, la jeune femme décide de contacter la police.",
+ "popularity": 9.731,
+ "releaseDate": "1979-10-26",
+ "title": "Terreur sur la ligne",
+ "video": false,
+ "voteAverage": 6.2,
+ "voteCount": 178,
+ "backdropPath": "/3dK12SaczU7Tf8btq7K2F5HQg6F.jpg",
+ "posterPath": "/x4d8XUXbWLjiro51iQ2qiFhT6t4.jpg"
+ },
+ {
+ "id": 105024,
+ "firstAirDate": "2020-06-24",
+ "genreIds": [
+ 35,
+ 18
+ ],
+ "mediaType": "tv",
+ "name": "Hello, Stranger",
+ "originCountry": [
+ "PH"
+ ],
+ "originalLanguage": "tl",
+ "originalName": "Hello, Stranger",
+ "overview": "",
+ "popularity": 3.554,
+ "voteAverage": 7.3,
+ "voteCount": 3,
+ "backdropPath": "/8uXYX9F92gc0RlVlTEYVrze83fo.jpg",
+ "posterPath": "/uu8yWT64FP0W39whxIcs2aMv1Wb.jpg"
+ },
+ {
+ "id": 618352,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 16,
+ 28,
+ 27,
+ 14
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "DC Showcase: The Phantom Stranger",
+ "overview": "L'histoire se situe dans les années 1970, quand une jeune femme du nom de Jess et ses amis se rendent à une soirée dans un vieux manoir qui appartient à un certain Seth, les choses tournent au vinaigre, le Phantom Stranger arrivera pour leur porter secours.",
+ "popularity": 8.072,
+ "releaseDate": "2020-02-25",
+ "title": "DC Showcase: The Phantom Stranger",
+ "video": false,
+ "voteAverage": 7.5,
+ "voteCount": 49,
+ "backdropPath": "/vQkGZ0u9E8PgBbjg8vo61KHxQDc.jpg",
+ "posterPath": "/tqcL1YEiGUKsW1Ofka59m4MIKr1.jpg"
+ },
+ {
+ "id": 413852,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 18,
+ 9648,
+ 53,
+ 878
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "Welcome the Stranger",
+ "overview": "Alice arrive inopinément chez son frère, Ethan, en espérant se réconcilier avec lui. D'étranges visions et le retour de la petite amie d'Ethan perturbent son projet...",
+ "popularity": 5.994,
+ "releaseDate": "2018-03-20",
+ "title": "Welcome the Stranger",
+ "video": false,
+ "voteAverage": 5,
+ "voteCount": 33,
+ "backdropPath": "/51aiE8fEXchmbLIyX7Smm3zJavV.jpg",
+ "posterPath": "/fZch4FhfexA18gUUQjHXKnLmkjh.jpg"
+ },
+ {
+ "id": 41670,
+ "mediaType": "movie",
+ "adult": false,
+ "genreIds": [
+ 18,
+ 10749,
+ 80
+ ],
+ "originalLanguage": "en",
+ "originalTitle": "A Stranger Among Us",
+ "overview": "Chargée d'enquêter sur un meurtre au sein de la communauté hassidique de la ville de New-York, la détective Emily Eden parvient à se faire accepter au sein de cette secte si hermétique.",
+ "popularity": 7.016,
+ "releaseDate": "1992-07-17",
+ "title": "Une étrangère parmi nous",
+ "video": false,
+ "voteAverage": 5.7,
+ "voteCount": 71,
+ "backdropPath": "/hL0hkMFGWgOvC0P4le6gzRzwa62.jpg",
+ "posterPath": "/rvk00cSV6cGWQQIppEPYLnDebQ1.jpg"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/modules/common/examples/tvshow.json b/src/modules/common/examples/tvshow.json
new file mode 100644
index 000000000..306b08e33
--- /dev/null
+++ b/src/modules/common/examples/tvshow.json
@@ -0,0 +1,110 @@
+{
+ "seriesId": 37,
+ "episodeFileId": 7387,
+ "seasonNumber": 1,
+ "episodeNumber": 4,
+ "title": "Part IV",
+ "airDate": "2022-06-08",
+ "airDateUtc": "2022-06-08T07:00:00Z",
+ "overview": "Obi-Wan Kenobi plots a daring mission into enemy territory.",
+ "episodeFile": {
+ "seriesId": 37,
+ "seasonNumber": 1,
+ "relativePath": "Season 1/Obi-Wan.Kenobi.S01E04.1080p.WEB.h264-KOGi[rartv].mkv",
+ "path": "/tv/Obi-Wan Kenobi/Season 1/Obi-Wan.Kenobi.S01E04.1080p.WEB.h264-KOGi[rartv].mkv",
+ "size": 1893191174,
+ "dateAdded": "2022-06-08T07:32:27.158296Z",
+ "sceneName": "Obi-Wan.Kenobi.S01E04.1080p.WEB.h264-KOGi[rartv]",
+ "quality": {
+ "quality": {
+ "id": 3,
+ "name": "WEBDL-1080p",
+ "source": "web",
+ "resolution": 1080
+ },
+ "revision": {
+ "version": 1,
+ "real": 0,
+ "isRepack": false
+ }
+ },
+ "language": {
+ "id": 1,
+ "name": "English"
+ },
+ "mediaInfo": {
+ "audioChannels": 5.1,
+ "audioCodec": "EAC3 Atmos",
+ "videoCodec": "h264"
+ },
+ "originalFilePath": "Obi-Wan.Kenobi.S01E04.1080p.WEB.h264-KOGi[rarbg]/Obi-Wan.Kenobi.S01E04.1080p.WEB.h264-KOGi.mkv",
+ "qualityCutoffNotMet": false,
+ "id": 7387
+ },
+ "hasFile": true,
+ "monitored": true,
+ "unverifiedSceneNumbering": false,
+ "series": {
+ "title": "Obi-Wan Kenobi",
+ "sortTitle": "obiwan kenobi",
+ "seasonCount": 1,
+ "status": "ended",
+ "overview": "During the reign of the Empire, Obi-Wan Kenobi embarks on a crucial mission.",
+ "network": "Disney+",
+ "airTime": "03:00",
+ "images": [
+ {
+ "coverType": "banner",
+ "url": "https://artworks.thetvdb.com/banners/v4/series/393199/banners/6290d38b8c283.jpg"
+ },
+ {
+ "coverType": "poster",
+ "url": "https://artworks.thetvdb.com/banners/v4/series/393199/posters/629668351aca3.jpg"
+ },
+ {
+ "coverType": "fanart",
+ "url": "https://artworks.thetvdb.com/banners/v4/series/393199/backgrounds/62912a0fe623d.jpg"
+ }
+ ],
+ "seasons": [
+ {
+ "seasonNumber": 1,
+ "monitored": true
+ }
+ ],
+ "year": 2022,
+ "path": "/tv/Obi-Wan Kenobi",
+ "profileId": 1,
+ "languageProfileId": 1,
+ "seasonFolder": true,
+ "monitored": true,
+ "useSceneNumbering": false,
+ "runtime": 39,
+ "tvdbId": 393199,
+ "tvRageId": 0,
+ "tvMazeId": 52260,
+ "firstAired": "2022-05-27T00:00:00Z",
+ "lastInfoSync": "2022-07-22T03:36:34.392414Z",
+ "seriesType": "standard",
+ "cleanTitle": "obiwankenobi",
+ "imdbId": "tt8466564",
+ "titleSlug": "obi-wan-kenobi",
+ "certification": "TV-14",
+ "genres": [
+ "Action",
+ "Adventure",
+ "Fantasy",
+ "Mini-Series",
+ "Science Fiction"
+ ],
+ "tags": [],
+ "added": "2022-05-03T20:22:10.47688Z",
+ "ratings": {
+ "votes": 0,
+ "value": 0
+ },
+ "qualityProfileId": 1,
+ "id": 37
+ },
+ "id": 1407
+}
\ No newline at end of file
diff --git a/src/components/modules/common/index.ts b/src/modules/common/index.ts
similarity index 100%
rename from src/components/modules/common/index.ts
rename to src/modules/common/index.ts
diff --git a/src/components/modules/dash./DashdotModule.tsx b/src/modules/dashdot/DashdotModule.tsx
similarity index 84%
rename from src/components/modules/dash./DashdotModule.tsx
rename to src/modules/dashdot/DashdotModule.tsx
index 8afb5ec62..993074868 100644
--- a/src/components/modules/dash./DashdotModule.tsx
+++ b/src/modules/dashdot/DashdotModule.tsx
@@ -2,9 +2,9 @@ import { createStyles, useMantineColorScheme, useMantineTheme } from '@mantine/c
import { IconCalendar as CalendarIcon } from '@tabler/icons';
import axios from 'axios';
import { useEffect, useState } from 'react';
-import { useConfig } from '../../../tools/state';
-import { serviceItem } from '../../../tools/types';
-import { IModule } from '../modules';
+import { useConfig } from '../../tools/state';
+import { serviceItem } from '../../tools/types';
+import { IModule } from '../ModuleTypes';
const asModule = (t: T) => t;
export const DashdotModule = asModule({
@@ -30,6 +30,10 @@ export const DashdotModule = asModule({
value: ['CPU', 'RAM', 'Storage', 'Network'],
options: ['CPU', 'RAM', 'Storage', 'Network', 'GPU'],
},
+ url: {
+ name: 'Dash. URL',
+ value: '',
+ },
},
});
@@ -88,12 +92,12 @@ const bytePrettyPrint = (byte: number): string =>
? `${(byte / 1024).toFixed(1)} KiB`
: `${byte.toFixed(1)} B`;
-const useJson = (service: serviceItem | undefined, url: string) => {
+const useJson = (targetUrl: string, url: string) => {
const [data, setData] = useState();
const doRequest = async () => {
try {
- const resp = await axios.get(url, { baseURL: service?.url });
+ const resp = await axios.get(`/api/modules/dashdot?url=${url}&base=${targetUrl}`);
setData(resp.data);
// eslint-disable-next-line no-empty
@@ -101,10 +105,10 @@ const useJson = (service: serviceItem | undefined, url: string) => {
};
useEffect(() => {
- if (service?.url) {
+ if (targetUrl) {
doRequest();
}
- }, [service?.url]);
+ }, [targetUrl]);
return data;
};
@@ -118,8 +122,10 @@ export function DashdotComponent() {
const dashConfig = config.modules?.[DashdotModule.title]
.options as typeof DashdotModule['options'];
const isCompact = dashConfig?.useCompactView?.value ?? false;
- const dashdotService = config.services.filter((service) => service.type === 'Dash.')[0];
-
+ const dashdotService: serviceItem | undefined = config.services.filter(
+ (service) => service.type === 'Dash.'
+ )[0];
+ const dashdotUrl = dashdotService?.url ?? dashConfig?.url?.value ?? '';
const enabledGraphs = dashConfig?.graphs?.value ?? ['CPU', 'RAM', 'Storage', 'Network'];
const cpuEnabled = enabledGraphs.includes('CPU');
const storageEnabled = enabledGraphs.includes('Storage');
@@ -127,8 +133,8 @@ export function DashdotComponent() {
const networkEnabled = enabledGraphs.includes('Network');
const gpuEnabled = enabledGraphs.includes('GPU');
- const info = useJson(dashdotService, '/info');
- const storageLoad = useJson(dashdotService, '/load/storage');
+ const info = useJson(dashdotUrl, '/info');
+ const storageLoad = useJson(dashdotUrl, '/load/storage');
const totalUsed =
(storageLoad?.layout as any[])?.reduce((acc, curr) => (curr.load ?? 0) + acc, 0) ?? 0;
@@ -166,13 +172,23 @@ export function DashdotComponent() {
},
].filter((g) => g.enabled);
+ if (dashdotUrl === '') {
+ return (
+
+
Dash.
+
+ No dash. service found. Please add one to your Homarr dashboard or set a dashdot URL in
+ the module options
+
+
+ );
+ }
+
return (
Dash.
- {!dashdotService ? (
-
No dash. service found. Please add one to your Homarr dashboard.
- ) : !info ? (
+ {!info ? (
Cannot acquire information from dash. - are you running the latest version?
) : (
@@ -209,9 +225,7 @@ export function DashdotComponent() {
}
key={graph.name}
title={graph.name}
- src={`${
- dashdotService.url
- }?singleGraphMode=true&graph=${graph.name.toLowerCase()}&theme=${colorScheme}&surface=${(colorScheme ===
+ src={`${dashdotUrl}?singleGraphMode=true&graph=${graph.name.toLowerCase()}&theme=${colorScheme}&surface=${(colorScheme ===
'dark'
? theme.colors.dark[7]
: theme.colors.gray[0]
@@ -223,7 +237,6 @@ export function DashdotComponent() {
: ''
}`}
frameBorder="0"
- allowTransparency
/>
))}
diff --git a/src/components/modules/dash./index.ts b/src/modules/dashdot/index.ts
similarity index 100%
rename from src/components/modules/dash./index.ts
rename to src/modules/dashdot/index.ts
diff --git a/src/components/modules/date/DateModule.tsx b/src/modules/date/DateModule.tsx
similarity index 78%
rename from src/components/modules/date/DateModule.tsx
rename to src/modules/date/DateModule.tsx
index 3e212af83..72a83fba8 100644
--- a/src/components/modules/date/DateModule.tsx
+++ b/src/modules/date/DateModule.tsx
@@ -2,9 +2,9 @@ import { Group, Text, Title } from '@mantine/core';
import dayjs from 'dayjs';
import { useEffect, useState } from 'react';
import { IconClock as Clock } from '@tabler/icons';
-import { useConfig } from '../../../tools/state';
-import { IModule } from '../modules';
-import { useSetSafeInterval } from '../../../tools/hooks/useSetSafeInterval';
+import { useConfig } from '../../tools/state';
+import { IModule } from '../ModuleTypes';
+import { useSetSafeInterval } from '../../tools/hooks/useSetSafeInterval';
export const DateModule: IModule = {
title: 'Date',
@@ -34,9 +34,9 @@ export default function DateComponent(props: any) {
}, []);
return (
-
+
{dayjs(date).format(formatString)}
- {dayjs(date).format('dddd, MMMM D')}
+ {dayjs(date).format('dddd, MMMM D')}
);
}
diff --git a/src/components/modules/date/index.ts b/src/modules/date/index.ts
similarity index 100%
rename from src/components/modules/date/index.ts
rename to src/modules/date/index.ts
diff --git a/src/components/modules/docker/ContainerActionBar.tsx b/src/modules/docker/ContainerActionBar.tsx
similarity index 94%
rename from src/components/modules/docker/ContainerActionBar.tsx
rename to src/modules/docker/ContainerActionBar.tsx
index 39461472d..0ae7e2ed1 100644
--- a/src/components/modules/docker/ContainerActionBar.tsx
+++ b/src/modules/docker/ContainerActionBar.tsx
@@ -1,5 +1,4 @@
import { Button, Group, Modal, Title } from '@mantine/core';
-import { useBooleanToggle } from '@mantine/hooks';
import { showNotification, updateNotification } from '@mantine/notifications';
import {
IconCheck,
@@ -12,8 +11,9 @@ import {
} from '@tabler/icons';
import axios from 'axios';
import Dockerode from 'dockerode';
-import { tryMatchService } from '../../../tools/addToHomarr';
-import { AddAppShelfItemForm } from '../../AppShelf/AddAppShelfItem';
+import { tryMatchService } from '../../tools/addToHomarr';
+import { AddAppShelfItemForm } from '../../components/AppShelf/AddAppShelfItem';
+import { useState } from 'react';
function sendDockerCommand(
action: string,
@@ -60,7 +60,7 @@ export interface ContainerActionBarProps {
}
export default function ContainerActionBar({ selected, reload }: ContainerActionBarProps) {
- const [opened, setOpened] = useBooleanToggle(false);
+ const [opened, setOpened] = useState(false);
return (
([]);
const [selection, setSelection] = useState([]);
- const [visible, setVisible] = useState(false);
const { config } = useConfig();
+ const moduleEnabled = config.modules?.[DockerModule.title]?.enabled ?? false;
useEffect(() => {
reload();
- }, []);
+ }, [config.modules]);
function reload() {
- setVisible(true);
+ if (!moduleEnabled) {
+ return;
+ }
setTimeout(() => {
axios
.get('/api/docker/containers')
.then((res) => {
setContainers(res.data);
setSelection([]);
- setVisible(false);
})
.catch(() =>
// Send an Error notification
@@ -57,14 +58,16 @@ export default function DockerMenuButton(props: any) {
if (containers.length < 1) return null;
return (
<>
- setOpened(false)} padding="xl" size="full">
-
-
-
-
-
+ setOpened(false)}
+ padding="xl"
+ size="full"
+ title={ }
+ >
+
-
+
-
+
>
);
}
diff --git a/src/components/modules/docker/DockerTable.tsx b/src/modules/docker/DockerTable.tsx
similarity index 98%
rename from src/components/modules/docker/DockerTable.tsx
rename to src/modules/docker/DockerTable.tsx
index c8cf76f22..1a6915089 100644
--- a/src/components/modules/docker/DockerTable.tsx
+++ b/src/modules/docker/DockerTable.tsx
@@ -101,7 +101,6 @@ export default function DockerTable({
onChange={handleSearchChange}
/>
- your docker containers
diff --git a/src/components/modules/docker/index.ts b/src/modules/docker/index.ts
similarity index 100%
rename from src/components/modules/docker/index.ts
rename to src/modules/docker/index.ts
diff --git a/src/components/modules/downloads/DownloadsModule.tsx b/src/modules/downloads/DownloadsModule.tsx
similarity index 86%
rename from src/components/modules/downloads/DownloadsModule.tsx
rename to src/modules/downloads/DownloadsModule.tsx
index 83137dd00..d81de9123 100644
--- a/src/components/modules/downloads/DownloadsModule.tsx
+++ b/src/modules/downloads/DownloadsModule.tsx
@@ -8,7 +8,6 @@ import {
Skeleton,
ScrollArea,
Center,
- Image,
} from '@mantine/core';
import { IconDownload as Download } from '@tabler/icons';
import { useEffect, useState } from 'react';
@@ -16,11 +15,11 @@ import axios from 'axios';
import { NormalizedTorrent } from '@ctrl/shared-torrent';
import { useViewportSize } from '@mantine/hooks';
import { showNotification } from '@mantine/notifications';
-import { IModule } from '../modules';
-import { useConfig } from '../../../tools/state';
-import { AddItemShelfButton } from '../../AppShelf/AddAppShelfItem';
-import { useSetSafeInterval } from '../../../tools/hooks/useSetSafeInterval';
-import { humanFileSize } from '../../../tools/humanFileSize';
+import { IModule } from '../ModuleTypes';
+import { useConfig } from '../../tools/state';
+import { AddItemShelfButton } from '../../components/AppShelf/AddAppShelfItem';
+import { useSetSafeInterval } from '../../tools/hooks/useSetSafeInterval';
+import { humanFileSize } from '../../tools/humanFileSize';
export const DownloadsModule: IModule = {
title: 'Torrent',
@@ -82,10 +81,10 @@ export default function DownloadComponent() {
if (downloadServices.length === 0) {
return (
-
+
No supported download clients found!
- Add a download service to view your current downloads...
+ Add a download service to view your current downloads
@@ -187,23 +186,18 @@ export default function DownloadComponent() {
);
});
- const easteregg = (
-
-
-
- );
return (
-
-
- {rows.length > 0 ? (
-
- ) : (
- easteregg
- )}
-
-
+
+ {rows.length > 0 ? (
+
+ ) : (
+
+ No torrents found
+
+ )}
+
);
}
diff --git a/src/components/modules/downloads/TotalDownloadsModule.tsx b/src/modules/downloads/TotalDownloadsModule.tsx
similarity index 88%
rename from src/components/modules/downloads/TotalDownloadsModule.tsx
rename to src/modules/downloads/TotalDownloadsModule.tsx
index ab25947dc..ccf7de7b3 100644
--- a/src/components/modules/downloads/TotalDownloadsModule.tsx
+++ b/src/modules/downloads/TotalDownloadsModule.tsx
@@ -1,4 +1,4 @@
-import { Text, Title, Group, useMantineTheme, Box, Card, ColorSwatch } from '@mantine/core';
+import { Text, Title, Group, useMantineTheme, Box, Card, ColorSwatch, Stack } from '@mantine/core';
import { IconDownload as Download } from '@tabler/icons';
import { useEffect, useState } from 'react';
import axios from 'axios';
@@ -7,11 +7,11 @@ import { linearGradientDef } from '@nivo/core';
import { Datum, ResponsiveLine } from '@nivo/line';
import { useListState } from '@mantine/hooks';
import { showNotification } from '@mantine/notifications';
-import { AddItemShelfButton } from '../../AppShelf/AddAppShelfItem';
-import { useConfig } from '../../../tools/state';
-import { humanFileSize } from '../../../tools/humanFileSize';
-import { IModule } from '../modules';
-import { useSetSafeInterval } from '../../../tools/hooks/useSetSafeInterval';
+import { AddItemShelfButton } from '../../components/AppShelf/AddAppShelfItem';
+import { useConfig } from '../../tools/state';
+import { humanFileSize } from '../../tools/humanFileSize';
+import { IModule } from '../ModuleTypes';
+import { useSetSafeInterval } from '../../tools/hooks/useSetSafeInterval';
export const TotalDownloadsModule: IModule = {
title: 'Download Speed',
@@ -43,6 +43,7 @@ export default function TotalDownloadsComponent() {
const totalDownloadSpeed = torrents.reduce((acc, torrent) => acc + torrent.downloadSpeed, 0);
const totalUploadSpeed = torrents.reduce((acc, torrent) => acc + torrent.uploadSpeed, 0);
useEffect(() => {
+ if (downloadServices.length === 0) return;
const interval = setSafeInterval(() => {
// Send one request with each download service inside
axios
@@ -78,12 +79,16 @@ export default function TotalDownloadsComponent() {
if (downloadServices.length === 0) {
return (
-
+
No supported download clients found!
-
- Add a download service to view your current downloads...
-
-
+
+
+ Add a download service to view your current downloads
+
);
}
@@ -101,9 +106,9 @@ export default function TotalDownloadsComponent() {
})) as Datum[];
return (
-
+
Current download speed
-
+
Download: {humanFileSize(totalDownloadSpeed)}/s
@@ -112,7 +117,7 @@ export default function TotalDownloadsComponent() {
Upload: {humanFileSize(totalUploadSpeed)}/s
-
+
{roundedSeconds} seconds ago
-
+
Download: {humanFileSize(Download)}
@@ -142,7 +147,7 @@ export default function TotalDownloadsComponent() {
Upload: {humanFileSize(Upload)}
-
+
);
@@ -181,6 +186,6 @@ export default function TotalDownloadsComponent() {
]}
/>
-
+
);
}
diff --git a/src/components/modules/downloads/index.ts b/src/modules/downloads/index.ts
similarity index 100%
rename from src/components/modules/downloads/index.ts
rename to src/modules/downloads/index.ts
diff --git a/src/components/modules/index.ts b/src/modules/index.ts
similarity index 76%
rename from src/components/modules/index.ts
rename to src/modules/index.ts
index d0b89acad..88cb1ad02 100644
--- a/src/components/modules/index.ts
+++ b/src/modules/index.ts
@@ -1,8 +1,9 @@
export * from './calendar';
-export * from './dash.';
+export * from './dashdot';
export * from './date';
export * from './downloads';
export * from './ping';
export * from './search';
export * from './weather';
export * from './docker';
+export * from './overseerr';
diff --git a/src/components/modules/moduleWrapper.tsx b/src/modules/moduleWrapper.tsx
similarity index 78%
rename from src/components/modules/moduleWrapper.tsx
rename to src/modules/moduleWrapper.tsx
index 6bbd69c86..90e958f91 100644
--- a/src/components/modules/moduleWrapper.tsx
+++ b/src/modules/moduleWrapper.tsx
@@ -1,4 +1,5 @@
import {
+ ActionIcon,
Button,
Card,
Group,
@@ -8,8 +9,11 @@ import {
TextInput,
useMantineColorScheme,
} from '@mantine/core';
-import { useConfig } from '../../tools/state';
-import { IModule } from './modules';
+import { IconAdjustments } from '@tabler/icons';
+import { motion } from 'framer-motion';
+import { useState } from 'react';
+import { useConfig } from '../tools/state';
+import { IModule } from './ModuleTypes';
function getItems(module: IModule) {
const { config, setConfig } = useConfig();
@@ -78,7 +82,7 @@ function getItems(module: IModule) {
});
}}
>
-
+
- {
+ setHovering(true);
}}
- />
-
+ onHoverEnd={() => {
+ setHovering(false);
+ }}
+ >
+
+
+
);
}
export function ModuleMenu(props: any) {
- const { module, styles } = props;
+ const { module, styles, hovered } = props;
const items: JSX.Element[] = getItems(module);
return (
<>
{module.options && (
- Settings
- {items.map((item) => (
- {item}
- ))}
+
+
+
+
+
+
+
+
+ Settings
+ {items.map((item) => (
+ {item}
+ ))}
+
)}
>
diff --git a/src/modules/overseerr/Movie.d.ts b/src/modules/overseerr/Movie.d.ts
new file mode 100644
index 000000000..558bccbcc
--- /dev/null
+++ b/src/modules/overseerr/Movie.d.ts
@@ -0,0 +1,248 @@
+export interface MovieResult {
+ id: number;
+ adult: boolean;
+ budget: number;
+ genres: Genre[];
+ relatedVideos: RelatedVideo[];
+ originalLanguage: string;
+ originalTitle: string;
+ popularity: number;
+ productionCompanies: ProductionCompany[];
+ productionCountries: ProductionCountry[];
+ releaseDate: Date;
+ releases: Releases;
+ revenue: number;
+ spokenLanguages: SpokenLanguage[];
+ status: string;
+ title: string;
+ video: boolean;
+ voteAverage: number;
+ voteCount: number;
+ backdropPath: string;
+ homepage: string;
+ imdbId: string;
+ overview: string;
+ posterPath: string;
+ runtime: number;
+ tagline: string;
+ credits: Credits;
+ collection: Collection;
+ externalIds: ExternalIDS;
+ mediaInfo: Media;
+ watchProviders: WatchProvider[];
+}
+
+export interface Collection {
+ id: number;
+ name: string;
+ posterPath: string;
+ backdropPath: string;
+}
+
+export interface Credits {
+ cast: Cast[];
+ crew: Crew[];
+}
+
+export interface Cast {
+ castId: number;
+ character: string;
+ creditId: string;
+ id: number;
+ name: string;
+ order: number;
+ gender: number;
+ profilePath: null | string;
+}
+
+export interface Crew {
+ creditId: string;
+ department: Department;
+ id: number;
+ job: string;
+ name: string;
+ gender: number;
+ profilePath: null | string;
+}
+
+export enum Department {
+ Art = 'Art',
+ Camera = 'Camera',
+ CostumeMakeUp = 'Costume & Make-Up',
+ Crew = 'Crew',
+ Directing = 'Directing',
+ Editing = 'Editing',
+ Production = 'Production',
+ Sound = 'Sound',
+ VisualEffects = 'Visual Effects',
+ Writing = 'Writing',
+}
+
+export interface ExternalIDS {
+ facebookId: string;
+ imdbId: string;
+ instagramId: string;
+ twitterId: string;
+}
+
+export interface Genre {
+ id: number;
+ name: string;
+}
+
+export interface Request {
+ id: number;
+ status: number;
+ createdAt: Date;
+ updatedAt: Date;
+ type: string;
+ is4k: boolean;
+ serverId: number;
+ profileId: number;
+ rootFolder: string;
+ languageProfileId: null;
+ tags: any[];
+ media: Media;
+ requestedBy: EdBy;
+ modifiedBy: EdBy;
+ seasons: any[];
+ seasonCount: number;
+}
+
+export interface Media {
+ downloadStatus: any[];
+ downloadStatus4k: any[];
+ id: number;
+ mediaType: string;
+ tmdbId: number;
+ tvdbId: null;
+ imdbId: null;
+ status: number;
+ status4k: number;
+ createdAt: Date;
+ updatedAt: Date;
+ lastSeasonChange: Date;
+ mediaAddedAt: Date;
+ serviceId: number;
+ serviceId4k: null;
+ externalServiceId: number;
+ externalServiceId4k: null;
+ externalServiceSlug: string;
+ externalServiceSlug4k: null;
+ ratingKey: string;
+ ratingKey4k: null;
+ requests?: Request[];
+ issues?: any[];
+ seasons: any[];
+ plexUrl: string;
+ serviceUrl: string;
+}
+
+export interface EdBy {
+ permissions: number;
+ id: number;
+ email: string;
+ plexUsername: string;
+ username: string;
+ recoveryLinkExpirationDate: null;
+ userType: number;
+ avatar: string;
+ movieQuotaLimit: null;
+ movieQuotaDays: null;
+ tvQuotaLimit: null;
+ tvQuotaDays: null;
+ createdAt: Date;
+ updatedAt: Date;
+ settings: Settings;
+ requestCount: number;
+ displayName: string;
+}
+
+export interface Settings {
+ id: number;
+ locale: string;
+ region: string;
+ originalLanguage: null;
+ pgpKey: null;
+ discordId: string;
+ pushbulletAccessToken: null;
+ pushoverApplicationToken: null;
+ pushoverUserKey: null;
+ telegramChatId: null;
+ telegramSendSilently: null;
+ notificationTypes: NotificationTypes;
+}
+
+export interface NotificationTypes {
+ discord: number;
+ email: number;
+ webpush: number;
+}
+
+export interface ProductionCompany {
+ id: number;
+ name: string;
+ originCountry?: string;
+ logoPath: string;
+ displayPriority?: number;
+}
+
+export interface ProductionCountry {
+ iso_3166_1: string;
+ name: string;
+}
+
+export interface RelatedVideo {
+ site: string;
+ key: string;
+ name: string;
+ size: number;
+ type: string;
+ url: string;
+}
+
+export interface Releases {
+ results: Result[];
+}
+
+export interface Result {
+ iso_3166_1: string;
+ release_dates: ReleaseDate[];
+}
+
+export interface ReleaseDate {
+ certification: string;
+ iso_639_1: ISO639_1 | null;
+ note: Note;
+ release_date: Date;
+ type: number;
+}
+
+export enum ISO639_1 {
+ CS = 'cs',
+ Empty = '',
+}
+
+export enum Note {
+ Empty = '',
+ HBOMax = 'HBO Max',
+ LosAngelesCalifornia = 'Los Angeles, California',
+ Starz = 'STARZ',
+ The4KUHDBluRayDVD = '4K UHD, Blu-ray & DVD',
+ TheMoreFunStuffVersion = 'The More Fun Stuff Version',
+ Tvod = 'TVOD',
+ VOD = 'VOD',
+}
+
+export interface SpokenLanguage {
+ english_name: string;
+ iso_639_1: string;
+ name: string;
+}
+
+export interface WatchProvider {
+ iso_3166_1: string;
+ link: string;
+ buy: ProductionCompany[];
+ flatrate: ProductionCompany[];
+}
diff --git a/src/modules/overseerr/OverseerrModule.tsx b/src/modules/overseerr/OverseerrModule.tsx
new file mode 100644
index 000000000..1fe9a39c7
--- /dev/null
+++ b/src/modules/overseerr/OverseerrModule.tsx
@@ -0,0 +1,14 @@
+import { IconEyeglass } from '@tabler/icons';
+import { OverseerrMediaDisplay } from '../common';
+import { IModule } from '../ModuleTypes';
+
+export const OverseerrModule: IModule = {
+ title: 'Overseerr',
+ description: 'Allows you to search and add media from Overseerr/Jellyseerr',
+ icon: IconEyeglass,
+ component: OverseerrMediaDisplay,
+};
+
+export interface OverseerSearchProps {
+ query: string;
+}
diff --git a/src/modules/overseerr/RequestModal.tsx b/src/modules/overseerr/RequestModal.tsx
new file mode 100644
index 000000000..ee23e2678
--- /dev/null
+++ b/src/modules/overseerr/RequestModal.tsx
@@ -0,0 +1,240 @@
+import { Alert, Button, Checkbox, createStyles, Group, Modal, Stack, Table } from '@mantine/core';
+import { showNotification, updateNotification } from '@mantine/notifications';
+import { IconAlertCircle, IconCheck, IconDownload } from '@tabler/icons';
+import axios from 'axios';
+import Consola from 'consola';
+import { useState } from 'react';
+import { useColorTheme } from '../../tools/color';
+import { MovieResult } from './Movie.d';
+import { MediaType, Result } from './SearchResult.d';
+import { TvShowResult, TvShowResultSeason } from './TvShow.d';
+
+interface RequestModalProps {
+ base: Result;
+ opened: boolean;
+ setOpened: (opened: boolean) => void;
+}
+
+const useStyles = createStyles((theme) => ({
+ rowSelected: {
+ backgroundColor:
+ theme.colorScheme === 'dark'
+ ? theme.fn.rgba(theme.colors[theme.primaryColor][7], 0.2)
+ : theme.colors[theme.primaryColor][0],
+ },
+}));
+
+export function RequestModal({ base, opened, setOpened }: RequestModalProps) {
+ const [result, setResult] = useState();
+ const { secondaryColor } = useColorTheme();
+ function getResults(base: Result) {
+ axios.get(`/api/modules/overseerr/${base.id}?type=${base.mediaType}`).then((res) => {
+ setResult(res.data);
+ });
+ }
+ if (opened && !result) {
+ getResults(base);
+ }
+ if (!result || !opened) {
+ return null;
+ }
+ return base.mediaType === 'movie' ? (
+
+ ) : (
+
+ );
+}
+
+export function MovieRequestModal({
+ result,
+ opened,
+ setOpened,
+}: {
+ result: MovieResult;
+ opened: boolean;
+ setOpened: (opened: boolean) => void;
+}) {
+ const { secondaryColor } = useColorTheme();
+ return (
+ setOpened(false)}
+ radius="lg"
+ size="lg"
+ trapFocus
+ zIndex={150}
+ withinPortal
+ opened={opened}
+ title={
+
+
+ Ask for {result.title}
+
+ }
+ >
+
+ }
+ title="Using API key"
+ color={secondaryColor}
+ radius="md"
+ variant="filled"
+ >
+ This request will be automatically approved
+
+
+ setOpened(false)}>
+ Cancel
+
+ {
+ askForMedia(MediaType.Movie, result.id, result.title, []);
+ }}
+ >
+ Request
+
+
+
+
+ );
+}
+
+export function TvRequestModal({
+ result,
+ opened,
+ setOpened,
+}: {
+ result: TvShowResult;
+ opened: boolean;
+ setOpened: (opened: boolean) => void;
+}) {
+ const [selection, setSelection] = useState(result.seasons);
+ const { classes, cx } = useStyles();
+
+ const toggleRow = (container: TvShowResultSeason) =>
+ setSelection((current: TvShowResultSeason[]) =>
+ current.includes(container) ? current.filter((c) => c !== container) : [...current, container]
+ );
+ const toggleAll = () =>
+ setSelection((current: any) =>
+ current.length === result.seasons.length ? [] : result.seasons.map((c) => c)
+ );
+
+ const rows = result.seasons.map((element) => {
+ const selected = selection.includes(element);
+ return (
+
+
+ toggleRow(element)}
+ transitionDuration={0}
+ />
+
+ {element.name}
+ {element.episodeCount}
+
+ );
+ });
+ const { secondaryColor } = useColorTheme();
+
+ return (
+ setOpened(false)}
+ radius="lg"
+ size="lg"
+ opened={opened}
+ title={
+
+
+ Ask for {result.name ?? result.originalName ?? 'a TV show'}
+
+ }
+ >
+
+ }
+ title="Using API key"
+ color={secondaryColor}
+ radius="md"
+ variant="filled"
+ >
+ This request will be automatically approved
+
+
+ Tick the seasons that you want to be downloaded
+
+
+
+ 0 && selection.length !== result.seasons.length}
+ transitionDuration={0}
+ />
+
+ Season
+ Number of episodes
+
+
+ {rows}
+
+
+ setOpened(false)}>
+ Cancel
+
+ {
+ askForMedia(
+ MediaType.Tv,
+ result.id,
+ result.name,
+ selection.map((s) => s.seasonNumber)
+ );
+ }}
+ >
+ Request
+
+
+
+
+ );
+}
+
+function askForMedia(type: MediaType, id: number, name: string, seasons?: number[]) {
+ Consola.info(`Requesting ${type} ${id} ${name}`);
+ showNotification({
+ title: 'Request',
+ id: id.toString(),
+ message: `Requesting media ${name}`,
+ color: 'orange',
+ loading: true,
+ autoClose: false,
+ disallowClose: true,
+ icon: ,
+ });
+ axios
+ .post(`/api/modules/overseerr/${id}`, { type, seasons })
+ .then(() => {
+ updateNotification({
+ id: id.toString(),
+ title: '',
+ color: 'green',
+ message: ` ${name} requested`,
+ icon: ,
+ autoClose: 2000,
+ });
+ })
+ .catch((err) => {
+ updateNotification({
+ id: id.toString(),
+ color: 'red',
+ title: 'There was an error',
+ message: err.message,
+ autoClose: 2000,
+ });
+ });
+}
diff --git a/src/modules/overseerr/SearchResult.d.ts b/src/modules/overseerr/SearchResult.d.ts
new file mode 100644
index 000000000..3fcc81868
--- /dev/null
+++ b/src/modules/overseerr/SearchResult.d.ts
@@ -0,0 +1,66 @@
+export interface SearchResult {
+ page: number;
+ totalPages: number;
+ totalResults: number;
+ results: Result[];
+}
+
+export interface Result {
+ id: number;
+ mediaType: MediaType;
+ adult?: boolean;
+ genreIds: number[];
+ originalLanguage: OriginalLanguage;
+ originalTitle?: string;
+ overview: string;
+ popularity: number;
+ releaseDate?: Date;
+ title?: string;
+ video?: boolean;
+ voteAverage: number;
+ voteCount: number;
+ backdropPath: null | string;
+ posterPath: string;
+ mediaInfo?: MediaInfo;
+ firstAirDate?: Date;
+ name?: string;
+ originCountry?: string[];
+ originalName?: string;
+}
+
+export interface MediaInfo {
+ downloadStatus: any[];
+ downloadStatus4k: any[];
+ id: number;
+ mediaType: MediaType;
+ tmdbId: number;
+ tvdbId: null;
+ imdbId: null;
+ status: number;
+ status4k: number;
+ createdAt: Date;
+ updatedAt: Date;
+ lastSeasonChange: Date;
+ mediaAddedAt: Date;
+ serviceId: number;
+ serviceId4k: null;
+ externalServiceId: number;
+ externalServiceId4k: null;
+ externalServiceSlug: string;
+ externalServiceSlug4k: null;
+ ratingKey: string;
+ ratingKey4k: null;
+ seasons: any[];
+ plexUrl: string;
+ serviceUrl: string;
+ mediaUrl?: string;
+}
+
+export enum MediaType {
+ Movie = 'movie',
+ Tv = 'tv',
+}
+
+export enum OriginalLanguage {
+ En = 'en',
+}
diff --git a/src/modules/overseerr/TvShow.d.ts b/src/modules/overseerr/TvShow.d.ts
new file mode 100644
index 000000000..f9c3bd64a
--- /dev/null
+++ b/src/modules/overseerr/TvShow.d.ts
@@ -0,0 +1,295 @@
+export interface TvShowResult {
+ createdBy: CreatedBy[];
+ episodeRunTime: number[];
+ firstAirDate: Date;
+ genres: Genre[];
+ relatedVideos: RelatedVideo[];
+ homepage: string;
+ id: number;
+ inProduction: boolean;
+ languages: string[];
+ lastAirDate: Date;
+ name: string;
+ networks: Network[];
+ numberOfEpisodes: number;
+ numberOfSeasons: number;
+ originCountry: string[];
+ originalLanguage: string;
+ originalName: string;
+ tagline: string;
+ overview: string;
+ popularity: number;
+ productionCompanies: Network[];
+ productionCountries: ProductionCountry[];
+ contentRatings: ContentRatings;
+ spokenLanguages: SpokenLanguage[];
+ seasons: TvShowResultSeason[];
+ status: string;
+ type: string;
+ voteAverage: number;
+ voteCount: number;
+ backdropPath: string;
+ lastEpisodeToAir: LastEpisodeToAir;
+ posterPath: string;
+ credits: Credits;
+ externalIds: ExternalIDS;
+ keywords: Genre[];
+ mediaInfo: Media;
+ watchProviders: WatchProvider[];
+}
+
+export interface ContentRatings {
+ results: Result[];
+}
+
+export interface Result {
+ iso_3166_1: string;
+ rating: string;
+}
+
+export interface CreatedBy {
+ id: number;
+ credit_id: string;
+ name: string;
+ gender: number;
+ profile_path: string;
+}
+
+export interface Credits {
+ cast: Cast[];
+ crew: Crew[];
+}
+
+export interface Cast {
+ character: string;
+ creditId: string;
+ id: number;
+ name: string;
+ order: number;
+ gender: number;
+ profilePath: null | string;
+}
+
+export interface Crew {
+ creditId: string;
+ department: string;
+ id: number;
+ job: string;
+ name: string;
+ gender: number;
+ profilePath: string;
+}
+
+export interface ExternalIDS {
+ facebookId: string;
+ freebaseId: null;
+ freebaseMid: string;
+ imdbId: string;
+ instagramId: string;
+ tvdbId: number;
+ tvrageId: number;
+ twitterId: string;
+}
+
+export interface Genre {
+ id: number;
+ name: string;
+}
+
+export interface LastEpisodeToAir {
+ id: number;
+ airDate: Date;
+ episodeNumber: number;
+ name: string;
+ overview: string;
+ productionCode: string;
+ seasonNumber: number;
+ showId: number;
+ voteAverage: number;
+ stillPath: string;
+}
+
+export interface Request {
+ id: number;
+ status: number;
+ createdAt: Date;
+ updatedAt: Date;
+ type: Type;
+ is4k: boolean;
+ serverId: null;
+ profileId: null;
+ rootFolder: null;
+ languageProfileId: null;
+ tags: null;
+ media: Media;
+ requestedBy: EdBy;
+ modifiedBy: EdBy;
+ seasons: MediaInfoSeason[];
+ seasonCount: number;
+}
+
+export interface Media {
+ downloadStatus: DownloadStatus[];
+ downloadStatus4k: any[];
+ id: number;
+ mediaType: Type;
+ tmdbId: number;
+ tvdbId: number;
+ imdbId: null;
+ status: number;
+ status4k: number;
+ createdAt: Date;
+ updatedAt: Date;
+ lastSeasonChange: Date;
+ mediaAddedAt: Date;
+ serviceId: number;
+ serviceId4k: null;
+ externalServiceId: number;
+ externalServiceId4k: null;
+ externalServiceSlug: string;
+ externalServiceSlug4k: null;
+ ratingKey: string;
+ ratingKey4k: null;
+ requests?: Request[];
+ issues?: any[];
+ seasons: MediaInfoSeason[];
+ plexUrl: string;
+ serviceUrl: string;
+}
+
+export interface EdBy {
+ permissions: number;
+ id: number;
+ email: string;
+ plexUsername: string;
+ username: string;
+ recoveryLinkExpirationDate: null;
+ userType: number;
+ avatar: string;
+ movieQuotaLimit: null;
+ movieQuotaDays: null;
+ tvQuotaLimit: null;
+ tvQuotaDays: null;
+ createdAt: Date;
+ updatedAt: Date;
+ settings: Settings;
+ requestCount: number;
+ displayName: string;
+}
+
+export interface Settings {
+ id: number;
+ locale: string;
+ region: string;
+ originalLanguage: null;
+ pgpKey: null;
+ discordId: string;
+ pushbulletAccessToken: null;
+ pushoverApplicationToken: null;
+ pushoverUserKey: null;
+ telegramChatId: null;
+ telegramSendSilently: null;
+ notificationTypes: NotificationTypes;
+}
+
+export interface NotificationTypes {
+ discord: number;
+ email: number;
+ webpush: number;
+}
+
+export interface MediaInfoSeason {
+ id: number;
+ seasonNumber: number;
+ status: number;
+ status4k?: number;
+ createdAt: Date;
+ updatedAt: Date;
+}
+
+export enum Type {
+ Tv = 'tv',
+}
+
+export interface DownloadStatus {
+ externalId: number;
+ estimatedCompletionTime: Date;
+ mediaType: Type;
+ size: number;
+ sizeLeft: number;
+ status: Status;
+ timeLeft: string;
+ title: string;
+}
+
+export enum Status {
+ Completed = 'completed',
+ Downloading = 'downloading',
+}
+
+export interface Network {
+ id: number;
+ name: Name;
+ originCountry?: string;
+ logoPath: LogoPath | null;
+ displayPriority?: number;
+}
+
+export enum LogoPath {
+ HbifXPpM55B1FL5WPo7T72VzN78PNG = '/hbifXPpM55B1fL5wPo7t72vzN78.png',
+ KhiCshsZBdtUUYOr4VLoCtuqCEqPNG = '/khiCshsZBdtUUYOr4VLoCtuqCEq.png',
+ O9ExgOSLF3OTwR6T3DJOuwOKJgqJpg = '/o9ExgOSLF3OTwR6T3DJOuwOKJgq.jpg',
+ PEURlLlr8JggOwK53FJ5WdQl05YJpg = '/peURlLlr8jggOwK53fJ5wdQl05y.jpg',
+ T2YyOv40HZeVlLjYsCSPHnWLk4WJpg = '/t2yyOv40HZeVlLjYsCsPHnWLk4W.jpg',
+ TBEdFQDwx5LEVr8WpSEXQSIirVqJpg = '/tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg',
+ The5NyLm42TmCqCMOZFvH4FcoSNKEWJpg = '/5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg',
+ WwemzKWzjKYJFfCeiB57Q3R4BcmPNG = '/wwemzKWzjKYJFfCeiB57q3r4Bcm.png',
+}
+
+export enum Name {
+ AmazonVideo = 'Amazon Video',
+ AppleITunes = 'Apple iTunes',
+ Channel4 = 'Channel 4',
+ GooglePlayMovies = 'Google Play Movies',
+ HouseOfTomorrow = 'House of Tomorrow',
+ Ivi = 'Ivi',
+ Netflix = 'Netflix',
+ Zeppotron = 'Zeppotron',
+}
+
+export interface ProductionCountry {
+ iso_3166_1: string;
+ name: string;
+}
+
+export interface RelatedVideo {
+ site: string;
+ key: string;
+ name: string;
+ size: number;
+ type: string;
+ url: string;
+}
+
+export interface TvShowResultSeason {
+ airDate: Date;
+ episodeCount: number;
+ id: number;
+ name: string;
+ overview: string;
+ seasonNumber: number;
+ posterPath: string;
+}
+
+export interface SpokenLanguage {
+ englishName: string;
+ iso_639_1: string;
+ name: string;
+}
+
+export interface WatchProvider {
+ iso_3166_1: string;
+ link: string;
+ buy: Network[];
+ flatrate: Network[];
+}
diff --git a/src/modules/overseerr/example.json b/src/modules/overseerr/example.json
new file mode 100644
index 000000000..d9f35cad6
--- /dev/null
+++ b/src/modules/overseerr/example.json
@@ -0,0 +1,72 @@
+{
+ "id": 86831,
+ "firstAirDate": "2019-03-15",
+ "genreIds": [
+ 16,
+ 10765
+ ],
+ "mediaType": "tv",
+ "name": "Love, Death & Robots",
+ "originCountry": [
+ "US"
+ ],
+ "originalLanguage": "en",
+ "originalName": "Love, Death & Robots",
+ "overview": "Terrifying creatures, wicked surprises and dark comedy converge in this NSFW anthology of animated stories presented by Tim Miller and David Fincher.",
+ "popularity": 623.833,
+ "voteAverage": 8.2,
+ "voteCount": 1720,
+ "backdropPath": "/78NtUwwo3lhH7QGh4vG3U1qK1mc.jpg",
+ "posterPath": "/cRiDlzzZC5lL7fvImuSjs04SUIJ.jpg",
+ "mediaInfo": {
+ "downloadStatus": [],
+ "downloadStatus4k": [],
+ "id": 79,
+ "mediaType": "tv",
+ "tmdbId": 86831,
+ "tvdbId": 357888,
+ "imdbId": null,
+ "status": 4,
+ "status4k": 1,
+ "createdAt": "2022-02-05T04:30:01.000Z",
+ "updatedAt": "2022-02-05T09:25:22.000Z",
+ "lastSeasonChange": "2022-02-05T04:30:01.000Z",
+ "mediaAddedAt": "2022-02-04T01:16:35.000Z",
+ "serviceId": 0,
+ "serviceId4k": null,
+ "externalServiceId": 7,
+ "externalServiceId4k": null,
+ "externalServiceSlug": "love-death-and-robots",
+ "externalServiceSlug4k": null,
+ "ratingKey": "182",
+ "ratingKey4k": null,
+ "seasons": [
+ {
+ "id": 11,
+ "seasonNumber": 1,
+ "status": 1,
+ "status4k": 1,
+ "createdAt": "2022-02-05T04:30:01.000Z",
+ "updatedAt": "2022-02-05T04:30:01.000Z"
+ },
+ {
+ "id": 24,
+ "seasonNumber": 2,
+ "status": 5,
+ "status4k": 1,
+ "createdAt": "2022-02-05T04:30:01.000Z",
+ "updatedAt": "2022-02-05T04:30:01.000Z"
+ },
+ {
+ "id": 85,
+ "seasonNumber": 3,
+ "status": 3,
+ "status4k": 1,
+ "createdAt": "2022-04-26T04:30:02.000Z",
+ "updatedAt": "2022-04-26T04:30:02.000Z"
+ }
+ ],
+ "plexUrl": "https://app.plex.tv/desktop#!/server/5b88b3c20d2d092c0ee848f9044f3f3bee033d91/details?key=%2Flibrary%2Fmetadata%2F182",
+ "serviceUrl": "http://server:8989/series/love-death-and-robots"
+ }
+}
\ No newline at end of file
diff --git a/src/modules/overseerr/index.ts b/src/modules/overseerr/index.ts
new file mode 100644
index 000000000..bc20880a5
--- /dev/null
+++ b/src/modules/overseerr/index.ts
@@ -0,0 +1 @@
+export { OverseerrModule } from './OverseerrModule';
diff --git a/src/components/modules/ping/PingModule.tsx b/src/modules/ping/PingModule.tsx
similarity index 77%
rename from src/components/modules/ping/PingModule.tsx
rename to src/modules/ping/PingModule.tsx
index b0c333bfa..871b894d7 100644
--- a/src/components/modules/ping/PingModule.tsx
+++ b/src/modules/ping/PingModule.tsx
@@ -3,8 +3,8 @@ import axios, { AxiosResponse } from 'axios';
import { motion } from 'framer-motion';
import { useEffect, useState } from 'react';
import { IconPlug as Plug } from '@tabler/icons';
-import { useConfig } from '../../../tools/state';
-import { IModule } from '../modules';
+import { useConfig } from '../../tools/state';
+import { IModule } from '../ModuleTypes';
export const PingModule: IModule = {
title: 'Ping Services',
@@ -56,22 +56,23 @@ export default function PingComponent(props: any) {
return null;
}
return (
-
-
{null}
-
-
+
+
);
}
diff --git a/src/components/modules/ping/index.ts b/src/modules/ping/index.ts
similarity index 100%
rename from src/components/modules/ping/index.ts
rename to src/modules/ping/index.ts
diff --git a/src/components/modules/readme.md b/src/modules/readme.md
similarity index 100%
rename from src/components/modules/readme.md
rename to src/modules/readme.md
diff --git a/src/modules/search/SearchModule.tsx b/src/modules/search/SearchModule.tsx
new file mode 100644
index 000000000..42a778a3c
--- /dev/null
+++ b/src/modules/search/SearchModule.tsx
@@ -0,0 +1,199 @@
+import { Kbd, createStyles, Autocomplete, Popover, ScrollArea, Divider } from '@mantine/core';
+import { useClickOutside, useDebouncedValue, useHotkeys } from '@mantine/hooks';
+import { useForm } from '@mantine/form';
+import React, { useEffect, useRef, useState } from 'react';
+import {
+ IconSearch as Search,
+ IconBrandYoutube as BrandYoutube,
+ IconDownload as Download,
+ IconMovie,
+} from '@tabler/icons';
+import axios from 'axios';
+import { showNotification } from '@mantine/notifications';
+import { useConfig } from '../../tools/state';
+import { IModule } from '../ModuleTypes';
+import { OverseerrModule } from '../overseerr';
+import { OverseerrMediaDisplay } from '../common';
+
+const useStyles = createStyles((theme) => ({
+ hide: {
+ [theme.fn.smallerThan('sm')]: {
+ display: 'none',
+ },
+ display: 'flex',
+ alignItems: 'center',
+ },
+}));
+
+export const SearchModule: IModule = {
+ title: 'Search Bar',
+ description: 'Search bar to search the web, youtube, torrents or overseerr',
+ icon: Search,
+ component: SearchBar,
+};
+
+export default function SearchBar(props: any) {
+ const { classes, cx } = useStyles();
+ // Config
+ const { config } = useConfig();
+ const isModuleEnabled = config.modules?.[SearchModule.title]?.enabled ?? false;
+ const isOverseerrEnabled = config.modules?.[OverseerrModule.title]?.enabled ?? false;
+ const OverseerrService = config.services.find(
+ (service) => service.type === 'Overseerr' || service.type === 'Jellyseerr'
+ );
+ const queryUrl = config.settings.searchUrl ?? 'https://www.google.com/search?q=';
+
+ const [OverseerrResults, setOverseerrResults] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [icon, setIcon] = useState( );
+ const [results, setResults] = useState([]);
+ const [opened, setOpened] = useState(false);
+ const ref = useClickOutside(() => setOpened(false));
+
+ const textInput = useRef();
+ useHotkeys([['ctrl+K', () => textInput.current && textInput.current.focus()]]);
+
+ const form = useForm({
+ initialValues: {
+ query: '',
+ },
+ });
+ const [debounced, cancel] = useDebouncedValue(form.values.query, 250);
+
+ useEffect(() => {
+ if (OverseerrService === undefined && isOverseerrEnabled) {
+ showNotification({
+ title: 'Overseerr integration',
+ message:
+ 'Module enabled but no service is configured with the type "Overseerr" / "Jellyseerr"',
+ color: 'red',
+ });
+ }
+ }, [OverseerrService, isOverseerrEnabled]);
+
+ useEffect(() => {
+ if (
+ form.values.query !== debounced ||
+ form.values.query === '' ||
+ (form.values.query.startsWith('!') && !form.values.query.startsWith('!os'))
+ ) {
+ return;
+ }
+ if (form.values.query.startsWith('!os')) {
+ axios
+ .get(`/api/modules/overseerr?query=${form.values.query.replace('!os', '').trim()}`)
+ .then((res) => {
+ setOverseerrResults(res.data.results ?? []);
+ setLoading(false);
+ });
+ setLoading(true);
+ } else {
+ setOverseerrResults([]);
+ axios
+ .get(`/api/modules/search?q=${form.values.query}`)
+ .then((res) => setResults(res.data ?? []));
+ }
+ }, [debounced]);
+
+ if (!isModuleEnabled) {
+ return null;
+ }
+
+ const autocompleteData = results.map((result) => ({
+ label: result.phrase,
+ value: result.phrase,
+ }));
+ return (
+
+ );
+}
diff --git a/src/components/modules/search/index.ts b/src/modules/search/index.ts
similarity index 100%
rename from src/components/modules/search/index.ts
rename to src/modules/search/index.ts
diff --git a/src/components/modules/weather/WeatherInterface.ts b/src/modules/weather/WeatherInterface.ts
similarity index 100%
rename from src/components/modules/weather/WeatherInterface.ts
rename to src/modules/weather/WeatherInterface.ts
diff --git a/src/components/modules/weather/WeatherModule.tsx b/src/modules/weather/WeatherModule.tsx
similarity index 93%
rename from src/components/modules/weather/WeatherModule.tsx
rename to src/modules/weather/WeatherModule.tsx
index 913ae9f8a..947ed479d 100644
--- a/src/components/modules/weather/WeatherModule.tsx
+++ b/src/modules/weather/WeatherModule.tsx
@@ -1,4 +1,4 @@
-import { Group, Space, Title, Tooltip, Skeleton } from '@mantine/core';
+import { Group, Space, Title, Tooltip, Skeleton, Stack, Box } from '@mantine/core';
import axios from 'axios';
import { useEffect, useState } from 'react';
import {
@@ -13,8 +13,8 @@ import {
IconSnowflake as Snowflake,
IconSun as Sun,
} from '@tabler/icons';
-import { useConfig } from '../../../tools/state';
-import { IModule } from '../modules';
+import { useConfig } from '../../tools/state';
+import { IModule } from '../ModuleTypes';
import { WeatherResponse } from './WeatherInterface';
export const WeatherModule: IModule = {
@@ -124,8 +124,10 @@ export function WeatherIcon(props: any) {
}
}
return (
-
-
+
+
+
+
);
}
@@ -160,7 +162,7 @@ export default function WeatherComponent(props: any) {
return (
<>
-
+
@@ -174,7 +176,7 @@ export default function WeatherComponent(props: any) {
return isFahrenheit ? `${(value * (9 / 5) + 32).toFixed(1)}°F` : `${value.toFixed(1)}°C`;
}
return (
-
+
{usePerferedUnit(weather.current_weather.temperature)}
@@ -185,6 +187,6 @@ export default function WeatherComponent(props: any) {
{usePerferedUnit(weather.daily.temperature_2m_min[0])}
-
+
);
}
diff --git a/src/components/modules/weather/index.ts b/src/modules/weather/index.ts
similarity index 100%
rename from src/components/modules/weather/index.ts
rename to src/modules/weather/index.ts
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index d22a65538..776347495 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -6,9 +6,9 @@ import Head from 'next/head';
import { MantineProvider, ColorScheme, ColorSchemeProvider, MantineTheme } from '@mantine/core';
import { NotificationsProvider } from '@mantine/notifications';
import { useHotkeys } from '@mantine/hooks';
+import { ModalsProvider } from '@mantine/modals';
import { ConfigProvider } from '../tools/state';
import { theme } from '../tools/theme';
-import { styles } from '../tools/styles';
import { ColorTheme } from '../tools/color';
export default function App(this: any, props: AppProps & { colorScheme: ColorScheme }) {
@@ -45,20 +45,33 @@ export default function App(this: any, props: AppProps & { colorScheme: ColorSch
-
-
-
+
+
+
+
+
diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx
index abe7984ca..6c633fbf8 100644
--- a/src/pages/_document.tsx
+++ b/src/pages/_document.tsx
@@ -1,21 +1,20 @@
-import Document, { DocumentContext } from 'next/document';
-import { ServerStyles, createStylesServer } from '@mantine/next';
+import { createGetInitialProps } from '@mantine/next';
+import Document, { Head, Html, Main, NextScript } from 'next/document';
-const stylesServer = createStylesServer();
+const getInitialProps = createGetInitialProps();
export default class _Document extends Document {
- static async getInitialProps(ctx: DocumentContext) {
- const initialProps = await Document.getInitialProps(ctx);
- // Add your app specific logic here
+ static getInitialProps = getInitialProps;
- return {
- ...initialProps,
- styles: (
- <>
- {initialProps.styles}
-
- >
- ),
- };
+ render() {
+ return (
+
+
+
+
+
+
+
+ );
}
}
diff --git a/src/pages/_middleware.ts b/src/pages/_middleware.ts
new file mode 100644
index 000000000..5b01cbe38
--- /dev/null
+++ b/src/pages/_middleware.ts
@@ -0,0 +1,16 @@
+import { NextFetchEvent, NextRequest, NextResponse } from 'next/server';
+
+// eslint-disable-next-line consistent-return
+export function middleware(req: NextRequest, ev: NextFetchEvent) {
+ const isCorrectPassword = req.cookies.password === process.env.PASSWORD;
+ const url = req.nextUrl.clone();
+ if (
+ !isCorrectPassword &&
+ url.pathname !== '/login' &&
+ process.env.PASSWORD &&
+ url.pathname !== '/api/configs/tryPassword'
+ ) {
+ url.pathname = '/login';
+ return NextResponse.rewrite(url);
+ }
+}
diff --git a/src/pages/api/docker/container/[id].tsx b/src/pages/api/docker/container/[id].tsx
index affa8868b..c5fdd4d16 100644
--- a/src/pages/api/docker/container/[id].tsx
+++ b/src/pages/api/docker/container/[id].tsx
@@ -42,9 +42,7 @@ async function Get(req: NextApiRequest, res: NextApiResponse) {
message: `Container ${id} ${action}ed`,
});
} catch (err) {
- return res.status(500).json(
- err,
- );
+ return res.status(500).json(err);
}
}
diff --git a/src/pages/api/imageproxy.ts b/src/pages/api/imageproxy.ts
new file mode 100644
index 000000000..575960467
--- /dev/null
+++ b/src/pages/api/imageproxy.ts
@@ -0,0 +1,10 @@
+import { NextApiRequest, NextApiResponse } from 'next';
+
+export default async (req: NextApiRequest, res: NextApiResponse) => {
+ const url = decodeURIComponent(req.query.url as string);
+ const result = await fetch(url);
+ const body = await result.body;
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ body.pipe(res);
+};
diff --git a/src/pages/api/modules/dashdot.ts b/src/pages/api/modules/dashdot.ts
new file mode 100644
index 000000000..8f9a990a5
--- /dev/null
+++ b/src/pages/api/modules/dashdot.ts
@@ -0,0 +1,29 @@
+import axios from 'axios';
+import { NextApiRequest, NextApiResponse } from 'next';
+
+async function Get(req: NextApiRequest, res: NextApiResponse) {
+ // Extract url from req.query as string
+ const { url, base } = req.query;
+
+ // If no url is provided, return an error
+ if (!url || !base) {
+ return res.status(400).json({
+ message: 'Missing required parameter in url',
+ });
+ }
+ // Get the origin URL
+ const response = await axios.get(url as string, { baseURL: base as string });
+ // Return the response
+ return res.status(200).json(response.data);
+}
+
+export default async (req: NextApiRequest, res: NextApiResponse) => {
+ // Filter out if the reuqest is a POST or a GET
+ if (req.method === 'GET') {
+ return Get(req, res);
+ }
+ return res.status(405).json({
+ statusCode: 405,
+ message: 'Method not allowed',
+ });
+};
diff --git a/src/pages/api/modules/overseerr/[id].tsx b/src/pages/api/modules/overseerr/[id].tsx
new file mode 100644
index 000000000..74bddddc8
--- /dev/null
+++ b/src/pages/api/modules/overseerr/[id].tsx
@@ -0,0 +1,130 @@
+import { NextApiRequest, NextApiResponse } from 'next';
+import { getCookie } from 'cookies-next';
+import axios from 'axios';
+import Consola from 'consola';
+import { getConfig } from '../../../../tools/getConfig';
+import { Config } from '../../../../tools/types';
+import { MediaType } from '../../../../modules/overseerr/SearchResult';
+
+async function Get(req: NextApiRequest, res: NextApiResponse) {
+ // Get the slug of the request
+ const { id, type } = req.query as { id: string; type: string };
+ const configName = getCookie('config-name', { req });
+ const { config }: { config: Config } = getConfig(configName?.toString() ?? 'default').props;
+ const service = config.services.find(
+ (service) => service.type === 'Overseerr' || service.type === 'Jellyseerr'
+ );
+ if (!id) {
+ return res.status(400).json({ error: 'No id provided' });
+ }
+ if (!type) {
+ return res.status(400).json({ error: 'No type provided' });
+ }
+ if (!service?.apiKey) {
+ return res.status(400).json({ error: 'No service found' });
+ }
+
+ const serviceUrl = new URL(service.url);
+ switch (type) {
+ case 'movie':
+ return axios
+ .get(`${serviceUrl.origin}/api/v1/movie/${id}`, {
+ headers: {
+ // Set X-Api-Key to the value of the API key
+ 'X-Api-Key': service.apiKey,
+ },
+ })
+ .then((axiosres) => res.status(200).json(axiosres.data))
+
+ .catch((err) => {
+ Consola.error(err);
+ return res.status(500).json({
+ message: 'Something went wrong',
+ });
+ });
+ case 'tv':
+ // Make request to the tv api
+ return axios
+ .get(`${serviceUrl.origin}/api/v1/tv/${id}`, {
+ headers: {
+ // Set X-Api-Key to the value of the API key
+ 'X-Api-Key': service.apiKey,
+ },
+ })
+ .then((axiosres) => res.status(200).json(axiosres.data))
+ .catch((err) => {
+ Consola.error(err);
+ return res.status(500).json({
+ message: 'Something went wrong',
+ });
+ });
+
+ default:
+ return res.status(400).json({
+ message: 'Wrong request, type should be movie or tv',
+ });
+ }
+}
+
+async function Post(req: NextApiRequest, res: NextApiResponse) {
+ // Get the slug of the request
+ const { id } = req.query as { id: string };
+ const { seasons, type } = req.body as { seasons?: number[]; type: MediaType };
+ const configName = getCookie('config-name', { req });
+ const { config }: { config: Config } = getConfig(configName?.toString() ?? 'default').props;
+ const service = config.services.find(
+ (service) => service.type === 'Overseerr' || service.type === 'Jellyseerr'
+ );
+ if (!id) {
+ return res.status(400).json({ error: 'No id provided' });
+ }
+ if (!type) {
+ return res.status(400).json({ error: 'No type provided' });
+ }
+ if (!service?.apiKey) {
+ return res.status(400).json({ error: 'No service found' });
+ }
+ if (type === 'movie' && !seasons) {
+ return res.status(400).json({ error: 'No seasons provided' });
+ }
+ const serviceUrl = new URL(service.url);
+ Consola.info('Got an Overseerr request with these arguments', {
+ mediaType: type,
+ mediaId: id,
+ seasons,
+ });
+ return axios
+ .post(
+ `${serviceUrl.origin}/api/v1/request`,
+ {
+ mediaType: type,
+ mediaId: Number(id),
+ seasons,
+ },
+ {
+ headers: {
+ // Set X-Api-Key to the value of the API key
+ 'X-Api-Key': service.apiKey,
+ },
+ }
+ )
+ .then((axiosres) => res.status(200).json(axiosres.data))
+ .catch((err) =>
+ res.status(500).json({
+ message: err.message,
+ })
+ );
+}
+
+export default async (req: NextApiRequest, res: NextApiResponse) => {
+ if (req.method === 'POST') {
+ return Post(req, res);
+ }
+ if (req.method === 'GET') {
+ return Get(req, res);
+ }
+ return res.status(405).json({
+ statusCode: 405,
+ message: 'Method not allowed',
+ });
+};
diff --git a/src/pages/api/modules/overseerr/index.ts b/src/pages/api/modules/overseerr/index.ts
new file mode 100644
index 000000000..e45603453
--- /dev/null
+++ b/src/pages/api/modules/overseerr/index.ts
@@ -0,0 +1,45 @@
+import axios from 'axios';
+import { getCookie } from 'cookies-next';
+import { NextApiRequest, NextApiResponse } from 'next';
+import { getConfig } from '../../../../tools/getConfig';
+import { Config } from '../../../../tools/types';
+
+async function Get(req: NextApiRequest, res: NextApiResponse) {
+ const configName = getCookie('config-name', { req });
+ const { config }: { config: Config } = getConfig(configName?.toString() ?? 'default').props;
+ const { query } = req.query;
+ const service = config.services.find(
+ (service) => service.type === 'Overseerr' || service.type === 'Jellyseerr'
+ );
+ // If query is an empty string, return an empty array
+ if (query === '' || query === undefined) {
+ return res.status(200).json([]);
+ }
+ if (!service || !query || service === undefined || !service.apiKey) {
+ return res.status(400).json({
+ error: 'Wrong request',
+ });
+ }
+ const serviceUrl = new URL(service.url);
+ const data = await axios
+ .get(`${serviceUrl.origin}/api/v1/search?query=${query}`, {
+ headers: {
+ // Set X-Api-Key to the value of the API key
+ 'X-Api-Key': service.apiKey,
+ },
+ })
+ .then((res) => res.data);
+ // Get login, password and url from the body
+ res.status(200).json(data);
+}
+
+export default async (req: NextApiRequest, res: NextApiResponse) => {
+ // Filter out if the reuqest is a POST or a GET
+ if (req.method === 'GET') {
+ return Get(req, res);
+ }
+ return res.status(405).json({
+ statusCode: 405,
+ message: 'Method not allowed',
+ });
+};
diff --git a/src/pages/api/modules/systeminfo.ts b/src/pages/api/modules/systeminfo.ts
deleted file mode 100644
index 2e4537e32..000000000
--- a/src/pages/api/modules/systeminfo.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-import si from 'systeminformation';
-
-async function Get(req: NextApiRequest, res: NextApiResponse) {
- const [osInfo, cpuInfo, memInfo, cpuLoad] = await Promise.all([
- si.osInfo(),
- si.cpu(),
- si.mem(),
- si.currentLoad(),
- ]);
-
- const sysinfo = {
- cpu: cpuInfo,
- os: osInfo,
- mem: memInfo,
- load: cpuLoad,
- };
- res.status(200).json(sysinfo);
-}
-
-export default async (req: NextApiRequest, res: NextApiResponse) => {
- // Filter out if the reuqest is a POST or a GET
- if (req.method === 'GET') {
- return Get(req, res);
- }
- return res.status(405).json({
- statusCode: 405,
- message: 'Method not allowed',
- });
-};
diff --git a/src/pages/login.tsx b/src/pages/login.tsx
index 7a845a769..d6df4d33c 100644
--- a/src/pages/login.tsx
+++ b/src/pages/login.tsx
@@ -1,14 +1,15 @@
import React from 'react';
import { PasswordInput, Anchor, Paper, Title, Text, Container, Group, Button } from '@mantine/core';
import { setCookie } from 'cookies-next';
-import { useForm } from '@mantine/hooks';
import { showNotification, updateNotification } from '@mantine/notifications';
import axios from 'axios';
import { IconCheck, IconX } from '@tabler/icons';
-import { Logo } from '../components/layout/Logo';
+import { useRouter } from 'next/router';
+import { useForm } from '@mantine/form';
// TODO: Add links to the wiki articles about the login process.
export default function AuthenticationTitle() {
+ const router = useRouter();
const form = useForm({
initialValues: {
password: '',
@@ -33,7 +34,6 @@ export default function AuthenticationTitle() {
>
Welcome back!
-
@@ -72,16 +72,14 @@ export default function AuthenticationTitle() {
.then((res) => {
setTimeout(() => {
if (res.data.success === true) {
+ router.push('/');
updateNotification({
id: 'load-data',
color: 'teal',
- title: 'Password correct',
+ title: 'Password correct, redirecting you...',
message: undefined,
icon: ,
- autoClose: 300,
- onClose: () => {
- window.location.reload();
- },
+ autoClose: 1000,
});
}
if (res.data.success === false) {
diff --git a/src/tools/addToHomarr.ts b/src/tools/addToHomarr.ts
index 08075683b..3c3c24cce 100644
--- a/src/tools/addToHomarr.ts
+++ b/src/tools/addToHomarr.ts
@@ -7,7 +7,7 @@ async function MatchIcon(name: string) {
.replace(/\s+/g, '-')
.toLowerCase()}.png`
);
- return res.ok ? res.url : '/favicon.svg';
+ return res.ok ? res.url : '/favicon.png';
}
function tryMatchType(imageName: string): ServiceType {
diff --git a/src/tools/styles.ts b/src/tools/styles.ts
deleted file mode 100644
index 905d6903c..000000000
--- a/src/tools/styles.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { MantineProviderProps } from '@mantine/core';
-
-export const styles: MantineProviderProps['styles'] = {
- Checkbox: {
- input: { cursor: 'pointer' },
- label: { cursor: 'pointer' },
- },
- Switch: {
- input: { cursor: 'pointer' },
- label: { cursor: 'pointer' },
- },
-};
diff --git a/src/tools/types.ts b/src/tools/types.ts
index b0592492a..e08b491e4 100644
--- a/src/tools/types.ts
+++ b/src/tools/types.ts
@@ -1,5 +1,5 @@
import { MantineTheme } from '@mantine/core';
-import { OptionValues } from '../components/modules/modules';
+import { OptionValues } from '../modules/ModuleTypes';
export interface Settings {
searchUrl: string;
@@ -70,6 +70,8 @@ export const ServiceTypeList = [
'Readarr',
'Sonarr',
'Transmission',
+ 'Overseerr',
+ 'Jellyseerr',
];
export type ServiceType =
| 'Other'
@@ -82,9 +84,14 @@ export type ServiceType =
| 'Radarr'
| 'Readarr'
| 'Sonarr'
+ | 'Overseerr'
+ | 'Jellyseerr'
| 'Transmission';
-export function tryMatchPort(name: string, form?: any) {
+export function tryMatchPort(name: string | undefined, form?: any) {
+ if (!name) {
+ return undefined;
+ }
// Match name with portmap key
const port = portmap.find((p) => p.name === name.toLowerCase());
if (form && port) {
@@ -101,6 +108,9 @@ export const portmap = [
{ name: 'readarr', value: '8787' },
{ name: 'deluge', value: '8112' },
{ name: 'transmission', value: '9091' },
+ { name: 'plex', value: '32400' },
+ { name: 'emby', value: '8096' },
+ { name: 'overseerr', value: '5055' },
{ name: 'dash.', value: '3001' },
];
@@ -164,7 +174,7 @@ export const MatchingImages: {
export interface serviceItem {
id: string;
name: string;
- type: string;
+ type: ServiceType;
url: string;
icon: string;
category?: string;
diff --git a/yarn.lock b/yarn.lock
index 1185dfabe..5527bb6e1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15,188 +15,188 @@ __metadata:
languageName: node
linkType: hard
-"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7":
- version: 7.16.7
- resolution: "@babel/code-frame@npm:7.16.7"
+"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6":
+ version: 7.18.6
+ resolution: "@babel/code-frame@npm:7.18.6"
dependencies:
- "@babel/highlight": ^7.16.7
- checksum: db2f7faa31bc2c9cf63197b481b30ea57147a5fc1a6fab60e5d6c02cdfbf6de8e17b5121f99917b3dabb5eeb572da078312e70697415940383efc140d4e0808b
+ "@babel/highlight": ^7.18.6
+ checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba
languageName: node
linkType: hard
-"@babel/compat-data@npm:^7.17.10":
- version: 7.17.10
- resolution: "@babel/compat-data@npm:7.17.10"
- checksum: e85051087cd4690de5061909a2dd2d7f8b6434a3c2e30be6c119758db2027ae1845bcd75a81127423dd568b706ac6994a1a3d7d701069a23bf5cfe900728290b
+"@babel/compat-data@npm:^7.18.8":
+ version: 7.18.8
+ resolution: "@babel/compat-data@npm:7.18.8"
+ checksum: 3096aafad74936477ebdd039bcf342fba84eb3100e608f3360850fb63e1efa1c66037c4824f814d62f439ab47d25164439343a6e92e9b4357024fdf571505eb9
languageName: node
linkType: hard
"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3":
- version: 7.18.2
- resolution: "@babel/core@npm:7.18.2"
+ version: 7.18.9
+ resolution: "@babel/core@npm:7.18.9"
dependencies:
"@ampproject/remapping": ^2.1.0
- "@babel/code-frame": ^7.16.7
- "@babel/generator": ^7.18.2
- "@babel/helper-compilation-targets": ^7.18.2
- "@babel/helper-module-transforms": ^7.18.0
- "@babel/helpers": ^7.18.2
- "@babel/parser": ^7.18.0
- "@babel/template": ^7.16.7
- "@babel/traverse": ^7.18.2
- "@babel/types": ^7.18.2
+ "@babel/code-frame": ^7.18.6
+ "@babel/generator": ^7.18.9
+ "@babel/helper-compilation-targets": ^7.18.9
+ "@babel/helper-module-transforms": ^7.18.9
+ "@babel/helpers": ^7.18.9
+ "@babel/parser": ^7.18.9
+ "@babel/template": ^7.18.6
+ "@babel/traverse": ^7.18.9
+ "@babel/types": ^7.18.9
convert-source-map: ^1.7.0
debug: ^4.1.0
gensync: ^1.0.0-beta.2
json5: ^2.2.1
semver: ^6.3.0
- checksum: 14a4142c12e004cd2477b7610408d5788ee5dd821ee9e4de204cbb72d9c399d858d9deabc3d49914d5d7c2927548160c19bdc7524b1a9f6acc1ec96a8d9848dd
+ checksum: 64b9088b03fdf659b334864ef93bed85d60c17b27fcbd72970f8eb9e0d3266ffa5a1926960f648f2db36b0bafec615f947ea5117d200599a0661b9f0a9cdf323
languageName: node
linkType: hard
-"@babel/generator@npm:^7.18.2, @babel/generator@npm:^7.7.2":
- version: 7.18.2
- resolution: "@babel/generator@npm:7.18.2"
+"@babel/generator@npm:^7.18.9, @babel/generator@npm:^7.7.2":
+ version: 7.18.9
+ resolution: "@babel/generator@npm:7.18.9"
dependencies:
- "@babel/types": ^7.18.2
- "@jridgewell/gen-mapping": ^0.3.0
+ "@babel/types": ^7.18.9
+ "@jridgewell/gen-mapping": ^0.3.2
jsesc: ^2.5.1
- checksum: d0661e95532ddd97566d41fec26355a7b28d1cbc4df95fe80cc084c413342935911b48db20910708db39714844ddd614f61c2ec4cca3fb10181418bdcaa2e7a3
+ checksum: 1c271e0c6f33e59f7845d88a1b0b9b0dce88164e80dec9274a716efa54c260e405e9462b160843e73f45382bf5b24d8e160e0121207e480c29b30e2ed0eb16d4
languageName: node
linkType: hard
-"@babel/helper-compilation-targets@npm:^7.18.2":
- version: 7.18.2
- resolution: "@babel/helper-compilation-targets@npm:7.18.2"
+"@babel/helper-compilation-targets@npm:^7.18.9":
+ version: 7.18.9
+ resolution: "@babel/helper-compilation-targets@npm:7.18.9"
dependencies:
- "@babel/compat-data": ^7.17.10
- "@babel/helper-validator-option": ^7.16.7
+ "@babel/compat-data": ^7.18.8
+ "@babel/helper-validator-option": ^7.18.6
browserslist: ^4.20.2
semver: ^6.3.0
peerDependencies:
"@babel/core": ^7.0.0
- checksum: 4f02e79f20c0b3f8db5049ba8c35027c41ccb3fc7884835d04e49886538e0f55702959db1bb75213c94a5708fec2dc81a443047559a4f184abb884c72c0059b4
+ checksum: 2a9d71e124e098a9f45de4527ddd1982349d231827d341e00da9dfb967e260ecc7662c8b62abee4a010fb34d5f07a8d2155c974e0bc1928144cee5644910621d
languageName: node
linkType: hard
-"@babel/helper-environment-visitor@npm:^7.16.7, @babel/helper-environment-visitor@npm:^7.18.2":
- version: 7.18.2
- resolution: "@babel/helper-environment-visitor@npm:7.18.2"
- checksum: 1a9c8726fad454a082d077952a90f17188e92eabb3de236cb4782c49b39e3f69c327e272b965e9a20ff8abf37d30d03ffa6fd7974625a6c23946f70f7527f5e9
+"@babel/helper-environment-visitor@npm:^7.18.9":
+ version: 7.18.9
+ resolution: "@babel/helper-environment-visitor@npm:7.18.9"
+ checksum: b25101f6162ddca2d12da73942c08ad203d7668e06663df685634a8fde54a98bc015f6f62938e8554457a592a024108d45b8f3e651fd6dcdb877275b73cc4420
languageName: node
linkType: hard
-"@babel/helper-function-name@npm:^7.17.9":
- version: 7.17.9
- resolution: "@babel/helper-function-name@npm:7.17.9"
+"@babel/helper-function-name@npm:^7.18.9":
+ version: 7.18.9
+ resolution: "@babel/helper-function-name@npm:7.18.9"
dependencies:
- "@babel/template": ^7.16.7
- "@babel/types": ^7.17.0
- checksum: a59b2e5af56d8f43b9b0019939a43774754beb7cb01a211809ca8031c71890999d07739e955343135ec566c4d8ff725435f1f60fb0af3bb546837c1f9f84f496
+ "@babel/template": ^7.18.6
+ "@babel/types": ^7.18.9
+ checksum: d04c44e0272f887c0c868651be7fc3c5690531bea10936f00d4cca3f6d5db65e76dfb49e8d553c42ae1fe1eba61ccce9f3d93ba2df50a66408c8d4c3cc61cf0c
languageName: node
linkType: hard
-"@babel/helper-hoist-variables@npm:^7.16.7":
- version: 7.16.7
- resolution: "@babel/helper-hoist-variables@npm:7.16.7"
+"@babel/helper-hoist-variables@npm:^7.18.6":
+ version: 7.18.6
+ resolution: "@babel/helper-hoist-variables@npm:7.18.6"
dependencies:
- "@babel/types": ^7.16.7
- checksum: 6ae1641f4a751cd9045346e3f61c3d9ec1312fd779ab6d6fecfe2a96e59a481ad5d7e40d2a840894c13b3fd6114345b157f9e3062fc5f1580f284636e722de60
+ "@babel/types": ^7.18.6
+ checksum: fd9c35bb435fda802bf9ff7b6f2df06308a21277c6dec2120a35b09f9de68f68a33972e2c15505c1a1a04b36ec64c9ace97d4a9e26d6097b76b4396b7c5fa20f
languageName: node
linkType: hard
-"@babel/helper-module-imports@npm:^7.16.7":
- version: 7.16.7
- resolution: "@babel/helper-module-imports@npm:7.16.7"
+"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.18.6":
+ version: 7.18.6
+ resolution: "@babel/helper-module-imports@npm:7.18.6"
dependencies:
- "@babel/types": ^7.16.7
- checksum: ddd2c4a600a2e9a4fee192ab92bf35a627c5461dbab4af31b903d9ba4d6b6e59e0ff3499fde4e2e9a0eebe24906f00b636f8b4d9bd72ff24d50e6618215c3212
+ "@babel/types": ^7.18.6
+ checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def
languageName: node
linkType: hard
-"@babel/helper-module-transforms@npm:^7.18.0":
- version: 7.18.0
- resolution: "@babel/helper-module-transforms@npm:7.18.0"
+"@babel/helper-module-transforms@npm:^7.18.9":
+ version: 7.18.9
+ resolution: "@babel/helper-module-transforms@npm:7.18.9"
dependencies:
- "@babel/helper-environment-visitor": ^7.16.7
- "@babel/helper-module-imports": ^7.16.7
- "@babel/helper-simple-access": ^7.17.7
- "@babel/helper-split-export-declaration": ^7.16.7
- "@babel/helper-validator-identifier": ^7.16.7
- "@babel/template": ^7.16.7
- "@babel/traverse": ^7.18.0
- "@babel/types": ^7.18.0
- checksum: 824c3967c08d75bb36adc18c31dcafebcd495b75b723e2e17c6185e88daf5c6db62a6a75d9f791b5f38618a349e7cb32503e715a1b9a4e8bad4d0f43e3e6b523
+ "@babel/helper-environment-visitor": ^7.18.9
+ "@babel/helper-module-imports": ^7.18.6
+ "@babel/helper-simple-access": ^7.18.6
+ "@babel/helper-split-export-declaration": ^7.18.6
+ "@babel/helper-validator-identifier": ^7.18.6
+ "@babel/template": ^7.18.6
+ "@babel/traverse": ^7.18.9
+ "@babel/types": ^7.18.9
+ checksum: af08c60ea239ff3d40eda542fceaab69de17e713f131e80ead08c975ba7a47dd55d439cb48cfb14ae7ec96704a10c989ff5a5240e52a39101cb44a49467ce058
languageName: node
linkType: hard
-"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.17.12, @babel/helper-plugin-utils@npm:^7.8.0":
- version: 7.17.12
- resolution: "@babel/helper-plugin-utils@npm:7.17.12"
- checksum: 4813cf0ddb0f143de032cb88d4207024a2334951db330f8216d6fa253ea320c02c9b2667429ef1a34b5e95d4cfbd085f6cb72d418999751c31d0baf2422cc61d
+"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.8.0":
+ version: 7.18.9
+ resolution: "@babel/helper-plugin-utils@npm:7.18.9"
+ checksum: ebae876cd60f1fe238c7210986093845fa5c4cad5feeda843ea4d780bf068256717650376d3af2a5e760f2ed6a35c065ae144f99c47da3e54aa6cba99d8804e0
languageName: node
linkType: hard
-"@babel/helper-simple-access@npm:^7.17.7":
- version: 7.18.2
- resolution: "@babel/helper-simple-access@npm:7.18.2"
+"@babel/helper-simple-access@npm:^7.18.6":
+ version: 7.18.6
+ resolution: "@babel/helper-simple-access@npm:7.18.6"
dependencies:
- "@babel/types": ^7.18.2
- checksum: c0862b56db7e120754d89273a039b128c27517389f6a4425ff24e49779791e8fe10061579171fb986be81fa076778acb847c709f6f5e396278d9c5e01360c375
+ "@babel/types": ^7.18.6
+ checksum: 37cd36eef199e0517845763c1e6ff6ea5e7876d6d707a6f59c9267c547a50aa0e84260ba9285d49acfaf2cfa0a74a772d92967f32ac1024c961517d40b6c16a5
languageName: node
linkType: hard
-"@babel/helper-split-export-declaration@npm:^7.16.7":
- version: 7.16.7
- resolution: "@babel/helper-split-export-declaration@npm:7.16.7"
+"@babel/helper-split-export-declaration@npm:^7.18.6":
+ version: 7.18.6
+ resolution: "@babel/helper-split-export-declaration@npm:7.18.6"
dependencies:
- "@babel/types": ^7.16.7
- checksum: e10aaf135465c55114627951b79115f24bc7af72ecbb58d541d66daf1edaee5dde7cae3ec8c3639afaf74526c03ae3ce723444e3b5b3dc77140c456cd84bcaa1
+ "@babel/types": ^7.18.6
+ checksum: c6d3dede53878f6be1d869e03e9ffbbb36f4897c7cc1527dc96c56d127d834ffe4520a6f7e467f5b6f3c2843ea0e81a7819d66ae02f707f6ac057f3d57943a2b
languageName: node
linkType: hard
-"@babel/helper-validator-identifier@npm:^7.16.7":
- version: 7.16.7
- resolution: "@babel/helper-validator-identifier@npm:7.16.7"
- checksum: dbb3db9d184343152520a209b5684f5e0ed416109cde82b428ca9c759c29b10c7450657785a8b5c5256aa74acc6da491c1f0cf6b784939f7931ef82982051b69
+"@babel/helper-validator-identifier@npm:^7.18.6":
+ version: 7.18.6
+ resolution: "@babel/helper-validator-identifier@npm:7.18.6"
+ checksum: e295254d616bbe26e48c196a198476ab4d42a73b90478c9842536cf910ead887f5af6b5c4df544d3052a25ccb3614866fa808dc1e3a5a4291acd444e243c0648
languageName: node
linkType: hard
-"@babel/helper-validator-option@npm:^7.16.7":
- version: 7.16.7
- resolution: "@babel/helper-validator-option@npm:7.16.7"
- checksum: c5ccc451911883cc9f12125d47be69434f28094475c1b9d2ada7c3452e6ac98a1ee8ddd364ca9e3f9855fcdee96cdeafa32543ebd9d17fee7a1062c202e80570
+"@babel/helper-validator-option@npm:^7.18.6":
+ version: 7.18.6
+ resolution: "@babel/helper-validator-option@npm:7.18.6"
+ checksum: f9cc6eb7cc5d759c5abf006402180f8d5e4251e9198197428a97e05d65eb2f8ae5a0ce73b1dfd2d35af41d0eb780627a64edf98a4e71f064eeeacef8de58f2cf
languageName: node
linkType: hard
-"@babel/helpers@npm:^7.18.2":
- version: 7.18.2
- resolution: "@babel/helpers@npm:7.18.2"
+"@babel/helpers@npm:^7.18.9":
+ version: 7.18.9
+ resolution: "@babel/helpers@npm:7.18.9"
dependencies:
- "@babel/template": ^7.16.7
- "@babel/traverse": ^7.18.2
- "@babel/types": ^7.18.2
- checksum: 94620242f23f6d5f9b83a02b1aa1632ffb05b0815e1bb53d3b46d64aa8e771066bba1db8bd267d9091fb00134cfaeda6a8d69d1d4cc2c89658631adfa077ae70
+ "@babel/template": ^7.18.6
+ "@babel/traverse": ^7.18.9
+ "@babel/types": ^7.18.9
+ checksum: d0bd8255d36bfc65dc52ce75f7fea778c70287da2d64981db4c84fbdf9581409ecbd6433deff1c81da3a5acf26d7e4c364b3a4445efacf88f4f48e77c5b34d8d
languageName: node
linkType: hard
-"@babel/highlight@npm:^7.16.7":
- version: 7.17.12
- resolution: "@babel/highlight@npm:7.17.12"
+"@babel/highlight@npm:^7.18.6":
+ version: 7.18.6
+ resolution: "@babel/highlight@npm:7.18.6"
dependencies:
- "@babel/helper-validator-identifier": ^7.16.7
+ "@babel/helper-validator-identifier": ^7.18.6
chalk: ^2.0.0
js-tokens: ^4.0.0
- checksum: 841a11aa353113bcce662b47085085a379251bf8b09054e37e1e082da1bf0d59355a556192a6b5e9ee98e8ee6f1f2831ac42510633c5e7043e3744dda2d6b9d6
+ checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789
languageName: node
linkType: hard
-"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.7, @babel/parser@npm:^7.18.0":
- version: 7.18.3
- resolution: "@babel/parser@npm:7.18.3"
+"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.6, @babel/parser@npm:^7.18.9":
+ version: 7.18.9
+ resolution: "@babel/parser@npm:7.18.9"
bin:
parser: ./bin/babel-parser.js
- checksum: 6894b3266f84b6c6b52bf09e7f61526efc35d8afa72ff0ad9aecb27a4b6de02d1ebc7f61fc3ae7c0fd8ecb5ac17083d1f27c1b3176e5eac41131d7160a9a7d88
+ checksum: 81a966b334e3ef397e883c64026265a5ae0ad435a86f52a84f60a5ee1efc0738c1f42c55e0dc5f191cc6a83ba0c61350433eee417bf1dff160ca5f3cfde244c6
languageName: node
linkType: hard
@@ -255,6 +255,17 @@ __metadata:
languageName: node
linkType: hard
+"@babel/plugin-syntax-jsx@npm:^7.17.12":
+ version: 7.18.6
+ resolution: "@babel/plugin-syntax-jsx@npm:7.18.6"
+ dependencies:
+ "@babel/helper-plugin-utils": ^7.18.6
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 6d37ea972970195f1ffe1a54745ce2ae456e0ac6145fae9aa1480f297248b262ea6ebb93010eddb86ebfacb94f57c05a1fc5d232b9a67325b09060299d515c67
+ languageName: node
+ linkType: hard
+
"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3":
version: 7.10.4
resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4"
@@ -333,36 +344,27 @@ __metadata:
linkType: hard
"@babel/plugin-syntax-typescript@npm:^7.7.2":
- version: 7.17.12
- resolution: "@babel/plugin-syntax-typescript@npm:7.17.12"
+ version: 7.18.6
+ resolution: "@babel/plugin-syntax-typescript@npm:7.18.6"
dependencies:
- "@babel/helper-plugin-utils": ^7.17.12
+ "@babel/helper-plugin-utils": ^7.18.6
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 50ab09f1953a2b0586cff9e29bf7cea3d886b48c1361a861687c2aef46356c6d73778c3341b0c051dc82a34417f19e9d759ae918353c5a98d25e85f2f6d24181
+ checksum: 2cde73725ec51118ebf410bf02d78781c03fa4d3185993fcc9d253b97443381b621c44810084c5dd68b92eb8bdfae0e5b163e91b32bebbb33852383d1815c05d
languageName: node
linkType: hard
"@babel/runtime-corejs3@npm:^7.10.2":
- version: 7.18.3
- resolution: "@babel/runtime-corejs3@npm:7.18.3"
+ version: 7.18.9
+ resolution: "@babel/runtime-corejs3@npm:7.18.9"
dependencies:
core-js-pure: ^3.20.2
regenerator-runtime: ^0.13.4
- checksum: 50319e107e4c3dc6662404daf1079ab1ecd1cb232577bf50e645c5051fa8977f6ce48a44aa1d158ce2beaec76a43df4fc404999bf4f03c66719c3f8b8fe50a4e
+ checksum: 249158b660ac996fa4f4b0d1ab5810db060af40fac4d0bb5da23f55539a151313ae254aa64afc2ab7000d95167824e21a689f74bc24b36fd0f5ca030d522133d
languageName: node
linkType: hard
-"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7":
- version: 7.18.3
- resolution: "@babel/runtime@npm:7.18.3"
- dependencies:
- regenerator-runtime: ^0.13.4
- checksum: db8526226aa02cfa35a5a7ac1a34b5f303c62a1f000c7db48cb06c6290e616483e5036ab3c4e7a84d0f3be6d4e2148d5fe5cec9564bf955f505c3e764b83d7f1
- languageName: node
- linkType: hard
-
-"@babel/runtime@npm:^7.18.9":
+"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7":
version: 7.18.9
resolution: "@babel/runtime@npm:7.18.9"
dependencies:
@@ -371,42 +373,42 @@ __metadata:
languageName: node
linkType: hard
-"@babel/template@npm:^7.16.7, @babel/template@npm:^7.3.3":
- version: 7.16.7
- resolution: "@babel/template@npm:7.16.7"
+"@babel/template@npm:^7.18.6, @babel/template@npm:^7.3.3":
+ version: 7.18.6
+ resolution: "@babel/template@npm:7.18.6"
dependencies:
- "@babel/code-frame": ^7.16.7
- "@babel/parser": ^7.16.7
- "@babel/types": ^7.16.7
- checksum: 10cd112e89276e00f8b11b55a51c8b2f1262c318283a980f4d6cdb0286dc05734b9aaeeb9f3ad3311900b09bc913e02343fcaa9d4a4f413964aaab04eb84ac4a
+ "@babel/code-frame": ^7.18.6
+ "@babel/parser": ^7.18.6
+ "@babel/types": ^7.18.6
+ checksum: cb02ed804b7b1938dbecef4e01562013b80681843dd391933315b3dd9880820def3b5b1bff6320d6e4c6a1d63d1d5799630d658ec6b0369c5505e7e4029c38fb
languageName: node
linkType: hard
-"@babel/traverse@npm:^7.18.0, @babel/traverse@npm:^7.18.2, @babel/traverse@npm:^7.7.2":
- version: 7.18.2
- resolution: "@babel/traverse@npm:7.18.2"
+"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.7.2":
+ version: 7.18.9
+ resolution: "@babel/traverse@npm:7.18.9"
dependencies:
- "@babel/code-frame": ^7.16.7
- "@babel/generator": ^7.18.2
- "@babel/helper-environment-visitor": ^7.18.2
- "@babel/helper-function-name": ^7.17.9
- "@babel/helper-hoist-variables": ^7.16.7
- "@babel/helper-split-export-declaration": ^7.16.7
- "@babel/parser": ^7.18.0
- "@babel/types": ^7.18.2
+ "@babel/code-frame": ^7.18.6
+ "@babel/generator": ^7.18.9
+ "@babel/helper-environment-visitor": ^7.18.9
+ "@babel/helper-function-name": ^7.18.9
+ "@babel/helper-hoist-variables": ^7.18.6
+ "@babel/helper-split-export-declaration": ^7.18.6
+ "@babel/parser": ^7.18.9
+ "@babel/types": ^7.18.9
debug: ^4.1.0
globals: ^11.1.0
- checksum: e21c2d550bf610406cf21ef6fbec525cb1d80b9d6d71af67552478a24ee371203cb4025b23b110ae7288a62a874ad5898daad19ad23daa95dfc8ab47a47a092f
+ checksum: 0445a51952ea1664a5719d9b1f8bf04be6f1933bcf54915fecc544c844a5dad2ac56f3b555723bbf741ef680d7fd64f6a5d69cfd08d518a4089c79a734270162
languageName: node
linkType: hard
-"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.7, @babel/types@npm:^7.17.0, @babel/types@npm:^7.18.0, @babel/types@npm:^7.18.2, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3":
- version: 7.18.2
- resolution: "@babel/types@npm:7.18.2"
+"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3":
+ version: 7.18.9
+ resolution: "@babel/types@npm:7.18.9"
dependencies:
- "@babel/helper-validator-identifier": ^7.16.7
+ "@babel/helper-validator-identifier": ^7.18.6
to-fast-properties: ^2.0.0
- checksum: 3750bcb9ef6f36ecf0c1477cf6010cd23f2db5cb93f6771ba84c07c08aa005934532bc81e9067192f85214c43e16731e0e3c244773071879967fd1cd22ba2144
+ checksum: f0e0147267895fd8a5b82133e711ce7ce99941f3ce63647e0e3b00656a7afe48a8aa48edbae27543b701794d2b29a562a08f51f88f41df401abce7c3acc5e13a
languageName: node
linkType: hard
@@ -431,16 +433,7 @@ __metadata:
languageName: node
linkType: hard
-"@ctrl/magnet-link@npm:^3.1.0":
- version: 3.1.0
- resolution: "@ctrl/magnet-link@npm:3.1.0"
- dependencies:
- "@ctrl/ts-base32": ^2.1.1
- checksum: 143b681215d2b5d13691acd4fd546159b31fc49270c287d40e56c2303a55378ba80ab5372fd7688e1256b68908a8dc62bef0ea26897168f440b169efe1d09dcf
- languageName: node
- linkType: hard
-
-"@ctrl/magnet-link@npm:^3.1.1":
+"@ctrl/magnet-link@npm:^3.1.0, @ctrl/magnet-link@npm:^3.1.1":
version: 3.1.1
resolution: "@ctrl/magnet-link@npm:3.1.1"
dependencies:
@@ -501,14 +494,7 @@ __metadata:
languageName: node
linkType: hard
-"@ctrl/url-join@npm:^2.0.0":
- version: 2.0.0
- resolution: "@ctrl/url-join@npm:2.0.0"
- checksum: 0dbee31426c14750cbe4e4f29d48cc557af72d63248d2464245776153e655392c6e1de8d108162df2daeca2649357b323d15b7261e7d254ae7f7d974ec687464
- languageName: node
- linkType: hard
-
-"@ctrl/url-join@npm:^2.0.2":
+"@ctrl/url-join@npm:^2.0.0, @ctrl/url-join@npm:^2.0.2":
version: 2.0.2
resolution: "@ctrl/url-join@npm:2.0.2"
checksum: 12407e934055db8e04987371944e8814a54ed6e60e3206944bf5ba94282edab5ece6e29a9c3744237fcdeba235067f660a99f9068dafc881cffc73a2d4f3544e
@@ -516,13 +502,13 @@ __metadata:
linkType: hard
"@dnd-kit/accessibility@npm:^3.0.0":
- version: 3.0.0
- resolution: "@dnd-kit/accessibility@npm:3.0.0"
+ version: 3.0.1
+ resolution: "@dnd-kit/accessibility@npm:3.0.1"
dependencies:
tslib: ^2.0.0
peerDependencies:
react: ">=16.8.0"
- checksum: feac6afea07ece1568df38973d7a1a1b994782a6df119983250c3849ca2a3818a7bcc67fe4c5d22b0a1cfde866081644d677d2188abed507b3eccc255da79320
+ checksum: 0afc2c0fce9a1c107453620ca0da1778f182d340e74ffbc6e369ef0ac8943cafb929d3a6c0891d9b915aa23b2b92137ff4fad958f43118466586d8129a3359d5
languageName: node
linkType: hard
@@ -564,23 +550,45 @@ __metadata:
languageName: node
linkType: hard
-"@emotion/cache@npm:11.7.1, @emotion/cache@npm:^11.7.1":
- version: 11.7.1
- resolution: "@emotion/cache@npm:11.7.1"
+"@emotion/babel-plugin@npm:^11.10.0":
+ version: 11.10.0
+ resolution: "@emotion/babel-plugin@npm:11.10.0"
dependencies:
- "@emotion/memoize": ^0.7.4
- "@emotion/sheet": ^1.1.0
- "@emotion/utils": ^1.0.0
- "@emotion/weak-memoize": ^0.2.5
+ "@babel/helper-module-imports": ^7.16.7
+ "@babel/plugin-syntax-jsx": ^7.17.12
+ "@babel/runtime": ^7.18.3
+ "@emotion/hash": ^0.9.0
+ "@emotion/memoize": ^0.8.0
+ "@emotion/serialize": ^1.1.0
+ babel-plugin-macros: ^3.1.0
+ convert-source-map: ^1.5.0
+ escape-string-regexp: ^4.0.0
+ find-root: ^1.1.0
+ source-map: ^0.5.7
stylis: 4.0.13
- checksum: cf7aa8fe3bacfdedcda94b53e76a7635e122043439715fcfbf7f1a81340cfe6099a59134481a03ec3e0437466566d18528577d1e6ea92f5b98c372b8b38a8f35
+ peerDependencies:
+ "@babel/core": ^7.0.0
+ checksum: 7f1c615e5e559fd037eab8d08b842cd6c089543f9c8829d22d097f69c5436298ff4fa9e1a2117892ce26a60abc1f57641dd9ccb011096b2e34c5588bf994addc
languageName: node
linkType: hard
-"@emotion/hash@npm:^0.8.0":
- version: 0.8.0
- resolution: "@emotion/hash@npm:0.8.0"
- checksum: 4b35d88a97e67275c1d990c96d3b0450451d089d1508619488fc0acb882cb1ac91e93246d471346ebd1b5402215941ef4162efe5b51534859b39d8b3a0e3ffaa
+"@emotion/cache@npm:^11.10.0":
+ version: 11.10.0
+ resolution: "@emotion/cache@npm:11.10.0"
+ dependencies:
+ "@emotion/memoize": ^0.8.0
+ "@emotion/sheet": ^1.2.0
+ "@emotion/utils": ^1.2.0
+ "@emotion/weak-memoize": ^0.3.0
+ stylis: 4.0.13
+ checksum: 60786e3108c35d3f79bd434119f1b6e34120fccc92f4a129bb67596944b703c3396efa51ed373f0ee3d71de780d78f4d767c264f7d76b073d06d435a2d3c1edf
+ languageName: node
+ linkType: hard
+
+"@emotion/hash@npm:^0.9.0":
+ version: 0.9.0
+ resolution: "@emotion/hash@npm:0.9.0"
+ checksum: b63428f7c8186607acdca5d003700cecf0ded519d0b5c5cc3b3154eafcad6ff433f8361bd2bac8882715b557e6f06945694aeb6ba8b25c6095d7a88570e2e0bb
languageName: node
linkType: hard
@@ -600,23 +608,23 @@ __metadata:
languageName: node
linkType: hard
-"@emotion/memoize@npm:^0.7.4":
- version: 0.7.5
- resolution: "@emotion/memoize@npm:0.7.5"
- checksum: 83da8d4a7649a92c72f960817692bc6be13cc13e107b9f7e878d63766525ed4402881bfeb3cda61145c050281e7e260f114a0a2870515527346f2ef896b915b3
+"@emotion/memoize@npm:^0.8.0":
+ version: 0.8.0
+ resolution: "@emotion/memoize@npm:0.8.0"
+ checksum: c87bb110b829edd8e1c13b90a6bc37cebc39af29c7599a1e66a48e06f9bec43e8e53495ba86278cc52e7589549492c8dfdc81d19f4fdec0cee6ba13d2ad2c928
languageName: node
linkType: hard
-"@emotion/react@npm:11.7.1":
- version: 11.7.1
- resolution: "@emotion/react@npm:11.7.1"
+"@emotion/react@npm:^11.10.0":
+ version: 11.10.0
+ resolution: "@emotion/react@npm:11.10.0"
dependencies:
- "@babel/runtime": ^7.13.10
- "@emotion/cache": ^11.7.1
- "@emotion/serialize": ^1.0.2
- "@emotion/sheet": ^1.1.0
- "@emotion/utils": ^1.0.0
- "@emotion/weak-memoize": ^0.2.5
+ "@babel/runtime": ^7.18.3
+ "@emotion/babel-plugin": ^11.10.0
+ "@emotion/cache": ^11.10.0
+ "@emotion/serialize": ^1.1.0
+ "@emotion/utils": ^1.2.0
+ "@emotion/weak-memoize": ^0.3.0
hoist-non-react-statics: ^3.3.1
peerDependencies:
"@babel/core": ^7.0.0
@@ -626,41 +634,28 @@ __metadata:
optional: true
"@types/react":
optional: true
- checksum: 3392aa71f9c68c16022947959f7f842174e6b075b3baf58e185462411cd9b5a87557109a9225b1abaa2d7200a08b7cb9d7f21aa035f0d36b2c89e19b2a124e02
+ checksum: 6d692e43ff53fd3b87d4a000a9aec2ef080d66a0ebb7d0b9529c46d1e6bc1ac8a27c7dd74c27a8274ec1df1e3c960b78c035fca5d8a901a48eda445c6163b33b
languageName: node
linkType: hard
-"@emotion/serialize@npm:1.0.2":
- version: 1.0.2
- resolution: "@emotion/serialize@npm:1.0.2"
+"@emotion/serialize@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "@emotion/serialize@npm:1.1.0"
dependencies:
- "@emotion/hash": ^0.8.0
- "@emotion/memoize": ^0.7.4
- "@emotion/unitless": ^0.7.5
- "@emotion/utils": ^1.0.0
+ "@emotion/hash": ^0.9.0
+ "@emotion/memoize": ^0.8.0
+ "@emotion/unitless": ^0.8.0
+ "@emotion/utils": ^1.2.0
csstype: ^3.0.2
- checksum: ff84fbe09ec06e7ad3deaef5c5b5ea6af6a522e8efe49c2b398b875d06872626284a83b6b18b7f777750c94264a61e7924157d869d9bca2f675731bbb91a6055
+ checksum: 8f22f83194ad76cb3bbee481daa57fdc65ca3078a5db9e219c04151341ef93af80c7057aea17b64446682d275918f7ecc0c20e977c1af153c79a1485503fe717
languageName: node
linkType: hard
-"@emotion/serialize@npm:^1.0.2":
- version: 1.0.3
- resolution: "@emotion/serialize@npm:1.0.3"
+"@emotion/server@npm:^11.10.0":
+ version: 11.10.0
+ resolution: "@emotion/server@npm:11.10.0"
dependencies:
- "@emotion/hash": ^0.8.0
- "@emotion/memoize": ^0.7.4
- "@emotion/unitless": ^0.7.5
- "@emotion/utils": ^1.0.0
- csstype: ^3.0.2
- checksum: 99a9053bd98c99d63af542ebee029281eeaf653e3a12e97ee79bad7330c68408104c30be6fc07a528e38bb69aba680655181744b76ec6c6f459c121cb805fac2
- languageName: node
- linkType: hard
-
-"@emotion/server@npm:11.4.0":
- version: 11.4.0
- resolution: "@emotion/server@npm:11.4.0"
- dependencies:
- "@emotion/utils": ^1.0.0
+ "@emotion/utils": ^1.2.0
html-tokenize: ^2.0.0
multipipe: ^1.0.2
through: ^2.3.8
@@ -669,42 +664,35 @@ __metadata:
peerDependenciesMeta:
"@emotion/css":
optional: true
- checksum: 41ed2472c3b16e5f28126fed755098d1cc2f189096fa830b98583558d93d153e5b0ced8bd1a7514803f1c29ad218a5cd75dc6a348efcd44167a4cdd11887b2f2
+ checksum: 15b7135a578630e36f551b8856d658a50876fb62fe042819ad57895adaf45b79e2d21b3464f1874319f48b5f6209ce09dd387ce1df6aea6f98a20c43a78221b2
languageName: node
linkType: hard
-"@emotion/sheet@npm:^1.1.0":
- version: 1.1.0
- resolution: "@emotion/sheet@npm:1.1.0"
- checksum: a4b74e16a8fea1157413efe4904f5f679d724323cb605d66d20a0b98744422f5d411fca927ceb52e4de454a0a819c5273ca9496db9f011b4ecd17b9f1b212007
+"@emotion/sheet@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "@emotion/sheet@npm:1.2.0"
+ checksum: b3771e47963d36c179f9a1119055d7e5d18e2718e73ebe2b4b1c56f4bbf4ea6b12c50bbc52cd502f03f7981beb2fbb3fee2638b6f5ef6c5f223b06f8bf88ec7b
languageName: node
linkType: hard
-"@emotion/unitless@npm:^0.7.5":
- version: 0.7.5
- resolution: "@emotion/unitless@npm:0.7.5"
- checksum: f976e5345b53fae9414a7b2e7a949aa6b52f8bdbcc84458b1ddc0729e77ba1d1dfdff9960e0da60183877873d3a631fa24d9695dd714ed94bcd3ba5196586a6b
+"@emotion/unitless@npm:^0.8.0":
+ version: 0.8.0
+ resolution: "@emotion/unitless@npm:0.8.0"
+ checksum: 176141117ed23c0eb6e53a054a69c63e17ae532ec4210907a20b2208f91771821835f1c63dd2ec63e30e22fcc984026d7f933773ee6526dd038e0850919fae7a
languageName: node
linkType: hard
-"@emotion/utils@npm:1.0.0":
- version: 1.0.0
- resolution: "@emotion/utils@npm:1.0.0"
- checksum: 3ce8048441a915447d9ef51eb6d1d4cbcce8c8d1647bc7a23333ce2fb2249e74cf9471670d6f49a716e93ff633c9e7a6633517698e17391aebfc40c9d0cabcc0
+"@emotion/utils@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "@emotion/utils@npm:1.2.0"
+ checksum: 55457a49ddd4db6a014ea0454dc09eaa23eedfb837095c8ff90470cb26a303f7ceb5fcc1e2190ef64683e64cfd33d3ba3ca3109cd87d12bc9e379e4195c9a4dd
languageName: node
linkType: hard
-"@emotion/utils@npm:^1.0.0":
- version: 1.1.0
- resolution: "@emotion/utils@npm:1.1.0"
- checksum: d3b681ca3a23b07033ac6c6937e71010a5549ac8ccec325eb6c91a7e48d9a73db83fa5dadc58be981bb125d7c00fedca868ea4362b1da9e02866615f96be4df1
- languageName: node
- linkType: hard
-
-"@emotion/weak-memoize@npm:^0.2.5":
- version: 0.2.5
- resolution: "@emotion/weak-memoize@npm:0.2.5"
- checksum: 27d402b0c683b94658220b6d47840346ee582329ca2a15ec9c233492e0f1a27687ccb233b76eedc922f2e185e444cc89f7b97a81a1d3e5ae9f075bab08e965ea
+"@emotion/weak-memoize@npm:^0.3.0":
+ version: 0.3.0
+ resolution: "@emotion/weak-memoize@npm:0.3.0"
+ checksum: f43ef4c8b7de70d9fa5eb3105921724651e4188e895beb71f0c5919dc899a7b8743e1fdd99d38b9092dd5722c7be2312ebb47fbdad0c4e38bea58f6df5885cc0
languageName: node
linkType: hard
@@ -725,6 +713,49 @@ __metadata:
languageName: node
linkType: hard
+"@floating-ui/core@npm:^0.7.3":
+ version: 0.7.3
+ resolution: "@floating-ui/core@npm:0.7.3"
+ checksum: f48f9fb0d19dcbe7a68c38e8de7fabb11f0c0e6e0ef215ae60b5004900bacb1386e7b89cb377d91a90ff7d147ea1f06c2905136ecf34dea162d9696d8f448d5f
+ languageName: node
+ linkType: hard
+
+"@floating-ui/dom@npm:^0.5.3":
+ version: 0.5.4
+ resolution: "@floating-ui/dom@npm:0.5.4"
+ dependencies:
+ "@floating-ui/core": ^0.7.3
+ checksum: 9f9d8a51a828c6be5f187204aa6d293c6c9ef70d51dcc5891a4d85683745fceebf79ff8826d0f75ae41b45c3b138367d339756f27f41be87a8770742ebc0de42
+ languageName: node
+ linkType: hard
+
+"@floating-ui/react-dom-interactions@npm:0.6.6":
+ version: 0.6.6
+ resolution: "@floating-ui/react-dom-interactions@npm:0.6.6"
+ dependencies:
+ "@floating-ui/react-dom": ^0.7.2
+ aria-hidden: ^1.1.3
+ use-isomorphic-layout-effect: ^1.1.1
+ peerDependencies:
+ react: ">=16.8.0"
+ react-dom: ">=16.8.0"
+ checksum: 3c6cf848c0d9cee6a4f68817a2b32a9addf6f3057f9f120e4d537efe1d2935cdf8a368d9b599b49b97c8cbcf9f25c8da1683f41c563754dd5eca47b622a74cc5
+ languageName: node
+ linkType: hard
+
+"@floating-ui/react-dom@npm:^0.7.2":
+ version: 0.7.2
+ resolution: "@floating-ui/react-dom@npm:0.7.2"
+ dependencies:
+ "@floating-ui/dom": ^0.5.3
+ use-isomorphic-layout-effect: ^1.1.1
+ peerDependencies:
+ react: ">=16.8.0"
+ react-dom: ">=16.8.0"
+ checksum: bc3f2b5557f87f6f4bbccfe3e8d097abafad61a41083d3b79f3499f27590e273bcb3dc7136c2444841ee7a8c0d2a70cc1385458c16103fa8b70eade80c24af52
+ languageName: node
+ linkType: hard
+
"@gar/promisify@npm:^1.1.3":
version: 1.1.3
resolution: "@gar/promisify@npm:1.1.3"
@@ -1011,39 +1042,39 @@ __metadata:
languageName: node
linkType: hard
-"@jridgewell/gen-mapping@npm:^0.3.0":
- version: 0.3.1
- resolution: "@jridgewell/gen-mapping@npm:0.3.1"
+"@jridgewell/gen-mapping@npm:^0.3.2":
+ version: 0.3.2
+ resolution: "@jridgewell/gen-mapping@npm:0.3.2"
dependencies:
- "@jridgewell/set-array": ^1.0.0
+ "@jridgewell/set-array": ^1.0.1
"@jridgewell/sourcemap-codec": ^1.4.10
"@jridgewell/trace-mapping": ^0.3.9
- checksum: e9e7bb3335dea9e60872089761d4e8e089597360cdb1af90370e9d53b7d67232c1e0a3ab65fbfef4fc785745193fbc56bff9f3a6cab6c6ce3f15e12b4191f86b
+ checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882
languageName: node
linkType: hard
"@jridgewell/resolve-uri@npm:^3.0.3":
- version: 3.0.7
- resolution: "@jridgewell/resolve-uri@npm:3.0.7"
- checksum: 94f454f4cef8f0acaad85745fd3ca6cd0d62ef731cf9f952ecb89b8b2ce5e20998cd52be31311cedc5fa5b28b1708a15f3ad9df0fe1447ee4f42959b036c4b5b
+ version: 3.1.0
+ resolution: "@jridgewell/resolve-uri@npm:3.1.0"
+ checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267
languageName: node
linkType: hard
-"@jridgewell/set-array@npm:^1.0.0":
- version: 1.1.1
- resolution: "@jridgewell/set-array@npm:1.1.1"
- checksum: cc5d91e0381c347e3edee4ca90b3c292df9e6e55f29acbe0dd97de8651b4730e9ab761406fd572effa79972a0edc55647b627f8c72315e276d959508853d9bf2
+"@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1":
+ version: 1.1.2
+ resolution: "@jridgewell/set-array@npm:1.1.2"
+ checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e
languageName: node
linkType: hard
"@jridgewell/sourcemap-codec@npm:^1.4.10":
- version: 1.4.13
- resolution: "@jridgewell/sourcemap-codec@npm:1.4.13"
- checksum: f14449096f60a5f921262322fef65ce0bbbfb778080b3b20212080bcefdeba621c43a58c27065bd536ecb4cc767b18eb9c45f15b6b98a4970139572b60603a1c
+ version: 1.4.14
+ resolution: "@jridgewell/sourcemap-codec@npm:1.4.14"
+ checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97
languageName: node
linkType: hard
-"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13":
+"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13, @jridgewell/trace-mapping@npm:^0.3.9":
version: 0.3.14
resolution: "@jridgewell/trace-mapping@npm:0.3.14"
dependencies:
@@ -1053,151 +1084,189 @@ __metadata:
languageName: node
linkType: hard
-"@jridgewell/trace-mapping@npm:^0.3.9":
- version: 0.3.13
- resolution: "@jridgewell/trace-mapping@npm:0.3.13"
+"@mantine/carousel@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/carousel@npm:5.1.0"
dependencies:
- "@jridgewell/resolve-uri": ^3.0.3
- "@jridgewell/sourcemap-codec": ^1.4.10
- checksum: e38254e830472248ca10a6ed1ae75af5e8514f0680245a5e7b53bc3c030fd8691d4d3115d80595b45d3badead68269769ed47ecbbdd67db1343a11f05700e75a
+ "@mantine/utils": 5.1.0
+ peerDependencies:
+ "@mantine/core": 5.1.0
+ "@mantine/hooks": 5.1.0
+ embla-carousel-react: 7.0.0
+ react: ">=16.8.0"
+ checksum: 0aa6beda2c1c406ea1cf07ece919999a7591b838579c1a0b90f88d1491d75f0871418deb700976791e14d870543f7594ea28569af13b330444ed8c810ab47ac3
languageName: node
linkType: hard
-"@mantine/core@npm:^4.2.12":
- version: 4.2.12
- resolution: "@mantine/core@npm:4.2.12"
+"@mantine/core@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/core@npm:5.1.0"
dependencies:
- "@mantine/styles": 4.2.12
- "@popperjs/core": ^2.9.3
- "@radix-ui/react-scroll-area": ^0.1.1
- react-popper: ^2.2.5
- react-textarea-autosize: ^8.3.2
+ "@floating-ui/react-dom-interactions": 0.6.6
+ "@mantine/styles": 5.1.0
+ "@mantine/utils": 5.1.0
+ "@radix-ui/react-scroll-area": 1.0.0
+ react-textarea-autosize: 8.3.4
peerDependencies:
- "@mantine/hooks": 4.2.12
+ "@mantine/hooks": 5.1.0
react: ">=16.8.0"
react-dom: ">=16.8.0"
- checksum: c7656b1249edbd71a27e46dc8921a9e012ea11e4696cc1b8784fca74eca683d3b3817463168f908f221643a1b7ab3d47bbd6292acd1694d23a0f8e23c735fc51
+ checksum: a170d3a97c66fc78ade98a4ec01ff854e998d5af3acca46275c241bb74ed8e3980cdb71e40fed6b9ce1d210d3ec6dfc8bb71cd591b359d10f194dac3faa6f4b9
languageName: node
linkType: hard
-"@mantine/dates@npm:^4.2.12":
- version: 4.2.12
- resolution: "@mantine/dates@npm:4.2.12"
- peerDependencies:
- "@mantine/core": 4.2.12
- "@mantine/hooks": 4.2.12
- dayjs: ^1.10.5
- react: ">=16.8.0"
- checksum: 7257dd9a44aba907f8cf03951791549e50ac32f44cc0b528f0e90702c7a230f2975e48c395b8da4bc8c8912a2fcf176ce8331926578fcf73a2a92cdaba7b47b0
- languageName: node
- linkType: hard
-
-"@mantine/dropzone@npm:^4.2.12":
- version: 4.2.12
- resolution: "@mantine/dropzone@npm:4.2.12"
+"@mantine/dates@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/dates@npm:5.1.0"
dependencies:
- react-dropzone: ^11.4.2
+ "@mantine/utils": 5.1.0
peerDependencies:
- "@mantine/core": 4.2.12
- "@mantine/hooks": 4.2.12
+ "@mantine/core": 5.1.0
+ "@mantine/hooks": 5.1.0
+ dayjs: ">=1.0.0"
+ react: ">=16.8.0"
+ checksum: 0352073ed3f553853f5024f319f170ff22f34317ad6fe4500f847828667763f9a1108b701c60754f159ddab35a91e68a29f60ee4f00f9b43fce6128f8d1d0d10
+ languageName: node
+ linkType: hard
+
+"@mantine/dropzone@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/dropzone@npm:5.1.0"
+ dependencies:
+ "@mantine/utils": 5.1.0
+ react-dropzone: 14.2.1
+ peerDependencies:
+ "@mantine/core": 5.1.0
+ "@mantine/hooks": 5.1.0
react: ">=16.8.0"
react-dom: ">=16.8.0"
- checksum: f0b48f9dc9f61db34741cee05e1234a7319ce2ee174d88bf30468daedee3b6f629ac1469fecd2bd798b28ac825a4d30ebd79b47f59f0b7bd4972f7e0b2b46a4a
+ checksum: 5a9c7fe0db1bf6af845a161c1620fb544fcebd376785abfb77d0e9cf2babef00068a5e8f32c7707f100ccf2f7caf6e75c817ec6d6fa8b5d470ebf749dcbd5624
languageName: node
linkType: hard
-"@mantine/form@npm:^4.2.12":
- version: 4.2.12
- resolution: "@mantine/form@npm:4.2.12"
- peerDependencies:
- react: ">=16.8.0"
- checksum: 851576d75d6a9db737e1a985db60c6eaeb0fcd019fba3eb27e6bce1dfe915fd6dc138d7954c56228e9c6a6f80e4678e507159476f46436537cca9ea2388c1de7
- languageName: node
- linkType: hard
-
-"@mantine/hooks@npm:^4.2.12":
- version: 4.2.12
- resolution: "@mantine/hooks@npm:4.2.12"
- peerDependencies:
- react: ">=16.8.0"
- checksum: 09dbbbf1d90c8a0b0ea02394454af0de9fcc975668a80ff5460161493509d55603f2e39feac2bb46019db673a576617f2ffb111f0373699ad5462e7c2da9bea6
- languageName: node
- linkType: hard
-
-"@mantine/next@npm:^4.2.12":
- version: 4.2.12
- resolution: "@mantine/next@npm:4.2.12"
+"@mantine/form@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/form@npm:5.1.0"
dependencies:
- "@mantine/ssr": 4.2.12
+ fast-deep-equal: ^3.1.3
+ klona: ^2.0.5
+ peerDependencies:
+ react: ">=16.8.0"
+ checksum: 4727e7f8842918aa3adf58030d4f27083bb245661b540f0ad3d14d37fc14d1851e454f5462a78b773e3839aaf535d93ed4d4628782d04d0cb899a900d8e6b70b
+ languageName: node
+ linkType: hard
+
+"@mantine/hooks@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/hooks@npm:5.1.0"
+ peerDependencies:
+ react: ">=16.8.0"
+ checksum: de4c2c1fe408efddeda88c331242c14e6aa44f65a0d78fc9ca2812e07f9593f27dbc593afd4f320bc36e618bbb7d3cbe5869aebe6d7f2a8b9af8f342f1913a5a
+ languageName: node
+ linkType: hard
+
+"@mantine/modals@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/modals@npm:5.1.0"
+ dependencies:
+ "@mantine/utils": 5.1.0
+ peerDependencies:
+ "@mantine/core": 5.1.0
+ "@mantine/hooks": 5.1.0
+ react: ">=16.8.0"
+ react-dom: ">=16.8.0"
+ checksum: ab3d9d78f70b631bec7f0a89d0f4c5275b043fb147ac5db83c7be8ef5d80fa75e9a4560c470f8c888e13c00b1d533c5d8c89eb6c9ce19297c32178044946cb93
+ languageName: node
+ linkType: hard
+
+"@mantine/next@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/next@npm:5.1.0"
+ dependencies:
+ "@mantine/ssr": 5.1.0
+ "@mantine/styles": 5.1.0
peerDependencies:
next: "*"
react: ">=16.8.0"
react-dom: ">=16.8.0"
- checksum: 154c8046ff012cf6738721c37843caf2307b985f0f4766f666b0762dbc811f71bb2db0824b34e2fd35a0dde448be2dd00345c3e01282009d4964f967cbf4a6af
+ checksum: 422f53fa3b18525b2baf95988260782c0b4321fdb6d004f611830b456d492feaa53c40fb5f2ba8f546701ed8b608c8a01ff129d7f76c5dabacb164bf3af20529
languageName: node
linkType: hard
-"@mantine/notifications@npm:^4.2.12":
- version: 4.2.12
- resolution: "@mantine/notifications@npm:4.2.12"
+"@mantine/notifications@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/notifications@npm:5.1.0"
dependencies:
- react-transition-group: ^4.4.2
+ "@mantine/utils": 5.1.0
+ react-transition-group: 4.4.2
peerDependencies:
- "@mantine/core": 4.2.12
- "@mantine/hooks": 4.2.12
+ "@mantine/core": 5.1.0
+ "@mantine/hooks": 5.1.0
react: ">=16.8.0"
react-dom: ">=16.8.0"
- checksum: 72be0b01c09e6d51c565fa9227d9e11342fc5d8e650ba420caca69d066ec425d26c0758e0b2aecee512606fd4eb00d49920fece0341dab239fb271936d0d3a59
+ checksum: 0e86dd8f114b6b971f2ab72ac76e0faf9c592a59893e6ffbd0f22fef14abfe58610fc6bf3526b1258e95591d5b5472b0d7fef455a3caab5bca7b795d0fc4c545
languageName: node
linkType: hard
-"@mantine/prism@npm:^4.2.12":
- version: 4.2.12
- resolution: "@mantine/prism@npm:4.2.12"
+"@mantine/prism@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "@mantine/prism@npm:5.0.0"
dependencies:
+ "@mantine/utils": 5.0.0
prism-react-renderer: ^1.2.1
peerDependencies:
- "@mantine/core": 4.2.12
- "@mantine/hooks": 4.2.12
+ "@mantine/core": 5.0.0
+ "@mantine/hooks": 5.0.0
react: ">=16.8.0"
react-dom: ">=16.8.0"
- checksum: 0904ccf586b3a18fd4c224067ea270c89f4e65dd4fe0b959211c9d72838c3d7bac55296f5065405062a165bcdbab56b9a57d0be56a5dfb5cbb20c2cf4bab273e
+ checksum: 2d0420424b0f0b32bb299cb15a856e97edb941fdc0bfba93508e9ce71e99a50a37a5d24951f48d04d0d10754bd4834d1247345456c2f34876f4fe3e106b773c1
languageName: node
linkType: hard
-"@mantine/ssr@npm:4.2.12":
- version: 4.2.12
- resolution: "@mantine/ssr@npm:4.2.12"
+"@mantine/ssr@npm:5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/ssr@npm:5.1.0"
dependencies:
- "@emotion/cache": 11.7.1
- "@emotion/react": 11.7.1
- "@emotion/serialize": 1.0.2
- "@emotion/server": 11.4.0
- "@emotion/utils": 1.0.0
- "@mantine/styles": 4.2.12
- csstype: 3.0.9
- html-react-parser: 1.3.0
+ "@mantine/styles": 5.1.0
+ html-react-parser: 1.4.12
peerDependencies:
+ "@emotion/react": ">=11.9.0"
+ "@emotion/server": ">=11.4.0"
react: ">=16.8.0"
react-dom: ">=16.8.0"
- checksum: cb182e5695d6bd2f003509b947d8087c7cacbf2b94e73e017450f1fe50ef29f9a117ba9c35b71e17e3f9efada92a9dc9cee8d590e1448b40ceb3f8b11bdb95fd
+ checksum: 1b3f9d81eaccd7a43db21b496b2cb6e5ba019e96e05faf8109577330a54b6eb28b393204c1eb01639bde3c04ae503491b7913e4573806803388ed91947a0bfb0
languageName: node
linkType: hard
-"@mantine/styles@npm:4.2.12":
- version: 4.2.12
- resolution: "@mantine/styles@npm:4.2.12"
+"@mantine/styles@npm:5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/styles@npm:5.1.0"
dependencies:
- "@emotion/cache": 11.7.1
- "@emotion/react": 11.7.1
- "@emotion/serialize": 1.0.2
- "@emotion/utils": 1.0.0
- clsx: ^1.1.1
+ clsx: 1.1.1
csstype: 3.0.9
peerDependencies:
+ "@emotion/react": ">=11.9.0"
react: ">=16.8.0"
react-dom: ">=16.8.0"
- checksum: 8e99c7109e61ca1e3119cec39cac22a7b137964f61822e95c85c6c4e028852b42ace16ad82c94bcd1f3ba52106ae5e3c9b47bd33100eaa99a9e885fec1b1e58e
+ checksum: 9d7dc4d55eeea09f86e205a33051d397da45c06ce213860d4f013b9770dde34256bd8056d76ceceb6993828f864df103b1967b2a9d9b0cbe29d7334ec2c30318
+ languageName: node
+ linkType: hard
+
+"@mantine/utils@npm:5.0.0":
+ version: 5.0.0
+ resolution: "@mantine/utils@npm:5.0.0"
+ peerDependencies:
+ react: ">=16.8.0"
+ checksum: 7d167dd40e02e6f2cb830ede1aad091af7bf9eb42fa1b47a08451286e98d3fa1a88f49a3e179d7969be450f70fc3d02f9851b8655d310499fa6bc431978ed232
+ languageName: node
+ linkType: hard
+
+"@mantine/utils@npm:5.1.0":
+ version: 5.1.0
+ resolution: "@mantine/utils@npm:5.1.0"
+ peerDependencies:
+ react: ">=16.8.0"
+ checksum: f6d2dd28f97d9e2d09eea3db7d1f2e0a82c451bd7a0c80f9a38c421c7003052b822917d4128a055e39c5822c6de61ecb53728aa86ab726bf4dcda911ab47f650
languageName: node
linkType: hard
@@ -1266,118 +1335,111 @@ __metadata:
languageName: node
linkType: hard
-"@next/bundle-analyzer@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/bundle-analyzer@npm:12.2.0"
+"@next/bundle-analyzer@npm:^12.1.4":
+ version: 12.2.3
+ resolution: "@next/bundle-analyzer@npm:12.2.3"
dependencies:
webpack-bundle-analyzer: 4.3.0
- checksum: e08770ed2f7bfa4fb38c29d58d1e3ad198fa7e9a8c061ea5e15950dd10576bed0b5b8c19266e18503af1d211a0d8d450b5fed4926f6863135b38e585d6fd1980
+ checksum: 86745354ac90ac72d203d0d1051114f90cc7de7b2e64ea1f7129621fd1d9fde36fe00901747b4c56708777023b08b936ded1aaafaf40f1709c3ad3a8c04f1f07
languageName: node
linkType: hard
-"@next/env@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/env@npm:12.2.0"
- checksum: 5fb317bdb5eb2d5df12ff55e335368792dba21874c5ece3cabf8cd312cec911a1d54ecf368e69dc08640b0244669b8a98c86cd035c7874b17640602e67c1b9d9
+"@next/env@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/env@npm:12.1.6"
+ checksum: e6a4f189f0d653d13dc7ad510f6c9d2cf690bfd9e07c554bd501b840f8dabc3da5adcab874b0bc01aab86c3647cff4fb84692e3c3b28125af26f0b05cd4c7fcf
languageName: node
linkType: hard
-"@next/eslint-plugin-next@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/eslint-plugin-next@npm:12.2.0"
+"@next/eslint-plugin-next@npm:^12.1.4":
+ version: 12.2.3
+ resolution: "@next/eslint-plugin-next@npm:12.2.3"
dependencies:
glob: 7.1.7
- checksum: 2e33b9af79af680fd873d74e91bed397930a91802c1d7a293db757227ebc431d3d856de69477dc178dec8b531635ea69d79b188293024f1371afe6c348dbe647
+ checksum: aba5344c477b1a3d361159bbb46812a470f23d7e2ab3d7892ab372c3caad33e6e9c3c7abce45597571a52680eefc1ef451aecac67f469f2062ed78f37b80a3e8
languageName: node
linkType: hard
-"@next/swc-android-arm-eabi@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-android-arm-eabi@npm:12.2.0"
+"@next/swc-android-arm-eabi@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-android-arm-eabi@npm:12.1.6"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
-"@next/swc-android-arm64@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-android-arm64@npm:12.2.0"
+"@next/swc-android-arm64@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-android-arm64@npm:12.1.6"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
-"@next/swc-darwin-arm64@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-darwin-arm64@npm:12.2.0"
+"@next/swc-darwin-arm64@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-darwin-arm64@npm:12.1.6"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@next/swc-darwin-x64@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-darwin-x64@npm:12.2.0"
+"@next/swc-darwin-x64@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-darwin-x64@npm:12.1.6"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@next/swc-freebsd-x64@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-freebsd-x64@npm:12.2.0"
- conditions: os=freebsd & cpu=x64
- languageName: node
- linkType: hard
-
-"@next/swc-linux-arm-gnueabihf@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-linux-arm-gnueabihf@npm:12.2.0"
+"@next/swc-linux-arm-gnueabihf@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-linux-arm-gnueabihf@npm:12.1.6"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"@next/swc-linux-arm64-gnu@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-linux-arm64-gnu@npm:12.2.0"
+"@next/swc-linux-arm64-gnu@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-linux-arm64-gnu@npm:12.1.6"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@next/swc-linux-arm64-musl@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-linux-arm64-musl@npm:12.2.0"
+"@next/swc-linux-arm64-musl@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-linux-arm64-musl@npm:12.1.6"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@next/swc-linux-x64-gnu@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-linux-x64-gnu@npm:12.2.0"
+"@next/swc-linux-x64-gnu@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-linux-x64-gnu@npm:12.1.6"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@next/swc-linux-x64-musl@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-linux-x64-musl@npm:12.2.0"
+"@next/swc-linux-x64-musl@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-linux-x64-musl@npm:12.1.6"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@next/swc-win32-arm64-msvc@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-win32-arm64-msvc@npm:12.2.0"
+"@next/swc-win32-arm64-msvc@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-win32-arm64-msvc@npm:12.1.6"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@next/swc-win32-ia32-msvc@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-win32-ia32-msvc@npm:12.2.0"
+"@next/swc-win32-ia32-msvc@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-win32-ia32-msvc@npm:12.1.6"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@next/swc-win32-x64-msvc@npm:12.2.0":
- version: 12.2.0
- resolution: "@next/swc-win32-x64-msvc@npm:12.2.0"
+"@next/swc-win32-x64-msvc@npm:12.1.6":
+ version: 12.1.6
+ resolution: "@next/swc-win32-x64-msvc@npm:12.1.6"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
@@ -1557,12 +1619,12 @@ __metadata:
linkType: hard
"@npmcli/fs@npm:^2.1.0":
- version: 2.1.0
- resolution: "@npmcli/fs@npm:2.1.0"
+ version: 2.1.1
+ resolution: "@npmcli/fs@npm:2.1.1"
dependencies:
"@gar/promisify": ^1.1.3
semver: ^7.3.5
- checksum: 6ec6d678af6da49f9dac50cd882d7f661934dd278972ffbaacde40d9eaa2871292d634000a0cca9510f6fc29855fbd4af433e1adbff90a524ec3eaf140f1219b
+ checksum: 4944a0545d38d3e6e29780eeb3cd4be6059c1e9627509d2c9ced635c53b852d28b37cdc615a2adf815b51ab8673adb6507e370401a20a7e90c8a6dc4fac02389
languageName: node
linkType: hard
@@ -1583,140 +1645,136 @@ __metadata:
languageName: node
linkType: hard
-"@popperjs/core@npm:^2.9.3":
- version: 2.11.5
- resolution: "@popperjs/core@npm:2.11.5"
- checksum: fd7f9dca3fb716d7426332b6ee283f88d2724c0ab342fb678865a640bad403dfb9eeebd8204a406986162f7e2b33394f104320008b74d0e9066d7322f70ea35d
- languageName: node
- linkType: hard
-
-"@radix-ui/number@npm:0.1.0":
- version: 0.1.0
- resolution: "@radix-ui/number@npm:0.1.0"
+"@radix-ui/number@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/number@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
- checksum: 6d4efbf9158c1b1d18861da9c232e27a67ed496e46ab621521cc076952f1b93e6c56121e9b597e2e245b77dea294f0b1f79cd2ea1467d8361ba51334b00ffb1f
+ checksum: 517ac0790e05cceb41401154d1bc55d4738accd51095e2a918ef9bcedac6a455cd7179201e88e76121bedec19cd93a37b2c20288b084fb224b69c74e67935457
languageName: node
linkType: hard
-"@radix-ui/primitive@npm:0.1.0":
- version: 0.1.0
- resolution: "@radix-ui/primitive@npm:0.1.0"
+"@radix-ui/primitive@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/primitive@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
- checksum: 5f721bcfebb2482fc2d034d2782219f4b1035977d3a1bd854719ff07c82fb545083ff1247a987ea0218109c5801375724f60910b0c71f7bb78ea0ab21b2bcb26
+ checksum: 72996afaf346ec4f4c73422f14f6cb2d0de994801ba7cbb9a4a67b0050e0cd74625182c349ef8017ccae1406579d4b74a34a225ef2efe61e8e5337decf235deb
languageName: node
linkType: hard
-"@radix-ui/react-compose-refs@npm:0.1.0":
- version: 0.1.0
- resolution: "@radix-ui/react-compose-refs@npm:0.1.0"
+"@radix-ui/react-compose-refs@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/react-compose-refs@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
peerDependencies:
- react: ^16.8 || ^17.0
- checksum: d1455577b2afee141998e847890e8f5ba5cb17aa58ba699f9abe21c7948e2435bbda28f7f7efe825ca200c66bcaf095ff4b93553778d599cba3f611c97cd222e
+ react: ^16.8 || ^17.0 || ^18.0
+ checksum: fb98be2e275a1a758ccac647780ff5b04be8dcf25dcea1592db3b691fecf719c4c0700126da605b2f512dd89caa111352b9fad59528d736b4e0e9a0e134a74a1
languageName: node
linkType: hard
-"@radix-ui/react-context@npm:0.1.1":
- version: 0.1.1
- resolution: "@radix-ui/react-context@npm:0.1.1"
+"@radix-ui/react-context@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/react-context@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
peerDependencies:
- react: ^16.8 || ^17.0
- checksum: 85ed35b6e386706bc3a8d21ff7e2a55d0f452fd8ab89f6c9a6c2e271e390c8788800517589d5606a3bfbcca08741fbcb4b6c695c466a284ae35957d92620c467
+ react: ^16.8 || ^17.0 || ^18.0
+ checksum: 43c6b6f2183398161fe6b109e83fff240a6b7babbb27092b815932342a89d5ca42aa9806bfae5927970eed5ff90feed04c67aa29c6721f84ae826f17fcf34ce0
languageName: node
linkType: hard
-"@radix-ui/react-presence@npm:0.1.2":
- version: 0.1.2
- resolution: "@radix-ui/react-presence@npm:0.1.2"
+"@radix-ui/react-direction@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/react-direction@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
- "@radix-ui/react-compose-refs": 0.1.0
- "@radix-ui/react-use-layout-effect": 0.1.0
peerDependencies:
- react: ">=16.8"
- checksum: 7a189e24a353b30f0b6ee87d0577bdb183dde79a2be8105638e73d28e7538f4f6dd64d205634bdd6100bcfdabab713870e8cdb0f01ae9cd9a44f6650eb9e7ce6
+ react: ^16.8 || ^17.0 || ^18.0
+ checksum: 92a40de4087b161a56957872daf204a7735bd21f2fccbd42deff322d759977d085ad3dcdae05af437b7e64e628e939e0d67e5bc468a3027e1b02e0a7dc90c485
languageName: node
linkType: hard
-"@radix-ui/react-primitive@npm:0.1.4":
- version: 0.1.4
- resolution: "@radix-ui/react-primitive@npm:0.1.4"
+"@radix-ui/react-presence@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/react-presence@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
- "@radix-ui/react-slot": 0.1.2
+ "@radix-ui/react-compose-refs": 1.0.0
+ "@radix-ui/react-use-layout-effect": 1.0.0
peerDependencies:
- react: ^16.8 || ^17.0
- checksum: e7b83dc51565a7a54dfd16296e2aa1639dafe32655e3a3974d29d28497f0e9ec9cdf0ee59bc54a88b2a51eeb307781f01f6fcacb4d6dc84a8e10631ddb6142e5
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ checksum: a607d67795aa265e88f1765dcc7c18bebf6d88d116cb7f529ebe5a3fbbe751a42763aff0c1c89cdd8ce7f7664355936c4070fd3d4685774aff1a80fa95f4665b
languageName: node
linkType: hard
-"@radix-ui/react-scroll-area@npm:^0.1.1":
- version: 0.1.4
- resolution: "@radix-ui/react-scroll-area@npm:0.1.4"
+"@radix-ui/react-primitive@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/react-primitive@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
- "@radix-ui/number": 0.1.0
- "@radix-ui/primitive": 0.1.0
- "@radix-ui/react-compose-refs": 0.1.0
- "@radix-ui/react-context": 0.1.1
- "@radix-ui/react-presence": 0.1.2
- "@radix-ui/react-primitive": 0.1.4
- "@radix-ui/react-use-callback-ref": 0.1.0
- "@radix-ui/react-use-direction": 0.1.0
- "@radix-ui/react-use-layout-effect": 0.1.0
+ "@radix-ui/react-slot": 1.0.0
peerDependencies:
- react: ^16.8 || ^17.0
- checksum: b926e3087f8da8771a5fc1cf6fabaf12c2295d3bc6721625cf27ecfbf08ea1f2e6b056ef6319db026220eca17a85d1e770956efaca6d37e8c6a25006420016d0
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ checksum: fb3fe8c8c5a57995716cce4d7e9039e474c09ba5d714994419ad4940bc954da670f1188813cc931f189b23d9bd5a67adf7087bf44fe1d4272b4a334a3514d38b
languageName: node
linkType: hard
-"@radix-ui/react-slot@npm:0.1.2":
- version: 0.1.2
- resolution: "@radix-ui/react-slot@npm:0.1.2"
+"@radix-ui/react-scroll-area@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/react-scroll-area@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
- "@radix-ui/react-compose-refs": 0.1.0
+ "@radix-ui/number": 1.0.0
+ "@radix-ui/primitive": 1.0.0
+ "@radix-ui/react-compose-refs": 1.0.0
+ "@radix-ui/react-context": 1.0.0
+ "@radix-ui/react-direction": 1.0.0
+ "@radix-ui/react-presence": 1.0.0
+ "@radix-ui/react-primitive": 1.0.0
+ "@radix-ui/react-use-callback-ref": 1.0.0
+ "@radix-ui/react-use-layout-effect": 1.0.0
peerDependencies:
- react: ^16.8 || ^17.0
- checksum: 216927b9b1dae28328d630f6b2c91f1a424c0b00fb4efcebb7a109fdfc5bceda5cf878dfac5baa8aa441150d4c5263f5a914f2962bbce8375972ae076e4d3b65
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ checksum: 0b7756f1df19ac13c570941461794668d0fb15fd576f37a698a6d0a39f48b728db751455f8de202e5ccb8750c3d9f31a02ada7b79d9f064347aa96e780d8f104
languageName: node
linkType: hard
-"@radix-ui/react-use-callback-ref@npm:0.1.0":
- version: 0.1.0
- resolution: "@radix-ui/react-use-callback-ref@npm:0.1.0"
+"@radix-ui/react-slot@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/react-slot@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
+ "@radix-ui/react-compose-refs": 1.0.0
peerDependencies:
- react: ^16.8 || ^17.0
- checksum: 5356971123d7bbc66a208eca4709483190d0927a6817089f885d4538cd701a174d76830ba36cfaa6336b340415aaefaddc606a575246b0cbcb4b1f2897075203
+ react: ^16.8 || ^17.0 || ^18.0
+ checksum: 60c0190ebdca21785b4f8b58a0c52717600c98953fc49da9580870519c60f52d5cf873dffa05446f4bb539066326ccec0827f4ca252b02ec4ff1a4ae203f59d7
languageName: node
linkType: hard
-"@radix-ui/react-use-direction@npm:0.1.0":
- version: 0.1.0
- resolution: "@radix-ui/react-use-direction@npm:0.1.0"
+"@radix-ui/react-use-callback-ref@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/react-use-callback-ref@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
peerDependencies:
- react: ^16.8 || ^17.0
- checksum: 1553c056656a11a758c5f602b5c50708adaf9b98eb636000d4c5425e3ae539cb6e07ae92471a6f400e7c86549da26780fe413420c7f50a6da9fbf1b21cc044a4
+ react: ^16.8 || ^17.0 || ^18.0
+ checksum: a8dda76ba0a26e23dc6ab5003831ad7439f59ba9d696a517643b9ee6a7fb06b18ae7a8f5a3c00c530d5c8104745a466a077b7475b99b4c0f5c15f5fc29474471
languageName: node
linkType: hard
-"@radix-ui/react-use-layout-effect@npm:0.1.0":
- version: 0.1.0
- resolution: "@radix-ui/react-use-layout-effect@npm:0.1.0"
+"@radix-ui/react-use-layout-effect@npm:1.0.0":
+ version: 1.0.0
+ resolution: "@radix-ui/react-use-layout-effect@npm:1.0.0"
dependencies:
"@babel/runtime": ^7.13.10
peerDependencies:
- react: ^16.8 || ^17.0
- checksum: d8be1f97706dec2dcdf98284ad04a115898338dd34f68d61cf9bfda87d88c694019576313a235202b05be3a56ab6453fcee44d651f6b8a502a0cd2dbde153f49
+ react: ^16.8 || ^17.0 || ^18.0
+ checksum: fcdc8cfa79bd45766ebe3de11039c58abe3fed968cb39c12b2efce5d88013c76fe096ea4cee464d42576d02fe7697779b682b4268459bca3c4e48644f5b4ac5e
languageName: node
linkType: hard
@@ -1818,15 +1876,6 @@ __metadata:
languageName: node
linkType: hard
-"@swc/helpers@npm:0.4.2":
- version: 0.4.2
- resolution: "@swc/helpers@npm:0.4.2"
- dependencies:
- tslib: ^2.4.0
- checksum: 0b8c86ad03b17b8fe57dc4498e25dc294ea6bc42558a6b92d8fcd789351dac80199409bef38a2e3ac06aae0fedddfc0ab9c34409acbf74e55d1bbbd74f68b6b7
- languageName: node
- linkType: hard
-
"@szmarczak/http-timer@npm:^5.0.1":
version: 5.0.1
resolution: "@szmarczak/http-timer@npm:5.0.1"
@@ -1836,9 +1885,9 @@ __metadata:
languageName: node
linkType: hard
-"@tabler/icons@npm:^1.76.0":
- version: 1.76.0
- resolution: "@tabler/icons@npm:1.76.0"
+"@tabler/icons@npm:^1.78.0":
+ version: 1.78.0
+ resolution: "@tabler/icons@npm:1.78.0"
peerDependencies:
react: ^16.x || 17.x || 18.x
react-dom: ^16.x || 17.x || 18.x
@@ -1847,7 +1896,7 @@ __metadata:
optional: true
react-dom:
optional: true
- checksum: 2f00d1f87c2ffda3389583f98a969b38acae2c45d6e048619480bc05e20655a631c820638cfcc1e08cdcbe08983f9f86cda492032cadd070dcae3c9334b1bba1
+ checksum: f3789c4681fc7a3520585522afd8306d18ab3ec49077687b956c837f0d088b5c2a68c1bc90ff44f3369e9a5b3f4b4501f1a50133e8dff93e0947cdd53aceefea
languageName: node
linkType: hard
@@ -2010,23 +2059,30 @@ __metadata:
linkType: hard
"@types/node@npm:*":
- version: 17.0.36
- resolution: "@types/node@npm:17.0.36"
- checksum: 11055fde0a1e1421113849b5e32c7022911efc0be670729947bf0162970e79962d804b1eb8a9afb291380cac97cf0e684511415d586ae5fe1560322c940fe188
+ version: 18.0.6
+ resolution: "@types/node@npm:18.0.6"
+ checksum: 780f8885a6b6eb12f4c0246617747fdc37a451931b3c01ce8148d356c0903b705dcb16cc6a914de63d48b0dc1b002c7a3dfae681f580e1761aa551d3cd996813
+ languageName: node
+ linkType: hard
+
+"@types/node@npm:17.0.1":
+ version: 17.0.1
+ resolution: "@types/node@npm:17.0.1"
+ checksum: 16a5aa2778e1e49443d272f0da20af66c143337ddb14d9f36d5e7eb1e11ebbf195769d3d495ec5456ec94fe3d0e703c5df1ac279a05c7dc2a1220474467c1103
languageName: node
linkType: hard
"@types/node@npm:^16.10.2":
- version: 16.11.36
- resolution: "@types/node@npm:16.11.36"
- checksum: 878e8e2032869785dd4f73dd862042c7eb588fb9a27199f1b493a7029438ccb58f96e203c35c2e66e08307ca3f9767133cae888958c15e031982f7e9719e5e47
+ version: 16.11.45
+ resolution: "@types/node@npm:16.11.45"
+ checksum: 57d61c951024f66d796e71e4a972faef266007398cd4e93a195822fea2d5deb41d0615f394a99ece89772b145ff057321d138c7e3442455dc7d785ff67cebde3
languageName: node
linkType: hard
-"@types/node@npm:^18.0.6":
- version: 18.0.6
- resolution: "@types/node@npm:18.0.6"
- checksum: 780f8885a6b6eb12f4c0246617747fdc37a451931b3c01ce8148d356c0903b705dcb16cc6a914de63d48b0dc1b002c7a3dfae681f580e1761aa551d3cd996813
+"@types/parse-json@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "@types/parse-json@npm:4.0.0"
+ checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b
languageName: node
linkType: hard
@@ -2044,14 +2100,13 @@ __metadata:
languageName: node
linkType: hard
-"@types/react@npm:^18.0.15":
- version: 18.0.15
- resolution: "@types/react@npm:18.0.15"
+"@types/react@npm:17.0.1":
+ version: 17.0.1
+ resolution: "@types/react@npm:17.0.1"
dependencies:
"@types/prop-types": "*"
- "@types/scheduler": "*"
csstype: ^3.0.2
- checksum: e22cc388d1c145aa184787e44dc28db4789976c704cd5db475c170bb76a560eb81def5f346cfe750949bb3d43ad88822b8cbb9f19b1286e3795892a8263e7715
+ checksum: 592d7a33898550f2139e69c1bb21397ab6f351f406623397cd7f9a4aea20140c779dd23f2934789d40b0bd87995a86c766434ba07bdd1de9533045d0f3596b68
languageName: node
linkType: hard
@@ -2064,29 +2119,12 @@ __metadata:
languageName: node
linkType: hard
-"@types/scheduler@npm:*":
- version: 0.16.2
- resolution: "@types/scheduler@npm:0.16.2"
- checksum: b6b4dcfeae6deba2e06a70941860fb1435730576d3689225a421280b7742318d1548b3d22c1f66ab68e414f346a9542f29240bc955b6332c5b11e561077583bc
- languageName: node
- linkType: hard
-
-"@types/ssh2-streams@npm:*":
- version: 0.1.9
- resolution: "@types/ssh2-streams@npm:0.1.9"
- dependencies:
- "@types/node": "*"
- checksum: 190f3c235bf19787cd255f366d3ac9233875750095f3c73d15e72a1e67a826aed7e7c389603c5e89cb6420b87ff6dffc566f9174e546ddb7ff8c8dc2e8b00def
- languageName: node
- linkType: hard
-
"@types/ssh2@npm:*":
- version: 0.5.52
- resolution: "@types/ssh2@npm:0.5.52"
+ version: 1.11.5
+ resolution: "@types/ssh2@npm:1.11.5"
dependencies:
"@types/node": "*"
- "@types/ssh2-streams": "*"
- checksum: bc1c76ac727ad73ddd59ba849cf0ea3ed2e930439e7a363aff24f04f29b74f9b1976369b869dc9a018223c9fb8ad041c09a0f07aea8cf46a8c920049188cddae
+ checksum: ee7caae274e5f8e3c9d96aca94248142d39c9147e47f9700cec43aa9c680c75b66d970941ec34cfc622c00d87a1a983d0d92bb2e4a34b70e8d10213347446496
languageName: node
linkType: hard
@@ -2160,16 +2198,6 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/scope-manager@npm:5.26.0":
- version: 5.26.0
- resolution: "@typescript-eslint/scope-manager@npm:5.26.0"
- dependencies:
- "@typescript-eslint/types": 5.26.0
- "@typescript-eslint/visitor-keys": 5.26.0
- checksum: 56db69b8dc3502261c403c1217f32fb7e8244c1f192c3b486733ad8cd3e7672b365d2c6da7ec8ff40113c4da507c04f4e00b6104ca68579c19525cac828a631b
- languageName: node
- linkType: hard
-
"@typescript-eslint/scope-manager@npm:5.30.7":
version: 5.30.7
resolution: "@typescript-eslint/scope-manager@npm:5.30.7"
@@ -2196,13 +2224,6 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/types@npm:5.26.0":
- version: 5.26.0
- resolution: "@typescript-eslint/types@npm:5.26.0"
- checksum: 98798616d832da8e5ef61f050e4e72ed921a162cb4ce2b2dfe0a317c66998157e832f449aeab21a1fdfd806e7134091bc1a9446b1089f4687786b646ad8738e7
- languageName: node
- linkType: hard
-
"@typescript-eslint/types@npm:5.30.7":
version: 5.30.7
resolution: "@typescript-eslint/types@npm:5.30.7"
@@ -2210,24 +2231,6 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/typescript-estree@npm:5.26.0":
- version: 5.26.0
- resolution: "@typescript-eslint/typescript-estree@npm:5.26.0"
- dependencies:
- "@typescript-eslint/types": 5.26.0
- "@typescript-eslint/visitor-keys": 5.26.0
- debug: ^4.3.4
- globby: ^11.1.0
- is-glob: ^4.0.3
- semver: ^7.3.7
- tsutils: ^3.21.0
- peerDependenciesMeta:
- typescript:
- optional: true
- checksum: 2cf147629474952725593da64827a7e4e39f79614019529d0d6e5b89236c55f3607c6b4a24f160dbc5978f4cfd60f96fcb573a770c2877f8e29d7552b40e2135
- languageName: node
- linkType: hard
-
"@typescript-eslint/typescript-estree@npm:5.30.7":
version: 5.30.7
resolution: "@typescript-eslint/typescript-estree@npm:5.30.7"
@@ -2246,7 +2249,7 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/utils@npm:5.30.7":
+"@typescript-eslint/utils@npm:5.30.7, @typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.13.0":
version: 5.30.7
resolution: "@typescript-eslint/utils@npm:5.30.7"
dependencies:
@@ -2262,32 +2265,6 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.13.0":
- version: 5.26.0
- resolution: "@typescript-eslint/utils@npm:5.26.0"
- dependencies:
- "@types/json-schema": ^7.0.9
- "@typescript-eslint/scope-manager": 5.26.0
- "@typescript-eslint/types": 5.26.0
- "@typescript-eslint/typescript-estree": 5.26.0
- eslint-scope: ^5.1.1
- eslint-utils: ^3.0.0
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
- checksum: c16828ba6bfbe3b0b6e9dadeece1cfd2345141bcd13824f99fe210c76e5ddb11f6f79e61705cafa421c549657da12d1700a1316d24c2eeaee6179b08f512b5fb
- languageName: node
- linkType: hard
-
-"@typescript-eslint/visitor-keys@npm:5.26.0":
- version: 5.26.0
- resolution: "@typescript-eslint/visitor-keys@npm:5.26.0"
- dependencies:
- "@typescript-eslint/types": 5.26.0
- eslint-visitor-keys: ^3.3.0
- checksum: 4a5085d19e677f3b44ca4455bba85fd1a3be4d7d2e96bb22738a7497f6f4d16bfdee51059454a78b1e108d8e1593b1a31be40764a66448945118277cff5eff02
- languageName: node
- linkType: hard
-
"@typescript-eslint/visitor-keys@npm:5.30.7":
version: 5.30.7
resolution: "@typescript-eslint/visitor-keys@npm:5.30.7"
@@ -2322,11 +2299,18 @@ __metadata:
linkType: hard
"acorn@npm:^8.0.4, acorn@npm:^8.7.1":
- version: 8.7.1
- resolution: "acorn@npm:8.7.1"
+ version: 8.8.0
+ resolution: "acorn@npm:8.8.0"
bin:
acorn: bin/acorn
- checksum: aca0aabf98826717920ac2583fdcad0a6fbe4e583fdb6e843af2594e907455aeafe30b1e14f1757cd83ce1776773cf8296ffc3a4acf13f0bd3dfebcf1db6ae80
+ checksum: 7270ca82b242eafe5687a11fea6e088c960af712683756abf0791b68855ea9cace3057bd5e998ffcef50c944810c1e0ca1da526d02b32110e13c722aa959afdc
+ languageName: node
+ linkType: hard
+
+"add@npm:^2.0.6":
+ version: 2.0.6
+ resolution: "add@npm:2.0.6"
+ checksum: e2d23d40494565dfed4acd65e478570c444db5ac6c053551ed429c39ea0f2c99d83df63e7befec936df601827d2254d06a2fb6f7dcfd2022e810b25eab818b8c
languageName: node
linkType: hard
@@ -2456,6 +2440,15 @@ __metadata:
languageName: node
linkType: hard
+"aria-hidden@npm:^1.1.3":
+ version: 1.1.3
+ resolution: "aria-hidden@npm:1.1.3"
+ dependencies:
+ tslib: ^1.0.0
+ checksum: 2d40a328246baac7ae0b243ebe0cbef53c836c5f78c9212e9c1ff93f3aee185bd9aa51773e161e0025722d691c9d5f125070f6175a7074c4a57778ddc30d9e74
+ languageName: node
+ linkType: hard
+
"aria-query@npm:^4.2.2":
version: 4.2.2
resolution: "aria-query@npm:4.2.2"
@@ -2606,6 +2599,17 @@ __metadata:
languageName: node
linkType: hard
+"babel-plugin-macros@npm:^3.1.0":
+ version: 3.1.0
+ resolution: "babel-plugin-macros@npm:3.1.0"
+ dependencies:
+ "@babel/runtime": ^7.12.5
+ cosmiconfig: ^7.0.0
+ resolve: ^1.19.0
+ checksum: 765de4abebd3e4688ebdfbff8571ddc8cd8061f839bb6c3e550b0344a4027b04c60491f843296ce3f3379fb356cc873d57a9ee6694262547eb822c14a25be9a6
+ languageName: node
+ linkType: hard
+
"babel-preset-current-node-syntax@npm:^1.0.0":
version: 1.0.1
resolution: "babel-preset-current-node-syntax@npm:1.0.1"
@@ -2703,17 +2707,16 @@ __metadata:
linkType: hard
"browserslist@npm:^4.20.2":
- version: 4.20.3
- resolution: "browserslist@npm:4.20.3"
+ version: 4.21.2
+ resolution: "browserslist@npm:4.21.2"
dependencies:
- caniuse-lite: ^1.0.30001332
- electron-to-chromium: ^1.4.118
- escalade: ^3.1.1
- node-releases: ^2.0.3
- picocolors: ^1.0.0
+ caniuse-lite: ^1.0.30001366
+ electron-to-chromium: ^1.4.188
+ node-releases: ^2.0.6
+ update-browserslist-db: ^1.0.4
bin:
browserslist: cli.js
- checksum: 1e4b719ac2ca0fe235218a606e8b8ef16b8809e0973b924158c39fbc435a0b0fe43437ea52dd6ef5ad2efcb83fcb07431244e472270177814217f7c563651f7d
+ checksum: 30fe59f8b065f99665ea63819d29c797660f7975857c290f61f570403abed4d7039ca15b6fd21e39a57b87e1a9262f94676114040766fc0da6ccc11faf9fc377
languageName: node
linkType: hard
@@ -2758,8 +2761,8 @@ __metadata:
linkType: hard
"cacache@npm:^16.1.0":
- version: 16.1.0
- resolution: "cacache@npm:16.1.0"
+ version: 16.1.1
+ resolution: "cacache@npm:16.1.1"
dependencies:
"@npmcli/fs": ^2.1.0
"@npmcli/move-file": ^2.0.0
@@ -2779,7 +2782,7 @@ __metadata:
ssri: ^9.0.0
tar: ^6.1.11
unique-filename: ^1.1.1
- checksum: ddfcf92f079f24ccecef4e2ca1e4428443787b61429b921803b020fd0f33d9ac829ac47837b74b40868d8ae4f1b2ed82e164cdaa5508fbd790eee005a9d88469
+ checksum: 488524617008b793f0249b0c4ea2c330c710ca997921376e15650cc2415a8054491ae2dee9f01382c2015602c0641f3f977faf2fa7361aa33d2637dcfb03907a
languageName: node
linkType: hard
@@ -2836,10 +2839,10 @@ __metadata:
languageName: node
linkType: hard
-"caniuse-lite@npm:^1.0.30001332":
- version: 1.0.30001344
- resolution: "caniuse-lite@npm:1.0.30001344"
- checksum: 9dba66f796dc98632dced4c5d487d0fad219e137a27c634eec68520f2e598a613e3371b9207e15a078689a629128eca898793e37fc98841821ab481bddad51b9
+"caniuse-lite@npm:^1.0.30001332, caniuse-lite@npm:^1.0.30001366":
+ version: 1.0.30001369
+ resolution: "caniuse-lite@npm:1.0.30001369"
+ checksum: f3f0eadc0685b399c0cad1116991d4c73d9fa10517ab72c3fb1c5e78fd5a019002f94a6d03b57a530009c69106400bdfa7dc0bddb01569428df67b9c5e411542
languageName: node
linkType: hard
@@ -2886,9 +2889,9 @@ __metadata:
linkType: hard
"ci-info@npm:^3.2.0":
- version: 3.3.1
- resolution: "ci-info@npm:3.3.1"
- checksum: 244546317cca96955860d2cb8d0bf47dd66d9078bbe83a215fa87464ab24b352c6fc6f56027d1c82f002e3f833be253f1320d35ed7199bd81134f7788c657f3a
+ version: 3.3.2
+ resolution: "ci-info@npm:3.3.2"
+ checksum: fd81f1edd2d3b0f6cb077b2e84365136d87b9db8c055928c1ad69da8a76c2c2f19cba8ea51b90238302157ca927f91f92b653e933f2398dde4867500f08d6e62
languageName: node
linkType: hard
@@ -2918,15 +2921,15 @@ __metadata:
linkType: hard
"clone-response@npm:^1.0.2":
- version: 1.0.2
- resolution: "clone-response@npm:1.0.2"
+ version: 1.0.3
+ resolution: "clone-response@npm:1.0.3"
dependencies:
mimic-response: ^1.0.0
- checksum: 2d0e61547fc66276e0903be9654ada422515f5a15741691352000d47e8c00c226061221074ce2c0064d12e975e84a8687cfd35d8b405750cb4e772f87b256eda
+ checksum: 4e671cac39b11c60aa8ba0a450657194a5d6504df51bca3fac5b3bd0145c4f8e8464898f87c8406b83232e3bc5cca555f51c1f9c8ac023969ebfbf7f6bdabb2e
languageName: node
linkType: hard
-"clsx@npm:^1.1.1":
+"clsx@npm:1.1.1":
version: 1.1.1
resolution: "clsx@npm:1.1.1"
checksum: ff052650329773b9b245177305fc4c4dc3129f7b2be84af4f58dc5defa99538c61d4207be7419405a5f8f3d92007c954f4daba5a7b74e563d5de71c28c830063
@@ -2972,13 +2975,23 @@ __metadata:
languageName: node
linkType: hard
-"color-name@npm:~1.1.4":
+"color-name@npm:^1.0.0, color-name@npm:~1.1.4":
version: 1.1.4
resolution: "color-name@npm:1.1.4"
checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610
languageName: node
linkType: hard
+"color-string@npm:^1.9.0":
+ version: 1.9.1
+ resolution: "color-string@npm:1.9.1"
+ dependencies:
+ color-name: ^1.0.0
+ simple-swizzle: ^0.2.2
+ checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5
+ languageName: node
+ linkType: hard
+
"color-support@npm:^1.1.3":
version: 1.1.3
resolution: "color-support@npm:1.1.3"
@@ -2988,6 +3001,16 @@ __metadata:
languageName: node
linkType: hard
+"color@npm:^4.2.3":
+ version: 4.2.3
+ resolution: "color@npm:4.2.3"
+ dependencies:
+ color-convert: ^2.0.1
+ color-string: ^1.9.0
+ checksum: 0579629c02c631b426780038da929cca8e8d80a40158b09811a0112a107c62e10e4aad719843b791b1e658ab4e800558f2e87ca4522c8b32349d497ecb6adeb4
+ languageName: node
+ linkType: hard
+
"combined-stream@npm:^1.0.8":
version: 1.0.8
resolution: "combined-stream@npm:1.0.8"
@@ -3028,6 +3051,13 @@ __metadata:
languageName: node
linkType: hard
+"consola@npm:^2.15.3":
+ version: 2.15.3
+ resolution: "consola@npm:2.15.3"
+ checksum: 8ef7a09b703ec67ac5c389a372a33b6dc97eda6c9876443a60d76a3076eea0259e7f67a4e54fd5a52f97df73690822d090cf8b7e102b5761348afef7c6d03e28
+ languageName: node
+ linkType: hard
+
"console-control-strings@npm:^1.1.0":
version: 1.1.0
resolution: "console-control-strings@npm:1.1.0"
@@ -3035,7 +3065,7 @@ __metadata:
languageName: node
linkType: hard
-"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0":
+"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0":
version: 1.8.0
resolution: "convert-source-map@npm:1.8.0"
dependencies:
@@ -3063,9 +3093,9 @@ __metadata:
linkType: hard
"core-js-pure@npm:^3.20.2":
- version: 3.22.7
- resolution: "core-js-pure@npm:3.22.7"
- checksum: 6358882377e1f0433efc1c492cc5d764d664f7651a72e534b1c9d989fe82b9986b7602b735fee03f368187fb17c3829047a949c41078c710c92b3557d889042b
+ version: 3.23.5
+ resolution: "core-js-pure@npm:3.23.5"
+ checksum: a46edce5bdde29eda993c1f31086a08ba85e22fb1b3f77c9422e25ccc9e92fb9a1f3e7de5d13c9b807bdfeb0700b00bd5224375429cf44fd7ed5f46cc7d3e4ac
languageName: node
linkType: hard
@@ -3076,6 +3106,19 @@ __metadata:
languageName: node
linkType: hard
+"cosmiconfig@npm:^7.0.0":
+ version: 7.0.1
+ resolution: "cosmiconfig@npm:7.0.1"
+ dependencies:
+ "@types/parse-json": ^4.0.0
+ import-fresh: ^3.2.1
+ parse-json: ^5.0.0
+ path-type: ^4.0.0
+ yaml: ^1.10.0
+ checksum: 4be63e7117955fd88333d7460e4c466a90f556df6ef34efd59034d2463484e339666c41f02b523d574a797ec61f4a91918c5b89a316db2ea2f834e0d2d09465b
+ languageName: node
+ linkType: hard
+
"cpu-features@npm:~0.0.4":
version: 0.0.4
resolution: "cpu-features@npm:0.0.4"
@@ -3291,6 +3334,13 @@ __metadata:
languageName: node
linkType: hard
+"deep-extend@npm:^0.6.0":
+ version: 0.6.0
+ resolution: "deep-extend@npm:0.6.0"
+ checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7
+ languageName: node
+ linkType: hard
+
"deep-is@npm:^0.1.3":
version: 0.1.4
resolution: "deep-is@npm:0.1.4"
@@ -3350,6 +3400,13 @@ __metadata:
languageName: node
linkType: hard
+"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "detect-libc@npm:2.0.1"
+ checksum: ccb05fcabbb555beb544d48080179c18523a343face9ee4e1a86605a8715b4169f94d663c21a03c310ac824592f2ba9a5270218819bb411ad7be578a527593d7
+ languageName: node
+ linkType: hard
+
"detect-newline@npm:^3.0.0":
version: 3.1.0
resolution: "detect-newline@npm:3.1.0"
@@ -3441,16 +3498,7 @@ __metadata:
languageName: node
linkType: hard
-"domhandler@npm:4.2.2":
- version: 4.2.2
- resolution: "domhandler@npm:4.2.2"
- dependencies:
- domelementtype: ^2.2.0
- checksum: ad782fef984eca5a6fdd4ce70b90c38aff335ae4d6a51223ac82bd371b6674614efdcfff2dbb1126a7395634357906781f179e4ec028c7c578bb7f2beef8a4a5
- languageName: node
- linkType: hard
-
-"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0":
+"domhandler@npm:4.3.1, domhandler@npm:^4.2.0, domhandler@npm:^4.2.2":
version: 4.3.1
resolution: "domhandler@npm:4.3.1"
dependencies:
@@ -3459,7 +3507,7 @@ __metadata:
languageName: node
linkType: hard
-"domutils@npm:^2.5.2":
+"domutils@npm:^2.8.0":
version: 2.8.0
resolution: "domutils@npm:2.8.0"
dependencies:
@@ -3486,10 +3534,28 @@ __metadata:
languageName: node
linkType: hard
-"electron-to-chromium@npm:^1.4.118":
- version: 1.4.141
- resolution: "electron-to-chromium@npm:1.4.141"
- checksum: 7b87de52a9a2bbcb35a3c6a91e6eb7afea8f44a419a7f709b4739ab3d873d052d86b9a987fef55568626aa13616db4cafd3e50c6e2880a73455e2b2e26c02cb9
+"electron-to-chromium@npm:^1.4.188":
+ version: 1.4.199
+ resolution: "electron-to-chromium@npm:1.4.199"
+ checksum: d029a04cd765400bfa245c17e4895e15fcab3fd5c4dff7bfe1ceae9316a06fb4695b7078a50cfd04e0ca77ae27897520e4a8a332c13f7c2fdb2ee4a4b4593199
+ languageName: node
+ linkType: hard
+
+"embla-carousel-react@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "embla-carousel-react@npm:7.0.0"
+ dependencies:
+ embla-carousel: 7.0.0
+ peerDependencies:
+ react: ^18.1.0
+ checksum: d44b93901fb6a5be2236ce86115d7132a91f3e1943dc4d2cb0bccf045173008e947a35ebf0e345b90dc33ba06d8a0011913d45e2dbfd6cc47d58953bab96486e
+ languageName: node
+ linkType: hard
+
+"embla-carousel@npm:7.0.0":
+ version: 7.0.0
+ resolution: "embla-carousel@npm:7.0.0"
+ checksum: e662d18caf4371c04673372bf0e9144aec4b97629bbf48eb623e938ef27bd9f8de0d0f5b344d67bfdc777cce011518b7e833ec74773338292701c7d7efacb779
languageName: node
linkType: hard
@@ -3539,6 +3605,13 @@ __metadata:
languageName: node
linkType: hard
+"entities@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "entities@npm:3.0.1"
+ checksum: aaf7f12033f0939be91f5161593f853f2da55866db55ccbf72f45430b8977e2b79dbd58c53d0fdd2d00bd7d313b75b0968d09f038df88e308aa97e39f9456572
+ languageName: node
+ linkType: hard
+
"env-paths@npm:^2.2.0":
version: 2.2.1
resolution: "env-paths@npm:2.2.1"
@@ -4027,6 +4100,13 @@ __metadata:
languageName: node
linkType: hard
+"expand-template@npm:^2.0.3":
+ version: 2.0.3
+ resolution: "expand-template@npm:2.0.3"
+ checksum: 588c19847216421ed92befb521767b7018dc88f88b0576df98cb242f20961425e96a92cbece525ef28cc5becceae5d544ae0f5b9b5e2aa05acb13716ca5b3099
+ languageName: node
+ linkType: hard
+
"expect@npm:^28.1.3":
version: 28.1.3
resolution: "expect@npm:28.1.3"
@@ -4101,12 +4181,12 @@ __metadata:
languageName: node
linkType: hard
-"file-selector@npm:^0.4.0":
- version: 0.4.0
- resolution: "file-selector@npm:0.4.0"
+"file-selector@npm:^0.6.0":
+ version: 0.6.0
+ resolution: "file-selector@npm:0.6.0"
dependencies:
- tslib: ^2.0.3
- checksum: 1c9986e94bd033442cb4299d10d73d98fbc0b5f1af5b47d7a27b39f1e6bbd8d677f66c2628167da387166c652ad3c2429875042b453ba62f14945d903adf88d5
+ tslib: ^2.4.0
+ checksum: 7d051b6e5d793f3c6e2ab287ba5e7c2c6a0971bccc9d56e044c8047ba483e18f60fc0b5771c951dc707c0d15f4f36ccb4f1f1aaf385d21ec8f7700dadf8325ba
languageName: node
linkType: hard
@@ -4119,6 +4199,13 @@ __metadata:
languageName: node
linkType: hard
+"find-root@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "find-root@npm:1.1.0"
+ checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf
+ languageName: node
+ linkType: hard
+
"find-up@npm:^2.1.0":
version: 2.1.0
resolution: "find-up@npm:2.1.0"
@@ -4149,9 +4236,9 @@ __metadata:
linkType: hard
"flatted@npm:^3.1.0":
- version: 3.2.5
- resolution: "flatted@npm:3.2.5"
- checksum: 3c436e9695ccca29620b4be5671dd72e5dd0a7500e0856611b7ca9bd8169f177f408c3b9abfa78dfe1493ee2d873e2c119080a8a9bee4e1a186a9e60ca6c89f1
+ version: 3.2.6
+ resolution: "flatted@npm:3.2.6"
+ checksum: 33b87aa88dfa40ca6ee31d7df61712bbbad3d3c05c132c23e59b9b61d34631b337a18ff2b8dc5553acdc871ec72b741e485f78969cf006124a3f57174de29a0e
languageName: node
linkType: hard
@@ -4183,17 +4270,7 @@ __metadata:
languageName: node
linkType: hard
-"formdata-node@npm:^4.3.2":
- version: 4.3.2
- resolution: "formdata-node@npm:4.3.2"
- dependencies:
- node-domexception: 1.0.0
- web-streams-polyfill: 4.0.0-beta.1
- checksum: e1d7aae7d579775b813ddc8ea4511fee613552715e81b36afb188d3a65b3d4df2ef69017106079ba52d9ab1e3367fea0206862d8ae64c02008ababdb341d2c3d
- languageName: node
- linkType: hard
-
-"formdata-node@npm:^4.3.3":
+"formdata-node@npm:^4.3.2, formdata-node@npm:^4.3.3":
version: 4.3.3
resolution: "formdata-node@npm:4.3.3"
dependencies:
@@ -4339,13 +4416,13 @@ __metadata:
linkType: hard
"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1":
- version: 1.1.1
- resolution: "get-intrinsic@npm:1.1.1"
+ version: 1.1.2
+ resolution: "get-intrinsic@npm:1.1.2"
dependencies:
function-bind: ^1.1.1
has: ^1.0.3
- has-symbols: ^1.0.1
- checksum: a9fe2ca8fa3f07f9b0d30fb202bcd01f3d9b9b6b732452e79c48e79f7d6d8d003af3f9e38514250e3553fdc83c61650851cb6870832ac89deaaceb08e3721a17
+ has-symbols: ^1.0.3
+ checksum: 252f45491f2ba88ebf5b38018020c7cc3279de54b1d67ffb70c0cdf1dfa8ab31cd56467b5d117a8b4275b7a4dde91f86766b163a17a850f036528a7b2faafb2b
languageName: node
linkType: hard
@@ -4382,6 +4459,13 @@ __metadata:
languageName: node
linkType: hard
+"github-from-package@npm:0.0.0":
+ version: 0.0.0
+ resolution: "github-from-package@npm:0.0.0"
+ checksum: 14e448192a35c1e42efee94c9d01a10f42fe790375891a24b25261246ce9336ab9df5d274585aedd4568f7922246c2a78b8a8cd2571bfe99c693a9718e7dd0e3
+ languageName: node
+ linkType: hard
+
"glob-parent@npm:^5.1.2":
version: 5.1.2
resolution: "glob-parent@npm:5.1.2"
@@ -4449,11 +4533,11 @@ __metadata:
linkType: hard
"globals@npm:^13.15.0":
- version: 13.15.0
- resolution: "globals@npm:13.15.0"
+ version: 13.17.0
+ resolution: "globals@npm:13.17.0"
dependencies:
type-fest: ^0.20.2
- checksum: 383ade0873b2ab29ce6d143466c203ed960491575bc97406395e5c8434026fb02472ab2dfff5bc16689b8460269b18fda1047975295cd0183904385c51258bae
+ checksum: fbaf4112e59b92c9f5575e85ce65e9e17c0b82711196ec5f58beb08599bbd92fd72703d6dfc9b080381fd35b644e1b11dcf25b38cc2341ec21df942594cbc8ce
languageName: node
linkType: hard
@@ -4597,29 +4681,36 @@ __metadata:
"@dnd-kit/core": ^6.0.5
"@dnd-kit/sortable": ^7.0.1
"@dnd-kit/utilities": ^3.2.0
- "@mantine/core": ^4.2.12
- "@mantine/dates": ^4.2.12
- "@mantine/dropzone": ^4.2.12
- "@mantine/form": ^4.2.12
- "@mantine/hooks": ^4.2.12
- "@mantine/next": ^4.2.12
- "@mantine/notifications": ^4.2.12
- "@mantine/prism": ^4.2.12
- "@next/bundle-analyzer": 12.2.0
- "@next/eslint-plugin-next": 12.2.0
+ "@emotion/react": ^11.10.0
+ "@emotion/server": ^11.10.0
+ "@mantine/carousel": ^5.1.0
+ "@mantine/core": ^5.1.0
+ "@mantine/dates": ^5.1.0
+ "@mantine/dropzone": ^5.1.0
+ "@mantine/form": ^5.1.0
+ "@mantine/hooks": ^5.1.0
+ "@mantine/modals": ^5.1.0
+ "@mantine/next": ^5.1.0
+ "@mantine/notifications": ^5.1.0
+ "@mantine/prism": ^5.0.0
+ "@next/bundle-analyzer": ^12.1.4
+ "@next/eslint-plugin-next": ^12.1.4
"@nivo/core": ^0.79.0
"@nivo/line": ^0.79.1
- "@tabler/icons": ^1.76.0
+ "@tabler/icons": ^1.78.0
"@types/dockerode": ^3.3.9
- "@types/node": ^18.0.6
- "@types/react": ^18.0.15
+ "@types/node": 17.0.1
+ "@types/react": 17.0.1
"@types/uuid": ^8.3.4
"@typescript-eslint/eslint-plugin": ^5.30.7
"@typescript-eslint/parser": ^5.30.7
+ add: ^2.0.6
axios: ^0.27.2
+ consola: ^2.15.3
cookies-next: ^2.1.1
dayjs: ^1.11.4
dockerode: ^3.3.2
+ embla-carousel-react: ^7.0.0
eslint: ^8.20.0
eslint-config-airbnb: ^19.0.4
eslint-config-airbnb-typescript: ^17.0.0
@@ -4634,11 +4725,12 @@ __metadata:
framer-motion: ^6.5.1
jest: ^28.1.3
js-file-download: ^0.4.12
- next: 12.2.0
+ next: 12.1.6
prettier: ^2.7.1
prism-react-renderer: ^1.3.5
react: ^18.2.0
react-dom: ^18.2.0
+ sharp: ^0.30.7
systeminformation: ^5.12.1
typescript: ^4.7.4
uuid: ^8.3.2
@@ -4646,13 +4738,13 @@ __metadata:
languageName: unknown
linkType: soft
-"html-dom-parser@npm:1.0.2":
- version: 1.0.2
- resolution: "html-dom-parser@npm:1.0.2"
+"html-dom-parser@npm:1.2.0":
+ version: 1.2.0
+ resolution: "html-dom-parser@npm:1.2.0"
dependencies:
- domhandler: 4.2.2
- htmlparser2: 6.1.0
- checksum: e820edb9eef84379ad57866ba43abb43429c7c07fe61d153a4bc2295fd72e4a93dd19f1c24408d9a0ca5bd048f6ef6c59ef5b23b1f5204788524b22848631be2
+ domhandler: 4.3.1
+ htmlparser2: 7.2.0
+ checksum: d5e72baba7e1a9da334f023f3b3669247c5cebaf51b23011764202c11b3850339aa0fef9f26e00c2b0510e75fe6183453fcba33304a006f9fcde3d037bf60f3d
languageName: node
linkType: hard
@@ -4663,17 +4755,17 @@ __metadata:
languageName: node
linkType: hard
-"html-react-parser@npm:1.3.0":
- version: 1.3.0
- resolution: "html-react-parser@npm:1.3.0"
+"html-react-parser@npm:1.4.12":
+ version: 1.4.12
+ resolution: "html-react-parser@npm:1.4.12"
dependencies:
- domhandler: 4.2.2
- html-dom-parser: 1.0.2
+ domhandler: 4.3.1
+ html-dom-parser: 1.2.0
react-property: 2.0.0
style-to-js: 1.1.0
peerDependencies:
- react: 0.14 || 15 || 16 || 17
- checksum: 80ac304b0d2c97d1662fb29a17a9c144682577de8c451dc2f8175f6711b841f959669ac7d991752b969ad250e9268f328512ef0804354bf6e9687ff9048b9c8d
+ react: 0.14 || 15 || 16 || 17 || 18
+ checksum: ddc62b2f8d0f8836ca7aa18e51ddd3e329b51d77810547cd6bcb194aa36c61533ed64a8356283b64d57e1b4b96eb7c2fbf6e657e1b4c6d0fad8577132efa6f30
languageName: node
linkType: hard
@@ -4692,15 +4784,15 @@ __metadata:
languageName: node
linkType: hard
-"htmlparser2@npm:6.1.0":
- version: 6.1.0
- resolution: "htmlparser2@npm:6.1.0"
+"htmlparser2@npm:7.2.0":
+ version: 7.2.0
+ resolution: "htmlparser2@npm:7.2.0"
dependencies:
domelementtype: ^2.0.1
- domhandler: ^4.0.0
- domutils: ^2.5.2
- entities: ^2.0.0
- checksum: 81a7b3d9c3bb9acb568a02fc9b1b81ffbfa55eae7f1c41ae0bf840006d1dbf54cb3aa245b2553e2c94db674840a9f0fdad7027c9a9d01a062065314039058c4e
+ domhandler: ^4.2.2
+ domutils: ^2.8.0
+ entities: ^3.0.1
+ checksum: 96563d9965729cfcb3f5f19c26d013c6831b4cb38d79d8c185e9cd669ea6a9ffe8fb9ccc74d29a068c9078aa0e2767053ed6b19aa32723c41550340d0094bea0
languageName: node
linkType: hard
@@ -4841,6 +4933,13 @@ __metadata:
languageName: node
linkType: hard
+"ini@npm:~1.3.0":
+ version: 1.3.8
+ resolution: "ini@npm:1.3.8"
+ checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3
+ languageName: node
+ linkType: hard
+
"inline-style-parser@npm:0.1.1":
version: 0.1.1
resolution: "inline-style-parser@npm:0.1.1"
@@ -4866,10 +4965,10 @@ __metadata:
languageName: node
linkType: hard
-"ip@npm:^1.1.5":
- version: 1.1.8
- resolution: "ip@npm:1.1.8"
- checksum: a2ade53eb339fb0cbe9e69a44caab10d6e3784662285eb5d2677117ee4facc33a64679051c35e0dfdb1a3983a51ce2f5d2cb36446d52e10d01881789b76e28fb
+"ip@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "ip@npm:2.0.0"
+ checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349
languageName: node
linkType: hard
@@ -4880,6 +4979,13 @@ __metadata:
languageName: node
linkType: hard
+"is-arrayish@npm:^0.3.1":
+ version: 0.3.2
+ resolution: "is-arrayish@npm:0.3.2"
+ checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f
+ languageName: node
+ linkType: hard
+
"is-bigint@npm:^1.0.1":
version: 1.0.4
resolution: "is-bigint@npm:1.0.4"
@@ -4906,7 +5012,7 @@ __metadata:
languageName: node
linkType: hard
-"is-core-module@npm:^2.2.0, is-core-module@npm:^2.8.1":
+"is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0":
version: 2.9.0
resolution: "is-core-module@npm:2.9.0"
dependencies:
@@ -5101,12 +5207,12 @@ __metadata:
linkType: hard
"istanbul-reports@npm:^3.1.3":
- version: 3.1.4
- resolution: "istanbul-reports@npm:3.1.4"
+ version: 3.1.5
+ resolution: "istanbul-reports@npm:3.1.5"
dependencies:
html-escaper: ^2.0.0
istanbul-lib-report: ^3.0.0
- checksum: 2132983355710c522f6b26808015cab9a0ee8b9f5ae0db0d3edeff40b886dd83cb670fb123cb7b32dbe59473d7c00cdde2ba6136bc0acdb20a865fccea64dfe1
+ checksum: 7867228f83ed39477b188ea07e7ccb9b4f5320b6f73d1db93a0981b7414fa4ef72d3f80c4692c442f90fc250d9406e71d8d7ab65bb615cb334e6292b73192b89
languageName: node
linkType: hard
@@ -5643,17 +5749,7 @@ __metadata:
languageName: node
linkType: hard
-"jsx-ast-utils@npm:^2.4.1 || ^3.0.0":
- version: 3.3.0
- resolution: "jsx-ast-utils@npm:3.3.0"
- dependencies:
- array-includes: ^3.1.4
- object.assign: ^4.1.2
- checksum: e3c0667e8979c70600fb0456b19f0ec194994c953678ac2772a819d8d5740df2ed751e49e4f1db7869bf63251585a93b18acd42ef02269fe41cb23941d0d4950
- languageName: node
- linkType: hard
-
-"jsx-ast-utils@npm:^3.3.2":
+"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.2":
version: 3.3.2
resolution: "jsx-ast-utils@npm:3.3.2"
dependencies:
@@ -5664,12 +5760,12 @@ __metadata:
linkType: hard
"keyv@npm:^4.0.0":
- version: 4.3.0
- resolution: "keyv@npm:4.3.0"
+ version: 4.3.3
+ resolution: "keyv@npm:4.3.3"
dependencies:
compress-brotli: ^1.3.8
json-buffer: 3.0.1
- checksum: abcb5885fc636fb867929234da9e1cd4f74a7da5db2c59fe5f8537372416cfa4e25b54e1c18ae9c3a0e9688452d15bf32fbba1ed9dfb57047673fe6ddb8a7bb6
+ checksum: bcc946eeec3407fb3b42d831ce985357162113c5f07a8c45c12ede39704ba2d99be4c3dded76d2d2d2a2366627e42440bdde24393216164156928399949c12a1
languageName: node
linkType: hard
@@ -5680,10 +5776,17 @@ __metadata:
languageName: node
linkType: hard
+"klona@npm:^2.0.5":
+ version: 2.0.5
+ resolution: "klona@npm:2.0.5"
+ checksum: 8c976126ea252b766e648a4866e1bccff9d3b08432474ad80c559f6c7265cf7caede2498d463754d8c88c4759895edd8210c85c0d3155e6aae4968362889466f
+ languageName: node
+ linkType: hard
+
"language-subtag-registry@npm:~0.3.2":
- version: 0.3.21
- resolution: "language-subtag-registry@npm:0.3.21"
- checksum: 5f794525a5bfcefeea155a681af1c03365b60e115b688952a53c6e0b9532b09163f57f1fcb69d6150e0e805ec0350644a4cb35da98f4902562915be9f89572a1
+ version: 0.3.22
+ resolution: "language-subtag-registry@npm:0.3.22"
+ checksum: 8ab70a7e0e055fe977ac16ea4c261faec7205ac43db5e806f72e5b59606939a3b972c4bd1e10e323b35d6ffa97c3e1c4c99f6553069dad2dfdd22020fa3eb56a
languageName: node
linkType: hard
@@ -5753,7 +5856,7 @@ __metadata:
languageName: node
linkType: hard
-"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0":
+"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0":
version: 1.4.0
resolution: "loose-envify@npm:1.4.0"
dependencies:
@@ -5788,9 +5891,9 @@ __metadata:
linkType: hard
"lru-cache@npm:^7.7.1":
- version: 7.10.1
- resolution: "lru-cache@npm:7.10.1"
- checksum: e8b190d71ed0fcd7b29c71a3e9b01f851c92d1ef8865ff06b5581ca991db1e5e006920ed4da8b56da1910664ed51abfd76c46fb55e82ac252ff6c970ff910d72
+ version: 7.13.1
+ resolution: "lru-cache@npm:7.13.1"
+ checksum: f53c7dd098a7afd6342b23f7182629edff206c7665de79445a7f5455440e768a4d1c6ec52e1a16175580c71535c9437dfb6f6bc22ca1a0e4a7454a97cde87329
languageName: node
linkType: hard
@@ -5804,8 +5907,8 @@ __metadata:
linkType: hard
"make-fetch-happen@npm:^10.0.3":
- version: 10.1.6
- resolution: "make-fetch-happen@npm:10.1.6"
+ version: 10.2.0
+ resolution: "make-fetch-happen@npm:10.2.0"
dependencies:
agentkeepalive: ^4.2.1
cacache: ^16.1.0
@@ -5821,9 +5924,9 @@ __metadata:
minipass-pipeline: ^1.2.4
negotiator: ^0.6.3
promise-retry: ^2.0.1
- socks-proxy-agent: ^6.1.1
+ socks-proxy-agent: ^7.0.0
ssri: ^9.0.0
- checksum: e75fb1209222404a803e0432cabf20dfccf35e78b32340a4f1ac18eb6faf9e42b2e600a3488261d71f455773581af8e1d615a881f50e5bd5d5efc2ae6ec7a8ee
+ checksum: 2f6c294179972f56fab40fd8618f07841e06550692bb78f6da16e7afaa9dca78c345b08cf44a77a8907ef3948e4dc77e93eb7492b8381f1217d7ac057a7522f8
languageName: node
linkType: hard
@@ -5915,7 +6018,7 @@ __metadata:
languageName: node
linkType: hard
-"minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:~1.2.5":
+"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6, minimist@npm:~1.2.5":
version: 1.2.6
resolution: "minimist@npm:1.2.6"
checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb
@@ -5974,11 +6077,11 @@ __metadata:
linkType: hard
"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6":
- version: 3.1.6
- resolution: "minipass@npm:3.1.6"
+ version: 3.3.4
+ resolution: "minipass@npm:3.3.4"
dependencies:
yallist: ^4.0.0
- checksum: 57a04041413a3531a65062452cb5175f93383ef245d6f4a2961d34386eb9aa8ac11ac7f16f791f5e8bbaf1dfb1ef01596870c88e8822215db57aa591a5bb0a77
+ checksum: 5d95a7738c54852ba78d484141e850c792e062666a2d0c681a5ac1021275beb7e1acb077e59f9523ff1defb80901aea4e30fac10ded9a20a25d819a42916ef1b
languageName: node
linkType: hard
@@ -5992,7 +6095,7 @@ __metadata:
languageName: node
linkType: hard
-"mkdirp-classic@npm:^0.5.2":
+"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3":
version: 0.5.3
resolution: "mkdirp-classic@npm:0.5.3"
checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac
@@ -6009,9 +6112,9 @@ __metadata:
linkType: hard
"mrmime@npm:^1.0.0":
- version: 1.0.0
- resolution: "mrmime@npm:1.0.0"
- checksum: 2c72a40942af7c53bc97d1e9e9c5cb0e6541d18f736811c3a1b46fa2a2b2362480d687daa8ae8372523acaacd82426a4f7ce34b0bf1825ea83b3983e8cb91afd
+ version: 1.0.1
+ resolution: "mrmime@npm:1.0.1"
+ checksum: cc979da44bbbffebaa8eaf7a45117e851f2d4cb46a3ada6ceb78130466a04c15a0de9a9ce1c8b8ba6f6e1b8618866b1352992bf1757d241c0ddca558b9f28a77
languageName: node
linkType: hard
@@ -6064,6 +6167,13 @@ __metadata:
languageName: node
linkType: hard
+"napi-build-utils@npm:^1.0.1":
+ version: 1.0.2
+ resolution: "napi-build-utils@npm:1.0.2"
+ checksum: 06c14271ee966e108d55ae109f340976a9556c8603e888037145d6522726aebe89dd0c861b4b83947feaf6d39e79e08817559e8693deedc2c94e82c5cbd090c7
+ languageName: node
+ linkType: hard
+
"natural-compare@npm:^1.4.0":
version: 1.4.0
resolution: "natural-compare@npm:1.4.0"
@@ -6078,29 +6188,26 @@ __metadata:
languageName: node
linkType: hard
-"next@npm:12.2.0":
- version: 12.2.0
- resolution: "next@npm:12.2.0"
+"next@npm:12.1.6":
+ version: 12.1.6
+ resolution: "next@npm:12.1.6"
dependencies:
- "@next/env": 12.2.0
- "@next/swc-android-arm-eabi": 12.2.0
- "@next/swc-android-arm64": 12.2.0
- "@next/swc-darwin-arm64": 12.2.0
- "@next/swc-darwin-x64": 12.2.0
- "@next/swc-freebsd-x64": 12.2.0
- "@next/swc-linux-arm-gnueabihf": 12.2.0
- "@next/swc-linux-arm64-gnu": 12.2.0
- "@next/swc-linux-arm64-musl": 12.2.0
- "@next/swc-linux-x64-gnu": 12.2.0
- "@next/swc-linux-x64-musl": 12.2.0
- "@next/swc-win32-arm64-msvc": 12.2.0
- "@next/swc-win32-ia32-msvc": 12.2.0
- "@next/swc-win32-x64-msvc": 12.2.0
- "@swc/helpers": 0.4.2
+ "@next/env": 12.1.6
+ "@next/swc-android-arm-eabi": 12.1.6
+ "@next/swc-android-arm64": 12.1.6
+ "@next/swc-darwin-arm64": 12.1.6
+ "@next/swc-darwin-x64": 12.1.6
+ "@next/swc-linux-arm-gnueabihf": 12.1.6
+ "@next/swc-linux-arm64-gnu": 12.1.6
+ "@next/swc-linux-arm64-musl": 12.1.6
+ "@next/swc-linux-x64-gnu": 12.1.6
+ "@next/swc-linux-x64-musl": 12.1.6
+ "@next/swc-win32-arm64-msvc": 12.1.6
+ "@next/swc-win32-ia32-msvc": 12.1.6
+ "@next/swc-win32-x64-msvc": 12.1.6
caniuse-lite: ^1.0.30001332
postcss: 8.4.5
styled-jsx: 5.0.2
- use-sync-external-store: 1.1.0
peerDependencies:
fibers: ">= 3.1.0"
node-sass: ^6.0.0 || ^7.0.0
@@ -6116,8 +6223,6 @@ __metadata:
optional: true
"@next/swc-darwin-x64":
optional: true
- "@next/swc-freebsd-x64":
- optional: true
"@next/swc-linux-arm-gnueabihf":
optional: true
"@next/swc-linux-arm64-gnu":
@@ -6143,7 +6248,25 @@ __metadata:
optional: true
bin:
next: dist/bin/next
- checksum: 38456c33935122ac1581367e4982034be23269039a8470a66443d710334336f8f3fb587f25d172d138d84cf18c01d3a76627fb610c2e2e57bd1692277c23fa2b
+ checksum: 670d544fd47670c29681d10824e6da625e9d4a048e564c8d9cb80d37f33c9ff9b5ca0a53e6d84d8d618b1fe7c9bb4e6b45040cb7e57a5c46b232a8f914425dc1
+ languageName: node
+ linkType: hard
+
+"node-abi@npm:^3.3.0":
+ version: 3.24.0
+ resolution: "node-abi@npm:3.24.0"
+ dependencies:
+ semver: ^7.3.5
+ checksum: d90ab48802497b2203800cac71018668e99c246435395ca4f67afcabf689e7e81568ed36e8036bae79a052b63ea5707375bece6ca0a1d2e2b99bfafde7a5c9b2
+ languageName: node
+ linkType: hard
+
+"node-addon-api@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "node-addon-api@npm:5.0.0"
+ dependencies:
+ node-gyp: latest
+ checksum: 7c5e2043ac37f6108784d94ed73a44ae6d3e68eb968de60680922fc6bc3d17fa69448c0feb4e0c9d3f4c74a0324822e566a8340a56916d9d6f23cb3e85620334
languageName: node
linkType: hard
@@ -6155,8 +6278,8 @@ __metadata:
linkType: hard
"node-gyp@npm:latest":
- version: 9.0.0
- resolution: "node-gyp@npm:9.0.0"
+ version: 9.1.0
+ resolution: "node-gyp@npm:9.1.0"
dependencies:
env-paths: ^2.2.0
glob: ^7.1.4
@@ -6170,7 +6293,7 @@ __metadata:
which: ^2.0.2
bin:
node-gyp: bin/node-gyp.js
- checksum: 4d8ef8860f7e4f4d86c91db3f519d26ed5cc23b48fe54543e2afd86162b4acbd14f21de42a5db344525efb69a991e021b96a68c70c6e2d5f4a5cb770793da6d3
+ checksum: 1437fa4a879b5b9010604128e8da8609b57c66034262087539ee04a8b764b8436af2be01bab66f8fc729a3adba2dcc21b10a32b9f552696c3fa8cd657d134fc4
languageName: node
linkType: hard
@@ -6181,10 +6304,10 @@ __metadata:
languageName: node
linkType: hard
-"node-releases@npm:^2.0.3":
- version: 2.0.5
- resolution: "node-releases@npm:2.0.5"
- checksum: e85d949addd19f8827f32569d2be5751e7812ccf6cc47879d49f79b5234ff4982225e39a3929315f96370823b070640fb04d79fc0ddec8b515a969a03493a42f
+"node-releases@npm:^2.0.6":
+ version: 2.0.6
+ resolution: "node-releases@npm:2.0.6"
+ checksum: e86a926dc9fbb3b41b4c4a89d998afdf140e20a4e8dbe6c0a807f7b2948b42ea97d7fd3ad4868041487b6e9ee98409829c6e4d84a734a4215dff060a7fbeb4bf
languageName: node
linkType: hard
@@ -6442,7 +6565,7 @@ __metadata:
languageName: node
linkType: hard
-"parse-json@npm:^5.2.0":
+"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0":
version: 5.2.0
resolution: "parse-json@npm:5.2.0"
dependencies:
@@ -6482,7 +6605,7 @@ __metadata:
languageName: node
linkType: hard
-"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7":
+"path-parse@npm:^1.0.7":
version: 1.0.7
resolution: "path-parse@npm:1.0.7"
checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a
@@ -6549,6 +6672,28 @@ __metadata:
languageName: node
linkType: hard
+"prebuild-install@npm:^7.1.1":
+ version: 7.1.1
+ resolution: "prebuild-install@npm:7.1.1"
+ dependencies:
+ detect-libc: ^2.0.0
+ expand-template: ^2.0.3
+ github-from-package: 0.0.0
+ minimist: ^1.2.3
+ mkdirp-classic: ^0.5.3
+ napi-build-utils: ^1.0.1
+ node-abi: ^3.3.0
+ pump: ^3.0.0
+ rc: ^1.2.7
+ simple-get: ^4.0.0
+ tar-fs: ^2.0.0
+ tunnel-agent: ^0.6.0
+ bin:
+ prebuild-install: bin.js
+ checksum: dbf96d0146b6b5827fc8f67f72074d2e19c69628b9a7a0a17d0fad1bf37e9f06922896972e074197fc00a52eae912993e6ef5a0d471652f561df5cb516f3f467
+ languageName: node
+ linkType: hard
+
"prelude-ls@npm:^1.2.1":
version: 1.2.1
resolution: "prelude-ls@npm:1.2.1"
@@ -6577,16 +6722,7 @@ __metadata:
languageName: node
linkType: hard
-"prism-react-renderer@npm:^1.2.1":
- version: 1.3.3
- resolution: "prism-react-renderer@npm:1.3.3"
- peerDependencies:
- react: ">=0.14.9"
- checksum: e5df45271fc1db512b71feab04000c329d83987bfec98d5bcb3ca818ee7c031e56b5ce51f0f67daa1bd31466b11b1f10b6000dc90f6b6553f8ed5234d19b7ac6
- languageName: node
- linkType: hard
-
-"prism-react-renderer@npm:^1.3.5":
+"prism-react-renderer@npm:^1.2.1, prism-react-renderer@npm:^1.3.5":
version: 1.3.5
resolution: "prism-react-renderer@npm:1.3.5"
peerDependencies:
@@ -6641,9 +6777,9 @@ __metadata:
linkType: hard
"psl@npm:^1.1.33":
- version: 1.8.0
- resolution: "psl@npm:1.8.0"
- checksum: 6150048ed2da3f919478bee8a82f3828303bc0fc730fb015a48f83c9977682c7b28c60ab01425a72d82a2891a1681627aa530a991d50c086b48a3be27744bde7
+ version: 1.9.0
+ resolution: "psl@npm:1.9.0"
+ checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d
languageName: node
linkType: hard
@@ -6678,6 +6814,20 @@ __metadata:
languageName: node
linkType: hard
+"rc@npm:^1.2.7":
+ version: 1.2.8
+ resolution: "rc@npm:1.2.8"
+ dependencies:
+ deep-extend: ^0.6.0
+ ini: ~1.3.0
+ minimist: ^1.2.0
+ strip-json-comments: ~2.0.1
+ bin:
+ rc: ./cli.js
+ checksum: 2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e
+ languageName: node
+ linkType: hard
+
"react-dom@npm:^18.2.0":
version: 18.2.0
resolution: "react-dom@npm:18.2.0"
@@ -6690,23 +6840,16 @@ __metadata:
languageName: node
linkType: hard
-"react-dropzone@npm:^11.4.2":
- version: 11.7.1
- resolution: "react-dropzone@npm:11.7.1"
+"react-dropzone@npm:14.2.1":
+ version: 14.2.1
+ resolution: "react-dropzone@npm:14.2.1"
dependencies:
attr-accept: ^2.2.2
- file-selector: ^0.4.0
+ file-selector: ^0.6.0
prop-types: ^15.8.1
peerDependencies:
- react: ">= 16.8"
- checksum: 7549bb67da5222dfbb7b79d9df84a4f2bd417e53396df8b0772a95fd7621ec967b87a17ff7f1e54eb5597d73c51c2a0d16328c792b11e751c73e18e2f7160207
- languageName: node
- linkType: hard
-
-"react-fast-compare@npm:^3.0.1":
- version: 3.2.0
- resolution: "react-fast-compare@npm:3.2.0"
- checksum: 8ef272c825ae329f61633ce4ce7f15aa5b84e5214d88bc0823880236e03e985a13195befa2c7a4eda7db3b017dc7985729152d88445823f652403cf36c2b86aa
+ react: ">= 16.8 || 18.0.0"
+ checksum: 8556d997d66bad79fe165a30d6dc8f917c67d8c7d23069c417eb2a0da6df824ba71b84b532707711e184da105122f6a6e81104341dc5b8c0f96e318267fdda91
languageName: node
linkType: hard
@@ -6718,9 +6861,9 @@ __metadata:
linkType: hard
"react-is@npm:^18.0.0":
- version: 18.1.0
- resolution: "react-is@npm:18.1.0"
- checksum: d206a0fe6790851bff168727bfb896de02c5591695afb0c441163e8630136a3e13ee1a7ddd59fdccddcc93968b4721ae112c10f790b194b03b35a3dc13a355ef
+ version: 18.2.0
+ resolution: "react-is@npm:18.2.0"
+ checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e
languageName: node
linkType: hard
@@ -6731,20 +6874,6 @@ __metadata:
languageName: node
linkType: hard
-"react-popper@npm:^2.2.5":
- version: 2.3.0
- resolution: "react-popper@npm:2.3.0"
- dependencies:
- react-fast-compare: ^3.0.1
- warning: ^4.0.2
- peerDependencies:
- "@popperjs/core": ^2.0.0
- react: ^16.8.0 || ^17 || ^18
- react-dom: ^16.8.0 || ^17 || ^18
- checksum: 837111c98738011c69b3069a464ea5bdcbf487105b6148e8faf90cb7337e134edb1b98b8824322941c378756cca30a15c18c25f558e53b85ed5762fa0dc8e6b2
- languageName: node
- linkType: hard
-
"react-property@npm:2.0.0":
version: 2.0.0
resolution: "react-property@npm:2.0.0"
@@ -6752,7 +6881,7 @@ __metadata:
languageName: node
linkType: hard
-"react-textarea-autosize@npm:^8.3.2":
+"react-textarea-autosize@npm:8.3.4":
version: 8.3.4
resolution: "react-textarea-autosize@npm:8.3.4"
dependencies:
@@ -6765,7 +6894,7 @@ __metadata:
languageName: node
linkType: hard
-"react-transition-group@npm:^4.4.2":
+"react-transition-group@npm:4.4.2":
version: 4.4.2
resolution: "react-transition-group@npm:4.4.2"
dependencies:
@@ -6896,58 +7025,64 @@ __metadata:
languageName: node
linkType: hard
-"resolve@npm:^1.20.0, resolve@npm:^1.22.0":
- version: 1.22.0
- resolution: "resolve@npm:1.22.0"
+"resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0":
+ version: 1.22.1
+ resolution: "resolve@npm:1.22.1"
dependencies:
- is-core-module: ^2.8.1
+ is-core-module: ^2.9.0
path-parse: ^1.0.7
supports-preserve-symlinks-flag: ^1.0.0
bin:
resolve: bin/resolve
- checksum: a2d14cc437b3a23996f8c7367eee5c7cf8149c586b07ca2ae00e96581ce59455555a1190be9aa92154785cf9f2042646c200d0e00e0bbd2b8a995a93a0ed3e4e
+ checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e
languageName: node
linkType: hard
"resolve@npm:^2.0.0-next.3":
- version: 2.0.0-next.3
- resolution: "resolve@npm:2.0.0-next.3"
+ version: 2.0.0-next.4
+ resolution: "resolve@npm:2.0.0-next.4"
dependencies:
- is-core-module: ^2.2.0
- path-parse: ^1.0.6
- checksum: f34b3b93ada77d64a6d590c06a83e198f3a827624c4ec972260905fa6c4d612164fbf0200d16d2beefea4ad1755b001f4a9a1293d8fc2322a8f7d6bf692c4ff5
- languageName: node
- linkType: hard
-
-"resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin":
- version: 1.22.0
- resolution: "resolve@patch:resolve@npm%3A1.22.0#~builtin::version=1.22.0&hash=07638b"
- dependencies:
- is-core-module: ^2.8.1
+ is-core-module: ^2.9.0
path-parse: ^1.0.7
supports-preserve-symlinks-flag: ^1.0.0
bin:
resolve: bin/resolve
- checksum: c79ecaea36c872ee4a79e3db0d3d4160b593f2ca16e031d8283735acd01715a203607e9ded3f91f68899c2937fa0d49390cddbe0fb2852629212f3cda283f4a7
+ checksum: c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3
+ languageName: node
+ linkType: hard
+
+"resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin":
+ version: 1.22.1
+ resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b"
+ dependencies:
+ is-core-module: ^2.9.0
+ path-parse: ^1.0.7
+ supports-preserve-symlinks-flag: ^1.0.0
+ bin:
+ resolve: bin/resolve
+ checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b
languageName: node
linkType: hard
"resolve@patch:resolve@^2.0.0-next.3#~builtin":
- version: 2.0.0-next.3
- resolution: "resolve@patch:resolve@npm%3A2.0.0-next.3#~builtin::version=2.0.0-next.3&hash=07638b"
+ version: 2.0.0-next.4
+ resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=07638b"
dependencies:
- is-core-module: ^2.2.0
- path-parse: ^1.0.6
- checksum: 21684b4d99a4877337cdbd5484311c811b3e8910edb5d868eec85c6e6550b0f570d911f9a384f9e176172d6713f2715bd0b0887fa512cb8c6aeece018de6a9f8
+ is-core-module: ^2.9.0
+ path-parse: ^1.0.7
+ supports-preserve-symlinks-flag: ^1.0.0
+ bin:
+ resolve: bin/resolve
+ checksum: 4bf9f4f8a458607af90518ff73c67a4bc1a38b5a23fef2bb0ccbd45e8be89820a1639b637b0ba377eb2be9eedfb1739a84cde24fe4cd670c8207d8fea922b011
languageName: node
linkType: hard
"responselike@npm:^2.0.0":
- version: 2.0.0
- resolution: "responselike@npm:2.0.0"
+ version: 2.0.1
+ resolution: "responselike@npm:2.0.1"
dependencies:
lowercase-keys: ^2.0.0
- checksum: 6a4d32c37d4e88678ae0a9d69fcc90aafa15b1a3eab455bd65c06af3c6c4976afc47d07a0e5a60d277ab041a465f43bf0a581e0d7ab33786e7a7741573f2e487
+ checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a
languageName: node
linkType: hard
@@ -6985,6 +7120,13 @@ __metadata:
languageName: node
linkType: hard
+"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0":
+ version: 5.2.1
+ resolution: "safe-buffer@npm:5.2.1"
+ checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491
+ languageName: node
+ linkType: hard
+
"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1":
version: 5.1.2
resolution: "safe-buffer@npm:5.1.2"
@@ -6992,13 +7134,6 @@ __metadata:
languageName: node
linkType: hard
-"safe-buffer@npm:~5.2.0":
- version: 5.2.1
- resolution: "safe-buffer@npm:5.2.1"
- checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491
- languageName: node
- linkType: hard
-
"safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:~2.1.0":
version: 2.1.2
resolution: "safer-buffer@npm:2.1.2"
@@ -7042,6 +7177,23 @@ __metadata:
languageName: node
linkType: hard
+"sharp@npm:^0.30.7":
+ version: 0.30.7
+ resolution: "sharp@npm:0.30.7"
+ dependencies:
+ color: ^4.2.3
+ detect-libc: ^2.0.1
+ node-addon-api: ^5.0.0
+ node-gyp: latest
+ prebuild-install: ^7.1.1
+ semver: ^7.3.7
+ simple-get: ^4.0.1
+ tar-fs: ^2.1.1
+ tunnel-agent: ^0.6.0
+ checksum: bbc63ca3c7ea8a5bff32cd77022cfea30e25a03f5bd031e935924bf6cf0e11e3388e8b0e22b3137bf8816aa73407f1e4fbeb190f3a35605c27ffca9f32b91601
+ languageName: node
+ linkType: hard
+
"shebang-command@npm:^2.0.0":
version: 2.0.0
resolution: "shebang-command@npm:2.0.0"
@@ -7076,6 +7228,33 @@ __metadata:
languageName: node
linkType: hard
+"simple-concat@npm:^1.0.0":
+ version: 1.0.1
+ resolution: "simple-concat@npm:1.0.1"
+ checksum: 4d211042cc3d73a718c21ac6c4e7d7a0363e184be6a5ad25c8a1502e49df6d0a0253979e3d50dbdd3f60ef6c6c58d756b5d66ac1e05cda9cacd2e9fc59e3876a
+ languageName: node
+ linkType: hard
+
+"simple-get@npm:^4.0.0, simple-get@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "simple-get@npm:4.0.1"
+ dependencies:
+ decompress-response: ^6.0.0
+ once: ^1.3.1
+ simple-concat: ^1.0.0
+ checksum: e4132fd27cf7af230d853fa45c1b8ce900cb430dd0a3c6d3829649fe4f2b26574c803698076c4006450efb0fad2ba8c5455fbb5755d4b0a5ec42d4f12b31d27e
+ languageName: node
+ linkType: hard
+
+"simple-swizzle@npm:^0.2.2":
+ version: 0.2.2
+ resolution: "simple-swizzle@npm:0.2.2"
+ dependencies:
+ is-arrayish: ^0.3.1
+ checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0
+ languageName: node
+ linkType: hard
+
"sirv@npm:^1.0.7":
version: 1.0.19
resolution: "sirv@npm:1.0.19"
@@ -7108,24 +7287,24 @@ __metadata:
languageName: node
linkType: hard
-"socks-proxy-agent@npm:^6.1.1":
- version: 6.2.0
- resolution: "socks-proxy-agent@npm:6.2.0"
+"socks-proxy-agent@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "socks-proxy-agent@npm:7.0.0"
dependencies:
agent-base: ^6.0.2
debug: ^4.3.3
socks: ^2.6.2
- checksum: 6723fd64fb50334e2b340fd0a80fd8488ffc5bc43d85b7cf1d25612044f814dd7d6ea417fd47602159941236f7f4bd15669fa5d7e1f852598a31288e1a43967b
+ checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846
languageName: node
linkType: hard
"socks@npm:^2.6.2":
- version: 2.6.2
- resolution: "socks@npm:2.6.2"
+ version: 2.7.0
+ resolution: "socks@npm:2.7.0"
dependencies:
- ip: ^1.1.5
+ ip: ^2.0.0
smart-buffer: ^4.2.0
- checksum: dd9194293059d737759d5c69273850ad4149f448426249325c4bea0e340d1cf3d266c3b022694b0dcf5d31f759de23657244c481fc1e8322add80b7985c36b5e
+ checksum: 0b5d94e2b3c11e7937b40fc5dac1e80d8b92a330e68c51f1d271ce6980c70adca42a3f8cd47c4a5769956bada074823b53374f2dc5f2ea5c2121b222dec6eadf
languageName: node
linkType: hard
@@ -7146,6 +7325,13 @@ __metadata:
languageName: node
linkType: hard
+"source-map@npm:^0.5.7":
+ version: 0.5.7
+ resolution: "source-map@npm:0.5.7"
+ checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d
+ languageName: node
+ linkType: hard
+
"source-map@npm:^0.6.0, source-map@npm:^0.6.1":
version: 0.6.1
resolution: "source-map@npm:0.6.1"
@@ -7323,6 +7509,13 @@ __metadata:
languageName: node
linkType: hard
+"strip-json-comments@npm:~2.0.1":
+ version: 2.0.1
+ resolution: "strip-json-comments@npm:2.0.1"
+ checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1
+ languageName: node
+ linkType: hard
+
"style-to-js@npm:1.1.0":
version: 1.1.0
resolution: "style-to-js@npm:1.1.0"
@@ -7426,6 +7619,18 @@ __metadata:
languageName: node
linkType: hard
+"tar-fs@npm:^2.0.0, tar-fs@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "tar-fs@npm:2.1.1"
+ dependencies:
+ chownr: ^1.1.1
+ mkdirp-classic: ^0.5.2
+ pump: ^3.0.0
+ tar-stream: ^2.1.4
+ checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d
+ languageName: node
+ linkType: hard
+
"tar-fs@npm:~2.0.1":
version: 2.0.1
resolution: "tar-fs@npm:2.0.1"
@@ -7438,7 +7643,7 @@ __metadata:
languageName: node
linkType: hard
-"tar-stream@npm:^2.0.0":
+"tar-stream@npm:^2.0.0, tar-stream@npm:^2.1.4":
version: 2.2.0
resolution: "tar-stream@npm:2.2.0"
dependencies:
@@ -7563,14 +7768,14 @@ __metadata:
languageName: node
linkType: hard
-"tslib@npm:^1.8.1":
+"tslib@npm:^1.0.0, tslib@npm:^1.8.1":
version: 1.14.1
resolution: "tslib@npm:1.14.1"
checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd
languageName: node
linkType: hard
-"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0":
+"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0":
version: 2.4.0
resolution: "tslib@npm:2.4.0"
checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113
@@ -7588,6 +7793,15 @@ __metadata:
languageName: node
linkType: hard
+"tunnel-agent@npm:^0.6.0":
+ version: 0.6.0
+ resolution: "tunnel-agent@npm:0.6.0"
+ dependencies:
+ safe-buffer: ^5.0.1
+ checksum: 05f6510358f8afc62a057b8b692f05d70c1782b70db86d6a1e0d5e28a32389e52fa6e7707b6c5ecccacc031462e4bc35af85ecfe4bbc341767917b7cf6965711
+ languageName: node
+ linkType: hard
+
"tweetnacl@npm:^0.14.3":
version: 0.14.5
resolution: "tweetnacl@npm:0.14.5"
@@ -7682,6 +7896,20 @@ __metadata:
languageName: node
linkType: hard
+"update-browserslist-db@npm:^1.0.4":
+ version: 1.0.5
+ resolution: "update-browserslist-db@npm:1.0.5"
+ dependencies:
+ escalade: ^3.1.1
+ picocolors: ^1.0.0
+ peerDependencies:
+ browserslist: ">= 4.21.0"
+ bin:
+ browserslist-lint: cli.js
+ checksum: 7e425fe5dbbebdccf72a84ce70ec47fc74dce561d28f47bc2b84a1c2b84179a862c2261b18ab66a5e73e261c7e2ef9e11c6129112989d4d52e8f75a56bb923f8
+ languageName: node
+ linkType: hard
+
"uri-js@npm:^4.2.2":
version: 4.4.1
resolution: "uri-js@npm:4.4.1"
@@ -7726,15 +7954,6 @@ __metadata:
languageName: node
linkType: hard
-"use-sync-external-store@npm:1.1.0":
- version: 1.1.0
- resolution: "use-sync-external-store@npm:1.1.0"
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- checksum: 8993a0b642f91d7fcdbb02b7b3ac984bd3af4769686f38291fe7fcfe73dfb73d6c64d20dfb7e5e7fbf5a6da8f5392d6f8e5b00c243a04975595946e82c02b883
- languageName: node
- linkType: hard
-
"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1":
version: 1.0.2
resolution: "util-deprecate@npm:1.0.2"
@@ -7778,15 +7997,6 @@ __metadata:
languageName: node
linkType: hard
-"warning@npm:^4.0.2":
- version: 4.0.3
- resolution: "warning@npm:4.0.3"
- dependencies:
- loose-envify: ^1.0.0
- checksum: 4f2cb6a9575e4faf71ddad9ad1ae7a00d0a75d24521c193fa464f30e6b04027bd97aa5d9546b0e13d3a150ab402eda216d59c1d0f2d6ca60124d96cd40dfa35c
- languageName: node
- linkType: hard
-
"web-streams-polyfill@npm:4.0.0-beta.1":
version: 4.0.0-beta.1
resolution: "web-streams-polyfill@npm:4.0.0-beta.1"
@@ -7882,8 +8092,8 @@ __metadata:
linkType: hard
"ws@npm:^7.3.1":
- version: 7.5.8
- resolution: "ws@npm:7.5.8"
+ version: 7.5.9
+ resolution: "ws@npm:7.5.9"
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ^5.0.2
@@ -7892,7 +8102,7 @@ __metadata:
optional: true
utf-8-validate:
optional: true
- checksum: 49479ccf3ddab6500c5906fbcc316e9c8cd44b0ffb3903a6c1caf9b38cb9e06691685722a4c642cfa7d4c6eb390424fc3142cd4f8b940cfc7a9ce9761b1cd65b
+ checksum: c3c100a181b731f40b7f2fddf004aa023f79d64f489706a28bc23ff88e87f6a64b3c6651fbec3a84a53960b75159574d7a7385709847a62ddb7ad6af76f49138
languageName: node
linkType: hard
@@ -7919,6 +8129,13 @@ __metadata:
languageName: node
linkType: hard
+"yaml@npm:^1.10.0":
+ version: 1.10.2
+ resolution: "yaml@npm:1.10.2"
+ checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f
+ languageName: node
+ linkType: hard
+
"yargs-parser@npm:^21.0.0":
version: 21.0.1
resolution: "yargs-parser@npm:21.0.1"