xref: /MusicFree/src/service/index.ts (revision 15900d057ad4df766b2f9ea5b48f92a8ce2664db)
1import Config from '@/core/config';
2import RNTrackPlayer, {Event, State} from 'react-native-track-player';
3import LyricManager from '@/core/lyricManager';
4import LyricUtil from '@/native/lyricUtil';
5import TrackPlayer from '@/core/trackPlayer';
6import {musicIsPaused} from '@/utils/trackUtils';
7
8let resumeState: State | null;
9module.exports = async function () {
10    RNTrackPlayer.addEventListener(Event.RemotePlay, () => TrackPlayer.play());
11    RNTrackPlayer.addEventListener(Event.RemotePause, () =>
12        TrackPlayer.pause(),
13    );
14    RNTrackPlayer.addEventListener(Event.RemotePrevious, () =>
15        TrackPlayer.skipToPrevious(),
16    );
17    RNTrackPlayer.addEventListener(Event.RemoteNext, () =>
18        TrackPlayer.skipToNext(),
19    );
20    RNTrackPlayer.addEventListener(
21        Event.RemoteDuck,
22        async ({paused, permanent}) => {
23            if (Config.get('setting.basic.notInterrupt')) {
24                return;
25            }
26            if (permanent) {
27                return TrackPlayer.pause();
28            }
29            const tempRemoteDuckConf = Config.get(
30                'setting.basic.tempRemoteDuck',
31            );
32            if (tempRemoteDuckConf === '降低音量') {
33                if (paused) {
34                    return RNTrackPlayer.setVolume(0.5);
35                } else {
36                    return RNTrackPlayer.setVolume(1);
37                }
38            } else {
39                if (paused) {
40                    resumeState =
41                        (await RNTrackPlayer.getPlaybackState()).state ??
42                        State.Paused;
43                    return TrackPlayer.pause();
44                } else {
45                    if (resumeState && !musicIsPaused(resumeState)) {
46                        resumeState = null;
47                        return TrackPlayer.play();
48                    }
49                    resumeState = null;
50                }
51            }
52        },
53    );
54
55    RNTrackPlayer.addEventListener(Event.PlaybackActiveTrackChanged, () => {
56        const currentMusicItem = TrackPlayer.getCurrentMusic();
57        if (currentMusicItem) {
58            LyricUtil.setStatusBarLyricText(
59                `${currentMusicItem.title} - ${currentMusicItem.artist}`,
60            );
61        }
62    });
63
64    RNTrackPlayer.addEventListener(Event.PlaybackProgressUpdated, evt => {
65        Config.set('status.music.progress', evt.position, false);
66
67        // 歌词逻辑
68        const parser = LyricManager.getLyricState().lyricParser;
69        if (parser) {
70            const prevLyricText = LyricManager.getCurrentLyric()?.lrc;
71            const currentLyricItem = parser.getPosition(evt.position).lrc;
72            if (prevLyricText !== currentLyricItem?.lrc) {
73                LyricManager.setCurrentLyric(currentLyricItem ?? null);
74
75                if (Config.get('setting.lyric.showStatusBarLyric')) {
76                    LyricUtil.setStatusBarLyricText(
77                        currentLyricItem?.lrc ?? '',
78                    );
79                }
80            }
81        }
82    });
83};
84