xref: /MusicFree/src/service/index.ts (revision 8c55a6aa7a01f120247fcb5fabac8ec87ebb57cd)
1import Config from '@/core/config';
2import {trace} from '@/utils/log';
3import {isSameMediaItem} from '@/utils/mediaItem';
4import musicIsPaused from '@/utils/musicIsPaused';
5import TrackPlayer, {Event, State} from 'react-native-track-player';
6import MusicQueue from '../core/musicQueue';
7
8let resumeState: State;
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            if (paused) {
28                resumeState = await TrackPlayer.getState();
29                return MusicQueue.pause();
30            } else if (!musicIsPaused(resumeState)) {
31                return MusicQueue.play();
32            }
33        },
34    );
35    TrackPlayer.addEventListener(Event.PlaybackProgressUpdated, evt => {
36        Config.set('status.music.progress', evt.position);
37    });
38    /** 播放下一个 */
39    TrackPlayer.addEventListener(Event.PlaybackTrackChanged, async evt => {
40        // console.log('track变化', evt, await TrackPlayer.getQueue())
41        // 是track里的,不是playlist里的
42        trace('PlaybackTrackChanged', {
43            evt,
44        });
45
46        if (
47            evt.nextTrack === 1 &&
48            !(await TrackPlayer.getTrack(evt.nextTrack))?.url
49        ) {
50            if (MusicQueue.getRepeatMode() === 'SINGLE') {
51                await MusicQueue.play(undefined, true);
52            } else {
53                const queue = await TrackPlayer.getQueue();
54                // 要跳到的下一个就是当前的,并且队列里面有多首歌
55                if (
56                    isSameMediaItem(
57                        queue[1] as unknown as ICommon.IMediaBase,
58                        MusicQueue.getCurrentMusicItem(),
59                    ) &&
60                    MusicQueue.getMusicQueue().length > 1
61                ) {
62                    console.log('多余的事件');
63                    return;
64                }
65                trace('PlaybackTrackChanged-shouldskip', {
66                    evt,
67                    queue,
68                });
69
70                await MusicQueue.skipToNext();
71            }
72        }
73    });
74};
75