UNPKG

rsshub

Version:
104 lines (102 loc) 4.05 kB
import "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { i as toTitleCase } from "./common-utils-vrWQFAEk.mjs"; import { load } from "cheerio"; //#region lib/routes/eventbrite/events.ts const route = { path: "/:region/:eventType?/:includePromoted?", categories: ["other"], example: "/eventbrite/canada--toronto/all-events", parameters: { eventType: "category of events for filtering", region: "Region or scope of events" }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["eventbrite.com/d/:region/:eventType"], target: "/:region/:eventType" }, { source: ["eventbrite.ca/d/:region/:eventType"], target: "/:region/:eventType" }], name: "Events", maintainers: ["elibroftw"], handler: async (ctx) => { const params = ctx.req.param(); const { region, includePromoted = "false" } = params; let eventType = params.eventType || "all-events"; if (eventType === "events") eventType = "all-events"; const link = `https://www.eventbrite.com/d/${region}/${eventType}/`; const $ = load(await ofetch_default(link)); const eventsApiUrl = new URL("https://www.eventbrite.com/api/v3/destination/events"); const includePromotedBool = includePromoted !== "false"; const eventListEl = $("div.search-results-panel-content section>ul>li").toArray().filter((item) => includePromotedBool || !$(item).text().includes("Promoted")); const eventIds = eventListEl.map((item) => $(item).find("a.event-card-link").first().attr("data-event-id")); eventsApiUrl.searchParams.append("event_ids", eventIds.join(",")); eventsApiUrl.searchParams.append("page_size", eventIds.length.toString()); eventsApiUrl.searchParams.append("expand", "image,primary_venue,ticket_availability,primary_organizer"); const eventsData = (await ofetch_default(eventsApiUrl.href)).events; const items = eventListEl.map((item, index) => { const el = $(item); const a = el.find(".event-card-details a.event-card-link").first(); const fallbackTitle = a.attr("aria-label") || a.text() || a.html(); const eventData = eventsData[index]; if (eventData === void 0) { const pElements = el.find("p"); return { title: fallbackTitle, author: pElements.length > 1 ? $(pElements[1]).text() : void 0 }; } return { title: el.text().includes("Promoted") ? `${eventData.name} (Promoted)` : eventData.name, link: eventData.url, pubDate: parseDate(eventData.published), author: eventData.primary_organizer === void 0 ? JSON.stringify(eventData) : eventData.primary_organizer.name, category: eventData.tags.map((tag) => tag.display_name), image: eventData.image.original.url, description: eventData.summary, id: eventData.eventbrite_event_id, content: { html: `${eventDate(eventData)}<br>${getAuthor(eventData)}<br>${getTicketPriceRange(eventData)}`, text: "" } }; }); return { title: `${toTitleCase(eventType.replaceAll("-", " "))} in ${toTitleCase(region.replaceAll("-", " "))}`, link, item: items }; } }; function getAuthor(event) { return `<a href="${event.primary_organizer.url}">${event.primary_organizer.name}</a>`; } function getTicketPriceRange(event) { const minPrice = event.ticket_availability.minimum_ticket_price.display; const maxPrice = event.ticket_availability.maximum_ticket_price.display; if (minPrice === maxPrice) return minPrice; return `${minPrice} - ${maxPrice}`; } function eventDate(event) { const endDate = event.end_date; const startDate = event.start_date; const startTime = event.start_time; const endTime = event.end_time; if (startDate === endDate) return `${startDate} ${startTime} - ${endTime}`; return `${startDate} ${startTime} - ${endDate} ${endTime}`; } //#endregion export { route };