Skip to content
Snippets Groups Projects
Verified Commit 2ae89930 authored by Eduardo Trujillo's avatar Eduardo Trujillo
Browse files

fix: Gracefully handle feeds with invalid items

parent 391f2b82
Branches gh-pages
No related tags found
No related merge requests found
......@@ -10,20 +10,13 @@ export default class FeedParser {
}
public async findItemByTitle(title: string, url: string): Promise<Episode> {
const body = await this.parseFeed(url);
const items = body.querySelectorAll("item");
const episodes = await this.getEpisodes(url);
const item = Array.from(items).find(item => {
const parsed = this.parseItem(item);
return parsed.title === title;
});
const episode = episodes.find(episode => episode.title === title);
if (!item) {
if (episode == null) {
throw new Error("Could not find episode");
}
const episode = this.parseItem(item);
const feed = await this.getFeed(url);
......@@ -74,10 +67,21 @@ export default class FeedParser {
protected parsePage(page: Document): Episode[] {
const items = page.querySelectorAll("item");
return Array.from(items).map(this.parseItem.bind(this));
return Array.from(items).reduce(
(acc, rawItem) => {
const item = this.parseItem(rawItem);
if (item != null) {
return [item, ...acc];
}
return acc;
},
[],
);
}
protected parseItem(item: Element): Episode {
protected parseItem(item: Element): Episode | null {
const titleEl = item.querySelector("title");
const streamUrlEl = item.querySelector("enclosure");
const linkEl = item.querySelector("link");
......@@ -86,8 +90,9 @@ export default class FeedParser {
const itunesImageEl = item.querySelector("image");
if (!titleEl || !streamUrlEl || !pubDateEl) {
console.log(titleEl, streamUrlEl, linkEl, descriptionEl, pubDateEl);
throw new Error("Invalid RSS feed");
console.log('Got invalid feed item', titleEl, streamUrlEl, linkEl, descriptionEl, pubDateEl);
return null;
}
const title = titleEl.textContent || "";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment