/// <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); }
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); } }
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(); }
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); } }
// -------------------------------------------------------------------- // 予約を上へ(ソート番号を大きく) // -------------------------------------------------------------------- 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()); }
// -------------------------------------------------------------------- // 予約を次の再生位置へ // -------------------------------------------------------------------- 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()); }
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()); } }
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); } }
public void Enqueue(RequestSong value) { Enqueue(value.Song); EnqueueNullable(value.Position, Enqueue); Enqueue(value.Duration); }
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()); } }
// ==================================================================== // 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); } } }