Skip to content

Commit 708fab0

Browse files
committed
[release] 5.5.0
1 parent 35c7149 commit 708fab0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1997
-189
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ dependencies {
267267

268268
implementation(libs.uni.file)
269269

270-
implementation(platform("com.google.firebase:firebase-bom:33.1.2"))
270+
implementation(platform("com.google.firebase:firebase-bom:34.1.0"))
271271
implementation("com.google.firebase:firebase-crashlytics-ktx")
272272
implementation("com.google.firebase:firebase-analytics-ktx")
273273

app/src/main/assets/update_log.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
- 2025/08/16 5.5.0
2+
修复 历史记录丢失问题
3+
新增 番源引擎 2.0,支持添加仓库后直接更新番源。
4+
新增 本地番源在主页展示功能,默认关闭,可在本地番源设置中开启。
5+
优化 本地下载页面默认展示本地番源
6+
7+
18
- 2025/08/03 5.4.9 紧急更新
29
修复 历史记录丢失问题
310
修复 添加 js 源时崩溃问题

app/src/main/java/com/heyanle/easybangumi4/App.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import android.content.Context
66
import android.os.Build
77
import android.os.Looper
88
import android.os.Process
9+
import com.google.firebase.initialize
10+
import com.google.firebase.ktx.Firebase
11+
import com.google.firebase.ktx.initialize
912
import com.heyanle.easybangumi4.setting.SettingMMKVPreferences
1013
import com.heyanle.inject.core.Inject
1114

@@ -61,6 +64,7 @@ class App : Application() {
6164
super.onCreate()
6265
APP = this
6366
if (isMainProcess()) {
67+
Firebase.initialize(this)
6468
Scheduler.runOnAppCreate(this)
6569
}
6670

app/src/main/java/com/heyanle/easybangumi4/Migrate.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.heyanle.easybangumi4
33
import android.content.Context
44
import androidx.room.migration.Migration
55
import androidx.sqlite.db.SupportSQLiteDatabase
6+
import com.heyanle.easybangumi4.base.json.JsonFileProvider
67
import com.heyanle.easybangumi4.base.preferences.android.AndroidPreferenceStore
78
import com.heyanle.easybangumi4.base.preferences.hekv.HeKVPreferenceStore
89
import com.heyanle.easybangumi4.base.preferences.mmkv.MMKVPreferenceStore
@@ -19,7 +20,9 @@ import com.heyanle.easybangumi4.cartoon.old.repository.db.CacheDatabase
1920
import com.heyanle.easybangumi4.cartoon.repository.db.CartoonDatabase
2021
import com.heyanle.easybangumi4.cartoon.star.CartoonStarController
2122
import com.heyanle.easybangumi4.plugin.extension.ExtensionInfo
23+
import com.heyanle.easybangumi4.plugin.extension.loader.ExtensionLoaderFactory
2224
import com.heyanle.easybangumi4.plugin.extension.provider.JsExtensionProvider
25+
import com.heyanle.easybangumi4.plugin.extension.provider.JsExtensionProviderV2
2326
import com.heyanle.easybangumi4.plugin.js.extension.JSExtensionCryLoader
2427
import com.heyanle.easybangumi4.plugin.js.extension.JSExtensionLoader
2528
import com.heyanle.easybangumi4.plugin.js.runtime.JSRuntimeProvider
@@ -422,8 +425,43 @@ object Migrate {
422425
jsRuntimeProvider.release()
423426
}
424427

428+
429+
if (lastVersionCode < 101) {
430+
val extensionJSPath = context.getFilePath("extension-js")
431+
val extensionJsV2Path = context.getFilePath("extension_v2")
432+
val folder = File(extensionJSPath)
433+
val extension = arrayListOf<Pair<String, File>>()
434+
435+
val list = folder.listFiles()?.filter {
436+
it.isFile && it.name.endsWith(JsExtensionProviderV2.EXTENSION_SUFFIX) || it.name.endsWith(JsExtensionProviderV2.EXTENSION_CRY_SUFFIX)
437+
} ?: emptyList()
438+
val jsRuntimeProvider = JSRuntimeProvider(1)
439+
val loaders = ExtensionLoaderFactory.getFileJsExtensionLoaders(list, jsRuntimeProvider)
440+
val res = loaders.mapNotNull {
441+
it.load()?.let {
442+
it.key to it.sourcePath
443+
}
444+
}
445+
val indexItem = arrayListOf<JsExtensionProviderV2.IndexItem>()
446+
res.forEach {
447+
val targetFile = File(extensionJSPath, "${it.first}.${if (it.second.endsWith(JsExtensionProviderV2.EXTENSION_CRY_SUFFIX)) JsExtensionProviderV2.EXTENSION_CRY_SUFFIX else JsExtensionProviderV2.EXTENSION_SUFFIX}")
448+
val realTarget = File(it.second).copyTo(targetFile, true)
449+
indexItem.add(
450+
JsExtensionProviderV2.IndexItem(
451+
key = it.first,
452+
fileName = realTarget.name,
453+
)
454+
)
455+
}
456+
Inject.get<JsonFileProvider>().extensionIndex.update {
457+
indexItem
458+
}
459+
460+
461+
}
425462
// 在这里添加新的迁移代码
426463

464+
427465
androidPreferenceStore.getInt("last_version_code", 0).set(curVersionCode)
428466
_isMigrating.update {
429467
false

app/src/main/java/com/heyanle/easybangumi4/Router.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import com.heyanle.easybangumi4.ui.cartoon_play.CartoonPlay
3232
import com.heyanle.easybangumi4.ui.cartoon_play.view_model.CartoonPlayViewModel
3333
import com.heyanle.easybangumi4.ui.dlna.Dlna
3434
import com.heyanle.easybangumi4.ui.extension_push.ExtensionPush
35+
import com.heyanle.easybangumi4.ui.extension_push.ExtensionPushV2
3536
import com.heyanle.easybangumi4.ui.story.download.Download
3637
import com.heyanle.easybangumi4.ui.main.Main
3738
import com.heyanle.easybangumi4.ui.main.history.History
@@ -95,6 +96,8 @@ const val STORY = "story"
9596

9697
const val EXTENSION_PUSH = "extension_push"
9798

99+
const val EXTENSION_PUSH_V2 = "extension_push_v2"
100+
98101
fun NavHostController.navigationSearch(
99102
defSourceKey: String,
100103
) {
@@ -391,6 +394,12 @@ fun Nav() {
391394
//ExtensionPush()
392395
}
393396

397+
composable(EXTENSION_PUSH_V2) {
398+
ScreenShowEvent()
399+
NormalSystemBarColor()
400+
ExtensionPushV2()
401+
}
402+
394403
composable(
395404
"${SOURCE_MANAGER}?defIndex={defIndex}",
396405
arguments = listOf(

app/src/main/java/com/heyanle/easybangumi4/Scheduler.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.heyanle.easybangumi4.case.CaseModule
99
import com.heyanle.easybangumi4.crash.SourceCrashController
1010
import com.heyanle.easybangumi4.dlna.DlnaModule
1111
import com.heyanle.easybangumi4.plugin.extension.ExtensionModule
12+
import com.heyanle.easybangumi4.plugin.extension.IExtensionController
1213
import com.heyanle.easybangumi4.setting.SettingModule
1314
import com.heyanle.easybangumi4.plugin.source.SourceModule
1415
import com.heyanle.easybangumi4.plugin.source.utils.NativeHelperImpl
@@ -101,7 +102,7 @@ object Scheduler {
101102
*/
102103
fun runOnMainActivityCreate(activity: MainActivity, isFirst: Boolean) {
103104
Migrate.update(activity)
104-
val extensionController: com.heyanle.easybangumi4.plugin.extension.ExtensionController by Inject.injectLazy()
105+
val extensionController: IExtensionController by Inject.injectLazy()
105106
val extensionIconFactory: IconFactory by Inject.injectLazy()
106107
iconFactory = extensionIconFactory
107108
extensionController.init()

app/src/main/java/com/heyanle/easybangumi4/base/json/JsonFileProvider.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.heyanle.easybangumi4.APP
55
import com.heyanle.easybangumi4.cartoon.entity.CartoonDownloadReq
66
import com.heyanle.easybangumi4.cartoon.entity.CartoonTag
77
import com.heyanle.easybangumi4.plugin.extension.provider.JsExtensionProviderV2
8+
import com.heyanle.easybangumi4.plugin.extension.remote.ExtensionRemoteController
89
import com.heyanle.easybangumi4.plugin.source.SourceConfig
910
import com.heyanle.easybangumi4.utils.CoroutineProvider
1011
import com.heyanle.easybangumi4.utils.getFilePath
@@ -60,11 +61,11 @@ class JsonFileProvider {
6061
)
6162

6263
// /storage/emulated/0/Android/data/com.heyanle.easybangumi4/files/extension_v2/repository.jsonl
63-
val extensionRepository: JsonlFileHelper<String> = JsonlFileHelper(
64+
val extensionRepository: JsonlFileHelper<ExtensionRemoteController.Repository> = JsonlFileHelper(
6465
folder = UniFile.fromFile(File(APP.getFilePath("extension_v2")))!!,
6566
name = "repository.jsonl",
6667
scope = scope,
67-
type = typeOf<String>().javaType
68+
type = typeOf<ExtensionRemoteController.Repository>().javaType
6869
)
6970

7071
}

app/src/main/java/com/heyanle/easybangumi4/base/json/JsonlFileHelper.kt

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.heyanle.easybangumi4.base.json
22

33
import com.heyanle.easybangumi4.base.DataResult
44
import com.heyanle.easybangumi4.utils.jsonTo
5+
import com.heyanle.easybangumi4.utils.logi
56
import com.heyanle.easybangumi4.utils.toJson
67
import com.hippo.unifile.UniFile
78
import kotlinx.coroutines.CoroutineScope
@@ -31,6 +32,10 @@ class JsonlFileHelper <T : Any>(
3132
val type: Type,
3233
) {
3334

35+
companion object {
36+
private const val TAG = "JsonlFileHelper"
37+
}
38+
3439

3540
private val _flow = MutableStateFlow<DataResult<List<T>>>(DataResult.Loading())
3641
val flow = _flow.asStateFlow()
@@ -48,21 +53,10 @@ class JsonlFileHelper <T : Any>(
4853
return@launch
4954
}
5055
var data = jsonFile.openInputStream().use {
51-
it.bufferedReader().lineSequence()
52-
}.map {
53-
it.jsonTo<T>(type)
54-
}.filterNotNull().toList()
55-
// if (data == null){
56-
// val tempFile = folder.findFile(tempFileName)
57-
// data = if (tempFile != null && tempFile.canRead()){
58-
// val tempString = tempFile.openInputStream().use {
59-
// it.bufferedReader().readText()
60-
// }
61-
// tempString.jsonTo<T>(type) ?: def
62-
// } else {
63-
// def
64-
// }
65-
// }
56+
it.bufferedReader().lineSequence().map {
57+
it.jsonTo<T>(type)
58+
}.filterNotNull().toList()
59+
}
6660
_flow.update {
6761
DataResult.ok(data)
6862
}
@@ -131,7 +125,9 @@ class JsonlFileHelper <T : Any>(
131125
block:(List<T>) -> List<T>
132126
){
133127
val data = getOrDef()
134-
set( block(data))
128+
set( block(data).apply {
129+
"$data -> $this".logi(TAG)
130+
})
135131
}
136132

137133

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.heyanle.easybangumi4.cartoon.story.local.source
2+
3+
import com.heyanle.easybangumi4.base.DataResult
4+
import com.heyanle.easybangumi4.cartoon.story.CartoonStoryController
5+
import com.heyanle.easybangumi4.plugin.source.SourceException
6+
import com.heyanle.easybangumi4.source_api.SourceResult
7+
import com.heyanle.easybangumi4.source_api.component.ComponentWrapper
8+
import com.heyanle.easybangumi4.source_api.component.detailed.DetailedComponent
9+
import com.heyanle.easybangumi4.source_api.component.page.PageComponent
10+
import com.heyanle.easybangumi4.source_api.component.page.SourcePage
11+
import com.heyanle.easybangumi4.source_api.component.play.PlayComponent
12+
import com.heyanle.easybangumi4.source_api.entity.CartoonCover
13+
import com.heyanle.inject.core.Inject
14+
import kotlinx.coroutines.flow.firstOrNull
15+
import kotlin.getValue
16+
17+
/**
18+
* Created by heyanle on 2025/8/16
19+
* https://github.com/heyanLE
20+
*/
21+
class LocalPageComponent: ComponentWrapper(), PageComponent {
22+
23+
val cartoonStoryController: CartoonStoryController by Inject.injectLazy()
24+
25+
override fun getPages(): List<SourcePage> {
26+
return PageComponent.NonLabelSinglePage(
27+
SourcePage.SingleCartoonPage.WithCover(
28+
label = "",
29+
firstKey = {1},
30+
load = {
31+
val result = cartoonStoryController.storyItemList.firstOrNull { it !is DataResult.Loading }
32+
if (result is DataResult.Ok) {
33+
return@WithCover SourceResult.Complete(null to result.data.map {
34+
it.cartoonLocalItem.cartoonCover
35+
})
36+
37+
} else if (result is DataResult.Error) {
38+
return@WithCover SourceResult.Error<Pair<Int?, List<CartoonCover>>>(result.throwable ?: SourceException(result.errorMsg))
39+
} else {
40+
throw IllegalStateException("unexpected result type: $result")
41+
}
42+
43+
}
44+
)
45+
)
46+
}
47+
}

app/src/main/java/com/heyanle/easybangumi4/cartoon/story/local/source/LocalSource.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import android.graphics.drawable.Drawable
44
import androidx.core.content.res.ResourcesCompat
55
import com.heyanle.easybangumi4.APP
66
import com.heyanle.easybangumi4.R
7+
import com.heyanle.easybangumi4.setting.SettingMMKVPreferences
78
import com.heyanle.easybangumi4.utils.stringRes
89
import com.heyanle.extension_api.ExtensionIconSource
10+
import com.heyanle.inject.core.Inject
911
import kotlin.reflect.KClass
1012

1113
/**
@@ -35,9 +37,13 @@ object LocalSource: ExtensionIconSource {
3537
get() = 0
3638

3739
override fun register(): List<KClass<*>> {
38-
return listOf(
39-
LocalSourceComponent::class
40-
)
40+
val mmkv: SettingMMKVPreferences by Inject.injectLazy()
41+
val res = arrayListOf<KClass<*>>()
42+
res.add(LocalSourceComponent::class)
43+
if (mmkv.localExtensionTemp) {
44+
res.add(LocalPageComponent::class)
45+
}
46+
return res
4147
}
4248

4349

0 commit comments

Comments
 (0)