/// <summary> /// /// </summary> /// <param name="source"></param> /// <param name="interpolation">相对于当前播放项的距离</param> /// <returns></returns> public async Task <PlaybackItem> PushToRelative(MusicUi source, int interpolation) { if (source.IsPlaying) { return(null); } if (!DbContext.PlaybackList.Any()) { await PushGroup(new[] { source }); return(null); } MediaPlaybackItem playItem; try { playItem = await source.GetPlaybackItem(); } catch (Exception) { await _manageService.RemoveMusicData(new[] { source }); return(null); } var dbPlayList = DbContext.PlaybackList.OrderBy(pi => pi.TrackId).ToList(); int trackId = (int)_playbackList.CurrentItemIndex; var dbPlayItem = await DbContext.PlaybackList.FirstOrDefaultAsync(pi => pi.MusicFileId == source.Id); if (dbPlayItem != null) { _playbackList.Items.Remove(_playbackList.Items[dbPlayItem.TrackId]); dbPlayList.Remove(dbPlayItem); } int targetId = trackId + interpolation; if (targetId < 0) { targetId = 0; } else if (targetId > dbPlayList.Count) { targetId = dbPlayList.Count; } var newItem = dbPlayItem == null ? new PlaybackItem(source.Id) : dbPlayItem; dbPlayList.Insert(targetId, newItem); SetUpTrackId(dbPlayList, targetId); DbContext.PlaybackList.UpdateRange(dbPlayList); await DbContext.SaveChangesAsync(); _playbackList.Items.Insert(targetId, playItem); return(newItem); }
public async Task PushImmediately(MusicUi source) { if (source.IsPlaying) { return; } var item = await PushToRelative(source, -1); if (item != null) { _playbackList.MoveTo((uint)item.TrackId); } }
public async Task PushGroup(IEnumerable <MusicUi> source, MusicUi needPlayItem = null) { var sourceList = source.ToList(); bool isEqual = sourceList.Count == DbContext.PlaybackList.Count(); if (isEqual) { var dbDataList = DbContext.PlaybackList.OrderBy(pi => pi.TrackId).ToList(); for (int i = 0; i < sourceList.Count; i++) { if (sourceList[i].Id != dbDataList[i].MusicFileId) { isEqual = false; break; } if (i > 10) { break; } } } if (!isEqual) { var dbPlayList = new List <PlaybackItem>(); var playList = new List <MediaPlaybackItem>(); var removeList = new List <MusicUi>(); await LoadFilesAsync(async() => { for (int i = 0; i < sourceList.Count; i++) { var item = sourceList[i]; try { playList.Add(await item.GetPlaybackItem()); dbPlayList.Add(new PlaybackItem(item.Id, i)); } catch (Exception) { removeList.Add(item); continue; } } }); var pi = dbPlayList.FirstOrDefault(); if (pi != null) { pi.IsPlaying = true; } removeList.ForEach(item => sourceList.Remove(item)); await _manageService.RemoveMusicData(removeList); CleanDbAndList(); DbContext.PlaybackList.AddRange(dbPlayList); await DbContext.SaveChangesAsync(); playList.ForEach(_playbackList.Items.Add); } if (!DbContext.PlaybackList.Any()) { return; } var npi = needPlayItem ?? sourceList.First(); var p = DbContext.PlaybackList.FirstOrDefault(pi => pi.MusicFileId == npi.Id); if (p != null && p.TrackId != 0) { _playbackList.MoveTo((uint)p.TrackId); } else { NotifyPlayItemChange(DbContext.PlaybackList.First(pi => pi.TrackId == 0)); } }