Mercurial > addons > firefox-addons > feed-preview
diff js/feed-parser.js @ 17:48cabd01ef64
Add support for enclosures in Atom feeds
author | Guido Berhoerster <guido+feed-preview@berhoerster.name> |
---|---|
date | Wed, 12 Dec 2018 22:38:45 +0100 |
parents | 150f07c7595f |
children | 15db49e77deb |
line wrap: on
line diff
--- a/js/feed-parser.js Wed Dec 12 10:56:37 2018 +0100 +++ b/js/feed-parser.js Wed Dec 12 22:38:45 2018 +0100 @@ -475,11 +475,33 @@ return this.parseAtomTextConstruct(contentElement, false); } + parseAtomEntryFile(enclosureElement) { + let type; + let size; + let url = parseURL(enclosureElement.getAttribute('href'), this.url); + if (url === null) { + throw new TypeError('invalid URL in enclosure href attribute'); + } + + let typeAttribute = enclosureElement.getAttribute('type'); + if (typeAttribute !== null) { + type = typeAttribute; + } + + let length = parseInt(enclosureElement.getAttribute('length'), 10); + if (!isNaN(length)) { + size = length; + } + + return new FeedEntryFile(url, {type, size}); + } + parseAtomEntry(entryElement) { let title; let link; let date; let content; + let files = []; let titleElement = feedQueryXPath(this.document, entryElement, './atom:title'); if (titleElement !== null) { @@ -511,7 +533,19 @@ } } - return new FeedEntry({title, link, date, content}); + for (let enclosureElement of feedQueryXPathAll(this.document, + entryElement, './atom:link[@href][@rel="enclosure"]')) { + try { + let entryFile = this.parseAtomEntryFile(enclosureElement); + files.push(entryFile); + } catch (e) { + if (!(e instanceof TypeError)) { + throw e; + } + } + } + + return new FeedEntry({title, link, date, content, files}); } parseAtomFeed() {