From 6a402623c44b60a4b1dc70b0fddb504ff1090678 Mon Sep 17 00:00:00 2001 From: Lukas Date: Fri, 5 Jun 2026 22:06:55 +0200 Subject: [PATCH] feat(setup): add unresolved folders GUI for manual series resolution - Add /setup/unresolved page for manual provider key resolution - Integrate unresolved check into setup wizard flow - Auto-redirect to unresolved page if folders need resolution After initial setup scan, folders that couldn't be auto-resolved are now tracked and can be resolved manually via the GUI. Endpoints: - GET /api/setup/unresolved - list unresolved folders - POST /api/setup/unresolved/{folder}/resolve - resolve with provider key - POST /api/setup/unresolved/{folder}/search - re-search for suggestions - DELETE /api/setup/unresolved/{folder} - delete without adding --- src/server/controllers/page_controller.py | 10 + src/server/web/templates/setup.html | 29 +- src/server/web/templates/unresolved.html | 707 ++++++++++++++++++++++ 3 files changed, 741 insertions(+), 5 deletions(-) create mode 100644 src/server/web/templates/unresolved.html diff --git a/src/server/controllers/page_controller.py b/src/server/controllers/page_controller.py index 7f14a50..84a1403 100644 --- a/src/server/controllers/page_controller.py +++ b/src/server/controllers/page_controller.py @@ -59,3 +59,13 @@ async def loading_page(request: Request): request, title="Initializing - Aniworld" ) + + +@router.get("/setup/unresolved", response_class=HTMLResponse) +async def unresolved_page(request: Request): + """Serve the unresolved folders resolution page.""" + return render_template( + "unresolved.html", + request, + title="Resolve Series - Aniworld" + ) diff --git a/src/server/web/templates/setup.html b/src/server/web/templates/setup.html index b88b62d..06e208a 100644 --- a/src/server/web/templates/setup.html +++ b/src/server/web/templates/setup.html @@ -790,17 +790,36 @@ const data = await response.json(); if (response.ok && data.status === 'ok') { - // Redirect to loading page if provided, otherwise go to login + // Redirect to loading page if provided, otherwise check for unresolved folders if (data.redirect) { showMessage('Setup saved! Initializing your anime library...', 'success'); setTimeout(() => { window.location.href = data.redirect; }, 500); } else { - showMessage('Setup completed successfully! Redirecting to login...', 'success'); - setTimeout(() => { - window.location.href = '/login'; - }, 2000); + // Check for unresolved folders before redirecting + showMessage('Setup completed successfully! Checking for unresolved series...', 'success'); + setTimeout(async () => { + try { + const token = localStorage.getItem('auth_token'); + const res = await fetch('/api/setup/unresolved', { + headers: { 'Authorization': `Bearer ${token}` } + }); + if (res.ok) { + const unresolved = await res.json(); + if (unresolved && unresolved.length > 0) { + window.location.href = '/setup/unresolved'; + } else { + window.location.href = '/login'; + } + } else { + window.location.href = '/login'; + } + } catch (e) { + console.error('Error checking unresolved folders:', e); + window.location.href = '/login'; + } + }, 1000); } } else { const errorMessage = data.detail || data.message || 'Setup failed'; diff --git a/src/server/web/templates/unresolved.html b/src/server/web/templates/unresolved.html new file mode 100644 index 0000000..714b556 --- /dev/null +++ b/src/server/web/templates/unresolved.html @@ -0,0 +1,707 @@ + + + + + + + AniWorld Manager - Resolve Series + + + + + + +
+ + +
+
+
+ +
+

Resolve Unresolved Series

+

Some series couldn't be found automatically. Enter the provider key for each folder to complete setup.

+
+ +
+
+

Loading unresolved folders...

+
+ + + + + + +
+
+ +
+ + + + + \ No newline at end of file