· 5 years ago · Dec 28, 2020, 12:10 AM
1/// Code
2
3using System;
4using System.Collections.Generic;
5using System.IO;
6using System.Linq;
7using System.Text;
8using System.Threading.Tasks;
9using BeatSaverAPI;
10using System.Text.Json;
11using DiscordWebHook;
12using Excel = Microsoft.Office.Interop.Excel;
13
14namespace GetBeatSaverSongs
15{
16 class Program
17 {
18 static void Main(string[] args)
19 {
20 List<BeatSaverAPISong> songs = JsonSerializer.Deserialize<List<BeatSaverAPISong>>(File.ReadAllText("D:\\BeatSaver\\APIPullLatest\\Merged\\Merged.json"));
21 //Make shit to get song size
22 }
23
24 static void GetSongResponseTime()
25 {
26 Excel.Application xlApp;
27 Excel.Workbook xlWorkBook;
28 Excel.Worksheet xlWorkSheet;
29 xlApp = new Excel.Application();
30 xlWorkBook = xlApp.Workbooks.Add();
31 xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
32
33 xlWorkSheet.Cells[1, 1] = "Time";
34 xlWorkSheet.Cells[1, 2] = "Response time";
35
36 Dictionary<int, String> fileorder = new Dictionary<int, string>();
37
38 Console.WriteLine("Adding all files");
39 foreach (String file in Directory.GetFiles("D:\\BeatSaver\\APIPull"))
40 {
41 fileorder.Add(Convert.ToInt32(Path.GetFileNameWithoutExtension(file).Replace("_Songs", "")), file);
42 }
43
44 Console.WriteLine("Sorting dictionary");
45 var l = fileorder.OrderBy(key => key.Key);
46 fileorder = new Dictionary<int, string>(l.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value));
47
48 List<BeatSaverAPISong> songs = new List<BeatSaverAPISong>();
49 Console.WriteLine("Adding All Songs");
50 int i = 0;
51 foreach (string file in fileorder.Values)
52 {
53 List<BeatSaverAPISong> s = JsonSerializer.Deserialize<List<BeatSaverAPISong>>(File.ReadAllText(file));
54 foreach (BeatSaverAPISong song in s)
55 {
56 songs.Add(song);
57 Console.WriteLine(i);
58 i++;
59 }
60 }
61 Console.WriteLine("Added all Songs by order");
62 Console.WriteLine("Making spreadsheet");
63
64 i = 2;
65 foreach (BeatSaverAPISong song in songs)
66 {
67 xlWorkSheet.Cells[i, 1] = i - 1;
68 xlWorkSheet.Cells[i, 2] = song.TimeNeeded;
69 Console.WriteLine(i);
70 i++;
71 }
72
73 Console.WriteLine("Saving file");
74
75 xlWorkBook.SaveAs("D:\\BeatSaver\\APIPullLatest\\RequestTimeChartFirstPull.xls");
76 xlApp.Quit();
77 }
78
79 static void GetPageResponseTimes()
80 {
81 Excel.Application xlApp;
82 Excel.Workbook xlWorkBook;
83 Excel.Worksheet xlWorkSheet;
84 xlApp = new Excel.Application();
85 xlWorkBook = xlApp.Workbooks.Add();
86 xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
87
88 xlWorkSheet.Cells[1, 1] = "Time";
89 xlWorkSheet.Cells[1, 2] = "Response time";
90
91 Dictionary<int, String> fileorder = new Dictionary<int, string>();
92
93 Console.WriteLine("Adding all files");
94 foreach (String file in Directory.GetFiles("D:\\BeatSaver\\APIPullLatest\\Raw"))
95 {
96 fileorder.Add(Convert.ToInt32(Path.GetFileNameWithoutExtension(file).Replace("_Pages", "")), file);
97 }
98
99 Console.WriteLine("Sorting dictionary");
100 var l = fileorder.OrderBy(key => key.Key);
101 fileorder = new Dictionary<int, string>(l.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value));
102
103 List<BeatSaverAPISong> songs = new List<BeatSaverAPISong>();
104 Console.WriteLine("Adding All Songs");
105 int i = 0;
106 foreach (string file in fileorder.Values)
107 {
108 List<BeatSaverAPISong> s = JsonSerializer.Deserialize<List<BeatSaverAPISong>>(File.ReadAllText(file));
109 foreach (BeatSaverAPISong song in s)
110 {
111 songs.Add(song);
112 Console.WriteLine(i);
113 i++;
114 }
115 }
116 Console.WriteLine("Added all Songs by order");
117 Console.WriteLine("Making spreadsheet");
118
119 i = 2;
120 foreach (BeatSaverAPISong song in songs)
121 {
122 xlWorkSheet.Cells[i, 1] = i - 1;
123 xlWorkSheet.Cells[i, 2] = song.TimeNeeded;
124 Console.WriteLine(i);
125 i++;
126 }
127
128 Console.WriteLine("Saving file");
129
130 xlWorkBook.SaveAs("D:\\BeatSaver\\APIPullLatest\\RequestTimeChart.xls");
131 xlApp.Quit();
132 }
133
134 static void Merge()
135 {
136 List<BeatSaverAPISong> songs = new List<BeatSaverAPISong>();
137 int i = 0;
138 foreach (String file in Directory.GetFiles("D:\\BeatSaver\\APIPullLatest\\Raw"))
139 {
140 List<BeatSaverAPISong> s = JsonSerializer.Deserialize<List<BeatSaverAPISong>>(File.ReadAllText(file));
141 foreach (BeatSaverAPISong song in s)
142 {
143 songs.Add(song);
144 Console.WriteLine(i);
145 i++;
146 }
147 }
148 Console.WriteLine("Serializing");
149 File.WriteAllText("D:\\BeatSaver\\APIPullLatest\\Merged\\Merged.json", JsonSerializer.Serialize(songs));
150 Console.WriteLine("finished");
151 Console.ReadLine();
152 }
153
154 static void Generate()
155 {
156 List<BeatSaverAPISong> stats = new List<BeatSaverAPISong>();
157 int i = 0;
158
159 Console.WriteLine("At which page do you want to start?");
160 String c = Console.ReadLine();
161 int start = 0;
162 if (c != "") start = Convert.ToInt32(c);
163
164 BeatSaverAPIInteractor interactor = new BeatSaverAPIInteractor();
165 if (!Directory.Exists("D:\\BeatSaver\\APIPull")) Directory.CreateDirectory("D:\\BeatSaver\\APIPull");
166 var stopwatch = System.Diagnostics.Stopwatch.StartNew();
167 DiscordWebHookInteractor interacto = new DiscordWebHookInteractor();
168 interacto.url = "something";
169 bool finished = false;
170 int pages = 0;
171
172 while (!finished)
173 {
174 if (i >= start)
175 {
176 Console.WriteLine("\nPage: " + i);
177 BeatSaverAPISearchResult s = new BeatSaverAPISearchResult();
178 s = interactor.GetLatest(i);
179 Console.WriteLine("Time elapsed for Request: " + s.TimeNeeded);
180 Console.WriteLine("Status Code: " + s.ErrCode);
181 foreach (BeatSaverAPISong song in s.docs)
182 {
183 BeatSaverAPISong ssss = new BeatSaverAPISong();
184 ssss = song;
185 ssss.TimeNeeded = s.TimeNeeded / s.docs.Count;
186 ssss.ErrCode = s.ErrCode;
187 Console.WriteLine("Song Name: " + song.name);
188 stats.Add(ssss);
189 }
190 if (i % 10 == 0)
191 {
192 stopwatch.Stop();
193 File.WriteAllText("D:\\BeatSaver\\APIPullLatest\\" + i + "_Pages.json", JsonSerializer.Serialize(stats));
194 interacto.SendStatus(s.lastPage, i, stats, stopwatch.ElapsedMilliseconds, finished);
195 stats = new List<BeatSaverAPISong>();
196 stopwatch.Restart();
197 }
198 pages = s.lastPage;
199 if ((i + 1) > s.lastPage) finished = true;
200 System.Threading.Thread.Sleep(500);
201 }
202
203 i++;
204 }
205 stopwatch.Stop();
206 File.WriteAllText("D:\\BeatSaver\\APIPullLatest\\" + i + "_Pages.json", JsonSerializer.Serialize(stats));
207 interacto.SendStatus(pages, i, stats, stopwatch.ElapsedMilliseconds, finished);
208 Console.WriteLine("\n\nFINALLY FINISHED");
209 }
210 }
211}
212
213
214////////////////////////////////77 API
215
216/*
217 You ask what this is? I had the Idea of lerning how to work with different classes and help myself a bit better with the BeatSaver api. (DON'T SPAM ME THAT BEATSAVERSHARP EXISTS).
218 Btw nice that you are interested in my code.
219*/
220using System;
221using System.Collections.Generic;
222using System.Net;
223using System.Text.Json;
224using System.Text.Json.Serialization;
225using System.Threading.Tasks;
226
227namespace BeatSaverAPI
228{
229 public class BeatSaberSong
230 {
231 [JsonPropertyName("_songName")]
232 public string SongName { get; set; } = "N/A";
233 [JsonPropertyName("_songSubName")]
234 public string SubName { get; set; } = "N/A";
235 [JsonPropertyName("_songAuthorName")]
236 public string SongArtist { get; set; } = "N/A";
237 [JsonPropertyName("_levelAuthorName")]
238 public string Mapper { get; set; } = "N/A";
239 [JsonPropertyName("_beatsPerMinute")]
240 public decimal BPM { get; set; } = 0.0m;
241 public string Hash { get; set; } = "N/A";
242 public string Key { get; set; } = "N/A";
243 public bool RequestGood { get; set; } = false;
244 [JsonPropertyName("_difficultyBeatmapSets")]
245 public List<BeatSaberSongBeatMapCharacteristic> BeatMapCharacteristics { get; set; } = new List<BeatSaberSongBeatMapCharacteristic>();
246
247 public string _allDirectionsEnvironmentName { get; set; } = "N/A";
248 public string _environmentName { get; set; } = "N/A";
249 public string _coverImageFilename { get; set; } = "N/A";
250 public string _songFilename { get; set; } = "N/A";
251 public decimal _previewDuration { get; set; } = 0.0m;
252 public decimal _previewStartTime { get; set; } = 0.0m;
253 public decimal _shufflePeriod { get; set; } = 0.0m;
254 public decimal _shuffle { get; set; } = 0.0m;
255 public decimal _songTimeOffset { get; set; } = 0.0m;
256 public string _version { get; set; } = "N/A";
257
258 public string GetJSON()
259 {
260 return JsonSerializer.Serialize(this);
261 }
262 }
263
264 public class BeatSaverAPISearchResult
265 {
266 public List<BeatSaverAPISong> docs { get; set; } = new List<BeatSaverAPISong>();
267 public int totalDocs { get; set; } = 0;
268 public int lastPage { get; set; } = 0;
269 public bool RequestGood { get; set; } = false;
270 public string ErrCode { get; set; } = "200";
271 public long TimeNeeded { get; set; } = 0;
272
273 public bool HasResults()
274 {
275 if (docs.Count < 1) return false;
276 return true;
277 }
278
279 public BeatSaverAPISong GetFirstResult()
280 {
281 BeatSaverAPISong song = new BeatSaverAPISong();
282 if (HasResults())
283 {
284 song = docs[0];
285 song.GoodRequest = true;
286 }
287 return song;
288 }
289 }
290
291 public class BeatSaverAPISong
292 {
293 public BeatSaverAPIMetadata metadata { get; set; } = new BeatSaverAPIMetadata();
294 public BeatSaverAPIStats stats { get; set; } = new BeatSaverAPIStats();
295 public string description { get; set; } = "N/A";
296 public string deletedAt { get; set; } = "N/A";
297 public string _id { get; set; } = "N/A";
298 public string key { get; set; } = "N/A";
299 public string name { get; set; } = "N/A";
300 public BeatSaverAPIUploader uploader { get; set; } = new BeatSaverAPIUploader();
301 public string hash { get; set; } = "N/A";
302 public string uploaded { get; set; } = "N/A";
303 public string directDownload { get; set; } = "N/A";
304 public string downloadURL { get; set; } = "N/A";
305 public string coverURL { get; set; } = "N/A";
306 public bool GoodRequest { get; set; } = false;
307 public string ErrCode { get; set; } = "200";
308 public long TimeNeeded { get; set; } = 0;
309
310 public BeatSaberSong ConvertToBeatSaberSong()
311 {
312 BeatSaberSong finished = new BeatSaberSong();
313 finished.BPM = metadata.bpm;
314 finished.Hash = hash;
315 finished.Key = key;
316 finished.Mapper = metadata.levelAuthorName;
317 finished.SongName = name;
318 finished.SongArtist = metadata.songAuthorName;
319 finished.RequestGood = true;
320 finished.SubName = metadata.songSubName;
321 finished.RequestGood = GoodRequest;
322 foreach (BeatSaverAPICharacteristic characteristic in metadata.characteristics)
323 {
324 BeatSaberSongBeatMapCharacteristic characteristic1 = new BeatSaberSongBeatMapCharacteristic();
325 characteristic1.BeatMapCharacteristicName = characteristic.name;
326 if (characteristic.difficulties.easy != null)
327 {
328 BeatSaberSongDifficulty easy = new BeatSaberSongDifficulty();
329 easy.Bombs = characteristic.difficulties.easy.bombs;
330 easy.DifficultyID = 1;
331 easy.DifficultyName = "easy";
332 easy.Duration = characteristic.difficulties.easy.duration;
333 easy.Length = characteristic.difficulties.easy.length;
334 easy.NJS = characteristic.difficulties.easy.njs;
335 easy.NJSOffset = characteristic.difficulties.easy.njsOffset;
336 easy.Notes = characteristic.difficulties.easy.notes;
337 easy.Obstacles = characteristic.difficulties.easy.obstacles;
338 characteristic1.Difficulties.Add(easy);
339 }
340 if (characteristic.difficulties.normal != null)
341 {
342 BeatSaberSongDifficulty normal = new BeatSaberSongDifficulty();
343 normal.Bombs = characteristic.difficulties.normal.bombs;
344 normal.DifficultyID = 3;
345 normal.DifficultyName = "normal";
346 normal.Duration = characteristic.difficulties.normal.duration;
347 normal.Length = characteristic.difficulties.normal.length;
348 normal.NJS = characteristic.difficulties.normal.njs;
349 normal.NJSOffset = characteristic.difficulties.normal.njsOffset;
350 normal.Notes = characteristic.difficulties.normal.notes;
351 normal.Obstacles = characteristic.difficulties.normal.obstacles;
352 characteristic1.Difficulties.Add(normal);
353 }
354 if (characteristic.difficulties.hard != null)
355 {
356 BeatSaberSongDifficulty hard = new BeatSaberSongDifficulty();
357 hard.Bombs = characteristic.difficulties.hard.bombs;
358 hard.DifficultyID = 5;
359 hard.DifficultyName = "hard";
360 hard.Duration = characteristic.difficulties.hard.duration;
361 hard.Length = characteristic.difficulties.hard.length;
362 hard.NJS = characteristic.difficulties.hard.njs;
363 hard.NJSOffset = characteristic.difficulties.hard.njsOffset;
364 hard.Notes = characteristic.difficulties.hard.notes;
365 hard.Obstacles = characteristic.difficulties.hard.obstacles;
366 characteristic1.Difficulties.Add(hard);
367 }
368 if (characteristic.difficulties.expert != null)
369 {
370 BeatSaberSongDifficulty expert = new BeatSaberSongDifficulty();
371 expert.Bombs = characteristic.difficulties.expert.bombs;
372 expert.DifficultyID = 7;
373 expert.DifficultyName = "expert";
374 expert.Duration = characteristic.difficulties.expert.duration;
375 expert.Length = characteristic.difficulties.expert.length;
376 expert.NJS = characteristic.difficulties.expert.njs;
377 expert.NJSOffset = characteristic.difficulties.expert.njsOffset;
378 expert.Notes = characteristic.difficulties.expert.notes;
379 expert.Obstacles = characteristic.difficulties.expert.obstacles;
380 characteristic1.Difficulties.Add(expert);
381 }
382 if (characteristic.difficulties.expertPlus != null)
383 {
384 BeatSaberSongDifficulty expertPlus = new BeatSaberSongDifficulty();
385 expertPlus.Bombs = characteristic.difficulties.expertPlus.bombs;
386 expertPlus.DifficultyID = 9;
387 expertPlus.DifficultyName = "expertPlus";
388 expertPlus.Duration = characteristic.difficulties.expertPlus.duration;
389 expertPlus.Length = characteristic.difficulties.expertPlus.length;
390 expertPlus.NJS = characteristic.difficulties.expertPlus.njs;
391 expertPlus.NJSOffset = characteristic.difficulties.expertPlus.njsOffset;
392 expertPlus.Notes = characteristic.difficulties.expertPlus.notes;
393 expertPlus.Obstacles = characteristic.difficulties.expertPlus.obstacles;
394 characteristic1.Difficulties.Add(expertPlus);
395 }
396 finished.BeatMapCharacteristics.Add(characteristic1);
397 }
398 return finished;
399 }
400 }
401
402 public class BeatSaverAPIStats
403 {
404 public int downloads { get; set; } = 0;
405 public int plays { get; set; } = 0;
406 public int downVotes { get; set; } = 0;
407 public int upVotes { get; set; } = 0;
408 public decimal heat { get; set; } = 0.0m;
409 public decimal rating { get; set; } = 0.0m;
410 }
411
412 public class BeatSaverAPIUploader
413 {
414 public string _id { get; set; } = "N/A";
415 public string username { get; set; } = "N/A";
416 }
417
418 public class BeatSaverAPIMetadata
419 {
420 public BeatSaverAPIDifficulties difficulties { get; set; } = new BeatSaverAPIDifficulties();
421 public decimal duration { get; set; } = 0.0m;
422 public string automapper { get; set; } = "N/A";
423 public List<BeatSaverAPICharacteristic> characteristics { get; set; } = new List<BeatSaverAPICharacteristic>();
424 public string levelAuthorName { get; set; } = "N/A";
425 public string songAuthorName { get; set; } = "N/A";
426 public string songName { get; set; } = "N/A";
427 public string songSubName { get; set; } = "N/A";
428 public decimal bpm { get; set; } = 0.0m;
429 }
430
431 public class BeatSaverAPICharacteristic
432 {
433 public BeatSaverAPICharacteristicDifficulties difficulties { get; set; } = new BeatSaverAPICharacteristicDifficulties();
434 public string name { get; set; } = "N/A";
435
436 public bool IsLawless()
437 {
438 if (name.ToLower() == "lawless") return true;
439 else return false;
440 }
441
442 public bool IsLightshow()
443 {
444 if (name.ToLower() == "lightshow") return true;
445 else return false;
446 }
447
448 public bool IsStandart()
449 {
450 if (name.ToLower() == "standard") return true;
451 else return false;
452 }
453
454 public bool IsNoArrows()
455 {
456 if (name.ToLower() == "noarrows") return true;
457 else return false;
458 }
459
460 public bool IsOneSaber()
461 {
462 if (name.ToLower() == "onesaber") return true;
463 else return false;
464 }
465
466 public bool IsNinetyDegree()
467 {
468 if (name.ToLower() == "90degree") return true;
469 else return false;
470 }
471
472 public bool IsThreeSixtyDegree()
473 {
474 if (name.ToLower() == "360degree") return true;
475 else return false;
476 }
477 }
478
479 public class BeatSaverAPICharacteristicDifficulties
480 {
481 public BeatSaverAPICharacteristicDifficulty easy { get; set; } = new BeatSaverAPICharacteristicDifficulty();
482 public BeatSaverAPICharacteristicDifficulty expert { get; set; } = new BeatSaverAPICharacteristicDifficulty();
483 public BeatSaverAPICharacteristicDifficulty expertPlus { get; set; } = new BeatSaverAPICharacteristicDifficulty();
484 public BeatSaverAPICharacteristicDifficulty hard { get; set; } = new BeatSaverAPICharacteristicDifficulty();
485 public BeatSaverAPICharacteristicDifficulty normal { get; set; } = new BeatSaverAPICharacteristicDifficulty();
486 }
487
488 public class BeatSaverAPICharacteristicDifficulty
489 {
490 public decimal duration { get; set; } = 0.0m;
491 public decimal length { get; set; } = 0.0m;
492 public double njs { get; set; } = 0.0;
493 public decimal njsOffset { get; set; } = 0.0m;
494 public int bombs { get; set; } = 0;
495 public int notes { get; set; } = 0;
496 public int obstacles { get; set; } = 0;
497 }
498
499 public class BeatSaverAPIDifficulties
500 {
501 public bool easy { get; set; } = false;
502 public bool expert { get; set; } = false;
503 public bool expertPlus { get; set; } = false;
504 public bool hard { get; set; } = false;
505 public bool normal { get; set; } = false;
506 }
507
508 public class BeatSaberSongDifficulty
509 {
510 public decimal Duration { get; set; } = 0.0m;
511 public decimal Length { get; set; } = 0.0m;
512 [JsonPropertyName("_noteJumpMovementSpeed")]
513 public double NJS { get; set; } = 0.0;
514 [JsonPropertyName("_noteJumpStartBeatOffset")]
515 public decimal NJSOffset { get; set; } = 0.0m;
516 public int Bombs { get; set; } = 0;
517 public int Notes { get; set; } = 0;
518 public int Obstacles { get; set; } = 0;
519 [JsonPropertyName("_difficulty")]
520 public string DifficultyName { get; set; } = "N/A";
521 [JsonPropertyName("_difficultyRank")]
522 public int DifficultyID { get; set; } = 0;
523
524 public string _beatmapFilename { get; set; } = "N/A";
525
526 public bool IsEasy()
527 {
528 if (DifficultyName.ToLower() == "easy") return true;
529 else return false;
530 }
531
532 public bool IsNormal()
533 {
534 if (DifficultyName.ToLower() == "normal") return true;
535 else return false;
536 }
537
538 public bool IsHard()
539 {
540 if (DifficultyName.ToLower() == "hard") return true;
541 else return false;
542 }
543
544 public bool IsExpert()
545 {
546 if (DifficultyName.ToLower() == "expert") return true;
547 else return false;
548 }
549
550 public bool IsExpertPlus()
551 {
552 if (DifficultyName.ToLower() == "expertplus") return true;
553 else return false;
554 }
555 }
556
557 public class BeatSaberSongBeatMapCharacteristic
558 {
559 [JsonPropertyName("_beatmapCharacteristicName")]
560 public string BeatMapCharacteristicName { get; set; } = "N/A";
561 [JsonPropertyName("_difficultyBeatmaps")]
562 public List<BeatSaberSongDifficulty> Difficulties { get; set; } = new List<BeatSaberSongDifficulty>();
563 }
564
565 public class WebClientUtilities
566 {
567 public List<string> UAs = new List<string>() { "BeatSaverUtilities/1.0", "BeatSaverUtils/1.1", "BeatSaverBot/1.2", "MSEdge/5.1", "Firefox/59.2", "Something/5.1", "Random/4.3", "lmao/6.5", "Chrome/4.3", "NET/4.3" };
568 public string lastUA = "N/A";
569
570 public string GetRandomUserAgent()
571 {
572 while (true)
573 {
574 Random r = new Random();
575 int rand = r.Next(0, UAs.Count - 1);
576 if (lastUA != UAs[rand])
577 {
578 lastUA = UAs[rand];
579 return UAs[rand];
580 }
581 }
582 }
583 }
584
585 public class BeatSaverAPIInteractor
586 {
587 public readonly string BeatSaverAPIBaseLink = "https://beatsaver.com/api/";
588 public readonly string BeatSaverLink = "https://beatsaver.com";
589 WebClientUtilities WCU = new WebClientUtilities();
590
591 public BeatSaberSong LoadFromInfoDat(String json)
592 {
593 BeatSaberSong c = JsonSerializer.Deserialize<BeatSaberSong>(json);
594 return c;
595 }
596
597 internal async Task<BeatSaverAPISong> BeatSaverAPISongHash(string Hash)
598 {
599 WebClientUtilities WCU = new WebClientUtilities();
600
601 BeatSaverAPISong BeatSaverResult = new BeatSaverAPISong();
602
603 bool RateLimit = true;
604 var watch = System.Diagnostics.Stopwatch.StartNew();
605 while (RateLimit)
606 {
607 WebClient cl = new WebClient();
608 cl.Headers.Add("user-agent", WCU.GetRandomUserAgent());
609 try
610 {
611 String tmp = cl.DownloadString(BeatSaverAPIBaseLink + "maps/by-hash/" + Hash.ToLower());
612 BeatSaverResult = JsonSerializer.Deserialize<BeatSaverAPISong>(tmp);
613 BeatSaverResult.GoodRequest = true;
614 RateLimit = false;
615 }
616 catch (WebException e)
617 {
618 String response = ((HttpWebResponse)e.Response).StatusCode.ToString();
619 if (response.Contains("429"))
620 {
621 Console.WriteLine("Exceeded Rate limit waiting 5 sec");
622 await Task.Delay(5000);
623 }
624 else if (response.Contains("404"))
625 {
626 BeatSaverResult.GoodRequest = false;
627 RateLimit = false;
628 BeatSaverResult.ErrCode = response;
629 }
630 else
631 {
632 BeatSaverResult.GoodRequest = false;
633 RateLimit = false;
634 BeatSaverResult.ErrCode = response;
635 }
636 }
637 }
638 watch.Stop();
639 BeatSaverResult.TimeNeeded = watch.ElapsedMilliseconds;
640 return BeatSaverResult;
641 }
642
643 internal async Task<BeatSaverAPISong> BeatSaverAPISongKey(string Key)
644 {
645 WebClientUtilities WCU = new WebClientUtilities();
646
647 BeatSaverAPISong BeatSaverResult = new BeatSaverAPISong();
648
649 bool RateLimit = true;
650 var watch = System.Diagnostics.Stopwatch.StartNew();
651 while (RateLimit)
652 {
653 WebClient cl = new WebClient();
654 cl.Headers.Add("user-agent", WCU.GetRandomUserAgent());
655 try
656 {
657 String tmp = cl.DownloadString(BeatSaverAPIBaseLink + "maps/detail/" + Key.ToLower());
658 BeatSaverResult = JsonSerializer.Deserialize<BeatSaverAPISong>(tmp);
659 RateLimit = false;
660 BeatSaverResult.GoodRequest = true;
661 }
662 catch (WebException e)
663 {
664 String response = ((HttpWebResponse)e.Response).StatusCode.ToString();
665 if (response.Contains("429"))
666 {
667 Console.WriteLine("Exceeded Rate limit waiting 5 sec");
668 await Task.Delay(5000);
669 }
670 else if (response.Contains("404"))
671 {
672 BeatSaverResult.GoodRequest = false;
673 RateLimit = false;
674 BeatSaverResult.ErrCode = response;
675 }
676 else
677 {
678 BeatSaverResult.GoodRequest = false;
679 RateLimit = false;
680 BeatSaverResult.ErrCode = response;
681 }
682 }
683 }
684 watch.Stop();
685 BeatSaverResult.TimeNeeded = watch.ElapsedMilliseconds;
686 return BeatSaverResult;
687 }
688
689 public BeatSaverAPISong GetBeatSaverAPISongViaKey(String key)
690 {
691 return BeatSaverAPISongKey(key).Result;
692 }
693
694 public BeatSaverAPISong GetBeatSaverAPISongViaHash(String hash)
695 {
696 return BeatSaverAPISongHash(hash).Result;
697 }
698
699 public BeatSaverAPISong GetBeatSaverAPISong(String HashOrKey)
700 {
701 BeatSaverAPISong song = GetBeatSaverAPISongViaKey(HashOrKey);
702 if (!song.GoodRequest)
703 {
704 song = GetBeatSaverAPISongViaHash(HashOrKey);
705 }
706 return song;
707 }
708
709 public BeatSaberSong GetBeatSaberSong(String HashOrKey)
710 {
711 BeatSaberSong song = GetBeatSaberSongViaKey(HashOrKey);
712 if (!song.RequestGood)
713 {
714 song = GetBeatSaberSongViaHash(HashOrKey);
715 }
716 return song;
717 }
718
719 public BeatSaberSong GetBeatSaberSongViaHash(String Hash)
720 {
721 BeatSaverAPISong convert = GetBeatSaverAPISongViaHash(Hash);
722 return convert.ConvertToBeatSaberSong();
723 }
724
725 public BeatSaberSong GetBeatSaberSongViaKey(String Key)
726 {
727 BeatSaverAPISong convert = GetBeatSaverAPISongViaKey(Key);
728 return convert.ConvertToBeatSaberSong();
729 }
730
731 internal async Task<BeatSaverAPISearchResult> SearchTextAPI(String text)
732 {
733 WebClientUtilities WCU = new WebClientUtilities();
734
735 BeatSaverAPISearchResult BeatSaverResult = new BeatSaverAPISearchResult();
736
737 bool RateLimit = true;
738 while (RateLimit)
739 {
740 WebClient cl = new WebClient();
741 cl.Headers.Add("user-agent", WCU.GetRandomUserAgent());
742 try
743 {
744 String tmp = cl.DownloadString(BeatSaverAPIBaseLink + "search/text?q=%22" + text + "%22");
745 BeatSaverResult = JsonSerializer.Deserialize<BeatSaverAPISearchResult>(tmp);
746 RateLimit = false;
747 BeatSaverResult.RequestGood = true;
748 }
749 catch (WebException e)
750 {
751 String response = ((HttpWebResponse)e.Response).StatusCode.ToString();
752 if (response.Contains("429"))
753 {
754 await Task.Delay(5000);
755 }
756 else if (response.Contains("404"))
757 {
758 BeatSaverResult.RequestGood = false;
759 RateLimit = false;
760 }
761 else
762 {
763 BeatSaverResult.RequestGood = false;
764 RateLimit = false;
765 }
766 }
767 }
768 return BeatSaverResult;
769 }
770
771 internal async Task<BeatSaverAPISearchResult> GetLatestAPI(int page)
772 {
773 WebClientUtilities WCU = new WebClientUtilities();
774
775 BeatSaverAPISearchResult BeatSaverResult = new BeatSaverAPISearchResult();
776
777 bool RateLimit = true;
778 var watch = System.Diagnostics.Stopwatch.StartNew();
779 while (RateLimit)
780 {
781 WebClient cl = new WebClient();
782 cl.Headers.Add("user-agent", WCU.GetRandomUserAgent());
783 try
784 {
785 String tmp = cl.DownloadString(BeatSaverAPIBaseLink + "maps/latest/" + page);
786 BeatSaverResult = JsonSerializer.Deserialize<BeatSaverAPISearchResult>(tmp);
787 RateLimit = false;
788 BeatSaverResult.RequestGood = true;
789 }
790 catch (WebException e)
791 {
792 String response = ((HttpWebResponse)e.Response).StatusCode.ToString();
793 if (response.Contains("429"))
794 {
795 await Task.Delay(5000);
796 }
797 else
798 {
799 BeatSaverResult.RequestGood = false;
800 RateLimit = false;
801 }
802 }
803 }
804 watch.Stop();
805 BeatSaverResult.TimeNeeded = watch.ElapsedMilliseconds;
806 return BeatSaverResult;
807 }
808
809 public BeatSaverAPISearchResult GetLatest(int page)
810 {
811 return GetLatestAPI(page).Result;
812 }
813
814 public BeatSaverAPISearchResult SearchText(String text)
815 {
816 return SearchTextAPI(text).Result;
817 }
818 }
819}
820