Skip to content

Commit

Permalink
update asura url, fix manhwa club too many requests, fix reaperscans
Browse files Browse the repository at this point in the history
  • Loading branch information
Yentis committed Oct 7, 2022
1 parent dda3d4b commit 28c7a6a
Show file tree
Hide file tree
Showing 24 changed files with 208 additions and 102 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "quasar-manga-reader",
"version": "2.20.3",
"version": "2.20.5",
"description": "Manga reader that scrapes manga sites for updates",
"productName": "Manga Reader",
"author": "Yentis#5218",
Expand Down
2 changes: 1 addition & 1 deletion src-cordova/config.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<widget id="org.cordova.manga.reader" version="2.20.3" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<widget id="org.cordova.manga.reader" version="2.20.5" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>Manga Reader</name>
<description>Manga reader that scrapes manga sites for updates</description>
<author email="[email protected]" href="http://cordova.io">
Expand Down
9 changes: 0 additions & 9 deletions src/classes/sites/asurascans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,15 +130,6 @@ export class AsuraScans extends BaseSite {
return mangaList
}

getUrl (): string {
switch (this.siteType) {
case SiteType.AsuraScans:
return `https://www.${this.siteType}`
}

return super.getUrl()
}

getTestUrl () : string {
switch (this.siteType) {
case SiteType.AsuraScans:
Expand Down
6 changes: 6 additions & 0 deletions src/classes/sites/manhwaclub.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import moment from 'moment'
import PQueue from 'p-queue'
import qs from 'qs'
import { Manga } from 'src/classes/manga'
import { SiteType } from 'src/enums/siteEnum'
Expand Down Expand Up @@ -42,6 +43,11 @@ export class ManhwaClub extends BaseSite {
private comicPrefix = '/comic/'
siteType = SiteType.ManhwaClub

constructor () {
super()
this.requestQueue = new PQueue({ interval: 500, intervalCap: 1 })
}

getChapter (data: ManhwaClubData): string {
return data.latestChapter?.name || 'Unknown'
}
Expand Down
118 changes: 118 additions & 0 deletions src/classes/sites/reaperscans.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import { Manga } from 'src/classes/manga'
import { SiteType } from 'src/enums/siteEnum'
import HttpRequest from 'src/interfaces/httpRequest'
import { requestHandler } from 'src/services/requestService'
import * as SiteUtils from 'src/utils/siteUtils'
import { BaseData, BaseSite } from './baseSite'

class ReaperScansData extends BaseData {
chapterUrl?: Element | null
}

export class ReaperScans extends BaseSite {
siteType = SiteType.ReaperScans

protected getChapterUrl (data: ReaperScansData): string {
const url = data.chapterUrl?.getAttribute('href') || ''
if (url.startsWith('/')) return `${this.getUrl()}${url}`

return url
}

protected getChapterNum (data: ReaperScansData): number {
const chapter = this.getChapter(data)
if (!chapter) return 0

const pattern = /[\d\\.,]+\b/gm
let num = 0
let match: RegExpExecArray | null

while ((match = pattern.exec(chapter)) !== null) {
const matchedValue = match[0]
if (!matchedValue) continue

const parsedMatch = parseFloat(matchedValue)
if (!isNaN(parsedMatch)) {
num = parsedMatch
break
}
}

return num
}

protected getChapterDate (data: BaseData): string {
return SiteUtils.getDateFromNow(
data.chapterDate?.textContent?.toLowerCase().replace(/released/m, '')
)
}

protected async readUrlImpl (url: string): Promise<Error | Manga> {
const request: HttpRequest = { method: 'GET', url }
const response = await requestHandler.sendRequest(request)

const doc = await SiteUtils.parseHtmlFromString(response.data)
const data = new ReaperScansData(url)

const titleContainer = doc.querySelectorAll('main>div:nth-child(2)>div>div')[0]
const chapterContainer = doc.querySelectorAll('div>div>div>ul li')[0]
const [chapter, date] = chapterContainer?.querySelectorAll('p') ?? []

data.title = titleContainer?.querySelectorAll('h1')[0]
data.image = titleContainer?.querySelectorAll('img')[0]
data.chapter = chapter
data.chapterUrl = chapterContainer?.querySelectorAll('a')[0]
data.chapterDate = date

return this.buildManga(data)
}

protected async searchImpl (query: string): Promise<Error | Manga[]> {
let page = 1
let count = 30
const mangaList: Manga[] = []

while (count >= 30) {
const result = await this.searchPage(query, page)
count = result.count
mangaList.push(...result.manga)

page++
}

return mangaList
}

private async searchPage (query: string, page: number): Promise<{ manga: Manga[], count: number }> {
const request: HttpRequest = { method: 'GET', url: `${this.getUrl()}/comics?page=${page}` }
const response = await requestHandler.sendRequest(request)

const doc = await SiteUtils.parseHtmlFromString(response.data)
const comics = doc.querySelectorAll('li')
const mangaList: Manga[] = []

comics.forEach((element) => {
const [imageElem, titleElem] = element.querySelectorAll('a')

const title = titleElem?.textContent?.trim()
if (!SiteUtils.titleContainsQuery(query, title)) return

const url = imageElem?.getAttribute('href')
if (!url) return

const chapterCount = element.querySelectorAll('dl')[0]?.textContent?.trim()
const manga = new Manga(url, this.siteType)
manga.title = title ?? 'Unknown'
manga.image = imageElem?.querySelectorAll('img')[0]?.getAttribute('src') ?? ''
manga.chapter = chapterCount ?? 'Unknown'

mangaList.push(manga)
})

return { manga: mangaList, count: comics.length }
}

getTestUrl (): string {
return `${this.getUrl()}/comics/7946-aire`
}
}
2 changes: 0 additions & 2 deletions src/classes/sites/wordpress.ts
Original file line number Diff line number Diff line change
Expand Up @@ -315,8 +315,6 @@ export class WordPress extends BaseSite {
return `${this.getUrl()}/manga/i-am-the-sorcerer-king/`
case SiteType.SleepingKnightScans:
return `${this.getUrl()}/manga/chronicles-of-the-martial-gods-return/`
case SiteType.ReaperScans:
return `${this.getUrl()}/series/aire/`
case SiteType.ResetScans:
return `${this.getUrl()}/manga/madou-no-keifu/`
}
Expand Down
11 changes: 9 additions & 2 deletions src/composables/useNotification.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,25 @@ export function useAppNotification () {

if (notification.value.type !== 'negative') {
$q.notify(notification.value.getOptions())
return
}

const errorLength = errors.value.length
addError(notification.value)
console.error(notification.value.message)
if (errorDialogShowing) return

if (errorLength === 0) {
dismissErrorNotification = $q.notify(notification.value.getOptions()) as () => void
dismissErrorNotification = $q.notify({
...notification.value.getOptions(),
onDismiss: () => {
if (errors.value.length > 1) return
clearErrors()
}
}) as () => void
return
}

if (errorDialogShowing) return
if (dismissErrorNotification) dismissErrorNotification()
let dismiss: (() => void) | undefined

Expand Down
4 changes: 2 additions & 2 deletions src/enums/siteEnum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export enum SiteType {
LeviatanScans = 'leviatanscans.com',
HiperDEX = 'hiperdex.com',
ReaperScans = 'reaperscans.com',
AsuraScans = 'asurascans.com',
AsuraScans = 'asura.gg',
ManhwaClub = 'manhwa.club',
MangaTx = 'mangatx.com',
Mangago = 'mangago.me',
Expand Down Expand Up @@ -39,7 +39,7 @@ export enum SiteName {
'leviatanscans.com' = 'Leviatan Scans',
'hiperdex.com' = 'HiperDEX',
'reaperscans.com' = 'Reaper Scans',
'asurascans.com' = 'Asura Scans',
'asura.gg' = 'Asura Scans',
'manhwa.club' = 'Manhwa Club',
'mangatx.com' = 'MangaTx',
'mangago.me' = 'Mangago',
Expand Down
3 changes: 2 additions & 1 deletion src/services/siteService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import { Tapas } from 'src/classes/sites/tapas'
import { CopinComics } from 'src/classes/sites/copincomics'
import { ZeroScans } from 'src/classes/sites/zeroscans'
import { Comikey } from 'src/classes/sites/comikey'
import { ReaperScans } from 'src/classes/sites/reaperscans'

const requestQueue = new PQueue({ interval: 1000, intervalCap: 20 })
const mangaDex = new MangaDex()
Expand All @@ -62,7 +63,7 @@ const siteMap = new Map<string, BaseSite>([
[SiteType.MangaKomi, new WordPress(SiteType.MangaKomi)],
[SiteType.LeviatanScans, new WordPress(SiteType.LeviatanScans)],
[SiteType.HiperDEX, new WordPress(SiteType.HiperDEX)],
[SiteType.ReaperScans, new WordPress(SiteType.ReaperScans)],
[SiteType.ReaperScans, new ReaperScans()],
[SiteType.AsuraScans, new AsuraScans(SiteType.AsuraScans)],
[SiteType.ManhwaClub, new ManhwaClub()],
[SiteType.MangaTx, new WordPress(SiteType.MangaTx)],
Expand Down
16 changes: 8 additions & 8 deletions src/services/test/asurascans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,35 +20,35 @@ async function readUrl (site: BaseSite): Promise<void> {
const manga = await getMangaInfo(site.getTestUrl(), SITE_TYPE)
const desired = new Manga(site.getTestUrl(), SITE_TYPE)
desired.chapter = 'Chapter 47'
desired.image = 'https://www.asurascans.com/wp-content/uploads/2021/02/ponytail_boy_.png?v=1652281235'
desired.image = 'https://asura.gg/wp-content/uploads/2021/02/ponytail_boy_.png'
desired.title = 'Mookhyang The Origin'
desired.chapterUrl = 'https://www.asurascans.com/1660243342-mookhyang-the-origin-chapter-47/'
desired.chapterUrl = 'https://asura.gg/mookhyang-the-origin-chapter-47/'
desired.chapterNum = 47
desired.chapterDate = 'a year ago'

mangaEqual(manga, desired)
}

async function readUrlAdvanced (): Promise<void> {
const testUrl = 'https://www.asurascans.com/manga/solo-bug-player/'
const testUrl = 'https://asura.gg/manga/solo-bug-player/'
const manga = await getMangaInfo(testUrl, SITE_TYPE)
const desired = new Manga(testUrl, SITE_TYPE)
desired.chapter = 'Chapter 88'
desired.image = 'https://www.asurascans.com/wp-content/uploads/2021/02/cover4.gif'
desired.image = 'https://asura.gg/wp-content/uploads/2021/02/cover4.gif'
desired.title = 'Solo Bug Player'
desired.chapterUrl = 'https://www.asurascans.com/1660243342-solo-bug-player-chapter-88/'
desired.chapterUrl = 'https://asura.gg/solo-bug-player-chapter-88/'
desired.chapterNum = 88
desired.chapterDate = '5 months ago'
desired.chapterDate = '6 months ago'

mangaEqual(manga, desired)
}

async function search (site: BaseSite): Promise<void> {
const results = await searchManga(QUERY, SITE_TYPE)
const desired = new Manga(site.getTestUrl(), SITE_TYPE)
desired.image = 'https://www.asurascans.com/wp-content/uploads/2021/02/ponytail_boy_-222x300.png'
desired.image = 'https://asura.gg/wp-content/uploads/2021/02/ponytail_boy_-222x300.png'
desired.chapter = '47'
desired.url = 'https://www.asurascans.com/manga/1660333069-mookhyang-the-origin/'
desired.url = 'https://asura.gg/manga/mookhyang-the-origin/'

return searchValid(results, desired, QUERY)
}
22 changes: 3 additions & 19 deletions src/services/test/batoto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { BaseSite } from 'src/classes/sites/baseSite'
import { SiteType } from 'src/enums/siteEnum'
import { getMangaInfo, getSite, searchManga } from '../siteService'
import { mangaEqual, searchValid } from '../testService'
import * as SiteUtils from 'src/utils/siteUtils'

const SITE_TYPE = SiteType.Batoto
const QUERY = 'I found somebody to love'
Expand All @@ -21,35 +20,20 @@ async function readUrl (site: BaseSite): Promise<void> {
const desired = new Manga(site.getTestUrl(), SITE_TYPE)
desired.chapter = 'Chapter 143 [END]'
desired.title = 'Doctor Elise: The Royal Lady with the Lamp'
desired.image = 'https://xfs-210.batcg.com/thumb/W600/ampi/bab/babb58b5b128acf2a01d5710f77d67e1af8a6fe7_420_610_328588.jpeg'
desired.image = 'https://xfs-210.batcg.org/thumb/W600/ampi/bab/babb58b5b128acf2a01d5710f77d67e1af8a6fe7_420_610_328588.jpeg'
desired.chapterUrl = 'https://bato.to/chapter/1629009'
desired.chapterNum = 143
desired.chapterDate = SiteUtils.getDateFromNow('326 days ago')
desired.chapterDate = '2 years ago'

imageContains(manga, desired)
mangaEqual(manga, desired)
}

async function search (site: BaseSite): Promise<void> {
const results = await searchManga(QUERY, SITE_TYPE)
const desired = new Manga(site.getTestUrl(), SITE_TYPE)
desired.image = 'https://xfs-201.batcg.com/thumb/W300/ampi/cd4/cd43759af3efabf4e16729443a0244b9d76df0fe_420_610_295421.jpg'
desired.image = 'https://xfs-201.batcg.org/thumb/W300/ampi/cd4/cd43759af3efabf4e16729443a0244b9d76df0fe_420_610_295421.jpg'
desired.chapter = 'Ch.88'
desired.url = 'https://bato.to/series/75371/i-found-somebody-to-love'

const resultManga = results[0]
if (!resultManga) throw Error(`Failed ${desired.url}\nNo matching results, expected\n[${JSON.stringify(desired)}] got\n${JSON.stringify(results)}`)

imageContains(resultManga, desired)
return searchValid(results, desired, QUERY)
}

function imageContains (actual: Manga | Error, desired: Manga) {
if (actual instanceof Error) throw actual

if (!actual.image.includes(desired.image)) {
throw Error(`Image did not contain: ${desired.image}, was: ${actual.image}`)
}

desired.image = actual.image
}
8 changes: 4 additions & 4 deletions src/services/test/bilibilicomics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ export async function testBiliBiliComics (): Promise<void> {
async function readUrl (site: BaseSite): Promise<void> {
const manga = await getMangaInfo(site.getTestUrl(), SITE_TYPE)
const desired = new Manga(site.getTestUrl(), SITE_TYPE)
desired.chapter = '654 Shopping at the Heavenly Treasures Pavilion (2)'
desired.chapter = '660 Despicable! (2)'
desired.image = 'https://i0.hdslb.com/bfs/comic-static/[email protected]'
desired.title = 'Tales of Demons and Gods'
desired.chapterUrl = 'https://www.bilibilicomics.com/mc215/271808'
desired.chapterNum = 654
desired.chapterDate = '16 hours ago'
desired.chapterUrl = 'https://www.bilibilicomics.com/mc215/308329'
desired.chapterNum = 660
desired.chapterDate = '7 days ago'

mangaEqual(manga, desired, false)
}
Expand Down
6 changes: 3 additions & 3 deletions src/services/test/copincomics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ export async function testCopinComics (): Promise<void> {
async function readUrl (site: BaseSite): Promise<void> {
const manga = await getMangaInfo(site.getTestUrl(), SITE_TYPE)
const desired = new Manga(site.getTestUrl(), SITE_TYPE)
desired.chapter = 'Episode 56'
desired.chapter = 'Episode 59'
desired.image = 'https://s3.us-west-1.amazonaws.com/t.copincomics.com/img/title/301/PDMAu2zYHz_3x4.png'
desired.title = 'Return Survival'
desired.chapterUrl = ''
desired.chapterNum = 56
desired.chapterNum = 59
desired.chapterDate = '3 months ago'

mangaEqual(manga, desired)
Expand All @@ -32,7 +32,7 @@ async function search (site: BaseSite): Promise<void> {
const results = await searchManga(QUERY, SITE_TYPE)
const desired = new Manga(site.getTestUrl(), SITE_TYPE)
desired.image = 'https://s3.us-west-1.amazonaws.com/t.copincomics.com/img/title/301/PDMAu2zYHz_3x4.png'
desired.chapter = 'Episode 56'
desired.chapter = 'Episode 59'
desired.url = 'https://copincomics.com/toon/301'

return searchValid(results, desired, QUERY)
Expand Down
Loading

0 comments on commit 28c7a6a

Please sign in to comment.