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. [Utility &amp; Helpers](/categories/utility)
4. /
5. bffdotfm/normcore

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

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

A text wrangling library to help normalize music metadata

v0.13(2mo ago)016MITPHPPHP &gt;=7.0

Since Dec 10Pushed 2mo 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 today

READMEChangelogDependencies (4)Versions (11)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

37

—

LowBetter than 81% of packages

Maintenance87

Actively maintained with recent releases

Popularity6

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 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 ~183 days

Recently: every ~398 days

Total

10

Last Release

63d 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 (60 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)
```

###  Alternatives

[helgesverre/extractor

AI-Powered Data Extraction for your Laravel application.

22547.5k](/packages/helgesverre-extractor)[sintret/yii2-gii-adminlte

Yii2 Generator extension for Gii plugin with adminlte and base on dynagrid. upload excel to system to with log upload

229.7k2](/packages/sintret-yii2-gii-adminlte)

PHPackages © 2026

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