Initial Commit. Seems to work
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					# Ignore the binary
 | 
				
			||||||
 | 
					jpg-metadata
 | 
				
			||||||
							
								
								
									
										118
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							@@ -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)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user