1import MusicQueue from '@/core/musicQueue'; 2import MusicSheet from '@/core/musicSheet'; 3import {check, PERMISSIONS, request} from 'react-native-permissions'; 4import TrackPlayer, {Capability} from 'react-native-track-player'; 5import 'react-native-get-random-values'; 6import Config from '@/core/config'; 7import RNBootSplash from 'react-native-bootsplash'; 8import pathConst from '@/constants/pathConst'; 9import {checkAndCreateDir} from '@/utils/fileUtils'; 10import {errorLog, trace} from '@/utils/log'; 11import MediaMeta from '@/core/mediaMeta'; 12import Cache from '@/core/cache'; 13import PluginManager from '@/core/pluginManager'; 14import Network from '@/core/network'; 15import {ImgAsset} from '@/constants/assetsConst'; 16import LocalMusicSheet from '@/core/localMusicSheet'; 17import {StatusBar} from 'react-native'; 18import Theme from '@/core/theme'; 19import LyricManager from '@/core/lyricManager'; 20 21/** app加载前执行 22 * 1. 检查权限 23 * 2. 数据初始化 24 * 3. 25 */ 26async function _bootstrap() { 27 // 1. 检查权限 28 const [readStoragePermission, writeStoragePermission] = await Promise.all([ 29 check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE), 30 check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE), 31 ]); 32 if ( 33 !( 34 readStoragePermission === 'granted' && 35 writeStoragePermission === 'granted' 36 ) 37 ) { 38 await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE); 39 await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE); 40 } 41 42 // 2. 数据初始化 43 /** 初始化路径 */ 44 await setupFolder(); 45 trace('文件夹初始化完成'); 46 // 加载配置 47 await Promise.all([ 48 Config.setup(), 49 MediaMeta.setup(), 50 MusicSheet.setup(), 51 Network.setup(), 52 ]); 53 trace('配置初始化完成'); 54 // 加载插件 55 try { 56 await TrackPlayer.setupPlayer({ 57 maxCacheSize: 58 Config.get('setting.basic.maxCacheSize') ?? 1024 * 1024 * 512, 59 }); 60 } catch (e: any) { 61 if ( 62 e?.message !== 63 'The player has already been initialized via setupPlayer.' 64 ) { 65 throw e; 66 } 67 } 68 await TrackPlayer.updateOptions({ 69 icon: ImgAsset.logoTransparent, 70 alwaysPauseOnInterruption: true, 71 progressUpdateEventInterval: 1, 72 capabilities: [ 73 Capability.Play, 74 Capability.Pause, 75 Capability.SkipToNext, 76 Capability.SkipToPrevious, 77 ], 78 compactCapabilities: [ 79 Capability.Play, 80 Capability.Pause, 81 Capability.SkipToNext, 82 Capability.SkipToPrevious, 83 ], 84 notificationCapabilities: [ 85 Capability.Play, 86 Capability.Pause, 87 Capability.SkipToNext, 88 Capability.SkipToPrevious, 89 ], 90 }); 91 trace('播放器初始化完成'); 92 await Cache.setup(); 93 trace('缓存初始化完成'); 94 await PluginManager.setup(); 95 trace('插件初始化完成'); 96 await MusicQueue.setup(); 97 trace('播放列表初始化完成'); 98 await LocalMusicSheet.setup(); 99 trace('本地音乐初始化完成'); 100 Theme.setup(); 101 trace('主题初始化完成'); 102 await LyricManager.setup(); 103 104 StatusBar.setBackgroundColor('transparent'); 105 StatusBar.setTranslucent(true); 106 // Linking.addEventListener('url', (data) => { 107 // console.log(data); 108 // }) 109 110 ErrorUtils.setGlobalHandler(error => { 111 errorLog('未捕获的错误', error); 112 }); 113} 114 115/** 初始化 */ 116async function setupFolder() { 117 await Promise.all([ 118 checkAndCreateDir(pathConst.dataPath), 119 checkAndCreateDir(pathConst.logPath), 120 checkAndCreateDir(pathConst.cachePath), 121 checkAndCreateDir(pathConst.pluginPath), 122 checkAndCreateDir(pathConst.lrcCachePath), 123 checkAndCreateDir(pathConst.downloadPath).then(() => { 124 checkAndCreateDir(pathConst.downloadMusicPath); 125 }), 126 ]); 127} 128 129export default async function () { 130 try { 131 await _bootstrap(); 132 } catch (e) { 133 errorLog('初始化出错', e); 134 console.log(e); 135 } 136 // 隐藏开屏动画 137 console.log('HIDE'); 138 RNBootSplash.hide({fade: true}); 139} 140