Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 44 additions & 1 deletion frontend/src/components/queue/ImportMethods.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -607,12 +607,14 @@ function StatusBadge({ status }: { status: string }) {
function NzbDavImportSection() {
const [inputMethod, setInputMethod] = useState<"server" | "upload">("server");
const [selectedDbPath, setSelectedDbPath] = useState("");
const [blobsPath, setBlobsPath] = useState("");
const [selectedFile, setSelectedFile] = useState<File | null>(null);
const [rootFolder, setRootFolder] = useState("");
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<Error | null>(null);
const { showToast } = useToast();
const [isFileBrowserOpen, setIsFileBrowserOpen] = useState(false);
const [isBlobsBrowserOpen, setIsBlobsBrowserOpen] = useState(false);

const { data: importStatus } = useNzbdavImportStatus(2000);
const cancelImport = useCancelNzbdavImport();
Expand All @@ -639,6 +641,9 @@ function NzbDavImportSection() {

const formData = new FormData();
formData.append("rootFolder", rootFolder);
if (blobsPath) {
formData.append("blobsPath", blobsPath);
}

if (inputMethod === "server") {
formData.append("dbPath", selectedDbPath);
Expand Down Expand Up @@ -680,6 +685,10 @@ function NzbDavImportSection() {
setSelectedDbPath(path);
};

const handleBlobsSelect = (path: string) => {
setBlobsPath(path);
};

const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
if (e.target.files && e.target.files.length > 0) {
setSelectedFile(e.target.files[0]);
Expand Down Expand Up @@ -899,7 +908,7 @@ function NzbDavImportSection() {
<div className="h-px flex-1 bg-base-300" />
</div>

<div className="rounded-2xl border-2 border-base-300/80 bg-base-200/60 p-6">
<div className="space-y-4 rounded-2xl border-2 border-base-300/80 bg-base-200/60 p-6">
{inputMethod === "server" ? (
<fieldset className="fieldset min-w-0">
<legend className="fieldset-legend font-semibold text-xs">
Expand Down Expand Up @@ -937,6 +946,32 @@ function NzbDavImportSection() {
/>
</fieldset>
)}

<fieldset className="fieldset min-w-0">
<legend className="fieldset-legend font-semibold text-xs">
Blobs Directory (Required for NzbDav alpha)
</legend>
<div className="join w-full">
<input
type="text"
placeholder="e.g. /data/nzbdav/blobs"
className="input join-item w-full bg-base-100 font-mono"
value={blobsPath}
onChange={(e) => setBlobsPath(e.target.value)}
/>
<button
type="button"
className="btn btn-primary join-item px-6"
onClick={() => setIsBlobsBrowserOpen(true)}
>
Browse
</button>
</div>
<p className="label text-base-content/60 text-xs">
If left empty, it will default to a "blobs" folder in the same directory as the
database.
</p>
</fieldset>
</div>
</section>

Expand All @@ -963,6 +998,14 @@ function NzbDavImportSection() {
onSelect={handleFileSelect}
filterExtension=".sqlite"
/>

<FileBrowserModal
isOpen={isBlobsBrowserOpen}
onClose={() => setIsBlobsBrowserOpen(false)}
onSelect={handleBlobsSelect}
title="Select Blobs Directory"
allowDirectorySelection={true}
/>
</div>
);
}
Expand Down
9 changes: 8 additions & 1 deletion internal/api/nzbdav_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ func (s *Server) handleImportNzbdav(c *fiber.Ctx) error {
})
}

blobsPath := c.FormValue("blobsPath")

// 2. Handle File Source (Path or Upload)
dbPath := c.FormValue("dbPath")
var isTempFile bool
Expand Down Expand Up @@ -78,8 +80,13 @@ func (s *Server) handleImportNzbdav(c *fiber.Ctx) error {
isTempFile = true
}

// Default blobsPath if not provided
if blobsPath == "" {
blobsPath = filepath.Join(filepath.Dir(dbPath), "blobs")
}

// 3. Start Async Import
if err := s.importerService.StartNzbdavImport(dbPath, rootFolder, isTempFile); err != nil {
if err := s.importerService.StartNzbdavImport(dbPath, blobsPath, rootFolder, isTempFile); err != nil {
if isTempFile {
os.Remove(dbPath) // Clean up if start failed
}
Expand Down
2 changes: 1 addition & 1 deletion internal/importer/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ type DirectoryScanner interface {
// NzbDavImporter handles bulk import from NzbDav databases
type NzbDavImporter interface {
// StartNzbdavImport begins importing from an NzbDav database
StartNzbdavImport(dbPath string, rootFolder string, cleanupFile bool) error
StartNzbdavImport(dbPath string, blobsPath string, rootFolder string, cleanupFile bool) error
// GetImportStatus returns the current import status
GetImportStatus() ImportInfo
// CancelImport cancels an in-progress import
Expand Down
8 changes: 4 additions & 4 deletions internal/importer/scanner/nzbdav.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func NewNzbDavImporter(batchAdder BatchQueueAdder) *NzbDavImporter {
}

// Start starts an asynchronous import from an NZBDav database
func (n *NzbDavImporter) Start(dbPath string, rootFolder string, cleanupFile bool) error {
func (n *NzbDavImporter) Start(dbPath string, blobsPath string, rootFolder string, cleanupFile bool) error {
n.mu.Lock()
defer n.mu.Unlock()

Expand All @@ -64,7 +64,7 @@ func (n *NzbDavImporter) Start(dbPath string, rootFolder string, cleanupFile boo
Skipped: 0,
}

go n.performImport(importCtx, dbPath, rootFolder, cleanupFile)
go n.performImport(importCtx, dbPath, blobsPath, rootFolder, cleanupFile)

return nil
}
Expand Down Expand Up @@ -108,9 +108,9 @@ func (n *NzbDavImporter) Reset() {
}

// performImport performs the actual import work
func (n *NzbDavImporter) performImport(ctx context.Context, dbPath string, rootFolder string, cleanupFile bool) {
func (n *NzbDavImporter) performImport(ctx context.Context, dbPath string, blobsPath string, rootFolder string, cleanupFile bool) {
// Parse Database
parser := nzbdav.NewParser(dbPath)
parser := nzbdav.NewParser(dbPath, blobsPath)
nzbChan, errChan := parser.Parse()

defer func() {
Expand Down
4 changes: 2 additions & 2 deletions internal/importer/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -504,8 +504,8 @@ func (s *Service) CancelScan() error {
}

// StartNzbdavImport starts an asynchronous import from an NZBDav database
func (s *Service) StartNzbdavImport(dbPath string, rootFolder string, cleanupFile bool) error {
return s.nzbdavImporter.Start(dbPath, rootFolder, cleanupFile)
func (s *Service) StartNzbdavImport(dbPath string, blobsPath string, rootFolder string, cleanupFile bool) error {
return s.nzbdavImporter.Start(dbPath, blobsPath, rootFolder, cleanupFile)
}

// GetImportStatus returns the current import status
Expand Down
Loading
Loading