| import cliProgress from "cli-progress" |
| import { puppeteerSg } from "../utils/request/PuppeteerSg.js"; |
| import { pdfGenerator } from "../utils/io/PdfGenerator.js"; |
| import { configLoader } from "../utils/io/ConfigLoader.js"; |
| import { directoryIo } from "../utils/io/DirectoryIo.js" |
| import * as everandRegex from "../const/EverandRegex.js" |
| import { Image } from "../object/Image.js" |
| import sharp from "sharp"; |
| import axios from "axios"; |
| import fs from "fs" |
|
|
|
|
| const output = configLoader.load("DIRECTORY", "output") |
|
|
| class EverandDownloader { |
| constructor() { |
| if (!EverandDownloader.instance) { |
| EverandDownloader.instance = this |
| } |
| return EverandDownloader.instance |
| } |
|
|
| async execute(url) { |
| if (url.match(everandRegex.PODCAST_SERIES)) { |
| await this.series(url, ) |
| } else if (url.match(everandRegex.PODCAST_EPISODE)) { |
| await this.listen(`https://www.everand.com/listen/podcast/${everandRegex.PODCAST_EPISODE.exec(url)[1]}`) |
| } else if (url.match(everandRegex.PODCAST_LISTEN)) { |
| await this.listen(url) |
| } else { |
| throw new Error(`Unsupported URL: ${url}`) |
| } |
| } |
|
|
| async listen(url, isEpisode) { |
| if (typeof isEpisode === "undefined") { |
| isEpisode = true |
| } |
|
|
| const episodeId = everandRegex.PODCAST_LISTEN.exec(url)[1] |
|
|
| |
| let page = await puppeteerSg.getPage(url) |
|
|
| |
| await new Promise(resolve => setTimeout(resolve, 1000)) |
|
|
| |
| const title = await page.evaluate(() => eval('Scribd.current_doc.short_title')) |
| const audioUrl = await page.evaluate(() => document.querySelector('audio#audioplayer').src) |
| const seriesUrl = await page.evaluate(() => document.querySelector('a[href^="https://www.everand.com/podcast-show/"]').href) |
|
|
| |
| let seriesId = everandRegex.PODCAST_SERIES.exec(seriesUrl)[1] |
| let dir = `${output}/${seriesId}` |
| await directoryIo.create(dir) |
|
|
| |
| const bar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic); |
| if (isEpisode) { |
| bar.start(1, 0) |
| } |
| let path = `${dir}/${episodeId}_${title}.mp3` |
| const resp = await axios.get(audioUrl, { responseType: 'stream' }) |
| resp.data.pipe(fs.createWriteStream(path)) |
| if (isEpisode) { |
| bar.update(1) |
| bar.stop() |
| } |
|
|
| await page.close() |
| if (isEpisode) { |
| await puppeteerSg.close() |
| } |
| } |
|
|
| async series(url) { |
| const seriesId = everandRegex.PODCAST_SERIES.exec(url)[1] |
|
|
| |
| let page = await puppeteerSg.getPage(url) |
|
|
| |
| await new Promise(resolve => setTimeout(resolve, 1000)) |
|
|
| |
| const totalEpisode = await page.evaluate(() => parseInt(document.querySelector('span[data-e2e="podcast-series-header-total-episodes"]').textContent.replace("episodes", "").trim())) |
|
|
| |
| const totalPage = await page.evaluate(() => [...document.querySelectorAll('div[data-e2e="pagination"] a[aria-label^="Page"]')].at(-1).textContent) |
| const bar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic) |
| bar.start(totalEpisode, 0) |
| xx: |
| for (let i = 1; i <= totalPage; i++) { |
| await page.goto(`${url}?page=${i}&sort=desc`, { waitUntil: "load" }) |
| await new Promise(resolve => setTimeout(resolve, 1000)) |
|
|
| let episodes = await page.evaluate(() => [...document.querySelectorAll('div.breakpoint_hide.below a[data-e2e="podcast-episode-player-button"]')].map(x => x.href)) |
| for (let j = 0; j < episodes.length; j++ ) { |
| await this.listen(episodes[j], false) |
| bar.update(((i - 1) * 10) + (j + 1)) |
| break xx |
| } |
| } |
| bar.stop() |
|
|
| await page.close() |
| await puppeteerSg.close() |
| } |
| } |
|
|
| export const everandDownloader = new EverandDownloader() |