@zougui/furaffinity
Version:
120 lines • 7.7 kB
JavaScript
;
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