Fix Music Assistant playlist not being removed (#2931)
* Fix playlist recreation issue after removal
When a Music Assistant playlist was removed from the library, the config entry
was correctly removed but the physical playlist file in the playlists/ directory
was not deleted. This orphaned file could cause the playlist to be recreated
during synchronization.
This fix ensures that when a playlist is removed via library_remove(), both the
config entry and the physical playlist file are deleted.
Fixes the issue where playlists would reappear after sync with a new ID.
* Add LIBRARY_PLAYLISTS_EDIT feature to builtin provider
The builtin provider was missing ProviderFeature.LIBRARY_PLAYLISTS_EDIT,
which prevented library_remove() from being called when playlists were
removed from the library. This meant the playlist file cleanup code was
never executed.
Adding this feature ensures that:
1. library_edit_supported() returns True for playlists
2. library_remove() is called during playlist removal
3. The playlist file is properly deleted
* Use playlist lock for file deletion to prevent race conditions
When deleting a playlist file, we now acquire the _playlist_lock to prevent
race conditions with concurrent read/write operations, consistent with
_read_playlist_file_items() and _write_playlist_file_items().
---------
Co-authored-by: Claude <noreply@anthropic.com>