拆解:多平臺(tái)音源如何統(tǒng)一接入一個(gè)播放器)
MusicFree插件化架構(gòu)拆解多平臺(tái)音源如何統(tǒng)一接入一個(gè)播放器【免費(fèi)下載鏈接】MusicFree插件化、定制化、無(wú)廣告的免費(fèi)音樂(lè)播放器項(xiàng)目地址: https://gitcode.com/GitHub_Trending/mu/MusicFreeMusicFree 是一個(gè)插件化的免費(fèi)音樂(lè)播放器本體不內(nèi)置任何音源搜索、播放、歌單導(dǎo)入、歌詞獲取全部由外部插件完成。本文基于倉(cāng)庫(kù)代碼拆解主應(yīng)用如何把各插件的異構(gòu)輸出收斂為統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)。設(shè)計(jì)起點(diǎn)IMusicItem 數(shù)據(jù)契約無(wú)論歌曲來(lái)自哪個(gè)平臺(tái)進(jìn)入應(yīng)用后的形態(tài)都是 src/types/music.d.ts 中定義的IMusicItem插件與播放器之間的一切數(shù)據(jù)交換都圍繞這個(gè)接口展開(kāi)export interface IMusicItem { id: string; platform: string; artist: string; title: string; duration: number; // 時(shí)長(zhǎng)單位秒 album: string; artwork: string; source?: PartialRecordIQualityKey, IMediaSource; lyric?: ILyric.ILyricSource; }platform字段標(biāo)記歌曲歸屬后續(xù)主應(yīng)用靠它反查對(duì)應(yīng)插件。音質(zhì)鍵IQualityKey只有l(wèi)ow / standard / high / super四檔各平臺(tái)的原始音質(zhì)標(biāo)識(shí)都要在插件內(nèi)部映射到這四檔。時(shí)長(zhǎng)統(tǒng)一為秒封面統(tǒng)一為 URL。插件加載層沙箱執(zhí)行與依賴白名單插件本質(zhì)是一個(gè)滿足插件協(xié)議的 CommonJS 模塊。加載邏輯在 src/core/pluginManager/plugin.ts主應(yīng)用通過(guò)Function構(gòu)造器在受限環(huán)境中運(yùn)行插件代碼插件拿到的require是_require白名單實(shí)現(xiàn)只提供 axios、cheerio、dayjs、qs、webdav 等少量包。插件以代碼的 SHA256 作為唯一 hash用于去重和卸載安裝支持本地.js文件與 URL 兩種方式插件聲明的appVersion與當(dāng)前版本不匹配時(shí)會(huì)被拒絕加載。用戶側(cè)的啟用、排序、用戶變量、替代插件等狀態(tài)由 src/core/pluginManager/meta.ts 持久化到 MMKV。轉(zhuǎn)換層包裝器如何統(tǒng)一各平臺(tái)輸出所有插件方法都被PluginMethodsWrapper包了一層插件只需返回原始數(shù)據(jù)主應(yīng)用在結(jié)果上逐項(xiàng)調(diào)用resetMediaItemsrc/utils/mediaUtils.ts補(bǔ)全platform字段并清理內(nèi)部序列化字段保證列表中的每一項(xiàng)都符合契約mediaItem.platform platform ?? mediaItem.platform; mediaItem[internalSerializeKey] undefined;插件未實(shí)現(xiàn)的方法一律返回兜底空結(jié)果而不是拋錯(cuò)單個(gè)插件異常不會(huì)阻塞其他插件。音源獲取的四級(jí)優(yōu)先鏈getMediaSource按音質(zhì)等級(jí)獲取可播放地址的執(zhí)行順序是本地文件存在則直接返回file://路徑否則查MediaCache緩存再否則調(diào)用插件的getMediaSource解析真實(shí)地址失敗自動(dòng)重試一次最后回退到item.qualities或item.url。緩存行為受插件cacheControl字段控制聲明no-cache的插件只在離線時(shí)回落到緩存兜底。歌詞的多級(jí)來(lái)源getLyric按優(yōu)先級(jí)依次嘗試用戶手動(dòng)關(guān)聯(lián)的歌詞、手動(dòng)上傳的本地.lrc、MediaCache緩存、插件getLyric、舊版lrc字段下載本地音樂(lè)則讀 MP3 內(nèi)嵌歌詞或同名.lrc文件。拿到的歌詞寫入本地.lrc緩存文件并記入MediaCache緩存上限 800 條超限時(shí)先清理一半條目及其歌詞文件。實(shí)際效果與收益對(duì)插件開(kāi)發(fā)者只需實(shí)現(xiàn)協(xié)議函數(shù)并處理接口輸入輸出分頁(yè)、重試、緩存、歌詞回退全部由主應(yīng)用統(tǒng)一完成對(duì)使用者可以安裝、排序、禁用插件還能給某個(gè)平臺(tái)設(shè)置替代音源插件對(duì)維護(hù)者新增音源平臺(tái)只需新插件主應(yīng)用代碼不用改。播放器與音源解耦后第三方插件的故障不會(huì)波及主應(yīng)用這也是該項(xiàng)目小而美定位的工程基礎(chǔ)?!久赓M(fèi)下載鏈接】MusicFree插件化、定制化、無(wú)廣告的免費(fèi)音樂(lè)播放器項(xiàng)目地址: https://gitcode.com/GitHub_Trending/mu/MusicFree創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考