/// <summary>
        /// Handles user input and programmatic changes for viewed songs and selected song
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args">Input0: CurrentPlaylist.AllSongs, Input1: CurrentPlaylist.CurrentSong, Input2: CurrentPlaylist.WannaSong, Input3: lbxSongs.SelectedIndex</param>
        /// <returns>The list of Songs to view on UI.</returns>
        private object MicCurrentSongIndex_ConvertRef(object sender, MultiplesInputsConvert4EventArgs args)
        {
            if (args.Input0 == null)
            {
                args.Input3 = -1;
                return(null);
            }
            if (args.ChangedValueIndex == 2)
            {
                return(args.Input0);
            }

            IEnumerable <Song> allSongs = (IEnumerable <Song>)args.Input0;
            Song?currentSong            = (Song?)args.Input1;
            int  index = (int)args.Input3;

            if (args.ChangedValueIndex == 3 && index != -1)
            {
                args.Input2 = RequestSong.Start(allSongs.ElementAt(index));
            }
            else if (!currentSong.HasValue)
            {
                args.Input3 = -1;
            }
            else
            {
                args.Input3 = allSongs.IndexOf(currentSong.Value);
            }

            return(allSongs);
        }
示例#2
0
        public RequestSong DequeueRequestSong()
        {
            Song     song     = DequeueSong();
            TimeSpan?position = DequeueNullable(DequeueTimeSpan);
            TimeSpan duration = DequeueTimeSpan();

            return(RequestSong.Get(song, position, duration));
        }
        // ====================================================================
        // public メンバー関数
        // ====================================================================

        // --------------------------------------------------------------------
        // 予約を追加
        // <返値> 成功した場合は空文字列、エラーの場合はエラーメッセージ
        // --------------------------------------------------------------------
        public async Task <String> AddRequestSongAsync(RequestSong requestSong)
        {
            using HttpResponseMessage response = await _httpClient.PostAsJsonAsync(YbdConstants.URL_API + YbdConstants.URL_REQUEST_SONGS + YbdConstants.URL_REQUEST, requestSong);

            return(response.StatusCode switch
            {
                _ => DefaultErrorMessage(response.StatusCode),
            });
        private void AudioPositionSlider_UserPositionChanged(object sender, TimeSpan e)
        {
            IPlaylist playlist = viewModel.Service.Audio?.CurrentPlaylist;

            if (playlist != null)
            {
                playlist.WannaSong = RequestSong.Get(playlist.CurrentSong, e, playlist.Duration);
            }
        }
示例#5
0
        private async void Service_CurrentPlaylistChanged(object sender, ValueChangedEventArgs <IPlaylistBase> e)
        {
            Unsubscribe((IPlaylist)e.OldValue);
            Subscribe((IPlaylist)e.NewValue);

            if (e.OldValue != null)
            {
                e.OldValue.WannaSong = RequestSong.Get(e.OldValue.CurrentSong, e.OldValue.Position, e.OldValue.Duration);
            }

            CheckCurrentSong(Service.CurrentPlaylist);
            await UpdateCurrentSong();
        }
示例#6
0
        private void SldPosition_ValueChanged(object sender, RoutedPropertyChangedEventArgs <double> e)
        {
            Slider        slider          = (Slider)sender;
            TimeSpan      position        = TimeSpan.FromSeconds(e.NewValue);
            TimeSpan      duration        = TimeSpan.FromSeconds(slider.Maximum);
            IPlaylistBase currentPlaylist = viewModel.AudioServiceUI?.CurrentPlaylist;

            if (currentPlaylist != null && currentPlaylist.CurrentSong.HasValue &&
                currentPlaylist.Duration == duration && currentPlaylist.Position != position)
            {
                currentPlaylist.WannaSong = RequestSong.Get(currentPlaylist.CurrentSong, position);
            }
        }
示例#7
0
        // --------------------------------------------------------------------
        // 予約を上へ(ソート番号を大きく)
        // --------------------------------------------------------------------
        private IActionResult MoveUpRequestSong(DbSet <RequestSong> requestSongs, RequestSong requestSong)
        {
            // 交換対象の予約
            RequestSong?exchangeSong = requestSongs.Where(x => x.Sort > requestSong.Sort).OrderBy(x => x.Sort).FirstOrDefault();

            if (exchangeSong == null)
            {
                return(NotAcceptable());
            }

            // 交換(順番入れ替え)
            (requestSong.Sort, exchangeSong.Sort) = (exchangeSong.Sort, requestSong.Sort);
            return(Ok());
        }
示例#8
0
        // --------------------------------------------------------------------
        // 予約を次の再生位置へ
        // --------------------------------------------------------------------
        private IActionResult MoveNextRequestSong(DbSet <RequestSong> requestSongs, RequestSong requestSong)
        {
            // 再生中の曲は次にできない
            if (requestSong.PlayStatus == PlayStatus.Playing || requestSong.PlayStatus == PlayStatus.Pause)
            {
                return(Conflict());
            }

            Int32       next;
            RequestSong?playingSong = requestSongs.FirstOrDefault(x => x.PlayStatus == PlayStatus.Playing || x.PlayStatus == PlayStatus.Pause);

            if (playingSong != null && playingSong.Sort > requestSong.Sort)
            {
                // 移動対象の方が下にいるので、移動対象を上へ、他を下へ移動
                next = playingSong.Sort;
                IQueryable <RequestSong> downs = requestSongs.Where(x => requestSong.Sort < x.Sort && x.Sort <= next);
                foreach (RequestSong down in downs)
                {
                    down.Sort--;
                }
            }
            else
            {
                // 移動対象の方が上にいるので、移動対象を下へ、他を上へ移動
                if (playingSong != null)
                {
                    next = playingSong.Sort + 1;
                }
                else
                {
                    next = 1;
                }
                IQueryable <RequestSong> ups = requestSongs.Where(x => next <= x.Sort && x.Sort < requestSong.Sort);
                foreach (RequestSong down in ups)
                {
                    down.Sort++;
                }
            }

            // 対象を次の位置へ
            requestSong.Sort = next;
            if (requestSong.PlayStatus == PlayStatus.Played)
            {
                requestSong.PlayStatus = PlayStatus.Unplayed;
            }

            return(Ok());
        }
示例#9
0
        private static void CheckCurrentSong(IPlaylist playlist)
        {
            if (playlist == null)
            {
                return;
            }

            if (playlist.Songs == null || playlist.Songs.Length == 0)
            {
                playlist.WannaSong = null;
            }
            else if (!playlist.WannaSong.HasValue || !playlist.Songs.Contains(playlist.WannaSong.Value.Song))
            {
                playlist.WannaSong = RequestSong.Start(playlist.Songs.First());
            }
        }
示例#10
0
        private object MicCurrentSongIndex_ConvertRef(Song?currentSong, ref RequestSong?wannaSong,
                                                      IEnumerable <Song> allSongs, IEnumerable <Song> searchSongs, bool isSearching, ref int lbxIndex, int changedInput)
        {
            IEnumerable <Song> songs;
            IPlaylist          currentPlaylist   = viewModel.AudioServiceUI?.CurrentPlaylist;
            bool isCurrentPlaylistSourcePlaylist = currentPlaylist is ISourcePlaylist;

            if (!isSearching)
            {
                songs = allSongs;
            }
            else if (isCurrentPlaylistSourcePlaylist)
            {
                songs = searchSongs;
            }
            else
            {
                songs = searchSongs.Except(allSongs);
            }

            if (changedInput == 6 && lbxIndex != -1 && (isSearching || isChangingSelectedSongIndex))
            {
                ;
            }
            else if (changedInput == 6 && lbxIndex != -1 && allSongs.Contains(songs.ElementAt(lbxIndex)))
            {
                wannaSong = RequestSong.Start(songs.ElementAt(lbxIndex));
            }
            else if (!currentSong.HasValue)
            {
                lbxIndex = -1;
            }
            else if (songs.Contains(currentSong.Value))
            {
                lbxIndex = songs.IndexOf(currentSong.Value);
            }
            else if (songs.Any())
            {
                lbxIndex = 0;
            }
            else
            {
                lbxIndex = -1;
            }

            return(songs);
        }
        private static void MergePlaylist(IPlaylistBase playlist, PlaylistData data)
        {
            playlist.Shuffle = data.Shuffle;
            playlist.Loop    = data.Loop;
            playlist.Name    = data.Name;
            playlist.Songs   = data.Songs;

            Song currentSong;

            if (playlist.Songs.TryFirst(s => s.FullPath == data.CurrentSongPath, out currentSong))
            {
                playlist.CurrentSong = currentSong;
                playlist.Position    = data.Position;
                playlist.Duration    = data.Duration;
                playlist.WannaSong   = RequestSong.Get(currentSong, data.Position, data.Duration);
            }
        }
示例#12
0
 public void Enqueue(RequestSong value)
 {
     Enqueue(value.Song);
     EnqueueNullable(value.Position, Enqueue);
     Enqueue(value.Duration);
 }
示例#13
0
        public IActionResult AddRequestSong([FromBody] RequestSong requestSong)
        {
            try
            {
                if (!requestSong.IsValid())
                {
                    return(BadRequest());
                }

                // 予約者のユーザー ID が指定されている場合はその正当性を確認(なりすまし予約防止)
                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out DbSet <StockSong> stockSongs, out DbSet <HistorySong> historySongs);
                if (!String.IsNullOrEmpty(requestSong.UserId))
                {
                    if (!IsTokenValid(registeredUsers, out RegisteredUser? loginUser) || requestSong.UserId != loginUser.Id)
                    {
                        return(Unauthorized());
                    }
                }

                // 追加する曲の位置は最後
                using RequestSongContext requestSongContext = CreateRequestSongContext(out DbSet <RequestSong> requestSongs);
                Int32 sort;
                if (requestSongs.Any())
                {
                    sort = requestSongs.Max(x => x.Sort) + 1;
                }
                else
                {
                    sort = 1;
                }
                requestSong.Sort = sort;

                // 予約追加
                requestSongs.Add(requestSong);
                requestSongContext.SaveChanges();

                if (!String.IsNullOrEmpty(requestSong.UserId))
                {
                    // 予約者のユーザー ID が指定されている場合は履歴追加
                    HistorySong historySong = new();
                    YbdCommon.CopyHistorySongProperty(requestSong, historySong);
                    historySongs.Add(historySong);

                    // 後で歌う予定リストに追加されている場合はリストから削除
                    StockSong?stockSong = SearchStockSongByRequestSong(stockSongs, requestSong);
                    if (stockSong != null)
                    {
                        stockSongs.Remove(stockSong);
                    }

                    userProfileContext.SaveChanges();
                }

                SendSse(YbdConstants.SSE_DATA_REQUEST_CHANGED);
                return(Ok());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("予約追加サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
示例#14
0
        // ====================================================================
        // private static メンバー関数
        // ====================================================================

        // --------------------------------------------------------------------
        // RequestSong の情報に合致する StockSong を検索
        // <例外> Exception
        // --------------------------------------------------------------------
        private static StockSong?SearchStockSongByRequestSong(DbSet <StockSong> stockSongs, RequestSong requestSong)
        {
            // ID で検索
            StockSong?result = stockSongs.SingleOrDefault(x => x.AvailableSongId == requestSong.AvailableSongId);

            if (result == null)
            {
                // フルパスで検索
                // 実際の運用時は外部アプリケーションが予約可能曲データベースを作成することが想定され、AvailableSongId が変更されている場合も想定されるため、パスでも検索する
                result = stockSongs.FirstOrDefault(x => x.Path == requestSong.Path);
            }
            if (result == null)
            {
                // ファイル名で検索
                result = stockSongs.FirstOrDefault(x => EF.Functions.Like(x.Path, $"%\\{Path.GetFileName(requestSong.Path)}%"));
            }

            return(result);
        }
        public static void AddSongsToFirstPlaylist(this IAudioService service, IEnumerable <Song> songs,
                                                   bool prepend, IInvokeDispatcherHelper helper)
        {
            songs = songs as Song[] ?? songs.ToArray();

            if (!songs.Any())
            {
                return;
            }

            IPlaylist currentPlaylist = service.CurrentPlaylist;
            Song?     currentSong     = currentPlaylist?.CurrentSong;

            if (service.Playlists.Count > 0)
            {
                IPlaylist playlist = service.Playlists[0];

                if (playlist.ID == currentPlaylist?.ID)
                {
                    if (prepend)
                    {
                        playlist.Songs     = songs.Concat(playlist.Songs).Distinct().ToArray();
                        playlist.WannaSong = RequestSong.Start(songs.First());
                    }
                    else
                    {
                        playlist.Songs = playlist.Songs.Concat(songs).Distinct().ToArray();
                    }
                }
                else
                {
                    if (prepend || !currentSong.HasValue)
                    {
                        playlist.Songs     = songs.Distinct().ToArray();
                        playlist.WannaSong = RequestSong.Start(songs.First());
                        playlist.Duration  = currentPlaylist.Duration;
                        playlist.Position  = currentPlaylist.Position;

                        service.CurrentPlaylist = playlist;
                    }
                    else
                    {
                        playlist.Songs     = songs.Insert(0, currentSong.Value).Distinct().ToArray();
                        playlist.WannaSong = RequestSong.Get(currentSong.Value, null, currentPlaylist.Duration);

                        service.CurrentPlaylist = playlist;

                        currentPlaylist.CurrentSong = currentPlaylist.Songs.Cast <Song?>()
                                                      .NextOrDefault(currentSong).next;
                        currentPlaylist.Position  = TimeSpan.Zero;
                        currentPlaylist.WannaSong = RequestSong.Start(currentPlaylist.CurrentSong);
                    }
                }
            }
            else
            {
                IPlaylist playlist = new Playlist(helper)
                {
                    Name    = "Custom",
                    Loop    = LoopType.Next,
                    Shuffle = OrderType.Custom
                };

                if (prepend || !currentSong.HasValue)
                {
                    playlist.Songs     = songs.ToArray();
                    playlist.WannaSong = RequestSong.Start(songs.First());
                    playlist.Duration  = currentPlaylist.Duration;
                    playlist.Position  = currentPlaylist.Position;

                    service.Playlists.Add(playlist);
                    service.CurrentPlaylist = playlist;
                }
                else
                {
                    playlist.Songs     = songs.Insert(0, currentSong.Value).ToArray();
                    playlist.WannaSong = RequestSong.Get(currentSong.Value, null, currentPlaylist.Duration);

                    service.Playlists.Add(playlist);
                    service.CurrentPlaylist = playlist;

                    currentPlaylist.CurrentSong = currentPlaylist.Songs.Cast <Song?>()
                                                  .NextOrDefault(currentSong).next;
                    currentPlaylist.Position  = TimeSpan.Zero;
                    currentPlaylist.WannaSong = RequestSong.Start(currentPlaylist.CurrentSong);
                }
            }
        }