├── core ├── .gitignore ├── res │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ └── mipmap-xxxhdpi │ │ └── ic_launcher.png ├── build.gradle.kts └── AndroidManifest.xml ├── stubs ├── .gitignore ├── consumer-rules.pro ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── io │ │ └── github │ │ └── gmathi │ │ └── novellibrary │ │ ├── util │ │ ├── network │ │ │ ├── OkHttpExt.kt │ │ │ └── JsoupExtensions.kt │ │ ├── Exceptions.kt │ │ ├── system │ │ │ └── Base64Ext.kt │ │ └── lang │ │ │ └── JavaLangExt.kt │ │ ├── model │ │ ├── source │ │ │ ├── filter │ │ │ │ ├── FilterList.kt │ │ │ │ └── Filter.kt │ │ │ ├── Source.kt │ │ │ ├── CatalogueSource.kt │ │ │ └── online │ │ │ │ └── ParsedHttpSource.kt │ │ ├── other │ │ │ └── NovelsPage.kt │ │ └── database │ │ │ ├── WebPage.kt │ │ │ └── Novel.kt │ │ └── network │ │ ├── NetworkHelper.kt │ │ └── Requests.kt ├── proguard-rules.pro └── build.gradle ├── extensions └── individual │ └── en │ ├── fanmtl │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── drawable │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_launcher_background.xml │ └── build.gradle │ ├── jpmtl │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher_foreground.png │ │ └── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ └── build.gradle │ ├── lnmtl │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── drawable │ │ │ └── ic_launcher_background.xml │ └── build.gradle │ ├── neovel │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── drawable │ │ │ └── ic_launcher_background.xml │ └── build.gradle │ ├── boxnovel │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ └── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ ├── build.gradle │ └── src │ │ └── io │ │ └── github │ │ └── gmathi │ │ └── novellibrary │ │ └── extension │ │ └── en │ │ └── boxnovel │ │ └── BoxNovel.kt │ ├── novelbin │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_round.webp │ │ │ └── ic_launcher_foreground.webp │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_round.webp │ │ │ └── ic_launcher_foreground.webp │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_round.webp │ │ │ └── ic_launcher_foreground.webp │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_round.webp │ │ │ └── ic_launcher_foreground.webp │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_round.webp │ │ │ └── ic_launcher_foreground.webp │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── drawable │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_launcher_background.xml │ ├── build.gradle │ └── src │ │ └── io │ │ └── github │ │ └── gmathi │ │ └── novellibrary │ │ └── extension │ │ └── en │ │ └── novelbin │ │ └── NovelBin.kt │ ├── novelbuddy │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── drawable │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_launcher_background.xml │ └── build.gradle │ ├── novelfull │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── drawable │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_launcher_background.xml │ ├── build.gradle │ └── src │ │ └── io │ │ └── github │ │ └── gmathi │ │ └── novellibrary │ │ └── extension │ │ └── en │ │ └── novelfull │ │ └── NovelFull.kt │ ├── ranobes │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher_foreground.png │ │ └── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ └── build.gradle │ ├── scribblehub │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── drawable │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_launcher_background.xml │ ├── build.gradle │ └── src │ │ └── io │ │ └── github │ │ └── gmathi │ │ └── novellibrary │ │ └── extension │ │ └── en │ │ └── scribblehub │ │ └── ScribbleHub.kt │ ├── wuxiaworldsite │ ├── .gitignore │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── values │ │ │ └── ic_launcher_background.xml │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── drawable │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_launcher_background.xml │ │ └── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ ├── build.gradle │ └── src │ │ └── io │ │ └── github │ │ └── gmathi │ │ └── novellibrary │ │ └── extension │ │ └── en │ │ └── wuxiaworldsite │ │ └── WuxiaWorldSite.kt │ └── royalroad │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── res │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_launcher_foreground.png │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_launcher_foreground.png │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_launcher_foreground.png │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_launcher_foreground.png │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_launcher_foreground.png │ ├── values │ │ └── ic_launcher_background.xml │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ └── drawable │ │ └── ic_launcher_background.xml │ ├── build.gradle │ └── src │ └── io │ └── github │ └── gmathi │ └── novellibrary │ └── extension │ └── en │ └── royalroad │ └── RoyalRoad.kt ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── settings.gradle ├── common-dependencies.gradle ├── gradle.properties ├── .gitignore ├── common.gradle ├── README.md └── gradlew.bat /core/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /stubs/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /stubs/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/neovel/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/individual/en/neovel/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /core/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/core/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /core/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/core/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /core/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/core/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /core/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/core/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /core/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/core/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /stubs/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/jpmtl/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/ranobes/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/ic_launcher-playstore.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #D7413C 4 | -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #5F3DDC 4 | -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #21D7CD 4 | -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3DDC84 4 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #16415B 4 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/lnmtl/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #5F3DDC 4 | -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #0A4657 4 | -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #2A2A2A 4 | -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/fanmtl/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/jpmtl/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/jpmtl/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #0A4657 4 | -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/jpmtl/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/jpmtl/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/jpmtl/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbuddy/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelfull/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/ranobes/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/ranobes/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/ranobes/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/neovel/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-hdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-hdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-mdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-mdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-xhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-xhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/ranobes/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/ranobes/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/scribblehub/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/boxnovel/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-xxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-xxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-xxxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/novelbin/res/mipmap-xxxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/royalroad/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmathi/NovelLibrary-Extensions/HEAD/extensions/individual/en/wuxiaworldsite/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/util/network/OkHttpExt.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.util.network 2 | 3 | import okhttp3.Call 4 | import okhttp3.Response 5 | 6 | fun Call.safeExecute(): Response { 7 | throw Exception("Stub!") 8 | } -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/model/source/filter/FilterList.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.model.source.filter 2 | 3 | data class FilterList(val list: List>) : List> by list { 4 | 5 | constructor(vararg fs: Filter<*>) : this(if (fs.isNotEmpty()) fs.asList() else emptyList()) 6 | 7 | } -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'FanMTL' 6 | pkgNameSuffix = '' 7 | extClass = '.FanMTL' 8 | extVersionCode = 1 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.fanmtl' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/neovel/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'Neovel' 6 | pkgNameSuffix = '' 7 | extClass = '.Neovel' 8 | extVersionCode = 3 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.neovel' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/jpmtl/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'JPMTL' 6 | pkgNameSuffix = 'en.jpmtl' 7 | extClass = '.JPMTL' 8 | extVersionCode = 1 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.jpmtl' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'LNMTL' 6 | pkgNameSuffix = 'en.lnmtl' 7 | extClass = '.LNMTL' 8 | extVersionCode = 1 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.lnmtl' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/ranobes/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'Ranobes' 6 | pkgNameSuffix = 'en.ranobes' 7 | extClass = '.Ranobes' 8 | extVersionCode = 1 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.ranobes' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'BoxNovel' 6 | pkgNameSuffix = 'en.boxnovel' 7 | extClass = '.BoxNovel' 8 | extVersionCode = 4 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.boxnovel' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'NovelBin' 6 | pkgNameSuffix = 'en.novelbin' 7 | extClass = '.NovelBin' 8 | extVersionCode = 1 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.novelbin' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'NovelFull' 6 | pkgNameSuffix = 'en.novelfull' 7 | extClass = '.NovelFull' 8 | extVersionCode = 1 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.novelfull' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'RoyalRoad' 6 | pkgNameSuffix = 'en.royalroad' 7 | extClass = '.RoyalRoad' 8 | extVersionCode = 1 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.royalroad' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'NovelBuddy' 6 | pkgNameSuffix = 'en.novelbuddy' 7 | extClass = '.NovelBuddy' 8 | extVersionCode = 1 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.novelbuddy' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'ScribbleHub' 6 | pkgNameSuffix = 'en.scribblehub' 7 | extClass = '.ScribbleHub' 8 | extVersionCode = 1 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.scribblehub' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | ext { 5 | extName = 'WuxiaWorldSite' 6 | pkgNameSuffix = 'en.wuxiaworldsite' 7 | extClass = '.WuxiaWorldSite' 8 | extVersionCode = 1 9 | libVersion = '1.0' 10 | } 11 | 12 | android { 13 | namespace = 'io.github.gmathi.novellibrary.extension.en.wuxiaworldsite' 14 | } 15 | 16 | apply from: "$rootDir/common.gradle" 17 | -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/util/network/JsoupExtensions.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.util.network 2 | 3 | import okhttp3.Response 4 | import org.jsoup.nodes.Document 5 | 6 | /** 7 | * Returns a Jsoup document for this response. 8 | * @param html the body of the response. Use only if the body was read before calling this method. 9 | */ 10 | fun Response.asJsoup(html: String? = null): Document { 11 | throw Exception("Stub!") 12 | } 13 | -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/util/Exceptions.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.util 2 | 3 | object Exceptions { 4 | 5 | const val INVALID_NOVEL = "Invalid Novel" 6 | const val MISSING_IMPLEMENTATION = "Missing Implementation" 7 | const val INVALID_PARAMETERS = "Invalid Parameters" 8 | const val MISSING_EXTERNAL_ID = "Missing External Id" 9 | const val NETWORK_ERROR = "Network Error" 10 | const val PARSING_ERROR = "Parsing Error" 11 | const val MISSING_SOURCE_ID = "Missing Source Id" 12 | const val NOT_USED = "Not Used" 13 | 14 | } -------------------------------------------------------------------------------- /core/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.library") 3 | } 4 | 5 | android { 6 | 7 | namespace = "io.github.gmathi.novellibrary" 8 | compileSdkVersion(Config.compileSdk) 9 | 10 | defaultConfig { 11 | minSdk = Config.minSdk 12 | } 13 | 14 | sourceSets { 15 | named("main") { 16 | manifest.srcFile("AndroidManifest.xml") 17 | res.setSrcDirs(listOf("res")) 18 | } 19 | } 20 | 21 | libraryVariants.all { 22 | generateBuildConfigProvider?.configure { 23 | enabled = false 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/network/NetworkHelper.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.network 2 | 3 | import android.content.Context 4 | import android.net.ConnectivityManager 5 | import okhttp3.OkHttpClient 6 | 7 | class NetworkHelper(private val context: Context) { 8 | 9 | val client: OkHttpClient = throw Exception("Stub!") 10 | 11 | @Suppress("ThrowableNotThrown") 12 | val cloudflareClient: OkHttpClient = throw Exception("Stub!") 13 | 14 | /** 15 | * returns - True - if there is connection to the internet 16 | */ 17 | fun isConnectedToNetwork(): Boolean = throw Exception("Stub!") 18 | } 19 | -------------------------------------------------------------------------------- /core/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':extensions:individual:en:wuxiaworldsite' 2 | include ':extensions:individual:en:novelfull' 3 | include ':extensions:individual:en:novelbin' 4 | include ':extensions:individual:en:lnmtl' 5 | include ':extensions:individual:en:scribblehub' 6 | include ':extensions:individual:en:neovel' 7 | include ':extensions:individual:en:scribblehub' 8 | include ':extensions:individual:en:royalroad' 9 | include ':extensions:individual:en:jpmtl' 10 | include ':extensions:individual:en:boxnovel' 11 | include ':extensions:individual:en:ranobes' 12 | include ':extensions:individual:en:novelbuddy' 13 | include ':extensions:individual:en:fanmtl' 14 | include ':stubs' 15 | include ':core' 16 | rootProject.name = "NovelLibrary-Extensions" -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/util/system/Base64Ext.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.util.system 2 | 3 | fun String.encodeBase64ToString(): String = String(this.toByteArray().encodeBase64()) 4 | fun String.encodeBase64ToByteArray(): ByteArray = this.toByteArray().encodeBase64() 5 | fun ByteArray.encodeBase64ToString(): String = String(this.encodeBase64()) 6 | 7 | fun String.decodeBase64(): String = String(this.toByteArray().decodeBase64()) 8 | fun String.decodeBase64ToByteArray(): ByteArray = this.toByteArray().decodeBase64() 9 | fun ByteArray.decodeBase64ToString(): String = String(this.decodeBase64()) 10 | 11 | fun ByteArray.encodeBase64(): ByteArray { 12 | throw Exception("Stub!") 13 | } 14 | 15 | fun ByteArray.decodeBase64(): ByteArray { 16 | throw Exception("Stub!") 17 | } -------------------------------------------------------------------------------- /stubs/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/model/other/NovelsPage.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.model.other 2 | 3 | import io.github.gmathi.novellibrary.model.database.Novel 4 | 5 | data class NovelsPage(val novels: List, val hasNextPage: Boolean) { 6 | 7 | override fun equals(other: Any?): Boolean { 8 | if (this === other) return true 9 | if (javaClass != other?.javaClass) return false 10 | 11 | other as NovelsPage 12 | 13 | if (novels != other.novels) return false 14 | if (hasNextPage != other.hasNextPage) return false 15 | 16 | return true 17 | } 18 | 19 | override fun hashCode(): Int { 20 | var result = novels.hashCode() 21 | result = 31 * result + hasNextPage.hashCode() 22 | return result 23 | } 24 | 25 | override fun toString(): String { 26 | return "NovelsPage(novels=$novels, hasNextPage=$hasNextPage)" 27 | } 28 | 29 | 30 | } -------------------------------------------------------------------------------- /common-dependencies.gradle: -------------------------------------------------------------------------------- 1 | // used both in common.gradle and theme sources library 2 | dependencies { 3 | 4 | compileOnly project(':stubs') 5 | 6 | // These are provided by the app itself 7 | compileOnly "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" 8 | 9 | final okhttp_version = '5.0.0-alpha.2' 10 | compileOnly "com.squareup.okhttp3:okhttp:$okhttp_version" 11 | compileOnly "com.squareup.okhttp3:logging-interceptor:$okhttp_version" 12 | compileOnly "com.squareup.okhttp3:okhttp-dnsoverhttps:$okhttp_version" 13 | compileOnly 'com.squareup.okio:okio:3.0.0-alpha.1' 14 | 15 | compileOnly 'io.reactivex:rxjava:1.3.8' 16 | compileOnly 'org.jsoup:jsoup:1.13.1' 17 | compileOnly 'com.google.code.gson:gson:2.10.1' 18 | compileOnly 'com.github.salomonbrys.kotson:kotson:2.5.0' 19 | compileOnly 'com.github.inorichi:injekt:v1.3.0' 20 | 21 | // implementation project(":annotations") 22 | // compileOnly project(':duktape-stub') 23 | 24 | } 25 | 26 | kotlinter { 27 | disabledRules = ["no-wildcard-imports"] 28 | } -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/model/source/Source.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.model.source 2 | 3 | import io.github.gmathi.novellibrary.model.database.Novel 4 | import io.github.gmathi.novellibrary.model.database.WebPage 5 | import rx.Observable 6 | 7 | /** 8 | * A basic interface for creating a source. It could be an online source, a local source, etc... 9 | */ 10 | interface Source { 11 | 12 | /** 13 | * Id for the source. Must be unique. 14 | */ 15 | val id: Long 16 | 17 | /** 18 | * Name of the source. 19 | */ 20 | val name: String 21 | 22 | /** 23 | * Returns an observable with the updated details for a novel. 24 | * 25 | * @param novel the novel to update. 26 | */ 27 | fun fetchNovelDetails(novel: Novel): Observable 28 | 29 | /** 30 | * Returns an observable with all the available chapters for a novel. 31 | * 32 | * @param novel the novel to update. 33 | */ 34 | fun fetchChapterList(novel: Novel): Observable> 35 | 36 | 37 | 38 | } -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/network/Requests.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("FunctionName") 2 | 3 | package io.github.gmathi.novellibrary.network 4 | 5 | import okhttp3.* 6 | import java.util.concurrent.TimeUnit.MINUTES 7 | 8 | private val DEFAULT_CACHE_CONTROL = CacheControl.Builder().maxAge(10, MINUTES).build() 9 | private val DEFAULT_HEADERS = Headers.Builder().build() 10 | private val DEFAULT_BODY: RequestBody = FormBody.Builder().build() 11 | 12 | fun GET( 13 | url: String, 14 | headers: Headers = DEFAULT_HEADERS, 15 | cache: CacheControl = DEFAULT_CACHE_CONTROL 16 | ): Request { 17 | return Request.Builder() 18 | .url(url) 19 | .headers(headers) 20 | .cacheControl(cache) 21 | .build() 22 | } 23 | 24 | fun POST( 25 | url: String, 26 | headers: Headers = DEFAULT_HEADERS, 27 | body: RequestBody = DEFAULT_BODY, 28 | cache: CacheControl = DEFAULT_CACHE_CONTROL 29 | ): Request { 30 | return Request.Builder() 31 | .url(url) 32 | .post(body) 33 | .headers(headers) 34 | .cacheControl(cache) 35 | .build() 36 | } 37 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | 13 | 15 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | 13 | 15 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | 13 | 15 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/model/source/filter/Filter.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.model.source.filter 2 | 3 | sealed class Filter(val name: String, var state: T) { 4 | open class Header(name: String) : Filter(name, 0) 5 | open class Separator(name: String = "") : Filter(name, 0) 6 | abstract class Select(name: String, val values: Array, state: Int = 0) : Filter(name, state) 7 | abstract class Text(name: String, state: String = "") : Filter(name, state) 8 | abstract class CheckBox(name: String, state: Boolean = false) : Filter(name, state) 9 | abstract class TriState(name: String, state: Int = STATE_IGNORE) : Filter(name, state) { 10 | fun isIgnored() = state == STATE_IGNORE 11 | fun isIncluded() = state == STATE_INCLUDE 12 | fun isExcluded() = state == STATE_EXCLUDE 13 | 14 | companion object { 15 | const val STATE_IGNORE = 0 16 | const val STATE_INCLUDE = 1 17 | const val STATE_EXCLUDE = 2 18 | } 19 | } 20 | 21 | abstract class Group(name: String, state: List) : Filter>(name, state) 22 | 23 | abstract class Sort(name: String, val values: Array, state: Selection? = null) : Filter(name, state) { 24 | data class Selection(val index: Int, val ascending: Boolean) 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/model/database/WebPage.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.model.database 2 | 3 | data class WebPage(var url: String, var chapterName: String) { 4 | 5 | 6 | /** 7 | * Order of the chapter in the chapters list. The higher the order, the latest released chapter it is. 8 | */ 9 | var orderId: Long = -1L 10 | 11 | /** 12 | * In-case the chapter is aggregated from multiple translator sources, this source id determines the source. Default is -1L 13 | */ 14 | var translatorSourceName: String? = null 15 | 16 | 17 | // Other Methods 18 | override fun equals(other: Any?): Boolean { 19 | if (this === other) return true 20 | if (javaClass != other?.javaClass) return false 21 | 22 | other as WebPage 23 | 24 | if (url != other.url) return false 25 | if (chapterName != other.chapterName) return false 26 | if (translatorSourceName != other.translatorSourceName) return false 27 | 28 | return true 29 | } 30 | 31 | override fun hashCode(): Int { 32 | var result = url.hashCode() 33 | result = 31 * result + chapterName.hashCode() 34 | return result 35 | } 36 | 37 | override fun toString(): String { 38 | return "Chapter(url='$url', chapterName='$chapterName', orderId=$orderId, translatorSourceName=$translatorSourceName)" 39 | } 40 | 41 | 42 | } 43 | -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/model/source/CatalogueSource.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.model.source 2 | 3 | import io.github.gmathi.novellibrary.model.other.NovelsPage 4 | import io.github.gmathi.novellibrary.model.source.filter.FilterList 5 | import rx.Observable 6 | 7 | 8 | interface CatalogueSource : Source { 9 | 10 | /** 11 | * An ISO 639-1 compliant language code (two letters in lower case). 12 | */ 13 | val lang: String 14 | 15 | /** 16 | * Whether the source has support for latest updates. 17 | */ 18 | val supportsLatest: Boolean 19 | 20 | /** 21 | * Returns an observable containing a page with a list of novel. 22 | * 23 | * @param page the page number to retrieve. 24 | */ 25 | fun fetchPopularNovels(page: Int): Observable 26 | 27 | 28 | /** 29 | * Returns an observable containing a page with a list of novels. 30 | * 31 | * @param page the page number to retrieve. 32 | * @param query the search query. 33 | * @param filters the list of filters to apply. 34 | */ 35 | fun fetchSearchNovels(page: Int, query: String, filters: FilterList): Observable 36 | 37 | /** 38 | * Returns an observable containing a page with a list of latest novel updates. 39 | * 40 | * @param page the page number to retrieve. 41 | */ 42 | fun fetchLatestUpdates(page: Int): Observable 43 | 44 | /** 45 | * Returns the list of filters for the source. 46 | */ 47 | fun getFilterList(): FilterList 48 | } -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | 13 | 15 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /stubs/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | id 'kotlin-android' 4 | } 5 | 6 | android { 7 | compileSdkVersion 35 8 | buildToolsVersion "35.0.0" 9 | 10 | defaultConfig { 11 | minSdkVersion 21 12 | targetSdkVersion 35 13 | 14 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 15 | consumerProguardFiles "consumer-rules.pro" 16 | } 17 | 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | compileOptions { 25 | sourceCompatibility JavaVersion.VERSION_1_8 26 | targetCompatibility JavaVersion.VERSION_1_8 27 | } 28 | kotlinOptions { 29 | jvmTarget = '1.8' 30 | } 31 | namespace 'io.github.gmathi.novellibrary' 32 | } 33 | 34 | dependencies { 35 | 36 | //noinspection GradleDependency 37 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 38 | implementation 'androidx.core:core-ktx:1.16.0' 39 | implementation 'androidx.appcompat:appcompat:1.7.0' 40 | implementation 'com.google.android.material:material:1.12.0' 41 | 42 | compileOnly 'com.github.inorichi:injekt:v1.3.0' 43 | 44 | final okhttp_version = '5.0.0-alpha.2' 45 | compileOnly "com.squareup.okhttp3:okhttp:$okhttp_version" 46 | // compileOnly "com.squareup.okhttp3:logging-interceptor:$okhttp_version" 47 | // compileOnly "com.squareup.okhttp3:okhttp-dnsoverhttps:$okhttp_version" 48 | // compileOnly 'com.squareup.okio:okio:3.0.0-alpha.1' 49 | 50 | compileOnly 'io.reactivex:rxjava:1.3.8' 51 | compileOnly 'org.jsoup:jsoup:1.13.1' 52 | compileOnly 'com.google.code.gson:gson:2.10.1' 53 | compileOnly 'com.github.salomonbrys.kotson:kotson:2.5.0' 54 | } -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.aar 4 | *.ap_ 5 | *.aab 6 | 7 | # Files for the ART/Dalvik VM 8 | *.dex 9 | 10 | # Java class files 11 | *.class 12 | 13 | # Generated files 14 | bin/ 15 | gen/ 16 | out/ 17 | # Uncomment the following line in case you need and you don't have the release build type files in your app 18 | # release/ 19 | 20 | # Gradle files 21 | .gradle/ 22 | build/ 23 | 24 | # Local configuration file (sdk path, etc) 25 | local.properties 26 | 27 | # Proguard folder generated by Eclipse 28 | proguard/ 29 | 30 | # Log Files 31 | *.log 32 | 33 | # Android Studio Navigation editor temp files 34 | .navigation/ 35 | 36 | # Android Studio captures folder 37 | captures/ 38 | 39 | # IntelliJ 40 | *.iml 41 | .idea/workspace.xml 42 | .idea/tasks.xml 43 | .idea/gradle.xml 44 | .idea/assetWizardSettings.xml 45 | .idea/dictionaries 46 | .idea/libraries 47 | # Android Studio 3 in .gitignore file. 48 | .idea/caches 49 | .idea/modules.xml 50 | # Comment next line if keeping position of elements in Navigation Editor is relevant for you 51 | .idea/navEditor.xml 52 | 53 | # Keystore files 54 | # Uncomment the following lines if you do not want to check your keystore files in. 55 | #*.jks 56 | #*.keystore 57 | 58 | # External native build folder generated in Android Studio 2.2 and later 59 | .externalNativeBuild 60 | .cxx/ 61 | 62 | # Google Services (e.g. APIs or Firebase) 63 | # google-services.json 64 | 65 | # Freeline 66 | freeline.py 67 | freeline/ 68 | freeline_project_description.json 69 | 70 | # fastlane 71 | fastlane/report.xml 72 | fastlane/Preview.html 73 | fastlane/screenshots 74 | fastlane/test_output 75 | fastlane/readme.md 76 | 77 | # Version control 78 | vcs.xml 79 | 80 | # lint 81 | lint/intermediates/ 82 | lint/generated/ 83 | lint/outputs/ 84 | lint/tmp/ 85 | # lint/reports/ 86 | 87 | #MAC_OS 88 | *.DS_STORE 89 | 90 | *.keystore 91 | .idea/* 92 | release/ 93 | extensions/individual/en/novelbuddy/debug/output-metadata.json 94 | -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | 14 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | 14 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /common.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'org.jmailen.kotlinter' 2 | 3 | android { 4 | 5 | compileSdkVersion Config.compileSdk 6 | buildToolsVersion Config.buildTools 7 | 8 | buildTypes { 9 | release { 10 | minifyEnabled false 11 | } 12 | } 13 | 14 | sourceSets { 15 | main { 16 | manifest.srcFile "AndroidManifest.xml" 17 | java.srcDirs = ['src'] 18 | res.srcDirs = ['res'] 19 | } 20 | release { 21 | manifest.srcFile "AndroidManifest.xml" 22 | } 23 | debug { 24 | manifest.srcFile "AndroidManifest.xml" 25 | } 26 | } 27 | 28 | defaultConfig { 29 | minSdkVersion Config.minSdk 30 | targetSdkVersion Config.targetSdk 31 | applicationIdSuffix pkgNameSuffix 32 | versionCode extVersionCode 33 | versionName "$libVersion.$extVersionCode" 34 | setProperty("archivesBaseName", "novellibrary-$pkgNameSuffix-v$versionName") 35 | manifestPlaceholders = [ 36 | appName : "NovelLibrary: $extName", 37 | extClass: extClass, 38 | extFactory: project.ext.properties.getOrDefault("extFactory", ""), 39 | nsfw: project.ext.properties.getOrDefault("containsNsfw", false) ? 1 : 0, 40 | ] 41 | } 42 | 43 | dependenciesInfo { 44 | includeInApk = false 45 | } 46 | 47 | buildFeatures { 48 | // Disable unused AGP features 49 | aidl false 50 | renderScript false 51 | resValues false 52 | shaders false 53 | } 54 | 55 | compileOptions { 56 | sourceCompatibility = JavaVersion.VERSION_1_8 57 | targetCompatibility = JavaVersion.VERSION_1_8 58 | } 59 | 60 | kotlinOptions { 61 | jvmTarget = JavaVersion.VERSION_1_8.toString() 62 | } 63 | } 64 | 65 | repositories { 66 | mavenCentral() 67 | } 68 | 69 | dependencies { 70 | implementation project(":core") 71 | } 72 | apply from: "$rootDir/common-dependencies.gradle" 73 | 74 | preBuild.dependsOn(lintKotlin) 75 | lintKotlin.dependsOn(formatKotlin) 76 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # NovelLibrary-Extensions 3 | Extensions for NovelLibrary 4 | 5 | # How to create extensions 6 | 7 | ## Prerequisites 8 | - Android Studio 9 | - Kotlin 10 | - Some basic coding knowledge 11 | 12 | ## Steps to get going: 13 | ### Step 1: Identify the below URLS / URL Requests 14 | 1. Search URL that takes in a search query parameter. 15 | 2. URL that is required to fetch the novel details. 16 | 3. URL(s) that are required to fetch chapters based on the novel selected from the above search results. 17 | 18 | ### Step 2: Create your own package entry in Android Studio. 19 | - Make sure you are able to open project in Android Studio and able to build it. If you have successfully built it, then you would see something like this under package explorer. 20 | 21 | ![image](https://user-images.githubusercontent.com/5333537/159209131-8f110590-d64c-4302-8057-61a12d72d056.png) 22 | 23 | 24 | - Open up extension 25 | 26 | ![image](https://user-images.githubusercontent.com/5333537/159209216-d3802f89-077e-43a4-93ed-37c29e20fef2.png) 27 | 28 | #### Lets assume you want to add the new source `xyz.com`. 29 | 30 | - First go to the folder window for the project. 31 | 32 | ![image](https://user-images.githubusercontent.com/5333537/159209536-1f6f09a9-ed30-4624-aca6-22874c70b1ce.png)+ 33 | 34 | 35 | ### Step 3: Now we will start with copying one of the folders and renaming the below files/contents to `xyz` since that is the host name. 36 | 37 | - Change the folder name to `xyz`. 38 | 39 | ![image](https://user-images.githubusercontent.com/5333537/159209656-0de6bd67-3a88-4cb1-8270-b4de956ee654.png) 40 | 41 | - Inside the folder, open the `build.gradle`. Update the values as such. 42 | ``` 43 | apply plugin: 'com.android.application' 44 | apply plugin: 'kotlin-android' 45 | 46 | ext { 47 | extName = 'Xyz' 48 | pkgNameSuffix = 'en.xyz' 49 | extClass = '.Xyz' 50 | extVersionCode = 1 51 | libVersion = '1.0' 52 | } 53 | 54 | apply from: "$rootDir/common.gradle" 55 | ``` 56 | 57 | - Rename the below folder and file name to `xyz`. 58 | 59 | ![image](https://user-images.githubusercontent.com/5333537/159210297-090a6a65-987a-43b7-b5af-64ae311d9d27.png) 60 | to 61 | 62 | ![image](https://user-images.githubusercontent.com/5333537/159210643-1a6c2f42-c34a-46ba-a58a-65b59076c4b1.png) 63 | 64 | - Also rename the contents in the `Xyz.kt` as below. 65 | 66 | ![image](https://user-images.githubusercontent.com/5333537/159210466-a970f7bc-88b6-4ce0-a562-5f6461b7e578.png) 67 | 68 | 69 | ### Step 4: Open Android Studio. 70 | 71 | Goto `settings.gradle` file and add this entry. 72 | ``` 73 | include ':extensions:individual:en:xyz' 74 | ``` 75 | 76 | ![image](https://user-images.githubusercontent.com/5333537/160157710-564394fc-f0d2-406b-a513-fcadec554a19.png) 77 | 78 | Resync the project and you should have your extension ready to work with. 79 | 80 | Now open the `Xyz.kt` file and start making the changes to make sure you get your data. 81 | -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/util/lang/JavaLangExt.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Google Inc. All rights reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.gmathi.novellibrary.util.lang 17 | 18 | import com.google.gson.JsonElement 19 | import okhttp3.HttpUrl.Companion.toHttpUrlOrNull 20 | import java.net.URLEncoder 21 | import java.nio.charset.Charset 22 | 23 | /** 24 | * This file contains extension methods for the java.lang package. 25 | */ 26 | 27 | /** 28 | * Helper method to check if a [String] contains another in a case insensitive way. 29 | */ 30 | fun String?.containsCaseInsensitive(other: String?) = 31 | if (this == null && other == null) { 32 | true 33 | } else if (this != null && other != null) { 34 | lowercase().contains(other.lowercase()) 35 | } else { 36 | false 37 | } 38 | 39 | inline val JsonElement.asJsonNullFreeString: String? 40 | get() = when { 41 | this.isJsonNull -> null 42 | this.asString.isNullOrBlank() -> null 43 | else -> this.asString 44 | } 45 | 46 | inline val JsonElement.asJsonNullFree: JsonElement? 47 | get() = when { 48 | this.isJsonNull -> null 49 | else -> this 50 | } 51 | 52 | /** 53 | * Helper extension to URL encode a [String]. Returns an empty string when called on null. 54 | */ 55 | inline val String?.urlEncoded: String 56 | get() = if (Charset.isSupported("UTF-8")) { 57 | URLEncoder.encode(this ?: "", "UTF-8") 58 | } else { 59 | // If UTF-8 is not supported, use the default charset. 60 | @Suppress("deprecation") 61 | URLEncoder.encode(this ?: "") 62 | } 63 | 64 | inline val String.fixMalformed: String 65 | get() = when { 66 | else -> { 67 | var newValue = this 68 | if (newValue.startsWith("//")) 69 | newValue = newValue.replaceFirst("//", "http://") 70 | newValue 71 | } 72 | } 73 | 74 | fun String.fixMalformedWithHost(host: String?, protocol: String?): String { 75 | var url = this 76 | if (url.startsWith("//")) 77 | url = url.replaceFirst("//", (protocol ?: "http") + "://") 78 | if (host != null && url.startsWith("/")) 79 | url = (protocol ?: "http") + "://" + host + url 80 | return url 81 | } 82 | 83 | inline val String?.getUrlDomain: String? 84 | get() = this?.let { this.toHttpUrlOrNull()?.topPrivateDomain() } 85 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/model/database/Novel.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("UNCHECKED_CAST") 2 | 3 | package io.github.gmathi.novellibrary.model.database 4 | 5 | data class Novel(var url: String, var sourceId: Long) { 6 | 7 | public constructor(name: String?, url: String, sourceId: Long) : this(url, sourceId) { 8 | name?.let { this.name = name } 9 | } 10 | 11 | /** 12 | * Name of the novel 13 | */ 14 | var name: String = "Unknown - Not Found!" 15 | 16 | /** 17 | * External Id from the source 18 | */ 19 | var externalNovelId: String? = null 20 | 21 | /** 22 | * Novel's cover art image url 23 | */ 24 | var imageUrl: String? = null 25 | 26 | /** 27 | * Rating of the novel in the decimal format and ranging between (min) 0.0 - 5.0 (max) 28 | */ 29 | var rating: String? = null 30 | 31 | /** 32 | * Short description of the novel that is shown at a glance 33 | */ 34 | var shortDescription: String? = null 35 | 36 | /** 37 | * Complete description of the novel 38 | */ 39 | var longDescription: String? = null 40 | 41 | /** 42 | * List of genres this novel belongs to 43 | */ 44 | var genres: List? = null 45 | 46 | /** 47 | * Author(s) of this novel 48 | */ 49 | var authors: List? = null 50 | 51 | /** 52 | * Illustrator(s) of this novel 53 | */ 54 | var illustrator: List? = null 55 | 56 | /** 57 | * Number of released chapters in this novel 58 | */ 59 | var chaptersCount: Long = 0L 60 | 61 | /** 62 | * More metadata of the novel 63 | */ 64 | var metadata: HashMap = HashMap() 65 | 66 | 67 | override fun toString(): String { 68 | return "Novel(url='$url', sourceId=$sourceId, name='$name', externalNovelId=$externalNovelId, imageUrl=$imageUrl, rating=$rating, shortDescription=$shortDescription, longDescription=$longDescription, genres=$genres, authors=$authors, illustrator=$illustrator, chaptersCount=$chaptersCount, metadata=$metadata)" 69 | } 70 | 71 | override fun equals(other: Any?): Boolean { 72 | if (this === other) return true 73 | if (javaClass != other?.javaClass) return false 74 | 75 | other as Novel 76 | 77 | if (url != other.url) return false 78 | if (sourceId != other.sourceId) return false 79 | 80 | return true 81 | } 82 | 83 | override fun hashCode(): Int { 84 | var result = url.hashCode() 85 | result = 31 * result + sourceId.hashCode() 86 | result = 31 * result + name.hashCode() 87 | result = 31 * result + (externalNovelId?.hashCode() ?: 0) 88 | result = 31 * result + (imageUrl?.hashCode() ?: 0) 89 | result = 31 * result + (rating?.hashCode() ?: 0) 90 | result = 31 * result + (shortDescription?.hashCode() ?: 0) 91 | result = 31 * result + (longDescription?.hashCode() ?: 0) 92 | result = 31 * result + (genres?.hashCode() ?: 0) 93 | result = 31 * result + (authors?.hashCode() ?: 0) 94 | result = 31 * result + (illustrator?.hashCode() ?: 0) 95 | result = 31 * result + chaptersCount.hashCode() 96 | result = 31 * result + metadata.hashCode() 97 | return result 98 | } 99 | 100 | 101 | } 102 | -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/src/io/github/gmathi/novellibrary/extension/en/royalroad/RoyalRoad.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.extension.en.royalroad 2 | 3 | import io.github.gmathi.novellibrary.model.database.Novel 4 | import io.github.gmathi.novellibrary.model.database.WebPage 5 | import io.github.gmathi.novellibrary.model.source.filter.FilterList 6 | import io.github.gmathi.novellibrary.model.source.online.ParsedHttpSource 7 | import io.github.gmathi.novellibrary.network.GET 8 | import io.github.gmathi.novellibrary.util.Exceptions.NOT_USED 9 | import okhttp3.Headers 10 | import okhttp3.OkHttpClient 11 | import okhttp3.Request 12 | import org.jsoup.nodes.Document 13 | import org.jsoup.nodes.Element 14 | import java.net.URLEncoder 15 | 16 | class RoyalRoad : ParsedHttpSource() { 17 | 18 | override val id: Long 19 | get() = 5L 20 | override val baseUrl: String 21 | get() = "https://www.royalroad.com" 22 | override val lang: String 23 | get() = "en" 24 | override val supportsLatest: Boolean 25 | get() = true 26 | override val name: String 27 | get() = "Royal Road" 28 | 29 | override val client: OkHttpClient 30 | get() = network.cloudflareClient 31 | 32 | override fun headersBuilder(): Headers.Builder = Headers.Builder() 33 | .add("User-Agent", USER_AGENT) 34 | .add("Referer", baseUrl) 35 | 36 | //region Search Novel 37 | override fun searchNovelsRequest(page: Int, query: String, filters: FilterList): Request { 38 | val encodedQuery = URLEncoder.encode(query, "UTF-8") 39 | val url = "$baseUrl/fictions/search?title=${encodedQuery.replace(" ", "+")}&page=$page" 40 | return GET(url, headers) 41 | } 42 | 43 | override fun searchNovelsFromElement(element: Element): Novel { 44 | val titleElement = element.selectFirst(".fiction-title > a[href]") 45 | val novel = Novel(titleElement.text(), titleElement.attr("abs:href"), id) 46 | novel.imageUrl = element.selectFirst("img[src]")?.attr("abs:src") 47 | novel.metadata["Author(s)"] = element.selectFirst("span.author")?.text()?.substring(3) 48 | if (novel.metadata["Author(s)"] == null && novel.imageUrl?.startsWith("https://www.royalroadcdn.com/") == true) 49 | novel.metadata["Author(s)"] = novel.imageUrl?.substring(29, novel.imageUrl?.indexOf('/', 29) ?: 0) 50 | novel.rating = element.selectFirst("span.star[title]").attr("title") 51 | novel.longDescription = element.selectFirst("div.fiction-description")?.text() 52 | ?: element.selectFirst("div.margin-top-10.col-xs-12")?.text() 53 | novel.shortDescription = novel.longDescription?.split("\n")?.firstOrNull() 54 | return novel 55 | } 56 | 57 | override fun searchNovelsSelector() = "div.fiction-list > div" 58 | override fun searchNovelsNextPageSelector() = "a:contains(Last)" 59 | //endregion 60 | 61 | //region Novel Details 62 | override fun novelDetailsParse(novel: Novel, document: Document): Novel { 63 | 64 | novel.imageUrl = document.head().selectFirst("meta[property=og:image]")?.attr("content") 65 | novel.rating = document.head().selectFirst("meta[property=books:rating:value]")?.attr("content") 66 | novel.longDescription = document.body().selectFirst("div[property=description]")?.text() 67 | novel.genres = document.body().select("[property=genre]")?.map { it.text() } 68 | 69 | novel.metadata["Author(s)"] = document.head().selectFirst("meta[property=books:author]")?.attr("content") 70 | 71 | return novel 72 | } 73 | //endregion 74 | 75 | //region Chapters 76 | override fun chapterListSelector() = "table#chapters a[href]" 77 | override fun chapterFromElement(element: Element) = WebPage(element.absUrl("href"), element.text()) 78 | 79 | override fun chapterListRequest(novel: Novel): Request { 80 | return GET(novel.url, headers = headers) 81 | } 82 | 83 | //endregion 84 | 85 | //region stubs 86 | 87 | override fun latestUpdatesRequest(page: Int): Request = throw Exception(NOT_USED) 88 | override fun latestUpdatesSelector(): String = throw Exception(NOT_USED) 89 | override fun latestUpdatesFromElement(element: Element): Novel = throw Exception(NOT_USED) 90 | override fun latestUpdatesNextPageSelector(): String = throw Exception(NOT_USED) 91 | 92 | override fun popularNovelsRequest(page: Int): Request = throw Exception(NOT_USED) 93 | override fun popularNovelsSelector(): String = throw Exception(NOT_USED) 94 | override fun popularNovelsFromElement(element: Element): Novel = throw Exception(NOT_USED) 95 | override fun popularNovelNextPageSelector(): String = throw Exception(NOT_USED) 96 | 97 | //endregion 98 | 99 | companion object { 100 | private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + 101 | "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36" 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /extensions/individual/en/neovel/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 | 72 | 74 | 75 | -------------------------------------------------------------------------------- /stubs/src/main/java/io/github/gmathi/novellibrary/model/source/online/ParsedHttpSource.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.model.source.online 2 | 3 | import io.github.gmathi.novellibrary.model.database.Novel 4 | import io.github.gmathi.novellibrary.model.database.WebPage 5 | import io.github.gmathi.novellibrary.model.other.NovelsPage 6 | import okhttp3.Response 7 | import org.jsoup.nodes.Document 8 | import org.jsoup.nodes.Element 9 | 10 | /** 11 | * A simple implementation for sources from a website using Jsoup, an HTML parser. 12 | */ 13 | @Suppress("unused", "unused_parameter") 14 | abstract class ParsedHttpSource : HttpSource() { 15 | 16 | /** 17 | * Parses the response from the site and returns a [NovelsPage] object. 18 | * 19 | * @param response the response from the site. 20 | */ 21 | override fun popularNovelsParse(response: Response): NovelsPage { 22 | throw Exception("Stub!") 23 | } 24 | 25 | /** 26 | * Returns the Jsoup selector that returns a list of [Element] corresponding to each novel. 27 | */ 28 | protected abstract fun popularNovelsSelector(): String 29 | 30 | /** 31 | * Returns a novel from the given [element]. Most sites only show the title and the url, it's 32 | * totally fine to fill only those two values. 33 | * 34 | * @param element an element obtained from [popularNovelsSelector]. 35 | */ 36 | protected abstract fun popularNovelsFromElement(element: Element): Novel 37 | 38 | /** 39 | * Returns the Jsoup selector that returns the tag linking to the next page, or null if 40 | * there's no next page. 41 | */ 42 | protected abstract fun popularNovelNextPageSelector(): String? 43 | 44 | 45 | /** 46 | * Parses the response from the site and returns a [NovelsPage] object. 47 | * 48 | * @param response the response from the site. 49 | */ 50 | override fun searchNovelsParse(response: Response): NovelsPage { 51 | throw Exception("Stub!") 52 | } 53 | 54 | /** 55 | * Returns the Jsoup selector that returns a list of [Element] corresponding to each novel. 56 | */ 57 | protected abstract fun searchNovelsSelector(): String 58 | 59 | /** 60 | * Returns a novel from the given [element]. Most sites only show the title and the url, it's 61 | * totally fine to fill only those two values. 62 | * 63 | * @param element an element obtained from [searchNovelsSelector]. 64 | */ 65 | protected abstract fun searchNovelsFromElement(element: Element): Novel 66 | 67 | /** 68 | * Returns the Jsoup selector that returns the tag linking to the next page, or null if 69 | * there's no next page. 70 | */ 71 | protected abstract fun searchNovelsNextPageSelector(): String? 72 | 73 | 74 | /** 75 | * Parses the response from the site and returns a [NovelsPage] object. 76 | * 77 | * @param response the response from the site. 78 | */ 79 | override fun latestUpdatesParse(response: Response): NovelsPage { 80 | throw Exception("Stub!") 81 | } 82 | 83 | /** 84 | * Returns the Jsoup selector that returns a list of [Element] corresponding to each novel. 85 | */ 86 | protected abstract fun latestUpdatesSelector(): String 87 | 88 | /** 89 | * Returns a novel from the given [element]. Most sites only show the title and the url, it's 90 | * totally fine to fill only those two values. 91 | * 92 | * @param element an element obtained from [latestUpdatesSelector]. 93 | */ 94 | protected abstract fun latestUpdatesFromElement(element: Element): Novel 95 | 96 | /** 97 | * Returns the Jsoup selector that returns the tag linking to the next page, or null if 98 | * there's no next page. 99 | */ 100 | protected abstract fun latestUpdatesNextPageSelector(): String? 101 | 102 | 103 | /** 104 | * Parses the response from the site and returns the details of a novel. 105 | * 106 | * @param response the response from the site. 107 | */ 108 | override fun novelDetailsParse(novel: Novel, response: Response): Novel { 109 | throw Exception("Stub!") 110 | } 111 | 112 | /** 113 | * Returns the details of the novel from the given [document]. 114 | * 115 | * @param document the parsed document. 116 | */ 117 | protected abstract fun novelDetailsParse(novel: Novel, document: Document): Novel 118 | 119 | 120 | /** 121 | * Parses the response from the site and returns a list of chapters. 122 | * 123 | * @param response the response from the site. 124 | */ 125 | override fun chapterListParse(novel: Novel, response: Response): List { 126 | throw Exception("Stub!") 127 | } 128 | 129 | /** 130 | * Returns the Jsoup selector that returns a list of [Element] corresponding to each chapter. 131 | */ 132 | protected abstract fun chapterListSelector(): String 133 | 134 | /** 135 | * Returns a chapter from the given element. 136 | * 137 | * @param element an element obtained from [chapterListSelector]. 138 | */ 139 | protected abstract fun chapterFromElement(element: Element): WebPage 140 | } 141 | 142 | -------------------------------------------------------------------------------- /extensions/individual/en/boxnovel/src/io/github/gmathi/novellibrary/extension/en/boxnovel/BoxNovel.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.extension.en.boxnovel 2 | 3 | import io.github.gmathi.novellibrary.model.database.Novel 4 | import io.github.gmathi.novellibrary.model.database.WebPage 5 | import io.github.gmathi.novellibrary.model.source.filter.FilterList 6 | import io.github.gmathi.novellibrary.model.source.online.ParsedHttpSource 7 | import io.github.gmathi.novellibrary.network.GET 8 | import io.github.gmathi.novellibrary.network.POST 9 | import io.github.gmathi.novellibrary.util.Exceptions.NOT_USED 10 | import io.github.gmathi.novellibrary.util.network.asJsoup 11 | import okhttp3.* 12 | import okhttp3.internal.EMPTY_REQUEST 13 | import org.jsoup.nodes.Document 14 | import org.jsoup.nodes.Element 15 | import java.net.URLEncoder 16 | 17 | class BoxNovel : ParsedHttpSource() { 18 | 19 | override val baseUrl: String 20 | get() = "https://boxnovel.com" 21 | override val lang: String 22 | get() = "en" 23 | override val supportsLatest: Boolean 24 | get() = true 25 | override val name: String 26 | get() = "Box Novel" 27 | 28 | override val client: OkHttpClient 29 | get() = network.cloudflareClient 30 | 31 | override fun headersBuilder(): Headers.Builder = Headers.Builder() 32 | .add("User-Agent", USER_AGENT) 33 | .add("Referer", baseUrl) 34 | 35 | //region Search Novel 36 | override fun searchNovelsRequest(page: Int, query: String, filters: FilterList): Request { 37 | val encodedQuery = URLEncoder.encode(query, "UTF-8") 38 | val url = "$baseUrl/?s=${encodedQuery.replace(" ", "+")}&post_type=wp-manga" 39 | return GET(url, headers) 40 | } 41 | 42 | override fun searchNovelsFromElement(element: Element): Novel { 43 | val titleElement = element.selectFirst("div.post-title a") 44 | val novel = Novel(titleElement.text(), titleElement.attr("abs:href"), id) 45 | novel.imageUrl = element.selectFirst("img[src]")?.attr("abs:src") 46 | novel.authors = element.selectFirst("div.post-content_item.mg_author div.summary-content")?.children()?.map { it.text() } 47 | novel.genres = element.selectFirst("div.post-content_item.mg_genres div.summary-content")?.children()?.map { it.text() } 48 | novel.rating = element.selectFirst("span.score.font-meta.total_votes").text() 49 | return novel 50 | } 51 | 52 | override fun searchNovelsSelector() = "div.c-tabs-item__content" 53 | override fun searchNovelsNextPageSelector() = "a:contains(Last)" 54 | //endregion 55 | 56 | //region Novel Details 57 | override fun novelDetailsParse(novel: Novel, document: Document): Novel { 58 | novel.imageUrl = document.body().selectFirst("div.summary_image img[src]")?.attr("abs:src") 59 | novel.longDescription = document.body().selectFirst("div.description-summary")?.text() 60 | document.body().select("div.post-content_item")?.forEach { 61 | val heading = it.select("div.summary-heading")?.first()?.text() ?: return@forEach 62 | val value = it.select("div.summary-content")?.first()?.children()?.first()?.html() 63 | novel.metadata[heading] = value 64 | } 65 | val externalId = document.body().select("input.rating-post-id[type=hidden]").attr("value") 66 | novel.externalNovelId = externalId 67 | novel.metadata["PostId"] = externalId 68 | return novel 69 | } 70 | //endregion 71 | 72 | //region Chapters 73 | override fun chapterListRequest(novel: Novel): Request { 74 | // val novelId = novel.externalNovelId ?: novel.metadata["PostId"] ?: throw Exception(Exceptions.INVALID_NOVEL) 75 | val url = "${novel.url}ajax/chapters/" 76 | // val formBody: RequestBody = FormBody.Builder() 77 | // .add("action", "manga_get_chapters") 78 | // .add("manga", novelId) 79 | // .build() 80 | return POST(url, body = EMPTY_REQUEST) 81 | } 82 | override fun chapterListSelector() = "li.wp-manga-chapter a" 83 | override fun chapterFromElement(element: Element) = WebPage(element.absUrl("href"), element.text()) 84 | override fun chapterListParse(novel: Novel, response: Response): List { 85 | val document = response.asJsoup() 86 | return document.select(chapterListSelector()).reversed().mapIndexed { index, element -> 87 | val chapter = chapterFromElement(element) 88 | chapter.orderId = index.toLong() 89 | chapter 90 | } 91 | } 92 | 93 | //endregion 94 | 95 | //region stubs 96 | 97 | override fun latestUpdatesRequest(page: Int): Request = throw Exception(NOT_USED) 98 | override fun latestUpdatesSelector(): String = throw Exception(NOT_USED) 99 | override fun latestUpdatesFromElement(element: Element): Novel = throw Exception(NOT_USED) 100 | override fun latestUpdatesNextPageSelector(): String = throw Exception(NOT_USED) 101 | 102 | override fun popularNovelsRequest(page: Int): Request = throw Exception(NOT_USED) 103 | override fun popularNovelsSelector(): String = throw Exception(NOT_USED) 104 | override fun popularNovelsFromElement(element: Element): Novel = throw Exception(NOT_USED) 105 | override fun popularNovelNextPageSelector(): String = throw Exception(NOT_USED) 106 | 107 | //endregion 108 | 109 | companion object { 110 | private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + 111 | "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36" 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/src/io/github/gmathi/novellibrary/extension/en/scribblehub/ScribbleHub.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.extension.en.scribblehub 2 | 3 | import io.github.gmathi.novellibrary.model.database.Novel 4 | import io.github.gmathi.novellibrary.model.database.WebPage 5 | import io.github.gmathi.novellibrary.model.source.filter.FilterList 6 | import io.github.gmathi.novellibrary.model.source.online.ParsedHttpSource 7 | import io.github.gmathi.novellibrary.network.GET 8 | import io.github.gmathi.novellibrary.network.POST 9 | import io.github.gmathi.novellibrary.util.Exceptions.INVALID_NOVEL 10 | import io.github.gmathi.novellibrary.util.Exceptions.NOT_USED 11 | import io.github.gmathi.novellibrary.util.network.asJsoup 12 | import okhttp3.* 13 | import org.jsoup.nodes.Document 14 | import org.jsoup.nodes.Element 15 | import java.net.URLEncoder 16 | 17 | class ScribbleHub : ParsedHttpSource() { 18 | 19 | override val id: Long 20 | get() = 6L 21 | override val baseUrl: String 22 | get() = "https://www.scribblehub.com" 23 | override val lang: String 24 | get() = "en" 25 | override val supportsLatest: Boolean 26 | get() = true 27 | override val name: String 28 | get() = "Scribble Hub" 29 | 30 | override val client: OkHttpClient 31 | get() = network.cloudflareClient 32 | 33 | override fun headersBuilder(): Headers.Builder = Headers.Builder() 34 | .add("User-Agent", USER_AGENT) 35 | .add("Referer", baseUrl) 36 | 37 | //region Search Novel 38 | override fun searchNovelsRequest(page: Int, query: String, filters: FilterList): Request { 39 | val encodedQuery = URLEncoder.encode(query, "UTF-8") 40 | val url = "$baseUrl/?s=${encodedQuery.replace(" ", "+")}&post_type=fictionposts&paged=$page" 41 | return GET(url, headers) 42 | } 43 | 44 | override fun searchNovelsFromElement(element: Element): Novel { 45 | val urlElement = element.select("div.search_title > a[href]") 46 | val novel = Novel(urlElement.text(), urlElement.attr("abs:href"), id) 47 | novel.imageUrl = element.select("div.search_img > img[src]").attr("abs:src") 48 | novel.rating = 49 | element.select("div.search_img").select("div.search_ratings").text().replace("(", "") 50 | .replace(")", "") 51 | return novel 52 | } 53 | 54 | override fun searchNovelsSelector() = "div.search_main_box" 55 | override fun searchNovelsNextPageSelector() = "a.page-link.next" 56 | //endregion 57 | 58 | //region Novel Details 59 | override fun novelDetailsParse(novel: Novel, document: Document): Novel { 60 | val pageElement = document.body().select("div#page") 61 | 62 | novel.imageUrl = pageElement.select("div.fic_image > img").attr("abs:src") 63 | novel.metadata["Author(s)"] = pageElement.select("span[property='author'] a").outerHtml() 64 | 65 | val genresElements = pageElement.select("span.wi_fic_genre a.fic_genre") 66 | novel.genres = genresElements.map { it.text() } 67 | novel.metadata["Genre(s)"] = genresElements.joinToString(", ") { it.outerHtml() } 68 | 69 | novel.longDescription = pageElement.select("div.wi_fic_desc").text() 70 | novel.rating = pageElement.select("meta[property='ratingValue']").attr("content") 71 | 72 | novel.metadata["Tags"] = 73 | pageElement.select("#etagme")?.joinToString(", ") { it.outerHtml() } 74 | novel.externalNovelId = document.getElementById("mypostid").attr("value") 75 | novel.metadata["PostId"] = novel.externalNovelId 76 | novel.chaptersCount = document.getElementById("chpcounter").attr("value").toLong() 77 | 78 | return novel 79 | } 80 | //endregion 81 | 82 | //region Chapters 83 | 84 | override fun chapterListSelector() = "a[href]" 85 | override fun chapterFromElement(element: Element) = 86 | WebPage(element.attr("abs:href"), element.attr("title")) 87 | 88 | override fun chapterListParse(novel: Novel, response: Response): List { 89 | val document = response.asJsoup() 90 | return document.select(chapterListSelector()).reversed().mapIndexed { index, element -> 91 | val chapter = chapterFromElement(element) 92 | chapter.orderId = index.toLong() 93 | chapter 94 | } 95 | } 96 | 97 | override fun chapterListRequest(novel: Novel): Request { 98 | val scribbleNovelId = 99 | novel.externalNovelId ?: novel.metadata["PostId"] ?: throw Exception(INVALID_NOVEL) 100 | val url = "https://www.scribblehub.com/wp-admin/admin-ajax.php" 101 | val formBody: RequestBody = FormBody.Builder() 102 | .add("action", "wi_gettocchp") 103 | .add("strSID", scribbleNovelId) 104 | .add("strmypostid", "0") 105 | .add("strFic", "yes") 106 | .build() 107 | return POST(url, body = formBody) 108 | } 109 | 110 | //endregion 111 | 112 | //region stubs 113 | 114 | override fun latestUpdatesRequest(page: Int): Request = throw Exception(NOT_USED) 115 | override fun latestUpdatesSelector(): String = throw Exception(NOT_USED) 116 | override fun latestUpdatesFromElement(element: Element): Novel = throw Exception(NOT_USED) 117 | override fun latestUpdatesNextPageSelector(): String = throw Exception(NOT_USED) 118 | 119 | override fun popularNovelsRequest(page: Int): Request = throw Exception(NOT_USED) 120 | override fun popularNovelsSelector(): String = throw Exception(NOT_USED) 121 | override fun popularNovelsFromElement(element: Element): Novel = throw Exception(NOT_USED) 122 | override fun popularNovelNextPageSelector(): String = throw Exception(NOT_USED) 123 | 124 | //endregion 125 | 126 | companion object { 127 | private const val USER_AGENT = 128 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36" 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/src/io/github/gmathi/novellibrary/extension/en/wuxiaworldsite/WuxiaWorldSite.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.extension.en.wuxiaworldsite 2 | 3 | import io.github.gmathi.novellibrary.model.database.Novel 4 | import io.github.gmathi.novellibrary.model.database.WebPage 5 | import io.github.gmathi.novellibrary.model.other.NovelsPage 6 | import io.github.gmathi.novellibrary.model.source.filter.FilterList 7 | import io.github.gmathi.novellibrary.model.source.online.ParsedHttpSource 8 | import io.github.gmathi.novellibrary.network.GET 9 | import io.github.gmathi.novellibrary.util.Exceptions.MISSING_EXTERNAL_ID 10 | import io.github.gmathi.novellibrary.util.Exceptions.MISSING_IMPLEMENTATION 11 | import io.github.gmathi.novellibrary.util.network.asJsoup 12 | import okhttp3.Headers 13 | import okhttp3.OkHttpClient 14 | import okhttp3.Request 15 | import okhttp3.Response 16 | import org.jsoup.nodes.Document 17 | import org.jsoup.nodes.Element 18 | 19 | class WuxiaWorldSite : ParsedHttpSource() { 20 | 21 | override val baseUrl: String 22 | get() = "https://wuxiaworldsite.co" 23 | override val lang: String 24 | get() = "en" 25 | override val supportsLatest: Boolean 26 | get() = true 27 | override val name: String 28 | get() = "Novel Full" 29 | 30 | override val client: OkHttpClient 31 | get() = network.cloudflareClient 32 | 33 | override fun headersBuilder(): Headers.Builder = Headers.Builder() 34 | .add("User-Agent", USER_AGENT) 35 | .add("Referer", baseUrl) 36 | 37 | //region Search Novel 38 | override fun searchNovelsRequest(page: Int, query: String, filters: FilterList): Request { 39 | val reformattedQuery = query.replace(Regex("[^a-zA-Z0-9]"), "-") 40 | val url = "$baseUrl/search/$reformattedQuery&page=$page" 41 | return GET(url, headers) 42 | } 43 | 44 | override fun searchNovelsParse(response: Response): NovelsPage { 45 | val document = response.asJsoup() 46 | val novels = document.select(searchNovelsSelector())?.map { element -> 47 | searchNovelsFromElement(element) 48 | } 49 | 50 | val hasNextPage = 51 | document.select("li.next").firstOrNull() != null && document.select("li.next.disabled") 52 | .firstOrNull() == null 53 | 54 | return NovelsPage(novels ?: emptyList(), hasNextPage) 55 | } 56 | 57 | override fun searchNovelsFromElement(element: Element): Novel { 58 | val aElement = element.selectFirst("a[href]") 59 | val novel = Novel( 60 | aElement.text(), 61 | aElement.attr("abs:href"), 62 | this.id 63 | ) 64 | novel.imageUrl = aElement.selectFirst("img").attr("abs:src") 65 | return novel 66 | } 67 | 68 | override fun searchNovelsSelector() = "div.bz.item" 69 | override fun searchNovelsNextPageSelector() = "span:contains(>|)" 70 | //endregion 71 | 72 | //region Novel Details 73 | override fun novelDetailsParse(novel: Novel, document: Document): Novel { 74 | val booksElement = document.body().selectFirst("div.read-book") 75 | val genres = booksElement.select("div.tags a.a_tag_item") 76 | val infoElements = document.body().select("div.info").first().children() 77 | 78 | novel.imageUrl = booksElement.selectFirst("div.img-read img").attr("abs:src") 79 | novel.genres = genres.map { it.text() } 80 | 81 | novel.longDescription = booksElement.select("div.story-introduction-content p").joinToString(separator = "\n") { it.text() } 82 | novel.rating = ( 83 | document.body().select("div.small > em > strong > span").first().text() 84 | .toDouble() / 2 85 | ).toString() 86 | novel.externalNovelId = document.selectFirst("#rating")?.attr("data-novel-id") 87 | 88 | novel.metadata["Author(s)"] = booksElement.select("i.fa.fa-user").joinToString(", ") { it.text() } 89 | novel.metadata["Genre(s)"] = genres.joinToString(", ") { "${it.text()}" } 90 | novel.metadata["Source"] = infoElements[2].text() 91 | novel.metadata["Status"] = infoElements[3].text() 92 | 93 | return novel 94 | } 95 | //endregion 96 | 97 | //region Chapters 98 | 99 | override fun chapterListSelector() = "select.chapter_jump option" 100 | override fun chapterFromElement(element: Element): WebPage { 101 | val url = "$baseUrl${element.attr("value")}" 102 | val name = element.text() 103 | return WebPage(url, name) 104 | } 105 | 106 | override fun chapterListRequest(novel: Novel): Request { 107 | val id = novel.externalNovelId ?: throw Exception(MISSING_EXTERNAL_ID) 108 | val url = "$baseUrl/ajax-chapter-option?novelId=$id¤tChapterId=" 109 | return GET(url, headers) 110 | } 111 | 112 | //endregion 113 | 114 | //region stubs 115 | 116 | override fun latestUpdatesRequest(page: Int): Request = throw Exception(MISSING_IMPLEMENTATION) 117 | override fun latestUpdatesSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 118 | override fun latestUpdatesFromElement(element: Element): Novel = 119 | throw Exception(MISSING_IMPLEMENTATION) 120 | 121 | override fun latestUpdatesNextPageSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 122 | 123 | override fun popularNovelsRequest(page: Int): Request = throw Exception(MISSING_IMPLEMENTATION) 124 | override fun popularNovelsSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 125 | override fun popularNovelsFromElement(element: Element): Novel = 126 | throw Exception(MISSING_IMPLEMENTATION) 127 | 128 | override fun popularNovelNextPageSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 129 | 130 | //endregion 131 | 132 | companion object { 133 | private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + 134 | "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36" 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/src/io/github/gmathi/novellibrary/extension/en/novelfull/NovelFull.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.extension.en.novelfull 2 | 3 | import io.github.gmathi.novellibrary.model.database.Novel 4 | import io.github.gmathi.novellibrary.model.database.WebPage 5 | import io.github.gmathi.novellibrary.model.other.NovelsPage 6 | import io.github.gmathi.novellibrary.model.source.filter.FilterList 7 | import io.github.gmathi.novellibrary.model.source.online.ParsedHttpSource 8 | import io.github.gmathi.novellibrary.network.GET 9 | import io.github.gmathi.novellibrary.util.Exceptions.MISSING_EXTERNAL_ID 10 | import io.github.gmathi.novellibrary.util.Exceptions.MISSING_IMPLEMENTATION 11 | import io.github.gmathi.novellibrary.util.network.asJsoup 12 | import okhttp3.Headers 13 | import okhttp3.OkHttpClient 14 | import okhttp3.Request 15 | import okhttp3.Response 16 | import org.jsoup.nodes.Document 17 | import org.jsoup.nodes.Element 18 | import java.net.URLEncoder 19 | 20 | class NovelFull : ParsedHttpSource() { 21 | 22 | override val id: Long 23 | get() = 7L 24 | override val baseUrl: String 25 | get() = "https://novelfull.com" 26 | override val lang: String 27 | get() = "en" 28 | override val supportsLatest: Boolean 29 | get() = true 30 | override val name: String 31 | get() = "Novel Full" 32 | 33 | override val client: OkHttpClient 34 | get() = network.cloudflareClient 35 | 36 | override fun headersBuilder(): Headers.Builder = Headers.Builder() 37 | .add("User-Agent", USER_AGENT) 38 | .add("Referer", baseUrl) 39 | 40 | //region Search Novel 41 | override fun searchNovelsRequest(page: Int, query: String, filters: FilterList): Request { 42 | val encodedQuery = URLEncoder.encode(query, "UTF-8") 43 | val url = "$baseUrl/search?keyword=${encodedQuery.replace(" ", "+")}&page=$page" 44 | return GET(url, headers) 45 | } 46 | 47 | override fun searchNovelsParse(response: Response): NovelsPage { 48 | val document = response.asJsoup() 49 | 50 | val novels = document.select("div.list.list-truyen").firstOrNull()?.select("div.row") 51 | ?.map { element -> 52 | searchNovelsFromElement(element) 53 | } 54 | 55 | val hasNextPage = 56 | document.select("li.next").firstOrNull() != null && document.select("li.next.disabled") 57 | .firstOrNull() == null 58 | 59 | return NovelsPage(novels ?: emptyList(), hasNextPage) 60 | } 61 | 62 | override fun searchNovelsFromElement(element: Element): Novel { 63 | val novel = Novel( 64 | element.select("h3.truyen-title").text(), 65 | element.select("h3.truyen-title").select("a[href]").attr("abs:href"), 66 | this.id 67 | ) 68 | novel.imageUrl = element.select("img.cover").attr("abs:src") 69 | return novel 70 | } 71 | 72 | override fun searchNovelsSelector() = "div.list.list-truyen div.row" 73 | override fun searchNovelsNextPageSelector() = "li.next" 74 | //endregion 75 | 76 | //region Novel Details 77 | override fun novelDetailsParse(novel: Novel, document: Document): Novel { 78 | val booksElement = document.body().select("div.books") 79 | val infoElements = document.body().select("div.info").first().children() 80 | 81 | novel.imageUrl = booksElement.select("div.book > img").attr("abs:src") 82 | novel.genres = infoElements[1].select("a").map { it.text() } 83 | novel.longDescription = 84 | document.body().select("div.desc-text > p").joinToString(separator = "\n") { it.text() } 85 | novel.rating = ( 86 | document.body().select("div.small > em > strong > span").first().text() 87 | .toDouble() / 2 88 | ).toString() 89 | novel.externalNovelId = document.selectFirst("#rating")?.attr("data-novel-id") 90 | 91 | novel.metadata["Author(s)"] = infoElements[0].select("a") 92 | .joinToString(", ") { "${it.text()}" } 93 | novel.metadata["Genre(s)"] = infoElements[1].select("a") 94 | .joinToString(", ") { "${it.text()}" } 95 | novel.metadata["Source"] = infoElements[2].text() 96 | novel.metadata["Status"] = infoElements[3].text() 97 | 98 | return novel 99 | } 100 | //endregion 101 | 102 | //region Chapters 103 | 104 | override fun chapterListSelector() = "select.chapter_jump option" 105 | override fun chapterFromElement(element: Element): WebPage { 106 | val url = "$baseUrl${element.attr("value")}" 107 | val name = element.text() 108 | return WebPage(url, name) 109 | } 110 | 111 | override fun chapterListRequest(novel: Novel): Request { 112 | val id = novel.externalNovelId ?: throw Exception(MISSING_EXTERNAL_ID) 113 | val url = "$baseUrl/ajax-chapter-option?novelId=$id¤tChapterId=" 114 | return GET(url, headers) 115 | } 116 | 117 | //endregion 118 | 119 | //region stubs 120 | 121 | override fun latestUpdatesRequest(page: Int): Request = throw Exception(MISSING_IMPLEMENTATION) 122 | override fun latestUpdatesSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 123 | override fun latestUpdatesFromElement(element: Element): Novel = 124 | throw Exception(MISSING_IMPLEMENTATION) 125 | 126 | override fun latestUpdatesNextPageSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 127 | 128 | override fun popularNovelsRequest(page: Int): Request = throw Exception(MISSING_IMPLEMENTATION) 129 | override fun popularNovelsSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 130 | override fun popularNovelsFromElement(element: Element): Novel = 131 | throw Exception(MISSING_IMPLEMENTATION) 132 | 133 | override fun popularNovelNextPageSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 134 | 135 | //endregion 136 | 137 | companion object { 138 | private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + 139 | "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36" 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/src/io/github/gmathi/novellibrary/extension/en/novelbin/NovelBin.kt: -------------------------------------------------------------------------------- 1 | package io.github.gmathi.novellibrary.extension.en.novelbin 2 | 3 | import io.github.gmathi.novellibrary.model.database.Novel 4 | import io.github.gmathi.novellibrary.model.database.WebPage 5 | import io.github.gmathi.novellibrary.model.other.NovelsPage 6 | import io.github.gmathi.novellibrary.model.source.filter.FilterList 7 | import io.github.gmathi.novellibrary.model.source.online.ParsedHttpSource 8 | import io.github.gmathi.novellibrary.network.GET 9 | import io.github.gmathi.novellibrary.util.Exceptions.MISSING_EXTERNAL_ID 10 | import io.github.gmathi.novellibrary.util.Exceptions.MISSING_IMPLEMENTATION 11 | import io.github.gmathi.novellibrary.util.network.asJsoup 12 | import okhttp3.Headers 13 | import okhttp3.OkHttpClient 14 | import okhttp3.Request 15 | import okhttp3.Response 16 | import org.jsoup.nodes.Document 17 | import org.jsoup.nodes.Element 18 | import java.net.URLEncoder 19 | 20 | class NovelBin : ParsedHttpSource() { 21 | 22 | override val baseUrl: String 23 | get() = "https://novelbin.org" 24 | override val lang: String 25 | get() = "en" 26 | override val supportsLatest: Boolean 27 | get() = true 28 | override val name: String 29 | get() = "Novel Bin" 30 | 31 | override val client: OkHttpClient 32 | get() = network.cloudflareClient 33 | 34 | override fun headersBuilder(): Headers.Builder = Headers.Builder() 35 | .add("User-Agent", USER_AGENT) 36 | .add("Referer", baseUrl) 37 | 38 | //region Search Novel 39 | override fun searchNovelsRequest(page: Int, query: String, filters: FilterList): Request { 40 | val encodedQuery = URLEncoder.encode(query, "UTF-8") 41 | val url = "$baseUrl/search?keyword=${encodedQuery.replace(" ", "+")}&page=$page" 42 | return GET(url, headers) 43 | } 44 | 45 | override fun searchNovelsParse(response: Response): NovelsPage { 46 | val document = response.asJsoup() 47 | 48 | val novels = document.select("div.list.list-novel").firstOrNull()?.select("div.row") 49 | ?.map { element -> 50 | searchNovelsFromElement(element) 51 | } 52 | 53 | val hasNextPage = 54 | document.select("li.next").firstOrNull() != null && document.select("li.next.disabled") 55 | .firstOrNull() == null 56 | 57 | return NovelsPage(novels ?: emptyList(), hasNextPage) 58 | } 59 | 60 | override fun searchNovelsFromElement(element: Element): Novel { 61 | val novel = Novel( 62 | element.select("h3.novel-title").text(), 63 | element.select("h3.novel-title").select("a[href]").attr("abs:href"), 64 | this.id 65 | ) 66 | novel.imageUrl = element.select("img.lazy").attr("abs:src") 67 | return novel 68 | } 69 | 70 | override fun searchNovelsSelector() = "div.list.list-novel div.row" 71 | override fun searchNovelsNextPageSelector() = "li.next" 72 | //endregion 73 | 74 | //region Novel Details 75 | override fun novelDetailsParse(novel: Novel, document: Document): Novel { 76 | val booksElement = document.body().select("div.books") 77 | val infoElements = document.body().select("ul.info").first().children() 78 | novel.imageUrl = booksElement.select("div.book > img").attr("abs:src") 79 | 80 | infoElements.forEach { element -> 81 | val title = element.select("h3").text() 82 | val valueList = element.select("a[href]").map { it.text() } 83 | val rawValueList = element.select("a[href]") 84 | .joinToString(", ") { "${it.text()}" } 85 | 86 | if (title.contains("Author")) { 87 | novel.authors = valueList 88 | novel.metadata["Author(s)"] = rawValueList 89 | } else if (title.contains("Genre")) { 90 | novel.genres = valueList 91 | novel.metadata["Genre(s)"] = rawValueList 92 | } else { 93 | novel.metadata[title] = rawValueList 94 | } 95 | } 96 | 97 | novel.longDescription = document.body().select("div.desc-text").joinToString(separator = "\n") { it.text() } 98 | novel.rating = (document.body().select("[itemprop=ratingValue]").first().text().toDouble() / 2).toString() 99 | novel.externalNovelId = document.selectFirst("#rating")?.attr("data-novel-id") 100 | 101 | return novel 102 | } 103 | //endregion 104 | 105 | //region Chapters 106 | 107 | override fun chapterListSelector() = "li a" 108 | override fun chapterFromElement(element: Element): WebPage { 109 | val url = element.attr("href") 110 | val name = element.text() 111 | return WebPage(url, name) 112 | } 113 | 114 | override fun chapterListRequest(novel: Novel): Request { 115 | val id = novel.externalNovelId ?: throw Exception(MISSING_EXTERNAL_ID) 116 | val url = "$baseUrl/ajax/chapter-archive?novelId=$id" 117 | return GET(url, headers) 118 | } 119 | 120 | //endregion 121 | 122 | //region stubs 123 | 124 | override fun latestUpdatesRequest(page: Int): Request = throw Exception(MISSING_IMPLEMENTATION) 125 | override fun latestUpdatesSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 126 | override fun latestUpdatesFromElement(element: Element): Novel = 127 | throw Exception(MISSING_IMPLEMENTATION) 128 | 129 | override fun latestUpdatesNextPageSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 130 | 131 | override fun popularNovelsRequest(page: Int): Request = throw Exception(MISSING_IMPLEMENTATION) 132 | override fun popularNovelsSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 133 | override fun popularNovelsFromElement(element: Element): Novel = 134 | throw Exception(MISSING_IMPLEMENTATION) 135 | 136 | override fun popularNovelNextPageSelector(): String = throw Exception(MISSING_IMPLEMENTATION) 137 | 138 | //endregion 139 | 140 | companion object { 141 | private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + 142 | "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36" 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /extensions/individual/en/lnmtl/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /extensions/individual/en/fanmtl/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbin/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /extensions/individual/en/novelbuddy/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /extensions/individual/en/novelfull/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /extensions/individual/en/royalroad/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /extensions/individual/en/scribblehub/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /extensions/individual/en/wuxiaworldsite/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | --------------------------------------------------------------------------------