private Performance GetPerformance(Composition composition, string orchestras, string conductors, string performers)
        {
            Debug.Assert(MusicDb != null);
            var performance = composition.Performances.SingleOrDefault(p =>
                                                                       p.Orchestras.IsEqualIgnoreAccentsAndCase(orchestras) &&
                                                                       p.Conductors.IsEqualIgnoreAccentsAndCase(conductors) &&
                                                                       p.Performers.IsEqualIgnoreAccentsAndCase(performers));

            if (performance != null)
            {
                // find a unique name for this performance
                var index = 1;
                var found = false;
                while (!found)
                {
                    var name = $"{performers} ({++index})";
                    performance = composition.Performances.SingleOrDefault(p => p.Performers.IsEqualIgnoreAccentsAndCase(name));
                    found       = performance == null;
                }
            }

            performance = new Performance
            {
                Composition          = composition,
                Orchestras           = orchestras,
                Conductors           = conductors,
                Performers           = performers,
                AlphamericPerformers = performers.ToAlphaNumerics(),
                Year = FirstFile.GetYear() ?? 0
            };
            var movementNumber = 0;

            foreach (var track in MusicFiles.Select(mf => mf.Track).OrderBy(x => x.Number))
            {
                if (track == null || track.Performance != null)
                {
                    Debugger.Break();
                }
                track.MovementNumber = ++movementNumber;
                performance.Movements.Add(track);
            }
            Debug.Assert(performance.Movements.Count > 0);
            composition.Performances.Add(performance);
            return(performance);
        }
        protected override async Task LoadMusicTags()
        {
            var json = await ReadMusicTagJson();

            if (json != null)
            {
                var teo = json.ToInstance <WesternClassicalAlbumTEO>();
                performanceTEO = teo.PerformanceList.Single(x =>
                                                            x.MovementFilenames.All(f => MusicFiles.Select(mf => mf.File).SingleOrDefault(x => x.EndsWith(f, System.Globalization.CompareOptions.IgnoreCase)) != null)
                                                            );
                ComposerName    = performanceTEO.ComposerTag.GetValue <string>();
                CompositionName = performanceTEO.CompositionTag.GetValue <string>();
                orchestras      = performanceTEO.OrchestraTag.GetValues <string>();
                conductors      = performanceTEO.ConductorTag.GetValues <string>();
                otherPerformers = performanceTEO.PerformerTag.GetValues <string>();
            }
        }