namespace podcast_agent { using System.Xml.Linq; using Newtonsoft.Json; class Program { static async Task Main(string[] args) { var conf = Configure(); var downloader = new HttpClient(); downloader.DefaultRequestHeaders.UserAgent.ParseAdd(conf.UserAgent); XNamespace ns = "http://www.itunes.com/dtds/podcast-1.0.dtd"; foreach (var feed in conf.FeedCommands) { try { var xml = XDocument.Load(feed.Url); foreach (var item in xml.Descendants("item")) { var title = item.Element("title")?.Value; var ext = ".wav"; var attachmentLink = item.Element("enclosure")?.Attribute("url")?.Value.ToString(); var probableFilename = attachmentLink.Substring(0, attachmentLink.IndexOf('?')); if (probableFilename.LastIndexOf('.') > 0) { ext = probableFilename.Substring(probableFilename.LastIndexOf('.')); } Console.WriteLine($"{title}, {attachmentLink}"); var downloadPath = Path.Combine(feed.OutputDir, title + ext); var dlResult = (await downloader.GetAsync(attachmentLink)); if(dlResult.IsSuccessStatusCode) { if(feed.KeepCount != null && feed.KeepCount > 0) { var files = Directory.GetFiles(feed.OutputDir, "*" + ext); if(files.Length > feed.KeepCount -1) { files = files.Order().Take((int)feed.KeepCount -1).ToArray(); foreach(var f in files) { File.Delete(f); } } } File.WriteAllBytes(downloadPath, await dlResult.Content.ReadAsByteArrayAsync()); } } } catch (Exception e) { Console.Error.WriteLine($"failed attempting to dl {feed} -"); Console.Error.WriteLine(e); } } } static Configuration Configure(string configurationPath = "appsettings.json") { if (!File.Exists(configurationPath)) { Console.Error.WriteLine($"could not find configuration at {configurationPath}! copying sample to that spot."); File.Copy("sample-appsettings.json", configurationPath); //and you know what, if that explodes at the OS level, the OS should give you an error return null; } var fileContents = File.ReadAllText(configurationPath); if (string.IsNullOrWhiteSpace(fileContents)) { Console.Error.WriteLine($"configuration file at {configurationPath} was empty! overwriting with sample settings."); File.Copy("sample-appsettings.json", configurationPath, true); return null; } var conf = JsonConvert.DeserializeObject(fileContents); if (conf == null) { Console.Error.WriteLine($"configuration file at {configurationPath} was empty! overwriting with sample settings."); File.Copy("sample-appsettings.json", configurationPath, true); return null; } return conf; } } }