Пример #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);
        }