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