{"id":24678,"library":"syncedlyrics","title":"syncedlyrics","description":"A Python library and CLI tool to fetch synchronized lyrics in LRC format from multiple providers (Musixmatch, Deezer, Genius, Lrclib, NetEase). Version 1.0.1, supports Python >=3.8. Active development with monthly releases.","status":"active","version":"1.0.1","language":"python","source_language":"en","source_url":"https://github.com/rtcq/syncedlyrics","tags":["lyrics","lrc","synchronized","music","cli"],"install":[{"cmd":"pip install syncedlyrics","lang":"bash","label":"Install from PyPI"}],"dependencies":[{"reason":"Used for fuzzy matching search results to find best match.","package":"rapidfuzz","optional":false},{"reason":"HTTP requests to lyrics providers.","package":"requests","optional":false}],"imports":[{"note":"The main function is `search`. Importing the module directly and calling `syncedlyrics.search(...)` also works, but the idiomatic way is to import `search` directly.","wrong":"import syncedlyrics","symbol":"search","correct":"from syncedlyrics import search"},{"note":"LRCFile is a dataclass for parsed LRC content. Available since v0.4.0.","wrong":null,"symbol":"LRCFile","correct":"from syncedlyrics import LRCFile"}],"quickstart":{"code":"from syncedlyrics import search\n\nlrc = search('Kiss Me Until My Lips Fall Off')\nif lrc:\n    print(lrc[:200])\nelse:\n    print('No lyrics found')","lang":"python","description":"Fetch synchronized lyrics for a song. Returns LRC-formatted string or None. For translations, use `lrc = search('...', lang='fr')`."},"warnings":[{"fix":"If you rely on plain lyrics falling back, update calls to include `allow_plain=True`.","message":"In v1.0.0, the default behavior changed: `allow_plain` parameter now defaults to `False` (previously `True`). Previously, if no synced lyrics were found, plain (unsynced) lyrics would be returned. Now you must explicitly set `allow_plain=True` to get plain lyrics.","severity":"breaking","affected_versions":">=1.0.0"},{"fix":"No action required unless you were dependent on the old ordering; use `providers` parameter to restrict providers if needed.","message":"In v1.0.0, the search function now returns the best match from all providers instead of the first synced result. This may change the returned lyrics for songs with multiple matches.","severity":"breaking","affected_versions":">=1.0.0"},{"fix":"Always check if the returned value is None before processing. Consider implementing retries with exponential backoff if you see frequent failures.","message":"Musixmatch provider may return empty results or raise exceptions if API limits are hit. The library catches HTTP errors but may return None silently.","severity":"gotcha","affected_versions":"all"},{"fix":"Upgrade Python to >=3.8.","message":"Python 3.7 support was dropped in v0.7.0.","severity":"deprecated","affected_versions":"<0.7.0"}],"env_vars":null,"last_verified":"2026-05-01T00:00:00.000Z","next_check":"2026-07-30T00:00:00.000Z","problems":[{"fix":"Upgrade to syncedlyrics >=0.7.0 which fixes this bug. Alternatively, ensure the search term is correct.","cause":"A provider returned None for a lyrics segment, and the library tried to strip it.","error":"AttributeError: 'NoneType' object has no attribute 'strip'"},{"fix":"Run `pip install syncedlyrics`.","cause":"The package is not installed.","error":"ModuleNotFoundError: No module named 'syncedlyrics'"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}