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 [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() }