diff --git a/client/src/Router.tsx b/client/src/Router.tsx
index e2d90110..ceff3f26 100644
--- a/client/src/Router.tsx
+++ b/client/src/Router.tsx
@@ -12,6 +12,7 @@ import { ImportFromFloxPage } from './pages/import/ImportFromFloxPage';
import { ImportFromGoodreadsPage } from './pages/import/ImportFromGoodreadsPage';
import { ImportFromSimklPage } from './pages/import/ImportFromSimklPage';
import { ImportFromTraktPage } from './pages/import/ImportFromTraktPage';
+import { ImportFromCsvPage } from './pages/import/ImportFromCsvPage';
import { ImportPage } from './pages/ImportPage';
import { JellyfinIntegrationPage } from './pages/integrations/JellyfinIntegrationPage';
import { KodiIntegrationPage } from './pages/integrations/KodiIntegrationPage';
@@ -159,6 +160,10 @@ export const router = createBrowserRouter([
path: '/import/mediatracker',
element: ,
},
+ {
+ path: '/import/csv',
+ element: ,
+ },
{
path: '/integrations',
element: ,
diff --git a/client/src/pages/ImportFromFilePage.tsx b/client/src/pages/ImportFromFilePage.tsx
index 00faddda..a19b02f2 100644
--- a/client/src/pages/ImportFromFilePage.tsx
+++ b/client/src/pages/ImportFromFilePage.tsx
@@ -61,7 +61,8 @@ export const ImportFormFilePage: FC<{
/>
{importFromFile.isError && (
-
Unexpected file format
+
Unexpected file format
+
{ importFromFile.variables?.source == 'CSV' ? importFromFile.error.message : "" }
)}
{file && (
diff --git a/client/src/pages/ImportPage.tsx b/client/src/pages/ImportPage.tsx
index 24713a81..5c7f6bcf 100644
--- a/client/src/pages/ImportPage.tsx
+++ b/client/src/pages/ImportPage.tsx
@@ -27,6 +27,7 @@ export const ImportPage: FC = () => {
+
>
);
diff --git a/client/src/pages/SearchPage.tsx b/client/src/pages/SearchPage.tsx
index 31da8855..d92e69aa 100644
--- a/client/src/pages/SearchPage.tsx
+++ b/client/src/pages/SearchPage.tsx
@@ -55,6 +55,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => {
narrator: ['audiobook'],
tmdbId: ['movie', 'tv'],
imdbId: ['movie', 'tv'],
+ igdbId: ['video_game']
});
const [query, setQuery] = useState({
@@ -63,6 +64,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => {
narrator: searchParams.get('narrator'),
imdbId: searchParams.get('imdbId'),
tmdbId: parseInt(searchParams.get('tmdbId') || '') || null,
+ igdbId: parseInt(searchParams.get('igdbId') || '') || null,
});
const searchQuery = trpc.search.search.useQuery(
@@ -106,6 +108,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => {
narrator: string;
imdbId: string;
tmdbId: string;
+ igdbId: string;
}>
className="flex flex-col gap-5 md:flex-row"
validation={
@@ -120,9 +123,10 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => {
},
}
: undefined
- }
+ }
initialValues={{
tmdbId: query.tmdbId?.toString() || undefined,
+ igdbId: query.igdbId?.toString() || undefined,
author: query.author || undefined,
imdbId: query.imdbId || undefined,
narrator: query.narrator || undefined,
@@ -137,6 +141,9 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => {
data.tmdbId?.length > 0
? !isNaN(parseInt(data.tmdbId || ''))
: false,
+ data.igdbId?.length > 0
+ ? !isNaN(parseInt(data.igdbId || ''))
+ : false,
data.imdbId,
].filter(Boolean).length === 0
) {
@@ -152,6 +159,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => {
narrator: data.narrator || null,
imdbId: data.imdbId || null,
tmdbId: parseInt(data.tmdbId || '') || null,
+ igdbId: parseInt(data.igdbId || '') || null,
};
setQuery(newQuery);
@@ -171,7 +179,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => {
= (props) => {
narrator: null,
query: null,
tmdbId: null,
+ igdbId: null,
});
}}
/>
@@ -190,7 +199,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => {
{canUse('author') && (
= (props) => {
{canUse('narrator') && (
= (props) => {
{canUse('tmdbId') && (
= (props) => {
{canUse('imdbId') && (
)}
+ {canUse('igdbId') && (
+
+ )}
+