{"id":14633137,"url":"https://github.com/supermihi/pytaglib","last_synced_at":"2026-03-02T03:32:14.625Z","repository":{"id":649923,"uuid":"2276852","full_name":"supermihi/pytaglib","owner":"supermihi","description":"Python audio tagging library","archived":false,"fork":false,"pushed_at":"2026-02-04T13:56:06.000Z","size":1070,"stargazers_count":201,"open_issues_count":10,"forks_count":29,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-02-13T23:47:39.934Z","etag":null,"topics":["metadata","python","taglib","tags"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/supermihi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2011-08-26T21:57:43.000Z","updated_at":"2026-02-04T22:41:35.000Z","dependencies_parsed_at":"2022-07-05T06:01:10.132Z","dependency_job_id":"e91d20a8-ec11-4c9b-b7e3-04af3ebff970","html_url":"https://github.com/supermihi/pytaglib","commit_stats":{"total_commits":203,"total_committers":9,"mean_commits":"22.555555555555557","dds":0.2561576354679803,"last_synced_commit":"39aabb26f4d6016c110794361b20b7fb76e64ecc"},"previous_names":[],"tags_count":36,"template":false,"template_full_name":null,"purl":"pkg:github/supermihi/pytaglib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supermihi%2Fpytaglib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supermihi%2Fpytaglib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supermihi%2Fpytaglib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supermihi%2Fpytaglib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/supermihi","download_url":"https://codeload.github.com/supermihi/pytaglib/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supermihi%2Fpytaglib/sbom","scorecard":{"id":859657,"data":{"date":"2025-08-11","repo":{"name":"github.com/supermihi/pytaglib","commit":"9e315c2b932d96fa54c2477a82747d0d9f211c87"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.2,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/6 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/default.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/default.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/supermihi/pytaglib/default.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/default.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/supermihi/pytaglib/default.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/default.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/supermihi/pytaglib/default.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/default.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/supermihi/pytaglib/default.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/default.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/supermihi/pytaglib/default.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/default.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/supermihi/pytaglib/default.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/default.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/supermihi/pytaglib/default.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/default.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/supermihi/pytaglib/default.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/default.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/supermihi/pytaglib/default.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/default.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/supermihi/pytaglib/default.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/default.yml:16","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/default.yml:48"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-24T00:53:08.517Z","repository_id":649923,"created_at":"2025-08-24T00:53:08.517Z","updated_at":"2025-08-24T00:53:08.517Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29991764,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T01:47:34.672Z","status":"online","status_checked_at":"2026-03-02T02:00:07.342Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["metadata","python","taglib","tags"],"created_at":"2024-09-09T17:01:03.422Z","updated_at":"2026-03-02T03:32:14.620Z","avatar_url":"https://github.com/supermihi.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"# **pytaglib**\n\n[![PyPI](https://img.shields.io/pypi/v/pytaglib.svg)](https://pypi.org/project/pytaglib/)\n\npytaglib is a [Python](https://www.python.org) audio tagging library. It is cross-platform and very simple to use yet fully featured:\n\n- [supports more than a dozen file formats](https://taglib.org/) including mp3, flac, ogg, wma, and mp4,\n- supports arbitrary, non-standard tag names,\n- supports multiple values per tag,\n- supports reading and writing embedded pictures (cover art).\n\npytaglib is a very thin wrapper around the fast and rock-solid [TagLib](https://taglib.org/) C++ library.\n\n## News\n\n_2026-02-03_ pytaglib-3.2.0 has been released.\n\n- add support for embedded pictures and other binary data\n- drop support for Python 3.9 (EOL)\n\nFor a full list of changes in this and previous releases, see the [Changelog](CHANGELOG.md).\n\n## Install\n\nUse your favorite Python package manager to install the `pytaglib` package. Example when using [pip](https://pip.pypa.io/en/stable/):\n\n        pip install pytaglib\n\nIn most cases, this should pick a provided binary wheel that bundles the native TagLib library suitable for your platform. If it doesn't, and the\ninstallation fails, see [below](#installation-notes).\n\n## Usage\n\n```python\n\u003e\u003e\u003e import taglib\n\u003e\u003e\u003e with taglib.File(\"/path/to/my/file.mp3\", save_on_exit=True) as song:\n\u003e\u003e\u003e     song.tags\n{'ARTIST': ['piman', 'jzig'], 'ALBUM': ['Quod Libet Test Data'], 'TITLE': ['Silence'], 'GENRE': ['Silence'], 'TRACKNUMBER': ['02/10'], 'DATE': ['2004']}\n\n\u003e\u003e\u003e     song.length\n239\n\u003e\u003e\u003e     song.tags[\"ALBUM\"] = [\"White Album\"] # always use lists, even for single values\n\u003e\u003e\u003e     del song.tags[\"DATE\"]\n\u003e\u003e\u003e     song.tags[\"GENRE\"] = [\"Vocal\", \"Classical\"]\n\u003e\u003e\u003e     song.tags[\"PERFORMER:HARPSICHORD\"] = [\"Ton Koopman\"]\n\u003e\u003e\u003e # with save_on_exit=True, file will be saved at the end of the 'with' block\n```\n\n### Pictures (Cover Art)\n\npytaglib supports reading and writing embedded pictures (cover art) for formats that support it (MP3, FLAC, etc.):\n\n```python\n\u003e\u003e\u003e import taglib\n\u003e\u003e\u003e f = taglib.File(\"song.mp3\")\n\n\u003e\u003e\u003e # Read existing pictures\n\u003e\u003e\u003e for pic in f.pictures:\n...     print(f\"{pic.picture_type}: {pic.mime_type}, {len(pic.data)} bytes\")\nFront Cover: image/jpeg, 50000 bytes\n\n\u003e\u003e\u003e # Add a new picture\n\u003e\u003e\u003e with open(\"cover.jpg\", \"rb\") as img:\n...     f.pictures = [taglib.Picture(\n...         data=img.read(),\n...         mime_type=\"image/jpeg\",\n...         picture_type=\"Front Cover\"\n...     )]\n\u003e\u003e\u003e f.save()\n\n\u003e\u003e\u003e # Remove all pictures\n\u003e\u003e\u003e f.pictures = []\n\u003e\u003e\u003e f.save()\n```\n\nFor detailed API documentation, use the docstrings of the `taglib.File` class or view the [source code](src/taglib.pyx) directly.\n\n## `pyprinttags`\n\nThis package also installs the `pyprinttags` script. It takes one or more files as\ncommand-line parameters and will display all known metadata of that files on the terminal.\nIf unsupported tags (a.k.a. non-textual information) are found, they can optionally be removed\nfrom the file.\n\n## Installation Notes\n\nThings are a bit more complicated than usual with Python because pytaglib requires the native (C++) TagLib library.\n\nIf there are no binary wheels for your platform, or you want to manually\ncompile pytaglib, you will need to have Taglib installed with development headers,\nand also development tools for Python.\n\nOn Ubuntu, Mint and other Debian-Based distributions, install\nthe `libtag1-dev` and `python-dev` packages. On Fedora and friends, these are called `taglib-devel` and `python-devel`, respectively. On a Mac, use HomeBrew to install the `taglib` package. For Windows, see below.\n\nAs an alternative, run `python build_native_taglib.py` in this directory to\nautomatically download and build the latest Taglib version into the `lib/taglib-cpp` subdirectory (also works on\nWindows).\n\nThis requires Python and a suitable compiler to be installed; specific instructions are beyond the\nscope of this README.\n\n### Linux: Distribution-Specific Packages\n\n- Debian- and Ubuntu-based linux flavors have binary packages for the Python 3 version, called `python3-taglib`. Unfortunatelly, they are heavily outdated, so you should instally the recent version via `pip` whenever possible.\n- For Arch users, there is a [package](https://aur.archlinux.org/packages/python-pytaglib/) in the user repository (AUR).\n\n### Manual Compilation: General\n\nTo create a binary wheel for your platform, use any PEP-517 compatible build frontend. Example using [build](https://github.com/pypa/build):\n\n        python -m build\n\nor with uv:\n\n        uv build\n\nwhich will place the wheel inside the `dist` directory.\n\n### Compilation: Windows\n\nInstall MS Visual Studio Build Tools (or the complete IE) and include the correct compiler version as detailed [here](https://wiki.python.org/moin/WindowsCompilers). Also enable _cmake_ in the Visual Studio Installer.\n\nThen:\n\n- open the VS native tools command prompt\n- navigate to the _pytaglib_ repository\n- run `python build_native_taglib.py` which will download and build the latest official TagLib release\n- run `python setup.py install`\n\n## Development\n\nTo start hacking (contributions welcome!), clone the repository and set up a project environment with your favorite tool. I use [uv](https://docs.astral.sh/uv/), where you should need only two commands for most workflows:\n\n    # set up virtual environment, run cythonize, compile\n    $ uv sync --reinstall\n\n    # run tests\n    $ uv run pytest\n## Contact\n\nFor bug reports or feature requests, please use the\n[issue tracker](https://github.com/supermihi/pytaglib/issues) on GitHub. For anything else, contact\nme by [email](mailto:michaelhelmling@posteo.de).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsupermihi%2Fpytaglib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsupermihi%2Fpytaglib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsupermihi%2Fpytaglib/lists"}