@roitium/expo-orpheus 0.8.0 → 0.9.1

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/README.md CHANGED
@@ -30,6 +30,12 @@ Orpheus 集成了 Media3 的 DownloadManager,抛弃了原先 BBPlayer 中繁
30
30
  相信聪明的你去看一下公开方法名就知道怎么使用了!
31
31
  (需要注意的是,在切歌时,会自动清空当前的歌词)
32
32
 
33
+ ## 注意事项
34
+
35
+ 该库一些修改比较随意,我怕后续我自己都忘了,所以在这里进行一下记录。
36
+
37
+ 1. `onTrackStarted` 事件在 v0.9.0 版本后不再存在。需要使用 `registerOrpheusHeadlessTask` 注册事件并自行判断事件是否为 `onTrackStarted`
38
+
33
39
  ## 使用
34
40
 
35
41
  虽然该包是公开的,但仍然主要供 BBPlayer 内部使用。可能不会有完整的文档覆盖。我们欢迎你 fork 后自行修改使用。
@@ -51,4 +51,5 @@ dependencies {
51
51
  implementation "com.squareup.retrofit2:converter-gson:2.9.0"
52
52
  implementation 'com.tencent:mmkv:2.3.0'
53
53
  implementation "com.github.bumptech.glide:glide:5.0.5"
54
+ compileOnly "com.facebook.react:react-android"
54
55
  }
@@ -31,5 +31,6 @@
31
31
  <category android:name="android.intent.category.DEFAULT" />
32
32
  </intent-filter>
33
33
  </service>
34
+ <service android:name=".OrpheusHeadlessTaskService" />
34
35
  </application>
35
36
  </manifest>
@@ -218,43 +218,34 @@ class ExpoOrpheusModule : Module() {
218
218
  Log.d("Orpheus", "Destroy media controller")
219
219
  }
220
220
 
221
- Constant("restorePlaybackPositionEnabled") {
222
- GeneralStorage.isRestoreEnabled()
223
- }
224
-
225
- Constant("loudnessNormalizationEnabled") {
226
- GeneralStorage.isLoudnessNormalizationEnabled()
227
- }
221
+ Property("restorePlaybackPositionEnabled")
222
+ .get { GeneralStorage.isRestoreEnabled() }
223
+ .set { enabled: Boolean -> GeneralStorage.setRestoreEnabled(enabled) }
228
224
 
229
- Constant("autoplayOnStartEnabled") {
230
- GeneralStorage.isAutoplayOnStartEnabled()
231
- }
225
+ Property("loudnessNormalizationEnabled")
226
+ .get { GeneralStorage.isLoudnessNormalizationEnabled() }
227
+ .set { enabled: Boolean -> GeneralStorage.setLoudnessNormalizationEnabled(enabled) }
232
228
 
233
- Constant("isDesktopLyricsShown") {
234
- GeneralStorage.isDesktopLyricsShown()
235
- }
229
+ Property("autoplayOnStartEnabled")
230
+ .get { GeneralStorage.isAutoplayOnStartEnabled() }
231
+ .set { enabled: Boolean -> GeneralStorage.setAutoplayOnStartEnabled(enabled) }
236
232
 
237
- Constant("isDesktopLyricsLocked") {
238
- GeneralStorage.isDesktopLyricsLocked()
239
- }
233
+ Property("isDesktopLyricsShown")
234
+ .get { GeneralStorage.isDesktopLyricsShown() }
240
235
 
236
+ Property("isDesktopLyricsLocked")
237
+ .get { GeneralStorage.isDesktopLyricsLocked() }
238
+ .set { locked: Boolean ->
239
+ mainHandler.post {
240
+ OrpheusMusicService.instance?.floatingLyricsManager?.setLocked(locked)
241
+ }
242
+ }
241
243
 
242
- Function("setAutoplayOnStartEnabled") { enabled: Boolean ->
243
- GeneralStorage.setAutoplayOnStartEnabled(enabled)
244
- }
245
244
 
246
245
  Function("setBilibiliCookie") { cookie: String ->
247
246
  OrpheusConfig.bilibiliCookie = cookie
248
247
  }
249
248
 
