xref: /MusicFree/src/entry/bootstrap.ts (revision 28bde18b8353afb506749a85a8dc4261264bd14c)
1242960d3S猫头猫import MusicQueue from '@/core/musicQueue';
2e14deecfS猫头猫import MusicSheet from '@/core/musicSheet';
3bf6e62f2S猫头猫import {check, PERMISSIONS, request} from 'react-native-permissions';
4bf6e62f2S猫头猫import TrackPlayer, {Capability} from 'react-native-track-player';
5242960d3S猫头猫import {pluginManager} from '../core/pluginManager';
6bf6e62f2S猫头猫import 'react-native-get-random-values';
76c6f45bdS猫头猫import {Platform, ToastAndroid} from 'react-native';
8242960d3S猫头猫import {loadConfig} from '@/core/localConfigManager';
90d39db21S猫头猫import RNBootSplash from 'react-native-bootsplash';
106c6f45bdS猫头猫import RNFS, {exists, mkdir} from 'react-native-fs';
11e14deecfS猫头猫import Download from '@/core/download';
126780f402S猫头猫import pathConst from '@/constants/pathConst';
13be0a3650S猫头猫import {checkAndCreateDir} from '@/utils/fileUtils';
14242960d3S猫头猫import {errorLog} from '@/utils/log';
15*28bde18bS猫头猫import MediaMeta from '@/core/mediaMeta';
163d6d339aS猫头猫import Cache from '@/core/cache';
17bf6e62f2S猫头猫
18bf6e62f2S猫头猫/** app加载前执行 */
1994a1b1fcS猫头猫async function _bootstrap() {
20bf6e62f2S猫头猫  // 检查权限
21bf6e62f2S猫头猫  const [readStoragePermission, writeStoragePermission] = await Promise.all([
22bf6e62f2S猫头猫    check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
23bf6e62f2S猫头猫    check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
24bf6e62f2S猫头猫  ]);
25bf6e62f2S猫头猫  if (
26bf6e62f2S猫头猫    !(
27bf6e62f2S猫头猫      readStoragePermission === 'granted' &&
28bf6e62f2S猫头猫      writeStoragePermission === 'granted'
29bf6e62f2S猫头猫    )
30bf6e62f2S猫头猫  ) {
31bf6e62f2S猫头猫    await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
32bf6e62f2S猫头猫    await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
33bf6e62f2S猫头猫  }
34bf6e62f2S猫头猫
356780f402S猫头猫  /** 初始化路径 */
366780f402S猫头猫  await setupFolder();
37bf6e62f2S猫头猫  // 加载配置
38bf6e62f2S猫头猫  await loadConfig();
39bf6e62f2S猫头猫  // 加载插件
4094a1b1fcS猫头猫  try {
4194a1b1fcS猫头猫    await TrackPlayer.setupPlayer();
4294a1b1fcS猫头猫  } catch (e: any) {
4394a1b1fcS猫头猫    if (
4494a1b1fcS猫头猫      e?.message !== 'The player has already been initialized via setupPlayer.'
4594a1b1fcS猫头猫    ) {
4694a1b1fcS猫头猫      throw e;
4794a1b1fcS猫头猫    }
4894a1b1fcS猫头猫  }
49bf6e62f2S猫头猫
50bf6e62f2S猫头猫  Promise.all([
510d39db21S猫头猫    await pluginManager.setupPlugins(),
52*28bde18bS猫头猫    await MediaMeta.setup(),
530d39db21S猫头猫  ]);
54bf6e62f2S猫头猫  await TrackPlayer.updateOptions({
5594a1b1fcS猫头猫    progressUpdateEventInterval: 0.4,
56bf6e62f2S猫头猫    stopWithApp: false,
57bf6e62f2S猫头猫    alwaysPauseOnInterruption: true,
58bf6e62f2S猫头猫    capabilities: [
59bf6e62f2S猫头猫      Capability.Play,
60bf6e62f2S猫头猫      Capability.Pause,
61bf6e62f2S猫头猫      Capability.SkipToNext,
62bf6e62f2S猫头猫      Capability.SkipToPrevious,
63bf6e62f2S猫头猫    ],
64bf6e62f2S猫头猫    compactCapabilities: [
65bf6e62f2S猫头猫      Capability.Play,
66bf6e62f2S猫头猫      Capability.Pause,
67bf6e62f2S猫头猫      Capability.SkipToNext,
68bf6e62f2S猫头猫      Capability.SkipToPrevious,
69bf6e62f2S猫头猫    ],
70bf6e62f2S猫头猫    notificationCapabilities: [
71bf6e62f2S猫头猫      Capability.Play,
72bf6e62f2S猫头猫      Capability.Pause,
73bf6e62f2S猫头猫      Capability.SkipToNext,
74bf6e62f2S猫头猫      Capability.SkipToPrevious,
750d39db21S猫头猫    ],
760d39db21S猫头猫  });
77e14deecfS猫头猫  await MusicQueue.setup();
78e14deecfS猫头猫  await MusicSheet.setup();
79e14deecfS猫头猫  await Download.setup();
803d6d339aS猫头猫  await Cache.setup();
81bf6e62f2S猫头猫
82c79c8a57S猫头猫  ErrorUtils.setGlobalHandler(error => {
83c79c8a57S猫头猫    errorLog('未捕获的错误', error);
84c79c8a57S猫头猫  });
85bf6e62f2S猫头猫}
866c6f45bdS猫头猫
876c6f45bdS猫头猫/** 初始化 */
886c6f45bdS猫头猫async function setupFolder() {
896780f402S猫头猫  await Promise.all([
90be0a3650S猫头猫    checkAndCreateDir(pathConst.dataPath),
917f771613S猫头猫    checkAndCreateDir(pathConst.logPath),
927f771613S猫头猫    checkAndCreateDir(pathConst.cachePath),
93be0a3650S猫头猫    checkAndCreateDir(pathConst.storagePath),
94c79c8a57S猫头猫    checkAndCreateDir(pathConst.pluginPath),
9594a1b1fcS猫头猫    checkAndCreateDir(pathConst.lrcCachePath),
966780f402S猫头猫  ]);
976c6f45bdS猫头猫}
9894a1b1fcS猫头猫
9994a1b1fcS猫头猫export default async function () {
10094a1b1fcS猫头猫  try {
10194a1b1fcS猫头猫    await _bootstrap();
10294a1b1fcS猫头猫  } catch (e) {
10394a1b1fcS猫头猫    errorLog('初始化出错', e);
10494a1b1fcS猫头猫    console.log(e);
10594a1b1fcS猫头猫  }
10694a1b1fcS猫头猫  // 隐藏开屏动画
10794a1b1fcS猫头猫  console.log('HIDE');
10894a1b1fcS猫头猫  RNBootSplash.hide({fade: true});
10994a1b1fcS猫头猫}
110