{"id":18115009,"url":"https://github.com/janw/drmeter","last_synced_at":"2025-12-30T14:59:06.760Z","repository":{"id":98526267,"uuid":"138467917","full_name":"janw/drmeter","owner":"janw","description":"[moved to codeberg] Dynamic Range (DR) meter","archived":true,"fork":false,"pushed_at":"2025-01-27T01:04:41.000Z","size":44514,"stargazers_count":22,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-03-27T23:51:07.147Z","etag":null,"topics":["audio-analysis","loudness-war","moved-to-codeberg","python"],"latest_commit_sha":null,"homepage":"https://codeberg.org/janw/drmeter","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/janw.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"janw","liberapay":"janw","ko_fi":"janwxyz"}},"created_at":"2018-06-24T09:03:59.000Z","updated_at":"2025-03-22T15:45:55.000Z","dependencies_parsed_at":"2023-03-12T23:15:48.479Z","dependency_job_id":"19ff16a5-0d25-4b71-a96f-09c2454fe530","html_url":"https://github.com/janw/drmeter","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janw%2Fdrmeter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janw%2Fdrmeter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janw%2Fdrmeter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janw%2Fdrmeter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/janw","download_url":"https://codeload.github.com/janw/drmeter/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246262490,"owners_count":20749170,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio-analysis","loudness-war","moved-to-codeberg","python"],"created_at":"2024-11-01T03:07:45.529Z","updated_at":"2025-12-13T23:03:07.236Z","avatar_url":"https://github.com/janw.png","language":"Python","funding_links":["https://github.com/sponsors/janw","https://liberapay.com/janw","https://ko-fi.com/janwxyz"],"categories":[],"sub_categories":[],"readme":"# Dynamic Range (DR) meter 🎧\n\n\u003c!-- markdownlint-disable MD033 MD013 --\u003e\n\u003cdiv align=\"center\"\u003e\n\n[![Tests](https://github.com/janw/drmeter/actions/workflows/tests.yaml/badge.svg)](https://github.com/janw/drmeter/actions/workflows/tests.yaml)\n[![Coverage Status](https://codecov.io/gh/janw/drmeter/branch/main/graph/badge.svg?token=N8DBXQTM74)](https://codecov.io/gh/janw/drmeter)\n[![Docker](https://github.com/janw/drmeter/actions/workflows/docker-build.yaml/badge.svg)](https://github.com/janw/drmeter/pkgs/container/drmeter)\n\n[![PyPI](https://img.shields.io/pypi/v/drmeter.svg)](https://pypi.org/project/drmeter/)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/drmeter.svg)](https://pypi.org/project/drmeter/)\n![PyPI - Downloads](https://img.shields.io/pypi/dm/drmeter)\n\n[![Linter/Formatter: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://docs.astral.sh/ruff/)\n[![Code style: Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://black.readthedocs.io/en/stable/)\n[![Dependency management: poetry](https://img.shields.io/badge/deps-poetry-blueviolet.svg)](https://python-poetry.org/docs/)\n\n\u003cp\u003eA Dynamic Range (DR) analyzer for audiofiles.\u003cp\u003e\n\n\u003ca href=\"https://asciinema.org/a/598647\" target=\"_blank\"\u003e\u003cimg alt=\"Asciicast of installing and using drmeter\" src=\"https://asciinema.org/a/598647.svg\" /\u003e\u003c/a\u003e\n\u003c/div\u003e\n\nThe algorithm has been reverse-engineered using the available information and officially endorsed software to calcuate the DR value. The analysis results of `drmeter` are verified to be within a ±0.5 absolute tolerance from the results produced by officially endorsed software (see #testing).\n\nThis project is in no way affiliated with the Pleasurize Music Foundation or its Dynamic Range Project.\n\n## Installation\n\nThe recommended method for installing `drmeter` is [pipx](https://pypa.github.io/pipx/):\n\n```bash\npipx install drmeter\n```\n\nAny regular `pip install drmeter` will do, too. The `drmeter` requires Python 3.9+ to run.\n\nTo use `drmeter` without installation, consider the [dockerized approach](#dockerized) below\n\n## Usage\n\nSee `drmeter --help` for usage instructions. `drmeter` expects a single path to a file or a directory to analyze, and defaults to an \"animated\" progress display, emitting the results to stdout in the process.\n\n```sh\n$ drmeter 'Nobody There (Beautiful Scars).wav'\nAnalyzing Dynamic Range of Nobody There (Beautiful Scars).wav ...\n\n╭──────────────────────────────────────────────────────────────────────╮\n│ DR            Peak          RMS   Filename                           │\n├──────────────────────────────────────────────────────────────────────┤\n│ DR12      -0.10 dB    -15.02 dB   Nobody There (Beautiful Scars).wav │\n╰──────────────────────────────────────────────────────────────────────╯\n```\n\nUsing the `--quiet/-q` flag will silence most of the output and only print the calculated DR score to stdout:\n\n```sh\n$ drmeter 'Nobody There (Beautiful Scars).wav' -q\nDR12\n```\n\nAlternatively `drmeter` supports a more detailed JSON-formatted output using the `--output/-o json` parameter, including both per-channel and totaled results. Using the `--output` parameter redirects the progress display to stderr, so that the formatted output can be piped to other applications or to file. If you do not require the progress display, it can be silenced using `--quiet/-q` here, too.\n\n```sh\n# Save a copy to file\n$ drmeter -ojson -q 'Nobody There (Beautiful Scars).wav' | tee dr.json\n{\n  \"filename\": \"/…/Nobody There (Beautiful Scars).wav\",\n  \"dr_score\": [\n    11.93,\n    11.63\n  ],\n  \"peak_db\": [\n    …\n  ]\n}\n```\n\n```sh\n# Parse JSON using jq\n$ drmeter -ojson -q 'Nobody There (Beautiful Scars).wav' | jq '.[].overall_dr_score'\n11.78\n```\n\n### Dockerized\n\nA container image of `drmeter` is available at `ghcr.io/janw/drmeter` with the `latest` tag pointing to the latest commit on the `main` branch. The following command (with the files you're looking to analyze in/below the current working directory) behaves very similarly to an installed version, accepting arguments directly as expected:\n\n```sh\ndocker run --rm --tty --workdir /src -v \"$PWD:/src\" \\\n    ghcr.io/janw/drmeter --output json path/to/files\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjanw%2Fdrmeter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjanw%2Fdrmeter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjanw%2Fdrmeter/lists"}