Example #1
0
        public static PlaylistItemDTO ToDTO(this PlaylistItemRuntime pli, bool isSubitem = false)
        {
            var dto = new PlaylistItemDTO
            {
                Id       = pli.Id,
                Position = pli.Position,
                Type     = pli.Type,
                //Title = pli.Title,
                NotPlayableOnCurrentDevice = pli.NotPlayableOnCurrentDevice,
                Titles             = pli.Titles,
                CoverArtUrl        = pli.CoverArtUrl,
                AudioProperties    = pli.AudioProperties,
                SampleRate         = pli.SampleRate,
                Sequence           = pli.Sequence,
                TotalTime          = pli.TotalTime,
                FormattedTotalTime = pli.FormattedTotalTime,
                IsSubitem          = isSubitem,
                SubItems           = pli.SubItems?.Select(x => x.ToDTO(true))
            };

            //if(pli.)
            return(dto);
        }
Example #2
0
        public static PlaylistItemRuntime ToRuntime(this PlaylistItem pli, MusicDb db, DeviceRuntime dr)
        {
            PlaylistItemRuntime plir = null;

            switch (pli.Type)
            {
            default:
            case PlaylistItemType.MusicFile:
                var playable = dr.MaxSampleRate == 0 || pli.MusicFile.SampleRate == 0 || pli.MusicFile.SampleRate <= dr.MaxSampleRate;
                plir = new PlaylistItemRuntime
                {
                    Id       = pli.Id,
                    Type     = PlaylistRuntimeItemType.SingleItem,
                    Position = new PlaylistPosition(pli.Sequence, 0),
                    //Title = pli.Title,
                    Titles = new string[] {
                        pli.MusicFile.Track.Performance?.Composition.Artist.Name ?? pli.MusicFile.Track.Work.Artist.Name,
                        pli.MusicFile.Track.Performance?.Composition.Name ?? pli.MusicFile.Track.Work.Name,
                        pli.MusicFile.Track.Title
                    },
                    Sequence = pli.Sequence,
                    NotPlayableOnCurrentDevice = !playable,
                    ItemId             = pli.ItemId,
                    MusicFileId        = pli.MusicFile.Id,
                    AudioProperties    = pli.MusicFile.GetAudioProperties(),
                    SampleRate         = pli.MusicFile.SampleRate ?? 0,
                    TotalTime          = pli.MusicFile.Duration ?? 0.0,
                    FormattedTotalTime = pli.MusicFile.Duration?.FormatDuration() ?? "00:00",
                    CoverArtUrl        = $"lib/get/work/coverart/{pli.MusicFile.Track.Work.Id}"
                };
                break;

            case PlaylistItemType.Track:
                var mf = pli.Track.GetBestMusicFile(dr);
                plir = new PlaylistItemRuntime
                {
                    Id       = pli.Id,
                    Type     = PlaylistRuntimeItemType.SingleItem,
                    Position = new PlaylistPosition(pli.Sequence, 0),
                    //Title = pli.Title,
                    Titles = new string[] {
                        pli.Track.Performance?.Composition.Artist.Name ?? pli.Track.Work.Artist.Name,
                        pli.Track.Performance?.Composition.Name ?? pli.Track.Work.Name,
                        pli.Track.Title
                    },
                    Sequence = pli.Sequence,
                    NotPlayableOnCurrentDevice = mf == null,
                    ItemId             = pli.ItemId,
                    MusicFileId        = mf?.Id ?? 0,
                    AudioProperties    = mf?.GetAudioProperties(),
                    SampleRate         = mf?.SampleRate ?? 0,
                    TotalTime          = mf?.Duration ?? 0.0,
                    FormattedTotalTime = mf?.Duration?.FormatDuration() ?? "00:00",
                    CoverArtUrl        = $"lib/get/work/coverart/{pli.Track.Work.Id}"
                };
                break;

            case PlaylistItemType.Work:
                var work   = db.Works.Find(pli.Work.Id);
                var tracks = work.Tracks;
                plir = new PlaylistItemRuntime
                {
                    Id       = pli.Id,
                    Type     = PlaylistRuntimeItemType.MultipleItems,
                    Position = new PlaylistPosition(pli.Sequence, 0),
                    //Title = pli.Title,
                    Titles      = new string[] { pli.Title },
                    Sequence    = pli.Sequence,
                    ItemId      = pli.ItemId,
                    CoverArtUrl = $"lib/get/work/coverart/{pli.Work.Id}",
                    // ***NB*** the ToArray() at the end of the next line is very important, as
                    // otherwise the OrderBy...Select will be deferred and may execute *after* the db has been disposed!!
                    SubItems = tracks.OrderBy(t => t.Number).Select(t => t.ToRuntime(dr, pli.Sequence)).ToArray()
                };
                plir.TotalTime          = plir.SubItems.Sum(x => x.TotalTime);
                plir.FormattedTotalTime = plir.TotalTime.FormatDuration();
                break;

            case PlaylistItemType.Performance:
                var performance = db.Performances.Find(pli.Performance.Id);
                var movements   = performance.Movements;
                plir = new PlaylistItemRuntime
                {
                    Id       = pli.Id,
                    Type     = PlaylistRuntimeItemType.MultipleItems,
                    Position = new PlaylistPosition(pli.Sequence, 0),
                    //Title = pli.Title,
                    Titles      = new string[] { pli.Title },
                    Sequence    = pli.Sequence,
                    ItemId      = pli.ItemId,
                    CoverArtUrl = $"lib/get/work/coverart/{movements.First().Work.Id}",
                    //SubItems = movements.OrderBy(t => t.Number).Select(t => t.ToRuntime(pli.Sequence)).ToArray()
                    SubItems = movements.OrderBy(t => t.Number).AsMovementsToRuntime(dr, pli.Sequence)     //**NB* this version of ToRuntime, rewrites the sequence (as movements cannot usse the track number
                };
                plir.TotalTime          = plir.SubItems.Sum(x => x.TotalTime);
                plir.FormattedTotalTime = plir.TotalTime.FormatDuration();
                //return plir2;
                break;
            }
            Debug.Assert(plir != null);
            return(plir);
        }
Example #3
0
 public bool CanPlay(PlaylistItemRuntime pli)
 {
     return(!pli.NotPlayableOnCurrentDevice);// !(MaxSampleRate > 0 && pli.SampleRate > MaxSampleRate);
 }