Skip to content

Commit 8dc58c7

Browse files
committed
fix(subsonic): send valid content-type with http.ServeStream
1 parent 63f7b05 commit 8dc58c7

File tree

8 files changed

+51
-50
lines changed

8 files changed

+51
-50
lines changed

db/model.go

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ package db
88

99
import (
1010
"path"
11+
"path/filepath"
1112
"strconv"
1213
"strings"
1314
"time"
1415

15-
// TODO: remove this dep
16-
1716
"go.senan.xyz/gonic/mime"
17+
18+
// TODO: remove this dep
1819
"go.senan.xyz/gonic/server/ctrlsubsonic/specid"
1920
)
2021

@@ -123,19 +124,15 @@ func (t *Track) ArtistSID() *specid.ID {
123124
}
124125

125126
func (t *Track) Ext() string {
126-
longExt := path.Ext(t.Filename)
127-
if len(longExt) < 1 {
128-
return ""
129-
}
130-
return longExt[1:]
127+
return filepath.Ext(t.Filename)
131128
}
132129

133130
func (t *Track) AudioFilename() string {
134131
return t.Filename
135132
}
136133

137134
func (t *Track) MIME() string {
138-
return mime.FromExtension(t.Ext())
135+
return mime.TypeByExtension(filepath.Ext(t.Filename))
139136
}
140137

