diff --git a/db/model.go b/db/model.go index b7d0db27..5831bb89 100644 --- a/db/model.go +++ b/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 { diff --git a/mime/mime.go b/mime/mime.go index b7e7b40e..79088a22 100644 --- a/mime/mime.go +++ b/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: +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) } diff --git a/podcasts/podcasts.go b/podcasts/podcasts.go index 1d99b1b2..60cf96cd 100644 --- a/podcasts/podcasts.go +++ b/podcasts/podcasts.go @@ -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, diff --git a/scanner/scanner.go b/scanner/scanner.go index 95a8ce03..3863e77b 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -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 diff --git a/server/ctrlsubsonic/spec/construct_by_folder.go b/server/ctrlsubsonic/spec/construct_by_folder.go index 1b5a2ec2..02e140b1 100644 --- a/server/ctrlsubsonic/spec/construct_by_folder.go +++ b/server/ctrlsubsonic/spec/construct_by_folder.go @@ -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, diff --git a/server/ctrlsubsonic/spec/construct_by_tags.go b/server/ctrlsubsonic/spec/construct_by_tags.go index 51d5860d..7b7b6bcf 100644 --- a/server/ctrlsubsonic/spec/construct_by_tags.go +++ b/server/ctrlsubsonic/spec/construct_by_tags.go @@ -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, diff --git a/server/ctrlsubsonic/spec/construct_podcast.go b/server/ctrlsubsonic/spec/construct_podcast.go index b944160f..8d46eb9e 100644 --- a/server/ctrlsubsonic/spec/construct_podcast.go +++ b/server/ctrlsubsonic/spec/construct_podcast.go @@ -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, diff --git a/server/ctrlsubsonic/spec/spec.go b/server/ctrlsubsonic/spec/spec.go index 82faf7b3..7ed32cd2 100644 --- a/server/ctrlsubsonic/spec/spec.go +++ b/server/ctrlsubsonic/spec/spec.go @@ -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, ".") +}