/
/
# What does this implement/fix? When a music provider cannot read one item while listing its library, it drops that item and carries on. The sync then has no way to tell that gap apart from an item the user deleted at the provider, so the cleanup step removes it from the library - a full removal for providers like Plex, Jellyfin or Subsonic. The sync task also reported no failures at all, so nothing pointed at what had happened. Providers now have a supported way to say "I had to skip this one". The item is reported on the sync task so it shows up in the UI, and it is kept out of the cleanup step on its own, so a single unreadable item no longer disables cleanup for the rest of the library. **Related issue (if applicable):** - n/a ## Types of changes - [ ] Bugfix (non-breaking change which fixes an issue) — `bugfix` - [ ] New feature (non-breaking change which adds functionality) — `new-feature` - [ ] Enhancement to an existing feature — `enhancement` - [ ] New music/player/metadata/plugin provider — `new-provider` - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) — `breaking-change` - [ ] Refactor (no behaviour change) — `refactor` - [ ] Documentation only — `documentation` - [x] Maintenance / chore — `maintenance` - [ ] CI / workflow change — `ci` - [ ] Dependencies bump — `dependencies` ## Changes - Providers can report an item they had to skip while listing their library, so it appears on the sync task instead of disappearing quietly. - A reported item is kept out of the cleanup step by itself. An item that can never be read no longer switches cleanup off for a whole provider, which is what would happen if the whole run were held back. - Only a provider that cannot tell which item it lost holds the cleanup step back for the whole run - digitally_incorporated, where one failure drops a whole network's favourites. - Applied to the library listings of plex, soundcloud, ibroadcast, qqmusic, neteasecloudmusic, yandex_music, kion_music, zvuk_music, deezer, storytel, audible, gpodder, overcast, builtin and tunein. Several of those dropped items with no log at all. - SoundCloud DRM protected tracks stay a filter rather than a failure: they can never be imported, so they keep their single "skipped N tracks" log line instead of filling the sync with errors. - qqmusic album/track/playlist id extraction moved into shared helpers, so the parsers and the skip reporting cannot drift apart. ## Checklist - [x] The code change is tested and works locally. - [x] `pre-commit run --all-files` passes. - [x] `pytest` passes, and tests have been added/updated under `tests/` where applicable. - [ ] For changes to shared models, the companion PR in `music-assistant/models` is linked. - [ ] For changes affecting the UI, the companion PR in `music-assistant/frontend` is linked. - [x] I have read and complied with the project's [AI Policy](https://github.com/music-assistant/.github/blob/main/AI_POLICY.md) for any AI-assisted contributions. - [ ] I have [raised a PR against the documentation repository](https://github.com/music-assistant/music-assistant.io/blob/main/CONTRIBUTING.md) targeting the main or beta branch as appropriate.