diff --git a/src/lib/components/library/LibraryToolbar.svelte b/src/lib/components/library/LibraryToolbar.svelte
index 7f2dc60..13b0022 100644
--- a/src/lib/components/library/LibraryToolbar.svelte
+++ b/src/lib/components/library/LibraryToolbar.svelte
@@ -3,6 +3,7 @@
MagnifyingGlass, Books, DownloadSimple, Folder, FolderSimple,
SortAscending, CaretUp, CaretDown, ArrowsClockwise, Star, X, CheckSquare,
} from "phosphor-svelte";
+ import { canOpenFolder } from "$lib/core/filesystem";
import LibraryFilters from "./LibraryFilters.svelte";
import type { Category } from "$lib/types";
import type { LibrarySortOption, LibrarySortDir, LibraryStatusFilter, LibraryContentFilter } from "$lib/state/library.svelte";
@@ -165,9 +166,11 @@
{/if}
-
+ {#if canOpenFolder()}
+
+ {/if}
- {#if downloadedCount > 0}
+ {#if downloadedCount > 0 && canOpenFolder()}
diff --git a/src/lib/core/filesystem.ts b/src/lib/core/filesystem.ts
index 28d546f..1f3cd61 100644
--- a/src/lib/core/filesystem.ts
+++ b/src/lib/core/filesystem.ts
@@ -16,11 +16,28 @@ function join(root: string, ...parts: string[]): string {
return [root.replace(/[/\\]$/, ''), ...parts].join(sep)
}
-function checkSupported(): boolean {
+function isLocalServer(): boolean {
+ try {
+ const host = new URL(settingsState.settings.serverUrl).hostname
+ return host === 'localhost' || host === '127.0.0.1' || host === '::1'
+ } catch {
+ return false
+ }
+}
+
+export function canOpenFolder(): boolean {
+ return platformService.isSupported('filesystem') && isLocalServer()
+}
+
+function checkCanOpenFolder(): boolean {
if (!platformService.isSupported('filesystem')) {
addToast({ kind: 'info', title: 'Desktop only', body: 'Opening folders requires the desktop app.' })
return false
}
+ if (!isLocalServer()) {
+ addToast({ kind: 'info', title: 'Remote server', body: 'Folder access is unavailable when connected to a remote server.' })
+ return false
+ }
return true
}
@@ -33,7 +50,7 @@ function checkRoot(root: string): boolean {
}
export async function openMangaFolder(manga: Manga): Promise {
- if (!checkSupported()) return
+ if (!checkCanOpenFolder()) return
const root = getDownloadsRoot()
if (!checkRoot(root)) return
const source = (manga as any).source?.displayName ?? (manga as any).source?.name ?? ''
@@ -44,14 +61,14 @@ export async function openMangaFolder(manga: Manga): Promise {
}
export async function openDownloadsFolder(): Promise {
- if (!checkSupported()) return
+ if (!checkCanOpenFolder()) return
const root = getDownloadsRoot()
if (!checkRoot(root)) return
await platformService.openPath(root).catch(console.error)
}
export async function openCustomFolder(path: string): Promise {
- if (!checkSupported()) return
+ if (!checkCanOpenFolder()) return
if (!path?.trim()) return
await platformService.openPath(path).catch(console.error)
}
\ No newline at end of file