Example #1
0
        /// <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);
        }
Example #2
0
        public async Task PushImmediately(MusicUi source)
        {
            if (source.IsPlaying)
            {
                return;
            }

            var item = await PushToRelative(source, -1);

            if (item != null)
            {
                _playbackList.MoveTo((uint)item.TrackId);
            }
        }
Example #3
0
        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));
            }
        }