102 lines
2.6 KiB
Go
102 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
|
|
"inou/lib"
|
|
)
|
|
|
|
const Version = "2026-02-18" // Refactored: logic moved to lib/dicom.go
|
|
|
|
func main() {
|
|
fmt.Printf("dicom_import %s\n", Version)
|
|
|
|
if len(os.Args) < 3 {
|
|
fmt.Println("Usage: dicom_import <dossier_id_hex> <path> [series_filter]")
|
|
fmt.Println(" series_filter: optional, e.g. 'AX FLAIR' to only import matching series")
|
|
os.Exit(1)
|
|
}
|
|
|
|
dossierID := os.Args[1]
|
|
if len(dossierID) != 16 {
|
|
fmt.Printf("Invalid dossier ID: %s (must be 16 hex characters)\n", dossierID)
|
|
os.Exit(1)
|
|
}
|
|
|
|
inputPath := os.Args[2]
|
|
if strings.HasPrefix(inputPath, "~/") {
|
|
home, _ := os.UserHomeDir()
|
|
inputPath = filepath.Join(home, inputPath[2:])
|
|
}
|
|
|
|
seriesFilter := ""
|
|
if len(os.Args) >= 4 {
|
|
seriesFilter = os.Args[3]
|
|
fmt.Printf("Series filter: %s\n", seriesFilter)
|
|
}
|
|
|
|
// Setup log file
|
|
logPath := fmt.Sprintf("/tmp/dicom_import_%s.log", time.Now().Format("20060102_150405"))
|
|
logFile, err := os.Create(logPath)
|
|
if err != nil {
|
|
fmt.Printf("Warning: could not create log file: %v\n", err)
|
|
} else {
|
|
defer logFile.Close()
|
|
fmt.Printf("Logging to: %s\n", logPath)
|
|
}
|
|
|
|
logFn := func(format string, args ...interface{}) {
|
|
msg := fmt.Sprintf(format, args...)
|
|
fmt.Print(msg)
|
|
if logFile != nil {
|
|
logFile.WriteString(msg)
|
|
}
|
|
}
|
|
|
|
if err := lib.Init(); err != nil {
|
|
fmt.Printf("Error initializing: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
defer lib.DBClose()
|
|
fmt.Println("Initialized")
|
|
|
|
// Look up dossier
|
|
dossierEntries, err := lib.EntryRead("", dossierID, &lib.Filter{Category: 0})
|
|
if err != nil || len(dossierEntries) == 0 {
|
|
fmt.Printf("Error: dossier %s not found\n", dossierID)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Printf("Dossier: %s\n", dossierEntries[0].Summary)
|
|
|
|
// Check for existing imaging data
|
|
existing, _ := lib.EntryRead("", dossierID, &lib.Filter{Category: lib.CategoryImaging, Limit: 1})
|
|
if len(existing) > 0 {
|
|
fmt.Printf("Clean existing imaging data? (yes/no): ")
|
|
reader := bufio.NewReader(os.Stdin)
|
|
answer, _ := reader.ReadString('\n')
|
|
if strings.TrimSpace(answer) == "yes" {
|
|
fmt.Print("Cleaning...")
|
|
lib.EntryDelete("", dossierID, &lib.Filter{Category: lib.CategoryImaging})
|
|
lib.ObjectRemoveByDossier(nil, dossierID)
|
|
fmt.Println(" done")
|
|
}
|
|
}
|
|
|
|
result, err := lib.ImportDICOMFromPath(dossierID, inputPath, seriesFilter, logFn)
|
|
if err != nil {
|
|
fmt.Printf("Error: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Printf("\nDone: %d studies, %d series, %d slices", result.Studies, result.Series, result.Slices)
|
|
if len(result.Errors) > 0 {
|
|
fmt.Printf(", %d errors", len(result.Errors))
|
|
}
|
|
fmt.Println()
|
|
}
|