基于 React Native 新架构(TurboModules)构建的本地音乐库访问库,支持完整元数据读取。
- 🎵 丰富元数据 - 读取完整音频元数据,包括歌词、比特率、采样率等
- 🚀 TurboModules - 基于 React Native 新架构构建,性能卓越
- 📄 游标分页 - 高效处理大型音乐集合
- 🔍 灵活排序 - 支持曲目、专辑和艺术家的多种排序选项
- 📁 目录过滤 - 按目录路径过滤曲目(Android)
- 🔄 TypeScript - 完整类型定义
- 🎨 专辑封面 - 支持专辑封面图片
- 🤖 Android - 完整原生 Android 实现
- 🍎 iOS - 基于 MediaPlayer 框架的完整原生 iOS 实现
npm install @nodefinity/react-native-music-library
# 或
yarn add @nodefinity/react-native-music-libraryAndroid — 在 android/app/src/main/AndroidManifest.xml 中添加:
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />iOS — 在 Info.plist 中添加:
<key>NSAppleMusicUsageDescription</key>
<string>此应用需要访问您的音乐库。</string>import {
getTracksAsync,
getAlbumsAsync,
getArtistsAsync,
} from '@nodefinity/react-native-music-library';
// 获取前 20 首曲目,按标题升序排序
const result = await getTracksAsync({ sortBy: ['title', true] });
console.log(result.items); // Track[]
console.log(result.hasNextPage); // boolean
console.log(result.endCursor); // string | undefined
// 获取下一页
const nextPage = await getTracksAsync({
sortBy: ['title', true],
first: 20,
after: result.endCursor,
});返回音乐库中的分页曲目列表。
getTracksAsync(options?: TrackOptions): Promise<PaginatedResult<Track>>TrackOptions
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
first |
number |
20 |
最多返回的条数 |
after |
string |
— | 上一页的 endCursor |
sortBy |
TrackSortByKey | [TrackSortByKey, boolean] | (...)[] |
'default' |
排序字段,或 [字段, 是否升序] 元组 |
directory |
string |
— | 按目录路径过滤(仅 Android) |
TrackSortByKey:'default' \| 'title' \| 'artist' \| 'album' \| 'duration' \| 'createdAt' \| 'modifiedAt' \| 'fileSize'
返回单首曲目的详细音频元数据。
getTrackMetadataAsync(trackId: string): Promise<TrackMetadata>返回专辑内的所有曲目(不分页)。
getTracksByAlbumAsync(albumId: string): Promise<Track[]>返回某位艺术家的分页曲目列表。
getTracksByArtistAsync(artistId: string, options?: TrackOptions): Promise<PaginatedResult<Track>>返回分页专辑列表。
getAlbumsAsync(options?: AlbumOptions): Promise<PaginatedResult<Album>>AlbumOptions
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
first |
number |
20 |
最多返回的条数 |
after |
string |
— | 上一页的 endCursor |
sortBy |
AlbumSortByKey | [AlbumSortByKey, boolean] | (...)[] |
'default' |
排序字段,或 [字段, 是否升序] 元组 |
AlbumSortByKey:'default' \| 'title' \| 'artist' \| 'trackCount' \| 'year'
返回某位艺术家的所有专辑(不分页)。
getAlbumsByArtistAsync(artistId: string): Promise<Album[]>返回分页艺术家列表。
getArtistsAsync(options?: ArtistOptions): Promise<PaginatedResult<Artist>>ArtistOptions
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
first |
number |
20 |
最多返回的条数 |
after |
string |
— | 上一页的 endCursor |
sortBy |
ArtistSortByKey | [ArtistSortByKey, boolean] | (...)[] |
'default' |
排序字段,或 [字段, 是否升序] 元组 |
ArtistSortByKey:'default' \| 'title' \| 'trackCount' \| 'albumCount'
| 字段 | 类型 | 说明 |
|---|---|---|
id |
string |
唯一标识符 |
title |
string |
曲目标题 |
artist |
string |
艺术家名称 |
artwork |
string? |
封面图片 URI(可能为空) |
album |
string |
专辑名称 |
duration |
number |
时长(秒) |
url |
string |
文件 URI |
createdAt |
number |
添加时间(Unix 时间戳,秒) |
modifiedAt |
number |
修改时间(Unix 时间戳,秒) |
fileSize |
number |
文件大小(字节) |
| 字段 | 类型 | 说明 |
|---|---|---|
id |
string |
曲目 ID |
duration |
number |
时长(秒) |
bitrate |
number |
比特率(kbps) |
sampleRate |
number |
采样率(Hz) |
channels |
string |
声道数 |
format |
string |
音频格式(如 "AAC"、"MP3") |
title |
string |
标题标签 |
artist |
string |
艺术家标签 |
album |
string |
专辑标签 |
year |
number |
发行年份 |
genre |
string |
流派标签 |
track |
number |
音轨号 |
disc |
number |
碟号 |
composer |
string |
作曲家标签 |
lyricist |
string |
作词人标签 |
lyrics |
string |
内嵌歌词 |
albumArtist |
string |
专辑艺术家标签 |
comment |
string |
备注标签 |
| 字段 | 类型 | 说明 |
|---|---|---|
id |
string |
唯一标识符 |
title |
string |
专辑名称 |
artist |
string |
主要艺术家 |
artwork |
string? |
封面图片 URI(可能为空) |
trackCount |
number |
曲目数量 |
year |
number? |
发行年份 |
| 字段 | 类型 | 说明 |
|---|---|---|
id |
string |
唯一标识符 |
title |
string |
艺术家名称 |
albumCount |
number |
专辑数量 |
trackCount |
number |
曲目总数 |
| 字段 | 类型 | 说明 |
|---|---|---|
items |
T[] |
结果数组 |
hasNextPage |
boolean |
是否还有更多数据 |
endCursor |
string? |
传入 after 以获取下一页 |
totalCount |
number? |
总数量(计算可能较慢) |
async function fetchAllTracks() {
const allTracks = [];
let cursor: string | undefined;
do {
const result = await getTracksAsync({ first: 50, after: cursor });
allTracks.push(...result.items);
cursor = result.hasNextPage ? result.endCursor : undefined;
} while (cursor);
return allTracks;
}详情请参阅 CONTRIBUTING.md。
MIT 许可证 - 详情请参阅 LICENSE。




