Refresh flows (backfill and per-item force refresh)
Metadata backfill
Triggered by the GraphQL mutation refreshMetadata(MISSING) (MetadataRefreshController):
metadata is fetched for everything that lacks it (movies/shows also when their TMDB enrichment
columns were never filled). The controller kicks the BlurHash sweep per directory itself — for an
unscoped call over every directory including the cache directory; with a libraryId only over
that library's LIBRARY directories. The backfill event is global, so it runs exactly once
cluster-wide.
Force refresh (per item or per library)
Triggered by refreshMetadata(FORCE, libraryId) and the per-item calls refreshShow(id),
refreshMovie(id), refreshEpisode(id), refreshPerson(id), refreshAlbum(id),
refreshTrack(id). Destructive: stored metadata/artwork/stream info is deleted first, then
everything is re-fetched.