npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

maimai_music_metadata

v1.0.0

Published

maimai DX music metadata and cover images | 舞萌 DX 曲目数据及曲绘

Readme

maimai Music Metadata

English | 中文

maimai DX music metadata and cover images.

Usage

npm (ESM/CJS)

npm install maimai_music_metadata
import { loadFullMetadata, convertCompactedToNormal, compactMusicMetadata } from "maimai_music_metadata";

// Fetch the hosted compacted metadata and expand it to the normal shape with full typings
const metadata = await loadFullMetadata();

// Or convert a local compacted payload
const normal = convertCompactedToNormal(compactedPayload);

// Convert back to the compacted representation when you need to save bandwidth
const compacted = compactMusicMetadata(normal);

Browser <script> tag

Use the prebuilt IIFE bundle (global name MaimaiMetadata).

<script src="https://unpkg.com/maimai_music_metadata/dist/index.js"></script>
<script>
    (async () => {
        const metadata = await MaimaiMetadata.loadFullMetadata();
        console.log(metadata.musics.length);
    })();
</script>

Table of Contents

File Types

meta.json / meta.unformatted.json

URL: https://meta.salt.realtvop.top/meta.json https://meta.salt.realtvop.top/meta.unformatted.json

export interface MusicMetadata {
    musics: Music[];
    versions: Version[];
}

meta.compacted.json

URL: https://meta.salt.realtvop.top/meta.compacted.json

export interface MusicMetadataCompacted {
    musics: MusicCompacted[];
    versions: VersionCompacted[];
}

Cover Images

const getImageUrl = (id: string | number) => `http://meta.salt.realtvop.top/covers/00${id.toString().padStart(6, '0').substring(2)}.png`;

Data Structure

Enums & Constants

MusicDifficultyID

| Value | Difficulty | | :--- | :--- | | 0 | Basic | | 1 | Advanced | | 2 | Expert | | 3 | Master | | 4 | ReMaster | | 10 | Utage |

AvalibleRegion

| Value | Region | | :--- | :--- | | "jp" | Japan | | "intl" | International | | "cn" | China | | "us" | USA |

Categories

export const categories: string[] = [
    "POPS&アニメ",
    "niconico&ボーカロイド",
    "東方Project",
    "ゲーム&バラエティ",
    "maimai",
    "オンゲキ&CHUNITHM",
    "宴会場",
];

Normal Format

Corresponds to meta.json and meta.unformatted.json.

Music

interface Music {
    id: number;       // < 10000, same for sd and dx
    title: string;
    artist: string;
    bpm: number;

    aliases?: {
        cn: string[]; // Chinese aliases
    };

    category: string; // String from Categories
    isLocked: boolean; // Needs unlocking

    charts: Chart[];
}

Chart

interface Chart {
    type: "sd" | "dx" | "utage";
    difficulty: MusicDifficultyID;
    level: string; // Display level, e.g. "14+"
    internalLevel: number; // Internal level value
    version: string; // Version name
    regionVersionOverride?: Partial<Record<AvalibleRegion, string | number>>; // Region-specific version overrides when different from `version`

    noteDesigner: string;
    noteCounts: {
        tap: number;
        hold: number;
        slide: number;
        touch: number | null; // null for standard (sd) charts
        break: number;
        total: number;
    };

    avalibleRegions: AvalibleRegion[];
}

Version

interface Version {
    version: string; // Full version name
    word: string; // One-character abbreviation
    releaseDate: string; // YYYY-MM-DD
    cnVerOverride: number | null; // Year for Chinese version specific naming
}

Compacted Format

Corresponds to meta.compacted.json. Uses arrays to store data for smaller file size.

MusicCompacted

type MusicCompacted = [
    number, // 0. id
    string, // 1. title
    string, // 2. artist
    number, // 3. bpm

    number, // 4. categoryIndex (index in categories array)
    boolean, // 5. isLocked

    ChartCompacted[], // 6. charts
    string[] | null, // 7. aliasesCn
]

ChartCompacted

type ChartCompacted = [
    number, // 0. type: 0=sd, 1=dx, 2=utage
    MusicDifficultyID, // 1. difficulty
    string, // 2. levelString
    number, // 3. internalLevel
    number, // 4. versionIndex (index in versions array)
    [AvalibleRegion, string | number][] | null, // 5. regionVersionOverrides as [region, overrideVersion]

    string, // 6. noteDesigner
    [number, number, number | null, number, number], // 7. noteCounts: [tap, hold, slide, touch, break]

    AvalibleRegion[], // 8. avalibleRegions
]

VersionCompacted

type VersionCompacted = [
    string, // 0. version
    string, // 1. word
    string, // 2. releaseDate
    number | null, // 3. cnVerOverride
]