@roitium/expo-orpheus 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +4 -2
- package/android/src/main/java/expo/modules/orpheus/ExpoOrpheusModule.kt +8 -0
- package/android/src/main/java/expo/modules/orpheus/OrpheusMusicService.kt +3 -1
- package/android/src/main/java/expo/modules/orpheus/utils/GeneralStorage.kt +14 -4
- package/android/src/main/java/expo/modules/orpheus/utils/GlideBitmapLoader.kt +58 -0
- package/build/ExpoOrpheusModule.d.ts +2 -0
- package/build/ExpoOrpheusModule.d.ts.map +1 -1
- package/build/ExpoOrpheusModule.js.map +1 -1
- package/package.json +1 -1
- package/src/ExpoOrpheusModule.ts +2 -0
package/android/build.gradle
CHANGED
|
@@ -43,10 +43,12 @@ android {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
dependencies {
|
|
46
|
-
implementation "androidx.media3:media3-exoplayer:1.
|
|
47
|
-
implementation "androidx.media3:media3-session:1.
|
|
46
|
+
implementation "androidx.media3:media3-exoplayer:1.9.0"
|
|
47
|
+
implementation "androidx.media3:media3-session:1.9.0"
|
|
48
|
+
implementation("androidx.media3:media3-exoplayer-dash:1.9.0")
|
|
48
49
|
implementation "com.squareup.retrofit2:retrofit:2.9.0"
|
|
49
50
|
implementation "com.google.code.gson:gson:2.13.2"
|
|
50
51
|
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
|
|
51
52
|
implementation 'com.tencent:mmkv:2.3.0'
|
|
53
|
+
implementation "com.github.bumptech.glide:glide:5.0.5"
|
|
52
54
|
}
|
|
@@ -226,6 +226,14 @@ class ExpoOrpheusModule : Module() {
|
|
|
226
226
|
GeneralStorage.isLoudnessNormalizationEnabled()
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
+
Constant("autoplayOnStartEnabled") {
|
|
230
|
+
GeneralStorage.isAutoplayOnStartEnabled()
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
Function("setAutoplayOnStartEnabled") { enabled: Boolean ->
|
|
234
|
+
GeneralStorage.setAutoplayOnStartEnabled(enabled)
|
|
235
|
+
}
|
|
236
|
+
|
|
229
237
|
Function("setBilibiliCookie") { cookie: String ->
|
|
230
238
|
OrpheusConfig.bilibiliCookie = cookie
|
|
231
239
|
}
|
|
@@ -19,6 +19,7 @@ import com.google.common.util.concurrent.ListenableFuture
|
|
|
19
19
|
import expo.modules.orpheus.utils.DownloadUtil
|
|
20
20
|
import expo.modules.orpheus.utils.SleepTimeController
|
|
21
21
|
import expo.modules.orpheus.utils.GeneralStorage
|
|
22
|
+
import expo.modules.orpheus.utils.GlideBitmapLoader
|
|
22
23
|
import expo.modules.orpheus.utils.LoudnessStorage
|
|
23
24
|
import expo.modules.orpheus.utils.calculateLoudnessGain
|
|
24
25
|
import expo.modules.orpheus.utils.fadeInTo
|
|
@@ -111,6 +112,7 @@ class OrpheusMusicService : MediaLibraryService() {
|
|
|
111
112
|
mediaSession = MediaLibrarySession.Builder(this, player!!, callback)
|
|
112
113
|
.setId("OrpheusSession")
|
|
113
114
|
.setSessionActivity(contentIntent)
|
|
115
|
+
.setBitmapLoader(GlideBitmapLoader(this))
|
|
114
116
|
.build()
|
|
115
117
|
|
|
116
118
|
restorePlayerState(GeneralStorage.isRestoreEnabled())
|
|
@@ -198,7 +200,7 @@ class OrpheusMusicService : MediaLibraryService() {
|
|
|
198
200
|
player.shuffleModeEnabled = savedShuffleMode
|
|
199
201
|
player.repeatMode = savedRepeatMode
|
|
200
202
|
|
|
201
|
-
player.playWhenReady =
|
|
203
|
+
player.playWhenReady = GeneralStorage.isAutoplayOnStartEnabled()
|
|
202
204
|
player.prepare()
|
|
203
205
|
}
|
|
204
206
|
}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
package expo.modules.orpheus.utils
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
|
+
import android.util.Log
|
|
4
5
|
import androidx.annotation.OptIn
|
|
5
6
|
import androidx.media3.common.MediaItem
|
|
6
|
-
import androidx.media3.common.util.Log
|
|
7
|
-
import androidx.media3.common.util.UnstableApi
|
|
8
7
|
import com.google.gson.Gson
|
|
9
8
|
import com.google.gson.reflect.TypeToken
|
|
10
9
|
import com.tencent.mmkv.MMKV
|
|
11
10
|
import expo.modules.orpheus.models.TrackRecord
|
|
12
11
|
|
|
13
|
-
@OptIn(UnstableApi::class)
|
|
14
12
|
object GeneralStorage {
|
|
15
13
|
private var kv: MMKV? = null
|
|
16
14
|
private val gson = Gson()
|
|
@@ -22,6 +20,7 @@ object GeneralStorage {
|
|
|
22
20
|
private const val KEY_SAVED_POSITION = "saved_position"
|
|
23
21
|
private const val KEY_SAVED_REPEAT_MODE = "saved_repeat_mode"
|
|
24
22
|
private const val KEY_SAVED_SHUFFLE_MODE = "saved_shuffle_mode"
|
|
23
|
+
private const val KEY_AUTOPLAY_ON_START_ENABLED = "config_autoplay_on_start_enabled"
|
|
25
24
|
|
|
26
25
|
|
|
27
26
|
@Synchronized
|
|
@@ -59,7 +58,18 @@ object GeneralStorage {
|
|
|
59
58
|
return safeKv.decodeBool(KEY_LOUDNESS_NORMALIZATION_ENABLED, true)
|
|
60
59
|
}
|
|
61
60
|
|
|
62
|
-
|
|
61
|
+
fun isAutoplayOnStartEnabled(): Boolean {
|
|
62
|
+
return safeKv.decodeBool(KEY_AUTOPLAY_ON_START_ENABLED, false)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
fun setAutoplayOnStartEnabled(enabled: Boolean) {
|
|
66
|
+
try {
|
|
67
|
+
safeKv.encode(KEY_AUTOPLAY_ON_START_ENABLED, enabled)
|
|
68
|
+
} catch (e: Exception) {
|
|
69
|
+
Log.e("MediaItemStorer", "Failed to set autoplay on start enabled", e)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
63
73
|
fun saveQueue(mediaItems: List<MediaItem>) {
|
|
64
74
|
try {
|
|
65
75
|
val jsonList = mediaItems.mapNotNull { item ->
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
package expo.modules.orpheus.utils
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.Bitmap
|
|
5
|
+
import android.net.Uri
|
|
6
|
+
import android.util.Log
|
|
7
|
+
import androidx.media3.common.MediaMetadata
|
|
8
|
+
import androidx.media3.common.util.BitmapLoader
|
|
9
|
+
import com.bumptech.glide.Glide
|
|
10
|
+
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
|
11
|
+
import com.google.common.util.concurrent.ListenableFuture
|
|
12
|
+
import com.google.common.util.concurrent.ListeningExecutorService
|
|
13
|
+
import com.google.common.util.concurrent.MoreExecutors
|
|
14
|
+
import java.util.concurrent.Executors
|
|
15
|
+
|
|
16
|
+
@androidx.media3.common.util.UnstableApi
|
|
17
|
+
class GlideBitmapLoader(private val context: Context) : BitmapLoader {
|
|
18
|
+
private val executorService: ListeningExecutorService =
|
|
19
|
+
MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor())
|
|
20
|
+
|
|
21
|
+
override fun loadBitmapFromMetadata(metadata: MediaMetadata): ListenableFuture<Bitmap> {
|
|
22
|
+
val uri = metadata.artworkUri ?:
|
|
23
|
+
return executorService.submit<Bitmap> {
|
|
24
|
+
throw IllegalArgumentException("Metadata artworkUri is null")
|
|
25
|
+
}
|
|
26
|
+
return loadBitmap(uri)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
override fun supportsMimeType(mimeType: String): Boolean {
|
|
30
|
+
return true
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
override fun decodeBitmap(data: ByteArray): ListenableFuture<Bitmap> {
|
|
34
|
+
return executorService.submit<Bitmap> {
|
|
35
|
+
throw UnsupportedOperationException("Not implemented for raw bytes")
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
override fun loadBitmap(uri: Uri): ListenableFuture<Bitmap> {
|
|
40
|
+
return executorService.submit<Bitmap> {
|
|
41
|
+
Log.d("GlideBitmapLoader", "load image $uri")
|
|
42
|
+
val glideBitmap = Glide.with(context)
|
|
43
|
+
.asBitmap()
|
|
44
|
+
.load(uri)
|
|
45
|
+
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
46
|
+
.submit(512, 512)
|
|
47
|
+
.get()
|
|
48
|
+
|
|
49
|
+
if (glideBitmap != null && !glideBitmap.isRecycled) {
|
|
50
|
+
val safeBitmap = glideBitmap.copy(Bitmap.Config.ARGB_8888, false)
|
|
51
|
+
|
|
52
|
+
return@submit safeBitmap
|
|
53
|
+
} else {
|
|
54
|
+
throw IllegalStateException("Bitmap load failed or recycled")
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -58,6 +58,7 @@ export type OrpheusEvents = {
|
|
|
58
58
|
declare class OrpheusModule extends NativeModule<OrpheusEvents> {
|
|
59
59
|
restorePlaybackPositionEnabled: boolean;
|
|
60
60
|
loudnessNormalizationEnabled: boolean;
|
|
61
|
+
autoplayOnStartEnabled: boolean;
|
|
61
62
|
/**
|
|
62
63
|
* 获取当前进度(秒)
|
|
63
64
|
*/
|
|
@@ -94,6 +95,7 @@ declare class OrpheusModule extends NativeModule<OrpheusEvents> {
|
|
|
94
95
|
setBilibiliCookie(cookie: string): void;
|
|
95
96
|
setRestorePlaybackPositionEnabled(enabled: boolean): void;
|
|
96
97
|
setLoudnessNormalizationEnabled(enabled: boolean): void;
|
|
98
|
+
setAutoplayOnStartEnabled(enabled: boolean): void;
|
|
97
99
|
play(): Promise<void>;
|
|
98
100
|
pause(): Promise<void>;
|
|
99
101
|
clear(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoOrpheusModule.d.ts","sourceRoot":"","sources":["../src/ExpoOrpheusModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtE,oBAAY,aAAa;IACvB,IAAI,IAAI;IACR,SAAS,IAAI;IACb,KAAK,IAAI;IACT,KAAK,IAAI;CACV;AAED,oBAAY,UAAU;IACpB,GAAG,IAAI;IACP,KAAK,IAAI;IACT,KAAK,IAAI;CACV;AAED,oBAAY,gBAAgB;IAC1B,MAAM,IAAI;IACV,IAAI,IAAI;IACR,IAAI,IAAI;IACR,gBAAgB,IAAI;CACrB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QACT,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAA;CACF;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,sBAAsB,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,aAAa,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,cAAc,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3E,eAAe,CAAC,KAAK,EAAE;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI,CAAC;IACT,aAAa,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,gBAAgB,CAAC,KAAK,EAAE;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI,CAAC;IACT,kBAAkB,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACrD,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC9C,CAAC;AAEF,OAAO,OAAO,aAAc,SAAQ,YAAY,CAAC,aAAa,CAAC;IAE7D,8BAA8B,EAAE,OAAO,CAAC;IACxC,4BAA4B,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ExpoOrpheusModule.d.ts","sourceRoot":"","sources":["../src/ExpoOrpheusModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoOrpheusModule.js","sourceRoot":"","sources":["../src/ExpoOrpheusModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAgB,MAAM,mBAAmB,CAAC;AAEtE,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,iDAAQ,CAAA;IACR,2DAAa,CAAA;IACb,mDAAS,CAAA;IACT,mDAAS,CAAA;AACX,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAED,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,yCAAO,CAAA;IACP,6CAAS,CAAA;IACT,6CAAS,CAAA;AACX,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAED,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,2DAAU,CAAA;IACV,uDAAQ,CAAA;IACR,uDAAQ,CAAA;IACR,+EAAoB,CAAA;AACtB,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B;
|
|
1
|
+
{"version":3,"file":"ExpoOrpheusModule.js","sourceRoot":"","sources":["../src/ExpoOrpheusModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAgB,MAAM,mBAAmB,CAAC;AAEtE,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,iDAAQ,CAAA;IACR,2DAAa,CAAA;IACb,mDAAS,CAAA;IACT,mDAAS,CAAA;AACX,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAED,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,yCAAO,CAAA;IACP,6CAAS,CAAA;IACT,6CAAS,CAAA;AACX,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAED,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,2DAAU,CAAA;IACV,uDAAQ,CAAA;IACR,uDAAQ,CAAA;IACR,+EAAoB,CAAA;AACtB,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B;AA0LD,MAAM,CAAN,IAAY,aAQX;AARD,WAAY,aAAa;IACvB,qDAAU,CAAA;IACV,uDAAW,CAAA;IACX,+DAAe,CAAA;IACf,2DAAa,CAAA;IACb,qDAAU,CAAA;IACV,yDAAY,CAAA;IACZ,6DAAc,CAAA;AAChB,CAAC,EARW,aAAa,KAAb,aAAa,QAQxB;AAWD,MAAM,CAAC,MAAM,OAAO,GAAG,mBAAmB,CAAgB,SAAS,CAAC,CAAC","sourcesContent":["import { requireNativeModule, NativeModule } from \"expo-modules-core\";\n\nexport enum PlaybackState {\n IDLE = 1,\n BUFFERING = 2,\n READY = 3,\n ENDED = 4,\n}\n\nexport enum RepeatMode {\n OFF = 0,\n TRACK = 1,\n QUEUE = 2,\n}\n\nexport enum TransitionReason {\n REPEAT = 0,\n AUTO = 1,\n SEEK = 2,\n PLAYLIST_CHANGED = 3,\n}\n\nexport interface Track {\n id: string;\n url: string;\n title?: string;\n artist?: string;\n artwork?: string;\n duration?: number;\n loudness?: {\n measured_i: number;\n target_i: number;\n }\n}\n\nexport type OrpheusEvents = {\n onPlaybackStateChanged(event: { state: PlaybackState }): void;\n onTrackStarted(event: { trackId: string; reason: TransitionReason }): void;\n onTrackFinished(event: {\n trackId: string;\n finalPosition: number;\n duration: number;\n }): void;\n onPlayerError(event: { code: string; message: string }): void;\n onPositionUpdate(event: {\n position: number;\n duration: number;\n buffered: number;\n }): void;\n onIsPlayingChanged(event: { status: boolean }): void;\n onDownloadUpdated(event: DownloadTask): void;\n};\n\ndeclare class OrpheusModule extends NativeModule<OrpheusEvents> {\n \n restorePlaybackPositionEnabled: boolean;\n loudnessNormalizationEnabled: boolean;\n autoplayOnStartEnabled: boolean;\n\n /**\n * 获取当前进度(秒)\n */\n getPosition(): Promise<number>;\n\n /**\n * 获取总时长(秒)\n */\n getDuration(): Promise<number>;\n\n /**\n * 获取缓冲进度(秒)\n */\n getBuffered(): Promise<number>;\n\n /**\n * 获取是否正在播放\n */\n getIsPlaying(): Promise<boolean>;\n\n /**\n * 获取当前播放索引\n */\n getCurrentIndex(): Promise<number>;\n\n /**\n * 获取当前播放的 Track 对象\n */\n getCurrentTrack(): Promise<Track | null>;\n\n /**\n * 获取随机模式状态\n */\n getShuffleMode(): Promise<boolean>;\n\n /**\n * 获取指定索引的 Track\n */\n getIndexTrack(index: number): Promise<Track | null>;\n\n getRepeatMode(): Promise<RepeatMode>;\n\n setBilibiliCookie(cookie: string): void;\n \n setRestorePlaybackPositionEnabled(enabled: boolean): void;\n setLoudnessNormalizationEnabled(enabled: boolean): void;\n setAutoplayOnStartEnabled(enabled: boolean): void;\n\n play(): Promise<void>;\n\n pause(): Promise<void>;\n\n clear(): Promise<void>;\n\n skipTo(index: number): Promise<void>;\n\n skipToNext(): Promise<void>;\n\n skipToPrevious(): Promise<void>;\n\n /**\n * 跳转进度\n * @param seconds 秒数\n */\n seekTo(seconds: number): Promise<void>;\n\n setRepeatMode(mode: RepeatMode): Promise<void>;\n\n setShuffleMode(enabled: boolean): Promise<void>;\n\n getQueue(): Promise<Track[]>;\n\n /**\n * 添加到队列末尾,且不去重。\n * @param tracks\n * @param startFromId 可选,添加后立即播放该 ID 的曲目\n * @param clearQueue 可选,是否清空当前队列\n */\n addToEnd(\n tracks: Track[],\n startFromId?: string,\n clearQueue?: boolean\n ): Promise<void>;\n\n /**\n * 播放下一首\n * @param track\n */\n playNext(track: Track): Promise<void>;\n\n removeTrack(index: number): Promise<void>;\n\n /**\n * 设置睡眠定时器\n * @param durationMs 单位毫秒\n */\n setSleepTimer(durationMs: number): Promise<void>;\n\n /**\n * 获取睡眠定时器结束时间\n * @returns 单位毫秒,如果没有设置则返回 null\n */\n getSleepTimerEndTime(): Promise<number | null>;\n\n cancelSleepTimer(): Promise<void>;\n\n /**\n * 下载单首歌曲\n */\n downloadTrack(track: Track): Promise<void>;\n\n /**\n * 移除下载任务\n */\n removeDownload(id: string): Promise<void>;\n\n /**\n * 批量下载歌曲\n */\n multiDownload(tracks: Track[]): Promise<void>;\n\n /**\n * 移除所有下载任务(包括已完成的及源文件)\n */\n removeAllDownloads(): Promise<void>;\n\n /**\n * 获取所有下载任务\n */\n getDownloads(): Promise<DownloadTask[]>;\n\n /**\n * 批量返回指定 ID 的下载状态\n */\n getDownloadStatusByIds(ids: string[]): Promise<Record<string, DownloadState>>;\n\n /**\n * 清除未完成的下载任务\n */\n clearUncompletedDownloadTasks(): Promise<void>;\n\n /**\n * 获取所有未完成的下载任务\n */\n getUncompletedDownloadTasks(): Promise<DownloadTask[]>;\n}\n\nexport enum DownloadState {\n QUEUED = 0,\n STOPPED = 1,\n DOWNLOADING = 2,\n COMPLETED = 3,\n FAILED = 4,\n REMOVING = 5,\n RESTARTING = 7,\n}\n\nexport interface DownloadTask {\n id: string;\n state: DownloadState;\n percentDownloaded: number;\n bytesDownloaded: number;\n contentLength: number;\n track?: Track;\n}\n\nexport const Orpheus = requireNativeModule<OrpheusModule>(\"Orpheus\");\n"]}
|
package/package.json
CHANGED
package/src/ExpoOrpheusModule.ts
CHANGED
|
@@ -55,6 +55,7 @@ declare class OrpheusModule extends NativeModule<OrpheusEvents> {
|
|
|
55
55
|
|
|
56
56
|
restorePlaybackPositionEnabled: boolean;
|
|
57
57
|
loudnessNormalizationEnabled: boolean;
|
|
58
|
+
autoplayOnStartEnabled: boolean;
|
|
58
59
|
|
|
59
60
|
/**
|
|
60
61
|
* 获取当前进度(秒)
|
|
@@ -102,6 +103,7 @@ declare class OrpheusModule extends NativeModule<OrpheusEvents> {
|
|
|
102
103
|
|
|
103
104
|
setRestorePlaybackPositionEnabled(enabled: boolean): void;
|
|
104
105
|
setLoudnessNormalizationEnabled(enabled: boolean): void;
|
|
106
|
+
setAutoplayOnStartEnabled(enabled: boolean): void;
|
|
105
107
|
|
|
106
108
|
play(): Promise<void>;
|
|
107
109
|
|