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