From ffd6304a23fbdd00d19510815eb07ef85e36b8a6 Mon Sep 17 00:00:00 2001
From: Deluan <github@deluan.com>
Date: Thu, 3 Mar 2016 00:42:42 -0500
Subject: [PATCH] Added DiscNumber field, used to sort tracks

---
 api/get_music_directory.go          |  2 +-
 domain/mediafile.go                 |  3 ++-
 persistence/mediafile_repository.go | 16 +++++++++++++++-
 scanner/itunes_scanner.go           |  1 +
 scanner/scanner.go                  |  3 ++-
 scanner/track.go                    |  1 +
 6 files changed, 22 insertions(+), 4 deletions(-)

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