⚗️ Can analyze video now
This commit is contained in:
parent
b093e280fe
commit
b28735bdd7
@ -10,6 +10,8 @@ FROM golang:alpine
|
|||||||
|
|
||||||
COPY --from=paperclip-server /dist /paperclip/server
|
COPY --from=paperclip-server /dist /paperclip/server
|
||||||
|
|
||||||
|
RUN apk add --no-cache ffmpeg
|
||||||
|
|
||||||
EXPOSE 8445
|
EXPOSE 8445
|
||||||
|
|
||||||
CMD ["/paperclip/server"]
|
CMD ["/paperclip/server"]
|
||||||
|
1
go.mod
1
go.mod
@ -91,6 +91,7 @@ require (
|
|||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect
|
||||||
google.golang.org/protobuf v1.34.2 // indirect
|
google.golang.org/protobuf v1.34.2 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
|
gopkg.in/vansante/go-ffprobe.v2 v2.2.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
gorm.io/driver/mysql v1.5.2 // indirect
|
gorm.io/driver/mysql v1.5.2 // indirect
|
||||||
)
|
)
|
||||||
|
2
go.sum
2
go.sum
@ -402,6 +402,8 @@ gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXa
|
|||||||
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
|
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
|
||||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
|
gopkg.in/vansante/go-ffprobe.v2 v2.2.0 h1:iuOqTsbfYuqIz4tAU9NWh22CmBGxlGHdgj4iqP+NUmY=
|
||||||
|
gopkg.in/vansante/go-ffprobe.v2 v2.2.0/go.mod h1:qF0AlAjk7Nqzqf3y333Ly+KxN3cKF2JqA3JT5ZheUGE=
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package services
|
package services
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -8,6 +9,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -18,6 +20,7 @@ import (
|
|||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
"github.com/schollz/progressbar/v3"
|
"github.com/schollz/progressbar/v3"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
|
"gopkg.in/vansante/go-ffprobe.v2"
|
||||||
|
|
||||||
_ "image/gif"
|
_ "image/gif"
|
||||||
_ "image/jpeg"
|
_ "image/jpeg"
|
||||||
@ -96,6 +99,7 @@ func AnalyzeAttachment(file models.Attachment) error {
|
|||||||
|
|
||||||
var start time.Time
|
var start time.Time
|
||||||
|
|
||||||
|
// Do analyze job
|
||||||
if !file.IsAnalyzed || len(file.HashCode) == 0 {
|
if !file.IsAnalyzed || len(file.HashCode) == 0 {
|
||||||
destMap := viper.GetStringMap("destinations.temporary")
|
destMap := viper.GetStringMap("destinations.temporary")
|
||||||
|
|
||||||
@ -110,7 +114,8 @@ func AnalyzeAttachment(file models.Attachment) error {
|
|||||||
return fmt.Errorf("attachment doesn't exists in temporary storage: %v", err)
|
return fmt.Errorf("attachment doesn't exists in temporary storage: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if t := strings.SplitN(file.MimeType, "/", 2)[0]; t == "image" {
|
switch strings.SplitN(file.MimeType, "/", 2)[0] {
|
||||||
|
case "image":
|
||||||
// Dealing with image
|
// Dealing with image
|
||||||
reader, err := os.Open(dst)
|
reader, err := os.Open(dst)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -129,6 +134,29 @@ func AnalyzeAttachment(file models.Attachment) error {
|
|||||||
"height": height,
|
"height": height,
|
||||||
"ratio": ratio,
|
"ratio": ratio,
|
||||||
}
|
}
|
||||||
|
case "video":
|
||||||
|
// Dealing with video
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
data, err := ffprobe.ProbeURL(ctx, dst)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to analyze video information: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
stream := data.FirstVideoStream()
|
||||||
|
ratio := float64(stream.Width) / float64(stream.Height)
|
||||||
|
duration, _ := strconv.ParseFloat(stream.Duration, 64)
|
||||||
|
file.Metadata = map[string]any{
|
||||||
|
"width": stream.Width,
|
||||||
|
"height": stream.Height,
|
||||||
|
"ratio": ratio,
|
||||||
|
"duration": duration,
|
||||||
|
"bit_rate": stream.BitRate,
|
||||||
|
"codec_name": stream.CodecName,
|
||||||
|
"color_range": stream.ColorRange,
|
||||||
|
"color_space": stream.ColorSpace,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if hash, err := HashAttachment(file); err != nil {
|
if hash, err := HashAttachment(file); err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user