Skip to content

Commit d9d234d

Browse files
committed
show transcode meta info in more places
1 parent 1cc675b commit d9d234d

File tree

7 files changed

+75
-76
lines changed

7 files changed

+75
-76
lines changed

server/ctrlsubsonic/handlers_by_folder.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (c *Controller) ServeGetMusicDirectory(r *http.Request) *spec.Response {
9696
Order("filename").
9797
Find(&childTracks)
9898

99-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
99+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
100100

101101
for _, ch := range childTracks {
102102
toAppend := spec.NewTCTrackByFolder(ch, folder)
@@ -105,8 +105,7 @@ func (c *Controller) ServeGetMusicDirectory(r *http.Request) *spec.Response {
105105
toAppend.ContentType = "audio/mpeg"
106106
toAppend.Suffix = "mp3"
107107
}
108-
toAppend.TranscodedContentType = transcodeMIME
109-
toAppend.TranscodedSuffix = transcodeSuffix
108+
toAppend.TranscodeMeta = transcodeMeta
110109
childrenObj = append(childrenObj, toAppend)
111110
}
112111
// respond section
@@ -270,12 +269,11 @@ func (c *Controller) ServeSearchTwo(r *http.Request) *spec.Response {
270269
return spec.NewError(0, "find tracks: %v", err)
271270
}
272271

273-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
272+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
274273

275274
for _, t := range tracks {
276275
track := spec.NewTCTrackByFolder(t, t.Album)
277-
track.TranscodedContentType = transcodeMIME
278-
track.TranscodedSuffix = transcodeSuffix
276+
track.TranscodeMeta = transcodeMeta
279277
results.Tracks = append(results.Tracks, track)
280278
}
281279

@@ -352,12 +350,11 @@ func (c *Controller) ServeGetStarred(r *http.Request) *spec.Response {
352350
return spec.NewError(0, "find tracks: %v", err)
353351
}
354352

355-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
353+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
356354

357355
for _, t := range tracks {
358356
track := spec.NewTCTrackByFolder(t, t.Album)
359-
track.TranscodedContentType = transcodeMIME
360-
track.TranscodedSuffix = transcodeSuffix
357+
track.TranscodeMeta = transcodeMeta
361358
results.Tracks = append(results.Tracks, track)
362359
}
363360

server/ctrlsubsonic/handlers_by_tags.go

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,11 @@ func (c *Controller) ServeGetAlbum(r *http.Request) *spec.Response {
120120
sub.Album = spec.NewAlbumByTags(album, album.Artists)
121121
sub.Album.Tracks = make([]*spec.TrackChild, len(album.Tracks))
122122

123-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
123+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
124124

125125
for i, track := range album.Tracks {
126126
sub.Album.Tracks[i] = spec.NewTrackByTags(track, album)
127-
sub.Album.Tracks[i].TranscodedContentType = transcodeMIME
128-
sub.Album.Tracks[i].TranscodedSuffix = transcodeSuffix
127+
sub.Album.Tracks[i].TranscodeMeta = transcodeMeta
129128
}
130129
return sub
131130
}
@@ -288,12 +287,11 @@ func (c *Controller) ServeSearchThree(r *http.Request) *spec.Response {
288287
return spec.NewError(0, "find tracks: %v", err)
289288
}
290289

291-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
290+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
292291

293292
for _, t := range tracks {
294293
track := spec.NewTrackByTags(t, t.Album)
295-
track.TranscodedContentType = transcodeMIME
296-
track.TranscodedSuffix = transcodeSuffix
294+
track.TranscodeMeta = transcodeMeta
297295
results.Tracks = append(results.Tracks, track)
298296
}
299297

@@ -430,12 +428,11 @@ func (c *Controller) ServeGetSongsByGenre(r *http.Request) *spec.Response {
430428
List: make([]*spec.TrackChild, len(tracks)),
431429
}
432430

433-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
431+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
434432

435433
for i, t := range tracks {
436434
sub.TracksByGenre.List[i] = spec.NewTrackByTags(t, t.Album)
437-
sub.TracksByGenre.List[i].TranscodedContentType = transcodeMIME
438-
sub.TracksByGenre.List[i].TranscodedSuffix = transcodeSuffix
435+
sub.TracksByGenre.List[i].TranscodeMeta = transcodeMeta
439436
}
440437

441438
return sub
@@ -503,12 +500,11 @@ func (c *Controller) ServeGetStarredTwo(r *http.Request) *spec.Response {
503500
return spec.NewError(0, "find tracks: %v", err)
504501
}
505502

506-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
503+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
507504

508505
for _, t := range tracks {
509506
track := spec.NewTrackByTags(t, t.Album)
510-
track.TranscodedContentType = transcodeMIME
511-
track.TranscodedSuffix = transcodeSuffix
507+
track.TranscodeMeta = transcodeMeta
512508
results.Tracks = append(results.Tracks, track)
513509
}
514510

@@ -580,12 +576,11 @@ func (c *Controller) ServeGetTopSongs(r *http.Request) *spec.Response {
580576
return sub
581577
}
582578

583-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
579+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
584580

585581
for _, track := range tracks {
586582
tc := spec.NewTrackByTags(track, track.Album)
587-
tc.TranscodedContentType = transcodeMIME
588-
tc.TranscodedSuffix = transcodeSuffix
583+
tc.TranscodeMeta = transcodeMeta
589584
sub.TopSongs.Tracks = append(sub.TopSongs.Tracks, tc)
590585
}
591586
return sub
@@ -650,12 +645,11 @@ func (c *Controller) ServeGetSimilarSongs(r *http.Request) *spec.Response {
650645
Tracks: make([]*spec.TrackChild, len(tracks)),
651646
}
652647

653-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
648+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
654649

655650
for i, track := range tracks {
656651
sub.SimilarSongs.Tracks[i] = spec.NewTrackByTags(track, track.Album)
657-
sub.SimilarSongs.Tracks[i].TranscodedContentType = transcodeMIME
658-
sub.SimilarSongs.Tracks[i].TranscodedSuffix = transcodeSuffix
652+
sub.SimilarSongs.Tracks[i].TranscodeMeta = transcodeMeta
659653
}
660654
return sub
661655
}
@@ -721,12 +715,10 @@ func (c *Controller) ServeGetSimilarSongsTwo(r *http.Request) *spec.Response {
721715
Tracks: make([]*spec.TrackChild, len(tracks)),
722716
}
723717

