public async Task <IActionResult> Nzb(string id)
        {
            if (Guid.TryParse(id, out var guid))
            {
                Nzb nzb = null;
                await _db.SynchronizeAsync(delegate(NewzNabAggregator.Database.Database db)
                {
                    nzb = db.GetNzb(guid);
                    return(Task.CompletedTask);
                });

                if (nzb != null)
                {
                    using var client = new HttpClient();
                    var nzbResponse = await client.GetAsync(nzb.link);

                    if (nzbResponse.IsSuccessStatusCode)
                    {
                        try
                        {
                            var filename = nzbResponse.Content.Headers.ContentDisposition?.FileName?.Replace("\"", string.Empty);
                            if (filename == null)
                            {
                                return(File(await nzbResponse.Content.ReadAsStreamAsync(), nzbResponse.Content.Headers.ContentType !.MediaType));
                            }
                            return(File(await nzbResponse.Content.ReadAsStreamAsync(), nzbResponse.Content.Headers.ContentType !.MediaType, filename));
                        }
                        catch
                        {
                        }
                    }
                }
            }
            return(NotFound());
        }
        public async Task <IActionResult> GetPassthrough(string client = null)
        {
            Console.WriteLine($"{RequestId} Request {base.Request.Path}?{base.Request.QueryString}");
            var requestUri = new Uri($"{base.Request.Scheme}://{base.Request.Host}/{base.Request.PathBase}");
            var results    = new List <Tuple <ClientInfo, string> >();

            if (base.Request.QueryString.HasValue)
            {
                var path        = base.Request.Path.Value !.Replace("/api", string.Empty);
                var queryString = (from p in base.Request.QueryString.Value !.Remove(0, 1).Split("&")
                                   select p.Split("=")).ToDictionary((string[] p) => p.First(), (string[] p) => p.Last());
                queryString.TryGetValue("apikey", out var _);
                if (!queryString.TryGetValue("t", out var t))
                {
                    return(new BadRequestResult());
                }
                if (t == "c" || t == "caps")
                {
                    return(await Caps());
                }
                var option = Option.XML;
                if (queryString.TryGetValue("o", out var o) && o == "json")
                {
                    option = Option.JSON;
                }
                queryString["o"] = option.ToString().ToLowerInvariant();
                foreach (var response in await QueryAllClients(path, queryString, client))
                {
                    if (response.Item2.IsSuccessStatusCode)
                    {
                        results.Add(new (response.Item1, await response.Item2.Content.ReadAsStringAsync()));
                    }
                    base.HttpContext.Response.RegisterForDispose(response.Item2);
                }
                switch (option)
                {
                case Option.XML:
                {
                    var offset = 0uL;
                    if (queryString.TryGetValue("offset", out var offsetString) && ulong.TryParse(offsetString, out offset))
                    {
                    }
                    var total   = 0uL;
                    var newznab = (XNamespace?)"http://www.newznab.com/DTD/2010/feeds/attributes/";
                    _ = (XNamespace?)"http://www.w3.org/2005/Atom";
                    var response2 = new XElement(newznab + "response");
                    var channel   = new XElement((XName?)"channel", new XElement((XName?)"title", "NzbAggregator"), new XElement((XName?)"description", "NzbAggregator"), response2);
                    var returnXml = new XDocument(new XElement((XName?)"rss", channel));
                    foreach (var result in results)
                    {
                        try
                        {
                            var xml         = XElement.Parse(result.Item2);
                            var subchannel  = xml.Element((XName?)"channel");
                            var subresponse = subchannel.Element(newznab + "response");
                            var subtotal    = subresponse.Attribute((XName?)"total")?.Value;
                            if (!string.IsNullOrEmpty(subtotal) && ulong.TryParse(subtotal, out var ulongSubtotal) && ulongSubtotal > total)
                            {
                                total = ulongSubtotal;
                            }
                            foreach (var item in xml.Element((XName?)"channel") !.Elements("item"))
                            {
                                var enclosure    = item.Element((XName?)"enclosure");
                                var link         = item.Element((XName?)"link");
                                var lengthString = enclosure.Attribute((XName?)"length")?.Value;
                                var url2         = enclosure.Attribute((XName?)"url")?.Value;
                                var type         = enclosure.Attribute((XName?)"type")?.Value;
                                var title        = item.Element((XName?)"title")?.Value;
                                var pubDate      = item.Element((XName?)"pubDate")?.Value;
                                if (!string.IsNullOrWhiteSpace(url2) && !string.IsNullOrWhiteSpace(type) && !string.IsNullOrWhiteSpace(title) && !string.IsNullOrWhiteSpace(pubDate) && !string.IsNullOrWhiteSpace(lengthString) && long.TryParse(lengthString, out var length))
                                {
                                    var nzb = new Nzb
                                    {
                                        length  = length,
                                        link    = url2,
                                        pubDate = pubDate,
                                        type    = type,
                                        title   = title
                                    };
                                    nzb  = _db.Synchronize((NewzNabAggregator.Database.Database db) => db.SaveNzb(nzb));
                                    url2 = (link.Value = new Uri(requestUri, $"/nzb/{nzb.id}").ToString());
                                    enclosure.Attribute((XName?)"url") !.Value = url2;
                                    channel.Add(item);
                                }
                            }
                        }
                        catch (Exception)
                        {
                            Console.WriteLine($"Failed to parse results at '{result.Item1.Name}': {Environment.NewLine}{result.Item2}");
                        }
                    }
                    response2.Add(new XAttribute((XName?)"offset", offset), new XAttribute((XName?)"total", total));
                    return(new ContentResult
                        {
                            Content = returnXml.ToString(),
                            ContentType = "text/xml",
                            StatusCode = 200
                        });
                }
                }
            }
            return(new OkResult());
        }