refactor(server): unify stream URL builders + MIME tables + cover-path helper
Closes Scribe #614, #615, server half of #616 surfaced by the 2026-06-04 divergent-provider audit. - streamURL helper now used everywhere /api/tracks/{id}/stream is built (was inline concat in playlists.go and cast_token.go); add streamURLWithExt for the .ext cast variant. - audioContentType in media.go is the canonical file_format -> MIME lookup; mimeForFormat in cast_token.go is now a thin wrapper that overrides the unknown-format fallback to audio/mpeg (Sonos rejects octet-stream). Adds mpeg/vorbis/wave aliases. Subsonic's contentTypeForFormat stays frozen per docs. - coverart.ResolveAlbumPath extracted; api and subsonic both delegate to it.
This commit is contained in:
@@ -75,6 +75,15 @@ func streamURL(trackID pgtype.UUID) string {
|
||||
return "/api/tracks/" + uuidToString(trackID) + "/stream"
|
||||
}
|
||||
|
||||
// streamURLWithExt returns the extension-bearing stream URL used by UPnP
|
||||
// cast tokens. Sonos's URL probe gates duration detection on a recognizable
|
||||
// audio file extension; the bare `/stream` shape reports TrackDuration=0
|
||||
// and breaks seek/auto-advance. The bare /stream route stays mounted as an
|
||||
// alias for legacy / web / Subsonic clients. See task #610.
|
||||
func streamURLWithExt(trackID pgtype.UUID, ext string) string {
|
||||
return streamURL(trackID) + "." + ext
|
||||
}
|
||||
|
||||
// artistRefFrom projects a dbq.Artist into an ArtistRef without cover.
|
||||
// albumCount must be pre-computed by the caller. Used by code paths that
|
||||
// don't have a representative-album lookup at hand (artist detail, search,
|
||||
|
||||
Reference in New Issue
Block a user