leagueofcomicgeeks
Version:
Unofficial Node.js library for interacting with League of Comic Geeks
83 lines (68 loc) • 2.46 kB
JavaScript
const _ = require('lodash');
const cheerio = require('cheerio');
const moment = require('moment');
const config = require('../../config');
const convertToISO8601Date = function (dateString) {
if (_.isEmpty(dateString)) return '';
const date = moment(dateString, 'MMM Do, YYYY');
if (!date.isValid()) return '';
return date.format('YYYY-MM-DD');
};
const sortList = function (list, sortBy = 'asc') {
if (sortBy === 'asc' || sortBy === 'desc') {
return _.orderBy(list, 'name', sortBy);
}
return list;
};
const seriesExtractor = function (response, options) {
const $ = cheerio.load(response.list);
const extractSeriesData = function () {
const $name = $(this).find('.name a');
const cover = $(this).find('.cover img').attr('data-original');
const publisher = $(this).find('.publisher').text().trim();
const count = parseInt($(this).find('.details').text().trim(), 10);
const series = $(this).find('.series').text().trim();
return {
id: $name.attr('data-id'),
name: $name.text().trim(),
cover: config.rootUrl + cover,
publisher,
count,
series
};
};
return sortList($('li').map(extractSeriesData).get(), options.sort);
};
const issueExtractor = function (response, options) {
const $ = cheerio.load(response.list);
const extractIssueData = function () {
const id = $(this).attr('id').replace('comic-', '').trim();
const name = $(this).find('.comic-title').text().trim();
const cover = $(this).find('.comic-cover-art img').attr('data-original');
const comicDetails = $(this).find('.comic-details').text().split('·');
const publisher = (comicDetails[0] || '').trim();
const releaseDate = convertToISO8601Date((comicDetails[1] || '').trim());
const price = (comicDetails[2] || '').trim();
const $description = $(this).find('.comic-description p');
$description.find('a').remove();
const description = $description.text().trim();
return {
id,
name,
cover: config.rootUrl + cover,
publisher,
description,
releaseDate,
price
};
};
return sortList($('li').map(extractIssueData).get(), options.sort);
};
const extractionHandler = {
series: seriesExtractor,
issue: issueExtractor
};
module.exports = function (response, options) {
const handler = extractionHandler[options.type] || extractionHandler[config.defaultType];
return handler(response, options);
};