diff --git a/src/web/mjs/connectors/ShueishaMangaPlus.mjs b/src/web/mjs/connectors/ShueishaMangaPlus.mjs index 2f5c200631..1bf9a709eb 100644 --- a/src/web/mjs/connectors/ShueishaMangaPlus.mjs +++ b/src/web/mjs/connectors/ShueishaMangaPlus.mjs @@ -23,7 +23,7 @@ export default class ShueishaMangaPlus extends Publus { async _getMangaFromURI(uri) { let id = uri.pathname.match(/\/(\d+)$/)[1]; - uri = new URL('/api/title_detail', this.apiURL); + uri = new URL('/api/title_detailV3', this.apiURL); uri.searchParams.set('title_id', id); let request = new Request(uri, this.requestOptions); let data = await this.fetchPROTO(request, this.protoTypes, this.rootType); @@ -33,31 +33,32 @@ export default class ShueishaMangaPlus extends Publus { } async _getMangas() { - let request = new Request(new URL('/api/title_list/all', this.apiURL), this.requestOptions); + let request = new Request(new URL('/api/title_list/allV2', this.apiURL), this.requestOptions); let data = await this.fetchPROTO(request, this.protoTypes, this.rootType); - return data.success.allTitlesView.titles.map(manga => { + return data.success.allTitlesViewV2.allTitlesGroup.flatMap(mangaGroup => mangaGroup.titles.map(manga => { return { id: manga.titleId, title: `${manga.name} ${this._getLanguage(manga.language)}` }; - }); + })); } async _getChapters(manga) { - let uri = new URL('/api/title_detail', this.apiURL); + let uri = new URL('/api/title_detailV3', this.apiURL); uri.searchParams.set('title_id', manga.id); let request = new Request(uri, this.requestOptions); let data = await this.fetchPROTO(request, this.protoTypes, this.rootType); - return [ - ...data.success.titleDetailView.firstChapterList || [], - ...data.success.titleDetailView.lastChapterList || [] + return data.success.titleDetailView.chapterListGroup.flatMap(chapterGroup => [ + ...chapterGroup.firstChapterList || [], + ...chapterGroup.midChapterList || [], + ...chapterGroup.lastChapterList || [] ].map(chapter => { return { id: chapter.chapterId, title: chapter.subTitle || chapter.name, language: '' }; - }).reverse(); + })).reverse(); } async _getPages(chapter) { diff --git a/src/web/mjs/connectors/ShueishaMangaPlus.proto b/src/web/mjs/connectors/ShueishaMangaPlus.proto index 41d995b29d..9e0c0657fe 100644 --- a/src/web/mjs/connectors/ShueishaMangaPlus.proto +++ b/src/web/mjs/connectors/ShueishaMangaPlus.proto @@ -2,7 +2,7 @@ // Based on: https://mangaplus.shueisha.co.jp/js/app.a3091b24.js package MangaPlus; -syntax = "proto3"; +//syntax = "proto3"; message AdNetworkList { repeated AdNetwork adNetworks = 1; @@ -193,6 +193,28 @@ message AllTitlesView { repeated Title titles = 1; } +message Tag { + optional string tag = 1; + optional string slug = 2; +} + +message Label { + optional int32 label = 1; + optional string description = 2; +} + +message AllTitlesGroup { + optional string theTitle = 1; + repeated Title titles = 2; + repeated Tag tags = 3; + repeated Label labels = 4; + optional uint32 nextChapterStartTimestamp = 5; +} + +message AllTitlesViewV2 { + repeated AllTitlesGroup allTitlesGroup = 1; +} + message CommentListView { repeated Comment comments = 1; optional bool ifSetUserName = 2; @@ -274,6 +296,22 @@ message SubscribedTitlesView { } message TitleDetailView { + // message PublisherItem { + // TODO + // } + message ChapterGroup { + optional string chapterNumbers = 1; + repeated Chapter firstChapterList = 2; + repeated Chapter midChapterList = 3; + repeated Chapter lastChapterList = 4; + } + // message TitleLanguages { + // TODO + // } + // message TitleLabels { + // TODO + // } + optional Title title = 1; optional string titleImageUrl = 2; optional string overview = 3; @@ -292,6 +330,24 @@ message TitleDetailView { optional int32 rating = 16; optional bool chaptersDescending = 17; optional uint32 numberOfViews = 18; + // repeated PublisherItem publisherItems = 19; + repeated Banner titleBanners = 20; + // optional UserTickets userTickets = 21; + repeated Chapter ticketChapterList = 22; + repeated Title ticketTitleList = 23; + optional bool hasChaptersBetween = 24; + optional Banner publisherBanner = 25; + optional AdNetworkList advertisement = 26; + // repeated TitleLanguages titleLanguages = 27; + repeated ChapterGroup chapterListGroup = 28; + // optional FreeViewDialogue freeViewDialogue = 29; + optional string regionCode = 30; + repeated Tag tags = 31; + // optional TitleLabels titleLabels = 32; + // optional Subscription subscription = 33; + optional Label label = 34; + optional bool isFirstTimeFree = 35; + // optional MetaInfo metaInfo = 36; } message TitleRankingView { @@ -332,6 +388,7 @@ message SuccessResult { optional ServiceAnnouncementsView serviceAnnouncementsView = 15; optional InitialView initialView = 16; optional FeedbackView feedbackView = 17; + optional AllTitlesViewV2 allTitlesViewV2 = 25; } message WebHomeView {