@@ -38,7 +38,7 @@ class FenrirRealmPlugin implements Plugin.PluginBase {
3838 name = 'Fenrir Realm' ;
3939 icon = 'src/en/fenrirrealm/icon.png' ;
4040 site = 'https://fenrirealm.com' ;
41- version = '1.0.12 ' ;
41+ version = '1.0.13 ' ;
4242 imageRequestInit ?: Plugin . ImageRequestInit | undefined = undefined ;
4343
4444 hideLocked = storage . get ( 'hideLocked' ) ;
@@ -60,15 +60,33 @@ class FenrirRealmPlugin implements Plugin.PluginBase {
6060 filters,
6161 } : Plugin . PopularNovelsOptions < typeof this . filters > ,
6262 ) : Promise < Plugin . NovelItem [ ] > {
63- // let sort = "updated";
64- let sort = filters . sort . value ;
65- if ( showLatestNovels ) sort = 'latest' ;
66- const genresFilter = filters . genres . value
67- . map ( g => '&genres%5B%5D=' + g )
68- . join ( '' ) ;
69- const res = await fetchApi (
70- `${ this . site } /api/series/filter?page=${ pageNo } &per_page=20&status=${ filters . status . value } &order=${ sort } ${ genresFilter } ` ,
71- ) . then ( r =>
63+ const sort = showLatestNovels ? 'latest' : filters . sort . value ;
64+ const params = new URLSearchParams ( {
65+ page : pageNo . toString ( ) ,
66+ per_page : '12' ,
67+ status : filters . status . value ,
68+ order : sort ,
69+ } ) ;
70+
71+ const includeGenres = filters . genres . value . include ;
72+ const excludeGenres = filters . genres . value . exclude ;
73+
74+ includeGenres . forEach ( genre => {
75+ params . append ( 'genres[]' , genre ) ;
76+ } ) ;
77+
78+ if ( includeGenres . length > 1 ) {
79+ const condition = filters . genre_condition . value ? 'and' : 'or' ;
80+ params . append ( 'genre_condition' , condition ) ;
81+ }
82+
83+ excludeGenres . forEach ( genre => {
84+ params . append ( 'exclude_genres[]' , genre ) ;
85+ } ) ;
86+
87+ const url = `${ this . site } /api/new/v2/series?${ params . toString ( ) } ` ;
88+
89+ const res = await fetchApi ( url ) . then ( r =>
7290 r . json ( ) . catch ( ( ) => {
7391 throw new Error (
7492 'There was an error fetching the data from the server. Please try to open it in WebView' ,
@@ -112,7 +130,7 @@ class FenrirRealmPlugin implements Plugin.PluginBase {
112130 . text ( ) ;
113131
114132 let chapters = await fetchApi (
115- this . site + '/api/novels/chapter-list/ ' + novelPath ,
133+ this . site + '/api/new/v2/series/ ' + novelPath + '/chapters' ,
116134 ) . then ( r => r . json ( ) ) ;
117135
118136 if ( this . hideLocked ) {
@@ -162,9 +180,15 @@ class FenrirRealmPlugin implements Plugin.PluginBase {
162180 searchTerm : string ,
163181 pageNo : number ,
164182 ) : Promise < Plugin . NovelItem [ ] > {
165- return await fetchApi (
166- `${ this . site } /api/series/filter?page=${ pageNo } &per_page=20&search=${ encodeURIComponent ( searchTerm ) } ` ,
167- )
183+ const params = new URLSearchParams ( {
184+ page : pageNo . toString ( ) ,
185+ per_page : '12' ,
186+ search : searchTerm ,
187+ status : 'any' ,
188+ sort : 'latest' ,
189+ } ) ;
190+
191+ return await fetchApi ( `${ this . site } /api/new/v2/series?${ params . toString ( ) } ` )
168192 . then ( r => r . json ( ) )
169193 . then ( r =>
170194 r . data . map ( ( novel : APINovel ) => this . parseNovelFromApi ( novel ) ) ,
@@ -175,7 +199,7 @@ class FenrirRealmPlugin implements Plugin.PluginBase {
175199 return {
176200 name : apiData . title ,
177201 path : apiData . slug ,
178- cover : this . site + '/' + apiData . cover ,
202+ cover : new URL ( apiData . cover , this . site ) . href ,
179203 summary : apiData . description ,
180204 status : apiData . status ,
181205 genres : apiData . genres . map ( g => g . name ) . join ( ',' ) ,
@@ -210,9 +234,12 @@ class FenrirRealmPlugin implements Plugin.PluginBase {
210234 ] ,
211235 } ,
212236 genres : {
213- type : FilterTypes . CheckboxGroup ,
237+ type : FilterTypes . ExcludableCheckboxGroup ,
214238 label : 'Genres' ,
215- value : [ ] ,
239+ value : {
240+ include : [ ] ,
241+ exclude : [ ] ,
242+ } ,
216243 options : [
217244 { 'label' : 'Action' , 'value' : '1' } ,
218245 { 'label' : 'Adult' , 'value' : '2' } ,
@@ -284,6 +311,11 @@ class FenrirRealmPlugin implements Plugin.PluginBase {
284311 { 'label' : 'Yuri' , 'value' : '35' } ,
285312 ] ,
286313 } ,
314+ genre_condition : {
315+ type : FilterTypes . Switch ,
316+ label : 'Genres (OR/AND)' ,
317+ value : false ,
318+ } ,
287319 } satisfies Filters ;
288320}
289321
0 commit comments