From 71c1f32a124529fa5db177986bbfdc30c10fcc8a Mon Sep 17 00:00:00 2001 From: WendySBlanc <74413875+WendySBlanc@users.noreply.github.com> Date: Fri, 15 May 2026 15:54:33 +0200 Subject: [PATCH 1/5] Add files via upload --- plugins/french/novelfrance.ts | 223 ++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 plugins/french/novelfrance.ts diff --git a/plugins/french/novelfrance.ts b/plugins/french/novelfrance.ts new file mode 100644 index 000000000..548722fb7 --- /dev/null +++ b/plugins/french/novelfrance.ts @@ -0,0 +1,223 @@ +import { fetchApi, fetchFile } from "@libs/fetch"; +import { Plugin } from "@typings/plugin"; +import { Filters } from "@libs/filterInputs"; +import { load as parseHTML } from "cheerio"; + +class NovelFrance implements Plugin.PluginBase { + id = "novelfrance.fr"; + name = "NovelFrance"; + icon = "src/fr/novelfrance/icon.png"; + site = "https://novelfrance.fr"; + version = "1.0.0"; + filters: Filters | undefined = undefined; + + async popularNovels( + page: number, + { showLatestNovels }: Plugin.PopularNovelsOptions, + ): Promise { + const sort = showLatestNovels ? "newest" : "popular"; + const url = `${this.site}/browse?sort=${sort}&page=${page}`; + const body = await fetchApi(url).then((res) => res.text()); + const $ = parseHTML(body); + + const novels: Plugin.NovelItem[] = []; + + $("a[href*='/novel/']").each((_, el) => { + const href = $(el).attr("href") || ""; + if (!href.includes("/novel/") || href.includes("/chapter")) return; + + const name = + $(el).find("h2, h3, [class*='title'], .name").first().text().trim() || + $(el).find("img").attr("alt")?.trim() || + $(el).attr("aria-label")?.trim() || + ""; + + if (!name) return; + + const cover = + $(el).find("img").attr("src") || + $(el).find("img").attr("data-src") || + ""; + + const path = href.startsWith("http") + ? href.replace(this.site, "") + : href; + + novels.push({ name, cover, path }); + }); + + // Dédoublonnage par path + const seen = new Set(); + return novels.filter((n) => { + if (seen.has(n.path)) return false; + seen.add(n.path); + return true; + }); + } + + async parseNovel(novelPath: string): Promise { + const body = await fetchApi(this.site + novelPath).then((r) => r.text()); + const $ = parseHTML(body); + + const novel: Plugin.SourceNovel = { + path: novelPath, + name: "", + }; + + // Titre + novel.name = + $("h1").first().text().trim() || + $("meta[property='og:title']").attr("content")?.trim() || + ""; + + // Couverture + novel.cover = + $("meta[property='og:image']").attr("content") || + $(".novel-cover img, .cover img, [class*='cover'] img").first().attr("src") || + ""; + + // Résumé + novel.summary = + $("[class*='description'], [class*='synopsis'], .summary") + .first() + .text() + .trim() || + $("meta[name='description']").attr("content") || + ""; + + // Auteur + novel.author = $("[class*='author'] a, [class*='author'] span") + .first() + .text() + .trim(); + + // Statut + const statusText = $("[class*='status']").first().text().toLowerCase(); + if (statusText.includes("complet") || statusText.includes("terminé")) { + novel.status = "Completed"; + } else if (statusText.includes("en cours") || statusText.includes("ongoing")) { + novel.status = "Ongoing"; + } else if (statusText.includes("pausé") || statusText.includes("hiatus")) { + novel.status = "Hiatus"; + } + + // Genres + novel.genres = $("[class*='genre'] a, [class*='tag'] a, .tags a") + .map((_, el) => $(el).text().trim()) + .get() + .filter(Boolean) + .join(", "); + + // Chapitres + const chapters: Plugin.ChapterItem[] = []; + + $("a[href*='/chapter-'], a[href*='/chapitre-']").each((i, el) => { + const href = $(el).attr("href") || ""; + if (!href) return; + + const path = href.startsWith("http") ? href.replace(this.site, "") : href; + + const name = + $(el).text().trim() || + `Chapitre ${i + 1}`; + + const numMatch = href.match(/chapter-(\d+(?:\.\d+)?)/i) || + href.match(/chapitre-(\d+(?:\.\d+)?)/i); + const chapterNumber = numMatch ? parseFloat(numMatch[1]) : i + 1; + + const releaseTime = + $(el).closest("li, [class*='chapter']") + .find("time, [class*='date']") + .attr("datetime") || + $(el).closest("li, [class*='chapter']") + .find("time, [class*='date']") + .text() + .trim() || + ""; + + chapters.push({ name, path, releaseTime, chapterNumber }); + }); + + // Tri croissant + chapters.sort((a, b) => (a.chapterNumber ?? 0) - (b.chapterNumber ?? 0)); + novel.chapters = chapters; + + return novel; + } + + async parseChapter(chapterPath: string): Promise { + const body = await fetchApi(this.site + chapterPath).then((r) => r.text()); + const $ = parseHTML(body); + + // Sélecteurs courants pour le contenu + const selectors = [ + ".chapter-content", + "#chapter-content", + "[class*='chapter-body']", + "[class*='chapter-text']", + ".prose", + "article .prose", + "article", + ]; + + let content = ""; + for (const sel of selectors) { + const el = $(sel).first(); + if (el.length) { + // Supprimer les éléments parasites + el.find("script, style, nav, header, footer, aside, [class*='ad'], [class*='banner'], [class*='comment']").remove(); + content = el.html() || ""; + break; + } + } + + return content || "

Contenu introuvable.

"; + } + + async searchNovels( + searchTerm: string, + page: number, + ): Promise { + const url = `${this.site}/browse?search=${encodeURIComponent(searchTerm)}&page=${page}`; + const body = await fetchApi(url).then((res) => res.text()); + const $ = parseHTML(body); + + const novels: Plugin.NovelItem[] = []; + + $("a[href*='/novel/']").each((_, el) => { + const href = $(el).attr("href") || ""; + if (!href.includes("/novel/") || href.includes("/chapter")) return; + + const name = + $(el).find("h2, h3, [class*='title'], .name").first().text().trim() || + $(el).find("img").attr("alt")?.trim() || + ""; + + if (!name) return; + + const cover = + $(el).find("img").attr("src") || + $(el).find("img").attr("data-src") || + ""; + + const path = href.startsWith("http") + ? href.replace(this.site, "") + : href; + + novels.push({ name, cover, path }); + }); + + const seen = new Set(); + return novels.filter((n) => { + if (seen.has(n.path)) return false; + seen.add(n.path); + return true; + }); + } + + async fetchImage(url: string): Promise { + return fetchFile(url); + } +} + +export default new NovelFrance(); From 0e8873870f578109ef770d063bd8b2f5a9583da4 Mon Sep 17 00:00:00 2001 From: WendySBlanc <74413875+WendySBlanc@users.noreply.github.com> Date: Fri, 15 May 2026 16:01:17 +0200 Subject: [PATCH 2/5] Add files via upload --- src/fr/novelfrance/favicon.ico | Bin 0 -> 7062 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/fr/novelfrance/favicon.ico diff --git a/src/fr/novelfrance/favicon.ico b/src/fr/novelfrance/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9ce38b163b6144cb40a603a94bd41b8630937001 GIT binary patch literal 7062 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 Date: Fri, 15 May 2026 16:13:47 +0200 Subject: [PATCH 3/5] Create build.yml --- .github/workflows/build.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..4a4cd92b8 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,33 @@ +name: Build Plugins + +on: + push: + branches: + - master + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install dependencies + run: npm install + + - name: Build plugins + run: npm run build + + - name: Deploy to plugins branch + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_branch: plugins + publish_dir: ./.dist + destination_dir: v3.0.0/.dist From 3d2f0f253f0158252f2a5fdd2d16233d637ad22f Mon Sep 17 00:00:00 2001 From: WendySBlanc <74413875+WendySBlanc@users.noreply.github.com> Date: Fri, 15 May 2026 16:16:02 +0200 Subject: [PATCH 4/5] Update GitHub Actions workflow for building and deploying Updated GitHub Actions workflow to use newer versions of actions and added steps for installing dependencies, building plugins, and deploying to the plugins branch. --- .github/workflows/build.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4a4cd92b8..57811bc80 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,5 +1,37 @@ name: Build Plugins +on: + push: + branches: + - master + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install dependencies + run: npm install + + - name: Build plugins + run: npm run build + + - name: Deploy to plugins branch + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_branch: plugins + publish_dir: ./.dist + destination_dir: v3.0.0/.distname: Build Plugins + on: push: branches: From 107b02d21ea36a3e4317e0db81684c2e7762dca4 Mon Sep 17 00:00:00 2001 From: WendySBlanc <74413875+WendySBlanc@users.noreply.github.com> Date: Fri, 15 May 2026 16:20:30 +0200 Subject: [PATCH 5/5] Update build.yml --- .github/workflows/build.yml | 35 +++-------------------------------- 1 file changed, 3 insertions(+), 32 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57811bc80..0751eeb57 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,40 +21,11 @@ jobs: - name: Install dependencies run: npm install - - name: Build plugins - run: npm run build - - - name: Deploy to plugins branch - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_branch: plugins - publish_dir: ./.dist - destination_dir: v3.0.0/.distname: Build Plugins - -on: - push: - branches: - - master - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Install dependencies - run: npm install + - name: Check available scripts + run: npm run - name: Build plugins - run: npm run build + run: npx ts-node scripts/build.ts || npx vite build || npx tsc || npm run generate || npm run compile || echo "No build script found" - name: Deploy to plugins branch uses: peaceiris/actions-gh-pages@v3