├── 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 | 
22 |
23 |
24 | - Open up extension
25 |
26 | 
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 | +
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 | 
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 | 
60 | to
61 |
62 | 
63 |
64 | - Also rename the contents in the `Xyz.kt` as below.
65 |
66 | 
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 | 
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 |
--------------------------------------------------------------------------------