xref: /MusicFree/src/entry/bootstrap.ts (revision 572773643a97ed64c4f87c1da46f1097aa62b833)
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';
5bf6e62f2S猫头猫import 'react-native-get-random-values';
6e22d5e4fS猫头猫import Config from '@/core/config';
70d39db21S猫头猫import RNBootSplash from 'react-native-bootsplash';
86780f402S猫头猫import pathConst from '@/constants/pathConst';
9be0a3650S猫头猫import {checkAndCreateDir} from '@/utils/fileUtils';
101e263108S猫头猫import {errorLog, trace} from '@/utils/log';
1128bde18bS猫头猫import MediaMeta from '@/core/mediaMeta';
123d6d339aS猫头猫import Cache from '@/core/cache';
13927dbe93S猫头猫import PluginManager from '@/core/pluginManager';
14ef714860S猫头猫import Network from '@/core/network';
15c30d30e1S猫头猫import {ImgAsset} from '@/constants/assetsConst';
160e4173cdS猫头猫import LocalMusicSheet from '@/core/localMusicSheet';
1795f955b7S猫头猫import {StatusBar} from 'react-native';
18a27adc20S猫头猫import Theme from '@/core/theme';
19*57277364S猫头猫import LyricManager from '@/core/lyricManager';
20bf6e62f2S猫头猫
218b88e961S猫头猫/** app加载前执行
228b88e961S猫头猫 * 1. 检查权限
238b88e961S猫头猫 * 2. 数据初始化
248b88e961S猫头猫 * 3.
258b88e961S猫头猫 */
2694a1b1fcS猫头猫async function _bootstrap() {
27927dbe93S猫头猫    // 1. 检查权限
28bf6e62f2S猫头猫    const [readStoragePermission, writeStoragePermission] = await Promise.all([
29bf6e62f2S猫头猫        check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
30bf6e62f2S猫头猫        check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
31bf6e62f2S猫头猫    ]);
32bf6e62f2S猫头猫    if (
33bf6e62f2S猫头猫        !(
34bf6e62f2S猫头猫            readStoragePermission === 'granted' &&
35bf6e62f2S猫头猫            writeStoragePermission === 'granted'
36bf6e62f2S猫头猫        )
37bf6e62f2S猫头猫    ) {
38bf6e62f2S猫头猫        await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
39bf6e62f2S猫头猫        await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
40bf6e62f2S猫头猫    }
41bf6e62f2S猫头猫
42927dbe93S猫头猫    // 2. 数据初始化
436780f402S猫头猫    /** 初始化路径 */
446780f402S猫头猫    await setupFolder();
451e263108S猫头猫    trace('文件夹初始化完成');
46bf6e62f2S猫头猫    // 加载配置
47ef714860S猫头猫    await Promise.all([
48ef714860S猫头猫        Config.setup(),
49ef714860S猫头猫        MediaMeta.setup(),
50ef714860S猫头猫        MusicSheet.setup(),
51ef714860S猫头猫        Network.setup(),
52ef714860S猫头猫    ]);
531e263108S猫头猫    trace('配置初始化完成');
54bf6e62f2S猫头猫    // 加载插件
5594a1b1fcS猫头猫    try {
56cfa0fc07S猫头猫        await TrackPlayer.setupPlayer({
57b882a19dS猫头猫            maxCacheSize:
58b882a19dS猫头猫                Config.get('setting.basic.maxCacheSize') ?? 1024 * 1024 * 512,
59cfa0fc07S猫头猫        });
6094a1b1fcS猫头猫    } catch (e: any) {
6194a1b1fcS猫头猫        if (
624060c00aS猫头猫            e?.message !==
634060c00aS猫头猫            'The player has already been initialized via setupPlayer.'
6494a1b1fcS猫头猫        ) {
6594a1b1fcS猫头猫            throw e;
6694a1b1fcS猫头猫        }
6794a1b1fcS猫头猫    }
68bf6e62f2S猫头猫    await TrackPlayer.updateOptions({
692aa88193S猫头猫        icon: ImgAsset.logoTransparent,
7003051250S猫头猫        alwaysPauseOnInterruption: true,
71e2257bd6S猫头猫        progressUpdateEventInterval: 1,
72bf6e62f2S猫头猫        capabilities: [
73bf6e62f2S猫头猫            Capability.Play,
74bf6e62f2S猫头猫            Capability.Pause,
75bf6e62f2S猫头猫            Capability.SkipToNext,
76bf6e62f2S猫头猫            Capability.SkipToPrevious,
77bf6e62f2S猫头猫        ],
78bf6e62f2S猫头猫        compactCapabilities: [
79bf6e62f2S猫头猫            Capability.Play,
80bf6e62f2S猫头猫            Capability.Pause,
81bf6e62f2S猫头猫            Capability.SkipToNext,
82bf6e62f2S猫头猫            Capability.SkipToPrevious,
83bf6e62f2S猫头猫        ],
84bf6e62f2S猫头猫        notificationCapabilities: [
85bf6e62f2S猫头猫            Capability.Play,
86bf6e62f2S猫头猫            Capability.Pause,
87bf6e62f2S猫头猫            Capability.SkipToNext,
88bf6e62f2S猫头猫            Capability.SkipToPrevious,
890d39db21S猫头猫        ],
900d39db21S猫头猫    });
911e263108S猫头猫    trace('播放器初始化完成');
924060c00aS猫头猫    await Cache.setup();
931e263108S猫头猫    trace('缓存初始化完成');
948b88e961S猫头猫    await PluginManager.setup();
951e263108S猫头猫    trace('插件初始化完成');
96927dbe93S猫头猫    await MusicQueue.setup();
971e263108S猫头猫    trace('播放列表初始化完成');
980e4173cdS猫头猫    await LocalMusicSheet.setup();
990e4173cdS猫头猫    trace('本地音乐初始化完成');
100a27adc20S猫头猫    Theme.setup();
101a27adc20S猫头猫    trace('主题初始化完成');
102*57277364S猫头猫    await LyricManager.setup();
1038b88e961S猫头猫
10495f955b7S猫头猫    StatusBar.setBackgroundColor('transparent');
10595f955b7S猫头猫    StatusBar.setTranslucent(true);
10634a18328S猫头猫    // Linking.addEventListener('url', (data) => {
10734a18328S猫头猫    //     console.log(data);
10834a18328S猫头猫    // })
10995f955b7S猫头猫
110c79c8a57S猫头猫    ErrorUtils.setGlobalHandler(error => {
111c79c8a57S猫头猫        errorLog('未捕获的错误', error);
112c79c8a57S猫头猫    });
113bf6e62f2S猫头猫}
1146c6f45bdS猫头猫
1156c6f45bdS猫头猫/** 初始化 */
1166c6f45bdS猫头猫async function setupFolder() {
1176780f402S猫头猫    await Promise.all([
118be0a3650S猫头猫        checkAndCreateDir(pathConst.dataPath),
1197f771613S猫头猫        checkAndCreateDir(pathConst.logPath),
1207f771613S猫头猫        checkAndCreateDir(pathConst.cachePath),
121c79c8a57S猫头猫        checkAndCreateDir(pathConst.pluginPath),
12294a1b1fcS猫头猫        checkAndCreateDir(pathConst.lrcCachePath),
1230e4173cdS猫头猫        checkAndCreateDir(pathConst.downloadPath).then(() => {
1240e4173cdS猫头猫            checkAndCreateDir(pathConst.downloadMusicPath);
1250e4173cdS猫头猫        }),
1266780f402S猫头猫    ]);
1276c6f45bdS猫头猫}
12894a1b1fcS猫头猫
12994a1b1fcS猫头猫export default async function () {
13094a1b1fcS猫头猫    try {
13194a1b1fcS猫头猫        await _bootstrap();
13294a1b1fcS猫头猫    } catch (e) {
13394a1b1fcS猫头猫        errorLog('初始化出错', e);
13494a1b1fcS猫头猫        console.log(e);
13594a1b1fcS猫头猫    }
13694a1b1fcS猫头猫    // 隐藏开屏动画
13794a1b1fcS猫头猫    console.log('HIDE');
13894a1b1fcS猫头猫    RNBootSplash.hide({fade: true});
13994a1b1fcS猫头猫}
140