multporn-api-sdk 0.1.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/LICENSE +21 -0
- package/README.md +271 -0
- package/dist/index.cjs +1828 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +233 -0
- package/dist/index.d.ts +233 -0
- package/dist/index.js +1792 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/http.ts","../src/api/alphabet.ts","../src/parsers/alphabet.ts","../src/utils.ts","../src/parsers/pagination.ts","../src/api/listings.ts","../src/parsers/listing.ts","../src/parsers/sorting.ts","../src/api/posts.ts","../src/parsers/post.ts","../src/api/search.ts","../src/parsers/search.ts","../src/parsers/ajax.ts","../src/api/updates.ts","../src/parsers/viewDisplay.ts","../src/parsers/viewer.ts","../src/parsers/video.ts","../src/api/viewer.ts","../src/multporn.ts"],"sourcesContent":["import { setTimeout as sleep } from 'timers/promises';\n\nexport type RetryPolicy = {\n retries: number;\n factor: number;\n minDelayMs: number;\n maxDelayMs: number;\n retryOn: (status?: number) => boolean;\n};\n\nexport const defaultRetryPolicy: RetryPolicy = {\n retries: 2,\n factor: 2,\n minDelayMs: 300,\n maxDelayMs: 3000,\n retryOn: (status) => {\n if (status == null) return true;\n return status >= 500 && status <= 599;\n },\n};\n\nexport class HttpError extends Error {\n constructor(\n message: string,\n public status?: number,\n ) {\n super(message);\n this.name = 'HttpError';\n }\n}\n\nexport type HttpClientOptions = {\n baseURL: string;\n headers?: Record<string, string>;\n timeoutMs?: number;\n retry?: Partial<RetryPolicy>;\n userAgent?: string;\n};\n\nexport class HttpClient {\n private baseURL: string;\n private headers: Record<string, string>;\n private timeoutMs: number;\n private retry: RetryPolicy;\n private userAgent: string;\n\n constructor(opts: HttpClientOptions) {\n this.baseURL = opts.baseURL.replace(/\\/+$/, '');\n this.headers = opts.headers ?? {};\n this.timeoutMs = opts.timeoutMs ?? 15000;\n this.retry = { ...defaultRetryPolicy, ...(opts.retry ?? {}) };\n this.userAgent =\n opts.userAgent ??\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118 Safari/537.36';\n }\n\n private buildURL(pathOrUrl: string) {\n try {\n return new URL(pathOrUrl).toString();\n } catch {\n return new URL(pathOrUrl.replace(/^\\//, ''), this.baseURL + '/').toString();\n }\n }\n\n async getHtml(pathOrUrl: string, attempt = 0): Promise<string> {\n const url = this.buildURL(pathOrUrl);\n const ctrl = new AbortController();\n const id = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, {\n method: 'GET',\n headers: {\n 'User-Agent': this.userAgent,\n Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',\n ...this.headers,\n },\n signal: ctrl.signal,\n });\n clearTimeout(id as any);\n if (!res.ok) {\n if (this.retry.retryOn(res.status) && attempt < this.retry.retries) {\n const delay = Math.min(\n this.retry.maxDelayMs,\n this.retry.minDelayMs * this.retry.factor ** attempt,\n );\n await sleep(delay);\n return this.getHtml(pathOrUrl, attempt + 1);\n }\n throw new HttpError(`HTTP ${res.status}`, res.status);\n }\n return await res.text();\n } catch (e: any) {\n clearTimeout(id as any);\n if (attempt < this.retry.retries) {\n const delay = Math.min(\n this.retry.maxDelayMs,\n this.retry.minDelayMs * this.retry.factor ** attempt,\n );\n await sleep(delay);\n return this.getHtml(pathOrUrl, attempt + 1);\n }\n if (e?.name == 'AbortError') throw new HttpError('Request timeout');\n throw new HttpError(e?.message ?? 'Network error');\n }\n }\n\n async getJson<T = any>(pathOrUrl: string, attempt = 0): Promise<T> {\n const url = this.buildURL(pathOrUrl);\n const ctrl = new AbortController();\n const id = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, {\n method: 'GET',\n headers: {\n 'User-Agent': this.userAgent,\n Accept: 'application/json,text/plain;q=0.9,*/*;q=0.8',\n ...this.headers,\n },\n signal: ctrl.signal,\n });\n clearTimeout(id as any);\n if (!res.ok) {\n if (this.retry.retryOn(res.status) && attempt < this.retry.retries) {\n const delay = Math.min(\n this.retry.maxDelayMs,\n this.retry.minDelayMs * this.retry.factor ** attempt,\n );\n await sleep(delay);\n return this.getJson<T>(pathOrUrl, attempt + 1);\n }\n throw new HttpError(`HTTP ${res.status}`, res.status);\n }\n return (await res.json()) as T;\n } catch (e: any) {\n clearTimeout(id as any);\n if (attempt < this.retry.retries) {\n const delay = Math.min(\n this.retry.maxDelayMs,\n this.retry.minDelayMs * this.retry.factor ** attempt,\n );\n await sleep(delay);\n return this.getJson<T>(pathOrUrl, attempt + 1);\n }\n if (e?.name == 'AbortError') throw new HttpError('Request timeout');\n throw new HttpError(e?.message ?? 'Network error');\n }\n }\n\n async postForm<T = any>(\n pathOrUrl: string,\n form: Record<string, string | string[]>,\n attempt = 0,\n ): Promise<T> {\n const url = this.buildURL(pathOrUrl);\n const ctrl = new AbortController();\n const id = setTimeout(() => ctrl.abort(), this.timeoutMs);\n\n const usp = new URLSearchParams();\n for (const [k, v] of Object.entries(form)) {\n if (Array.isArray(v)) {\n for (const item of v) usp.append(k, item);\n } else if (v != null) {\n usp.append(k, v);\n }\n }\n const body = usp.toString();\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'User-Agent': this.userAgent,\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\n 'X-Requested-With': 'XMLHttpRequest',\n Accept: 'application/json, text/javascript, */*; q=0.01',\n ...this.headers,\n },\n body,\n signal: ctrl.signal,\n });\n clearTimeout(id as any);\n if (!res.ok) {\n if (this.retry.retryOn(res.status) && attempt < this.retry.retries) {\n const delay = Math.min(\n this.retry.maxDelayMs,\n this.retry.minDelayMs * this.retry.factor ** attempt,\n );\n await sleep(delay);\n return this.postForm<T>(pathOrUrl, form, attempt + 1);\n }\n throw new HttpError(`HTTP ${res.status}`, res.status);\n }\n const ct = res.headers.get('content-type') || '';\n if (ct.includes('application/json') || ct.includes('text/javascript')) {\n return (await res.json()) as T;\n }\n const text = await res.text();\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n } catch (e: any) {\n clearTimeout(id as any);\n if (attempt < this.retry.retries) {\n const delay = Math.min(\n this.retry.maxDelayMs,\n this.retry.minDelayMs * this.retry.factor ** attempt,\n );\n await sleep(delay);\n return this.postForm<T>(pathOrUrl, form, attempt + 1);\n }\n if (e?.name == 'AbortError') throw new HttpError('Request timeout');\n throw new HttpError(e?.message ?? 'Network error');\n }\n }\n}\n","import { HttpClient } from '../http';\nimport type { AlphabetLetter, AlphabetSection, ListingItem, Page } from '../types';\nimport { parseAlphabetLetters, parseAlphabetListing } from '../parsers/alphabet';\n\ntype Cfg = { hubPath: string; alphaPrefix: string };\n\nconst ALPHA_CFG: Record<string, Cfg> = {\n comics: { hubPath: '/comic', alphaPrefix: '/alphabetical_order_comics' },\n category_comic: { hubPath: '/category_comic', alphaPrefix: '/category_comic/alphabetical' },\n characters: { hubPath: '/characters', alphaPrefix: '/alphabetical_order_characters' },\n authors_comics: { hubPath: '/authors_comics', alphaPrefix: '/alphabetical_order_authors' },\n pipictures: { hubPath: '/pipictures', alphaPrefix: '/alphabetical_order_pictures' },\n porn_gifs: { hubPath: '/porn_gifs', alphaPrefix: '/alphabetical_order_gif' },\n manga: { hubPath: '/munga', alphaPrefix: '/alphabetical_order_manga' },\n authors_hentai: { hubPath: '/authors_hentai', alphaPrefix: '/authors_hentai/alphabetical' },\n};\n\nexport async function alphabetLetters(\n http: HttpClient,\n baseURL: string,\n section: AlphabetSection,\n): Promise<AlphabetLetter[]> {\n const cfg = (ALPHA_CFG as Record<string, Cfg>)[section];\n const hub = cfg.hubPath;\n const html = await http.getHtml(hub);\n return parseAlphabetLetters(html, baseURL);\n}\n\nexport async function alphabetItems(\n http: HttpClient,\n baseURL: string,\n section: AlphabetSection,\n letter: string,\n page = 0,\n): Promise<Page<ListingItem>> {\n const cfg = (ALPHA_CFG as Record<string, Cfg>)[section];\n const letterSeg = encodeURIComponent(letter);\n const html = await http.getHtml(`${cfg.alphaPrefix}/${letterSeg}?page=${page}`);\n return parseAlphabetListing(html, baseURL, page);\n}\n","import * as cheerio from 'cheerio';\nimport type { AnyNode, Element } from 'domhandler';\nimport { normSpace, parseIntLike, toAbsolute } from '../utils';\nimport type { AlphabetLetter, AlphabetBlock, ListingItem, Page } from '../types';\nimport { extractTotalPages } from './pagination';\n\nexport function parseAlphabetLetters(html: string, baseURL: string): AlphabetLetter[] {\n const $ = cheerio.load(html);\n const letters: AlphabetLetter[] = [];\n\n $('.views-summary a[href]').each((_, a) => {\n const el = $(a);\n const raw = normSpace(el.text());\n if (!raw) return;\n\n const count = parseIntLike(raw);\n const label = raw.replace(/\\(\\s*\\d+\\s*\\)\\s*$/, '').trim() || raw;\n const hrefRel = el.attr('href') || '';\n const href = toAbsolute(baseURL, hrefRel) || '';\n const lastSeg = decodeURIComponent((hrefRel.split('/').filter(Boolean).pop() || '').trim());\n if (!label || !href) return;\n\n letters.push({\n label,\n value: lastSeg || label,\n href,\n count: typeof count === 'number' ? count : undefined,\n active: el.hasClass('active') || /(^|\\s)active(\\s|$)/.test(el.attr('class') || ''),\n });\n });\n\n const uniq = new Map<string, AlphabetLetter>();\n for (const l of letters) if (!uniq.has(l.value)) uniq.set(l.value, l);\n return Array.from(uniq.values());\n}\n\nexport function parseAlphabetInline(html: string, baseURL: string): AlphabetBlock | null {\n const $ = cheerio.load(html);\n const containers: Element[] = [];\n\n containers.push(...($('.view-glossary-comics').toArray() as Element[]));\n if (containers.length === 0) containers.push(...($('.view-glossary').toArray() as Element[]));\n if (containers.length === 0) {\n const anyNodes = $('.view').has('.views-summary a').toArray();\n const onlyElements = anyNodes.filter((n): n is Element => (n as any)?.type === 'tag');\n containers.push(...onlyElements);\n }\n if (containers.length === 0) return null;\n\n const grouped = new Map<string, AlphabetLetter[]>();\n\n for (const cont of containers) {\n const $cont = $(cont);\n $cont.find('.views-summary a[href]').each((__, a) => {\n const el = $(a);\n const raw = normSpace(el.text());\n if (!raw) return;\n\n const count = parseIntLike(raw);\n const label = raw.replace(/\\(\\s*\\d+\\s*\\)\\s*$/, '').trim() || raw;\n const hrefRel = el.attr('href') || '';\n const hrefAbs = toAbsolute(baseURL, hrefRel);\n if (!hrefAbs) return;\n\n let section = '';\n try {\n const p = new URL(hrefAbs).pathname;\n const m = p.match(/^\\/([^/]+)/);\n section = m ? m[1] : '';\n } catch {}\n\n const value =\n decodeURIComponent((hrefRel.split('/').filter(Boolean).pop() || '').trim()) || label;\n\n const entry: AlphabetLetter = {\n label,\n value,\n href: hrefAbs,\n count: typeof count === 'number' ? count : undefined,\n active: el.hasClass('active') || /(^|\\s)active(\\s|$)/.test(el.attr('class') || ''),\n };\n\n const arr = grouped.get(section) ?? [];\n if (!arr.some((x) => x.value === entry.value)) arr.push(entry);\n grouped.set(section, arr);\n });\n }\n\n if (!grouped.size) return null;\n\n let chosen: { section: string; letters: AlphabetLetter[] } | null = null;\n for (const [sec, letters] of grouped.entries()) {\n if (letters.some((l) => l.active)) {\n chosen = { section: sec, letters };\n break;\n }\n }\n if (!chosen) {\n let bestSec = '';\n let bestArr: AlphabetLetter[] = [];\n for (const [sec, letters] of grouped.entries()) {\n if (letters.length > bestArr.length) {\n bestSec = sec;\n bestArr = letters;\n }\n }\n chosen = { section: bestSec, letters: bestArr };\n }\n if (!chosen) {\n const [sec, letters] = grouped.entries().next().value as [string, AlphabetLetter[]];\n chosen = { section: sec, letters };\n }\n\n chosen.letters.sort((a, b) => a.label.localeCompare(b.label, 'en'));\n if (!looksLikeAlphabet(chosen.letters)) return null;\n return { section: chosen.section, letters: chosen.letters };\n}\n\nfunction looksLikeAlphabet(letters: AlphabetLetter[]): boolean {\n const short = letters.filter(l => /^[A-Z#]$/i.test(l.label.trim())).length;\n return letters.length >= 10 && short >= 10;\n}\n\nfunction pickFromSrcset(srcset?: string): string | undefined {\n if (!srcset) return;\n const first = srcset.split(',')[0]?.trim();\n if (!first) return;\n const url = first.split(/\\s+/)[0];\n return url || undefined;\n}\n\nfunction pickFromStyle(style?: string): string | undefined {\n if (!style) return;\n const m = style.match(/url\\((['\"]?)(.*?)\\1\\)/i);\n return m?.[2] || undefined;\n}\n\nfunction pickThumbUrl(\n scope: cheerio.Cheerio<Element | AnyNode>,\n baseURL: string,\n): string | undefined {\n const candidates = [\n '.views-field-field-comg-preview img',\n '.views-field-field-cat-preview img',\n '.views-field-field-category-preview img',\n '.views-field-field-man-preview-1 img',\n '.views-field-field-man-preview img',\n '.views-field-field-author-preview img',\n '.views-field-field-authors-pre img',\n '.views-field-field-gif-pre-1 img',\n '.views-field-field-gif-preview img',\n '.views-field-field-gif-pre img',\n '.views-field-field-gif img',\n '.views-field-field-preview img',\n '.views-field-field-image img',\n '.views-field-field-avatar img',\n '.field-content a > img',\n '.field-content img',\n 'a > img',\n 'img',\n ];\n\n for (const sel of candidates) {\n const img = scope.find(sel).first();\n if (img.length) {\n const ds = img.attr('data-src') || img.attr('data-original');\n const ss = pickFromSrcset(img.attr('srcset') || '');\n const src = ds || ss || img.attr('src');\n const abs = toAbsolute(baseURL, src || '');\n if (abs) return abs;\n }\n }\n\n const srcset = pickFromSrcset(scope.find('picture source').first().attr('srcset') || '');\n if (srcset) {\n const abs = toAbsolute(baseURL, srcset);\n if (abs) return abs;\n }\n\n const bg = pickFromStyle(\n (scope.attr('style') as string | undefined) ||\n (scope.find('[style*=\"background-image\"]').first().attr('style') as string | undefined),\n );\n if (bg) {\n const abs = toAbsolute(baseURL, bg);\n if (abs) return abs;\n }\n\n return undefined;\n}\n\nexport function parseAlphabetListing(\n html: string,\n baseURL: string,\n page: number,\n): Page<ListingItem> {\n const $ = cheerio.load(html);\n const items: ListingItem[] = [];\n\n $('table.views-view-grid td').each((_, td) => {\n const scope = $(td);\n const a = scope\n .find(\n '.views-field-title a[href], .views-field-name a[href], strong a[href], h5 a[href], a[href]',\n )\n .first();\n const href = a.attr('href') || '';\n const url = toAbsolute(baseURL, href);\n const title = (\n a.text() ||\n scope.find('.views-field-title .field-content').text() ||\n scope.find('.views-field-name .field-content').text() ||\n scope.find('strong').first().text() ||\n scope.find('h5').first().text() ||\n ''\n ).trim();\n const thumb = pickThumbUrl(scope as any, baseURL);\n if (url && title) items.push({ title, url, thumb });\n });\n\n if (items.length === 0) {\n $('.view .view-content .views-row').each((_, row) => {\n const el = $(row);\n const a = el\n .find(\n '.views-field-title a[href], .views-field-name a[href], strong a[href], h5 a[href], a[href]',\n )\n .first();\n const href = a.attr('href') || '';\n const url = toAbsolute(baseURL, href);\n const title = (\n a.text() ||\n el.find('.views-field-title .field-content').text() ||\n el.find('.views-field-name .field-content').text() ||\n el.find('strong').first().text() ||\n el.find('h5').first().text() ||\n ''\n ).trim();\n const thumb = pickThumbUrl(el as any, baseURL);\n if (url && title) items.push({ title, url, thumb });\n });\n }\n\n const totalPages = extractTotalPages(html);\n const hasNext = page + 1 < totalPages;\n\n return { items, page, hasNext, totalPages };\n}\n","export function toAbsolute(baseURL: string, href?: string): string | undefined {\n if (!href) return undefined;\n try {\n return new URL(href).toString();\n } catch {\n if (href.startsWith('//')) {\n const base = new URL(baseURL);\n return `${base.protocol}${href}`;\n }\n return new URL(href.replace(/^\\//, ''), baseURL.replace(/\\/+$/, '') + '/').toString();\n }\n}\n\nexport function uniq<T>(arr: T[]): T[] {\n return Array.from(new Set(arr));\n}\n\nexport function absUrl(base: string, href?: string | null): string | null {\n if (!href) return null;\n try {\n return new URL(href, base).toString();\n } catch {\n return null;\n }\n}\n\nexport function normSpace(s?: string | null): string {\n return (s ?? '').replace(/\\s+/g, ' ').trim();\n}\n\nexport function parseNumberLike(s?: string | null): number | undefined {\n if (!s) return undefined;\n const m = String(s)\n .replace(/[^\\d.,]/g, '')\n .replace(',', '.');\n const n = parseFloat(m);\n return Number.isFinite(n) ? n : undefined;\n}\n\nexport function parseIntLike(s?: string | null): number | undefined {\n if (!s) return undefined;\n const n = parseInt(String(s).replace(/[^\\d]/g, ''), 10);\n return Number.isFinite(n) ? n : undefined;\n}\n\nexport function guessKindFromPath(path: string): import('./types').ViewerKind {\n const p = path.split('?')[0].split('#')[0];\n if (p.includes('/hentai_manga/') || p.includes('/munga/')) return 'manga';\n if (p.includes('/comics/')) return 'comics';\n if (p.includes('/pictures/')) return 'pictures';\n if (p.includes('/humor/')) return 'humor';\n if (p.includes('/video/')) return 'video';\n if (p.includes('/games/')) return 'game';\n return 'other';\n}\n\nexport function guessAlphabetSectionFromPath(path: string): string {\n const slug = String(path || '')\n .trim()\n .replace(/^\\//, '')\n .split('/')[0]\n ?.toLowerCase();\n const map: Record<string, string> = {\n comics: 'alphabetical_order_comics',\n manga: 'alphabetical_order_manga',\n pictures: 'alphabetical_order_pipictures',\n porn_gifs: 'alphabetical_order_gif',\n characters: 'alphabetical_order_characters',\n category_comic: 'alphabetical_order_category_comic',\n authors_comics: 'alphabetical_order_authors_comics',\n authors_hentai: 'alphabetical_order_authors_hentai',\n pipictures: 'alphabetical_order_pipictures',\n };\n return map[slug] || (slug ? `alphabetical_order_${slug}` : 'alphabetical_order');\n}\n","import * as cheerio from 'cheerio';\n\nfunction pageIndexFromParam(raw?: string | null): number | null {\n if (!raw) return null;\n const decoded = decodeURIComponent(String(raw));\n const parts = decoded\n .split(',')\n .map((s) => parseInt(s.trim(), 10))\n .filter((n) => Number.isFinite(n));\n if (!parts.length) return null;\n return Math.max(...parts);\n}\n\nfunction pageIndexFromHref(href: string): number | null {\n if (!href) return null;\n try {\n const u = new URL(href, 'https://example.com');\n return pageIndexFromParam(u.searchParams.get('page'));\n } catch {\n const m = href.match(/[?&]page=([^&#]+)/i);\n return m ? pageIndexFromParam(m[1]) : null;\n }\n}\n\nexport function extractTotalPages(html: string): number {\n const $ = cheerio.load(html);\n const root = $(\n 'ul.pager, nav.pagination, .pagination, .item-list .pager, #content .pager',\n ).first();\n if (!root.length) return 1;\n\n const lastHref =\n root\n .find('li.pager-last a[href], a[rel=\"last\"], a[title*=\"Last\"], a[title*=\"Последняя\"]')\n .attr('href') || undefined;\n\n if (lastHref) {\n const idx = pageIndexFromHref(lastHref);\n if (idx != null) return Math.max(1, idx + 1);\n }\n\n let maxPages = 0;\n root.find('a[href]').each((_, a) => {\n const href = String($(a).attr('href') || '');\n const idx = pageIndexFromHref(href);\n if (idx != null) maxPages = Math.max(maxPages, idx + 1);\n });\n\n root.find('a, li, span').each((_, el) => {\n const n = Number(($(el).text() || '').trim());\n if (Number.isFinite(n)) maxPages = Math.max(maxPages, n);\n });\n\n return Math.max(1, maxPages || 1);\n}\n","import type { HttpClient } from '../http';\nimport type { ListingItem, Page, ListingQuery } from '../types';\nimport { parseHubListing } from '../parsers/listing';\nimport { parseAlphabetInline, parseAlphabetListing } from '../parsers/alphabet';\nimport { guessAlphabetSectionFromPath } from '../utils';\nimport { parseExposedSorting } from '../parsers/sorting';\n\nfunction buildUrl(baseURL: string, path: string, params?: ListingQuery): string {\n const url = new URL(path.startsWith('/') ? path : `/${path}`, baseURL);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined) continue;\n if (typeof v === 'boolean') url.searchParams.set(k, v ? '1' : '0');\n else url.searchParams.set(k, String(v));\n }\n }\n return url.pathname + (url.search ? url.search : '');\n}\n\ntype ListByPathOptions = ListingQuery & {\n letter?: string;\n};\n\nfunction normalizeCharactersPath(path: string): string {\n const clean = path.startsWith('/') ? path : `/${path}`;\n if (/^\\/alphabetical_order_characters\\/?$/i.test(clean)) return '/characters';\n return clean;\n}\n\nfunction sniffPagePrefixFromHtml(html: string): string | null {\n const m =\n html.match(\n /<ul[^>]*class=[\"'][^\"']*pager[^\"']*[\"'][\\s\\S]*?\\bhref=[\"'][^\"']*?\\bpage=([^\"&]+)[\"'][\\s\\S]*?<\\/ul>/i,\n ) || html.match(/\\bpage=([^\"&]+)/i);\n if (!m) return null;\n\n try {\n const decoded = decodeURIComponent(m[1]);\n if (decoded.includes(',')) {\n const parts = decoded.split(',').map((s) => s.trim());\n if (parts.length > 1) return parts.slice(0, -1).join(',') + ','; // \"0,\"\n }\n } catch {\n }\n return null;\n}\n\nfunction buildPageParam(htmlWithPager: string, page: number): string {\n const prefix = sniffPagePrefixFromHtml(htmlWithPager);\n return prefix ? `${prefix}${page}` : String(page);\n}\n\nfunction getAppliedFromHtml(html: string, baseURL: string): Record<string, string> {\n const sorting = parseExposedSorting(html, baseURL);\n return sorting?.appliedParams ?? {};\n}\n\nexport async function latest(\n http: HttpClient,\n baseURL: string,\n page = 0,\n params?: ListingQuery,\n): Promise<Page<ListingItem>> {\n const url0 = buildUrl(baseURL, '/new', { ...(params ?? {}), page: 0 });\n const html0 = await http.getHtml(url0);\n\n if (page === 0) {\n return parseHubListing(html0, baseURL, 0);\n }\n\n const applied = params ? {} : getAppliedFromHtml(html0, baseURL);\n const pageParam = buildPageParam(html0, page);\n\n const html = await http.getHtml(\n buildUrl(baseURL, '/new', { ...applied, ...(params ?? {}), page: pageParam }),\n );\n return parseHubListing(html, baseURL, page);\n}\n\nexport async function listByPath(\n http: HttpClient,\n baseURL: string,\n path: string,\n page = 0,\n opts?: ListByPathOptions,\n): Promise<Page<ListingItem>> {\n const clean = path.startsWith('/') ? path : `/${path}`;\n const commonParams: ListingQuery = { ...(opts ?? {}) };\n delete (commonParams as Record<string, unknown>).letter;\n\n if (opts?.letter) {\n const entryHtml = await http.getHtml(buildUrl(baseURL, clean, commonParams));\n const alphabet = parseAlphabetInline(entryHtml, baseURL);\n\n const wanted = String(opts.letter).toUpperCase();\n\n let letterUrl: string;\n if (alphabet) {\n const match =\n alphabet.letters.find((l) => (l.value || '').toUpperCase() === wanted) ||\n alphabet.letters.find((l) => (l.label || '').toUpperCase() === wanted);\n letterUrl = match?.href || `/${alphabet.section}/${encodeURIComponent(wanted)}`;\n } else {\n const section = guessAlphabetSectionFromPath(clean);\n letterUrl = `/${section}/${encodeURIComponent(wanted)}`;\n }\n\n const url0 = buildUrl(baseURL, letterUrl, { ...commonParams, page: 0 });\n const html0 = await http.getHtml(url0);\n\n const res0 = parseAlphabetListing(html0, baseURL, 0);\n if (alphabet) (res0 as Page<ListingItem>).alphabet = alphabet;\n\n if (page === 0) {\n return res0;\n }\n\n const applied = Object.keys(commonParams).length ? {} : getAppliedFromHtml(html0, baseURL);\n const pageParam = buildPageParam(html0, page);\n\n const html = await http.getHtml(\n buildUrl(baseURL, letterUrl, { ...applied, ...commonParams, page: pageParam }),\n );\n const res = parseAlphabetListing(html, baseURL, page);\n if (alphabet) (res as Page<ListingItem>).alphabet = alphabet;\n return res;\n }\n\n const effective = normalizeCharactersPath(clean);\n\n const html0 = await http.getHtml(buildUrl(baseURL, effective, { ...commonParams, page: 0 }));\n const parsed0 = parseHubListing(html0, baseURL, 0);\n\n if (effective !== clean && !parsed0.alphabet) {\n try {\n const entryHtml = await http.getHtml(buildUrl(baseURL, clean, commonParams));\n const alpha = parseAlphabetInline(entryHtml, baseURL);\n if (alpha) parsed0.alphabet = alpha;\n } catch {\n }\n }\n\n if (page === 0) {\n return parsed0;\n }\n\n const applied =\n Object.keys(commonParams).length\n ? {}\n : (parsed0 as any).sorting?.appliedParams ?? getAppliedFromHtml(html0, baseURL);\n\n const pageParam = buildPageParam(html0, page);\n\n const html = await http.getHtml(\n buildUrl(baseURL, effective, { ...applied, ...commonParams, page: pageParam }),\n );\n const parsed = parseHubListing(html, baseURL, page);\n\n if (effective !== clean && !parsed.alphabet) {\n try {\n const entryHtml = await http.getHtml(buildUrl(baseURL, clean, commonParams));\n const alpha = parseAlphabetInline(entryHtml, baseURL);\n if (alpha) parsed.alphabet = alpha;\n } catch {\n // best-effort\n }\n }\n\n return parsed;\n}\n","import * as cheerio from 'cheerio';\nimport { toAbsolute } from '../utils';\nimport type { ListingItem, Page } from '../types';\nimport { extractTotalPages } from './pagination';\nimport { parseAlphabetInline } from './alphabet';\nimport { parseExposedSorting } from './sorting';\n\nfunction pickFromSrcset(srcset?: string): string | undefined {\n if (!srcset) return;\n const first = srcset.split(',')[0]?.trim();\n if (!first) return;\n const url = first.split(/\\s+/)[0];\n return url || undefined;\n}\n\nfunction pickFromStyle(style?: string): string | undefined {\n if (!style) return;\n const m = style.match(/url\\((['\"]?)(.*?)\\1\\)/i);\n return m?.[2] || undefined;\n}\n\nfunction pickThumb($scope: cheerio.Cheerio<any>, baseURL: string): string | undefined {\n const cands = [\n '.views-field-field-preview img',\n '.views-field-field-image img',\n '.views-field-field-avatar img',\n '.views-field-field-cat-preview img',\n '.views-field-field-category-preview img',\n '.views-field-field-comg-preview img',\n '.views-field-field-gif-preview img',\n '.views-field-field-gif-pre img',\n '.views-field-field-gif img',\n '.views-field-field-files img',\n 'img',\n ];\n\n for (const sel of cands) {\n const img = $scope.find(sel).first();\n if (img.length) {\n const ds = img.attr('data-src') || img.attr('data-original');\n const ss = pickFromSrcset(img.attr('srcset') || '');\n const src = ds || ss || img.attr('src');\n const abs = toAbsolute(baseURL, src || '');\n if (abs) return abs;\n }\n }\n\n const srcset = pickFromSrcset($scope.find('picture source').first().attr('srcset') || '');\n if (srcset) return toAbsolute(baseURL, srcset);\n\n const bg = pickFromStyle(\n $scope.attr('style') || $scope.find('[style*=\"background-image\"]').first().attr('style'),\n );\n if (bg) return toAbsolute(baseURL, bg);\n\n return undefined;\n}\n\nfunction findTitleLink($scope: cheerio.Cheerio<any>) {\n const sel = $scope.find('.views-field-title a[href]').first().length\n ? '.views-field-title a[href]'\n : $scope.find('.views-field-name a[href]').first().length\n ? '.views-field-name a[href]'\n : $scope.find('.views-field-nothing-1 h3 a[href]').first().length\n ? '.views-field-nothing-1 h3 a[href]'\n : $scope.find('strong a[href]').first().length\n ? 'strong a[href]'\n : $scope.find('h5 a[href]').first().length\n ? 'h5 a[href]'\n : 'a[href]';\n return $scope.find(sel).first();\n}\n\nfunction textFrom($el: cheerio.Cheerio<any>): string {\n return ($el.text() || '').replace(/\\s+/g, ' ').trim();\n}\n\nfunction isPager($a: cheerio.Cheerio<any>): boolean {\n return !!$a.closest('ul.pager, .pager, nav.pagination').length;\n}\n\nfunction cardRoot($a: cheerio.Cheerio<any>): cheerio.Cheerio<any> {\n const r = $a.closest('li, .views-row, td, .node, .views-col, .view-content > div, tr').first();\n return r.length ? r : $a.parent();\n}\n\nexport function parseHubListing(html: string, baseURL: string, page: number): Page<ListingItem> {\n const $ = cheerio.load(html);\n const items: ListingItem[] = [];\n const seen = new Set<string>();\n\n const views = $('.view');\n const scopes = views.length ? views.toArray() : [$('body').get(0)!];\n\n for (const v of scopes) {\n const $view = $(v);\n const $root = $view.find('.view-content').length ? $view.find('.view-content') : $view;\n\n $root.find('table.views-table tbody tr').each((_, tr) => {\n const $tr = $(tr);\n\n let a = $tr.find('.views-field-nothing-1 h3 a[href]').first();\n if (!a.length) {\n const cand = $tr.find('a[href]').first();\n if (cand.length && !isPager(cand)) a = cand;\n }\n const href = a.attr('href') || '';\n const url = toAbsolute(baseURL, href);\n if (!url || seen.has(url)) return;\n\n const title =\n textFrom($tr.find('.views-field-nothing-1 h3').first()) ||\n textFrom(a) ||\n a.attr('title') ||\n '';\n\n if (!title.trim()) return;\n\n const thumbCell = $tr.find('.views-field-field-files').first();\n const thumb = pickThumb(thumbCell, baseURL) || pickThumb($tr, baseURL);\n\n items.push({ title: title.trim(), url, thumb });\n seen.add(url);\n });\n\n $root.find('table.views-view-grid td').each((_, td) => {\n const $td = $(td);\n const a = findTitleLink($td);\n const href = a.attr('href') || '';\n const url = toAbsolute(baseURL, href);\n if (!url || seen.has(url)) return;\n\n const title =\n textFrom(a) ||\n textFrom($td.find('.views-field-title .field-content')) ||\n textFrom($td.find('.views-field-name .field-content')) ||\n a.attr('title') ||\n '';\n\n const thumb = pickThumb($td, baseURL);\n if (title) {\n items.push({ title, url, thumb });\n seen.add(url);\n }\n });\n\n $root.find('.views-row, .node, li').each((_, row) => {\n const $row = $(row);\n const a = findTitleLink($row);\n const href = a.attr('href') || '';\n const url = toAbsolute(baseURL, href);\n if (!url || seen.has(url)) return;\n\n const title =\n textFrom(a) ||\n textFrom($row.find('.views-field-title .field-content')) ||\n textFrom($row.find('.views-field-name .field-content')) ||\n a.attr('title') ||\n '';\n\n const thumb = pickThumb($row, baseURL);\n if (title) {\n items.push({ title, url, thumb });\n seen.add(url);\n }\n });\n\n $root.find('a[href] img').each((_, imgEl) => {\n const $a = $(imgEl).closest('a[href]');\n if (isPager($a)) return;\n\n const url = toAbsolute(baseURL, $a.attr('href') || '');\n if (!url || seen.has(url)) return;\n\n const $card = cardRoot($a);\n const title =\n textFrom($card.find('.views-field-title .field-content').first()) ||\n textFrom($card.find('.views-field-name .field-content').first()) ||\n textFrom($card.find('.views-field-nothing-1 h3').first()) ||\n $a.attr('title') ||\n $(imgEl).attr('alt') ||\n '';\n\n if (!title.trim()) return;\n\n const thumb =\n pickThumb($card, baseURL) ||\n pickThumb($a, baseURL) ||\n toAbsolute(baseURL, $(imgEl).attr('src') || '');\n\n items.push({ title: title.trim(), url, thumb });\n seen.add(url);\n });\n }\n\n const totalPages = extractTotalPages(html);\n const hasNext = page + 1 < totalPages;\n const alphabet = parseAlphabetInline(html, baseURL) || undefined;\n const sorting = parseExposedSorting(html, baseURL);\n\n return {\n items,\n page,\n hasNext,\n totalPages,\n pageSize: undefined,\n alphabet,\n sorting,\n };\n}\n","import { toAbsolute } from '../utils';\r\nimport type { ExposedOption, ExposedSelect, SortingUI } from '../types';\r\n\r\nexport function parseExposedSorting(html: string, baseURL: string): SortingUI | undefined {\r\n const vfIdx = html.search(/<div[^>]+class=[\"'][^\"']*view-filters[^\"']*[\"'][^>]*>/i);\r\n if (vfIdx < 0) return undefined;\r\n\r\n // Найдём форму внутри блока view-filters\r\n const formStart = html.indexOf('<form', vfIdx);\r\n if (formStart < 0) return undefined;\r\n const formEnd = html.indexOf('</form>', formStart);\r\n if (formEnd < 0) return undefined;\r\n const formHtml = html.slice(formStart, formEnd + 7);\r\n\r\n const actionMatch = /<form[^>]*\\baction=[\"']([^\"']+)[\"'][^>]*>/i.exec(formHtml);\r\n if (!actionMatch) return undefined;\r\n\r\n const abs = toAbsolute(baseURL, actionMatch[1] || '');\r\n if (!abs) return undefined;\r\n\r\n let actionPath = '/';\r\n try {\r\n actionPath = new URL(abs).pathname || '/';\r\n } catch {\r\n actionPath = '/';\r\n }\r\n\r\n const labels = new Map<string, string>();\r\n const reLabel = /<label[^>]*\\bfor=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/label>/gi;\r\n let lm: RegExpExecArray | null;\r\n while ((lm = reLabel.exec(formHtml))) {\r\n const id = lm[1];\r\n const raw = (lm[2] || '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\r\n if (id && raw) labels.set(id, raw);\r\n }\r\n\r\n const selects: ExposedSelect[] = [];\r\n const reSelect = /<select\\b([^>]*)>([\\s\\S]*?)<\\/select>/gi;\r\n let sm: RegExpExecArray | null;\r\n while ((sm = reSelect.exec(formHtml))) {\r\n const attrs = sm[1] || '';\r\n const inner = sm[2] || '';\r\n\r\n const name = /(?:^|\\s)name=[\"']([^\"']+)[\"']/i.exec(attrs)?.[1];\r\n if (!name) continue;\r\n\r\n const idAttr = /(?:^|\\s)id=[\"']([^\"']+)[\"']/i.exec(attrs)?.[1];\r\n const label = idAttr ? labels.get(idAttr) : undefined;\r\n\r\n const options: ExposedOption[] = [];\r\n const reOpt = /<option\\b([^>]*)>([\\s\\S]*?)<\\/option>/gi;\r\n let om: RegExpExecArray | null;\r\n while ((om = reOpt.exec(inner))) {\r\n const oattrs = om[1] || '';\r\n const text = (om[2] || '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\r\n const val = /(?:^|\\s)value=[\"']([^\"']*)[\"']/i.exec(oattrs)?.[1] ?? text;\r\n const selected = /\\bselected\\b/i.test(oattrs) || /\\bselected=[\"']selected[\"']/i.test(oattrs);\r\n options.push({ value: val, label: text || val, selected });\r\n }\r\n\r\n selects.push({ name, label, options });\r\n }\r\n\r\n if (!selects.length) return undefined;\r\n\r\n const appliedParams: Record<string, string> = {};\r\n for (const s of selects) {\r\n const selected = s.options.find((o) => o.selected);\r\n if (selected && selected.value !== undefined) {\r\n appliedParams[s.name] = String(selected.value);\r\n }\r\n }\r\n\r\n return { actionPath, selects, appliedParams };\r\n}\r\n","import { HttpClient } from '../http';\nimport { Post } from '../types';\nimport { parsePost } from '../parsers/post';\n\nexport async function getPost(http: HttpClient, baseURL: string, urlOrSlug: string): Promise<Post> {\n const html = await http.getHtml(urlOrSlug);\n const absolute = (() => {\n try {\n return new URL(urlOrSlug).toString();\n } catch {\n return new URL(urlOrSlug.replace(/^\\//, ''), baseURL + '/').toString();\n }\n })();\n return parsePost(html, baseURL, absolute);\n}\n","import * as cheerio from 'cheerio';\nimport { Post } from '../types';\nimport { toAbsolute, uniq } from '../utils';\n\nexport function parsePost(html: string, baseURL: string, url: string): Post {\n const $ = cheerio.load(html);\n\n const title =\n $('h1').first().text().trim() ||\n $('.page-title, .node-title, .title').first().text().trim() ||\n url;\n\n const container = $('#content, .content, article, .node, .field-items').first();\n\n const imgs: string[] = [];\n container.find('img').each((_, img) => {\n const el = $(img);\n const src = el.attr('data-src') || el.attr('src');\n const abs = toAbsolute(baseURL, src || '');\n if (abs) imgs.push(abs);\n });\n\n const images = uniq(imgs);\n const tags: string[] = [];\n $('.tags a, a[rel=\"tag\"], .field-name-field-tags a').each((_, a) => {\n const t = $(a).text().trim();\n if (t) tags.push(t);\n });\n\n const author =\n $('.author a').first().text().trim() || $('.submitted .username').first().text().trim() || null;\n\n return { title, url, images, tags: uniq(tags), author };\n}\n","import { HttpClient } from '../http';\nimport { Page, ListingItem } from '../types';\nimport { parseSearch } from '../parsers/search';\nimport { extractViewsContextForSearch, extractHtmlFromDrupalAjax } from '../parsers/ajax';\n\nexport async function search(\n http: HttpClient,\n baseURL: string,\n query: string,\n page = 0,\n): Promise<Page<ListingItem>> {\n const q = encodeURIComponent(query);\n\n const html1 = await http.getHtml(`/search?search_api_views_fulltext=${q}&page=${page}`);\n const parsed1 = parseSearch(html1, baseURL, page);\n if (parsed1.items.length > 0) return parsed1;\n\n const firstHtml = await http.getHtml(`/search?search_api_views_fulltext=${q}`);\n const ctx = extractViewsContextForSearch(firstHtml);\n\n const ajaxUrl = `/views/ajax?search_api_views_fulltext=${q}&undefined=Search&_wrapper_format=drupal_ajax`;\n const payload: Record<string, string | string[]> = {\n view_name: ctx.view_name || 'search',\n view_display_id: ctx.view_display_id || 'page',\n view_args: '',\n view_path: 'search',\n view_base_path: 'search',\n view_dom_id: ctx.view_dom_id,\n pager_element: '0',\n page: String(page),\n };\n if (ctx.ajax_html_id) payload['ajax_html_ids[]'] = [ctx.ajax_html_id];\n\n const json: unknown = await http.postForm<unknown>(ajaxUrl, payload);\n const html2 = extractHtmlFromDrupalAjax(json, ctx.view_dom_id) || '';\n return parseSearch(html2, baseURL, page);\n}\n","import * as cheerio from 'cheerio';\nimport { ListingItem, Page } from '../types';\nimport { toAbsolute } from '../utils';\nimport { extractTotalPages } from './pagination';\n\nexport function parseSearch(html: string, baseURL: string, page: number): Page<ListingItem> {\n const $ = cheerio.load(html);\n const items: ListingItem[] = [];\n\n const view = $('.view')\n .filter((_, el) => {\n const cls = $(el).attr('class') || '';\n return (\n /view-id-search/.test(cls) &&\n /view-display-id-page/.test(cls) &&\n $(el).find('.view-content').length > 0\n );\n })\n .first();\n\n const rows = view.find('.view-content .views-row');\n rows.each((_, el) => {\n const row = $(el);\n\n const a = row.find('.views-field-title a[href]').first().length\n ? row.find('.views-field-title a[href]').first()\n : row.find('a[href]').first();\n\n const href = a.attr('href') || '';\n const url = toAbsolute(baseURL, href);\n const title = (a.text() || row.find('.views-field-title .field-content').text() || '').trim();\n\n const pickImg = row.find('.views-field-field-preview img').first().length\n ? row.find('.views-field-field-preview img').first()\n : row.find('.views-field-field-image img').first().length\n ? row.find('.views-field-field-image img').first()\n : row.find('.views-field-field-fl-prev img').first().length\n ? row.find('.views-field-field-fl-prev img').first()\n : row.find('.views-field-field-album-preview img').first().length\n ? row.find('.views-field-field-album-preview img').first()\n : row.find('.views-field-field-vd-preciew img').first().length\n ? row.find('.views-field-field-vd-preciew img').first()\n : row.find('.views-field-field-gif-pre img').first().length\n ? row.find('.views-field-field-gif-pre img').first()\n : row.find('.views-field-field-avatar img').first().length\n ? row.find('.views-field-field-avatar img').first()\n : row.find('img').first();\n\n let thumb = pickImg.attr('data-src') || pickImg.attr('src') || undefined;\n thumb = toAbsolute(baseURL, thumb);\n\n if (url && title) items.push({ title, url, thumb });\n });\n\n const totalPages = extractTotalPages(html);\n const hasNext = page + 1 < totalPages;\n\n if (items.length === 0) {\n return { items: [], page, hasNext: false, totalPages: 1 };\n }\n return { items, page, hasNext, totalPages };\n}\n","import * as cheerio from 'cheerio';\n\nexport function extractViewsContextForSearch(html: string): {\n view_name: string;\n view_display_id: string;\n view_dom_id: string;\n ajax_html_id?: string;\n} {\n const $ = cheerio.load(html);\n\n const view = $('.view')\n .filter((_, el) => {\n const cls = $(el).attr('class') || '';\n return /view-id-search/.test(cls) && /view-display-id-page/.test(cls);\n })\n .first();\n\n const cls = view.attr('class') || '';\n const view_name = cls.match(/view-id-([^\\s]+)/)?.[1] || 'search';\n const view_display_id = cls.match(/view-display-id-([^\\s]+)/)?.[1] || 'page';\n\n const domFromClass = cls.match(/view-dom-id-([^\\s]+)/)?.[1] || '';\n const domFromId = (view.attr('id') || '').replace(/^view-dom-id-/, '');\n const view_dom_id = domFromClass || domFromId || 'view-dom-id-1';\n\n const ajax_html_id = $('[id^=\"views-exposed-form\"]').attr('id') || view.attr('id') || undefined;\n\n return { view_name, view_display_id, view_dom_id, ajax_html_id };\n}\n\nexport function extractHtmlFromDrupalAjax(payload: unknown, wantDomId?: string): string | null {\n if (Array.isArray(payload)) {\n for (const cmd of payload) {\n const c = cmd as any;\n const sel = String(c?.selector || '');\n const data = c?.data;\n if (\n (c?.command === 'insert' || c?.command === 'replaceWith') &&\n typeof data === 'string' &&\n data.trim() &&\n (!wantDomId || sel.includes(wantDomId) || sel.includes('view-content'))\n )\n return data;\n }\n const concat = payload.map((x: any) => (typeof x?.data === 'string' ? x.data : '')).join('');\n return concat.trim() ? concat : null;\n }\n const disp = (payload as any)?.display;\n return typeof disp === 'string' ? disp : null;\n}\n","import { HttpClient } from '../http';\nimport { UpdatesResult, MultpornUpdatesParams, ListingItem, ViewName } from '../types';\nimport { parseViewDisplay } from '../parsers/viewDisplay';\n\ntype JCarouselResponse = {\n status: boolean;\n display: string;\n title?: string;\n messages?: string;\n};\n\nconst VIEW_PRESETS: Record<\n string,\n { view_display_id?: string; jcarousel_dom_id?: string | number }\n> = {\n random_top_comics: { view_display_id: 'block', jcarousel_dom_id: 7 },\n top_random_characters: { view_display_id: 'block', jcarousel_dom_id: 8 },\n};\n\nfunction uniq<T>(arr: T[]): T[] {\n return Array.from(new Set(arr));\n}\n\nexport async function updates(\n http: HttpClient,\n baseURL: string,\n params: MultpornUpdatesParams = {},\n): Promise<UpdatesResult> {\n const viewName: ViewName = (params.view_name as ViewName) ?? ('new_mini' as ViewName);\n\n const preset = VIEW_PRESETS[viewName] || {};\n const first = Number(params.first ?? 0);\n const last = Number(params.last ?? 8);\n\n const basePayload = {\n js: '1',\n first: String(first),\n last: String(last),\n view_args: params.view_args ?? '',\n view_path: params.view_path ?? 'node',\n view_base_path: params.view_base_path ?? '',\n view_name: viewName,\n };\n\n const displayCandidates = uniq<string>([\n params.view_display_id ?? preset.view_display_id ?? 'block_1',\n 'block',\n 'block_2',\n 'block_3',\n 'page',\n 'default',\n ]).filter(Boolean);\n\n const origDom = Number(params.jcarousel_dom_id ?? preset.jcarousel_dom_id ?? 1);\n const domCandidates = uniq<number>([\n origDom,\n origDom - 1,\n origDom + 1,\n ...Array.from({ length: 10 }, (_, i) => i + 1),\n ]).filter((n) => Number.isFinite(n) && n > 0);\n\n let displayHtml = '';\n\n for (const view_display_id of displayCandidates) {\n for (const jcarousel_dom_id of domCandidates) {\n try {\n const qs = new URLSearchParams({\n ...basePayload,\n view_display_id: String(view_display_id),\n jcarousel_dom_id: String(jcarousel_dom_id),\n }).toString();\n\n const data = await http.getJson<JCarouselResponse>(`/jcarousel/ajax/views?${qs}`);\n const html = data?.display?.trim() ?? '';\n if (html) {\n displayHtml = html;\n displayCandidates.length = 0;\n break;\n }\n } catch {\n }\n }\n }\n\n if (!displayHtml) {\n return { items: [], first, last, html: '', viewName };\n }\n\n const items: ListingItem[] = parseViewDisplay(viewName, displayHtml, baseURL);\n return { items, first, last, html: displayHtml, viewName };\n}\n\nexport const updatesShortcuts = {\n newMini: (http: HttpClient, baseURL: string, p?: Omit<MultpornUpdatesParams, 'view_name'>) =>\n updates(http, baseURL, { ...(p ?? {}), view_name: 'new_mini' }),\n userUploadFront: (\n http: HttpClient,\n baseURL: string,\n p?: Omit<MultpornUpdatesParams, 'view_name'>,\n ) => updates(http, baseURL, { ...(p ?? {}), view_name: 'user_upload_front' }),\n updatedManga: (http: HttpClient, baseURL: string, p?: Omit<MultpornUpdatesParams, 'view_name'>) =>\n updates(http, baseURL, { ...(p ?? {}), view_name: 'updated_manga' }),\n updatedMangaPromoted: (\n http: HttpClient,\n baseURL: string,\n p?: Omit<MultpornUpdatesParams, 'view_name'>,\n ) => updates(http, baseURL, { ...(p ?? {}), view_name: 'updated_manga_promoted' }),\n updatedGames: (http: HttpClient, baseURL: string, p?: Omit<MultpornUpdatesParams, 'view_name'>) =>\n updates(http, baseURL, { ...(p ?? {}), view_name: 'updated_games' }),\n randomTopComics: (\n http: HttpClient,\n baseURL: string,\n p?: Omit<MultpornUpdatesParams, 'view_name'>,\n ) => updates(http, baseURL, { ...(p ?? {}), view_name: 'random_top_comics' }),\n topRandomCharacters: (\n http: HttpClient,\n baseURL: string,\n p?: Omit<MultpornUpdatesParams, 'view_name'>,\n ) => updates(http, baseURL, { ...(p ?? {}), view_name: 'top_random_characters' }),\n};\n","import * as cheerio from 'cheerio';\nimport type { Cheerio } from 'cheerio';\nimport { ListingItem, ViewName } from '../types';\nimport { toAbsolute } from '../utils';\n\nexport function parseViewDisplay(\n viewName: ViewName | string,\n html: string,\n baseURL: string,\n): ListingItem[] {\n const $ = cheerio.load(html);\n const items: ListingItem[] = [];\n\n const pickThumb = (scope: Cheerio<any>) => {\n const img = scope.find('.views-field-field-preview img').first().length\n ? scope.find('.views-field-field-preview img').first()\n : scope.find('.views-field-field-image img').first().length\n ? scope.find('.views-field-field-image img').first()\n : scope.find('.views-field-field-avatar img').first().length\n ? scope.find('.views-field-field-avatar img').first()\n : scope.find('img').first();\n let thumb = img.attr('data-src') || img.attr('src') || undefined;\n return toAbsolute(baseURL, thumb);\n };\n\n const liList = $('ul.jcarousel li');\n liList.each((_, li) => {\n const scope = $(li);\n\n const a = scope.find('.views-field-title a[href]').first().length\n ? scope.find('.views-field-title a[href]').first()\n : scope.find('.views-field-name a[href]').first();\n\n const href = a.attr('href') || '';\n const url = toAbsolute(baseURL, href);\n\n const title = (\n a.text() ||\n scope.find('.views-field-title .field-content').text() ||\n scope.find('.views-field-name .field-content').text() ||\n ''\n ).trim();\n\n const thumb = pickThumb(scope);\n\n if (url && title) items.push({ title, url, thumb });\n });\n\n return items;\n}\n","import {\n absUrl,\n normSpace,\n parseIntLike,\n parseNumberLike,\n toAbsolute,\n uniq,\n guessKindFromPath,\n} from '../utils';\nimport type { LinkItem, ViewerImage, ViewerKind, ViewerMeta } from '../types';\n\nfunction decodeHtml(s: string): string {\n return s\n .replace(/ /g, ' ')\n .replace(/&/g, '&')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\nfunction textBetween(html: string, openRe: RegExp, close: string): string | null {\n const m = openRe.exec(html);\n if (!m) return null;\n const i = m.index + m[0].length;\n const j = html.indexOf(close, i);\n if (j < 0) return null;\n return html.slice(i, j);\n}\n\nfunction stripTags(s: string): string {\n return s.replace(/<[^>]*>/g, '');\n}\n\nfunction collectLinks(blockHtml: string, baseURL: string): LinkItem[] {\n const out: LinkItem[] = [];\n const re = /<a\\s+[^>]*href=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>/gi;\n let m: RegExpExecArray | null;\n while ((m = re.exec(blockHtml))) {\n const url = absUrl(baseURL, m[1]) ?? '';\n const title = normSpace(decodeHtml(stripTags(m[2])));\n if (url && title) out.push({ url, title });\n }\n return out;\n}\n\nfunction findFieldNodeAndSys(html: string): { nodeId: number; fieldSys: string } | null {\n const re = /id=\"field--node--(\\d+)--([a-z0-9_-]+)--full\"/i;\n const m = re.exec(html);\n if (m) {\n const nodeId = parseInt(m[1], 10);\n const fieldSys = m[2].replace(/-/g, '_');\n if (Number.isFinite(nodeId)) return { nodeId, fieldSys };\n }\n\n const re2 = /\\/juicebox\\/xml\\/field\\/node\\/(\\d+)\\/([a-z0-9_]+)\\/full/gi;\n const m2 = re2.exec(html);\n if (m2) {\n const nodeId = parseInt(m2[1], 10);\n const fieldSys = m2[2];\n if (Number.isFinite(nodeId)) return { nodeId, fieldSys };\n }\n return null;\n}\n\nexport function buildJuiceboxXmlUrl(baseURL: string, nodeId: number, fieldSys: string): string {\n const root = baseURL.replace(/\\/+$/, '');\n return `${root}/juicebox/xml/field/node/${nodeId}/${fieldSys}/full`;\n}\n\nexport function parseJuiceboxXml(xml: string): ViewerImage[] {\n const images: ViewerImage[] = [];\n const reImg = /<image\\b([^>]+)>/gi;\n let m: RegExpExecArray | null;\n while ((m = reImg.exec(xml))) {\n const attrs = m[1];\n const map: Record<string, string> = {};\n let am: RegExpExecArray | null;\n const reAttr = /([a-zA-Z0-9_-]+)\\s*=\\s*\"([^\"]*)\"/g;\n while ((am = reAttr.exec(attrs))) map[am[1]] = am[2];\n\n const original =\n map['linkURL'] || map['imageURL'] || map['largeImageURL'] || map['smallImageURL'] || '';\n if (!original) continue;\n\n images.push({\n original,\n large: map['largeImageURL'],\n medium: map['imageURL'] || map['smallImageURL'],\n small: map['smallImageURL'],\n thumb: map['thumbURL'],\n });\n }\n return images;\n}\n\nexport function parseInlineJuiceboxFromHtml(html: string): ViewerImage[] {\n const out: ViewerImage[] = [];\n const reMed = /<img[^>]+src=\"([^\"]+\\/styles\\/juicebox_(?:medium|small|large)\\/[^\"]+)\"[^>]*>/gi;\n const seen = new Set<string>();\n let m: RegExpExecArray | null;\n while ((m = reMed.exec(html))) {\n const url = m[1];\n if (seen.has(url)) continue;\n seen.add(url);\n out.push({ original: url, medium: url });\n }\n return out;\n}\n\nfunction parseBreadcrumbs(html: string, baseURL: string): LinkItem[] {\n const block = textBetween(html, /<div[^>]+class=\"breadcrumb\"[^>]*>/i, '</div>');\n return block ? collectLinks(block, baseURL) : [];\n}\n\nfunction findLabeledFieldBlock(html: string, labelStartsWith: string): string | null {\n const esc = labelStartsWith.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const re = new RegExp(\n `<(?:h3|div)[^>]*class=\"[^\"]*field-label[^\"]*\"[^>]*>\\\\s*${esc}\\\\s*:?\\\\s*<\\\\/[^>]+>`,\n 'i',\n );\n const idx = html.search(re);\n if (idx < 0) return null;\n\n const open = html.lastIndexOf('<div', idx);\n let depth = 0;\n for (let i = open; i < html.length; i++) {\n if (html.startsWith('<div', i)) depth++;\n if (html.startsWith('</div>', i)) {\n depth--;\n if (depth === 0) {\n return html.slice(open, i + 6);\n }\n }\n }\n return null;\n}\n\nfunction parseLabeledField(html: string, labelStartsWith: string): string | null {\n return findLabeledFieldBlock(html, labelStartsWith);\n}\n\nfunction parsePlainValuesFromLabeledField(html: string, label: string): string[] {\n const block = findLabeledFieldBlock(html, label);\n if (!block) return [];\n const text = normSpace(decodeHtml(stripTags(block)))\n .replace(new RegExp(`^${label}\\\\s*:?\\\\s*`, 'i'), '')\n .trim();\n if (!text) return [];\n return text.split(/\\s*[,;]\\s*/).filter(Boolean);\n}\n\nfunction parseTitle(html: string): string {\n const h1 = textBetween(html, /<h1[^>]*id=\"page-title\"[^>]*>/i, '</h1>');\n if (h1) return normSpace(decodeHtml(stripTags(h1)));\n const m = /<meta[^>]+property=\"og:title\"[^>]+content=\"([^\"]+)\"/i.exec(html);\n if (m) return normSpace(decodeHtml(m[1]));\n return '';\n}\n\nfunction parseVotesAndRating(html: string): { rating?: number; votes?: number } {\n const block =\n /<div[^>]*class=\"[^\"]*\\bfivestar-summary\\b[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/i.exec(html)?.[1] ||\n /<div[^>]*class=\"[^\"]*\\bfivestar-average[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/i.exec(html)?.[1] ||\n '';\n\n if (block) {\n const mAvg =\n /class=\"average-rating\"[^>]*>[\\s\\S]*?Average[^:]*:\\s*(?:<span[^>]*>)?([\\d.,]+)(?:<\\/span>)?/i.exec(\n block,\n );\n const mVotes =\n /class=\"total-votes\"[^>]*>\\s*\\(\\s*(?:<span[^>]*>)?(\\d+)(?:<\\/span>)?\\s+votes?\\s*\\)/i.exec(\n block,\n );\n\n const rating = mAvg ? parseNumberLike(mAvg[1]) : undefined;\n const votes = mVotes ? parseIntLike(mVotes[1]) : undefined;\n if (rating != null || votes != null) return { rating, votes };\n }\n\n const m1 =\n /Average\\s*:\\s*(?:<span[^>]*>)?([\\d.,]+)(?:<\\/span>)?[\\s\\S]*?\\(\\s*(?:<span[^>]*>)?(\\d+)(?:<\\/span>)?\\s*votes?\\s*\\)/i.exec(\n html,\n );\n if (m1) {\n return {\n rating: parseNumberLike(m1[1]),\n votes: parseIntLike(m1[2]),\n };\n }\n\n const m2 = /Average[^<>\\d]*([\\d.,]+)/i.exec(html);\n const m3 = /\\((\\d+)\\s+votes?\\)/i.exec(html);\n if (m2 || m3) {\n const rating = m2 ? parseNumberLike(m2[1]) : undefined;\n const votes = m3 ? parseIntLike(m3[1]) : undefined;\n return { rating, votes };\n }\n\n return {};\n}\n\nfunction parseViews(html: string): number | undefined {\n const patterns: RegExp[] = [\n /<li[^>]*class=\"statistics_counter[^\"]*\"[^>]*>\\s*<span>\\s*([\\d\\s.,]+)\\s+views\\s*<\\/span>/i,\n />\\s*([\\d\\s.,]+)\\s+views\\s*<\\/(?:span|div|li|h\\d)>/i,\n />\\s*Views\\s*[:\\-]?\\s*<\\/?(?:span|strong|b)?[^>]*>\\s*([\\d\\s.,]+)\\s*</i,\n /\\bViews\\s*[:\\-]?\\s*([\\d\\s.,]+)/i,\n ];\n for (const rx of patterns) {\n const m = rx.exec(html);\n if (m && m[1]) return parseIntLike(m[1]);\n }\n return undefined;\n}\n\nfunction parseLinksFromLabeledField(html: string, baseURL: string, label: string): LinkItem[] {\n const block = parseLabeledField(html, label);\n return block ? collectLinks(block, baseURL) : [];\n}\n\nfunction parseRelated(html: string, baseURL: string): LinkItem[] {\n const pieces: string[] = [];\n const re =\n /<div[^>]+class=\"view[^\"]*down[^\"]*random[^\"]*hentai[^\"]*manga[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>\\s*<\\/div>/gi;\n let m: RegExpExecArray | null;\n while ((m = re.exec(html))) pieces.push(m[1]);\n return uniq(pieces.flatMap((p) => collectLinks(p, baseURL)));\n}\n\nfunction parseUploader(\n html: string,\n baseURL: string,\n):\n | {\n name?: string;\n url?: string;\n avatar?: string;\n dateText?: string;\n }\n | undefined {\n const m = /<footer[^>]*class=\"[^\"]*\\bsubmitted\\b[^\"]*\"[^>]*>([\\s\\S]*?)<\\/footer>/i.exec(html);\n if (!m) return undefined;\n const block = m[1];\n\n const a = /Uploaded\\s+by\\s*<a[^>]*href=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>\\s*on\\s*([^<]+)/i.exec(\n block,\n );\n const img = /<div[^>]*class=\"user-picture\"[^>]*>[\\s\\S]*?<img[^>]*src=\"([^\"]+)\"/i.exec(block);\n\n const out: { name?: string; url?: string; avatar?: string; dateText?: string } = {};\n if (a) {\n out.url = absUrl(baseURL, a[1]) ?? '';\n out.name = normSpace(decodeHtml(stripTags(a[2])));\n out.dateText = normSpace(decodeHtml(a[3]));\n }\n if (img) out.avatar = absUrl(baseURL, img[1]) ?? '';\n return out;\n}\n\nexport function parseViewerMeta(\n html: string,\n baseURL: string,\n absoluteUrl: string,\n): {\n meta: ViewerMeta;\n nodeId: number | null;\n fieldSys: string | null;\n} {\n const title = parseTitle(html);\n const breadcrumbs = parseBreadcrumbs(html, baseURL);\n\n let authors = parseLinksFromLabeledField(html, baseURL, 'Author');\n if (authors.length === 0) {\n const altLinks = parseLinksFromLabeledField(html, baseURL, \"Artist's name\");\n if (altLinks.length) authors = altLinks;\n if (authors.length === 0) {\n const altPlain = parsePlainValuesFromLabeledField(html, \"Artist's name\");\n if (altPlain.length) {\n authors = altPlain.map((t) => ({ title: t, url: '' }));\n }\n }\n }\n\n let sections = parseLinksFromLabeledField(html, baseURL, 'Section');\n if (sections.length === 0) {\n const sPlain = parsePlainValuesFromLabeledField(html, 'Section');\n if (sPlain.length) sections = sPlain.map((t) => ({ title: t, url: '' }));\n }\n\n let tags = parseLinksFromLabeledField(html, baseURL, 'Tags');\n if (tags.length === 0) {\n const block =\n /<div[^>]*class=\"[^\"]*field-name-field-category[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/i.exec(html);\n if (block) tags = collectLinks(block[1], baseURL);\n }\n\n const characters = parseLinksFromLabeledField(html, baseURL, 'Characters');\n const userTags = parseLinksFromLabeledField(html, baseURL, 'User tags');\n const { rating, votes } = parseVotesAndRating(html);\n const views = parseViews(html);\n\n const kind: ViewerKind = guessKindFromPath(absoluteUrl);\n const field = findFieldNodeAndSys(html);\n const uploader = parseUploader(html, baseURL);\n\n const meta: ViewerMeta = {\n nodeId: field?.nodeId ?? null,\n fieldSys: field?.fieldSys ?? null,\n title,\n kind,\n breadcrumbs,\n authors,\n sections,\n tags,\n characters,\n userTags,\n rating,\n votes,\n views,\n related: parseRelated(html, baseURL),\n };\n\n if (uploader) {\n (meta as any).uploader = uploader;\n }\n\n return { meta, nodeId: meta.nodeId, fieldSys: meta.fieldSys };\n}\n\nfunction findCanonicalUrl(html: string, baseURL: string): string {\n const m1 = /<link[^>]+rel=[\"']canonical[\"'][^>]+href=[\"']([^\"']+)[\"']/i.exec(html);\n if (m1?.[1]) return absUrl(baseURL, m1[1]) ?? baseURL.replace(/\\/+$/, '');\n const m2 = /<meta[^>]+property=[\"']og:url[\"'][^>]+content=[\"']([^\"']+)[\"']/i.exec(html);\n if (m2?.[1]) return absUrl(baseURL, m2[1]) ?? baseURL.replace(/\\/+$/, '');\n return baseURL.replace(/\\/+$/, '');\n}\n\nconst EXCLUDE_URL_PATTERNS: RegExp[] = [\n /\\/styles\\/avatars\\//i,\n /\\/user_avatars\\//i,\n /\\/default_images\\//i,\n /\\/styles\\/taxonomy_(?:comics|manga)\\//i,\n /\\/com_preview\\//i,\n /\\/promo\\//i,\n];\n\nfunction isExcludedUrl(u: string): boolean {\n const s = String(u);\n return EXCLUDE_URL_PATTERNS.some((re) => re.test(s));\n}\n\nfunction stripExcludedBlocks(html: string): string {\n const patterns: RegExp[] = [\n /<div[^>]+id=\"comments\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n /<section[^>]+id=\"comments\"[^>]*>[\\s\\S]*?<\\/section>/gi,\n /<div[^>]+class=\"[^\"]*\\bcomments?\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n /<div[^>]+class=\"[^\"]*\\bcomment\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n /<ul[^>]+class=\"[^\"]*\\bcomment\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/ul>/gi,\n\n /<div[^>]+class=\"[^\"]*\\brelated\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n /<div[^>]+class=\"[^\"]*\\bmore\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n /<div[^>]+class=\"[^\"]*\\bmore-comics\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n /<div[^>]+class=\"[^\"]*\\bpane-related\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n\n /<aside[\\s\\S]*?<\\/aside>/gi,\n /<div[^>]+class=\"[^\"]*\\bsidebar\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n /<div[^>]+class=\"[^\"]*\\bnode-footer\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n\n /<div[^>]+class=\"[^\"]*\\bpane-views\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n /<div[^>]+class=\"[^\"]*\\bpane-taxonomy\\b[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/gi,\n ];\n\n let cleaned = html;\n for (const re of patterns) cleaned = cleaned.replace(re, '');\n return cleaned;\n}\n\nfunction collectImgSrcs(html: string): string[] {\n const out: string[] = [];\n const re = /<img[^>]+src=[\"']([^\"']+)[\"'][^>]*>/gi;\n let m: RegExpExecArray | null;\n while ((m = re.exec(html))) out.push(m[1]);\n return out;\n}\n\nfunction collectContentImages(html: string): string[] {\n const cleaned = stripExcludedBlocks(html);\n return collectImgSrcs(cleaned).filter((u) => !!u && !isExcludedUrl(u));\n}\n\nexport function parseViewer(\n html: string,\n baseURL: string,\n): { meta: ViewerMeta; images: ViewerImage[] } {\n const absoluteUrl = findCanonicalUrl(html, baseURL);\n const { meta } = parseViewerMeta(html, baseURL, absoluteUrl);\n\n const inline: ViewerImage[] = parseInlineJuiceboxFromHtml(html)\n .map((im): ViewerImage => {\n const original = (toAbsolute(baseURL, im.original || '') || '') as string;\n return {\n original,\n large: im.large ? toAbsolute(baseURL, im.large) || undefined : undefined,\n medium: im.medium ? toAbsolute(baseURL, im.medium) || undefined : undefined,\n small: im.small ? toAbsolute(baseURL, im.small) || undefined : undefined,\n thumb: im.thumb ? toAbsolute(baseURL, im.thumb) || undefined : undefined,\n };\n })\n .filter((im) => !!im.original);\n\n let fallback: ViewerImage[] = [];\n if (inline.length === 0) {\n const srcs = collectContentImages(html)\n .map((u) => toAbsolute(baseURL, u) || '')\n .filter((u) => !!u);\n\n const seen = new Set<string>();\n fallback = srcs\n .filter((u) => {\n if (!u || seen.has(u)) return false;\n seen.add(u);\n return true;\n })\n .map((u): ViewerImage => ({ original: u }));\n }\n\n const all: ViewerImage[] = [...inline, ...fallback];\n const byOriginal = new Map<string, ViewerImage>();\n for (const im of all) {\n const key = im.original || '';\n if (key && !byOriginal.has(key)) byOriginal.set(key, im as ViewerImage);\n }\n\n return { meta, images: Array.from(byOriginal.values()) };\n}\n\nexport default parseViewer;\n","export interface ParsedVideo {\n poster?: string;\n sources: Array<{ url: string; type?: string; label?: string }>;\n}\n\nconst ABS_URL = /^https?:\\/\\//i;\n\nfunction absolutize(u: string, base: string) {\n if (!u) return '';\n if (ABS_URL.test(u)) return u;\n if (u.startsWith('//')) return 'https:' + u;\n if (u.startsWith('/')) return base.replace(/\\/+$/, '') + u;\n return u;\n}\n\nexport function parseVideoFromHtml(html: string, baseURL: string): ParsedVideo | null {\n if (!html || !/node-video|class=[\"']video-js|<video/i.test(html)) return null;\n\n const posterMatch =\n html.match(/<video[^>]*\\sposter=[\"']([^\"']+)[\"']/i) ||\n html.match(/class=[\"']video-js[^\"']*[\"'][^>]*\\sposter=[\"']([^\"']+)[\"']/i);\n\n const poster = posterMatch ? absolutize(posterMatch[1], baseURL) : undefined;\n\n const sources: Array<{ url: string; type?: string; label?: string }> = [];\n\n const mainVideo = html.match(/<video[^>]*\\ssrc=[\"']([^\"']+)[\"'][^>]*>/i);\n if (mainVideo) sources.push({ url: absolutize(mainVideo[1], baseURL) });\n\n const re = /<source[^>]*\\ssrc=[\"']([^\"']+)[\"'][^>]*?(?:\\stype=[\"']([^\"']+)[\"'])?[^>]*>/gi;\n for (let m: RegExpExecArray | null; (m = re.exec(html)); ) {\n sources.push({ url: absolutize(m[1], baseURL), type: m[2] });\n }\n\n if (!sources.length) return null;\n\n return { poster, sources };\n}\n","import { HttpClient } from '../http';\nimport {\n ResolveOptions,\n ViewerMeta,\n ViewerImage,\n ViewerResult,\n ResolvedRoute,\n ViewerPayload,\n Page,\n ListingItem,\n} from '../types';\n\nimport * as viewerParsers from '../parsers/viewer';\nimport { parseVideoFromHtml } from '../parsers/video';\nimport { parseHubListing } from '../parsers/listing';\nimport { ListingsAPI } from './index';\n\nconst ABS_URL = /^https?:\\/\\//i;\n\nfunction absolutize(u: string, base: string) {\n if (!u) return '';\n if (ABS_URL.test(u)) return u;\n if (u.startsWith('//')) return 'https:' + u;\n if (u.startsWith('/')) return base.replace(/\\/+$/, '') + u;\n return base.replace(/\\/+$/, '') + '/' + u.replace(/^\\/+/, '');\n}\n\nfunction buildViewerUrl(base: string, urlOrSlug: string) {\n if (ABS_URL.test(urlOrSlug)) return urlOrSlug;\n if (urlOrSlug.startsWith('/')) return base.replace(/\\/+$/, '') + urlOrSlug;\n return base.replace(/\\/+$/, '') + '/' + urlOrSlug.replace(/^\\/+/, '');\n}\n\nasync function fetchHtml(http: HttpClient, url: string): Promise<string> {\n const anyHttp = http as any;\n\n if (typeof anyHttp.getText === 'function') return anyHttp.getText(url);\n if (typeof anyHttp.get === 'function') return anyHttp.get(url) as Promise<string>;\n\n if (typeof anyHttp.text === 'function') return anyHttp.text(url);\n if (typeof anyHttp.fetch === 'function') {\n const r = await anyHttp.fetch(url);\n if (typeof r === 'string') return r;\n if (r && typeof r.text === 'function') return await r.text();\n }\n\n if (typeof fetch === 'function') {\n const r = await fetch(url);\n return await r.text();\n }\n\n throw new Error('HttpClient: no getText/get/text/fetch available');\n}\n\nfunction proxyImgMaybe(u: string, opts?: ResolveOptions): string {\n if (!u) return '';\n return opts?.proxyImage ? opts.proxyImage(u) : u;\n}\nfunction proxyVidMaybe(u: string, opts?: ResolveOptions): string {\n if (!u) return '';\n const proxyVideo = (opts as any)?.proxyVideo as ((url: string) => string) | undefined;\n return proxyVideo ? proxyVideo(u) : proxyImgMaybe(u, opts);\n}\n\nfunction tryParseRichMeta(html: string, baseURL: string, absoluteUrl: string): ViewerMeta {\n const anyParsers = viewerParsers as unknown as {\n parseViewerMeta?: (\n h: string,\n b: string,\n abs: string,\n ) => { meta: ViewerMeta; nodeId: number | null; fieldSys: string | null };\n };\n\n if (typeof anyParsers.parseViewerMeta === 'function') {\n try {\n const { meta } = anyParsers.parseViewerMeta(html, baseURL, absoluteUrl);\n if (!meta.title) {\n const t = extractMeta(html, baseURL).title;\n if (t) (meta as any).title = t;\n }\n return meta;\n } catch {}\n }\n return extractMeta(html, baseURL);\n}\n\nfunction parseImagesWithBackoff(\n html: string,\n baseURL: string,\n): { meta: ViewerMeta; images: ViewerImage[] } {\n const anyParsers = viewerParsers as unknown as {\n parseViewer?: (h: string, b: string) => { meta: ViewerMeta; images: ViewerImage[] };\n default?: (h: string, b: string) => { meta: ViewerMeta; images: ViewerImage[] };\n };\n const candidate = anyParsers.parseViewer ?? anyParsers.default;\n\n if (typeof candidate === 'function') {\n return candidate(html, baseURL);\n }\n\n const images: ViewerImage[] = [];\n const re = /<img[^>]+src=[\"']([^\"']+)[\"'][^>]*>/gi;\n let m: RegExpExecArray | null;\n while ((m = re.exec(html))) {\n const original = absolutize(m[1], baseURL);\n if (!original) continue;\n images.push({ original, medium: original } as ViewerImage);\n }\n\n const meta = extractMeta(html, baseURL);\n return { meta, images };\n}\n\nfunction hasViewerClues(html: string): boolean {\n const hasJuicebox =\n /juicebox/i.test(html) || /\\/juicebox\\/xml\\/field\\/node\\/\\d+\\/[a-z0-9_]+\\/full/i.test(html);\n const hasFieldNode = /id=[\"']field--node--\\d+--[a-z0-9_-]+--full[\"']/i.test(html);\n const hasJbStyles = /styles\\/juicebox_(?:large|medium|small)\\//i.test(html);\n const hasNodeBody = /<body[^>]+class=[\"'][^\"']*\\bnode\\b[^\"']*[\"']/i.test(html);\n const hasGalleryField = /field-name-(?:field_)?(?:pictures|images|image|post_pictures)\\b/i.test(\n html,\n );\n return hasJuicebox || hasFieldNode || hasJbStyles || hasNodeBody || hasGalleryField;\n}\n\nexport const ViewerAPI = {\n async resolveViewer(\n http: HttpClient,\n baseURL: string,\n urlOrSlug: string,\n opts: ResolveOptions = {},\n ): Promise<ViewerResult> {\n const url = buildViewerUrl(baseURL, urlOrSlug);\n const html = await fetchHtml(http, url);\n\n const parsedVideo = parseVideoFromHtml(html, baseURL);\n if (parsedVideo && parsedVideo.sources?.length) {\n const meta = tryParseRichMeta(html, baseURL, url);\n return {\n kind: 'video',\n meta,\n video: {\n poster: parsedVideo.poster ? proxyImgMaybe(parsedVideo.poster, opts) : undefined,\n sources: parsedVideo.sources.map((s) => ({\n ...s,\n proxied: proxyVidMaybe(s.url, opts),\n })),\n },\n };\n }\n\n if (hasViewerClues(html)) {\n const imgRes = parseImagesWithBackoff(html, baseURL);\n const images: ViewerImage[] = (imgRes.images || []).map((im: ViewerImage) => {\n const preferred =\n im.original ||\n (im as any).large ||\n (im as any).medium ||\n (im as any).small ||\n (im as any).thumb ||\n '';\n return { ...im, proxied: proxyImgMaybe(preferred, opts) };\n });\n return {\n kind: 'images',\n meta: imgRes.meta,\n images,\n };\n }\n\n return { kind: 'other', meta: extractMeta(html, baseURL) };\n },\n\n async resolveSmart(\n http: HttpClient,\n baseURL: string,\n urlOrSlug: string,\n opts: ResolveOptions = {},\n ): Promise<ResolvedRoute> {\n const url = buildViewerUrl(baseURL, urlOrSlug);\n const u = new URL(url);\n const path = u.pathname;\n\n const html = await fetchHtml(http, url);\n\n const parsedVideo = parseVideoFromHtml(html, baseURL);\n if (parsedVideo && parsedVideo.sources?.length) {\n const meta = tryParseRichMeta(html, baseURL, url);\n const viewer: ViewerResult = {\n kind: 'video',\n meta,\n video: {\n poster: parsedVideo.poster ? proxyImgMaybe(parsedVideo.poster, opts) : undefined,\n sources: parsedVideo.sources.map((s) => ({\n ...s,\n proxied: proxyVidMaybe(s.url, opts),\n })),\n },\n };\n\n let recommendations: ListingItem[] | undefined;\n try {\n const recPage = parseHubListing(html, baseURL, 0);\n if (recPage?.items?.length) {\n recommendations = recPage.items.map((it) => ({\n ...it,\n proxiedThumb: it.thumb ? proxyImgMaybe(it.thumb, opts) : undefined,\n }));\n }\n } catch {}\n\n const data: ViewerPayload = { absoluteUrl: url, path, viewer };\n (data as any).recommendations = recommendations;\n return { route: 'viewer', data: data as any };\n }\n\n if (hasViewerClues(html)) {\n const { meta, images } = parseImagesWithBackoff(html, baseURL);\n const mapped: ViewerImage[] = (images || []).map((im: ViewerImage) => {\n const preferred =\n im.original ||\n (im as any).large ||\n (im as any).medium ||\n (im as any).small ||\n (im as any).thumb ||\n '';\n return { ...im, proxied: proxyImgMaybe(preferred, opts) };\n });\n\n const viewer: ViewerResult = { kind: 'images', meta, images: mapped };\n\n let recommendations: ListingItem[] | undefined;\n try {\n const recPage = parseHubListing(html, baseURL, 0);\n if (recPage?.items?.length) {\n recommendations = recPage.items.map((it) => ({\n ...it,\n proxiedThumb: it.thumb ? proxyImgMaybe(it.thumb, opts) : undefined,\n }));\n }\n } catch {}\n\n const data: ViewerPayload = { absoluteUrl: url, path, viewer };\n (data as any).recommendations = recommendations;\n return { route: 'viewer', data: data as any };\n }\n\n const page: Page<ListingItem> = await ListingsAPI.listByPath(http, baseURL, path, 0);\n return { route: 'listing', data: { ...page, absoluteUrl: url, path } as any };\n },\n};\n\nfunction extractText(html: string, re: RegExp) {\n const m = html.match(re);\n return m ? m[1].replace(/<[^>]*>/g, '').trim() : '';\n}\n\nfunction grabLinksByLabel(html: string, baseURL: string, label: string) {\n const esc = label.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const reLbl = new RegExp(\n `<(?:h3|div)[^>]*class=[\"'][^\"']*field-label[^\"']*[\"'][^>]*>\\\\s*${esc}\\\\s*:?\\\\s*<\\\\/[^>]+>`,\n 'i',\n );\n const idx = html.search(reLbl);\n if (idx < 0) return [];\n\n const open = html.lastIndexOf('<div', idx);\n const close = html.indexOf('</div>', idx);\n if (open < 0 || close < 0) return [];\n\n const block = html.slice(open, close + 6);\n const out: Array<{ title: string; url: string }> = [];\n const reA = /<a[^>]*href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi;\n for (let m: RegExpExecArray | null; (m = reA.exec(block)); ) {\n out.push({\n title: m[2].replace(/<[^>]*>/g, '').trim(),\n url: absolutize(m[1], baseURL),\n });\n }\n return out;\n}\n\nfunction grabLinks(html: string, blockRe: RegExp, baseURL: string) {\n const alt = `(?:${blockRe.source})`;\n const reDiv = new RegExp(\n `<div[^>]*class=[\"'][^\"']*\\\\bfield\\\\b[^\"']*\\\\b${alt}\\\\b[^\"']*[\"'][^>]*>([\\\\s\\\\S]*?)<\\\\/div>`,\n 'i',\n );\n\n const m = reDiv.exec(html);\n if (!m) return [];\n const block = m[1];\n\n const arr: Array<{ title: string; url: string }> = [];\n const reA = /<a[^>]*href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi;\n for (let x: RegExpExecArray | null; (x = reA.exec(block)); ) {\n arr.push({\n title: x[2].replace(/<[^>]*>/g, '').trim(),\n url: absolutize(x[1], baseURL),\n });\n }\n return arr;\n}\n\nfunction extractMeta(html: string, baseURL: string): ViewerMeta {\n const title =\n extractText(html, /<h1[^>]*id=[\"']page-title[\"'][^>]*>([\\s\\S]*?)<\\/h1>/i) ||\n extractText(html, /<title>([\\s\\S]*?)<\\/title>/i);\n\n const breadcrumbs: Array<{ title: string; url: string }> = [];\n const reCrumb =\n /<span[^>]*typeof=[\"']v:Breadcrumb[\"'][^>]*>[\\s\\S]*?<a[^>]*href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>[\\s\\S]*?<\\/span>/gi;\n for (let m: RegExpExecArray | null; (m = reCrumb.exec(html)); ) {\n breadcrumbs.push({\n title: m[2].replace(/<[^>]*>/g, '').trim(),\n url: absolutize(m[1], baseURL),\n });\n }\n\n let authors =\n grabLinks(\n html,\n /field-name-field-vd-authors|field-name-field-authors|field-name-field-au/i,\n baseURL,\n ) || [];\n if (authors.length === 0) {\n authors = grabLinksByLabel(html, baseURL, 'Author');\n }\n\n const sections = grabLinks(\n html,\n /field-name-field-vd-group|field-name-field-group|field-name-field-sections/i,\n baseURL,\n );\n const tags =\n grabLinks(html, /field-name-field-(?:vd-)?tags|field-name-field-category/i, baseURL) || [];\n\n const meta = {\n title,\n breadcrumbs,\n authors,\n sections,\n tags,\n nodeId: '' as any,\n fieldSys: {} as any,\n kind: 'viewer',\n } as unknown as ViewerMeta;\n\n return meta;\n}\n","import { HttpClient, HttpClientOptions } from './http';\nimport {\n ListingItem,\n Page,\n Post,\n UpdatesResult,\n ViewName,\n MultpornUpdatesParams,\n AlphabetSection,\n AlphabetLetter,\n ViewerResult,\n ResolveOptions,\n ResolvedRoute,\n ListingQuery,\n} from './types';\nimport { SearchAPI, UpdatesAPI, PostsAPI, ListingsAPI, AlphabetAPI, ViewerAPI } from './api/index';\nexport { parseHubListing as parseListing } from './parsers/listing';\nexport { parsePost } from './parsers/post';\n\nexport type MultpornClientOptions = Omit<HttpClientOptions, 'baseURL'> & { baseURL?: string };\n\nexport class MultpornClient {\n private http: HttpClient;\n private baseURL: string;\n\n constructor(opts: MultpornClientOptions = {}) {\n this.baseURL = (opts.baseURL ?? 'https://multporn.net').replace(/\\/+$/, '');\n this.http = new HttpClient({ ...opts, baseURL: this.baseURL });\n }\n\n latest(page = 0, params?: ListingQuery): Promise<Page<ListingItem>> {\n return ListingsAPI.latest(this.http, this.baseURL, page, params);\n }\n\n listByPath(\n path: string,\n page = 0,\n params?: ListingQuery & { letter?: string },\n ): Promise<Page<ListingItem>> {\n return ListingsAPI.listByPath(this.http, this.baseURL, path, page, params);\n }\n\n search(query: string, page = 0): Promise<Page<ListingItem>> {\n return SearchAPI.search(this.http, this.baseURL, query, page);\n }\n\n getPost(urlOrSlug: string): Promise<Post> {\n return PostsAPI.getPost(this.http, this.baseURL, urlOrSlug);\n }\n\n resolve(urlOrSlug: string, opts: ResolveOptions = {}): Promise<ViewerResult> {\n return ViewerAPI.resolveViewer(this.http, this.baseURL, urlOrSlug, opts);\n }\n\n resolveSmart(urlOrSlug: string, opts: ResolveOptions = {}): Promise<ResolvedRoute> {\n return ViewerAPI.resolveSmart(this.http, this.baseURL, urlOrSlug, opts);\n }\n\n updates(params: MultpornUpdatesParams = {}): Promise<UpdatesResult> {\n return UpdatesAPI.updates(this.http, this.baseURL, params);\n }\n\n viewUpdates(\n viewName: ViewName,\n params?: Omit<MultpornUpdatesParams, 'view_name'>,\n ): Promise<UpdatesResult> {\n return this.updates({ ...(params ?? {}), view_name: viewName });\n }\n\n updatesNewMini(p?: Omit<MultpornUpdatesParams, 'view_name'>) {\n return UpdatesAPI.updates(this.http, this.baseURL, { ...(p ?? {}), view_name: 'new_mini' });\n }\n userUploadFront(p?: Omit<MultpornUpdatesParams, 'view_name'>) {\n return UpdatesAPI.updates(this.http, this.baseURL, {\n ...(p ?? {}),\n view_name: 'user_upload_front',\n });\n }\n updatedManga(p?: Omit<MultpornUpdatesParams, 'view_name'>) {\n return UpdatesAPI.updates(this.http, this.baseURL, {\n ...(p ?? {}),\n view_name: 'updated_manga',\n });\n }\n updatedMangaPromoted(p?: Omit<MultpornUpdatesParams, 'view_name'>) {\n return UpdatesAPI.updates(this.http, this.baseURL, {\n ...(p ?? {}),\n view_name: 'updated_manga_promoted',\n });\n }\n updatedGames(p?: Omit<MultpornUpdatesParams, 'view_name'>) {\n return UpdatesAPI.updates(this.http, this.baseURL, {\n ...(p ?? {}),\n view_name: 'updated_games',\n });\n }\n randomTopComics(p?: Omit<MultpornUpdatesParams, 'view_name'>) {\n return UpdatesAPI.updates(this.http, this.baseURL, {\n ...(p ?? {}),\n view_name: 'random_top_comics',\n });\n }\n topRandomCharacters(p?: Omit<MultpornUpdatesParams, 'view_name'>) {\n return UpdatesAPI.updates(this.http, this.baseURL, {\n ...(p ?? {}),\n view_name: 'top_random_characters',\n });\n }\n\n alphabetLetters(section: AlphabetSection): Promise<AlphabetLetter[]> {\n return AlphabetAPI.alphabetLetters(this.http, this.baseURL, section);\n }\n alphabet(section: AlphabetSection, letter: string, page = 0) {\n return AlphabetAPI.alphabetItems(this.http, this.baseURL, section, letter, page);\n }\n}\n\nexport default MultpornClient;\n"],"mappings":"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","names":["cheerio","uniq","cheerio","pickFromSrcset","pickFromStyle","html0","applied","pageParam","html","cheerio","cheerio","cheerio","cls","cheerio","pickThumb","uniq","ABS_URL","absolutize"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "multporn-api-sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Unofficial Multporn HTML scraping SDK Node. Typed, with retries/timeouts.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Maks1mio",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.cjs",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"require": "./dist/index.cjs"
|
|
16
|
+
},
|
|
17
|
+
"./package.json": "./package.json"
|
|
18
|
+
},
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=18"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"start": "node examples/server/index.mjs",
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"prepare": "npm run build",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"dev:test": "vitest",
|
|
29
|
+
"lint": "eslint . --ext .ts",
|
|
30
|
+
"format": "prettier --write ."
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist"
|
|
34
|
+
],
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/Maks1mio/multporn-api-sdk.git"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/Maks1mio/multporn-api-sdk/issues"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/Maks1mio/multporn-api-sdk#readme",
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"cheerio": "^1.0.0-rc.12",
|
|
45
|
+
"fast-xml-parser": "^5.3.0",
|
|
46
|
+
"morgan": "^1.10.1",
|
|
47
|
+
"swagger-ui-express": "^5.0.1",
|
|
48
|
+
"zod": "^3.23.8"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.7.5",
|
|
52
|
+
"compression": "^1.8.1",
|
|
53
|
+
"cors": "^2.8.5",
|
|
54
|
+
"eslint": "^9.13.0",
|
|
55
|
+
"eslint-config-prettier": "^9.1.0",
|
|
56
|
+
"express": "^5.1.0",
|
|
57
|
+
"prettier": "^3.3.3",
|
|
58
|
+
"tsup": "^8.2.4",
|
|
59
|
+
"tsx": "^4.20.6",
|
|
60
|
+
"typescript": "^5.6.3",
|
|
61
|
+
"vitest": "^4.0.8"
|
|
62
|
+
}
|
|
63
|
+
}
|