podcast-agent/Program.cs
2023-12-10 11:47:49 -05:00

97 lines
4.4 KiB
C#

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('.'));
}
foreach(char c in "'\":\\?/")
{
title = title.Replace(c, ' ');
}
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);
//Console.WriteLine($"in {feed.OutputDir}, I see {files.Count()} files with extension {ext}");
if(files.Length > feed.KeepCount - 1)
{
files = files.Order().Take(files.Length - (int)feed.KeepCount + 1).ToArray();
//Console.WriteLine($"filtered down to {files.Length}");
foreach(var f in files)
{
Console.WriteLine($"deleting {f}");
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<Configuration>(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;
}
}
}