package main import ( "flag" "fmt" "os" "os/exec" "path/filepath" "strconv" "strings" ) var dryrun bool var execCmd string func main() { args := os.Args[1:] if len(args) == 0 { fmt.Println("No action specified") return } flag.BoolVar(&dryrun, "n", false, "Show what would have been done.") flag.StringVar(&execCmd, "exec", "", "Run commant on matching file.") flag.Parse() fmt.Println(execCmd) fmt.Println(dryrun) switch flag.Arg(0) { case "normalize": fallthrough case "n": filepath.Walk(".", normalize) case "removesuffix": fallthrough case "rs": suffix := args[1] filepath.Walk(".", removeSuffix(suffix)) removeSuffix(suffix) break case "unpack": fallthrough case "up": filepath.Walk(".", unpack) default: fmt.Println("Invalid action specified") return } } func skipDir(filename string) (bool, error) { if filename == "." || filename == ".." { return true, nil } if filename == "Bin" { return true, filepath.SkipDir } return false, nil } func removeSuffix(suffix string) filepath.WalkFunc { return func(p string, f os.FileInfo, err error) error { filename := f.Name() if skip, err := skipDir(filename); skip { return err } element := newMediaElement(p) fmt.Println(element.Path()) dir := filepath.Dir(p) ext := filepath.Ext(filename) filenameNoExt := trimSuffix(filename, ext) filenameNoSuff := trimSuffix(filenameNoExt, suffix) if filenameNoSuff != filenameNoExt { newFilename := filenameNoSuff + ext err := os.Rename(filepath.Join(dir, filename), filepath.Join(dir, newFilename)) if err != nil { fmt.Printf("Could not rename %s: %v\n", filename, err) } else { fmt.Println("Renamed " + filename + " to " + newFilename) } } return nil } } func normalize(p string, f os.FileInfo, err error) error { filename := f.Name() if skip, err := skipDir(filename); skip { return err } element := newMediaElement(p) newPath := element.Path() if newPath != p { if dryrun { fmt.Printf("Would move %s to %s\n", p, newPath) } else { os.Rename(p, newPath) fmt.Printf("%s => %s\n", p, newPath) } } return nil } func unpack(p string, f os.FileInfo, err error) error { filename := f.Name() if skip, err := skipDir(filename); skip { return err } ext := filepath.Ext(filename) ext = strings.ToLower(ext) if ext != ".rar" { return nil } cmd := exec.Command(execCmd, p) filename = trimSuffix(filename, ext) ext = filepath.Ext(filename) if ext == "" { fmt.Println(p) err := cmd.Run() if err != nil { fmt.Printf("Error executing: %v\n", err) } fmt.Println(p) return nil } if strings.HasPrefix(ext, ".part") { ext = ext[5:] part, err := strconv.Atoi(ext) if err == nil && part == 1 { fmt.Println(p) err := cmd.Run() if err != nil { fmt.Printf("Error executing: %v\n", err) } fmt.Println(p) return nil } } return nil }