public static void HandlePickup(string checksum, EventHandler onFinish, EventHandler onFail) { if ((BanchoClient.Permission & Permissions.Supporter) > 0) { OnlineBeatmap.FromId(LinkId.Checksum, checksum, delegate(object beatmap, EventArgs f) { OnlineBeatmap ob = beatmap as OnlineBeatmap; if (ob == null) { if (onFail != null) { onFail(null, null); } return; } QueueBeatmapForResponse(ob); ob.OnDownloadFinished += onFinish; }); return; } if (onFail != null) { onFail(null, null); } }
public void DeleteSongs(List <LocalBeatmap> songs) { foreach (LocalBeatmap localBeatmap in songs) { LocalBeatmaps.Maps.Remove(localBeatmap); App.BeatSaverApi.DeleteSong(localBeatmap); } List <OnlineBeatmap> onlineBeatmaps = new List <OnlineBeatmap>(); foreach (LocalBeatmap localBeatmap in songs) { OnlineBeatmap onlineBeatmap = MainWindow.ViewModel.BeatmapOnlineUserControl.ViewModel.OnlineBeatmaps?.Maps.FirstOrDefault(x => x.Key == localBeatmap.Identifier.Value || x.Hash == localBeatmap.Identifier.Value); if (onlineBeatmap != null) { onlineBeatmaps.Add(onlineBeatmap); } } if (onlineBeatmaps.Count == songs.Count) { onlineBeatmaps.ForEach(x => x.IsDownloaded = false); } else { BeatmapChanged = true; } LocalBeatmaps = App.BeatSaverApi.RefreshLocalPages(LocalBeatmaps); }
private async void Map_Download(object sender, RoutedEventArgs e) { OnlineBeatmap beatmap = ((Button)sender).Tag as OnlineBeatmap; await ViewModel.DownloadSong(beatmap); ViewModel.UpdatePageButtons(); }
private void BeatSaverApi_DownloadCompleted(object sender, DownloadCompletedEventArgs e) { if (OnlineBeatmaps is null) { return; } if (!OnlineBeatmaps.Maps.Contains(e.Beatmap)) { OnlineBeatmap onlineBeatmap = OnlineBeatmaps.Maps.FirstOrDefault(x => x.Key == e.Beatmap.Key); if (onlineBeatmap != null) { onlineBeatmap.IsDownloading = e.Beatmap.IsDownloading; onlineBeatmap.IsDownloaded = e.Beatmap.IsDownloaded; } } if (!OnlineBeatmaps.Maps.Any(x => x.IsDownloading) && !App.BeatSaverApi.Downloading.Any()) { MainWindow.radioButtonSettings.IsEnabled = true; } BeatmapChanged = true; UpdatePageButtons(); }
public static void HandlePickup(LinkId idType, int id, EventHandler onFinish, EventHandler onFail) { if ((BanchoClient.Permission & Permissions.Supporter) > 0) { OnlineBeatmap.FromId(idType, id.ToString(), delegate(object beatmap, EventArgs f) { OnlineBeatmap ob = beatmap as OnlineBeatmap; if (ob == null) { if (onFail == null) { HandlePickupFallback(idType, id); } else { onFail(null, null); } return; } QueueBeatmapForResponse(ob); ob.OnDownloadFinished += onFinish; }); return; } HandlePickupFallback(idType, id); }
internal static void QueueBeatmapForResponse(OnlineBeatmap ob) { if (!ResponseQueue.Contains(ob) && RespondingBeatmap != ob) { ResponseQueue.Enqueue(ob); } }
public void BeatmapDetails(OnlineBeatmap beatmap, bool changePage = true) { MainWindow.ViewModel.BeatmapOnlineDetailsUserControl.ViewModel.Beatmap = beatmap; if (changePage) { MainWindow.userControlMain.Content = MainWindow.ViewModel.BeatmapOnlineDetailsUserControl; } MainWindow.ViewModel.BeatmapOnlineUserControl.dataGridMaps.UnselectAll(); }
/// <summary> /// The constructor for the event /// </summary> /// <param name="beatmap">The beatmap to download</param> /// <param name="bytesReceived">The total amount of bytes received</param> /// <param name="totalBytesToReceive">The total amount of bytes to receive</param> /// <param name="progressPercent">The download progress percent</param> /// <param name="timeLeft">The estimated time left until completed</param> /// <param name="timeSpent">The time spent downloading</param> /// <param name="downloaded">The current amount downloaded</param> /// <param name="toDownload">The current amount to download</param> public DownloadProgressedEventArgs(OnlineBeatmap beatmap, long bytesReceived, long totalBytesToReceive, int progressPercent, string timeLeft, string timeSpent, string downloaded, string toDownload) { Beatmap = beatmap; BytesReceived = bytesReceived; TotalBytesToReceive = totalBytesToReceive; ProgressPercent = progressPercent; TimeLeft = timeLeft; TimeSpent = timeSpent; Downloaded = downloaded; ToDownload = toDownload; }
public void DeleteSong(OnlineBeatmap beatmap) { LocalBeatmap localBeatmap = MainWindow.ViewModel.BeatmapLocalUserControl.ViewModel.LocalBeatmaps?.Maps.FirstOrDefault(x => x.Identifier.Value == beatmap.Key || x.Identifier.Value == beatmap.Hash); if (localBeatmap != null) { MainWindow.ViewModel.BeatmapLocalUserControl.ViewModel.LocalBeatmaps.Maps.Remove(localBeatmap); } App.BeatSaverApi.DeleteSong(beatmap); BeatmapChanged = true; }
public BeatmapFailedUserControl(OnlineBeatmap beatmap, Exception exception) { InitializeComponent(); string message = exception.Message; if (exception.InnerException != null && !exception.Message.Contains(exception.InnerException.Message)) { message += $" ({exception.InnerException.Message})"; } ViewModel = new BeatmapFailedUserControlViewModel(beatmap, message); DataContext = ViewModel; }
private static void HideResponseDialog() { ResetAudioPreview(); if (ResponseSprites != null) { ResponseSprites.ForEach(s => { s.FadeOut(100); s.AlwaysDraw = false; }); } RespondingBeatmap = null; WasPlayingAudio = false; }
public void DeleteSong(LocalBeatmap beatmap) { OnlineBeatmap onlineBeatmap = MainWindow.ViewModel.BeatmapOnlineUserControl.ViewModel.OnlineBeatmaps?.Maps.FirstOrDefault(x => x.Key == beatmap.Identifier.Value || x.Hash == beatmap.Identifier.Value); App.BeatSaverApi.DeleteSong(beatmap); LocalBeatmaps.Maps.Remove(beatmap); if (onlineBeatmap is null) { BeatmapChanged = true; } else { onlineBeatmap.IsDownloaded = false; } LocalBeatmaps = App.BeatSaverApi.RefreshLocalPages(LocalBeatmaps); }
private BeatmapDownloadingUserControl GetDownloadingBeatmap(OnlineBeatmap beatmap) { BeatmapDownloadingUserControl downloadingUserControl = null; foreach (object obj in userControl.stackPanelDownloading.Children) { if (obj is BeatmapDownloadingUserControl control) { if (control.ViewModel.Beatmap == beatmap) { downloadingUserControl = control; break; } } } return(downloadingUserControl); }
/// <summary> /// 使用<seealso cref="OnlineBeatmap"/>初始化Beatmap对象> /// </summary> /// <param name="olbeatmap"></param> public Beatmap(OnlineBeatmap olbeatmap) { Title = olbeatmap.Title; TitleUnicode = Title; Artist = olbeatmap.Artist; ArtistUnicode = Artist; Creator = olbeatmap.Creator; Difficulty = olbeatmap.Version; Version = Difficulty; FileName = ""; FullPath = ""; DownloadLink = ""; Source = olbeatmap.Source; Tags = olbeatmap.Tags; Maker = ""; Md5 = new MD5String(olbeatmap.Md5); FullAudioFileName = ""; }
private BeatmapCompletedUserControl GetCompletedBeatmap(OnlineBeatmap beatmap) { BeatmapCompletedUserControl completedUserControl = null; foreach (object obj in userControl.stackPanelCompleted.Children) { if (obj is BeatmapCompletedUserControl control) { if (control.ViewModel.Beatmap == beatmap) { completedUserControl = control; break; } } } return(completedUserControl); }
public static OsuDirectDownload StartDownload(OnlineBeatmap ob, bool noVideo) { //check for existing downloads for this beatmap first. if (ActiveDownloads.Find(d => d.beatmap.setId == ob.setId) != null) { NotificationManager.ShowMessageMassive("This beatmap is already being downloaded!", 2000); return(null); } GameBase.Scheduler.Add(delegate { if (RespondingBeatmap == ob) { HideResponseDialog(); } }); #if P2P OsuMagnetFactory.WebGetOz2Hashes(ob.setid, (hash, dummy) => GameBase.Scheduler.Add(() => { OsuDirectDownload odd; if (hash != null) { odd = new P2PDirectDownload(ob, noVideo); } else { odd = new OsuDirectDownload(ob, noVideo); } StartDownload(odd); callback(odd); })); #else OsuDirectDownload odd = new OsuDirectDownload(ob, noVideo); StartDownload(odd); #endif return(odd); }
public async Task DownloadSong(OnlineBeatmap beatmap) { try { MainWindow.radioButtonSettings.IsEnabled = false; await App.BeatSaverApi.DownloadSong(beatmap); } catch (InvalidOperationException e) { MainWindow.ToggleLoading(false); string errorMessage = e.Message; if (e.InnerException != null && !e.Message.Contains(e.InnerException.Message)) { errorMessage += $" ({e.InnerException.Message})"; } await MainWindow.ShowMessageAsync("Downloading failed", "Downloading the song failed with the following error\n\n" + "Error:\n" + $"{errorMessage}"); } catch (Exception e) { MainWindow.ToggleLoading(false); string errorMessage = e.Message; if (e.InnerException != null && !e.Message.Contains(e.InnerException.Message)) { errorMessage += $" ({e.InnerException.Message})"; } MessageDialogResult result = await MainWindow.ShowMessageAsync("Downloading failed", "Downloading the song failed, would you like to try again?\n\n" + "Error:\n" + $"{errorMessage}", MessageDialogStyle.AffirmativeAndNegative); if (result == MessageDialogResult.Affirmative) { await DownloadSong(beatmap); } } }
public void SetOnlineNoteInformation(OnlineBeatmap onlineBeatmap, IDifficulty difficulty) { float secondEquivalentOfBeat = 60 / onlineBeatmap.Metadata.BeatsPerMinute; float minHalfJumpDuration = 1f; float jumpSpeedThreshold = 18f; float halfJumpDuration = 4f; while (difficulty.NoteJumpMovementSpeed * secondEquivalentOfBeat * halfJumpDuration > jumpSpeedThreshold) { halfJumpDuration /= 2f; } halfJumpDuration += difficulty.NoteJumpStartBeatOffset; if (halfJumpDuration < minHalfJumpDuration) { halfJumpDuration = minHalfJumpDuration; } difficulty.HalfJumpDuration = halfJumpDuration; difficulty.JumpDistance = difficulty.NoteJumpMovementSpeed * (secondEquivalentOfBeat * (halfJumpDuration * 2)); }
public BeatmapCompletedUserControl(OnlineBeatmap beatmap, string downloaded) { InitializeComponent(); ViewModel = new BeatmapCompletedUserControlViewModel(beatmap, downloaded); DataContext = ViewModel; }
public OsuDirectDownload(OnlineBeatmap ob, bool noVideo) : this(ob.setId, ob.filename, ob.title, noVideo, noVideo ? ob.filesize_novideo : ob.filesize) { beatmap = ob; }
public BeatmapFailedUserControlViewModel(OnlineBeatmap beatmap, string message) { Beatmap = beatmap; Message = message; }
public BeatmapDownloadingUserControl(OnlineBeatmap beatmap) { InitializeComponent(); ViewModel = new BeatmapDownloadingUserControlViewModel(beatmap); DataContext = ViewModel; }
public BeatmapDownloadingUserControlViewModel(OnlineBeatmap beatmap) { Beatmap = beatmap; }
private void Map_Details(object sender, RoutedEventArgs e) { OnlineBeatmap beatmap = ((Button)sender).Tag as OnlineBeatmap; ViewModel.BeatmapDetails(beatmap); }
public BeatmapCompletedUserControlViewModel(OnlineBeatmap beatmap, string downloaded) { Beatmap = beatmap; Downloaded = downloaded; }
private void Map_Delete(object sender, RoutedEventArgs e) { OnlineBeatmap beatmap = ((Button)sender).Tag as OnlineBeatmap; ViewModel.DeleteSong(beatmap); }
private void ShowResponseDialog(OnlineBeatmap beatmap) { if (RespondingBeatmap != null) { HideResponseDialog(); } if ((GameBase.TournamentManager || (ConfigManager.sAutomaticDownload && (MatchSetup.Match != null || StreamingManager.CurrentlySpectating != null))) && !beatmap.exists && !beatmap.HasAttachedDownload) { beatmap.Download(ConfigManager.sAutomaticDownloadNoVideo); return; } if (GameBase.Tournament) { return; } background.FlashColour(Color.Gray, 500); if (ResponseSprites != null) { ResponseSprites.ForEach(s => { s.FadeOut(100); s.AlwaysDraw = false; }); } if (thumbRequest != null) { thumbRequest.Abort(); } if (previewRequest != null) { previewRequest.Abort(); } RespondingBeatmap = beatmap; ResponseSprites = new List <pSprite>(); float y = 24; pText pt = new pText(beatmap.artist, 12, new Vector2(background.Position.X, YPOS + y), 1, true, Color.Orchid); pt.Field = Fields.TopRight; pt.TextBold = true; ResponseSprites.Add(pt); y += 12; pt = new pText(beatmap.title, 12, new Vector2(background.Position.X, YPOS + y), 1, true, Color.White); pt.Field = Fields.TopRight; pt.TextBold = true; ResponseSprites.Add(pt); y += 12; pt = new pText("by " + beatmap.creator, 12, new Vector2(background.Position.X, YPOS + y), 1, true, Color.White); pt.Field = Fields.TopRight; ResponseSprites.Add(pt); y += 14; previewThumbnail = new pSprite(null, Fields.TopRight, Origins.Centre, Clocks.Game, new Vector2(background.Position.X - (WIDTH / 2), YPOS + y + (WIDTH * 0.8f / 2)), 1, true, Color.TransparentWhite); previewThumbnail.IsDisposable = true; previewThumbnail.Scale = 0.7f; y += 100; thumbRequest = new pWebRequest(General.STATIC_WEB_ROOT_BEATMAP + @"/thumb/" + beatmap.setId + @"l.jpg"); thumbRequest.Finished += delegate(pWebRequest r, Exception e) { byte[] data = r.ResponseData; if (e != null || data.Length == 0) { return; } GameBase.Scheduler.Add(delegate { previewThumbnail.Texture = pTexture.FromBytes(data); SkinManager.RegisterUnrecoverableTexture(previewThumbnail.Texture); fadeInThumbnail(); }); }; thumbRequest.Perform(); if (!disallowAudioPreview) { previewRequest = new pWebRequest(string.Format(@"{0}/preview/{1}.mp3", General.STATIC_WEB_ROOT_BEATMAP, beatmap.setId)); previewRequest.Finished += delegate(pWebRequest r, Exception e) { byte[] data = r.ResponseData; if (e != null || data.Length == 0) { return; } GameBase.Scheduler.Add(delegate { if (RespondingBeatmap != beatmap) { return; } WasPlayingAudio = AudioEngine.AudioState == AudioStates.Playing; if (WasPlayingAudio && GameBase.Mode != OsuModes.OnlineSelection && GameBase.Mode != OsuModes.Play) { AudioEngine.AllowRandomSong = false; AudioEngine.TogglePause(); } sampleTrack = AudioEngine.PlaySampleAsTrack(data); sampleTrack.Play(); fadeInThumbnail(); }); }; previewRequest.Perform(); } bool hasMap = BeatmapManager.GetBeatmapBySetId(beatmap.setId) != null; pButton pbut = null; float buttonHeight; if (hasMap && !beatmap.HasAttachedDownload && beatmap.hasVideo) { buttonHeight = 16.25f; } else if (hasMap || (!beatmap.HasAttachedDownload && beatmap.hasVideo)) { buttonHeight = 20f; } else { buttonHeight = 25f; } if (hasMap) { pbut = new pButton("Go to map", new Vector2(background.Position.X, YPOS + y), new Vector2(WIDTH, buttonHeight), 0.92f, Color.SkyBlue, delegate { if (MatchSetup.Match != null || Player.Instance != null) { return; } Beatmap b = BeatmapManager.GetBeatmapBySetId(beatmap.setId); BeatmapManager.Current = b; GameBase.ChangeMode(OsuModes.SelectPlay, true); HideResponseDialog(); }, false, true); ResponseSprites.AddRange(pbut.SpriteCollection); y += buttonHeight + 2; } pbut = new pButton(beatmap.HasAttachedDownload ? "Cancel DL" : "Download", new Vector2(background.Position.X, YPOS + y), new Vector2(WIDTH, buttonHeight), 0.92f, Color.Bisque, delegate { beatmap.Download(); HideResponseDialog(); }, false, true); ResponseSprites.AddRange(pbut.SpriteCollection); y += buttonHeight + 2; if (!beatmap.HasAttachedDownload && beatmap.hasVideo) { pbut = new pButton("DL NoVideo", new Vector2(background.Position.X, YPOS + y), new Vector2(WIDTH, buttonHeight), 0.92f, Color.BlueViolet, delegate { beatmap.Download(true); HideResponseDialog(); }, false, true); ResponseSprites.AddRange(pbut.SpriteCollection); y += buttonHeight + 2; } pbut = new pButton("Cancel", new Vector2(background.Position.X, YPOS + y), new Vector2(WIDTH, buttonHeight), 0.92f, Color.Gray, delegate { HideResponseDialog(); }, false, true); ResponseSprites.AddRange(pbut.SpriteCollection); y += buttonHeight + 2; if (beatmap.postid > 0) { pbut = new pButton("View Post", new Vector2(background.Position.X, YPOS + y), new Vector2(WIDTH, buttonHeight), 0.92f, Color.YellowGreen, delegate { GameBase.ProcessStart(String.Format(Urls.FORUM_POST, beatmap.postid)); }, false, true); ResponseSprites.AddRange(pbut.SpriteCollection); } else { pbut = new pButton("View Thread", new Vector2(background.Position.X, YPOS + y), new Vector2(WIDTH, buttonHeight), 0.92f, Color.YellowGreen, delegate { GameBase.ProcessStart(String.Format(Urls.FORUM_TOPIC, beatmap.threadid)); }, false, true); ResponseSprites.AddRange(pbut.SpriteCollection); } y += buttonHeight + 2; pbut = new pButton("View Listing", new Vector2(background.Position.X, YPOS + y), new Vector2(WIDTH, buttonHeight), 0.92f, Color.OrangeRed, delegate { GameBase.ProcessStart(String.Format(Urls.BEATMAP_SET_LISTING, beatmap.setId)); }, false, true); ResponseSprites.AddRange(pbut.SpriteCollection); //The panel isn't yet visible so we are fine to animate as per-usual. ResponseSprites.ForEach(s => s.FadeInFromZero(100)); ResponseSprites.Add(previewThumbnail); spriteManager.Add(ResponseSprites); }
public OnlineBeatmapDeletedEventArgs(OnlineBeatmap beatmap) { Beatmap = beatmap; }
public DownloadStartedEventArgs(OnlineBeatmap beatmap) { Beatmap = beatmap; }
private void req_onFinish(pWebRequest r, Exception e) { lock (Beatmaps) { if (pageOffset == 0) { Beatmaps.ForEach(b => b.Dispose()); Beatmaps.Clear(); resultsPane.SetScrollPosition(Vector2.Zero); } try { string[] lines = r.ResponseString.Split('\n'); int status = Int32.Parse(lines[0]); tempIncoming = string.Empty; if (status < 0) { searchInfo.Text = "Error: " + lines[1]; } else { for (int i = 1; i < lines.Length; i++) { if (lines[i].Length == 0) { continue; } OnlineBeatmap ob = new OnlineBeatmap(lines[i]); ob.OnDownloadFinished += delegate { lock (Beatmaps) Beatmaps.Remove(ob); newResults = true; ob.Dispose(); }; if (displayExisting.Checked || !ob.exists) { Beatmaps.Add(ob); } } canLoadMore = status > 100 && pageOffset != 39; status = Math.Min(100, status); int totalCount = (pageOffset * 100 + status); if (canLoadMore) { searchInfo.Text = "Over " + totalCount + " results found."; } else { searchInfo.Text = totalCount + " result" + (totalCount != 1 ? "s" : "") + " found."; } } } catch { } } newResults = true; }