commit 7873d4a2a3ef2402a71012b95976a17b83231dfc Author: Brian Buller Date: Fri Dec 1 10:54:43 2017 -0600 Initial Commit. Seems to work diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dfdae00 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Ignore the binary +jpg-metadata diff --git a/main.go b/main.go new file mode 100644 index 0000000..380c25a --- /dev/null +++ b/main.go @@ -0,0 +1,118 @@ +package main + +import ( + "errors" + "flag" + "fmt" + "io/ioutil" + "os" + "strings" + + "github.com/rwcarlsen/goexif/exif" +) + +var inJson bool +var filename string + +func init() { + const ( + filenameUsage = "The File/Directory to scan" + inJsonDefault = false + inJsonUsage = "Output the result in JSON" + ) + flag.StringVar(&filename, "filename", "", filenameUsage) + flag.BoolVar(&inJson, "json", inJsonDefault, inJsonUsage) +} + +func main() { + flag.Parse() + + fInfo, err := os.Lstat(filename) + if err != nil { + fmt.Println("Error reading passed file/directory") + os.Exit(1) + } + if fInfo.IsDir() { + ProcessDirectory(filename, inJson) + } else { + PrintJpegData(filename, inJson) + } +} + +func ProcessDirectory(dirname string, inJson bool) { + if !inJson { + fmt.Println("Reading Directory:", dirname) + } + files, err := ioutil.ReadDir(dirname) + if err != nil { + panic(err) + } + + if !strings.HasSuffix(dirname, "/") { + dirname += "/" + } + + if inJson { + fmt.Print("[") + } + foundFirst := false + for _, file := range files { + if isJpeg(dirname+file.Name()) && inJson && foundFirst { + fmt.Print(",") + } + if PrintJpegData(dirname+file.Name(), inJson) == nil { + foundFirst = true + if !inJson { + fmt.Println("") + } + } + } + if inJson { + fmt.Print("]") + } +} + +func isJpeg(filename string) bool { + nm := strings.ToUpper(filename) + return strings.HasSuffix(nm, ".JPG") || strings.HasSuffix(nm, ".JPEG") +} + +func PrintJpegData(filename string, inJson bool) error { + if !isJpeg(filename) { + return errors.New("Not a JPEG") + } + exif, err := ReadExifData(filename) + if err != nil { + if !inJson { + fmt.Println("Error: " + err.Error()) + return err + } + } + if inJson { + fmt.Print("{\"Filename\":\"" + filename + "\",\"Exif\":") + if exif == nil { + fmt.Print("{}") + } else { + json, err := exif.MarshalJSON() + if err != nil { + fmt.Print("{}") + } + fmt.Print(string(json)) + } + fmt.Print("}") + } else { + fmt.Println("= " + filename + " =") + fmt.Println(exif) + } + return nil +} + +func ReadExifData(filename string) (*exif.Exif, error) { + f, err := os.Open(filename) + if err != nil { + fmt.Println("Error:", err.Error()) + return &exif.Exif{}, err + } + defer f.Close() + return exif.Decode(f) +}