250
- Function("setLoudnessNormalizationEnabled") { enabled: Boolean ->
251
- GeneralStorage.setLoudnessNormalizationEnabled(enabled)
252
- }
253
-
254
- Function("setRestorePlaybackPositionEnabled") { enabled: Boolean ->
255
- GeneralStorage.setRestoreEnabled(enabled)
256
- }
257
-
258
249
  AsyncFunction("getPosition") {
259
250
  checkPlayer()
260
251
  player?.currentPosition?.toDouble()?.div(1000.0) ?: 0.0
@@ -635,10 +626,6 @@ class ExpoOrpheusModule : Module() {
635
626
  e.printStackTrace()
636
627
  }
637
628
  }.runOnQueue(Queues.MAIN)
638
-
639
- AsyncFunction("setDesktopLyricsLocked") { locked: Boolean ->
640
- OrpheusMusicService.instance?.floatingLyricsManager?.setLocked(locked)
641
- }.runOnQueue(Queues.MAIN)
642
629
  }
643
630
 
644
631
  private fun getDownloadMap(download: Download): Map<String, Any> {
@@ -0,0 +1,23 @@
1
+ package expo.modules.orpheus
2
+
3
+ import android.content.Intent
4
+ import com.facebook.react.HeadlessJsTaskService
5
+ import com.facebook.react.bridge.Arguments
6
+ import com.facebook.react.jstasks.HeadlessJsTaskConfig
7
+
8
+ class OrpheusHeadlessTaskService : HeadlessJsTaskService() {
9
+
10
+ override fun getTaskConfig(intent: Intent?): HeadlessJsTaskConfig? {
11
+ val extras = intent?.extras
12
+ return if (extras != null) {
13
+ HeadlessJsTaskConfig(
14
+ "OrpheusHeadlessTask",
15
+ Arguments.fromBundle(extras),
16
+ 5000, // timeout for the task
17
+ true // allowed in foreground
18
+ )
19
+ } else {
20
+ null
21
+ }
22
+ }
23
+ }
@@ -220,6 +220,26 @@ class OrpheusMusicService : MediaLibraryService() {
220
220
 
221
221
  player.playWhenReady = GeneralStorage.isAutoplayOnStartEnabled()
222
222
  player.prepare()
223
+
224
+ // 软件冷启动时,恢复的歌曲并不会触发 onMediaTransition 事件,我们需要手动补发一个
225
+ if (player.currentMediaItem != null) {
226
+ sendTrackStartEvent(player.currentMediaItem, Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED)
227
+ }
228
+ }
229
+ }
230
+
231
+ @OptIn(UnstableApi::class)
232
+ private fun sendTrackStartEvent(mediaItem: androidx.media3.common.MediaItem?, reason: Int) {
233
+ if (mediaItem == null) return
234
+
235
+ try {
236
+ val intent = Intent(this, OrpheusHeadlessTaskService::class.java)
237
+ intent.putExtra("eventName", "onTrackStarted")
238
+ intent.putExtra("trackId", mediaItem.mediaId)
239
+ intent.putExtra("reason", reason)
240
+ startService(intent)
241
+ } catch (e: Exception) {
242
+ e.printStackTrace()
223
243
  }
224
244
  }
225
245
 
