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); }
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); }
public bool CanPlay(PlaylistItemRuntime pli) { return(!pli.NotPlayableOnCurrentDevice);// !(MaxSampleRate > 0 && pli.SampleRate > MaxSampleRate); }