From 434f879cab6b4130f4c515637ae226660b495cdf Mon Sep 17 00:00:00 2001 From: Hiirbaf <42479509+Hiirbaf@users.noreply.github.com> Date: Thu, 12 Mar 2026 03:31:32 -0300 Subject: [PATCH 1/4] Add files via upload --- public/static/src/es/icon.png | Bin 0 -> 15086 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/static/src/es/icon.png diff --git a/public/static/src/es/icon.png b/public/static/src/es/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7c70fbfdd99bdbbce52c6796256873727ab450cc GIT binary patch literal 15086 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 literal 0 HcmV?d00001 From 260fa9b4d8b6b8bd53d1289b85dc235919af9480 Mon Sep 17 00:00:00 2001 From: Hiirbaf <42479509+Hiirbaf@users.noreply.github.com> Date: Thu, 12 Mar 2026 03:33:18 -0300 Subject: [PATCH 2/4] Rename public/static/src/es/icon.png to public/static/src/es/NOVA/icon.png --- public/static/src/es/{ => NOVA}/icon.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename public/static/src/es/{ => NOVA}/icon.png (100%) diff --git a/public/static/src/es/icon.png b/public/static/src/es/NOVA/icon.png similarity index 100% rename from public/static/src/es/icon.png rename to public/static/src/es/NOVA/icon.png From 198b89ebe2ed3b9264430006b9fa2b3e71c12bc7 Mon Sep 17 00:00:00 2001 From: Hiirbaf <42479509+Hiirbaf@users.noreply.github.com> Date: Thu, 12 Mar 2026 03:36:18 -0300 Subject: [PATCH 3/4] Rename icon.png to icon.png --- public/static/src/es/{NOVA => nova}/icon.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename public/static/src/es/{NOVA => nova}/icon.png (100%) diff --git a/public/static/src/es/NOVA/icon.png b/public/static/src/es/nova/icon.png similarity index 100% rename from public/static/src/es/NOVA/icon.png rename to public/static/src/es/nova/icon.png From 8c9d14aedf24611e3d3156aa1af239e7b9fbce82 Mon Sep 17 00:00:00 2001 From: Hiirbaf <42479509+Hiirbaf@users.noreply.github.com> Date: Thu, 12 Mar 2026 03:38:07 -0300 Subject: [PATCH 4/4] Create NOVA.ts --- plugins/spanish/NOVA.ts | 261 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 plugins/spanish/NOVA.ts diff --git a/plugins/spanish/NOVA.ts b/plugins/spanish/NOVA.ts new file mode 100644 index 000000000..c85833789 --- /dev/null +++ b/plugins/spanish/NOVA.ts @@ -0,0 +1,261 @@ +import { fetchApi } from "@libs/fetch"; +import { Plugin } from "@typings/plugin"; +import { NovelStatus } from "@libs/novelStatus"; +import * as cheerio from "cheerio"; + +class NovaPlugin implements Plugin.PluginBase { + id = 'nova'; + name = 'NOVA'; + icon = 'src/es/nova/icon.png'; + site = 'https://novelasligeras.net'; + version = '1.1.0'; + + // Regex para parsear títulos de capítulos + private readonly CHAPTER_REGEX = /(Parte \d+) . (.+?): (.+)/; + + // Helper para bypass de imágenes de Cloudflare + private async bypassCloudflareImages( + $: cheerio.CheerioAPI, + $content: cheerio.Cheerio + ): Promise { + $content.find('img').each((i, img) => { + const $img = $(img); + let src = $img.attr('src') || $img.attr('data-src') || $img.attr('data-cfsrc'); + + if (src) { + // Si la imagen tiene atributos de Cloudflare, usar la URL directa + $img.attr('src', src); + $img.removeAttr('data-src'); + $img.removeAttr('data-cfsrc'); + } + }); + + return $content.html() || ''; + } + + // Helper para convertir HTML a texto limpio (si es necesario) + private htmlToText(html: string | null | undefined): string { + if (!html) return ''; + const $ = cheerio.load(html); + $('script, style').remove(); + return $.text().trim(); + } + + // Método para obtener novelas populares + async popularNovels( + pageNo: number, + options: Plugin.PopularNovelsOptions + ): Promise { + // Para la primera página, usar la búsqueda AJAX + if (pageNo === 1) { + return this.searchNovels('', 1); + } + + // Para páginas siguientes, usar la paginación normal + const url = `${this.site}/index.php/page/${pageNo}/?post_type=product&orderby=popularity`; + const body = await fetchApi(url).then(res => res.text()); + const $ = cheerio.load(body); + + const novels: Plugin.NovelItem[] = []; + + $('.dt-css-grid div.wf-cell').each((i, element) => { + const $el = $(element); + const $img = $el.find('img'); + const $link = $el.find('h4.entry-title a'); + + const path = $link.attr('href')?.replace(this.site, '') || ''; + const name = $link.text().trim(); + const cover = $img.attr('data-src') || $img.attr('data-cfsrc') || $img.attr('src') || ''; + + if (name && path) { + novels.push({ name, path, cover }); + } + }); + + return novels; + } + + // Método para buscar novelas + async searchNovels( + searchTerm: string, + pageNo: number + ): Promise { + const novels: Plugin.NovelItem[] = []; + + if (pageNo > 1) { + // Búsqueda paginada normal + const encodedTerm = encodeURIComponent(searchTerm); + const url = `${this.site}/index.php/page/${pageNo}/?s=${encodedTerm}&post_type=product&title=1&excerpt=1&content=0&categories=1&attributes=1&tags=1&sku=0&orderby=popularity&ixwps=1`; + + const body = await fetchApi(url).then(res => res.text()); + const $ = cheerio.load(body); + + $('.dt-css-grid div.wf-cell').each((i, element) => { + const $el = $(element); + const $img = $el.find('img'); + const $link = $el.find('h4.entry-title a'); + + const path = $link.attr('href')?.replace(this.site, '') || ''; + const name = $link.text().trim(); + const cover = $img.attr('data-src') || $img.attr('data-cfsrc') || $img.attr('src') || ''; + + if (name && path) { + novels.push({ name, path, cover }); + } + }); + } else { + // Primera página: usar búsqueda AJAX + const url = `${this.site}/wp-admin/admin-ajax.php?tags=1&sku=&limit=30&category_results=&order=DESC&category_limit=5&order_by=title&product_thumbnails=1&title=1&excerpt=1&content=&categories=1&attributes=1`; + + const formData = new FormData(); + formData.append('action', 'product_search'); + formData.append('product-search', '1'); + formData.append('product-query', searchTerm); + + const response = await fetchApi(url, { + method: 'POST', + body: formData + }); + + const data = await response.json(); + + if (Array.isArray(data)) { + data.forEach(novel => { + const path = novel.url?.replace(this.site, '') || ''; + const name = novel.title || ''; + const cover = novel.thumbnail || ''; + + if (name && path) { + novels.push({ name, path, cover }); + } + }); + } + } + + return novels; + } + + // Método para obtener detalles de una novela + async parseNovel(novelPath: string): Promise { + const url = `${this.site}${novelPath}`; + const body = await fetchApi(url).then(res => res.text()); + const $ = cheerio.load(body); + + // Extraer información básica + const name = $('h1').first().text().trim(); + const $coverImg = $('.woocommerce-product-gallery').find('img').first(); + const cover = $coverImg.attr('src') || $coverImg.attr('data-cfsrc') || $coverImg.attr('data-src') || ''; + + // Extraer autor, artista + const author = $('.woocommerce-product-attributes-item--attribute_pa_escritor td') + .text().trim() || 'Desconocido'; + const artist = $('.woocommerce-product-attributes-item--attribute_pa_ilustrador td') + .text().trim() || ''; + + // Extraer resumen + const summaryHtml = $('.woocommerce-product-details__short-description').html(); + const summary = this.htmlToText(summaryHtml); + + // Determinar estado + const statusText = $('.woocommerce-product-attributes-item--attribute_pa_estado td') + .text().trim().toLowerCase(); + let status = NovelStatus.Unknown; + if (statusText.includes('en curso') || statusText.includes('ongoing')) { + status = NovelStatus.Ongoing; + } else if (statusText.includes('completado') || statusText.includes('completed')) { + status = NovelStatus.Completed; + } + + // Extraer capítulos + const chapters: Plugin.ChapterItem[] = []; + let chapterIndex = 0; + + $('.vc_row div.vc_column-inner > div.wpb_wrapper').each((i, element) => { + const $el = $(element); + const volume = $el.find('.dt-fancy-title').first().text().trim(); + + if (!volume.startsWith('Volumen')) { + return; + } + + $el.find('.wpb_tab a').each((j, chapterEl) => { + const $chapter = $(chapterEl); + const chapterPartName = $chapter.text().trim(); + const chapterPath = $chapter.attr('href')?.replace(this.site, '') || ''; + + if (!chapterPath) return; + + const match = this.CHAPTER_REGEX.exec(chapterPartName); + let chapterName: string; + + if (match) { + const [, part, chapter, name] = match; + chapterName = `${volume} - ${chapter} - ${part}: ${name}`; + } else { + chapterName = `${volume} - ${chapterPartName}`; + } + + chapters.push({ + name: chapterName, + path: chapterPath, + releaseTime: '', + chapterNumber: chapterIndex + 1 + }); + + chapterIndex++; + }); + }); + + const novel: Plugin.SourceNovel = { + path: novelPath, + name, + cover, + summary, + author, + artist, + status, + chapters + }; + + return novel; + } + + // Método para obtener contenido del capítulo + async parseChapter(chapterPath: string): Promise { + const url = `${this.site}${chapterPath}`; + const body = await fetchApi(url).then(res => res.text()); + const $ = cheerio.load(body); + + // Determinar el selector correcto basado en el contenido + let $chapterText: cheerio.Cheerio; + + if (body.includes('Nadie entra sin permiso en la Gran Tumba de Nazarick')) { + $chapterText = $('#content'); + } else { + $chapterText = $('.wpb_text_column.wpb_content_element > .wpb_wrapper'); + } + + // Remover anuncios y elementos no deseados + $chapterText.find('center').remove(); + + // Convertir elementos con text-align center a tags
+ $chapterText.find('*').each((i, el) => { + const $el = $(el); + const style = $el.attr('style') || ''; + if (/text-align:.?center/.test(style)) { + $el.replaceWith(`
${$el.html()}
`); + } + }); + + // Aplicar bypass de imágenes de Cloudflare + let chapterContent = await this.bypassCloudflareImages($, $chapterText); + + // Limpiar scripts, estilos y otros elementos innecesarios + const $clean = cheerio.load(chapterContent); + $clean('script, style, iframe, .ads, .advertisement').remove(); + + return $clean.html() || chapterContent; + } +} + +export default new NovaPlugin();