You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							235 lines
						
					
					
						
							9.4 KiB
						
					
					
				
			
		
		
	
	
							235 lines
						
					
					
						
							9.4 KiB
						
					
					
				"use strict"; | 
						|
var __extends = (this && this.__extends) || (function () { | 
						|
    var extendStatics = function (d, b) { | 
						|
        extendStatics = Object.setPrototypeOf || | 
						|
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || | 
						|
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; | 
						|
        return extendStatics(d, b); | 
						|
    }; | 
						|
    return function (d, b) { | 
						|
        if (typeof b !== "function" && b !== null) | 
						|
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); | 
						|
        extendStatics(d, b); | 
						|
        function __() { this.constructor = d; } | 
						|
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); | 
						|
    }; | 
						|
})(); | 
						|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | 
						|
    if (k2 === undefined) k2 = k; | 
						|
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | 
						|
}) : (function(o, m, k, k2) { | 
						|
    if (k2 === undefined) k2 = k; | 
						|
    o[k2] = m[k]; | 
						|
})); | 
						|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | 
						|
    Object.defineProperty(o, "default", { enumerable: true, value: v }); | 
						|
}) : function(o, v) { | 
						|
    o["default"] = v; | 
						|
}); | 
						|
var __importStar = (this && this.__importStar) || function (mod) { | 
						|
    if (mod && mod.__esModule) return mod; | 
						|
    var result = {}; | 
						|
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | 
						|
    __setModuleDefault(result, mod); | 
						|
    return result; | 
						|
}; | 
						|
var __importDefault = (this && this.__importDefault) || function (mod) { | 
						|
    return (mod && mod.__esModule) ? mod : { "default": mod }; | 
						|
}; | 
						|
Object.defineProperty(exports, "__esModule", { value: true }); | 
						|
exports.parseFeed = exports.FeedHandler = void 0; | 
						|
var domhandler_1 = __importDefault(require("domhandler")); | 
						|
var DomUtils = __importStar(require("domutils")); | 
						|
var Parser_1 = require("./Parser"); | 
						|
var FeedItemMediaMedium; | 
						|
(function (FeedItemMediaMedium) { | 
						|
    FeedItemMediaMedium[FeedItemMediaMedium["image"] = 0] = "image"; | 
						|
    FeedItemMediaMedium[FeedItemMediaMedium["audio"] = 1] = "audio"; | 
						|
    FeedItemMediaMedium[FeedItemMediaMedium["video"] = 2] = "video"; | 
						|
    FeedItemMediaMedium[FeedItemMediaMedium["document"] = 3] = "document"; | 
						|
    FeedItemMediaMedium[FeedItemMediaMedium["executable"] = 4] = "executable"; | 
						|
})(FeedItemMediaMedium || (FeedItemMediaMedium = {})); | 
						|
var FeedItemMediaExpression; | 
						|
(function (FeedItemMediaExpression) { | 
						|
    FeedItemMediaExpression[FeedItemMediaExpression["sample"] = 0] = "sample"; | 
						|
    FeedItemMediaExpression[FeedItemMediaExpression["full"] = 1] = "full"; | 
						|
    FeedItemMediaExpression[FeedItemMediaExpression["nonstop"] = 2] = "nonstop"; | 
						|
})(FeedItemMediaExpression || (FeedItemMediaExpression = {})); | 
						|
// TODO: Consume data as it is coming in | 
						|
var FeedHandler = /** @class */ (function (_super) { | 
						|
    __extends(FeedHandler, _super); | 
						|
    /** | 
						|
     * | 
						|
     * @param callback | 
						|
     * @param options | 
						|
     */ | 
						|
    function FeedHandler(callback, options) { | 
						|
        var _this = this; | 
						|
        if (typeof callback === "object") { | 
						|
            callback = undefined; | 
						|
            options = callback; | 
						|
        } | 
						|
        _this = _super.call(this, callback, options) || this; | 
						|
        return _this; | 
						|
    } | 
						|
    FeedHandler.prototype.onend = function () { | 
						|
        var _a, _b; | 
						|
        var feedRoot = getOneElement(isValidFeed, this.dom); | 
						|
        if (!feedRoot) { | 
						|
            this.handleCallback(new Error("couldn't find root of feed")); | 
						|
            return; | 
						|
        } | 
						|
        var feed = {}; | 
						|
        if (feedRoot.name === "feed") { | 
						|
            var childs = feedRoot.children; | 
						|
            feed.type = "atom"; | 
						|
            addConditionally(feed, "id", "id", childs); | 
						|
            addConditionally(feed, "title", "title", childs); | 
						|
            var href = getAttribute("href", getOneElement("link", childs)); | 
						|
            if (href) { | 
						|
                feed.link = href; | 
						|
            } | 
						|
            addConditionally(feed, "description", "subtitle", childs); | 
						|
            var updated = fetch("updated", childs); | 
						|
            if (updated) { | 
						|
                feed.updated = new Date(updated); | 
						|
            } | 
						|
            addConditionally(feed, "author", "email", childs, true); | 
						|
            feed.items = getElements("entry", childs).map(function (item) { | 
						|
                var entry = {}; | 
						|
                var children = item.children; | 
						|
                addConditionally(entry, "id", "id", children); | 
						|
                addConditionally(entry, "title", "title", children); | 
						|
                var href = getAttribute("href", getOneElement("link", children)); | 
						|
                if (href) { | 
						|
                    entry.link = href; | 
						|
                } | 
						|
                var description = fetch("summary", children) || fetch("content", children); | 
						|
                if (description) { | 
						|
                    entry.description = description; | 
						|
                } | 
						|
                var pubDate = fetch("updated", children); | 
						|
                if (pubDate) { | 
						|
                    entry.pubDate = new Date(pubDate); | 
						|
                } | 
						|
                entry.media = getMediaElements(children); | 
						|
                return entry; | 
						|
            }); | 
						|
        } | 
						|
        else { | 
						|
            var childs = (_b = (_a = getOneElement("channel", feedRoot.children)) === null || _a === void 0 ? void 0 : _a.children) !== null && _b !== void 0 ? _b : []; | 
						|
            feed.type = feedRoot.name.substr(0, 3); | 
						|
            feed.id = ""; | 
						|
            addConditionally(feed, "title", "title", childs); | 
						|
            addConditionally(feed, "link", "link", childs); | 
						|
            addConditionally(feed, "description", "description", childs); | 
						|
            var updated = fetch("lastBuildDate", childs); | 
						|
            if (updated) { | 
						|
                feed.updated = new Date(updated); | 
						|
            } | 
						|
            addConditionally(feed, "author", "managingEditor", childs, true); | 
						|
            feed.items = getElements("item", feedRoot.children).map(function (item) { | 
						|
                var entry = {}; | 
						|
                var children = item.children; | 
						|
                addConditionally(entry, "id", "guid", children); | 
						|
                addConditionally(entry, "title", "title", children); | 
						|
                addConditionally(entry, "link", "link", children); | 
						|
                addConditionally(entry, "description", "description", children); | 
						|
                var pubDate = fetch("pubDate", children); | 
						|
                if (pubDate) | 
						|
                    entry.pubDate = new Date(pubDate); | 
						|
                entry.media = getMediaElements(children); | 
						|
                return entry; | 
						|
            }); | 
						|
        } | 
						|
        this.feed = feed; | 
						|
        this.handleCallback(null); | 
						|
    }; | 
						|
    return FeedHandler; | 
						|
}(domhandler_1.default)); | 
						|
