better-ani-scraped 1.2.8 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-ani-scraped",
3
- "version": "1.2.8",
3
+ "version": "1.3.0",
4
4
  "description": "Scrape anime data from different sources (only anime-sama.fr for the moment)",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,10 +1,15 @@
1
1
  import axios from "axios";
2
2
  import * as cheerio from "cheerio";
3
3
  import fs from "fs";
4
- import puppeteer from'puppeteer';
4
+ import path from 'path';
5
+ import { exec } from 'child_process';
6
+ import { promisify } from 'util';
7
+
5
8
 
6
9
  const BASE_URL = "https://anime-sama.fr";
7
10
  const CATALOGUE_URL = `${BASE_URL}/catalogue`;
11
+ const execAsync = promisify(exec);
12
+
8
13
 
9
14
  function getHeaders(referer = BASE_URL) {
10
15
  return {
@@ -125,41 +130,64 @@ export async function getSeasons(animeUrl, language = "vostfr") {
125
130
  }
126
131
 
127
132
 
133
+ async function ensureChromiumInstalled() {
134
+ const basePath = path.join(
135
+ process.env.HOME || process.env.USERPROFILE,
136
+ '.cache',
137
+ 'puppeteer',
138
+ 'chrome'
139
+ );
140
+ const chromiumPath = path.join(basePath, 'win64-135.0.7049.95', 'chrome-win64', 'chrome.exe');
141
+ if (!fs.existsSync(chromiumPath)) {
142
+ console.log("📦 Téléchargement de Chromium 135.0.7049.95...");
143
+ await execAsync('npx puppeteer browsers install chrome@135.0.7049.95');
144
+ }
145
+
146
+ return chromiumPath;
147
+ }
128
148
  export async function getEpisodeTitles(animeUrl) {
129
149
  let browser;
130
150
  try {
131
- const puppeteer = await import('puppeteer');
132
- browser = await puppeteer.launch({
133
- headless: true,
134
- executablePath: puppeteer.executablePath(),
135
- args: ['--no-sandbox', '--disable-setuid-sandbox']
136
- });
137
- console.log("Chrome utilisé:", puppeteer.executablePath());
138
- const page = await browser.newPage();
139
- await page.setRequestInterception(true);
140
- page.on('request', (req) => {
141
- const blocked = ['image', 'stylesheet', 'font', 'media'];
142
- if (blocked.includes(req.resourceType())) {
143
- req.abort();
144
- } else {
145
- req.continue();
146
- }
147
- });
148
- await page.goto(animeUrl, { waitUntil: 'domcontentloaded' });
149
- await page.waitForSelector('#selectEpisodes');
150
- const titres = await page.$$eval('#selectEpisodes option', options =>
151
- options.map(o => o.textContent.trim())
152
- );
153
- return titres;
151
+ const puppeteer = await import('puppeteer');
152
+ const executablePath = await ensureChromiumInstalled();
153
+
154
+ browser = await puppeteer.launch({
155
+ headless: true,
156
+ executablePath: executablePath,
157
+ args: ['--no-sandbox', '--disable-setuid-sandbox'],
158
+ });
159
+
160
+ const page = await browser.newPage();
161
+
162
+ await page.setRequestInterception(true);
163
+ page.on('request', (req) => {
164
+ const blocked = ['image', 'stylesheet', 'font', 'media'];
165
+ if (blocked.includes(req.resourceType())) {
166
+ req.abort();
167
+ } else {
168
+ req.continue();
169
+ }
170
+ });
171
+
172
+ await page.goto(animeUrl, { waitUntil: 'domcontentloaded' });
173
+ await page.waitForSelector('#selectEpisodes');
174
+
175
+ const titres = await page.$$eval('#selectEpisodes option', options =>
176
+ options.map(o => o.textContent.trim())
177
+ );
178
+
179
+ return titres;
180
+
154
181
  } catch (error) {
155
- console.error('Erreur dans la récupération des titres:', error);
156
- return [];
182
+ console.error('Erreur dans la récupération des titres:', error);
183
+ return [];
157
184
  } finally {
158
- if (browser) await browser.close();
185
+ if (browser) await browser.close();
159
186
  }
160
187
  }
161
188
 
162
189
 
190
+
163
191
  export async function getEmbed(animeUrl, hostPriority = ["vidmoly"]) {
164
192
  const res = await axios.get(animeUrl, {
165
193
  headers: getHeaders(animeUrl.split("/").slice(0, 5).join("/")),
@@ -0,0 +1,21 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { exec } from 'child_process';
4
+ import { promisify } from 'util';
5
+
6
+ const execAsync = promisify(exec);
7
+ const REVISION = '135.0.7049.95';
8
+ const PLATFORM = 'win64'; // adapte si tu veux pour Linux/mac
9
+ const cacheDir = path.join(
10
+ process.env.LOCALAPPDATA || process.env.HOME || '',
11
+ '.cache', 'puppeteer', 'chrome', `${PLATFORM}-${REVISION}`
12
+ );
13
+ const executablePath = path.join(cacheDir, 'chrome-win64', 'chrome.exe');
14
+
15
+ export async function ensureChromiumInstalled() {
16
+ if (!fs.existsSync(executablePath)) {
17
+ console.log('📦 Téléchargement de Chromium .95...');
18
+ await execAsync(`npx puppeteer browsers install chrome@${REVISION}`);
19
+ }
20
+ return executablePath;
21
+ }