85 lines
1.6 KiB
Go
85 lines
1.6 KiB
Go
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
|
|
}
|