exports.FeedHandler = FeedHandler; | 
						|
function getMediaElements(where) { | 
						|
    return getElements("media:content", where).map(function (elem) { | 
						|
        var media = { | 
						|
            medium: elem.attribs.medium, | 
						|
            isDefault: !!elem.attribs.isDefault, | 
						|
        }; | 
						|
        if (elem.attribs.url) { | 
						|
            media.url = elem.attribs.url; | 
						|
        } | 
						|
        if (elem.attribs.fileSize) { | 
						|
            media.fileSize = parseInt(elem.attribs.fileSize, 10); | 
						|
        } | 
						|
        if (elem.attribs.type) { | 
						|
            media.type = elem.attribs.type; | 
						|
        } | 
						|
        if (elem.attribs.expression) { | 
						|
            media.expression = elem.attribs | 
						|
                .expression; | 
						|
        } | 
						|
        if (elem.attribs.bitrate) { | 
						|
            media.bitrate = parseInt(elem.attribs.bitrate, 10); | 
						|
        } | 
						|
        if (elem.attribs.framerate) { | 
						|
            media.framerate = parseInt(elem.attribs.framerate, 10); | 
						|
        } | 
						|
        if (elem.attribs.samplingrate) { | 
						|
            media.samplingrate = parseInt(elem.attribs.samplingrate, 10); | 
						|
        } | 
						|
        if (elem.attribs.channels) { | 
						|
            media.channels = parseInt(elem.attribs.channels, 10); | 
						|
        } | 
						|
        if (elem.attribs.duration) { | 
						|
            media.duration = parseInt(elem.attribs.duration, 10); | 
						|
        } | 
						|
        if (elem.attribs.height) { | 
						|
            media.height = parseInt(elem.attribs.height, 10); | 
						|
        } | 
						|
        if (elem.attribs.width) { | 
						|
            media.width = parseInt(elem.attribs.width, 10); | 
						|
        } | 
						|
        if (elem.attribs.lang) { | 
						|
            media.lang = elem.attribs.lang; | 
						|
        } | 
						|
        return media; | 
						|
    }); | 
						|
} | 
						|
function getElements(tagName, where) { | 
						|
    return DomUtils.getElementsByTagName(tagName, where, true); | 
						|
} | 
						|
function getOneElement(tagName, node) { | 
						|
    return DomUtils.getElementsByTagName(tagName, node, true, 1)[0]; | 
						|
} | 
						|
function fetch(tagName, where, recurse) { | 
						|
    if (recurse === void 0) { recurse = false; } | 
						|
    return DomUtils.getText(DomUtils.getElementsByTagName(tagName, where, recurse, 1)).trim(); | 
						|
} | 
						|
function getAttribute(name, elem) { | 
						|
    if (!elem) { | 
						|
        return null; | 
						|
    } | 
						|
    var attribs = elem.attribs; | 
						|
    return attribs[name]; | 
						|
} | 
						|
function addConditionally(obj, prop, what, where, recurse) { | 
						|
    if (recurse === void 0) { recurse = false; } | 
						|
    var tmp = fetch(what, where, recurse); | 
						|
    if (tmp) | 
						|
        obj[prop] = tmp; | 
						|
} | 
						|
function isValidFeed(value) { | 
						|
    return value === "rss" || value === "feed" || value === "rdf:RDF"; | 
						|
} | 
						|
/** | 
						|
 * Parse a feed. | 
						|
 * | 
						|
 * @param feed The feed that should be parsed, as a string. | 
						|
 * @param options Optionally, options for parsing. When using this option, you should set `xmlMode` to `true`. | 
						|
 */ | 
						|
function parseFeed(feed, options) { | 
						|
    if (options === void 0) { options = { xmlMode: true }; } | 
						|
    var handler = new FeedHandler(options); | 
						|
    new Parser_1.Parser(handler, options).end(feed); | 
						|
    return handler.feed; | 
						|
} | 
						|
exports.parseFeed = parseFeed;
 | 
						|
 |