PHPackages                             bffdotfm/normcore - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. bffdotfm/normcore

ActiveLibrary

bffdotfm/normcore
=================

A text wrangling library to help normalize music metadata

v0.10(4y ago)011MITPHPPHP &gt;=7.0

Since Dec 10Pushed 4y ago2 watchersCompare

[ Source](https://github.com/BFFdotFM/normcore)[ Packagist](https://packagist.org/packages/bffdotfm/normcore)[ Docs](https://github.com/bffdotfm/normcore)[ Fund](https://bff.fm/donate)[ RSS](/packages/bffdotfm-normcore/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (2)Versions (8)Used By (0)

Normcore
========

[](#normcore)

**Normcore** is a PHP library for wrangling consistent representations of music metadata fields: artist names, track titles, album names and record labels cleaned and condense into identifiers.

Created by BFF.fm — community radio from the heart of San Francisco. If you find this useful, please consider a donation to help keep our station on air: .

Requirements
------------

[](#requirements)

- PHP 7+

Usage
-----

[](#usage)

```
use BFFdotFM\Normcore;

Normcore::keyArtistName('Godspeed you! Black emperor'); // godspeedyoublackemperor
Normcore::CleanArtistName('Open Mike Eagle feat. Video Dave'); // Open Mike Eagle

Normcore::keyAlbumTitle('Godspeed you! Black emperor'); // completeworksvolume2
Normcore::cleanAlbumTitle('The Complete Works (Volume Two)'); // The Complete Works (Volume 2)

Normcore::keyTrackTitle('A Caged Bird / Imitations of Life (feat. Roots Manuva)') // cagedbirdimitationsoflife
Normcore::cleanTrackTitle('The Complete Works (Volume Two)'); // The Complete Works (Volume 2)

Normcore::keyRecordLabelName('Retromedia Entertainment Group, Inc.'); // retromedia
Normcore::cleanRecordLabelName('℗ 1985 Beggars Banquet Records Ltd'); // Beggars Banquet

```

Philosophy
----------

[](#philosophy)

BFF.fm shows track metadata from DJs while songs are played: This data is generally crowdsourced from humans (although some DJs may use automated integrations from their playback software), ergo we see variations and errors. The purpose of Normcore is try and collapse a reasonable % of those variants into reliable tags, such that tracking data can be effectively aggregated.

It does not aim to magically fix every bad tag (Four Tet has a side project where track titles are elaborately decorative Unicode… it's OK if that slips through this particular net.)

Two functions are provided for each metadata type: `clean` and `key`. Clean makes a reasonable effort to tidy names for display, while Key collapses down to a lowercase identifier that can be used in URL slugs and elsewhere. Clean functions are intended to work reliably in most cases, but then used in systems where manual override and editing is possible (e.g. the punctuation in “...and you will know us by the trail of dead” and “Godspeed You! Black Emperor” may be lost in the interests of cleaning more common irregularities in how that punctuation may have been entered for other bands.)

Normcore reduces metadata down to identifiers — therefore, “featured” artists in track metadata will be discard. This is meant as no disrespect toward collaborative artists, but because there is inconsistency when crediting contributors in the artist, album, or title field. Long ago, Last.FM and Musicbrainz tried pretty hard to encourage people to use “(feat. Artist, Artist)” form in track titles specifically, rather than other tags, but the struggle continues. A future extension of this project may include an “extract contributors” function so that the data can be indexed.

Contributions
-------------

[](#contributions)

Contributions, improvements, and patches are welcome, participation is subject to the BFF.fm [developer code of conduct](https://developer.bff.fm/about/code-of-conduct).

###  Health Score

19

—

LowBetter than 10% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity5

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity39

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~14 days

Total

7

Last Release

1536d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/7bfc0f194bdce08e0749f43bf81ac30fa53f8c9e707c39f55de320e337d3d56b?d=identicon)[BenWard](/maintainers/BenWard)

---

Top Contributors

[![BenWard](https://avatars.githubusercontent.com/u/3153?v=4)](https://github.com/BenWard "BenWard (57 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/bffdotfm-normcore/health.svg)

```
[![Health](https://phpackages.com/badges/bffdotfm-normcore/health.svg)](https://phpackages.com/packages/bffdotfm-normcore)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
