Split Bilibili and make it multisrc. (#11815)

This commit is contained in:
Alessandro Jean 2022-05-11 15:52:34 -03:00 committed by GitHub
parent 4f1d0b6517
commit adb8b29dda
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 272 additions and 180 deletions

View File

@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="BilibiliGenerator" type="JetRunConfigurationType" nameIsGenerated="true">
<module name="tachiyomi-extensions.multisrc" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="MAIN_CLASS_NAME" value="eu.kanade.tachiyomi.multisrc.bilibili.BilibiliGenerator" />
<option name="WORKING_DIRECTORY" value="" />
<method v="2">
<option name="Make" enabled="true" />
<option name="Gradle.BeforeRunTask" enabled="true" tasks="ktFormat" externalProjectPath="$PROJECT_DIR$/multisrc" vmOptions="" scriptParameters="" />
<option name="Gradle.BeforeRunTask" enabled="true" tasks="ktLint" externalProjectPath="$PROJECT_DIR$/multisrc" vmOptions="" scriptParameters="" />
</method>
</configuration>
</component>

View File

@ -4,7 +4,7 @@
<application> <application>
<activity <activity
android:name=".all.bilibili.BilibiliUrlActivity" android:name="eu.kanade.tachiyomi.multisrc.bilibili.BilibiliUrlActivity"
android:excludeFromRecents="true" android:excludeFromRecents="true"
android:exported="true" android:exported="true"
android:theme="@android:style/Theme.NoDisplay"> android:theme="@android:style/Theme.NoDisplay">
@ -33,17 +33,7 @@
android:host="m.bilibilicomics.com" android:host="m.bilibilicomics.com"
android:pathPattern="/detail/mc..*" android:pathPattern="/detail/mc..*"
android:scheme="https" /> android:scheme="https" />
<data
android:host="manga.bilibili.com"
android:pathPattern="/detail/mc..*"
android:scheme="https" />
<data
android:host="manga.bilibili.com"
android:pathPattern="/m/detail/mc..*"
android:scheme="https" />
</intent-filter> </intent-filter>
</activity> </activity>
</application> </application>
</manifest> </manifest>

View File

@ -1,6 +1,17 @@
package eu.kanade.tachiyomi.extension.all.bilibili package eu.kanade.tachiyomi.extension.all.bilibilicomics
import eu.kanade.tachiyomi.lib.ratelimit.SpecificHostRateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.bilibili.Bilibili
import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliAccessToken
import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliAccessTokenCookie
import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliComicDto
import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliCredential
import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliGetCredential
import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliTag
import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliUnlockedEpisode
import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliUserEpisodes
import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.source.SourceFactory
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import kotlinx.serialization.decodeFromString import kotlinx.serialization.decodeFromString
@ -17,13 +28,26 @@ import okio.Buffer
import java.io.IOException import java.io.IOException
import java.net.URLDecoder import java.net.URLDecoder
class BilibiliComicsFactory : SourceFactory {
override fun createSources() = listOf(
BilibiliComicsEn(),
BilibiliComicsCn(),
BilibiliComicsId(),
)
}
abstract class BilibiliComics(lang: String) : Bilibili( abstract class BilibiliComics(lang: String) : Bilibili(
"BILIBILI COMICS", "BILIBILI COMICS",
"https://www.bilibilicomics.com", "https://www.bilibilicomics.com",
lang lang
) { ) {
override val client: OkHttpClient = super.client.newBuilder() override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(::signedInIntercept) .addInterceptor(::signedInIntercept)
.addInterceptor(::expiredTokenIntercept)
.addInterceptor(SpecificHostRateLimitInterceptor(baseUrl.toHttpUrl(), 1))
.addInterceptor(SpecificHostRateLimitInterceptor(CDN_URL.toHttpUrl(), 2))
.addInterceptor(SpecificHostRateLimitInterceptor(COVER_CDN_URL.toHttpUrl(), 2))
.build() .build()
override val signedIn: Boolean override val signedIn: Boolean
@ -246,3 +270,74 @@ abstract class BilibiliComics(lang: String) : Bilibili(
"Failed to get the credential to read the chapter." "Failed to get the credential to read the chapter."
} }
} }
class BilibiliComicsEn : BilibiliComics("en") {
override fun getAllGenres(): Array<BilibiliTag> = arrayOf(
BilibiliTag("All", -1),
BilibiliTag("Action", 19),
BilibiliTag("Adventure", 22),
BilibiliTag("BL", 3),
BilibiliTag("Comedy", 14),
BilibiliTag("Eastern", 30),
BilibiliTag("Fantasy", 11),
BilibiliTag("GL", 16),
BilibiliTag("Harem", 15),
BilibiliTag("Historical", 12),
BilibiliTag("Horror", 23),
BilibiliTag("Mistery", 17),
BilibiliTag("Romance", 13),
BilibiliTag("Slice of Life", 21),
BilibiliTag("Suspense", 41),
BilibiliTag("Teen", 20)
)
}
class BilibiliComicsCn : BilibiliComics("zh-Hans") {
override fun getAllSortOptions(): Array<String> = arrayOf("为你推荐", "人气推荐", "更新时间")
override fun getAllStatus(): Array<String> = arrayOf("全部", "连载中", "已完结")
override fun getAllPrices(): Array<String> = arrayOf("全部", "免费", "付费")
override fun getAllGenres(): Array<BilibiliTag> = arrayOf(
BilibiliTag("全部", -1),
BilibiliTag("校园", 18),
BilibiliTag("都市", 9),
BilibiliTag("耽美", 3),
BilibiliTag("少女", 20),
BilibiliTag("恋爱", 13),
BilibiliTag("奇幻", 11),
BilibiliTag("热血", 19),
BilibiliTag("冒险", 22),
BilibiliTag("古风", 12),
BilibiliTag("百合", 16),
BilibiliTag("玄幻", 30),
BilibiliTag("悬疑", 41),
BilibiliTag("科幻", 8)
)
}
class BilibiliComicsId : BilibiliComics("id") {
override fun getAllSortOptions(): Array<String> = arrayOf("Kamu Mungkin Suka", "Populer", "Terbaru")
override fun getAllStatus(): Array<String> = arrayOf("Semua", "Berlangsung", "Tamat")
override fun getAllPrices(): Array<String> = arrayOf("Semua", "Bebas", "Dibayar")
override fun getAllGenres(): Array<BilibiliTag> = arrayOf(
BilibiliTag("Semua", -1),
BilibiliTag("Aksi", 19),
BilibiliTag("Fantasi Timur", 30),
BilibiliTag("Fantasi", 11),
BilibiliTag("Historis", 12),
BilibiliTag("Horror", 23),
BilibiliTag("Kampus", 18),
BilibiliTag("Komedi", 14),
BilibiliTag("Menegangkan", 41),
BilibiliTag("Remaja", 20),
BilibiliTag("Romantis", 13)
)
}

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="eu.kanade.tachiyomi.extension">
<application>
<activity
android:name="eu.kanade.tachiyomi.multisrc.bilibili.BilibiliUrlActivity"
android:excludeFromRecents="true"
android:exported="true"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="manga.bilibili.com"
android:pathPattern="/detail/mc..*"
android:scheme="https" />
<data
android:host="manga.bilibili.com"
android:pathPattern="/m/detail/mc..*"
android:scheme="https" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -0,0 +1,64 @@
package eu.kanade.tachiyomi.extension.zh.bilibilimanga
import eu.kanade.tachiyomi.lib.ratelimit.SpecificHostRateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.bilibili.Bilibili
import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliTag
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
class BilibiliManga : Bilibili(
"哔哩哔哩漫画",
"https://manga.bilibili.com",
"zh-Hans"
) {
override val id: Long = 3561131545129718586
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(::expiredTokenIntercept)
.addInterceptor(SpecificHostRateLimitInterceptor(baseUrl.toHttpUrl(), 1))
.addInterceptor(SpecificHostRateLimitInterceptor(CDN_URL.toHttpUrl(), 2))
.addInterceptor(SpecificHostRateLimitInterceptor(COVER_CDN_URL.toHttpUrl(), 2))
.build()
override val defaultPopularSort: Int = 0
override val defaultLatestSort: Int = 1
override fun getAllStatus(): Array<String> = arrayOf("全部", "连载", "完结")
override fun getAllSortOptions(): Array<String> = arrayOf("人气推荐", "更新时间", "追漫人数", "上架时间")
override fun getAllPrices(): Array<String> = arrayOf("全部", "免费", "付费", "等就免费")
override fun getAllGenres(): Array<BilibiliTag> = arrayOf(
BilibiliTag("全部", -1),
BilibiliTag("竞技", 1034),
BilibiliTag("冒险", 1013),
BilibiliTag("热血", 999),
BilibiliTag("搞笑", 994),
BilibiliTag("恋爱", 995),
BilibiliTag("少女", 1026),
BilibiliTag("日常", 1020),
BilibiliTag("校园", 1001),
BilibiliTag("治愈", 1007),
BilibiliTag("古风", 997),
BilibiliTag("玄幻", 1016),
BilibiliTag("奇幻", 998),
BilibiliTag("惊奇", 996),
BilibiliTag("悬疑", 1023),
BilibiliTag("都市", 1002),
BilibiliTag("剧情", 1030),
BilibiliTag("总裁", 1004),
BilibiliTag("科幻", 1015),
BilibiliTag("正能量", 1028),
)
override fun getAllAreas(): Array<BilibiliTag> = arrayOf(
BilibiliTag("全部", -1),
BilibiliTag("大陆", 1),
BilibiliTag("日本", 2),
BilibiliTag("韩国", 6),
BilibiliTag("其他", 5),
)
}

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="eu.kanade.tachiyomi.extension">
<application>
<activity
android:name="eu.kanade.tachiyomi.multisrc.bilibili.BilibiliUrlActivity"
android:excludeFromRecents="true"
android:exported="true"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="${SOURCEHOST}"
android:pathPattern="/detail/mc..*"
android:scheme="${SOURCESCHEME}" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -0,0 +1,4 @@
dependencies {
implementation project(':lib-ratelimit')
}