141138
func (t *Track) AbsPath() string {
@@ -419,15 +416,11 @@ func (pe *PodcastEpisode) AudioFilename() string {
419416
}
420417

421418
func (pe *PodcastEpisode) Ext() string {
422-
longExt := path.Ext(pe.Filename)
423-
if len(longExt) < 1 {
424-
return ""
425-
}
426-
return longExt[1:]
419+
return filepath.Ext(pe.Filename)
427420
}
428421

429422
func (pe *PodcastEpisode) MIME() string {
430-
return mime.FromExtension(pe.Ext())
423+
return mime.TypeByExtension(filepath.Ext(pe.Filename))
431424
}
432425

433426
type Bookmark struct {

mime/mime.go

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,38 @@
1+
//nolint:gochecknoglobals
12
package mime
23

3-
func FromExtension(ext string) string {
4-
switch ext {
5-
case "mp3":
6-
return "audio/mpeg"
7-
case "flac":
8-
return "audio/x-flac"
9-
case "aac":
10-
return "audio/x-aac"
11-
case "m4a":
12-
return "audio/m4a"
13-
case "m4b":
14-
return "audio/m4b"
15-
case "ogg":
16-
return "audio/ogg"
17-
case "opus":
18-
return "audio/ogg"
19-
case "wma":
20-
return "audio/x-ms-wma"
21-
default:
4+
import (
5+
"log"
6+
stdmime "mime"
7+
)
8+
9+
var supportedAudioTypes = map[string]string{
10+
".mp3": "audio/mpeg",
11+
".flac": "audio/x-flac",
12+
".aac": "audio/x-aac",
13+
".m4a": "audio/m4a",
14+
".m4b": "audio/m4b",
15+
".ogg": "audio/ogg",
16+
".opus": "audio/ogg",
17+
".wma": "audio/x-ms-wma",
18+
}
19+
20+
//nolint:gochecknoinits
21+
func init() {
22+
for ext, mime := range supportedAudioTypes {
23+
if err := stdmime.AddExtensionType(ext, mime); err != nil {
24+
log.Fatalf("adding audio type mime for ext %q: %v", ext, err)
25+
}
26+
}
27+
}
28+
29+
var TypeByExtension = stdmime.TypeByExtension
30+
var ParseMediaType = stdmime.ParseMediaType
31+
var FormatMediaType = stdmime.FormatMediaType
32+
33+
func TypeByAudioExtension(ext string) string {
34+
if _, ok := supportedAudioTypes[ext]; !ok {
2235
return ""
2336
}
37+
return stdmime.TypeByExtension(ext)
2438
}

podcasts/podcasts.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"io"
77
"log"
8-
"mime"
98
"net/http"
109
"net/url"
1110
"os"
@@ -19,7 +18,7 @@ import (
1918
"github.com/mmcdole/gofeed"
2019

2120
"go.senan.xyz/gonic/db"
22-
gmime "go.senan.xyz/gonic/mime"
21+
"go.senan.xyz/gonic/mime"
2322
"go.senan.xyz/gonic/multierr"
2423
"go.senan.xyz/gonic/scanner/tags"
2524
)
@@ -236,10 +235,7 @@ func (p *Podcasts) AddEpisode(podcastID int, item *gofeed.Item) (*db.PodcastEpis
236235
}
237236

238237
func isAudio(mediaType, url string) bool {
239-
if mediaType != "" && strings.HasPrefix(mediaType, "audio") {
240-
return true
241-
}
242-
return gmime.FromExtension(filepath.Ext(url)[1:]) != ""
238+
return mime.TypeByAudioExtension(path.Ext(url)) != ""
243239
}
244240

245241
func itemToEpisode(podcastID, size, duration int, audio string,

scanner/scanner.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ func (s *Scanner) scanDir(tx *db.DB, c *Context, musicDir string, absPath string
277277
cover = item.Name()
278278
continue
279279
}
280-
if mime := mime.FromExtension(ext(item.Name())); mime != "" {
280+
if mime := mime.TypeByAudioExtension(filepath.Ext(item.Name())); mime != "" {
281281
tracks = append(tracks, item.Name())
282282
continue
283283
}
@@ -578,13 +578,6 @@ func (s *Scanner) cleanGenres(c *Context) error {
578578
return nil
579579
}
580580

581-
func ext(name string) string {
582-
if ext := filepath.Ext(name); len(ext) > 0 {
583-
return ext[1:]
584-
}
585-
return ""
586-
}
587-
588581
func isCover(name string) bool {
589582
switch path := strings.ToLower(name); path {
590583
case

server/ctrlsubsonic/spec/construct_by_folder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func NewTCTrackByFolder(t *db.Track, parent *db.Album) *TrackChild {
5656
trCh := &TrackChild{
5757
ID: t.SID(),
5858
ContentType: t.MIME(),
59-
Suffix: t.Ext(),
59+
Suffix: formatExt(t.Ext()),
6060
Size: t.Size,
6161
Artist: t.TagTrackArtist,
6262
Title: t.TagTitle,

server/ctrlsubsonic/spec/construct_by_tags.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func NewTrackByTags(t *db.Track, album *db.Album) *TrackChild {
3838
ret := &TrackChild{
3939
ID: t.SID(),
4040
ContentType: t.MIME(),
41-
Suffix: t.Ext(),
41+
Suffix: formatExt(t.Ext()),
4242
ParentID: t.AlbumSID(),
4343
CreatedAt: t.CreatedAt,
4444
Size: t.Size,

server/ctrlsubsonic/spec/construct_podcast.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func NewPodcastEpisode(e *db.PodcastEpisode) *PodcastEpisode {
3636
Genre: "Podcast",
3737
Duration: e.Length,
3838
Year: e.PublishDate.Year(),
39-
Suffix: e.Ext(),
39+
Suffix: formatExt(e.Ext()),
4040
BitRate: e.Bitrate,
4141
IsDir: false,
4242
Path: e.Path,

server/ctrlsubsonic/spec/spec.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package spec
22

33
import (
44
"fmt"
5+
"strings"
56
"time"
67

78
"go.senan.xyz/gonic"
@@ -422,3 +423,7 @@ func formatRating(rating float64) string {
422423
}
423424
return fmt.Sprintf("%.2f", rating)
424425
}
426+
427+
func formatExt(ext string) string {
428+
return strings.TrimPrefix(ext, ".")
429+
}

0 commit comments

Comments
 (0)