fix(subsonic): send valid content-type with http.ServeStream
This commit is contained in:
21
db/model.go
21
db/model.go
@@ -8,13 +8,14 @@ package db
|
||||
|
||||
import (
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
// TODO: remove this dep
|
||||
|
||||
"go.senan.xyz/gonic/mime"
|
||||
|
||||
// TODO: remove this dep
|
||||
"go.senan.xyz/gonic/server/ctrlsubsonic/specid"
|
||||
)
|
||||
|
||||
@@ -123,11 +124,7 @@ func (t *Track) ArtistSID() *specid.ID {
|
||||
}
|
||||
|
||||
func (t *Track) Ext() string {
|
||||
longExt := path.Ext(t.Filename)
|
||||
if len(longExt) < 1 {
|
||||
return ""
|
||||
}
|
||||
return longExt[1:]
|
||||
return filepath.Ext(t.Filename)
|
||||
}
|
||||
|
||||
func (t *Track) AudioFilename() string {
|
||||
@@ -135,7 +132,7 @@ func (t *Track) AudioFilename() string {
|
||||
}
|
||||
|
||||
func (t *Track) MIME() string {
|
||||
return mime.FromExtension(t.Ext())
|
||||
return mime.TypeByExtension(filepath.Ext(t.Filename))
|
||||
}
|
||||
|
||||
func (t *Track) AbsPath() string {
|
||||
@@ -419,15 +416,11 @@ func (pe *PodcastEpisode) AudioFilename() string {
|
||||
}
|
||||
|
||||
func (pe *PodcastEpisode) Ext() string {
|
||||
longExt := path.Ext(pe.Filename)
|
||||
if len(longExt) < 1 {
|
||||
return ""
|
||||
}
|
||||
return longExt[1:]
|
||||
return filepath.Ext(pe.Filename)
|
||||
}
|
||||
|
||||
func (pe *PodcastEpisode) MIME() string {
|
||||
return mime.FromExtension(pe.Ext())
|
||||
return mime.TypeByExtension(filepath.Ext(pe.Filename))
|
||||
}
|
||||
|
||||
type Bookmark struct {
|
||||
|
||||
54
mime/mime.go
54
mime/mime.go
@@ -1,24 +1,38 @@
|
||||
//nolint:gochecknoglobals
|
||||
package mime
|
||||
|
||||
func FromExtension(ext string) string {
|
||||
switch ext {
|
||||
case "mp3":
|
||||
return "audio/mpeg"
|
||||
case "flac":
|
||||
return "audio/x-flac"
|
||||
case "aac":
|
||||
return "audio/x-aac"
|
||||
case "m4a":
|
||||
return "audio/m4a"
|
||||
case "m4b":
|
||||
return "audio/m4b"
|
||||
case "ogg":
|
||||
return "audio/ogg"
|
||||
case "opus":
|
||||
return "audio/ogg"
|
||||
case "wma":
|
||||
return "audio/x-ms-wma"
|
||||
default:
|
||||
return ""
|
||||
import (
|
||||
"log"
|
||||
stdmime "mime"
|
||||
)
|
||||
|
||||
var supportedAudioTypes = map[string]string{
|
||||
".mp3": "audio/mpeg",
|
||||
".flac": "audio/x-flac",
|
||||
".aac": "audio/x-aac",
|
||||
".m4a": "audio/m4a",
|
||||
".m4b": "audio/m4b",
|
||||
".ogg": "audio/ogg",
|
||||
".opus": "audio/ogg",
|
||||
".wma": "audio/x-ms-wma",
|
||||
}
|
||||
|
||||
//nolint:gochecknoinits
|
||||
func init() {
|
||||
for ext, mime := range supportedAudioTypes {
|
||||
if err := stdmime.AddExtensionType(ext, mime); err != nil {
|
||||
log.Fatalf("adding audio type mime for ext %q: %v", ext, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var TypeByExtension = stdmime.TypeByExtension
|
||||
var ParseMediaType = stdmime.ParseMediaType
|
||||
var FormatMediaType = stdmime.FormatMediaType
|
||||
|
||||
func TypeByAudioExtension(ext string) string {
|
||||
if _, ok := supportedAudioTypes[ext]; !ok {
|
||||
return ""
|
||||
}
|
||||
return stdmime.TypeByExtension(ext)
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"mime"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
@@ -19,7 +18,7 @@ import (
|
||||
"github.com/mmcdole/gofeed"
|
||||
|
||||
"go.senan.xyz/gonic/db"
|
||||
gmime "go.senan.xyz/gonic/mime"
|
||||
"go.senan.xyz/gonic/mime"
|
||||
"go.senan.xyz/gonic/multierr"
|
||||
"go.senan.xyz/gonic/scanner/tags"
|
||||
)
|
||||
@@ -236,10 +235,7 @@ func (p *Podcasts) AddEpisode(podcastID int, item *gofeed.Item) (*db.PodcastEpis
|
||||
}
|
||||
|
||||
func isAudio(mediaType, url string) bool {
|
||||
if mediaType != "" && strings.HasPrefix(mediaType, "audio") {
|
||||
return true
|
||||
}
|
||||
return gmime.FromExtension(filepath.Ext(url)[1:]) != ""
|
||||
return mime.TypeByAudioExtension(path.Ext(url)) != ""
|
||||
}
|
||||
|
||||
func itemToEpisode(podcastID, size, duration int, audio string,
|
||||
|
||||
@@ -277,7 +277,7 @@ func (s *Scanner) scanDir(tx *db.DB, c *Context, musicDir string, absPath string
|
||||
cover = item.Name()
|
||||
continue
|
||||
}
|
||||
if mime := mime.FromExtension(ext(item.Name())); mime != "" {
|
||||
if mime := mime.TypeByAudioExtension(filepath.Ext(item.Name())); mime != "" {
|
||||
tracks = append(tracks, item.Name())
|
||||
continue
|
||||
}
|
||||
@@ -578,13 +578,6 @@ func (s *Scanner) cleanGenres(c *Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func ext(name string) string {
|
||||
if ext := filepath.Ext(name); len(ext) > 0 {
|
||||
return ext[1:]
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func isCover(name string) bool {
|
||||
switch path := strings.ToLower(name); path {
|
||||
case
|
||||
|
||||
@@ -56,7 +56,7 @@ func NewTCTrackByFolder(t *db.Track, parent *db.Album) *TrackChild {
|
||||
trCh := &TrackChild{
|
||||
ID: t.SID(),
|
||||
ContentType: t.MIME(),
|
||||
Suffix: t.Ext(),
|
||||
Suffix: formatExt(t.Ext()),
|
||||
Size: t.Size,
|
||||
Artist: t.TagTrackArtist,
|
||||
Title: t.TagTitle,
|
||||
|
||||
@@ -38,7 +38,7 @@ func NewTrackByTags(t *db.Track, album *db.Album) *TrackChild {
|
||||
ret := &TrackChild{
|
||||
ID: t.SID(),
|
||||
ContentType: t.MIME(),
|
||||
Suffix: t.Ext(),
|
||||
Suffix: formatExt(t.Ext()),
|
||||
ParentID: t.AlbumSID(),
|
||||
CreatedAt: t.CreatedAt,
|
||||
Size: t.Size,
|
||||
|
||||
@@ -36,7 +36,7 @@ func NewPodcastEpisode(e *db.PodcastEpisode) *PodcastEpisode {
|
||||
Genre: "Podcast",
|
||||
Duration: e.Length,
|
||||
Year: e.PublishDate.Year(),
|
||||
Suffix: e.Ext(),
|
||||
Suffix: formatExt(e.Ext()),
|
||||
BitRate: e.Bitrate,
|
||||
IsDir: false,
|
||||
Path: e.Path,
|
||||
|
||||
@@ -2,6 +2,7 @@ package spec
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"go.senan.xyz/gonic"
|
||||
@@ -422,3 +423,7 @@ func formatRating(rating float64) string {
|
||||
}
|
||||
return fmt.Sprintf("%.2f", rating)
|
||||
}
|
||||
|
||||
func formatExt(ext string) string {
|
||||
return strings.TrimPrefix(ext, ".")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user