xref: /MusicFree/src/service/index.ts (revision 5d19d26c98d1c233995663070b95e5f28b5b9e1c)
1import Config from '@/core/config';
2import {isSameMediaItem} from '@/utils/mediaItem';
3import musicIsPaused from '@/utils/musicIsPaused';
4import TrackPlayer, {Event, State, Track} from 'react-native-track-player';
5import MusicQueue from '../core/musicQueue';
6
7let resumeState: State;
8module.exports = async function () {
9    TrackPlayer.addEventListener(Event.RemotePlay, () => MusicQueue.play());
10    TrackPlayer.addEventListener(Event.RemotePause, () => MusicQueue.pause());
11    TrackPlayer.addEventListener(Event.RemotePrevious, () =>
12        MusicQueue.skipToPrevious(),
13    );
14    TrackPlayer.addEventListener(Event.RemoteNext, () =>
15        MusicQueue.skipToNext(),
16    );
17    TrackPlayer.addEventListener(
18        Event.RemoteDuck,
19        async ({paused, permanent}) => {
20            if (Config.get('setting.basic.notInterrupt')) {
21                return;
22            }
23            if (permanent) {
24                return MusicQueue.pause();
25            }
26            if (paused) {
27                resumeState = await TrackPlayer.getState();
28                return MusicQueue.pause();
29            } else if (!musicIsPaused(resumeState)) {
30                return MusicQueue.play();
31            }
32        },
33    );
34    TrackPlayer.addEventListener(Event.PlaybackProgressUpdated, evt => {
35        Config.set('status.music.progress', evt.position);
36    });
37    /** 播放下一个 */
38    let nextTrack: Track;
39    // 事件有重复
40    TrackPlayer.addEventListener(Event.PlaybackTrackChanged, async evt => {
41        // console.log('track变化', evt, await TrackPlayer.getQueue())
42        // 是track里的,不是playlist里的
43        if (
44            evt.nextTrack === 1 &&
45            !(await TrackPlayer.getTrack(evt.nextTrack))?.url
46        ) {
47            if (MusicQueue.getRepeatMode() === 'SINGLE') {
48                await MusicQueue.play(undefined, true);
49            } else {
50                const queue = await TrackPlayer.getQueue();
51                if (
52                    isSameMediaItem(
53                        nextTrack as unknown as ICommon.IMediaBase,
54                        queue[1] as unknown as ICommon.IMediaBase,
55                    ) &&
56                    !isSameMediaItem(
57                        queue[0] as unknown as ICommon.IMediaBase,
58                        queue[1] as unknown as ICommon.IMediaBase,
59                    )
60                ) {
61                    // 已经处理过了,忽略掉
62                    console.log('多余的事件');
63                    return;
64                }
65                // console.log('SKIP-PlaybackTrackChanged');
66                nextTrack = queue[1];
67                await MusicQueue.skipToNext();
68            }
69        }
70    });
71};
72