@roitium/expo-orpheus 0.9.1 → 0.9.3
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/.gradle/8.9/checksums/checksums.lock +0 -0
- package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.9/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/src/main/java/expo/modules/orpheus/CustomCommands.kt +1 -8
- package/android/src/main/java/expo/modules/orpheus/ExpoOrpheusModule.kt +20 -1
- package/android/src/main/java/expo/modules/orpheus/OrpheusMusicService.kt +104 -1
- package/android/src/main/res/drawable/outline_repeat_24.xml +10 -0
- package/android/src/main/res/drawable/outline_repeat_off_24.xml +11 -0
- package/android/src/main/res/drawable/outline_repeat_one_24.xml +10 -0
- package/build/ExpoOrpheusModule.d.ts +5 -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 +4 -0
|
Binary file
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
Binary file
|
|
File without changes
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
package expo.modules.orpheus
|
|
2
2
|
|
|
3
3
|
object CustomCommands {
|
|
4
|
-
|
|
5
|
-
const val CMD_START_TIMER = "cmd_start_sleep_timer"
|
|
6
|
-
const val CMD_CANCEL_TIMER = "cmd_cancel_sleep_timer"
|
|
7
|
-
const val CMD_GET_REMAINING = "cmd_get_sleep_timer_remaining"
|
|
8
|
-
|
|
9
|
-
const val KEY_DURATION = "key_duration"
|
|
10
|
-
const val KEY_STOP_TIME = "key_stop_time"
|
|
11
|
-
// end related to sleep timer
|
|
4
|
+
const val CMD_TOGGLE_REPEAT_MODE = "cmd_toggle_repeat_mode"
|
|
12
5
|
}
|
|
@@ -164,6 +164,14 @@ class ExpoOrpheusModule : Module() {
|
|
|
164
164
|
super.onShuffleModeEnabledChanged(shuffleModeEnabled)
|
|
165
165
|
GeneralStorage.saveShuffleMode(shuffleModeEnabled)
|
|
166
166
|
}
|
|
167
|
+
|
|
168
|
+
override fun onPlaybackParametersChanged(playbackParameters: androidx.media3.common.PlaybackParameters) {
|
|
169
|
+
sendEvent(
|
|
170
|
+
"onPlaybackSpeedChanged", mapOf(
|
|
171
|
+
"speed" to playbackParameters.speed
|
|
172
|
+
)
|
|
173
|
+
)
|
|
174
|
+
}
|
|
167
175
|
}
|
|
168
176
|
|
|
169
177
|
@OptIn(UnstableApi::class)
|
|
@@ -177,7 +185,8 @@ class ExpoOrpheusModule : Module() {
|
|
|
177
185
|
"onIsPlayingChanged",
|
|
178
186
|
"onTrackFinished",
|
|
179
187
|
"onTrackStarted",
|
|
180
|
-
"onDownloadUpdated"
|
|
188
|
+
"onDownloadUpdated",
|
|
189
|
+
"onPlaybackSpeedChanged"
|
|
181
190
|
)
|
|
182
191
|
|
|
183
192
|
OnCreate {
|
|
@@ -626,6 +635,16 @@ class ExpoOrpheusModule : Module() {
|
|
|
626
635
|
e.printStackTrace()
|
|
627
636
|
}
|
|
628
637
|
}.runOnQueue(Queues.MAIN)
|
|
638
|
+
|
|
639
|
+
AsyncFunction("setPlaybackSpeed") { speed: Float ->
|
|
640
|
+
checkPlayer()
|
|
641
|
+
player?.setPlaybackSpeed(speed)
|
|
642
|
+
}.runOnQueue(Queues.MAIN)
|
|
643
|
+
|
|
644
|
+
AsyncFunction("getPlaybackSpeed") {
|
|
645
|
+
checkPlayer()
|
|
646
|
+
player?.playbackParameters?.speed ?: 1.0f
|
|
647
|
+
}.runOnQueue(Queues.MAIN)
|
|
629
648
|
}
|
|
630
649
|
|
|
631
650
|
private fun getDownloadMap(download: Download): Map<String, Any> {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
package expo.modules.orpheus
|
|
2
2
|
|
|
3
|
-
import android.R
|
|
4
3
|
import android.app.PendingIntent
|
|
5
4
|
import android.content.Intent
|
|
5
|
+
import android.os.Bundle
|
|
6
6
|
import android.util.Log
|
|
7
7
|
import androidx.annotation.OptIn
|
|
8
8
|
import androidx.core.net.toUri
|
|
@@ -13,10 +13,16 @@ import androidx.media3.common.Timeline
|
|
|
13
13
|
import androidx.media3.common.util.UnstableApi
|
|
14
14
|
import androidx.media3.exoplayer.ExoPlayer
|
|
15
15
|
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
|
|
16
|
+
import androidx.media3.session.CommandButton
|
|
17
|
+
import androidx.media3.session.DefaultMediaNotificationProvider
|
|
16
18
|
import androidx.media3.session.MediaLibraryService
|
|
17
19
|
import androidx.media3.session.MediaSession
|
|
20
|
+
import androidx.media3.session.SessionCommand
|
|
21
|
+
import androidx.media3.session.SessionResult
|
|
22
|
+
import com.google.common.collect.ImmutableList
|
|
18
23
|
import com.google.common.util.concurrent.Futures
|
|
19
24
|
import com.google.common.util.concurrent.ListenableFuture
|
|
25
|
+
import expo.modules.orpheus.R
|
|
20
26
|
import expo.modules.orpheus.utils.DownloadUtil
|
|
21
27
|
import expo.modules.orpheus.utils.SleepTimeController
|
|
22
28
|
import expo.modules.orpheus.utils.GeneralStorage
|
|
@@ -80,6 +86,77 @@ class OrpheusMusicService : MediaLibraryService() {
|
|
|
80
86
|
GeneralStorage.initialize(this)
|
|
81
87
|
LoudnessStorage.initialize(this)
|
|
82
88
|
|
|
89
|
+
setMediaNotificationProvider(object : DefaultMediaNotificationProvider(this) {
|
|
90
|
+
override fun getMediaButtons(
|
|
91
|
+
session: MediaSession,
|
|
92
|
+
playerCommands: Player.Commands,
|
|
93
|
+
customLayout: ImmutableList<CommandButton>,
|
|
94
|
+
showPlaying: Boolean
|
|
95
|
+
): ImmutableList<CommandButton> {
|
|
96
|
+
val builder = ImmutableList.builder<CommandButton>()
|
|
97
|
+
val player = session.player
|
|
98
|
+
|
|
99
|
+
// Previous
|
|
100
|
+
builder.add(
|
|
101
|
+
CommandButton.Builder(CommandButton.ICON_UNDEFINED)
|
|
102
|
+
.setPlayerCommand(Player.COMMAND_SEEK_TO_PREVIOUS)
|
|
103
|
+
.setCustomIconResId(R.drawable.outline_skip_previous_24)
|
|
104
|
+
.setDisplayName("Previous")
|
|
105
|
+
.setEnabled(playerCommands.contains(Player.COMMAND_SEEK_TO_PREVIOUS))
|
|
106
|
+
.build()
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
// Play/Pause
|
|
110
|
+
if (showPlaying) {
|
|
111
|
+
builder.add(
|
|
112
|
+
CommandButton.Builder(CommandButton.ICON_UNDEFINED)
|
|
113
|
+
.setPlayerCommand(Player.COMMAND_PLAY_PAUSE)
|
|
114
|
+
.setCustomIconResId(R.drawable.outline_pause_24)
|
|
115
|
+
.setDisplayName("Pause")
|
|
116
|
+
.setEnabled(playerCommands.contains(Player.COMMAND_PLAY_PAUSE))
|
|
117
|
+
.build()
|
|
118
|
+
)
|
|
119
|
+
} else {
|
|
120
|
+
builder.add(
|
|
121
|
+
CommandButton.Builder(CommandButton.ICON_UNDEFINED)
|
|
122
|
+
.setPlayerCommand(Player.COMMAND_PLAY_PAUSE)
|
|
123
|
+
.setCustomIconResId(R.drawable.outline_play_arrow_24)
|
|
124
|
+
.setDisplayName("Play")
|
|
125
|
+
.setEnabled(playerCommands.contains(Player.COMMAND_PLAY_PAUSE))
|
|
126
|
+
.build()
|
|
127
|
+
)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Next
|
|
131
|
+
builder.add(
|
|
132
|
+
CommandButton.Builder(CommandButton.ICON_UNDEFINED)
|
|
133
|
+
.setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT)
|
|
134
|
+
.setCustomIconResId(R.drawable.outline_skip_next_24)
|
|
135
|
+
.setDisplayName("Next")
|
|
136
|
+
.setEnabled(playerCommands.contains(Player.COMMAND_SEEK_TO_NEXT))
|
|
137
|
+
.build()
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
// Repeat Mode Toggle
|
|
141
|
+
val repeatIcon = when (player.repeatMode) {
|
|
142
|
+
Player.REPEAT_MODE_ONE -> R.drawable.outline_repeat_one_24
|
|
143
|
+
Player.REPEAT_MODE_ALL -> R.drawable.outline_repeat_24
|
|
144
|
+
else -> R.drawable.outline_repeat_off_24
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
builder.add(
|
|
148
|
+
CommandButton.Builder(CommandButton.ICON_UNDEFINED)
|
|
149
|
+
.setSessionCommand(SessionCommand(CustomCommands.CMD_TOGGLE_REPEAT_MODE, Bundle.EMPTY))
|
|
150
|
+
.setCustomIconResId(repeatIcon)
|
|
151
|
+
.setDisplayName("Repeat Mode")
|
|
152
|
+
.setEnabled(true)
|
|
153
|
+
.build()
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
return builder.build()
|
|
157
|
+
}
|
|
158
|
+
})
|
|
159
|
+
|
|
83
160
|
|
|
84
161
|
val dataSourceFactory = DownloadUtil.getPlayerDataSourceFactory(this)
|
|
85
162
|
|
|
@@ -176,10 +253,36 @@ class OrpheusMusicService : MediaLibraryService() {
|
|
|
176
253
|
session: MediaSession,
|
|
177
254
|
controller: MediaSession.ControllerInfo
|
|
178
255
|
): MediaSession.ConnectionResult {
|
|
256
|
+
val sessionCommands = MediaSession.ConnectionResult.DEFAULT_SESSION_COMMANDS.buildUpon()
|
|
257
|
+
.add(SessionCommand(CustomCommands.CMD_TOGGLE_REPEAT_MODE, Bundle.EMPTY))
|
|
258
|
+
.build()
|
|
259
|
+
|
|
179
260
|
return MediaSession.ConnectionResult.AcceptedResultBuilder(session)
|
|
261
|
+
.setAvailableSessionCommands(sessionCommands)
|
|
180
262
|
.build()
|
|
181
263
|
}
|
|
182
264
|
|
|
265
|
+
@OptIn(UnstableApi::class)
|
|
266
|
+
override fun onCustomCommand(
|
|
267
|
+
session: MediaSession,
|
|
268
|
+
controller: MediaSession.ControllerInfo,
|
|
269
|
+
customCommand: SessionCommand,
|
|
270
|
+
args: Bundle
|
|
271
|
+
): ListenableFuture<SessionResult> {
|
|
272
|
+
if (customCommand.customAction == CustomCommands.CMD_TOGGLE_REPEAT_MODE) {
|
|
273
|
+
val player = session.player
|
|
274
|
+
val newMode = when (player.repeatMode) {
|
|
275
|
+
Player.REPEAT_MODE_OFF -> Player.REPEAT_MODE_ALL
|
|
276
|
+
Player.REPEAT_MODE_ALL -> Player.REPEAT_MODE_ONE
|
|
277
|
+
Player.REPEAT_MODE_ONE -> Player.REPEAT_MODE_OFF
|
|
278
|
+
else -> Player.REPEAT_MODE_OFF
|
|
279
|
+
}
|
|
280
|
+
player.repeatMode = newMode
|
|
281
|
+
return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
|
|
282
|
+
}
|
|
283
|
+
return super.onCustomCommand(session, controller, customCommand, args)
|
|
284
|
+
}
|
|
285
|
+
|
|
183
286
|
override fun onPlaybackResumption(
|
|
184
287
|
mediaSession: MediaSession,
|
|
185
288
|
controller: MediaSession.ControllerInfo,
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
+
android:width="24dp"
|
|
3
|
+
android:height="24dp"
|
|
4
|
+
android:viewportWidth="24"
|
|
5
|
+
android:viewportHeight="24"
|
|
6
|
+
android:tint="?attr/colorControlNormal">
|
|
7
|
+
<path
|
|
8
|
+
android:fillColor="@android:color/white"
|
|
9
|
+
android:pathData="M7,7h10v3l4,-4l-4,-4v3H5v6h2V7zM17,17H7v-3l-4,4l4,4v-3h12v-6h-2V17z"/>
|
|
10
|
+
</vector>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
+
android:width="24dp"
|
|
3
|
+
android:height="24dp"
|
|
4
|
+
android:viewportWidth="24"
|
|
5
|
+
android:viewportHeight="24"
|
|
6
|
+
android:tint="?attr/colorControlNormal"
|
|
7
|
+
android:alpha="0.3">
|
|
8
|
+
<path
|
|
9
|
+
android:fillColor="@android:color/white"
|
|
10
|
+
android:pathData="M7,7h10v3l4,-4l-4,-4v3H5v6h2V7zM17,17H7v-3l-4,4l4,4v-3h12v-6h-2V17z"/>
|
|
11
|
+
</vector>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
+
android:width="24dp"
|
|
3
|
+
android:height="24dp"
|
|
4
|
+
android:viewportWidth="24"
|
|
5
|
+
android:viewportHeight="24"
|
|
6
|
+
android:tint="?attr/colorControlNormal">
|
|
7
|
+
<path
|
|
8
|
+
android:fillColor="@android:color/white"
|
|
9
|
+
android:pathData="M7,7h10v3l4,-4l-4,-4v3H5v6h2V7zM17,17H7v-3l-4,4l4,4v-3h12v-6h-2V17zM13,15V9h-1l-2,1v1h1.5v4H13z"/>
|
|
10
|
+
</vector>
|
|
@@ -54,6 +54,9 @@ export type OrpheusEvents = {
|
|
|
54
54
|
status: boolean;
|
|
55
55
|
}): void;
|
|
56
56
|
onDownloadUpdated(event: DownloadTask): void;
|
|
57
|
+
onPlaybackSpeedChanged(event: {
|
|
58
|
+
speed: number;
|
|
59
|
+
}): void;
|
|
57
60
|
};
|
|
58
61
|
declare class OrpheusModule extends NativeModule<OrpheusEvents> {
|
|
59
62
|
restorePlaybackPositionEnabled: boolean;
|
|
@@ -170,6 +173,8 @@ declare class OrpheusModule extends NativeModule<OrpheusEvents> {
|
|
|
170
173
|
showDesktopLyrics(): Promise<void>;
|
|
171
174
|
hideDesktopLyrics(): Promise<void>;
|
|
172
175
|
setDesktopLyrics(lyricsJson: string): Promise<void>;
|
|
176
|
+
setPlaybackSpeed(speed: number): Promise<void>;
|
|
177
|
+
getPlaybackSpeed(): Promise<number>;
|
|
173
178
|
}
|
|
174
179
|
export declare enum DownloadState {
|
|
175
180
|
QUEUED = 0,
|
|
@@ -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;
|
|
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;AAkMD,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 onPlaybackSpeedChanged(event: { speed: number }): void;\n};\n\ndeclare class OrpheusModule extends NativeModule<OrpheusEvents> {\n \n restorePlaybackPositionEnabled: boolean;\n loudnessNormalizationEnabled: boolean;\n autoplayOnStartEnabled: boolean;\n isDesktopLyricsShown: boolean;\n isDesktopLyricsLocked: 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 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 checkOverlayPermission(): Promise<boolean>;\n requestOverlayPermission(): Promise<void>;\n showDesktopLyrics(): Promise<void>;\n hideDesktopLyrics(): Promise<void>;\n setDesktopLyrics(lyricsJson: string): Promise<void>;\n \n setPlaybackSpeed(speed: number): Promise<void>;\n getPlaybackSpeed(): Promise<number>;\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
|
@@ -49,6 +49,7 @@ export type OrpheusEvents = {
|
|
|
49
49
|
}): void;
|
|
50
50
|
onIsPlayingChanged(event: { status: boolean }): void;
|
|
51
51
|
onDownloadUpdated(event: DownloadTask): void;
|
|
52
|
+
onPlaybackSpeedChanged(event: { speed: number }): void;
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
declare class OrpheusModule extends NativeModule<OrpheusEvents> {
|
|
@@ -206,6 +207,9 @@ declare class OrpheusModule extends NativeModule<OrpheusEvents> {
|
|
|
206
207
|
showDesktopLyrics(): Promise<void>;
|
|
207
208
|
hideDesktopLyrics(): Promise<void>;
|
|
208
209
|
setDesktopLyrics(lyricsJson: string): Promise<void>;
|
|
210
|
+
|
|
211
|
+
setPlaybackSpeed(speed: number): Promise<void>;
|
|
212
|
+
getPlaybackSpeed(): Promise<number>;
|
|
209
213
|
}
|
|
210
214
|
|
|
211
215
|
export enum DownloadState {
|