From f17259bc8811b9cfeab8126015b08ac853115512 Mon Sep 17 00:00:00 2001 From: Kayra Uylar <52961639+kuylar@users.noreply.github.com> Date: Mon, 30 Oct 2023 09:38:31 +0300 Subject: [PATCH] Fix GetLocalsAsync (#40) * Fix GetLocalsAsync endpoint * Cache GetLocalsAsync results --- InnerTube.Tests/OtherTests.cs | 37 +++++++++++++++++++---------- InnerTube/InnerTube.cs | 18 ++++++++++---- InnerTube/Models/InnerTubeLocals.cs | 20 ++++++++++------ 3 files changed, 50 insertions(+), 25 deletions(-) diff --git a/InnerTube.Tests/OtherTests.cs b/InnerTube.Tests/OtherTests.cs index e9b545e..ccd26cb 100644 --- a/InnerTube.Tests/OtherTests.cs +++ b/InnerTube.Tests/OtherTests.cs @@ -1,4 +1,5 @@ -using System.Text; +using System.Diagnostics; +using System.Text; namespace InnerTube.Tests; @@ -15,19 +16,29 @@ public void Setup() [Test] public async Task GetLocals() { + Stopwatch sp = new(); StringBuilder sb = new(); - InnerTubeLocals locals = await _innerTube.GetLocalsAsync(); - - sb.AppendLine("== LANGUAGES"); - foreach ((string id, string title) in locals.Languages) - sb.AppendLine($"{RightPad($"[{id}]", 9)} {title}"); - - sb.AppendLine() - .AppendLine("== REGIONS"); - foreach ((string id, string title) in locals.Regions) - sb.AppendLine($"{RightPad($"[{id}]", 4)} {title}"); - - Assert.Pass(sb.ToString()); + long[] times = new long[3]; + + for (int i = 0; i < times.Length; i++) + { + sp.Restart(); + InnerTubeLocals locals = await _innerTube.GetLocalsAsync(); + sp.Stop(); + times[i] = sp.ElapsedMilliseconds; + + if (i != 0) continue; + sb.AppendLine("== LANGUAGES"); + foreach ((string id, string title) in locals.Languages) + sb.AppendLine($"{RightPad($"[{id}]", 9)} {title}"); + + sb.AppendLine() + .AppendLine("== REGIONS"); + foreach ((string id, string title) in locals.Regions) + sb.AppendLine($"{RightPad($"[{id}]", 4)} {title}"); + } + + Assert.Pass($"Times: {string.Join(", ", times)}" + "\n\n" + sb); } private string RightPad(string input, int length, char appendChar = ' ') diff --git a/InnerTube/InnerTube.cs b/InnerTube/InnerTube.cs index 26029db..aa29747 100644 --- a/InnerTube/InnerTube.cs +++ b/InnerTube/InnerTube.cs @@ -17,6 +17,7 @@ public class InnerTube internal readonly MemoryCache PlayerCache; internal readonly string ApiKey; internal readonly InnerTubeAuthorization? Authorization; + private InnerTubeLocals? _cachedLocals; /// /// Initializes a new instance of InnerTube client. @@ -440,10 +441,17 @@ public async Task ContinueBrowseAsync(string cont /// Language of the content /// Region of the content /// List of all valid languages & regions - public async Task GetLocalsAsync(string language = "en", string region = "US") + public async Task GetLocalsAsync(bool refreshCache = false, string language = "en", + string region = "US") { - JObject localsResponse = await MakeRequest(RequestClient.WEB, "account/account_menu", new InnerTubeRequest(), - language, region); - return new InnerTubeLocals(localsResponse); + if (refreshCache || _cachedLocals is null) + { + JObject localsResponse = await MakeRequest(RequestClient.WEB, "account/account_menu", + new InnerTubeRequest(), + language, region); + _cachedLocals = new InnerTubeLocals(localsResponse); + } + + return _cachedLocals!; } -} +} \ No newline at end of file diff --git a/InnerTube/Models/InnerTubeLocals.cs b/InnerTube/Models/InnerTubeLocals.cs index fd4d76d..c09c4cf 100644 --- a/InnerTube/Models/InnerTubeLocals.cs +++ b/InnerTube/Models/InnerTubeLocals.cs @@ -9,12 +9,19 @@ public class InnerTubeLocals public InnerTubeLocals(JObject localsResponse) { - JArray languagesArray = localsResponse.GetFromJsonPath( - "actions[0].openPopupAction.popup.multiPageMenuRenderer.sections[1].multiPageMenuSectionRenderer.items[1].compactLinkRenderer.serviceEndpoint.signalServiceEndpoint.actions[0].getMultiPageMenuAction.menu.multiPageMenuRenderer.sections[0].multiPageMenuSectionRenderer.items") - !; - JArray regionsArray = localsResponse.GetFromJsonPath( - "actions[0].openPopupAction.popup.multiPageMenuRenderer.sections[1].multiPageMenuSectionRenderer.items[3].compactLinkRenderer.serviceEndpoint.signalServiceEndpoint.actions[0].getMultiPageMenuAction.menu.multiPageMenuRenderer.sections[0].multiPageMenuSectionRenderer.items") - !; + JArray sections = localsResponse.GetFromJsonPath( + "actions[0].openPopupAction.popup.multiPageMenuRenderer.sections[0].multiPageMenuSectionRenderer.items")!; + + JArray languagesArray = sections + .First(x => x["compactLinkRenderer"]?["icon"]?["iconType"]?.ToObject() == "TRANSLATE") + .GetFromJsonPath( + "compactLinkRenderer.serviceEndpoint.signalServiceEndpoint.actions[0].getMultiPageMenuAction.menu.multiPageMenuRenderer.sections[0].multiPageMenuSectionRenderer.items") + ?? new JArray(); + JArray regionsArray = sections + .First(x => x["compactLinkRenderer"]?["icon"]?["iconType"]?.ToObject() == "LANGUAGE") + .GetFromJsonPath( + "compactLinkRenderer.serviceEndpoint.signalServiceEndpoint.actions[0].getMultiPageMenuAction.menu.multiPageMenuRenderer.sections[0].multiPageMenuSectionRenderer.items") + ?? new JArray(); Languages = languagesArray.ToDictionary( x => x.GetFromJsonPath( @@ -26,6 +33,5 @@ public InnerTubeLocals(JObject localsResponse) "compactLinkRenderer.serviceEndpoint.signalServiceEndpoint.actions[0].selectCountryCommand.gl")!, x => x.GetFromJsonPath("compactLinkRenderer.title.simpleText")! ); - ; } } \ No newline at end of file