/* auto-generated by NAPI-RS */ /* eslint-disable */ /** RSS 2.0 cloud subscription endpoint */ export interface Cloud { /** Cloud server domain */ domain?: string /** Cloud server port */ port?: string /** Cloud server path */ path?: string /** Remote procedure to call for registration */ registerprocedure?: string /** Protocol used for notifications (e.g., "xml-rpc", "soap", "http-post") */ protocol?: string } /** Content block */ export interface Content { /** Content body */ value: string /** Content MIME type */ type?: string /** Content language */ language?: string /** Base URL for relative links */ base?: string /** Out-of-line content URL (Atom ``) */ src?: string } /** * Detect feed format without full parsing * * # Arguments * * * `source` - Feed content as Buffer, string, or `Uint8Array` * * # Returns * * Feed version string (e.g., "rss20", "atom10") */ export declare function detectFormat(source: Buffer | string): string /** Enclosure (attached media file) */ export interface Enclosure { /** Enclosure URL */ href: string /** File size in bytes (raw string value, as in Python feedparser) */ length?: string /** MIME type */ type?: string /** Attachment title (JSON Feed only) */ title?: string /** Duration in seconds as raw string (JSON Feed `duration_in_seconds`) */ duration?: string } /** Feed entry/item */ export interface Entry { /** Unique entry identifier */ id?: string /** Entry title */ title?: string /** Detailed title with metadata */ titleDetail?: TextConstruct /** Primary link */ link?: string /** All links associated with this entry */ links: Array /** Entry subtitle (Atom §4.2.12 at entry level) */ subtitle?: string /** Detailed subtitle with metadata */ subtitleDetail?: TextConstruct /** Rights/copyright statement */ rights?: string /** Detailed rights with metadata */ rightsDetail?: TextConstruct /** Short description/summary */ summary?: string /** Detailed summary with metadata */ summaryDetail?: TextConstruct /** Full content blocks */ content: Array /** Publication date (original string from feed, timezone preserved) */ published?: string /** Parsed publication date as milliseconds since epoch */ publishedParsed?: number /** Last update date (original string from feed, timezone preserved) */ updated?: string /** Parsed last update date as milliseconds since epoch */ updatedParsed?: number /** Creation date (RFC 3339 string) */ created?: string /** Parsed creation date as milliseconds since epoch */ createdParsed?: number /** Expiration date (RFC 3339 string) */ expired?: string /** Parsed expiration date as milliseconds since epoch */ expiredParsed?: number /** Primary author name */ author?: string /** Detailed author information */ authorDetail?: Person /** All authors */ authors: Array /** Contributors */ contributors: Array /** Publisher name */ publisher?: string /** Detailed publisher information */ publisherDetail?: Person /** Tags/categories */ tags: Array /** Media enclosures (audio, video, etc.) */ enclosures: Array /** Comments URL or text */ comments?: string /** Source feed reference */ source?: Source /** Podcast transcripts */ podcastTranscripts: Array /** Podcast persons */ podcastPersons: Array /** License URL (Creative Commons, etc.) */ license?: string /** Geographic location (`GeoRSS`), exposed as `where` per Python feedparser API */ where?: GeoLocation /** W3C Basic Geo latitude (`geo:lat`) */ geoLat?: string /** W3C Basic Geo longitude (`geo:long`) */ geoLong?: string /** Dublin Core creator (author) */ dcCreator?: string /** Dublin Core date (RFC 3339 string) */ dcDate?: string /** Parsed Dublin Core date as JS Date object */ dcDateParsed?: number /** Dublin Core subject tags */ dcSubject: Array /** Dublin Core rights (copyright) */ dcRights?: string /** Media RSS thumbnails */ mediaThumbnails: Array /** Media RSS content */ mediaContent: Array /** Media RSS credits (media:credit elements) */ mediaCredit: Array /** Media RSS copyright (media:copyright element) */ mediaCopyright?: MediaCopyright /** Media RSS rating (media:rating element) */ mediaRating?: MediaRating /** Media RSS keywords (raw comma-separated string) */ mediaKeywords?: string /** Media RSS description (plain text only) */ mediaDescription?: string /** Media RSS title (plain text only) */ mediaTitle?: string /** iTunes episode metadata */ itunes?: ItunesEntryMeta /** Podcast 2.0 episode metadata */ podcast?: PodcastEntryMeta /** Atom Threading Extensions: in-reply-to references (RFC 4685) */ thrInReplyTo: Array /** Atom Threading Extensions: total reply count (RFC 4685) */ thrTotal?: number /** Slash namespace: comment count */ slashComments?: string /** Slash namespace: hit parade */ slashHitParade?: string /** WFW namespace: comment RSS feed URL */ wfwCommentRss?: string /** * Whether the RSS `` is a permalink (`isPermaLink` attribute). * * `true` when `isPermaLink="true"` or attribute absent (RSS 2.0 default). * `false` when `isPermaLink="false"`. `null` when no `` element present. */ guidislink?: boolean /** Entry language (JSON Feed `language` field) */ language?: string /** External URL where the full content lives (JSON Feed `external_url`) */ externalUrl?: string /** * Custom JSON Feed extension objects captured from this item * (underscore-prefixed keys). Only populated by the JSON Feed parser; * empty for RSS/Atom entries. * * Values are sanitized for safe JS exposure: nested `__proto__`/`constructor`/ * `prototype` object keys are dropped (see `sanitize_json_extension_value`), * and non-negative integers above `u32::MAX` are converted to decimal strings * to avoid a JS `BigInt`, which would otherwise make `JSON.stringify` throw on * the whole parse result. */ jsonExtensions: Record } /** Feed metadata */ export interface FeedMeta { /** Feed title */ title?: string /** Detailed title with metadata */ titleDetail?: TextConstruct /** Primary feed link */ link?: string /** All links associated with this feed */ links: Array /** Feed subtitle/description */ subtitle?: string /** Detailed subtitle with metadata */ subtitleDetail?: TextConstruct /** Feed summary (populated from itunes:summary when present) */ summary?: string /** Detailed summary with metadata */ summaryDetail?: TextConstruct /** Last update date (original string from feed, timezone preserved) */ updated?: string /** Parsed last update date as milliseconds since epoch */ updatedParsed?: number /** Initial publication date (original string from feed, timezone preserved) */ published?: string /** Parsed publication date as milliseconds since epoch */ publishedParsed?: number /** Primary author name */ author?: string /** Detailed author information */ authorDetail?: Person /** All authors */ authors: Array /** Contributors */ contributors: Array /** Publisher name */ publisher?: string /** Detailed publisher information */ publisherDetail?: Person /** Feed language (e.g., "en-us") */ language?: string /** Copyright/rights statement */ rights?: string /** Detailed rights with metadata */ rightsDetail?: TextConstruct /** Generator name */ generator?: string /** Detailed generator information */ generatorDetail?: Generator /** Feed image */ image?: Image /** Icon URL (small image) */ icon?: string /** Logo URL (larger image) */ logo?: string /** Feed-level tags/categories */ tags: Array /** Unique feed identifier */ id?: string /** Time-to-live (update frequency hint) in minutes (kept as string for API compatibility) */ ttl?: string /** URL of documentation for the RSS format used */ docs?: string /** License URL (Creative Commons, etc.) */ license?: string /** Syndication module metadata (RSS 1.0) */ syndication?: SyndicationMeta /** Dublin Core creator (author fallback) */ dcCreator?: string /** Dublin Core publisher */ dcPublisher?: string /** Dublin Core rights (copyright) */ dcRights?: string /** Geographic location (`GeoRSS`), exposed as `where` per Python feedparser API */ where?: GeoLocation /** W3C Basic Geo latitude (`geo:lat`) */ geoLat?: string /** W3C Basic Geo longitude (`geo:long`) */ geoLong?: string /** iTunes podcast metadata */ itunes?: ItunesFeedMeta /** Podcast 2.0 metadata */ podcast?: PodcastMeta /** JSON Feed `next_url` for pagination (JSON Feed 1.1) */ nextUrl?: string /** Media RSS thumbnails at feed/channel level */ mediaThumbnails: Array /** Media RSS content items at feed/channel level */ mediaContent: Array /** Media RSS rating (`media:rating`) at feed level */ mediaRating?: MediaRating /** Media RSS keywords (`media:keywords`) at feed level */ mediaKeywords?: string /** RSS 2.0 cloud subscription endpoint */ cloud?: Cloud /** RSS 2.0 text input form */ textinput?: TextInput /** RSS 2.0 skip hours (0-23) */ skiphours: Array /** RSS 2.0 skip days */ skipdays: Array /** * Custom JSON Feed extension objects captured from the feed's top level * (underscore-prefixed keys). Only populated by the JSON Feed parser; * empty for RSS/Atom feeds. Only the feed-root scope is captured, not * nested scopes like `authors[]`/`hubs[]`. * * Values are sanitized for safe JS exposure: nested `__proto__`/`constructor`/ * `prototype` object keys are dropped (see `sanitize_json_extension_value`), * and non-negative integers above `u32::MAX` are converted to decimal strings * to avoid a JS `BigInt`, which would otherwise make `JSON.stringify` throw on * the whole parse result. */ jsonExtensions: Record } /** Generator metadata */ export interface Generator { /** Generator name (text content of the `` element) */ name: string /** Generator URI (`href` attribute, matching Python feedparser API) */ href?: string /** Generator version */ version?: string } /** Geographic location from `GeoRSS` namespace */ export interface GeoLocation { /** Type of geographic shape ("point", "line", "polygon", "box") */ geoType: string /** * Coordinate pairs as nested array [[lat, lng], ...] * * Format depends on `geo_type`: * - "point": Single pair [[lat, lng]] * - "line": Two or more pairs [[lat1, lng1], [lat2, lng2], ...] * - "box": Two pairs [[lower-left-lat, lower-left-lng], [upper-right-lat, upper-right-lng]] * - "polygon": Three or more pairs forming a closed shape [[lat1, lng1], ..., [lat1, lng1]] */ coordinates: Array> /** Coordinate Reference System (from GeoRSS/GML `srsName`, e.g. "EPSG:4326" for WGS84 latitude/longitude) */ srsName?: string /** Elevation in meters (from `georss:elev`) */ elev?: number /** Feature type classification (from `georss:featuretypetag`) */ featureTypeTag?: string /** Human-readable place name (from `georss:featurename`) */ featureName?: string /** Relationship type (from `georss:relationshiptag`) */ relationshipTag?: string } /** Image metadata */ export interface Image { /** Image URL (primary field) */ href: string /** Image URL alias (same as href, Python feedparser compatibility) */ url: string /** Image title */ title?: string /** Detailed title with type metadata */ titleDetail?: TextConstruct /** Link associated with the image */ link?: string /** Image width in pixels */ width?: number /** Image height in pixels */ height?: number /** Image description (alias for subtitle) */ description?: string /** Image subtitle (alias for description) */ subtitle?: string /** Detailed subtitle/description with type metadata */ subtitleDetail?: TextConstruct /** Links synthesized from href */ links: Array } /** Atom Threading Extensions in-reply-to reference (RFC 4685) */ export interface InReplyTo { /** IRI of the entry being replied to (ref attribute) */ ref?: string /** URL where the referenced entry can be found */ href?: string /** MIME type of the linked resource */ type?: string /** IRI of the feed containing the referenced entry */ source?: string } /** iTunes category */ export interface ItunesCategory { /** Category text */ text: string /** Subcategory */ subcategory?: string } /** iTunes episode metadata */ export interface ItunesEntryMeta { /** Episode title override */ title?: string /** Episode author */ author?: string /** * Episode duration as raw string (itunes:duration) * * Preserved verbatim from the feed: "3600", "60:00", "1:00:00", "1:23:45", etc. */ duration?: string /** Explicit content flag for this episode */ explicit?: boolean /** * Episode-specific artwork URL * * Note: URL from untrusted feed input. Validate before fetching. */ image?: string /** Episode number as raw string (itunes:episode) */ episode?: string /** Season number as raw string (itunes:season) */ season?: string /** Episode type: "full", "trailer", or "bonus" */ episodeType?: string } /** iTunes podcast feed metadata */ export interface ItunesFeedMeta { /** Podcast author */ author?: string /** Podcast owner information */ owner?: ItunesOwner /** Podcast categories */ categories: Array /** Explicit content flag */ explicit?: boolean /** * Podcast artwork URL * * Note: URL from untrusted feed input. Validate before fetching. */ image?: string /** Podcast keywords */ keywords: Array /** Podcast type (episodic/serial) */ podcastType?: string /** Podcast completion status (raw XML text value, e.g., "Yes", "No") */ complete?: string /** * New feed URL for migrated podcasts * * Note: URL from untrusted feed input. Validate before fetching. */ newFeedUrl?: string /** Block flag: 1 = blocked ("yes"), 0 = not blocked */ block?: number } /** iTunes owner information */ export interface ItunesOwner { /** Owner name */ name?: string /** Owner email */ email?: string } /** Link in feed or entry */ export interface Link { /** Link URL */ href: string /** Link relationship type (e.g., "alternate", "enclosure", "self") */ rel?: string /** MIME type of the linked resource */ type?: string /** Human-readable link title */ title?: string /** Length of the linked resource in bytes (raw string value, as in Python feedparser) */ length?: string /** Language of the linked resource */ hreflang?: string /** RFC 4685 §4: number of replies at the IRI */ thrCount?: number /** RFC 4685 §4: when the reply resource was last modified (RFC 3339) */ thrUpdated?: string /** Parsed thr:updated as milliseconds since epoch */ thrUpdatedParsed?: number } /** Media RSS content */ export interface MediaContent { /** * Media URL * * Note: URL from untrusted feed input. Validate before fetching. */ url: string /** MIME type */ type?: string /** Medium type: "image", "video", "audio", "document", "executable" */ medium?: string /** File size in bytes (raw string value, as in Python feedparser) */ filesize?: string /** Width in pixels (raw string value, as in Python feedparser) */ width?: string /** Height in pixels (raw string value, as in Python feedparser) */ height?: string /** Duration (raw string value, as in Python feedparser) */ duration?: string /** Bitrate in kilobits per second (raw string value) */ bitrate?: string /** Language of the media */ lang?: string /** Number of audio channels (raw string value) */ channels?: string /** Codec used to produce the media */ codec?: string /** Expression type: "full", "sample", "nonstop" */ expression?: string /** Whether this is the default media object (raw string value) */ isdefault?: string /** Sampling rate in kHz (raw string value) */ samplingrate?: string /** Frame rate in frames per second (raw string value) */ framerate?: string } /** Media RSS copyright (media:copyright element) */ export interface MediaCopyright { /** Copyright URL */ url?: string } /** Media RSS credit (media:credit element) */ export interface MediaCredit { /** Credit role (e.g., "author", "producer") */ role?: string /** Credit scheme URI (default: "urn:ebu") */ scheme?: string /** Credit text content (person/entity name) */ content: string } /** Media RSS rating (`media:rating`) */ export interface MediaRating { /** Rating scheme URI (e.g. "urn:simple", "urn:mpaa") */ scheme?: string /** Rating value (e.g. "adult", "nonadult", "pg-13") */ content: string } /** Media RSS thumbnail */ export interface MediaThumbnail { /** * Thumbnail URL * * Note: URL from untrusted feed input. Validate before fetching. */ url: string /** Width in pixels (raw string value, as in Python feedparser) */ width?: string /** Height in pixels (raw string value, as in Python feedparser) */ height?: string /** * Time offset in NTP format (time attribute) * * Indicates which frame of the media this thumbnail represents. */ time?: string } /** * Parse an RSS/Atom/JSON Feed from bytes or string * * # Arguments * * * `source` - Feed content as Buffer, string, or `Uint8Array` * * # Returns * * Parsed feed result with metadata and entries * * # Errors * * Returns error if input exceeds size limit or parsing fails catastrophically */ export declare function parse(source: Buffer | string): ParsedFeed /** * Parsed feed result * * This is analogous to Python feedparser's `FeedParserDict`. */ export interface ParsedFeed { /** Feed metadata */ feed: FeedMeta /** Feed entries/items */ entries: Array /** True if parsing encountered errors */ bozo: boolean /** Description of parsing error (if bozo is true) */ bozoException?: string /** Detected or declared encoding */ encoding: string /** Detected feed format version */ version: string /** XML namespaces (prefix -> URI) */ namespaces: Record /** HTTP status code (if fetched from URL) */ status?: number /** Final URL after redirects (if fetched from URL) */ href?: string /** `ETag` header from HTTP response */ etag?: string /** Last-Modified header from HTTP response */ modified?: string /** HTTP response headers (if fetched from URL) */ headers?: Record } /** * Parsing options accepted by `parseWithOptions` and `parseUrlWithOptions` * * All fields are optional; omitted fields use the same defaults as * [`core::ParseOptions::default`] (HTML sanitization and relative URI * resolution both enabled, 100MB max feed size). */ export interface ParseOptions { /** Maximum feed size in bytes (default: 100MB) */ maxSize?: number /** * Whether to sanitize HTML content in feed entries (default: true) * * Disabling this is **not recommended** unless the feed source is fully trusted. */ sanitizeHtml?: boolean /** Whether to resolve relative URLs against the feed's base URL (default: true) */ resolveRelativeUris?: boolean } /** * Parse feed from HTTP/HTTPS URL with conditional GET support * * Fetches the feed from the given URL and parses it. Supports conditional GET * using `ETag` and Last-Modified headers for bandwidth-efficient caching. * * # Arguments * * * `url` - HTTP or HTTPS URL to fetch * * `etag` - Optional `ETag` from previous fetch for conditional GET * * `modified` - Optional Last-Modified timestamp from previous fetch * * `user_agent` - Optional custom User-Agent header * * # Returns * * Parsed feed result with HTTP metadata fields populated: * - `status`: HTTP status code (200, 304, etc.) * - `href`: Final URL after redirects * - `etag`: `ETag` header value (for next request) * - `modified`: Last-Modified header value (for next request) * - `headers`: Full HTTP response headers * * On 304 Not Modified, returns a feed with empty entries but status=304. * * # Errors * * Returns error if the URL is invalid, the request fails, or parsing fails catastrophically * * # Examples * * ```javascript * const feedparser = require('feedparser-rs'); * * // First fetch * const feed = await feedparser.parseUrl("https://example.com/feed.xml"); * console.log(feed.feed.title); * console.log(`ETag: ${feed.etag}`); * * // Subsequent fetch with caching * const feed2 = await feedparser.parseUrl( * "https://example.com/feed.xml", * feed.etag, * feed.modified * ); * * if (feed2.status === 304) { * console.log("Feed not modified, use cached version"); * } * ``` */ export declare function parseUrl(url: string, etag?: string | undefined | null, modified?: string | undefined | null, userAgent?: string | undefined | null): ParsedFeed /** * Parse feed from URL with custom options * * Like `parseUrl` but allows specifying custom options for `DoS` protection, * HTML sanitization, and relative URI resolution. * * # Errors * * Returns error if the URL is invalid, the request fails, or parsing fails catastrophically * * # Examples * * ```javascript * const feedparser = require('feedparser-rs'); * * const feed = await feedparser.parseUrlWithOptions( * "https://example.com/feed.xml", * null, // etag * null, // modified * null, // user_agent * { maxSize: 10485760 } // 10MB * ); * ``` */ export declare function parseUrlWithOptions(url: string, etag?: string | undefined | null, modified?: string | undefined | null, userAgent?: string | undefined | null, options?: ParseOptions | undefined | null): ParsedFeed /** * Parse an RSS/Atom/JSON Feed with custom options * * # Arguments * * * `source` - Feed content as Buffer, string, or `Uint8Array` * * `options` - Optional parsing options (max size, HTML sanitization, URI resolution) * * # Returns * * Parsed feed result with metadata and entries * * # Errors * * Returns error if input exceeds size limit or parsing fails catastrophically */ export declare function parseWithOptions(source: Buffer | string, options?: ParseOptions | undefined | null): ParsedFeed /** Person (author, contributor, etc.) */ export interface Person { /** Person's name */ name?: string /** Person's email address */ email?: string /** Person's URI/website */ href?: string /** Person's avatar image URL (JSON Feed only) */ avatar?: string } /** Podcast 2.0 alternate enclosure (podcast:alternateEnclosure) */ export interface PodcastAlternateEnclosure { /** MIME type */ type: string /** * File size in bytes * * Note: represented as `f64` (napi has `ToNapiValue` but no `FromNapiValue` for `u64`, * which `#[napi(object)]` requires since object structs are bidirectional); exact up to * 2^53 bytes. */ length?: number /** Bitrate in kbps */ bitrate?: number /** Video height in pixels */ height?: number /** Language code */ lang?: string /** Title */ title?: string /** Relationship: "default", "alternate", etc. */ rel?: string /** Codecs string */ codecs?: string /** Whether this is the default enclosure */ default?: boolean /** Source URIs for this enclosure */ sources: Array /** Integrity verification */ integrity?: PodcastIntegrity } /** Podcast 2.0 alternate enclosure source */ export interface PodcastAlternateEnclosureSource { /** * Source URI * * Note: URL from untrusted feed input. Validate before fetching. */ uri: string /** Optional MIME type override */ contentType?: string } /** Podcast chapters */ export interface PodcastChapters { /** * Chapters URL * * Note: URL from untrusted feed input. Validate before fetching. */ url: string /** Chapters MIME type (e.g., "application/json+chapters", "application/xml+chapters") */ type: string } /** Podcast 2.0 chat room reference (podcast:chat) */ export interface PodcastChat { /** Chat server address */ server: string /** Chat protocol: "matrix", "xmpp", etc. */ protocol: string /** Account identifier on the chat server */ accountId?: string /** Space identifier, for protocols that group rooms */ space?: string } /** Podcast 2.0 episode metadata */ export interface PodcastEntryMeta { /** Episode transcripts */ transcript: Array /** Episode chapters */ chapters?: PodcastChapters /** Episode soundbites */ soundbite: Array /** Episode persons */ persons: Array /** Content medium type (podcast:medium) */ medium?: string /** Season number (podcast:season number attribute) */ season?: string /** Episode number (podcast:episode number attribute) */ episode?: string /** Chat room references (podcast:chat) */ chat: Array /** Alternate enclosures (podcast:alternateEnclosure) */ alternateEnclosures: Array /** Geographic location (podcast:location) */ location?: PodcastLocation /** Social interaction threads (podcast:socialInteract) */ socialInteract: Array /** Text records (podcast:txt) */ txt: Array /** Follow links (podcast:follow) */ follow: Array /** Value-for-value payment information (podcast:value) */ value?: PodcastValue } /** Podcast 2.0 follow link (podcast:follow) */ export interface PodcastFollow { /** * Follow URL * * Note: URL from untrusted feed input. Validate before fetching. */ url: string /** Platform name */ platform?: string } /** Podcast funding link */ export interface PodcastFunding { /** * Funding URL * * Note: URL from untrusted feed input. Validate before fetching. */ url: string /** Funding message */ message?: string } /** Podcast 2.0 integrity verification for alternate enclosures */ export interface PodcastIntegrity { /** Integrity type: "sri" or "pgp-signature" */ type: string /** Integrity value */ value: string } /** Podcast 2.0 geographic location (podcast:location) */ export interface PodcastLocation { /** Human-readable location name */ name: string /** Geographic coordinates (e.g., "geo:37.786971,-122.399677") */ geo?: string /** OpenStreetMap reference (e.g., "R113314") */ osm?: string } /** Podcast 2.0 namespace metadata (feed level) */ export interface PodcastMeta { /** Podcast transcripts */ transcripts: Array /** Podcast funding links */ funding: Array /** Podcast persons (hosts, etc.) */ persons: Array /** Podcast GUID */ guid?: string /** Value-for-value payment information */ value?: PodcastValue /** Content medium type (podcast:medium) */ medium?: string /** Ownership transfer lock value: "yes" or "no" (podcast:locked) */ locked?: string /** Email of the lock owner (podcast:locked owner attribute) */ lockedOwner?: string /** Chat room references (podcast:chat) */ chat: Array /** * Whether the podcast uses Podping for update notifications * (podcast:podping `usesPodping` attribute) */ podpingUsesPodping?: boolean /** Related feed references (podcast:podroll) */ podroll: Array /** Geographic location (podcast:location) */ location?: PodcastLocation /** Text records (podcast:txt) */ txt: Array /** Update frequency schedule (podcast:updateFrequency) */ updateFrequency?: PodcastUpdateFrequency /** Follow links (podcast:follow) */ follow: Array } /** Podcast person metadata */ export interface PodcastPerson { /** Person's name */ name: string /** Person's role (e.g., "host", "guest") */ role?: string /** Person's group (e.g., "cast", "crew") */ group?: string /** * Person's image URL * * Note: URL from untrusted feed input. Validate before fetching. */ img?: string /** * Person's URL/website * * Note: URL from untrusted feed input. Validate before fetching. */ href?: string } /** Podcast 2.0 remote item reference */ export interface PodcastRemoteItem { /** Feed GUID */ feedGuid?: string /** * Feed URL * * Note: URL from untrusted feed input. Validate before fetching. */ feedUrl?: string /** Item GUID */ itemGuid?: string /** Content medium type */ medium?: string /** Display title */ title?: string } /** Podcast 2.0 social interaction thread (podcast:socialInteract) */ export interface PodcastSocialInteract { /** * Social thread URI * * Note: URL from untrusted feed input. Validate before fetching. */ uri: string /** Social protocol: "activitypub", "twitter", etc. */ protocol?: string /** Account identifier */ accountId?: string /** * Account URL * * Note: URL from untrusted feed input. Validate before fetching. */ accountUrl?: string /** Priority (lower = higher priority) */ priority?: number } /** Podcast soundbite */ export interface PodcastSoundbite { /** Start time in seconds */ startTime: number /** Duration in seconds */ duration: number /** Title */ title?: string } /** Podcast transcript metadata */ export interface PodcastTranscript { /** * Transcript URL * * Note: URL from untrusted feed input. Validate before fetching. */ url: string /** Transcript type (e.g., "text/plain", "application/srt") */ type?: string /** Transcript language */ language?: string /** Relationship type (e.g., "captions", "chapters") */ rel?: string } /** Podcast 2.0 text record (podcast:txt) */ export interface PodcastTxt { /** Purpose of the text */ purpose?: string /** Text content */ value: string } /** Podcast 2.0 update frequency (podcast:updateFrequency) */ export interface PodcastUpdateFrequency { /** iCalendar RRULE string */ rrule?: string /** Whether the podcast is complete */ complete?: boolean /** Start date in ISO 8601 */ dtstart?: string /** Human-readable label */ label?: string } /** Podcast 2.0 value element for monetization */ export interface PodcastValue { /** Payment type: "lightning", "hive", etc. */ type: string /** Payment method: "keysend" for Lightning Network */ method: string /** Suggested payment amount */ suggested?: string /** List of payment recipients with split percentages */ recipients: Array /** Time-bounded payment splits for pre-recorded remote content */ timeSplits: Array } /** Value recipient for payment splitting */ export interface PodcastValueRecipient { /** Recipient's name */ name?: string /** Recipient type: "node" for Lightning Network nodes */ type: string /** Payment address (e.g., Lightning node public key) */ address: string /** Payment split percentage */ split: number /** Whether this is a fee recipient */ fee?: boolean } /** Podcast 2.0 value time split for pre-recorded remote content */ export interface PodcastValueTimeSplit { /** Start time in seconds within the episode */ startTime: number /** Duration in seconds of this split */ duration: number /** Start time within the remote item, in seconds */ remoteStartTime: number /** Percentage of the payment routed to this split */ remotePercentage: number /** Payment recipients for this split */ recipients: Array /** Remote item this split routes payment to, if any */ remoteItem?: PodcastRemoteItem } /** Source reference (for entries) */ export interface Source { /** Source title */ title?: string /** Primary source URL for RSS `` (RSS-only) */ href?: string /** Primary source URL for Atom `` (Atom-only) */ link?: string /** Source author flat string (Atom ``) */ author?: string /** Source ID */ id?: string /** All links from the source element */ links: Array /** Last update date string (Atom ``, RFC 3339) */ updated?: string /** Rights/copyright statement (Atom ``) */ rights?: string /** Whether `` was used as the link */ guidislink?: boolean } /** Syndication module metadata (RSS 1.0) */ export interface SyndicationMeta { /** * Update period (hourly, daily, weekly, monthly, yearly) * * # Example * * "daily" with updateFrequency: 2 means the feed updates twice per day */ updatePeriod?: string /** Number of times updated per period */ updateFrequency?: string /** Base date for update schedule (ISO 8601) */ updateBase?: string } /** Tag/category */ export interface Tag { /** Tag term/label */ term: string /** Tag scheme/domain */ scheme?: string /** Human-readable tag label */ label?: string } /** Text construct with metadata */ export interface TextConstruct { /** Text content */ value: string /** Content type ("text", "html", "xhtml") */ type: string /** Content language */ language?: string /** Base URL for relative links */ base?: string } /** RSS 2.0 text input form */ export interface TextInput { /** Text input field label */ title?: string /** Text input field description */ description?: string /** Text input field name (for form submission) */ name?: string /** URL to submit the text input to */ link?: string }