sfcinemacity
Version:
Module to get showtimes from the SF Cinema booking system.
71 lines (63 loc) • 2.18 kB
JavaScript
const puppeteer = require('puppeteer');
const getShowtimes = async (movieTheatreId, dayOffset = 0) => {
const browser = await puppeteer.launch({
slowMo: 110,
headless: true,
args: ['--no-sandbox']
});
const page = await browser.newPage();
try {
/* Go to the IMDB Movie page and wait for it to load */
await page.goto(
`https://www.sfcinemacity.com/showtime/cinema/${movieTheatreId}`,
{ waitUntil: 'networkidle0' } // wait until all content is loaded, especially the JS
);
// choose English
await page.click('.lang-switcher li:nth-of-type(2) a');
const dataSelector = `[data-slick-index="${dayOffset}"]`;
await page.waitFor(dataSelector);
// choose the day we want to extract
await page.click(dataSelector);
const movieTheatreData = await page.evaluate(() => {
const movies = [];
document.querySelectorAll('.showtime-box').forEach(movieElement => {
const cinemas = [];
movieElement
.querySelectorAll('.showtime-item')
.forEach(showtimeElement => {
cinemas.push({
language: showtimeElement
.querySelector('.right-section .list-item')
.innerText.trim(),
times: showtimeElement
.querySelector('.time-list')
.innerText.replace(/\n/g, ',')
});
});
movies.push({
movieTitle: movieElement.querySelector('.movie-detail .name')
.innerText,
rating: movieElement
.querySelector('.movie-detail .movie-detail-list .list-item')
.innerText.substring(6),
cinemas
});
});
return {
date: document.querySelector('.slick-slide .selected .date').innerText,
movieTheatreName: document.querySelector('.showtime-cinema-name')
.innerText,
movies
};
});
movieTheatreData.movieTheatreId = movieTheatreId;
await browser.close();
return movieTheatreData;
} catch (err) {
await browser.close();
throw `Error scraping movie data from SF Cinema City: ${err}`;
}
};
module.exports = {
getShowtimes
};