Skip to content

Commit f63c415

Browse files
committed
2.0.9.1
1 parent ca9d68a commit f63c415

8 files changed

Lines changed: 62 additions & 25 deletions

File tree

app/build.gradle.kts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ android {
1717
applicationId = "com.donut.mixfile"
1818
minSdk = 26
1919
targetSdk = 36
20-
versionCode = 155
21-
versionName = "2.0.9"
20+
versionCode = 157
21+
versionName = "2.0.9.1"
2222

2323
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2424
vectorDrawables {
@@ -69,6 +69,8 @@ android {
6969

7070

7171
dependencies {
72+
// 引用 libs 目录下的所有 aar
73+
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar"))))
7274
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")
7375
implementation("com.github.InvertGeek:mixfile-core:2.0.8")
7476
implementation("androidx.compose.material:material-icons-extended:1.7.8")
2.78 MB
Binary file not shown.

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
android:dataExtractionRules="@xml/data_extraction_rules"
1818
android:fullBackupContent="@xml/backup_rules"
1919
android:icon="@mipmap/ic_launcher"
20+
android:extractNativeLibs="true"
2021
android:label="@string/app_name"
2122
android:networkSecurityConfig="@xml/network_config"
2223
android:roundIcon="@mipmap/ic_launcher"

app/src/main/java/com/donut/mixfile/activity/video/player/BottomControl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ fun BottomControl(
169169
onClick = {
170170
MixDialogBuilder(
171171
"选集",
172-
scheme = playerColorScheme
172+
colorScheme = playerColorScheme
173173
).apply {
174174
val indexMap =
175175
videos.mapIndexed { index, uri -> index to uri }
@@ -206,7 +206,7 @@ fun BottomControl(
206206
onClick = {
207207
MixDialogBuilder(
208208
"播放速度",
209-
scheme = playerColorScheme
209+
colorScheme = playerColorScheme
210210
).apply {
211211
setContent {
212212
SingleSelectItemList(

app/src/main/java/com/donut/mixfile/activity/video/player/PlayerView.kt

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.donut.mixfile.activity.video.player
33

44
import android.net.Uri
55
import android.widget.Toast
6+
import androidx.annotation.OptIn
67
import androidx.compose.foundation.background
78
import androidx.compose.foundation.gestures.detectTapGestures
89
import androidx.compose.foundation.layout.Box
@@ -26,13 +27,21 @@ import androidx.lifecycle.Lifecycle
2627
import androidx.lifecycle.LifecycleEventObserver
2728
import androidx.lifecycle.compose.LocalLifecycleOwner
2829
import androidx.media3.common.MediaItem
30+
import androidx.media3.common.PlaybackException
31+
import androidx.media3.common.Player
2932
import androidx.media3.common.Player.REPEAT_MODE_ALL
33+
import androidx.media3.common.util.UnstableApi
34+
import androidx.media3.exoplayer.DefaultRenderersFactory
3035
import androidx.media3.exoplayer.ExoPlayer
36+
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
37+
import androidx.media3.extractor.DefaultExtractorsFactory
38+
import androidx.media3.extractor.ts.DefaultTsPayloadReaderFactory
3139
import androidx.media3.ui.PlayerView
3240
import com.donut.mixfile.activity.video.VideoHistory
3341
import com.donut.mixfile.activity.video.playHistory
3442
import com.donut.mixfile.ui.theme.mainColorScheme
3543
import com.donut.mixfile.util.ForceUpdateMutable
44+
import com.donut.mixfile.util.showErrorDialog
3645
import com.donut.mixfile.util.showToast
3746
import kotlinx.coroutines.delay
3847
import java.util.Locale
@@ -56,6 +65,7 @@ val playerColorScheme
5665
onSecondaryContainer = mainColorScheme.primary.copy(0.8f)
5766
)
5867

68+
@OptIn(UnstableApi::class)
5969
@Composable
6070
fun VideoPlayerScreen(
6171
videoUris: List<Uri>,
@@ -64,21 +74,42 @@ fun VideoPlayerScreen(
6474
) {
6575
val context = LocalContext.current
6676
val player = remember {
67-
ExoPlayer.Builder(context).build().apply {
68-
setMediaItems(videoUris.map { MediaItem.fromUri(it) })
69-
repeatMode = REPEAT_MODE_ALL
70-
val cached = playHistory.firstOrNull { it.hash.contentEquals(hash) }
71-
if (cached != null) {
72-
setMediaItems(
73-
videoUris.map { MediaItem.fromUri(it) },
74-
cached.episode,
75-
(cached.time - 2000L).coerceAtLeast(0)
76-
)
77-
showToast("已跳转到上次播放位置", length = Toast.LENGTH_SHORT)
78-
}
79-
prepare()
80-
playWhenReady = true
77+
// 1. 创建渲染器工厂
78+
val renderersFactory = DefaultRenderersFactory(context).apply {
79+
setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER)
80+
81+
}
82+
83+
84+
val extractorsFactory = DefaultExtractorsFactory().apply {
85+
// 开启对所有可能的容器支持
86+
setConstantBitrateSeekingEnabled(true) // 允许对没有索引的流进行粗略进度拖动
87+
setTsExtractorFlags(DefaultTsPayloadReaderFactory.FLAG_ENABLE_HDMV_DTS_AUDIO_STREAMS)
8188
}
89+
90+
ExoPlayer.Builder(context, renderersFactory)
91+
.setMediaSourceFactory(DefaultMediaSourceFactory(context, extractorsFactory))
92+
.build()
93+
.apply {
94+
addListener(object : Player.Listener {
95+
override fun onPlayerError(error: PlaybackException) {
96+
showErrorDialog(error, "播放出错", playerColorScheme)
97+
}
98+
})
99+
setMediaItems(videoUris.map { MediaItem.fromUri(it) })
100+
repeatMode = REPEAT_MODE_ALL
101+
val cached = playHistory.firstOrNull { it.hash.contentEquals(hash) }
102+
if (cached != null) {
103+
setMediaItems(
104+
videoUris.map { MediaItem.fromUri(it) },
105+
cached.episode,
106+
(cached.time - 2000L).coerceAtLeast(0)
107+
)
108+
showToast("已跳转到上次播放位置", length = Toast.LENGTH_SHORT)
109+
}
110+
prepare()
111+
playWhenReady = true
112+
}
82113
}
83114

84115
var currentMediaItem by remember { mutableIntStateOf(player.currentMediaItemIndex) }

app/src/main/java/com/donut/mixfile/server/CustomUploader.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ var CUSTOM_UPLOAD_URL by cachedMutableOf("", "CUSTOM_UPLOAD_URL")
2020
var CUSTOM_REFERER by cachedMutableOf("", "CUSTOM_REFERER")
2121

2222

23-
val UPLOADERS = listOf(A1Uploader, A2Uploader, A3Uploader, CustomUploader, JavaScriptUploader)
23+
val UPLOADERS = listOf(CustomUploader, JavaScriptUploader)
2424

25-
val DEFAULT_UPLOADER = A2Uploader
25+
val DEFAULT_UPLOADER = JavaScriptUploader
2626

2727
var currentUploader by cachedMutableOf(DEFAULT_UPLOADER.name, "current_uploader")
2828

app/src/main/java/com/donut/mixfile/ui/component/common/MixDialog.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class MixDialogBuilder(
3434
private val iconContentColor: Color? = null,
3535
private val titleContentColor: Color? = null,
3636
private val textContentColor: Color? = null,
37-
private val scheme: ColorScheme? = null,
37+
private val colorScheme: ColorScheme? = null,
3838
) {
3939
private var content = @Composable {}
4040
private var positiveButton = @Composable {}
@@ -114,7 +114,7 @@ class MixDialogBuilder(
114114
iconContentColor,
115115
titleContentColor,
116116
textContentColor,
117-
scheme
117+
colorScheme
118118
)
119119
dialogCache[tag]?.invoke()
120120
dialogCache[tag] = close

app/src/main/java/com/donut/mixfile/util/ComposeUtil.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,12 @@ fun showConfirmDialog(title: String, subtitle: String = "", onConfirm: () -> Uni
224224

225225
}
226226

227-
fun showErrorDialog(e: Throwable, title: String = "发生错误") {
228-
MixDialogBuilder(title).apply {
227+
fun showErrorDialog(
228+
e: Throwable,
229+
title: String = "发生错误",
230+
colorScheme: ColorScheme = mainColorScheme
231+
) {
232+
MixDialogBuilder(title, colorScheme = colorScheme).apply {
229233
setContent {
230234
Column(
231235
modifier = Modifier
@@ -249,4 +253,3 @@ fun showErrorDialog(e: Throwable, title: String = "发生错误") {
249253
show()
250254
}
251255
}
252-

0 commit comments

Comments
 (0)