Skip to content

Commit

Permalink
Merge 9d0458e into bfc4fab
Browse files Browse the repository at this point in the history
  • Loading branch information
Arimeka committed Mar 16, 2020
2 parents bfc4fab + 9d0458e commit 01b754e
Show file tree
Hide file tree
Showing 13 changed files with 530 additions and 45 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[![Build Status](https://travis-ci.org/Arimeka/mediaprobe.svg?branch=master)](https://travis-ci.org/Arimeka/mediaprobe)
[![Coverage Status](https://coveralls.io/repos/github/Arimeka/mediaprobe/badge.svg?branch=master)](https://coveralls.io/github/Arimeka/mediaprobe?branch=master)
[![Go Report Card](https://goreportcard.com/badge/github.com/Arimeka/mediaprobe)](https://goreportcard.com/report/github.com/Arimeka/mediaprobe)
[![GoDoc](https://godoc.org/github.com/Arimeka/mediaprobe?status.svg)](https://godoc.org/github.com/Arimeka/mediaprobe)
[![GoDoc](https://godoc.org/github.com/Arimeka/mediaprobe?status.svg)](https://pkg.go.dev/github.com/Arimeka/mediaprobe)

# mediaprobe

Expand Down
10 changes: 5 additions & 5 deletions benchmark_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,35 +13,35 @@ const (

func BenchmarkParse(b *testing.B) {
for i := 0; i < b.N; i++ {
mediaprobe.Parse(benchmarkValidVideo)
_, _ = mediaprobe.Parse(benchmarkValidVideo)
}
}

func BenchmarkNew(b *testing.B) {
for i := 0; i < b.N; i++ {
mediaprobe.New(benchmarkValidVideo)
_, _ = mediaprobe.New(benchmarkValidVideo)
}
}

func BenchmarkInfo_CalculateMime(b *testing.B) {
info, _ := mediaprobe.New(benchmarkValidVideo)
for i := 0; i < b.N; i++ {
info.CalculateMime()
_ = info.CalculateMime()
}
}

func BenchmarkInfo_FFProbe(b *testing.B) {
info, _ := mediaprobe.New(benchmarkValidVideo)
b.ResetTimer()
for i := 0; i < b.N; i++ {
info.FFProbe()
_ = info.FFProbe()
}
}

func BenchmarkInfo_ParseImage(b *testing.B) {
info, _ := mediaprobe.New(benchmarkValidImage)
b.ResetTimer()
for i := 0; i < b.N; i++ {
info.FFProbe()
_ = info.FFProbe()
}
}
33 changes: 31 additions & 2 deletions ffprobe_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,14 @@ var bitrateFiles = map[string]int64{
}

func TestInfo_FFProbe(t *testing.T) {

for filename, expectedBitrate := range bitrateFiles {
info, _ := mediaprobe.New(filename)
info, err := mediaprobe.New(filename)
if err != nil {
t.Fatalf("Filename: %s. Unexpected error %v", filename, err)
}

err := info.FFProbe()
err = info.FFProbe()
if err != nil {
if filename != "./fixtures/corrupted.mp4" {
t.Errorf("Filename: %s. Unexpected error %v", filename, err)
Expand All @@ -34,4 +38,29 @@ func TestInfo_FFProbe(t *testing.T) {
t.Errorf("Filename: %s. Not expected video bitrate. Expected %d; got %d", filename, expectedBitrate, bitrate)
}
}

t.Run("remote_file", ffprobeRemoteFile)
}

func ffprobeRemoteFile(t *testing.T) {
handler := &Handler{
Filename: "./fixtures/video.mp4",
}
srv := ServeHttp(handler)
defer srv.Stop()

info, err := mediaprobe.New(srv.Endpoint())
if err != nil {
t.Fatalf("Unexpected error %v", err)
}

err = info.FFProbe()
if err != nil {
t.Errorf("Unexpected error %v", err)
}

bitrate := info.BitRate
if bitrate != 551193 {
t.Errorf("Not expected video bitrate. Expected %d; got %d", 551193, bitrate)
}
}
31 changes: 31 additions & 0 deletions http.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package mediaprobe

import (
"fmt"
"io"
"net/http"
"net/url"
"time"
)

var httpClient = &http.Client{
Timeout: 5 * time.Second,
}

func getRemoteFile(uri *url.URL) (io.ReadCloser, error) {
req := &http.Request{
Method: http.MethodGet,
URL: uri,
}
resp, err := httpClient.Do(req)
if err != nil {
return nil, err
}

if resp.StatusCode != http.StatusOK {
resp.Body.Close()
return nil, fmt.Errorf("unexpected status code %d", resp.StatusCode)
}

return resp.Body, nil
}
59 changes: 59 additions & 0 deletions http_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package mediaprobe_test

import (
"net/http"
"net/http/httptest"
"sync"
"sync/atomic"
"time"
)

type Server struct {
srv *httptest.Server
}

func (s *Server) Stop() {
s.srv.Close()
}

func (s *Server) Endpoint() string {
return s.srv.URL
}

func ServeHttp(handler *Handler) *Server {
httptest.NewServer(handler)

srv := httptest.NewServer(handler)
time.Sleep(100 * time.Millisecond)

return &Server{srv: srv}
}

type Handler struct {
Status int
Filename string

FailOnAttempt uint64
Counter uint64
mu sync.RWMutex
}

func (h *Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
if h.Status != 0 {
rw.WriteHeader(h.Status)
return
}
if h.FailOnAttempt > 0 {
h.mu.RLock()
counter := h.Counter
h.mu.RUnlock()
if counter >= h.FailOnAttempt {
rw.WriteHeader(http.StatusInternalServerError)
return
}

atomic.AddUint64(&h.Counter, 1)
}

http.ServeFile(rw, req, h.Filename)
}
51 changes: 41 additions & 10 deletions image.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"image"
"io"
"os"

// Expanding image package
_ "golang.org/x/image/bmp"
_ "golang.org/x/image/tiff"
Expand All @@ -18,33 +17,65 @@ import (

// ParseImage used for retrieve image data
func (info *Info) ParseImage() error {
file, err := os.Open(info.filename)
if info.data == nil {
file, err := os.Open(info.filename)
if err != nil {
return err
}
defer file.Close()
if err := info.decodeImage(file); err != nil {
return err
}
_, err = file.Seek(0, io.SeekStart)
if err != nil {
return err
}
info.decodeExif(file)

return nil
}

body, err := getRemoteFile(info.uri)
if err != nil {
return err
}
err = info.decodeImage(body)
body.Close()
if err != nil {
return err
}
defer file.Close()

img, _, err := image.DecodeConfig(file)
body, err = getRemoteFile(info.uri)
if err != nil {
return err
}
_, err = file.Seek(0, io.SeekStart)
info.decodeExif(body)
body.Close()

return nil
}

func (info *Info) decodeImage(reader io.Reader) error {
img, _, err := image.DecodeConfig(reader)
if err != nil {
return err
}

info.Width = img.Width
info.Height = img.Height

if x, err := exif.Decode(file); err == nil {
return nil
}

func (info *Info) decodeExif(reader io.Reader) {
if x, err := exif.Decode(reader); err == nil {
if orientationTag, err := x.Get(exif.Orientation); err == nil {
switch orientationTag.String() {
case "5", "6", "7", "8":
info.Width = img.Height
info.Height = img.Width
w, h := info.Width, info.Height
info.Width = h
info.Height = w
}
}
}

return nil
}

0 comments on commit 01b754e

Please sign in to comment.