private void LoadChangesFromFiles()
        {
            foreach (Tuple <Release, LocalAlbum> item in matcherResult.ChangedReleases)
            {
                Release    release = item.Item1;
                LocalAlbum album   = item.Item2;
                release.Genre = album.Genre ?? release.Genre;
                if (album.Year != 0 && release.ReleaseDate.Date.Year != album.Year)
                {
                    release.ReleaseDate = album.Year == 0 ? new ReleaseDate() : new ReleaseDate(album.Year);
                }
                if (!this.collectionManager.Operations.MatchReleaseTracklistWithLocalAlbum(release, album))
                {
                    release.Tracklist.Clear();
                    release.Tracklist.AddRange(this.collectionManager.Operations.GenerateTracklistForLocalAlbum(this.collectionManager, album, release));
                }
                release.DateModified = DateTime.Now;

                release.UpdateDynamicProperties();
                this.collectionManager.Save(release);

                ++this.totalProcessed;
                this.OnProgressChanged();
            }
        }
        public List<Track> GenerateTracklistForLocalAlbum(ICollectionManager collectionManager, LocalAlbum album, Release release)
        {
            List<Track> list = new List<Track>();
            foreach (LocalDisc disc in album.Discs)
            {
                bool hasTrackArtists = disc.Tracks.Any(t => t.Artist != disc.Tracks[0].Artist);

                foreach (TrackInfoCache localTrack in disc.Tracks)
                {
                    Track track = new Track()
                    {
                        Disc = localTrack.Disc,
                        Position = localTrack.Track,
                        Title = localTrack.Title,
                        RelativeFilename = localTrack.RelativeFilename
                    };
                    if (hasTrackArtists)
                    {
                        track.Artists.Add(new TrackArtist()
                        {
                            Artist = collectionManager.GetOrCreateArtist(localTrack.Artist),
                        });
                        track.JoinedArtists = localTrack.Artist;
                    }

                    list.Add(track);
                }
            }
            return list;
        }
        public bool MatchReleaseTracklistWithLocalAlbum(Release release, LocalAlbum localAlbum)
        {
            List<Track> tracks = this.GenerateTracklistForLocalAlbum(this.collectionManager, localAlbum, null);

            for (int i = 0; i < tracks.Count; ++i)
            {
                Track track = release.Tracklist[i];
                Track localTrack = tracks[i];

                if (track.RelativeFilename != localTrack.RelativeFilename)
                {
                    return false;
                }
                if (track.Title != localTrack.Title)
                {
                    return false;
                }
                if (track.JoinedArtists != localTrack.JoinedArtists)
                {
                    return false;
                }
                if (track.Disc != localTrack.Disc)
                {
                    return false;
                }
                if (track.Position != localTrack.Position)
                {
                    return false;
                }
            }

            foreach (LocalDisc disc in localAlbum.Discs)
            {
                foreach (TrackInfoCache track in disc.Tracks)
                {
                    if (track.Year != 0 && track.Year != release.ReleaseDate.Date.Year)
                    {
                        return false;
                    }
                    if (track.Year == 0 && release.ReleaseDate.IsValid)
                    {
                        return false;
                    }
                    if (track.RelativeFilename != track.RelativeFilename)
                    {
                        return false;
                    }

                    if (track.Genre != release.Genre)
                    {
                        return false;
                    }
                    if (track.DiscCount != release.DiscCount)
                    {
                        return false;
                    }
                    if (track.AlbumArtist != release.JoinedAlbumArtists)
                    {
                        return false;
                    }
                    if (track.Album != release.Title)
                    {
                        return false;
                    }
                }
            }

            return true;
        }
        public bool MatchReleaseWithLocalAlbum(Release release, LocalAlbum localAlbum)
        {
            if (release.JoinedAlbumArtists != localAlbum.AlbumArtist)
            {
                return false;
            }
            if (release.Title != localAlbum.Title)
            {
                return false;
            }

            if (localAlbum.Year != 0 && release.ReleaseDate.Date.Year != localAlbum.Year)
            {
                return false;
            }
            if (localAlbum.Year == 0 && release.ReleaseDate.IsValid)
            {
                return false;
            }

            if (release.Genre != localAlbum.Genre)
            {
                return false;
            }
            if (release.DiscCount != localAlbum.DiscCount)
            {
                return false;
            }

            if (!MatchReleaseTracklistWithLocalAlbum(release, localAlbum))
            {
                return false;
            }

            return true;
        }
 public Release GetReleaseByLocalAlbumName(LocalAlbum localAlbum)
 {
     return this.collectionManager.Releases
         .Where(r => r.Title == localAlbum.Title && r.JoinedAlbumArtists == localAlbum.AlbumArtist)
         .FirstOrDefault();
 }