An audio file metadata reader built primarily for React Native (mobile only) supporting tags used in MissingCore/Music
.
Note
Supports React Native's "New Architecture".
Also works in a plain Node.js environment.
Extension | Format | Additional Information |
---|---|---|
.flac |
- FLAC | |
.mp3 |
- ID3v1 - ID3v2 |
- Unsynchronisation supported* - Tag at end of file supported (ID3v2.4)* - All other flags ignored |
.mp4 /.m4a |
- MP-4 Part 14 (a.k.a. MP4) |
* Currently untested as I have no
.mp3
files that meets those conditions. Feel free to submit an issue to tell me if it works or doesn't work.
Important
Currently, this library only supports React Native 0.74.0
or Expo SDK 51
and newer due to the introduction of native atob()
& btoa()
support.
In the future, we may support older versions with a peer dependency of base-64
.
This library supports using either expo-file-system
or @dr.pogodin/react-native-fs
(a more actively maintained fork of react-native-fs
).
Note: Using
@dr.pogodin/react-native-fs
withexpo
requires a bare workflow.
Regardless of which file system library you use, they perform relatively the same.
npx expo install @missingcore/audio-metadata expo-file-system
npm install @missingcore/audio-metadata @dr.pogodin/react-native-fs
This library supports Node.js as it supplements the file system operations by using native Node.js modules.
import { getAudioMetadata } from '@missingcore/audio-metadata';
const uri = 'file:///storage/emulated/0/Music/Silence.mp3';
const wantedTags = ['album', 'albumArtist', 'artist', 'name', 'track', 'year'] as const;
// Of course with `await`, use this inside an async function or use `Promise.then()`.
const data = await getAudioMetadata(uri, wantedTags);
/*
Returns:
{
fileType: 'mp3',
format: 'ID3v2.3',
metadata: {
album: 'Void';
albumArtist: 'Nothing';
artist: 'Nothing';
name: 'Silence';
track: 1;
year: 2024;
}
}
*/
The full list of supported tags found here.
type AudioMetadata = {
album: string;
albumArtist: string;
artist: string;
artwork: string; // A base64 image string.
name: string;
track: number;
year: number;
};
❗Note❗ that not all of the requested metadata may be present in the file read. In the returned metadata
value, all the fields we want are "optional" (ie: its value can be undefined
).