View File

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 235 KiB

After

Width:  |  Height:  |  Size: 235 KiB

View File

@ -1,10 +1,9 @@
package eu.kanade.tachiyomi.extension.all.bilibili package eu.kanade.tachiyomi.multisrc.bilibili
import android.app.Application import android.app.Application
import android.content.SharedPreferences import android.content.SharedPreferences
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.lib.ratelimit.SpecificHostRateLimitInterceptor
import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.ConfigurableSource
@ -44,12 +43,7 @@ abstract class Bilibili(
override val supportsLatest = true override val supportsLatest = true
override val client: OkHttpClient = network.cloudflareClient.newBuilder() override val client: OkHttpClient = network.cloudflareClient
.addInterceptor(::expiredTokenIntercept)
.addInterceptor(SpecificHostRateLimitInterceptor(baseUrl.toHttpUrl(), 1))
.addInterceptor(SpecificHostRateLimitInterceptor(CDN_URL.toHttpUrl(), 2))
.addInterceptor(SpecificHostRateLimitInterceptor(COVER_CDN_URL.toHttpUrl(), 2))
.build()
override fun headersBuilder(): Headers.Builder = Headers.Builder() override fun headersBuilder(): Headers.Builder = Headers.Builder()
.add("Accept", ACCEPT_JSON) .add("Accept", ACCEPT_JSON)
@ -516,7 +510,7 @@ abstract class Bilibili(
return FilterList(filters) return FilterList(filters)
} }
private fun expiredTokenIntercept(chain: Interceptor.Chain): Response { protected fun expiredTokenIntercept(chain: Interceptor.Chain): Response {
val response = chain.proceed(chain.request()) val response = chain.proceed(chain.request())
// Get a new image token if the current one expired. // Get a new image token if the current one expired.
@ -562,8 +556,8 @@ abstract class Bilibili(
} }
companion object { companion object {
private const val CDN_URL = "https://manga.hdslb.com" const val CDN_URL = "https://manga.hdslb.com"
private const val COVER_CDN_URL = "https://i0.hdslb.com" const val COVER_CDN_URL = "https://i0.hdslb.com"
const val BASE_API_COMIC_ENDPOINT = "twirp/comic.v1.Comic" const val BASE_API_COMIC_ENDPOINT = "twirp/comic.v1.Comic"
const val BASE_API_USER_ENDPOINT = "twirp/comic.v1.User" const val BASE_API_USER_ENDPOINT = "twirp/comic.v1.User"

View File

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.extension.all.bilibili package eu.kanade.tachiyomi.multisrc.bilibili
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.extension.all.bilibili package eu.kanade.tachiyomi.multisrc.bilibili
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter

View File

@ -0,0 +1,26 @@
package eu.kanade.tachiyomi.multisrc.bilibili
import generator.ThemeSourceData.MultiLang
import generator.ThemeSourceData.SingleLang
import generator.ThemeSourceGenerator
class BilibiliGenerator : ThemeSourceGenerator {
override val themePkg = "bilibili"
override val themeClass = "Bilibili"
override val baseVersionCode: Int = 1
override val sources = listOf(
MultiLang("BILIBILI COMICS", "https://www.bilibilicomics.com", listOf("en", "zh-Hans", "id"), className = "BilibiliComicsFactory"),
SingleLang("BILIBILI MANGA", "https://manga.bilibili.com", "zh-Hans", className = "BilibiliManga")
)
companion object {
@JvmStatic
fun main(args: Array<String>) {
BilibiliGenerator().createAll()
}
}
}

View File

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.extension.all.bilibili package eu.kanade.tachiyomi.multisrc.bilibili
import android.app.Activity import android.app.Activity
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException

View File

@ -5,7 +5,7 @@ Table of Content
- [Why are some chapters missing?](#why-are-some-chapters-missing) - [Why are some chapters missing?](#why-are-some-chapters-missing)
- [Guides](#Guides) - [Guides](#Guides)
- [Reading already paid chapters](#reading-already-paid-chapters) - [Reading already paid chapters](#reading-already-paid-chapters)
Don't find the question you are looking for? Go check out our general FAQs and Guides Don't find the question you are looking for? Go check out our general FAQs and Guides
over at [Extension FAQ] or [Getting Started]. over at [Extension FAQ] or [Getting Started].
@ -36,8 +36,8 @@ Follow the following steps to be able to sign in and get access to them:
#### Observations #### Observations
- Sign in with your Google account is not supported due to WebView restrictions - Sign in with your Google account is not supported due to WebView restrictions
access that Google have. You need to have a simple account in order to be able access that Google have. **You need to have a simple account in order to be able
to login via WebView. to login via WebView**.
- You may sometime face the *"Failed to refresh the token"* error. To fix it, - You may sometime face the *"Failed to refresh the token"* error. To fix it,
you just need to open the WebView, await for the website to completely load. you just need to open the WebView, await for the website to completely load.
After that, you can close the WebView and try again. After that, you can close the WebView and try again.

View File

@ -1,16 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlinx-serialization'
ext {
extName = 'BILIBILI'
pkgNameSuffix = 'all.bilibili'
extClass = '.BilibiliFactory'
extVersionCode = 7
}
dependencies {
implementation project(':lib-ratelimit')
}
apply from: "$rootDir/common.gradle"

View File

@ -1,134 +0,0 @@
package eu.kanade.tachiyomi.extension.all.bilibili
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceFactory
class BilibiliFactory : SourceFactory {
override fun createSources(): List<Source> = listOf(
BilibiliComicsEn(),
BilibiliComicsCn(),
BilibiliComicsId(),
BilibiliManga()
)
}
class BilibiliComicsEn : BilibiliComics("en") {
override fun getAllGenres(): Array<BilibiliTag> = arrayOf(
BilibiliTag("All", -1),
BilibiliTag("Action", 19),
BilibiliTag("Adventure", 22),
BilibiliTag("BL", 3),
BilibiliTag("Comedy", 14),
BilibiliTag("Eastern", 30),
BilibiliTag("Fantasy", 11),
BilibiliTag("GL", 16),
BilibiliTag("Harem", 15),
BilibiliTag("Historical", 12),
BilibiliTag("Horror", 23),
BilibiliTag("Mistery", 17),
BilibiliTag("Romance", 13),
BilibiliTag("Slice of Life", 21),
BilibiliTag("Suspense", 41),
BilibiliTag("Teen", 20)
)
}
class BilibiliComicsCn : BilibiliComics("zh-Hans") {
override fun getAllSortOptions(): Array<String> = arrayOf("为你推荐", "人气推荐", "更新时间")
override fun getAllStatus(): Array<String> = arrayOf("全部", "连载中", "已完结")
override fun getAllPrices(): Array<String> = arrayOf("全部", "免费", "付费")
override fun getAllGenres(): Array<BilibiliTag> = arrayOf(
BilibiliTag("全部", -1),
BilibiliTag("校园", 18),
BilibiliTag("都市", 9),
BilibiliTag("耽美", 3),
BilibiliTag("少女", 20),
BilibiliTag("恋爱", 13),
BilibiliTag("奇幻", 11),
BilibiliTag("热血", 19),
BilibiliTag("冒险", 22),
BilibiliTag("古风", 12),
BilibiliTag("百合", 16),
BilibiliTag("玄幻", 30),
BilibiliTag("悬疑", 41),
BilibiliTag("科幻", 8)
)
}
class BilibiliComicsId : BilibiliComics("id") {
override fun getAllSortOptions(): Array<String> = arrayOf("Kamu Mungkin Suka", "Populer", "Terbaru")
override fun getAllStatus(): Array<String> = arrayOf("Semua", "Berlangsung", "Tamat")
override fun getAllPrices(): Array<String> = arrayOf("Semua", "Bebas", "Dibayar")
override fun getAllGenres(): Array<BilibiliTag> = arrayOf(
BilibiliTag("Semua", -1),
BilibiliTag("Aksi", 19),
BilibiliTag("Fantasi Timur", 30),
BilibiliTag("Fantasi", 11),
BilibiliTag("Historis", 12),
BilibiliTag("Horror", 23),
BilibiliTag("Kampus", 18),
BilibiliTag("Komedi", 14),
BilibiliTag("Menegangkan", 41),
BilibiliTag("Remaja", 20),
BilibiliTag("Romantis", 13)
)
}
class BilibiliManga : Bilibili(
"哔哩哔哩漫画",
"https://manga.bilibili.com",
"zh-Hans"
) {
override val id: Long = 3561131545129718586
override val defaultPopularSort: Int = 0
override val defaultLatestSort: Int = 1
override fun getAllStatus(): Array<String> = arrayOf("全部", "连载", "完结")
override fun getAllSortOptions(): Array<String> = arrayOf("人气推荐", "更新时间", "追漫人数", "上架时间")
override fun getAllPrices(): Array<String> = arrayOf("全部", "免费", "付费", "等就免费")
override fun getAllGenres(): Array<BilibiliTag> = arrayOf(
BilibiliTag("全部", -1),
BilibiliTag("竞技", 1034),
BilibiliTag("冒险", 1013),
BilibiliTag("热血", 999),
BilibiliTag("搞笑", 994),
BilibiliTag("恋爱", 995),
BilibiliTag("少女", 1026),
BilibiliTag("日常", 1020),
BilibiliTag("校园", 1001),
BilibiliTag("治愈", 1007),
BilibiliTag("古风", 997),
BilibiliTag("玄幻", 1016),
BilibiliTag("奇幻", 998),
BilibiliTag("惊奇", 996),
BilibiliTag("悬疑", 1023),
BilibiliTag("都市", 1002),
BilibiliTag("剧情", 1030),
BilibiliTag("总裁", 1004),
BilibiliTag("科幻", 1015),
BilibiliTag("正能量", 1028),
)
override fun getAllAreas(): Array<BilibiliTag> = arrayOf(
BilibiliTag("全部", -1),
BilibiliTag("大陆", 1),
BilibiliTag("日本", 2),
BilibiliTag("韩国", 6),
BilibiliTag("其他", 5),
)
}