Files
goodreads-book-search/lib/module.js
2025-01-18 21:26:13 +03:00

94 lines
2.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const cheerio = require("cheerio");
const extractBookPage = ($) => {
// "pagesFormat" test ID'sine sahip p etiketindeki sayıyı çıkar
const pagesText = $('[data-testid="pagesFormat"]').text();
// Metinden yalnızca rakamı almak için regex kullan
const match = pagesText.match(/\d+/); // Sadece sayıları bulur
return match ? match[0] : null; // Sayıyı döndür
};
const extractBookDate = ($) => {
const publicationDateText = $('p[data-testid="publicationInfo"]').text().replace('First published ', '').trim();
const publicationDate = new Date(publicationDateText);
const formattedDate = publicationDate.toLocaleDateString('en-GB', {
day: '2-digit',
month: 'short',
year: 'numeric'
});
return formattedDate;
};
const extractAuthorAndTranslators = ($) => {
// Yazar ve çevirmen isimlerini Set'lere ekle
const authorsSet = new Set();
const translatorsSet = new Set();
const authorLink = $('a.ContributorLink').attr('href');
$('.ContributorLink').each((index, element) => {
const name = $(element).find('.ContributorLink__name').text().trim();
const role = $(element).find('.ContributorLink__role').text().trim();
if (role.toLowerCase().includes('translator')) {
translatorsSet.add(name); // Çevirmenleri ekle
} else {
authorsSet.add({ name, profileLink: authorLink }); // Yazarları ekle
}
});
const authors = Array.from(authorsSet);
const translators = Array.from(translatorsSet);
const result = {};
if (authors.length > 0) {
result.author = authors[0]; // İlk yazar
}
if (translators.length > 0) {
result.translators = translators; // Çevirmenlerin tamamı
}
return result;
}
function extractGenreList($) {
const genres = [];
$('span.BookPageMetadataSection__genreButton').each((index, element) => {
const genre = $(element).find('.Button__labelItem').text().trim();
genres.push(genre);
});
return genres;
}
const extractBookDetails = async (html, isbn, gemini_api_key) => {
const $ = cheerio.load(html);
const title = $('h1[data-testid="bookTitle"]').text(); // OK
const thumbImage = $('meta[property="og:image"]').attr('content'); // OK
const authorName = extractAuthorAndTranslators($); // OK
const description = $('.BookPageMetadataSection__description .Formatted').text().trim(); //OK
const page = extractBookPage($);
const rate = $('.RatingStatistics__rating').first().text().trim();
const date = extractBookDate($);
const genres = extractGenreList($);
return {
title,
thumbImage,
authorName,
description,
page,
isbn,
date,
rate,
genres
};
};
module.exports = { extractBookDetails };