@@ -30,7 +30,7 @@ import {
3030 resetSettings
3131} from './MangaBoxSettings'
3232
33- const BASE_VERSION = '1 .0.1 '
33+ const BASE_VERSION = '2 .0.0 '
3434export const getExportVersion = ( EXTENSION_VERSION : string ) : string => {
3535 return BASE_VERSION . split ( '.' ) . map ( ( x , index ) => Number ( x ) + Number ( EXTENSION_VERSION . split ( '.' ) [ index ] ) ) . join ( '.' )
3636}
@@ -40,6 +40,14 @@ export interface HomeSectionsParams {
4040 values : [ latest : string , newest : string , popular : string ]
4141}
4242
43+ export interface APIChapter {
44+ chapter_name : string
45+ chapter_slug : string
46+ chapter_num : number
47+ updated_at : string
48+ view : number
49+ }
50+
4351export abstract class MangaBox implements SearchResultsProviding , MangaProviding , ChapterProviding , HomePageSectionsProviding {
4452 // Website base URL. Eg. https://manganato.com
4553 abstract baseURL : string
@@ -93,7 +101,7 @@ export abstract class MangaBox implements SearchResultsProviding, MangaProviding
93101
94102 // Selector for manga author.
95103 mangaAuthorSelector = 'div.story-info-right td:contains(Author) + td a,'
96- + 'ul.manga-info-text li:contains(Author) a '
104+ + 'ul.manga-info-text li:contains(Author)'
97105
98106 // Selector for manga description.
99107 mangaDescSelector = 'div.leftCol div#contentBox, div.chapter + div#contentBox, div#panel-story-info-description, div.manga-info-top + div#contentBox'
@@ -103,8 +111,8 @@ export abstract class MangaBox implements SearchResultsProviding, MangaProviding
103111 + 'ul.manga-info-text li:contains(Genres) a'
104112
105113 // Selector for manga chapter list.
106- chapterListSelector = 'div.panel-story -chapter-list ul.row-content- chapter li ,'
107- + 'div.manga-info -chapter div.chapter -list div .row'
114+ chapterListSelector = 'div#chapter div.manga-info -chapter div#chapter -list-container div. chapter-list div.row ,'
115+ + 'div.panel-story -chapter-list ul .row-content-chapter li '
108116
109117 // Selector for manga chapter time updated.
110118 chapterTimeSelector = 'span.chapter-time, span:last-of-type'
@@ -150,7 +158,7 @@ export abstract class MangaBox implements SearchResultsProviding, MangaProviding
150158 } ) )
151159 }
152160
153- getMangaShareUrl ( mangaId : string ) : string { return `${ mangaId } ` }
161+ getMangaShareUrl ( mangaId : string ) : string { return `${ this . baseURL } /manga/ ${ mangaId } / ` }
154162
155163 async getHomePageSections ( sectionCallback : ( section : HomeSection ) => void ) : Promise < void > {
156164 const sections = [
@@ -223,7 +231,10 @@ export abstract class MangaBox implements SearchResultsProviding, MangaProviding
223231
224232 async getMangaDetails ( mangaId : string ) : Promise < SourceManga > {
225233 const request = App . createRequest ( {
226- url : `${ mangaId } ` ,
234+ url : new URLBuilder ( this . baseURL )
235+ . addPathComponent ( 'manga' )
236+ . addPathComponent ( mangaId )
237+ . buildUrl ( ) ,
227238 method : 'GET'
228239 } )
229240
@@ -234,17 +245,44 @@ export abstract class MangaBox implements SearchResultsProviding, MangaProviding
234245 return this . parser . parseMangaDetails ( $ , mangaId , this )
235246 }
236247
237- async getChapters ( mangaId : string ) : Promise < Chapter [ ] > {
248+ async getChaptersAPI ( mangaId : string , limit = 50 , offset : number ) : Promise < any > {
238249 const request = App . createRequest ( {
239- url : `${ mangaId } ` ,
250+ url : new URLBuilder ( this . baseURL )
251+ . addPathComponent ( 'api' )
252+ . addPathComponent ( 'manga' )
253+ . addPathComponent ( mangaId )
254+ . addPathComponent ( 'chapters' )
255+ . addQueryParameter ( 'limit' , limit . toString ( ) )
256+ . addQueryParameter ( 'offset' , offset . toString ( ) )
257+ . buildUrl ( ) ,
240258 method : 'GET'
241259 } )
242260
243261 const response = await this . requestManager . schedule ( request , 1 )
244262 this . checkResponseError ( response )
245263
246- const $ = this . cheerio . load ( response . data as string )
247- return this . parser . parseChapters ( $ , mangaId , this )
264+ if ( ! response . data ) throw new Error ( 'No data received from Chapter API' )
265+ return JSON . parse ( response . data )
266+ }
267+
268+ async getChapters ( mangaId : string ) : Promise < Chapter [ ] > {
269+ const apiChapters : APIChapter [ ] = [ ]
270+ let offset = 0
271+ let hasMore = true
272+
273+ while ( hasMore ) {
274+ const chapters_api_data = await this . getChaptersAPI ( mangaId , 50 , offset )
275+ if ( ! chapters_api_data . success ) throw new Error ( 'API did not return success for chapters request' )
276+ apiChapters . push ( ...chapters_api_data . data . chapters )
277+
278+ if ( ! chapters_api_data . data . pagination . has_more ) {
279+ hasMore = false
280+ break
281+ }
282+ offset += 50
283+ }
284+
285+ return this . parser . parseChapters ( apiChapters , mangaId , this )
248286 }
249287
250288 async getChapterDetails ( mangaId : string , chapterId : string ) : Promise < ChapterDetails > {
@@ -253,7 +291,11 @@ export abstract class MangaBox implements SearchResultsProviding, MangaProviding
253291 const imageServer = await getImageServer ( this . stateManager ) . then ( value => value [ 0 ] )
254292
255293 const request = App . createRequest ( {
256- url : `${ chapterId } ` ,
294+ url : new URLBuilder ( this . baseURL )
295+ . addPathComponent ( 'manga' )
296+ . addPathComponent ( mangaId )
297+ . addPathComponent ( chapterId )
298+ . buildUrl ( ) ,
257299 method : 'GET' ,
258300 cookies : [
259301 App . createCookie ( {
0 commit comments