Infer file name for better media guess from http loader
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
351897ba56
commit
b703396844
60
http.go
60
http.go
|
@ -4,6 +4,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"mime"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -21,6 +22,7 @@ type RangeReadSeekCloser struct {
|
||||||
buf []byte
|
buf []byte
|
||||||
bufferOffset int64
|
bufferOffset int64
|
||||||
closed bool
|
closed bool
|
||||||
|
fileName string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRangeReadSeekCloser(uri string) (*RangeReadSeekCloser, error) {
|
func NewRangeReadSeekCloser(uri string) (*RangeReadSeekCloser, error) {
|
||||||
|
@ -200,6 +202,10 @@ func (r *RangeReadSeekCloser) Close() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *RangeReadSeekCloser) GetFileName() string {
|
||||||
|
return r.fileName
|
||||||
|
}
|
||||||
|
|
||||||
func (r *RangeReadSeekCloser) getInformation() error {
|
func (r *RangeReadSeekCloser) getInformation() error {
|
||||||
response, err := http.DefaultClient.Head(r.GetURI())
|
response, err := http.DefaultClient.Head(r.GetURI())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -215,6 +221,60 @@ func (r *RangeReadSeekCloser) getInformation() error {
|
||||||
if r.size, err = strconv.ParseInt(response.Header.Get("content-length"), 10, 0); err != nil {
|
if r.size, err = strconv.ParseInt(response.Header.Get("content-length"), 10, 0); err != nil {
|
||||||
return errors.New("server response does not have a valid Content-Length")
|
return errors.New("server response does not have a valid Content-Length")
|
||||||
}
|
}
|
||||||
|
if response.Header.Get("content-disposition") != "" {
|
||||||
|
if _, params, err := mime.ParseMediaType(response.Header.Get("content-disposition")); err == nil {
|
||||||
|
if disposition, ok := params["filename"]; ok {
|
||||||
|
r.fileName = disposition
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.fileName == "" {
|
||||||
|
if response.Header.Get("content-type") != "" {
|
||||||
|
if mimeType, params, err := mime.ParseMediaType(response.Header.Get("content-type")); err == nil {
|
||||||
|
switch mimeType {
|
||||||
|
case "audio/flac":
|
||||||
|
r.fileName = "_.flac"
|
||||||
|
case "audio/ogg":
|
||||||
|
r.fileName = "_.ogg"
|
||||||
|
if codecs, ok := params["codecs"]; ok {
|
||||||
|
switch codecs {
|
||||||
|
case "vorbis":
|
||||||
|
r.fileName = "_.vorbis"
|
||||||
|
case "opus":
|
||||||
|
r.fileName = "_.opus"
|
||||||
|
case "flac":
|
||||||
|
r.fileName = "_.flac"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "audio/mpeg":
|
||||||
|
r.fileName = "_.mp3"
|
||||||
|
if codecs, ok := params["codecs"]; ok {
|
||||||
|
switch codecs {
|
||||||
|
case "mp3":
|
||||||
|
r.fileName = "_.mp3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "audio/mp4":
|
||||||
|
r.fileName = "_.m4a"
|
||||||
|
if codecs, ok := params["codecs"]; ok {
|
||||||
|
switch codecs {
|
||||||
|
case "alac":
|
||||||
|
r.fileName = "_.alac"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "audio/aac":
|
||||||
|
r.fileName = "_.aac"
|
||||||
|
case "audio/x-tta", "audio/tta":
|
||||||
|
r.fileName = "_.tta"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.fileName == "" {
|
||||||
|
r.fileName = r.GetURI()
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
6
queue.go
6
queue.go
|
@ -19,6 +19,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -85,11 +86,14 @@ func (e *QueueTrackEntry) Load() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fileName := path.Base(e.Path)
|
||||||
|
|
||||||
if len(e.Path) > 4 && e.Path[:4] == "http" {
|
if len(e.Path) > 4 && e.Path[:4] == "http" {
|
||||||
s, err := NewRangeReadSeekCloser(e.Path)
|
s, err := NewRangeReadSeekCloser(e.Path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
fileName = s.GetFileName()
|
||||||
|
|
||||||
runtime.SetFinalizer(s, (*RangeReadSeekCloser).Close)
|
runtime.SetFinalizer(s, (*RangeReadSeekCloser).Close)
|
||||||
|
|
||||||
|
@ -116,7 +120,7 @@ func (e *QueueTrackEntry) Load() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
decoders, err := guess.GetDecoders(e.reader, e.Path)
|
decoders, err := guess.GetDecoders(e.reader, fileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue