Zoals je op dit blog kunt zien beluister ik de blogs van .NET Rocks, deel ik hier de samenvattingen en hoop ik daarmee mijn kennis van IT te vergroten, (handige) tools en resources tegen te komen waar ik gebruik van kan maken. En als het "heel handig" is, dit ook met mijn collega's (en de rest van de wereld) te delen.
Ik ga natuurlijk niet elke dag naar de website om de podcast te downloaden, want naast het feit dat je zaken die je kunt automatiseren ook zou moeten automatiseren, zou dat een hele klus zijn. Ik ben zelf "nog maar" bij podcast 331, maar online staan er inmiddels 1.954 uitzendingen. Die stuk-voor-stuk downloaden, niet te doen.
Dus daar heb ik in C# een script voor geschreven. De werking was redelijk simpel, je voerde een POST op de homepage uit met deze data:
{"Page":1,"PageSize":100,"SearchString":""}}
Je kreeg dan een stuk JSON terug waarmee je de data van de MP3-bestanden had. Dat ging altijd goed, tot april 2025. En toen ineens dus niet meer...
Zucht... voor een developer is dit frustrerend. Je bouwt wat, daar steek je flink wat tijd in. En dan mag je "dus nog een keer aan de slag". Waarbij het de vraag is hoelang dit blijft werken.
In het downloadproces schrijf ik in een logbestand welke podcasts ik gedownload heb. Ik hoef een MP3 maar 1x te downloaden. Dat logbestand kan ik nu gebruiken om te bepalen wat de "meest recente podcast is". De structuur van de site is namelijk dat de URL van een detailpagina gelijk is aan https://www.dotnetrocks.com/details/[nummer podcast]. Ik zat hier te denken aan het opvragen van die pagina, en zolang ik maar een 2xx status terug krijg, is het shownummer geldig. Maar toen zag ik het menu-item "feed" op de website...
De website heeft, net als meer websites, een RSS-feed van de artikelen op de website. In dit geval is dat via pwop.com, de podcast-site van Carl Franklin. En zo zie ik de XML op feed.aspx?show=dotnetrocks. Deze feed toont de laatste 20 uitzendingen. Gelukkig ben ik "redelijk bij", want anders had ik alsnog op een andere manier de podcasts die ouder zijn op moeten vragen. Maar nu kan ik redelijk recht uit - recht aan de XML inladen, omzetten naar de structuur die ik verwacht en zo de rest van mijn code intact laten;
private static async Task<string> GetFeedOfDotNetRocks()
{
var result = new List<PagePostResult>();
const string uri = "https://pwop.com/feed.aspx?show=dotnetrocks";
using (var httpClient = new HttpClient())
{
var data = await httpClient.GetAsync(uri);
var document = System.Xml.Linq.XDocument.Parse(await data.Content.ReadAsStringAsync());
document.XPathSelectElements("//item").ToList().ForEach(rec => {
var sourceUri = rec.Descendants().First(rec1 => rec1.Name == "source").Attribute("url").Value;
var showNumber = Convert.ToInt32(sourceUri.Substring(sourceUri.LastIndexOf("=")+1));
var title = rec.Descendants().First(rec1 => rec1.Name == "title").Value;
var downloadUri = rec.Descendants().First(rec1 => rec1.Name == "enclosure").Attribute("url").Value;
result.Add(new PagePostResult() {
ShowNumber= showNumber,
ShowTitle=title,
DownloadUrl= downloadUri
});
});
}
return System.Text.Json.JsonSerializer.Serialize(result.ToArray());
}
// ter referentie nog even het PagePostResult-object:public class PagePostResult
{
public int TotalCount { get; set; }
public int ShowID { get; set; }
public int ShowNumber { get; set; }
public string ShowTitle { get; set; }
public string DatePublished { get; set; }
public string DownloadUrl { get; set; }
}
Een half uurtje kwijt aan deze implementatie, hopelijk blijft dit nu weer voor langere tijd werken!