Create & Init Project...
This commit is contained in:
commit
ce2baaca4b
18
Dockerfile
Normal file
18
Dockerfile
Normal file
@ -0,0 +1,18 @@
|
||||
FROM golang:alpine AS build
|
||||
|
||||
WORKDIR /go/src/github.com/yumc.pw/cloud/ffmpeg-webapi
|
||||
ADD main.go .
|
||||
RUN go build -o main
|
||||
|
||||
FROM alpine:edge
|
||||
LABEL maintainer="MiaoWoo<admin@yumc.pw>"
|
||||
|
||||
WORKDIR /root
|
||||
|
||||
RUN set -x && \
|
||||
apk add --no-cache ca-certificates yasm ffmpeg && \
|
||||
rm -rf /var/cache/apk/*
|
||||
|
||||
COPY --from=build /go/src/github.com/yumc.pw/cloud/ffmpeg-webapi/main ./main
|
||||
|
||||
CMD ./main
|
114
main.go
Normal file
114
main.go
Normal file
@ -0,0 +1,114 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var tempDir *string
|
||||
var ffmpeg = "ffmpeg"
|
||||
|
||||
func main() {
|
||||
b := flag.String("b", ":8080", "Server Bind Address")
|
||||
tempDir = flag.String("temp", os.TempDir(), "")
|
||||
flag.Parse()
|
||||
|
||||
if _, err := exec.LookPath(ffmpeg); err != nil {
|
||||
fmt.Printf("Error Can't Find %s Client...", ffmpeg)
|
||||
return
|
||||
}
|
||||
|
||||
http.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) {
|
||||
if strings.HasPrefix(req.RequestURI, "/amr2mp3") {
|
||||
amr2mp3(resp, req)
|
||||
return
|
||||
}
|
||||
api(resp, req)
|
||||
})
|
||||
|
||||
http.ListenAndServe(*b, nil)
|
||||
fmt.Printf("FFmpeg WebInterface Listen on %s ...\n", *b)
|
||||
}
|
||||
|
||||
func api(w http.ResponseWriter, r *http.Request) {
|
||||
handleInternal(w, r, r.FormValue("o"), r.FormValue("t"))
|
||||
}
|
||||
|
||||
func amr2mp3(w http.ResponseWriter, r *http.Request) {
|
||||
handleInternal(w, r, "amr", "mp3")
|
||||
}
|
||||
|
||||
func handleInternal(w http.ResponseWriter, r *http.Request, origin, target string) {
|
||||
// Read Byte From File Or URL
|
||||
bytes, err := readBytesFromRequest(r)
|
||||
if err != nil {
|
||||
w.Write([]byte("Error Read Bytes: " + err.Error()))
|
||||
return
|
||||
}
|
||||
// Convert origin to target
|
||||
out, err := convert(bytes, origin, target)
|
||||
if err != nil {
|
||||
w.Write([]byte("Error Handler: " + err.Error()))
|
||||
return
|
||||
}
|
||||
w.Write(out)
|
||||
}
|
||||
|
||||
func convert(in []byte, origin, target string) (out []byte, err error) {
|
||||
source := *tempDir + "/" + fmt.Sprintf("ffmpeg-webapi-%s-%s", MD5(in), strconv.Itoa(len(in)))
|
||||
|
||||
amr := source + "." + origin
|
||||
ioutil.WriteFile(amr, in, os.ModeAppend)
|
||||
defer os.Remove(amr)
|
||||
|
||||
mp3 := source + "." + target
|
||||
err = exec.Command(ffmpeg, "-i", amr, mp3).Run()
|
||||
defer os.Remove(mp3)
|
||||
|
||||
if err != nil {
|
||||
// Ignore Error Bucause ffmpeg will return not zero when amr to mp3
|
||||
}
|
||||
// check target file is exist if not maybe exec error
|
||||
if _, err := exec.LookPath(mp3); err == nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ioutil.ReadFile(mp3)
|
||||
}
|
||||
|
||||
func readBytesFromRequest(r *http.Request) (out []byte, err error) {
|
||||
var reader io.Reader
|
||||
url := r.FormValue("url")
|
||||
if url != "" {
|
||||
fmt.Printf("[A2M] url request " + url + "\n")
|
||||
var resp *http.Response
|
||||
resp, err = http.Get(url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
reader = resp.Body
|
||||
} else {
|
||||
fmt.Printf("[A2M] file request\n")
|
||||
reader, _, err = r.FormFile("file")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return ioutil.ReadAll(reader)
|
||||
}
|
||||
|
||||
// MD5 生成32位MD5
|
||||
func MD5(bytes []byte) string {
|
||||
ctx := md5.New()
|
||||
ctx.Write(bytes)
|
||||
return hex.EncodeToString(ctx.Sum(nil))
|
||||
}
|
Loading…
Reference in New Issue
Block a user