タイトル
*OPEN / START
HH:MM / HH:MM
ADV / DOOR
¥XXXX / ¥XXXX
/** * 吉祥寺 WARP — http://warp.rinky.info/schedules * * WordPress カスタムテーマ。年月は: *
OPEN / START
HH:MM / HH:MM
ADV / DOOR
¥XXXX / ¥XXXX
contains OPEN/START times const $notes = $el.find("section.notes-wrapper p"); const timeStrong = $notes.eq(0).find("span.strong").text().trim(); // e.g. "18:30 / 19:00" const [openTime, startTime] = timeStrong.split("/").map((s) => s.trim()); // Second
contains ADV/DOOR price const priceStrong = $notes.eq(1).find("span.strong").text().trim(); // e.g. "¥3,000 / ¥3,500" const price = priceStrong !== "TBA / TBA" && priceStrong ? priceStrong : null; // Image: prefer data-src (lazy), fall back to noscript img src const $flyer = $el.find("section.flyer img").first(); const rawImg = $flyer.attr("data-src") ?? $el.find("section.flyer noscript img").first().attr("src") ?? null; // Strip ShortPixel CDN prefix if present const imageUrl = rawImg ? rawImg.replace(/^https?:\/\/sp-ao\.shortpixel\.ai\/client\/[^/]+\//, "") : null; events.push({ venue_id: venue.id, title, artist: null, date, open_time: isTime(openTime) ? openTime : null, start_time: isTime(startTime) ? startTime : null, price, ticket_url: $el.find("a[href*='livepocket'], a[href*='eplus'], a[href*='pia']").first().attr("href") ?? null, image_url: imageUrl, source_url: null, }); }); return events; }, }; function isTime(s: string | undefined): boolean { return !!s && /^\d{2}:\d{2}$/.test(s.trim()); }