eksisozluk-api
Version:
Latest unofficial eksisozluk api
96 lines (88 loc) • 3.83 kB
JavaScript
const axios = require('axios');
const cheerio = require('cheerio');
const URLS = require('../../constant/urls');
// const errors = require('../../constant/errors');
const config = require('../../config');
const INFO = require('../../constant/info');
const parseEntryDateTime = require('../../utils/entry/parseEntryDateTime');
module.exports = async (slug, page = 1) => {
let response;
try {
response = await axios.get(`${URLS.BASE}/${encodeURIComponent(slug)}?p=${page}`);
} catch (err) {
return { error: err.message };
}
if (response.request.path !== `/${slug}?p=${page}`) {
response.request.path = response.request.path.split('?')[0] // discard any parameters
console.info(`/api/topic/${slug}/${page} --> /api/topic${response.request.path}/${page}`);
if (config.topic.allowRedirect) {
console.info(INFO.TOPIC.REDIRECTING);
return { redirect: `/api/topic${response.request.path}/${page}` };
}
else {
console.info(INFO.TOPIC.REDIRECTING_DISABLED);
}
}
const $ = cheerio.load(response.data, { decodeEntities: false });
const title = $("#title").attr("data-title");
const topicID = parseInt($("#title").attr("data-id"));
const topicSlug = `${$("#title").attr("data-slug")}--${topicID}`;
const numberOfPages = parseInt($(".pager").attr("data-pagecount")) || 1;
const currentPage = parseInt($(".pager").attr("data-currentpage")) || 1;
const _hiddenChannels = $("#hidden-channels").text().trim().split(",") || null;
const tags = _hiddenChannels ? _hiddenChannels : null;
const disambiguations = [];
$("#disambiguations").find("ul > li").each((index, element) => {
disambiguations.push({
slug: $(element).find("a").attr("href"),
title: $(element).text()
});
});
const entries = [];
$("#entry-item-list").find("li").each((index, element) => {
const currentElement = $(element);
const id = parseInt(currentElement.attr("data-id"));
const body = currentElement.find(".content").html().trim();
const author = currentElement.attr("data-author");
const favCount = parseInt(currentElement.attr("data-favorite-count"));
const isPinned = currentElement.attr("data-ispinned") === "true";
const isPinnedOnProfile = currentElement.attr("data-ispinnedonprofile") === "true";
const inEksiSeyler = currentElement.attr("data-seyler-slug") ? true : false;
const commentCount = parseInt(currentElement.attr("data-comment-count"));
// fix to the problem stems from eksisozluk -> default picture doesn't have leading 'https:' string in the url
let authorProfilePicture = currentElement.find(".avatar").attr("src")
authorProfilePicture = authorProfilePicture.startsWith("https://") ? authorProfilePicture : `https:${authorProfilePicture}`;
const date = currentElement.find("footer > div.info > div.entry-footer-bottom > div.footer-info > div:eq(1) > a").text();
const [createdAtDate, createdAtTime, updatedAtDate, updatedAtTime] = parseEntryDateTime(date);
entries.push({
id,
title,
body,
favCount,
isPinned,
isPinnedOnProfile,
inEksiSeyler,
commentCount,
aboutAuthor: {
author,
authorProfilePicture
},
aboutDateTime: {
createdAtDate,
createdAtTime,
updatedAtDate,
updatedAtTime
}
});
});
return {
topicID,
disambiguations,
title,
topicSlug,
numberOfPages,
currentPage,
tags,
entries
};
};