package repair import ( "fmt" "github.com/sirrobot01/decypharr/pkg/arr" "os" "path/filepath" ) func fileIsSymlinked(file string) bool { info, err := os.Lstat(file) if err != nil { return false } return info.Mode()&os.ModeSymlink != 0 } func getSymlinkTarget(file string) string { if fileIsSymlinked(file) { target, err := os.Readlink(file) if err != nil { return "" } if !filepath.IsAbs(target) { dir := filepath.Dir(file) target = filepath.Join(dir, target) } return target } return "" } func fileIsReadable(filePath string) error { // First check if file exists and is accessible info, err := os.Stat(filePath) if err != nil { return err } // Check if it's a regular file if !info.Mode().IsRegular() { return fmt.Errorf("not a regular file") } // Try to read the first 1024 bytes err = checkFileStart(filePath) if err != nil { return err } return nil } func checkFileStart(filePath string) error { f, err := os.Open(filePath) if err != nil { return err } defer f.Close() // Read first 1kb buffer := make([]byte, 1024) _, err = f.Read(buffer) if err != nil { return err } return nil } func collectFiles(media arr.Content) map[string][]arr.ContentFile { uniqueParents := make(map[string][]arr.ContentFile) files := media.Files for _, file := range files { target := getSymlinkTarget(file.Path) if target != "" { file.IsSymlink = true dir, f := filepath.Split(target) torrentNamePath := filepath.Clean(dir) // Set target path folder/file.mkv file.TargetPath = f uniqueParents[torrentNamePath] = append(uniqueParents[torrentNamePath], file) } } return uniqueParents }