diff --git a/src/App.svelte b/src/App.svelte index e27a9a0..137d8dc 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -14,7 +14,7 @@ import MoviePage from './lib/pages/MoviePage.svelte'; import ModalStack from './lib/components/Modal/ModalStack.svelte'; import PageNotFound from './lib/pages/PageNotFound.svelte'; - import NavigationDebugger from './lib/components/NavigationDebugger.svelte'; + import NavigationDebugger from './lib/components/DebugElements.svelte'; appState.subscribe((s) => console.log('appState', s)); diff --git a/src/Container.svelte b/src/Container.svelte index d5b728e..142d2c7 100644 --- a/src/Container.svelte +++ b/src/Container.svelte @@ -2,13 +2,7 @@ @@ -15,9 +15,11 @@ - {#if $$slots.icon} -
- +
+ {#if $$slots.icon} +
+ +
+ {/if} +
+
- {/if} -
- + {#if $$slots['icon-after']} +
+ +
+ {/if}
- {#if $$slots['icon-after']} -
- -
- {/if} diff --git a/src/lib/components/NavigationDebugger.svelte b/src/lib/components/DebugElements.svelte similarity index 61% rename from src/lib/components/NavigationDebugger.svelte rename to src/lib/components/DebugElements.svelte index 1ab0738..e82c262 100644 --- a/src/lib/components/NavigationDebugger.svelte +++ b/src/lib/components/DebugElements.svelte @@ -49,7 +49,39 @@ {#if showOverlay}
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + {/if} diff --git a/src/lib/components/Dialog/ConfirmDialog.svelte b/src/lib/components/Dialog/ConfirmDialog.svelte new file mode 100644 index 0000000..369ec52 --- /dev/null +++ b/src/lib/components/Dialog/ConfirmDialog.svelte @@ -0,0 +1,53 @@ + + + +
+
+
+ +
+
+ +
+ + + + +
+
+
diff --git a/src/lib/components/Dialog/Dialog.ts b/src/lib/components/Dialog/Dialog.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/lib/components/MediaManager/FileList.svelte b/src/lib/components/MediaManager/FileList.svelte index cf1d3d7..526b546 100644 --- a/src/lib/components/MediaManager/FileList.svelte +++ b/src/lib/components/MediaManager/FileList.svelte @@ -1,49 +1,88 @@ -
- {#await files} - {#each new Array(5) as _, index} -
- -
+{#await files} + {#each new Array(5) as _, index} +
+ +
+ {/each} +{:then files} +
+ + Title + Runtime + Size + Quality + + + {#each files as file} + {/each} - {:then files} - {#each files as file, index} -
- -
- {:else} -
No local files found
- {/each} - {/await} -
+
+ {#if files?.length} + + + + {:else} +
+

No local files found

+
Your local files will appear here.
+
+ {/if} +{/await} diff --git a/src/lib/components/MediaManager/ReleaseList.svelte b/src/lib/components/MediaManager/ReleaseList.svelte index 0e1f9c4..5c4b2be 100644 --- a/src/lib/components/MediaManager/ReleaseList.svelte +++ b/src/lib/components/MediaManager/ReleaseList.svelte @@ -1,26 +1,26 @@ - - {#if $isLoading} - {#each new Array(5) as _, index} -
- -
- {/each} - {:else} - - - - -
- Title -
-
-
- - -
- Size -
-
-
- - -
- Peers -
-
-
- - -
- Quality -
-
-
-
- - {#each $filteredReleases?.filter((r) => r.guid && r.indexerId) || [] as release, index} - +{#await releases} + {#each new Array(5) as _, index} +
+ +
+ {/each} +{:then releases} +
+ + Age + Size + Peers + Quality + + + + {#each getRecommendedReleases(releases).sort(getSortFn(sortBy, sortDirection)) as release, index} + {/each} -

All Releases

-
- {#each $releases?.filter((r) => r.guid && r.indexerId) || [] as release, index} - - {/each} - - {/if} -
- -
- - - - - - - - - + +

All Releases

+ + {#each releases + .filter((r) => r.guid && r.indexerId) + .sort(getSortFn(sortBy, sortDirection)) as release, index} + + {/each} +
+{/await} diff --git a/src/lib/components/MediaManager/sonarr/SonarrMediaMangerModal.svelte b/src/lib/components/MediaManager/sonarr/SonarrMediaMangerModal.svelte index d9c2bb0..7a29522 100644 --- a/src/lib/components/MediaManager/sonarr/SonarrMediaMangerModal.svelte +++ b/src/lib/components/MediaManager/sonarr/SonarrMediaMangerModal.svelte @@ -26,7 +26,7 @@ const handleGrabRelease = (guid: string, indexerId: number) => sonarrApi - .downloadSonarrEpisode(guid, indexerId) + .downloadSonarrRelease(guid, indexerId) .then((ok) => { if (!ok) { // TODO: Show error diff --git a/src/lib/components/MediaManagerModal/Dialogs/MMConfirmDeleteFileDialog.svelte b/src/lib/components/MediaManagerModal/Dialogs/MMConfirmDeleteFileDialog.svelte new file mode 100644 index 0000000..40cb919 --- /dev/null +++ b/src/lib/components/MediaManagerModal/Dialogs/MMConfirmDeleteFileDialog.svelte @@ -0,0 +1,11 @@ + + + +

Delete file?

+
Are you sure you want to permanently delete this file?
+
diff --git a/src/lib/components/MediaManagerModal/MMLocalFileRow.svelte b/src/lib/components/MediaManagerModal/MMLocalFileRow.svelte new file mode 100644 index 0000000..dd367c7 --- /dev/null +++ b/src/lib/components/MediaManagerModal/MMLocalFileRow.svelte @@ -0,0 +1,38 @@ + + + + +
+ {file.sceneName} +
+
+ {file.mediaInfo?.runTime} + {formatSize(file.size || 0)} + {file.quality?.quality?.name} + + + modalStack.create(MMConfirmDeleteFileDialog, { + deleteFile: () => deleteFile(file.id || -1) + })} + > + + + +
diff --git a/src/lib/components/MediaManagerModal/MMMainLayout.svelte b/src/lib/components/MediaManagerModal/MMMainLayout.svelte index 3039099..bd41d6c 100644 --- a/src/lib/components/MediaManagerModal/MMMainLayout.svelte +++ b/src/lib/components/MediaManagerModal/MMMainLayout.svelte @@ -6,7 +6,7 @@
-
+
@@ -20,40 +20,47 @@
-
+

(activeTab = 'releases')} > Releases

(activeTab = 'local-files')} > Local Files

- + (activeTab = 'releases')} - class={classNames('transition-all row-start-1 col-start-1 px-6 -mx-6', { - 'opacity-50 -translate-x-full': activeTab !== 'releases' - })} + class={classNames( + 'row-start-1 col-start-1 pb-16 mx-16', + 'transition-all overflow-y-auto overflow-x-hidden scrollbar-hide', + { + 'opacity-30 -translate-x-full': activeTab !== 'releases' + } + )} > (activeTab = 'local-files')} - class={classNames('transition-all row-start-1 col-start-1 px-6 -mx-6', { - 'opacity-50 translate-x-full': activeTab !== 'local-files' - })} + class={classNames( + 'row-start-1 col-start-1 pb-16 mx-16', + 'transition-all overflow-y-auto overflow-x-hidden scrollbar-hide', + { + 'opacity-30 translate-x-full': activeTab !== 'local-files' + } + )} > diff --git a/src/lib/components/MediaManagerModal/MMReleaseListRow.svelte b/src/lib/components/MediaManagerModal/MMReleaseListRow.svelte index deef71f..1127b94 100644 --- a/src/lib/components/MediaManagerModal/MMReleaseListRow.svelte +++ b/src/lib/components/MediaManagerModal/MMReleaseListRow.svelte @@ -2,102 +2,60 @@ import { formatMinutesToTime, formatSize } from '../../utils.js'; import type { RadarrRelease } from '../../apis/radarr/radarr-api'; import type { SonarrRelease } from '../../apis/sonarr/sonarr-api'; - import Container from '../../../Container.svelte'; - import classNames from 'classnames'; import { scrollIntoView } from '../../selectable'; - import { Download } from 'radix-icons-svelte'; - import type { Readable } from 'svelte/store'; + import { Check, Download } from 'radix-icons-svelte'; + import TableRow from '../Table/TableRow.svelte'; + import type { GrabRelease } from './MediaManagerModal'; + import TableButton from '../Table/TableButton.svelte'; + import TableCell from '../Table/TableCell.svelte'; export let release: RadarrRelease | SonarrRelease; - let hasFocusWithin: Readable; + export let grabRelease: GrabRelease; + let fetching = false; + let didGrab = false; + + function handleGrabRelease() { + fetching = true; + grabRelease(release).then((ok) => { + fetching = false; + didGrab = ok; + }); + } - - - -
- -

- {formatMinutesToTime(release.ageMinutes || 0)} ago -

-

{release.title}

- + + +
+

+ {formatMinutesToTime(release.ageMinutes || 0)} ago +

+

{release.title}

+
+
+ {formatSize(release.size || 0)} - - + +
{release.seeders} / {release.leechers}
- - +
+
{release.quality?.quality?.name}
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
-
-
- - +
+ + + + + +
diff --git a/src/lib/components/MediaManagerModal/MediaManagerModal.ts b/src/lib/components/MediaManagerModal/MediaManagerModal.ts new file mode 100644 index 0000000..38d8275 --- /dev/null +++ b/src/lib/components/MediaManagerModal/MediaManagerModal.ts @@ -0,0 +1,4 @@ +import type { Release } from '../../apis/combined-types'; + +export type GrabRelease = (release: Release) => Promise; +export type DeleteFile = (id: number) => Promise; diff --git a/src/lib/components/MediaManagerModal/SeasonMediaManagerModal.svelte b/src/lib/components/MediaManagerModal/SeasonMediaManagerModal.svelte index a455cd9..8925cbf 100644 --- a/src/lib/components/MediaManagerModal/SeasonMediaManagerModal.svelte +++ b/src/lib/components/MediaManagerModal/SeasonMediaManagerModal.svelte @@ -6,6 +6,8 @@ import ReleaseList from '../MediaManager/ReleaseList.svelte'; import DownloadList from '../MediaManager/DownloadList.svelte'; import FileList from '../MediaManager/FileList.svelte'; + import type { DeleteFile, GrabRelease } from './MediaManagerModal'; + import type { Release } from '../../apis/combined-types'; export let id: number; // Tmdb ID export let season: number; @@ -16,12 +18,15 @@ const downloads = sonarrItem.then((si) => sonarrApi.getDownloadsBySeriesId(si?.id || -1)); const files = sonarrItem.then((si) => sonarrApi.getFilesBySeriesId(si?.id || -1)); - const getReleases = () => - sonarrItem.then((si) => sonarrApi.getSeasonReleases(si?.id || -1, season)); - const selectRelease = () => {}; + // Releases + const releases: Promise = sonarrItem.then((si) => + sonarrApi.getSeasonReleases(si?.id || -1, season) + ); + const grabRelease: GrabRelease = (release) => + sonarrApi.downloadSonarrRelease(release.guid || '', release.indexerId || -1); const cancelDownload = sonarrApi.cancelDownloadSonarrEpisode; - const handleSelectFile = () => {}; + const deleteFile: DeleteFile = sonarrApi.deleteSonarrEpisode; @@ -32,9 +37,9 @@

{series?.title}

Season {season} Packs

- + + -
{/if} {/await} diff --git a/src/lib/components/Table/Table.svelte b/src/lib/components/Table/Table.svelte new file mode 100644 index 0000000..d8d7618 --- /dev/null +++ b/src/lib/components/Table/Table.svelte @@ -0,0 +1,14 @@ + + + + + + + + + +
diff --git a/src/lib/components/Table/TableButton.svelte b/src/lib/components/Table/TableButton.svelte new file mode 100644 index 0000000..8de9172 --- /dev/null +++ b/src/lib/components/Table/TableButton.svelte @@ -0,0 +1,28 @@ + + + +
+
+ +
+
+
diff --git a/src/lib/components/Table/TableCell.svelte b/src/lib/components/Table/TableCell.svelte new file mode 100644 index 0000000..9019271 --- /dev/null +++ b/src/lib/components/Table/TableCell.svelte @@ -0,0 +1,29 @@ + + +
+ +
+ + diff --git a/src/lib/components/Table/TableHeaderCell.svelte b/src/lib/components/Table/TableHeaderCell.svelte new file mode 100644 index 0000000..3a8cb8b --- /dev/null +++ b/src/lib/components/Table/TableHeaderCell.svelte @@ -0,0 +1,17 @@ +
+ +
+ + diff --git a/src/lib/components/Table/TableHeaderRow.svelte b/src/lib/components/Table/TableHeaderRow.svelte new file mode 100644 index 0000000..f5a0e8c --- /dev/null +++ b/src/lib/components/Table/TableHeaderRow.svelte @@ -0,0 +1,12 @@ + + + + + + diff --git a/src/lib/components/Table/TableHeaderSortBy.svelte b/src/lib/components/Table/TableHeaderSortBy.svelte new file mode 100644 index 0000000..1cbcb8c --- /dev/null +++ b/src/lib/components/Table/TableHeaderSortBy.svelte @@ -0,0 +1,29 @@ + + + + + + {#if icon} + + {/if} + + diff --git a/src/lib/components/Table/TableRow.svelte b/src/lib/components/Table/TableRow.svelte new file mode 100644 index 0000000..81a0d22 --- /dev/null +++ b/src/lib/components/Table/TableRow.svelte @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/src/lib/components/TextField.svelte b/src/lib/components/TextField.svelte index 598384b..a61d9c9 100644 --- a/src/lib/components/TextField.svelte +++ b/src/lib/components/TextField.svelte @@ -33,7 +33,7 @@ Label