@@ -239,6 +259,8 @@ class OrpheusMusicService : MediaLibraryService() {
239
259
  mediaItem: androidx.media3.common.MediaItem?,
240
260
  reason: Int
241
261
  ) {
262
+ sendTrackStartEvent(mediaItem, reason)
263
+
242
264
  floatingLyricsManager.setLyrics(emptyList())
243
265
  saveCurrentQueue()
244
266
  val uri = mediaItem?.localConfiguration?.uri?.toString() ?: return
@@ -0,0 +1 @@
1
+ {"tags":{"00":"51.81","01":"47.24","02":"53.70","03":"39.62"},"lyrics":[{"timestamp":0,"text":"作词 : えびかれー伯爵/知代/くりーむぱい太郎"},{"timestamp":1,"text":"作曲 : えびかれー伯爵"},{"timestamp":7.66,"text":"I can't be a superstar","translation":"我成为不了超级明星"},{"timestamp":10.66,"text":"Not happy like in the silver screen","translation":"无法像银幕里那样幸福美满"},{"timestamp":15.05,"text":"But we can get everything here","translation":"但在这里,我们能获得想要的一切"},{"timestamp":37.18,"text":"It's kinda fiction","translation":"这是一篇小说"},{"timestamp":38.56,"text":"It's a made up story","translation":"是虚构的故事"},{"timestamp":40.18,"text":"That would be too good for me, sometimes","translation":"虽然它有时也对我太过友好"},{"timestamp":44.6,"text":"But the beginning is from that point","translation":"但一切都要从那里说起"},{"timestamp":52.07,"text":"Perfect story is waiting on me who failure","translation":"完美的故事正等着失败的我书写"},{"timestamp":59.51,"text":"Even though I'm not honest man","translation":"我并非诚实之人,但也无妨"},{"timestamp":66.7,"text":"It's a breeze","translation":"这事小菜一碟"},{"timestamp":70.4,"text":"I can't be a superstar","translation":"我成为不了超级明星"},{"timestamp":73.43,"text":"Not happy like in the silver screen","translation":"无法像银幕里那样幸福美满"},{"timestamp":77.77,"text":"But we can get everything here","translation":"但在这里,我们能获得想要的一切"},{"timestamp":92.58,"text":"It's Low-key life","translation":"这是低调生活"},{"timestamp":93.94,"text":"It's so small role","translation":"属于边缘配角"},{"timestamp":95.59,"text":"Cursed this terrible doom fades me away","translation":"尽管被诅咒的可怕厄运企图将我扼杀"},{"timestamp":99.92,"text":"But it's a chance to change the life brand new","translation":"但同时它也是令生活焕然一新的良机"},{"timestamp":107.52,"text":"Perfect story is waiting on me who failure","translation":"完美的故事正等着失败的我书写"},{"timestamp":114.92,"text":"Even though I'm not honest man","translation":"我并非诚实之人,但也无妨"},{"timestamp":122.13,"text":"It's a breeze","translation":"这事小菜一碟"},{"timestamp":125.78,"text":"I can't be a superstar","translation":"我成为不了超级明星"},{"timestamp":128.76,"text":"Not happy like in the silver screen","translation":"无法像银幕里那样幸福美满"},{"timestamp":133.18,"text":"But we can get everything here","translation":"但在这里,我们能获得想要的一切"},{"timestamp":155.51,"text":"It's kinda fiction","translation":"这是一篇小说"},{"timestamp":157.39,"text":"It's a made up story","translation":"是虚构的故事"},{"timestamp":159.27,"text":"That would be too good for me, sometimes","translation":"虽然它有时也对我太过友好"},{"timestamp":162.96,"text":"But the beginning is from that point","translation":"但一切都要从那里说起"},{"timestamp":170.01,"text":"It's a breeze","translation":"这事小菜一碟"},{"timestamp":173.8,"text":"I can't be a superstar","translation":"我成为不了超级明星"},{"timestamp":176.75,"text":"Not happy like in the silver screen","translation":"无法像银幕里那样幸福美满"},{"timestamp":181.16,"text":"But we can get everything here","translation":"但在这里,我们能获得想要的一切"},{"timestamp":189.55,"text":"I can't be a superstar","translation":"我成为不了超级明星"},{"timestamp":192.45,"text":"Not happy like in the silver screen","translation":"无法像银幕里那样幸福美满"},{"timestamp":196.89,"text":"But we can get everything here","translation":"但在这里,我们能获得想要的一切"},{"timestamp":211.65,"text":"But we can get everything here","translation":"但在这里,我们能获得想要的一切"}],"rawOriginalLyrics":"[00:00.00] 作词 : えびかれー伯爵/知代/くりーむぱい太郎\n[00:01.00] 作曲 : えびかれー伯爵\n[00:07.66]I can't be a superstar\n[00:10.66]Not happy like in the silver screen\n[00:15.05]But we can get everything here\n[00:22.44]\n[00:37.18]It's kinda fiction\n[00:38.56]It's a made up story\n[00:40.18]That would be too good for me, sometimes\n[00:44.60]But the beginning is from that point\n[00:51.81]\n[00:52.07]Perfect story is waiting on me who failure\n[00:59.51]Even though I'm not honest man\n[01:06.70]It's a breeze\n[01:10.30]\n[01:10.40]I can't be a superstar\n[01:13.43]Not happy like in the silver screen\n[01:17.77]But we can get everything here\n[01:28.93]\n[01:32.58]It's Low-key life\n[01:33.94]It's so small role\n[01:35.59]Cursed this terrible doom fades me away\n[01:39.92]But it's a chance to change the life brand new\n[01:47.24]\n[01:47.52]Perfect story is waiting on me who failure\n[01:54.92]Even though I'm not honest man\n[02:02.13]It's a breeze\n[02:05.68]\n[02:05.78]I can't be a superstar\n[02:08.76]Not happy like in the silver screen\n[02:13.18]But we can get everything here\n[02:24.30]\n[02:35.51]It's kinda fiction\n[02:37.39]It's a made up story\n[02:39.27]That would be too good for me, sometimes\n[02:42.96]But the beginning is from that point\n[02:48.99]\n[02:50.01]It's a breeze\n[02:53.70]\n[02:53.80]I can't be a superstar\n[02:56.75]Not happy like in the silver screen\n[03:01.16]But we can get everything here\n[03:08.61]\n[03:09.55]I can't be a superstar\n[03:12.45]Not happy like in the silver screen\n[03:16.89]But we can get everything here\n[03:28.02]\n[03:31.65]But we can get everything here\n[03:39.62]\n","rawTranslatedLyrics":"\n[00:07.66]我成为不了超级明星\n[00:10.66]无法像银幕里那样幸福美满\n[00:15.05]但在这里,我们能获得想要的一切\n[00:22.44]\n[00:37.18]这是一篇小说\n[00:38.56]是虚构的故事\n[00:40.18]虽然它有时也对我太过友好\n[00:44.60]但一切都要从那里说起\n[00:51.81]\n[00:52.07]完美的故事正等着失败的我书写\n[00:59.51]我并非诚实之人,但也无妨\n[01:06.70]这事小菜一碟\n[01:10.30]\n[01:10.40]我成为不了超级明星\n[01:13.43]无法像银幕里那样幸福美满\n[01:17.77]但在这里,我们能获得想要的一切\n[01:28.93]\n[01:32.58]这是低调生活\n[01:33.94]属于边缘配角\n[01:35.59]尽管被诅咒的可怕厄运企图将我扼杀\n[01:39.92]但同时它也是令生活焕然一新的良机\n[01:47.24]\n[01:47.52]完美的故事正等着失败的我书写\n[01:54.92]我并非诚实之人,但也无妨\n[02:02.13]这事小菜一碟\n[02:05.68]\n[02:05.78]我成为不了超级明星\n[02:08.76]无法像银幕里那样幸福美满\n[02:13.18]但在这里,我们能获得想要的一切\n[02:24.30]\n[02:35.51]这是一篇小说\n[02:37.39]是虚构的故事\n[02:39.27]虽然它有时也对我太过友好\n[02:42.96]但一切都要从那里说起\n[02:48.99]\n[02:50.01]这事小菜一碟\n[02:53.70]\n[02:53.80]我成为不了超级明星\n[02:56.75]无法像银幕里那样幸福美满\n[03:01.16]但在这里,我们能获得想要的一切\n[03:08.61]\n[03:09.55]我成为不了超级明星\n[03:12.45]无法像银幕里那样幸福美满\n[03:16.89]但在这里,我们能获得想要的一切\n[03:28.02]\n[03:31.65]但在这里,我们能获得想要的一切\n[03:39.62]"}
@@ -95,9 +95,6 @@ declare class OrpheusModule extends NativeModule<OrpheusEvents> {
95
95
  getIndexTrack(index: number): Promise<Track | null>;
96
96
  getRepeatMode(): Promise<RepeatMode>;
97
97
  setBilibiliCookie(cookie: string): void;
98
- setRestorePlaybackPositionEnabled(enabled: boolean): void;
99
- setLoudnessNormalizationEnabled(enabled: boolean): void;
100
- setAutoplayOnStartEnabled(enabled: boolean): void;
101
98
  play(): Promise<void>;
102
99
  pause(): Promise<void>;
103
100
  clear(): Promise<void>;
@@ -173,7 +170,6 @@ declare class OrpheusModule extends NativeModule<OrpheusEvents> {
173
170
  showDesktopLyrics(): Promise<void>;
174
171
  hideDesktopLyrics(): Promise<void>;
175
172
  setDesktopLyrics(lyricsJson: string): Promise<void>;
176
- setDesktopLyricsLocked(locked: boolean): Promise<void>;
177
173
  }
178
174
  export declare enum DownloadState {
179
175
  QUEUED = 0,
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoOrpheusModule.d.ts","sourceRoot":"","sources":["../src/ExpoOrpheusModule.ts"],"names":[],"mappings":"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"}
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;AAmMD,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 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 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 checkOverlayPermission(): Promise<boolean>;\n requestOverlayPermission(): Promise<void>;\n showDesktopLyrics(): Promise<void>;\n hideDesktopLyrics(): Promise<void>;\n setDesktopLyrics(lyricsJson: string): Promise<void>;\n setDesktopLyricsLocked(locked: boolean): Promise<void>;\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"]}
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;AA8LD,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 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\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/build/index.d.ts CHANGED
@@ -1,3 +1,10 @@
1
1
  export * from "./ExpoOrpheusModule";
2
2
  export * from "./hooks";
3
+ export type OrpheusHeadlessTrackStartedEvent = {
4
+ eventName: "onTrackStarted";
5
+ trackId: string;
6
+ reason: number;
7
+ };
8
+ export type OrpheusHeadlessEvent = OrpheusHeadlessTrackStartedEvent;
9
+ export declare function registerOrpheusHeadlessTask(task: (event: OrpheusHeadlessEvent) => Promise<void>): void;
3
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AAIxB,MAAM,MAAM,gCAAgC,GAAG;IAC7C,SAAS,EAAE,gBAAgB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,gCAAgC,CAAC;AAEpE,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,QAGrD"}
package/build/index.js CHANGED
@@ -1,3 +1,8 @@
1
+ import { AppRegistry } from "react-native";
1
2
  export * from "./ExpoOrpheusModule";
2
3
  export * from "./hooks";
4
+ const ORPHEUS_HEADLESS_TASK = "OrpheusHeadlessTask";
5
+ export function registerOrpheusHeadlessTask(task) {
6
+ AppRegistry.registerHeadlessTask(ORPHEUS_HEADLESS_TASK, () => task);
7
+ }
3
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC","sourcesContent":["export * from \"./ExpoOrpheusModule\";\nexport * from \"./hooks\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AAExB,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAUpD,MAAM,UAAU,2BAA2B,CACzC,IAAoD;IAEpD,WAAW,CAAC,oBAAoB,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC","sourcesContent":["import { AppRegistry } from \"react-native\";\nexport * from \"./ExpoOrpheusModule\";\nexport * from \"./hooks\";\n\nconst ORPHEUS_HEADLESS_TASK = \"OrpheusHeadlessTask\";\n\nexport type OrpheusHeadlessTrackStartedEvent = {\n eventName: \"onTrackStarted\";\n trackId: string;\n reason: number;\n};\n\nexport type OrpheusHeadlessEvent = OrpheusHeadlessTrackStartedEvent;\n\nexport function registerOrpheusHeadlessTask(\n task: (event: OrpheusHeadlessEvent) => Promise<void>\n) {\n AppRegistry.registerHeadlessTask(ORPHEUS_HEADLESS_TASK, () => task);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roitium/expo-orpheus",
3
- "version": "0.8.0",
3
+ "version": "0.9.1",
4
4
  "description": "A player for bbplayer",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -103,10 +103,6 @@ declare class OrpheusModule extends NativeModule<OrpheusEvents> {
103
103
 
104
104
  setBilibiliCookie(cookie: string): void;
105
105
 
106
- setRestorePlaybackPositionEnabled(enabled: boolean): void;
107
- setLoudnessNormalizationEnabled(enabled: boolean): void;
108
- setAutoplayOnStartEnabled(enabled: boolean): void;
109
-
110
106
  play(): Promise<void>;
111
107
 
112
108
  pause(): Promise<void>;
@@ -210,7 +206,6 @@ declare class OrpheusModule extends NativeModule<OrpheusEvents> {
210
206
  showDesktopLyrics(): Promise<void>;
211
207
  hideDesktopLyrics(): Promise<void>;
212
208
  setDesktopLyrics(lyricsJson: string): Promise<void>;
213
- setDesktopLyricsLocked(locked: boolean): Promise<void>;
214
209
  }
215
210
 
216
211
  export enum DownloadState {
package/src/index.ts CHANGED
@@ -1,2 +1,19 @@
1
+ import { AppRegistry } from "react-native";
1
2
  export * from "./ExpoOrpheusModule";
2
3
  export * from "./hooks";
4
+
5
+ const ORPHEUS_HEADLESS_TASK = "OrpheusHeadlessTask";
6
+
7
+ export type OrpheusHeadlessTrackStartedEvent = {
8
+ eventName: "onTrackStarted";
9
+ trackId: string;
10
+ reason: number;
11
+ };
12
+
13
+ export type OrpheusHeadlessEvent = OrpheusHeadlessTrackStartedEvent;
14
+
15
+ export function registerOrpheusHeadlessTask(
16
+ task: (event: OrpheusHeadlessEvent) => Promise<void>
17
+ ) {
18
+ AppRegistry.registerHeadlessTask(ORPHEUS_HEADLESS_TASK, () => task);
19
+ }