724-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
725-
718+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
726719
for i, track := range tracks {
727720
sub.SimilarSongsTwo.Tracks[i] = spec.NewTrackByTags(track, track.Album)
728-
sub.SimilarSongsTwo.Tracks[i].TranscodedContentType = transcodeMIME
729-
sub.SimilarSongsTwo.Tracks[i].TranscodedSuffix = transcodeSuffix
721+
sub.SimilarSongsTwo.Tracks[i].TranscodeMeta = transcodeMeta
730722
}
731723
return sub
732724
}

server/ctrlsubsonic/handlers_common.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func (c *Controller) ServeGetPlayQueue(r *http.Request) *spec.Response {
165165
trackIDs := queue.GetItems()
166166
sub.PlayQueue.List = make([]*spec.TrackChild, len(trackIDs))
167167

168-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
168+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
169169

170170
for i, id := range trackIDs {
171171
switch id.Type {
@@ -178,8 +178,7 @@ func (c *Controller) ServeGetPlayQueue(r *http.Request) *spec.Response {
178178
Preload("TrackRating", "user_id=?", user.ID).
179179
Find(&track)
180180
sub.PlayQueue.List[i] = spec.NewTCTrackByFolder(&track, track.Album)
181-
sub.PlayQueue.List[i].TranscodedContentType = transcodeMIME
182-
sub.PlayQueue.List[i].TranscodedSuffix = transcodeSuffix
181+
sub.PlayQueue.List[i].TranscodeMeta = transcodeMeta
183182
case specid.PodcastEpisode:
184183
pe := db.PodcastEpisode{}
185184
c.DB.
@@ -190,8 +189,7 @@ func (c *Controller) ServeGetPlayQueue(r *http.Request) *spec.Response {
190189
Where("id=?", pe.PodcastID).
191190
Find(&p)
192191
sub.PlayQueue.List[i] = spec.NewTCPodcastEpisode(&pe, &p)
193-
sub.PlayQueue.List[i].TranscodedContentType = transcodeMIME
194-
sub.PlayQueue.List[i].TranscodedSuffix = transcodeSuffix
192+
sub.PlayQueue.List[i].TranscodeMeta = transcodeMeta
195193
}
196194
}
197195
return sub
@@ -243,8 +241,14 @@ func (c *Controller) ServeGetSong(r *http.Request) *spec.Response {
243241
if errors.Is(err, gorm.ErrRecordNotFound) {
244242
return spec.NewError(10, "couldn't find a track with that id")
245243
}
244+
245+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
246+
246247
sub := spec.NewResponse()
247248
sub.Track = spec.NewTrackByTags(&track, track.Album)
249+
250+
sub.Track.TranscodeMeta = transcodeMeta
251+
248252
return sub
249253
}
250254

@@ -280,12 +284,11 @@ func (c *Controller) ServeGetRandomSongs(r *http.Request) *spec.Response {
280284
sub.RandomTracks = &spec.RandomTracks{}
281285
sub.RandomTracks.List = make([]*spec.TrackChild, len(tracks))
282286

283-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
287+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
284288

285289
for i, track := range tracks {
286290
sub.RandomTracks.List[i] = spec.NewTrackByTags(track, track.Album)
287-
sub.RandomTracks.List[i].TranscodedContentType = transcodeMIME
288-
sub.RandomTracks.List[i].TranscodedSuffix = transcodeSuffix
291+
sub.RandomTracks.List[i].TranscodeMeta = transcodeMeta
289292
}
290293
return sub
291294
}

server/ctrlsubsonic/handlers_playlist.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ func playlistRender(c *Controller, params params.Params, playlistID string, play
204204
return resp, nil
205205
}
206206

207-
transcodeMIME, transcodeSuffix := streamGetTransPrefProfile(c.DB, user.ID, params.GetOr("c", ""))
207+
transcodeMeta := streamGetTranscodeMeta(c.DB, user.ID, params.GetOr("c", ""))
208208

209209
for _, path := range playlist.Items {
210210
file, err := specidpaths.Lookup(c.DB, PathsOf(c.MusicPaths), c.PodcastsPath, path)
@@ -236,8 +236,7 @@ func playlistRender(c *Controller, params params.Params, playlistID string, play
236236
default:
237237
continue
238238
}
239-
trch.TranscodedContentType = transcodeMIME
240-
trch.TranscodedSuffix = transcodeSuffix
239+
trch.TranscodeMeta = transcodeMeta
241240
resp.List = append(resp.List, trch)
242241
}
243242

server/ctrlsubsonic/handlers_raw.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import (
3030
// b) return a non-nil spec.Response
3131
// _but not both_
3232

33-
func streamGetTransPref(dbc *db.DB, userID int, client string) (*db.TranscodePreference, error) {
33+
func streamGetTransodePreference(dbc *db.DB, userID int, client string) (*db.TranscodePreference, error) {
3434
var pref db.TranscodePreference
3535
err := dbc.
3636
Where("user_id=?", userID).
@@ -47,16 +47,19 @@ func streamGetTransPref(dbc *db.DB, userID int, client string) (*db.TranscodePre
4747
return &pref, nil
4848
}
4949

50-
func streamGetTransPrefProfile(dbc *db.DB, userID int, client string) (mime string, suffix string) {
51-
pref, _ := streamGetTransPref(dbc, userID, client)
50+
func streamGetTranscodeMeta(dbc *db.DB, userID int, client string) spec.TranscodeMeta {
51+
pref, _ := streamGetTransodePreference(dbc, userID, client)
5252
if pref == nil {
53-
return "", ""
53+
return spec.TranscodeMeta{}
5454
}
5555
profile, ok := transcode.UserProfiles[pref.Profile]
5656
if !ok {
57-
return "", ""
57+
return spec.TranscodeMeta{}
58+
}
59+
return spec.TranscodeMeta{
60+
TranscodedContentType: profile.MIME(),
61+
TranscodedSuffix: profile.Suffix(),
5862
}
59-
return profile.MIME(), profile.Suffix()
6063
}
6164

6265
var errUnknownMediaType = fmt.Errorf("media type is unknown")
@@ -287,7 +290,7 @@ func (c *Controller) ServeStream(w http.ResponseWriter, r *http.Request) *spec.R
287290
return nil
288291
}
289292

290-
pref, err := streamGetTransPref(c.DB, user.ID, params.GetOr("c", ""))
293+
pref, err := streamGetTransodePreference(c.DB, user.ID, params.GetOr("c", ""))
291294
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
292295
return spec.NewError(0, "couldn't find transcode preference: %v", err)
293296
}

server/ctrlsubsonic/spec/spec.go

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -151,35 +151,40 @@ type TracksByGenre struct {
151151
List []*TrackChild `xml:"song" json:"song"`
152152
}
153153

154+
type TranscodeMeta struct {
155+
TranscodedContentType string `xml:"transcodedContentType,attr,omitempty" json:"transcodedContentType,omitempty"`
156+
TranscodedSuffix string `xml:"transcodedSuffix,attr,omitempty" json:"transcodedSuffix,omitempty"`
157+
}
158+
154159
type TrackChild struct {
155-
ID *specid.ID `xml:"id,attr,omitempty" json:"id,omitempty"`
156-
Album string `xml:"album,attr,omitempty" json:"album,omitempty"`
157-
AlbumID *specid.ID `xml:"albumId,attr,omitempty" json:"albumId,omitempty"`
158-
Artist string `xml:"artist,attr,omitempty" json:"artist,omitempty"`
159-
ArtistID *specid.ID `xml:"artistId,attr,omitempty" json:"artistId,omitempty"`
160-
Bitrate int `xml:"bitRate,attr,omitempty" json:"bitRate,omitempty"`
161-
ContentType string `xml:"contentType,attr,omitempty" json:"contentType,omitempty"`
162-
TranscodedContentType string `xml:"transcodedContentType,attr,omitempty" json:"transcodedContentType,omitempty"`
163-
CoverID *specid.ID `xml:"coverArt,attr,omitempty" json:"coverArt,omitempty"`
164-
CreatedAt time.Time `xml:"created,attr,omitempty" json:"created,omitempty"`
165-
Duration int `xml:"duration,attr,omitempty" json:"duration,omitempty"`
166-
Genre string `xml:"genre,attr,omitempty" json:"genre,omitempty"`
167-
IsDir bool `xml:"isDir,attr" json:"isDir"`
168-
IsVideo bool `xml:"isVideo,attr" json:"isVideo"`
169-
ParentID *specid.ID `xml:"parent,attr,omitempty" json:"parent,omitempty"`
170-
Path string `xml:"path,attr,omitempty" json:"path,omitempty"`
171-
Size int `xml:"size,attr,omitempty" json:"size,omitempty"`
172-
Suffix string `xml:"suffix,attr,omitempty" json:"suffix,omitempty"`
173-
TranscodedSuffix string `xml:"transcodedSuffix,attr,omitempty" json:"transcodedSuffix,omitempty"`
174-
Title string `xml:"title,attr" json:"title"`
175-
TrackNumber int `xml:"track,attr,omitempty" json:"track,omitempty"`
176-
DiscNumber int `xml:"discNumber,attr,omitempty" json:"discNumber,omitempty"`
177-
Type string `xml:"type,attr,omitempty" json:"type,omitempty"`
178-
Year int `xml:"year,attr,omitempty" json:"year,omitempty"`
160+
ID *specid.ID `xml:"id,attr,omitempty" json:"id,omitempty"`
161+
Album string `xml:"album,attr,omitempty" json:"album,omitempty"`
162+
AlbumID *specid.ID `xml:"albumId,attr,omitempty" json:"albumId,omitempty"`
163+
Artist string `xml:"artist,attr,omitempty" json:"artist,omitempty"`
164+
ArtistID *specid.ID `xml:"artistId,attr,omitempty" json:"artistId,omitempty"`
165+
Bitrate int `xml:"bitRate,attr,omitempty" json:"bitRate,omitempty"`
166+
ContentType string `xml:"contentType,attr,omitempty" json:"contentType,omitempty"`
167+
CoverID *specid.ID `xml:"coverArt,attr,omitempty" json:"coverArt,omitempty"`
168+
CreatedAt time.Time `xml:"created,attr,omitempty" json:"created,omitempty"`
169+
Duration int `xml:"duration,attr,omitempty" json:"duration,omitempty"`
170+
Genre string `xml:"genre,attr,omitempty" json:"genre,omitempty"`
171+
IsDir bool `xml:"isDir,attr" json:"isDir"`
172+
IsVideo bool `xml:"isVideo,attr" json:"isVideo"`
173+
ParentID *specid.ID `xml:"parent,attr,omitempty" json:"parent,omitempty"`
174+
Path string `xml:"path,attr,omitempty" json:"path,omitempty"`
175+
Size int `xml:"size,attr,omitempty" json:"size,omitempty"`
176+
Suffix string `xml:"suffix,attr,omitempty" json:"suffix,omitempty"`
177+
Title string `xml:"title,attr" json:"title"`
178+
TrackNumber int `xml:"track,attr,omitempty" json:"track,omitempty"`
179+
DiscNumber int `xml:"discNumber,attr,omitempty" json:"discNumber,omitempty"`
180+
Type string `xml:"type,attr,omitempty" json:"type,omitempty"`
181+
Year int `xml:"year,attr,omitempty" json:"year,omitempty"`
179182
// star / rating
180183
Starred *time.Time `xml:"starred,attr,omitempty" json:"starred,omitempty"`
181184
UserRating int `xml:"userRating,attr,omitempty" json:"userRating,omitempty"`
182185
AverageRating string `xml:"averageRating,attr,omitempty" json:"averageRating,omitempty"`
186+
187+
TranscodeMeta
183188
}
184189

185190
type Artists struct {
@@ -292,7 +297,7 @@ type ArtistInfo struct {
292297
MediumImageURL string `xml:"mediumImageUrl" json:"mediumImageUrl"`
293298
LargeImageURL string `xml:"largeImageUrl" json:"largeImageUrl"`
294299
ArtistImageURL string `xml:"artistImageUrl" json:"artistImageUrl"` // not sure where this comes from but other clients seem to expect it
295-
Similar []*Artist `xml:"similarArtist,omitempty" json:"similarArtist,omitempty"`
300+
Similar []*Artist `xml:"similarArtist,omitempty" json:"similarArtist,omitempty"`
296301
}
297302

298303
type Genres struct {

transcode/transcode.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ type Transcoder interface {
2020

2121
var UserProfiles = map[string]Profile{
2222
"mp3": MP3,
23-
"mp3_320": MP3320,
23+
"mp3_320": MP3320,
2424
"mp3_rg": MP3RG,
2525
"opus_car": OpusRGLoud,
2626
"opus": Opus,
@@ -45,7 +45,7 @@ var (
4545
Opus128RG = NewProfile("audio/ogg", "opus", 128, `ffmpeg -v 0 -i <file> -ss <seek> -map 0:a:0 -vn -b:a <bitrate> -c:a libopus -vbr on -af "volume=replaygain=track:replaygain_preamp=6dB:replaygain_noclip=0, alimiter=level=disabled, asidedata=mode=delete:type=REPLAYGAIN" -metadata replaygain_album_gain= -metadata replaygain_album_peak= -metadata replaygain_track_gain= -metadata replaygain_track_peak= -metadata r128_album_gain= -metadata r128_track_gain= -f opus -`)
4646
Opus128RGLoud = NewProfile("audio/ogg", "opus", 128, `ffmpeg -v 0 -i <file> -ss <seek> -map 0:a:0 -vn -b:a <bitrate> -c:a libopus -vbr on -af "aresample=96000:resampler=soxr, volume=replaygain=track:replaygain_preamp=15dB:replaygain_noclip=0, alimiter=level=disabled, asidedata=mode=delete:type=REPLAYGAIN" -metadata replaygain_album_gain= -metadata replaygain_album_peak= -metadata replaygain_track_gain= -metadata replaygain_track_peak= -metadata r128_album_gain= -metadata r128_track_gain= -f opus -`)
4747

48-
Opus192 = NewProfile("audio/ogg", "opus", 192, `ffmpeg -v 0 -i <file> -ss <seek> -map 0:a:0 -vn -b:a <bitrate> -c:a libopus -vbr on -f opus -`)
48+
Opus192 = NewProfile("audio/ogg", "opus", 192, `ffmpeg -v 0 -i <file> -ss <seek> -map 0:a:0 -vn -b:a <bitrate> -c:a libopus -vbr on -f opus -`)
4949
)
5050

5151
type BitRate uint // kilobits/s

0 commit comments

Comments
 (0)