diff --git a/api/get_music_directory.go b/api/get_music_directory.go index 1da4779ad..038c4516c 100644 --- a/api/get_music_directory.go +++ b/api/get_music_directory.go @@ -57,7 +57,7 @@ func (c *GetMusicDirectoryController) Get() { dir.Child[i].Year = mf.Year dir.Child[i].Artist = mf.Artist dir.Child[i].Genre = mf.Genre - dir.Child[i].Track = mf.Track + dir.Child[i].Track = mf.TrackNumber dir.Child[i].Duration = mf.Duration dir.Child[i].Size = mf.Size dir.Child[i].Suffix = mf.Suffix diff --git a/domain/mediafile.go b/domain/mediafile.go index d01b6df66..b2969abff 100644 --- a/domain/mediafile.go +++ b/domain/mediafile.go @@ -12,7 +12,8 @@ type MediaFile struct { Artist string AlbumArtist string AlbumId string `parent:"album"` - Track int + TrackNumber int + DiscNumber int Year int Size string Suffix string diff --git a/persistence/mediafile_repository.go b/persistence/mediafile_repository.go index 13a6f61d3..f2d700b5c 100644 --- a/persistence/mediafile_repository.go +++ b/persistence/mediafile_repository.go @@ -2,6 +2,7 @@ package persistence import ( "github.com/deluan/gosonic/domain" + "sort" ) type mediaFileRepository struct { @@ -20,6 +21,19 @@ func (r *mediaFileRepository) Put(m *domain.MediaFile) error { func (r *mediaFileRepository) FindByAlbum(albumId string) ([]domain.MediaFile, error) { var mfs = make([]domain.MediaFile, 0) - err := r.loadChildren("album", albumId, &mfs, "Track", false) + err := r.loadChildren("album", albumId, &mfs, "", false) + sort.Sort(byTrackNumber(mfs)) return mfs, err } + +type byTrackNumber []domain.MediaFile + +func (a byTrackNumber) Len() int { + return len(a) +} +func (a byTrackNumber) Swap(i, j int) { + a[i], a[j] = a[j], a[i] +} +func (a byTrackNumber) Less(i, j int) bool { + return (a[i].DiscNumber * 1000 + a[i].TrackNumber) < (a[j].DiscNumber * 1000 + a[j].TrackNumber) +} diff --git a/scanner/itunes_scanner.go b/scanner/itunes_scanner.go index 10ddb0e38..f4a8bd68a 100644 --- a/scanner/itunes_scanner.go +++ b/scanner/itunes_scanner.go @@ -28,6 +28,7 @@ func (s *ItunesScanner) LoadFolder(path string) []Track { mediaFiles[i].Compilation = t.Compilation mediaFiles[i].Year = t.Year mediaFiles[i].TrackNumber = t.TrackNumber + mediaFiles[i].DiscNumber = t.DiscNumber if t.Size > 0 { mediaFiles[i].Size = strconv.Itoa(t.Size) } diff --git a/scanner/scanner.go b/scanner/scanner.go index d93da92f3..82972cb61 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -74,7 +74,8 @@ func parseTrack(t *Track) (*domain.MediaFile, *domain.Album, *domain.Artist) { Path: t.Path, CreatedAt: t.CreatedAt, UpdatedAt: t.UpdatedAt, - Track: t.TrackNumber, + TrackNumber: t.TrackNumber, + DiscNumber: t.DiscNumber, Genre: t.Genre, Year: t.Year, Size: t.Size, diff --git a/scanner/track.go b/scanner/track.go index adfe7ae18..152388dc2 100644 --- a/scanner/track.go +++ b/scanner/track.go @@ -13,6 +13,7 @@ type Track struct { AlbumArtist string Genre string TrackNumber int + DiscNumber int Year int Size string Suffix string