diff --git a/fileinfo.go b/fileinfo.go index 757e463..c144c87 100644 --- a/fileinfo.go +++ b/fileinfo.go @@ -1,10 +1,12 @@ package main import ( - "log" + "fmt" + "io/ioutil" "os" + "strings" - "github.com/rakyll/magicmime" + filetype "gopkg.in/h2non/filetype.v1" ) func getFileSize(s string) (size int64, err error) { @@ -22,17 +24,72 @@ func getFileSize(s string) (size int64, err error) { return } -func getFileMime(s string) (mimetype string, err error) { - if err := magicmime.Open(magicmime.MAGIC_MIME_TYPE | magicmime.MAGIC_SYMLINK | magicmime.MAGIC_ERROR); err != nil { - log.Fatal(err) - return "", err +// not able to detect audio/amr and requries linux local dependency, not good +// func getFileMime(s string) (mimetype string, err error) { +// if err := magicmime.Open(magicmime.MAGIC_MIME_TYPE | magicmime.MAGIC_SYMLINK | magicmime.MAGIC_ERROR); err != nil { +// log.Fatal(err) +// return "", err +// } +// defer magicmime.Close() + +// mimetype, err = magicmime.TypeByFile(s) +// if err != nil { +// log.Fatalf("error occured during type lookup: %v", err) +// } +// //log.Printf("mime-type: %v", mimetype) +// return +// } + +func getFileMime(s string) (mimetype string, ext string, err error) { + buf, _ := ioutil.ReadFile(s) + + kind, unkwown := filetype.Match(buf) + if unkwown != nil { + fmt.Printf("Unkwown: %s", unkwown) + return } - defer magicmime.Close() + mimetype = kind.MIME.Value + ext = kind.Extension + //fmt.Printf("File type: %s. MIME: %s\n", kind.Extension, kind.MIME.Value) + return +} - mimetype, err = magicmime.TypeByFile(s) +func isMP3(path string) bool { + mime, ext, err := getFileMime(path) if err != nil { - log.Fatalf("error occured during type lookup: %v", err) + return false } - //log.Printf("mime-type: %v", mimetype) - return + check1 := strings.EqualFold("mp3", ext) + check2 := strings.EqualFold("audio/mpeg", mime) + return check1 && check2 +} + +func isAmr(path string) bool { + mime, ext, err := getFileMime(path) + if err != nil { + return false + } + check1 := strings.EqualFold("amr", ext) + check2 := strings.EqualFold("audio/amr", mime) + return check1 && check2 +} + +func isMP4(path string) bool { + mime, ext, err := getFileMime(path) + if err != nil { + return false + } + check1 := strings.EqualFold("mp4", ext) + check2 := strings.EqualFold("video/mp4", mime) + return check1 && check2 +} + +func isJPG(path string) bool { + mime, ext, err := getFileMime(path) + if err != nil { + return false + } + check1 := strings.EqualFold("jpg", ext) + check2 := strings.EqualFold("image/jpeg", mime) + return check1 && check2 } diff --git a/fileinfo_test.go b/fileinfo_test.go index f6fb02b..4196afa 100644 --- a/fileinfo_test.go +++ b/fileinfo_test.go @@ -8,12 +8,14 @@ import ( func TestGetFileSize(t *testing.T) { var fileSize = map[string]int{ - "media_for_test/640x480.jpg": 50668, - "media_for_test/3640x3480.jpg": 785190, - "media_for_test/video.mp4": 75520, + "640x480.jpg": 50668, + "3640x3480.jpg": 785190, + "video.mp4": 75520, + "example.amr": 56486, + "wechat_incoming_msg.mp3": 14639, } for k, v := range fileSize { - size, _ := getFileSize(k) + size, _ := getFileSize("media_for_test/" + k) msg := fmt.Sprintf("%s should have size %d, not %d", k, v, size) AssertEqual(t, size, int64(v), msg) } @@ -21,13 +23,75 @@ func TestGetFileSize(t *testing.T) { func TestGetMimeType(t *testing.T) { var fileMime = map[string]string{ - "media_for_test/640x480.jpg": "image/jpeg", - "media_for_test/3640x3480.jpg": "image/jpeg", - "media_for_test/video.mp4": "video/mp4", + "640x480.jpg": "image/jpeg", + "3640x3480.jpg": "image/jpeg", + "video.mp4": "video/mp4", + "example.amr": "audio/amr", + "wechat_incoming_msg.mp3": "audio/mpeg", } for k, v := range fileMime { - mime, _ := getFileMime(k) + mime, _, _ := getFileMime("media_for_test/" + k) msg := fmt.Sprintf("%s should be %s, not %s", k, v, mime) AssertEqual(t, mime, v, msg) } } + +func TestIsMP3(t *testing.T) { + var mp3 = map[string]bool{ + "640x480.jpg": false, + "3640x3480.jpg": false, + "video.mp4": false, + "example.amr": false, + "wechat_incoming_msg.mp3": true, + } + for k, v := range mp3 { + r := isMP3("media_for_test/" + k) + msg := fmt.Sprintf("%s is mp3 = %t, not %t", k, v, r) + AssertEqual(t, v, r, msg) + } +} + +func TestIsAMR(t *testing.T) { + var amr = map[string]bool{ + "640x480.jpg": false, + "3640x3480.jpg": false, + "video.mp4": false, + "example.amr": true, + "wechat_incoming_msg.mp3": false, + } + for k, v := range amr { + r := isAmr("media_for_test/" + k) + msg := fmt.Sprintf("%s AMR = %t, not %t", k, v, r) + AssertEqual(t, v, r, msg) + } +} + +func TestIsMP4(t *testing.T) { + var mp4 = map[string]bool{ + "640x480.jpg": false, + "3640x3480.jpg": false, + "video.mp4": true, + "example.amr": false, + "wechat_incoming_msg.mp3": false, + } + for k, v := range mp4 { + r := isMP4("media_for_test/" + k) + msg := fmt.Sprintf("%s MP4 = %t, not %t", k, v, r) + AssertEqual(t, v, r, msg) + } +} + +func TestIsJPG(t *testing.T) { + var mp4 = map[string]bool{ + "640x480.jpg": true, + "3640x3480.jpg": true, + "video.mp4": false, + "example.amr": false, + "wechat_incoming_msg.mp3": false, + } + for k, v := range mp4 { + r := isJPG("media_for_test/" + k) + msg := fmt.Sprintf("%s JPG = %t, not %t", k, v, r) + AssertEqual(t, v, r, msg) + } +} diff --git a/media_for_test/example.amr b/media_for_test/example.amr new file mode 100644 index 0000000..4c5a213 Binary files /dev/null and b/media_for_test/example.amr differ diff --git a/media_for_test/wechat_incoming_msg.mp3 b/media_for_test/wechat_incoming_msg.mp3 new file mode 100644 index 0000000..9e9f432 Binary files /dev/null and b/media_for_test/wechat_incoming_msg.mp3 differ