fix(subsonic): send valid content-type with http.ServeStream

This commit is contained in:
sentriz
2022-12-26 18:26:13 +00:00
parent 63f7b05b07
commit 8dc58c71a4
8 changed files with 52 additions and 51 deletions

View File

@@ -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 {

View File

@@ -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)
}

View File

@@ -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,

View File

@@ -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

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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, ".")
}