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()); }