using AudibleApi; using System; using System.Collections.Generic; namespace AudibleUtilities; /// /// Libation-facing helpers when Audible returns HTML instead of JSON (library scan, catalog, etc.). /// public static class NonJsonResponseExceptionExtensions { public const string LibraryScanFailedCaption = "Library scan failed"; private static readonly string[] ThingsToTryBullets = [ "Scan again after a few minutes.", "Sign in to Audible in a browser on the same network.", "Disable VPN or proxy and scan again.", "Remove and re-add the account in Libation.", "If it still fails, check the log for Full body: near the error and attach it to a bug report.", ]; public static IEnumerable GetExplainerLines(this NonJsonResponseException ex) { ArgumentNullException.ThrowIfNull(ex); yield return getIntro(ex); yield return string.Empty; yield return "Things to try:"; foreach (var bullet in ThingsToTryBullets) yield return "• " + bullet; } public static string GetExplainerBody(this NonJsonResponseException ex) => string.Join("\r\n", ex.GetExplainerLines()); public static bool TryFindInTree(Exception ex, out NonJsonResponseException? match) { ArgumentNullException.ThrowIfNull(ex); NonJsonResponseException? found = null; walk(ex); match = found; return found is not null; void walk(Exception? e) { if (e is null || found is not null) return; if (e is NonJsonResponseException nonJson) found = nonJson; if (found is not null) return; if (e is AggregateException agg) { foreach (var inner in agg.InnerExceptions) walk(inner); } walk(e.InnerException); } } private static string getIntro(NonJsonResponseException ex) => ex.HtmlTitle is null ? "Audible returned an HTML page instead of the expected library data." : $"Audible returned an HTML page ({ex.HtmlTitle}) instead of the expected library data."; }