UNPKG

@zougui/furaffinity

Version:

120 lines 7.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FurAffinitySubmission = void 0; const radash_1 = require("radash"); const schema_1 = require("./schema"); const FurAffinityURL_1 = require("../FurAffinityURL"); const scraper_1 = require("../scraper"); const utils_1 = require("../utils"); class FurAffinitySubmission { constructor(scraper) { this.extractSubmissionId = (url) => { if (!FurAffinityURL_1.FurAffinityURL.checkIsValidHostName(url)) { throw new Error(`Invalid URL hostname: ${url}`); } const urlObj = new URL(url); const [viewStr, idStr] = urlObj.pathname.split('/').filter(Boolean); if (viewStr !== 'view') { throw new Error(`Invalid URL pathname: ${url}`); } const id = Number(idStr); if (!(0, radash_1.isNumber)(id)) { throw new Error(`Invalid URL ID: ${url}`); } return id; }; this.findOne = async (idOrUrl) => { const id = typeof idOrUrl === 'string' ? this.extractSubmissionId(idOrUrl) : idOrUrl; const path = `/view/${id}/`; const common = { id: scraper_1.scraperUtils.pickStaticValue(id), url: scraper_1.scraperUtils.pickStaticValue((0, utils_1.fixFaUrl)(path)), type: { selector: '#submissionImg', convert: scraper_1.scraperUtils.converter((v, element) => { return getSubmissionType(element); }), }, thumbnailUrl: scraper_1.scraperUtils.pickImage('#submissionImg', 'data-preview-src'), }; const parsed = await this.scraper.fetchAndScrape(path, { classic: Object.assign(Object.assign({}, common), { title: '#page-submission div.classic-submission-title.information > h2', contentUrl: { selector: '#page-submission', convert: scraper_1.scraperUtils.converter((v, element) => { var _a, _b, _c, _d; const imageElement = element.find("#submissionImg"); const type = getSubmissionType(imageElement); if (type === 'image') { return (0, utils_1.fixFaUrl)((_a = imageElement.attr('data-fullview-src')) !== null && _a !== void 0 ? _a : ''); } if (type === 'story') { return (0, utils_1.fixFaUrl)((_b = element.find(`#text-container ${scraper_1.selectors.stories}`).attr('href')) !== null && _b !== void 0 ? _b : ''); } if (type === 'music') { return (0, utils_1.fixFaUrl)((_c = element.find('.audio-player-container audio.audio-player').attr('href')) !== null && _c !== void 0 ? _c : ''); } if (type === 'flash') { return (0, utils_1.fixFaUrl)((_d = element.find('object').attr('data')) !== null && _d !== void 0 ? _d : ''); } }), }, authorName: `#page-submission div.classic-submission-title.information > ${scraper_1.selectors.user}`, authorUrl: scraper_1.scraperUtils.pickLink(`#page-submission div.classic-submission-title.information > ${scraper_1.selectors.user}`), authorAvatar: scraper_1.scraperUtils.pickImage(`#page-submission div.classic-submissiont-title.avatar ${scraper_1.selectors.user} > img`), descriptionText: '#page-submission > table > tbody > tr:nth-child(1) > td > table > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(2) > td', descriptionHtml: scraper_1.scraperUtils.pickHtml('#page-submission > table > tbody > tr:nth-child(1) > td > table > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(2) > td'), postedAt: scraper_1.scraperUtils.pickDateFromSpan('#page-submission td.stats-container span.popup_date'), rating: '#page-submission .stats-container > .rating > .rating-box', keywords: { listItem: '#page-submission #keywords > a', data: { value: '', }, convert: (data) => data.value, } }), beta: Object.assign(Object.assign({}, common), { title: '#submission_page div.submission-title p', contentUrl: { selector: '#submission_page', convert: scraper_1.scraperUtils.converter((v, element) => { var _a, _b, _c, _d; const imageElement = element.find("#submissionImg"); const type = getSubmissionType(imageElement); if (type === 'image') { return (0, utils_1.fixFaUrl)((_a = imageElement.attr('data-fullview-src')) !== null && _a !== void 0 ? _a : ''); } if (type === 'story') { return (0, utils_1.fixFaUrl)((_b = element.find(`.submission-content ${scraper_1.selectors.stories}`).attr('href')) !== null && _b !== void 0 ? _b : ''); } if (type === 'music') { return (0, utils_1.fixFaUrl)((_c = element.find('.audio-player-container audio.audio-player').attr('href')) !== null && _c !== void 0 ? _c : ''); } if (type === 'flash') { return (0, utils_1.fixFaUrl)((_d = element.find('object').attr('data')) !== null && _d !== void 0 ? _d : ''); } }), }, authorName: `#submission_page .submission-id-container ${scraper_1.selectors.user}`, authorUrl: scraper_1.scraperUtils.pickLink(`#submission_page .submission-id-container ${scraper_1.selectors.user}`), authorAvatar: scraper_1.scraperUtils.pickImage(`#submission_page .submission-id-avatar ${scraper_1.selectors.user} > img`), descriptionText: '#submission_page div.submission-description', descriptionHtml: scraper_1.scraperUtils.pickHtml('#submission_page div.submission-description'), postedAt: scraper_1.scraperUtils.pickDateFromSpan('#submission_page .submission-id-container span.popup_date'), rating: '#submission_page .stats-container > .rating > .rating-box', keywords: { listItem: '#submission_page div.submission-sidebar section.tags-row > span.tags > a', data: { value: '', }, convert: (data) => data.value, } }), }); return schema_1.internalSubmissionSchema.parse(parsed); }; this.scraper = scraper; } } exports.FurAffinitySubmission = FurAffinitySubmission; const getSubmissionType = (element) => { if (element.attr('src')) { const src = element.attr('src'); if (src.includes('/stories/') || src.includes('poetry')) { return 'story'; } if (src.includes('/music/')) { return 'music'; } return 'image'; } else { // probably flash const obj = element.find('object'); if (obj) { return 'flash'; } } return 'unknown'; }; //# sourceMappingURL=FurAffinitySubmission.js.map