{"id":49334148,"url":"https://github.com/karloskalcium/plex_linter","last_synced_at":"2026-04-27T00:03:28.246Z","repository":{"id":95509928,"uuid":"226719688","full_name":"karloskalcium/plex_linter","owner":"karloskalcium","description":"Linter for plex library issues","archived":false,"fork":false,"pushed_at":"2026-04-26T18:12:41.000Z","size":169,"stargazers_count":8,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-26T18:22:49.801Z","etag":null,"topics":["linter","plex","plex-api","plex-media-server","plex-server"],"latest_commit_sha":null,"homepage":"","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/karloskalcium.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-12-08T19:27:52.000Z","updated_at":"2026-04-26T18:02:34.000Z","dependencies_parsed_at":"2024-05-13T03:28:17.919Z","dependency_job_id":"1fbddb98-8ca5-46bf-b37c-5045967d741c","html_url":"https://github.com/karloskalcium/plex_linter","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/karloskalcium/plex_linter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karloskalcium%2Fplex_linter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karloskalcium%2Fplex_linter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karloskalcium%2Fplex_linter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karloskalcium%2Fplex_linter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/karloskalcium","download_url":"https://codeload.github.com/karloskalcium/plex_linter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karloskalcium%2Fplex_linter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32317171,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T23:26:28.701Z","status":"ssl_error","status_checked_at":"2026-04-26T23:26:25.802Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["linter","plex","plex-api","plex-media-server","plex-server"],"created_at":"2026-04-27T00:03:27.733Z","updated_at":"2026-04-27T00:03:28.240Z","avatar_url":"https://github.com/karloskalcium.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![made-with-python](https://img.shields.io/badge/Made%20with-Python-blue.svg?style=flat-square)](https://www.python.org/)\n[![LICENSE](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/karloskalcium/plex_linter/refs/heads/master/LICENSE)\n[![PYTHON](https://img.shields.io/badge/python-3.14-orange.svg)](https://docs.python.org/3.14/index.html)\n\n# Introduction\n\nPlex Linter is a python script that looks for various potential issues in your library, such as\n\n- Duplicate album titles (for albums that have been incorrectly split)\n- Duplicate artists (for artists that have been split)\n- Tracks without titles (sometimes Plex metadata deletes track titles)\n- Tracks linked to artists with Plex metadata that differ from what the MP3 tags say (requires running on the plex server and using the `--local` flag)\n  - Note that the linter only works for music libraries currently\n\n## Install\n\n### With pipx (recommended, no clone needed)\n\n```bash\npipx install git+https://github.com/karloskalcium/plex_linter.git\n```\n\n### From source (for development)\n\nRequirements: Python 3.14, [uv](https://docs.astral.sh/uv/), [just](https://just.systems/)\n\n```bash\ngit clone https://github.com/karloskalcium/plex_linter\ncd plex_linter\njust install\n```\n\n## Usage\n\nStart `plex_linter` — it will check for a config file at `~/.plex_linter/plex_linter.toml`, create one if it doesn't exist, and prompt for your Plex server URL and credentials.\n\n```bash\nplex_linter\n```\n\nTo check for mismatched tags (requires running on the Plex server with access to media files):\n\n```bash\nplex_linter --local\n```\n\nWhen running from source, prefix commands with `uv run`:\n\n```bash\nuv run plex_linter\nuv run plex_linter --local\n```\n\n## Configuration\n\n### Sample\n\n```toml\n# plex_linter.toml\n[server]\nserver_url = \"http://plex.your-server.com\"\nserver_token = \"{your-X-Plex-Token}\"\n\n[content]\nlibraries = [\n    \"Music\",\n    \"Audiobooks\"\n]\n```\n\n### Plex\n\n#### Plex Libraries\n\n1. Go to Plex and get all the names of your Plex Music Libraries you want to run the linter on\n\n   - Example Library:\n\n     ![](https://i.imgur.com/JFRTD1m.png)\n\n1. Under `libraries`, type in the Plex *Library Name* (exactly)\n\n1. Note that the linter only works for music libraries currently\n\n#### Plex Server URL\n\n- Your Plex server's URL\n  - This can be any format (e.g. \u003chttp://localhost:32400\u003e, \u003chttps://plex.domain.ltd\u003e)\n\n#### Plex Token\n\n1. Obtain a Plex Access Token:\n\n   - Fill in the Plex URL and Plex login credentials, at the prompt, on first run. This only occurs when there is no valid `plex_linter.toml` present.\n\n     or\n\n   - Visit https://support.plex.tv/hc/en-us/articles/204059436-Finding-an-authentication-token-X-Plex-Token\n\n______________________________________________________________________\n\n## Inspiration\n\nThis project started as a fork of https://github.com/l3uddz/plex_dupefinder and used a lot of that code as a starting point.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarloskalcium%2Fplex_linter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkarloskalcium%2Fplex_linter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarloskalcium%2Fplex_linter/lists"}