navidrome/db/migrations
Deluan Quintão 01b7c86f90
fix(scanner): stop logging expected lyrics sniff misses as warnings (#5702)
* fix(scanner): stop logging expected lyrics sniff misses as warnings

During a scan, embedded lyrics are parsed with an empty suffix, which puts
ParseLyrics into content-sniffing mode: it tries the TTML, SRT and Lyricsfile
YAML parsers in turn before falling back to plain text. Every plain-text or LRC
lyric therefore fails the structured probes on its way to the fallback, and each
failure was logged at warning level with no indication of which file triggered
it, flooding the scan log with benign "Error parsing lyrics, falling back to
plain text" messages.

A probe rejecting content it does not own during sniffing is expected control
flow, so it is now logged at trace instead. A parse failure under an explicitly
requested suffix (e.g. a malformed .yaml/.srt/.ttml sidecar) still warns, since
the user declared that format. ParseLyrics gains ctx and path parameters so any
warning names the offending file and carries request context where available;
all call sites are updated accordingly.

Also fixes a test-isolation bug in the new logging spec: the BeforeEach swapped
the process-global default logger via SetDefaultLogger but only restored the log
level on cleanup, leaking the null logger and its hook into later specs in the
shared model suite.

* test: use spec-scoped contexts instead of context.Background in lyrics tests

Replace context.Background() with GinkgoT().Context() (and b.Context() in the
parse benchmarks) across the lyrics-related tests, so contexts are cancelled
when each spec ends. The embeddedLyrics fixture in core/lyrics is now a
hand-written literal like its sibling fixtures, removing the construction-time
ParseLyrics call that could not use a spec-scoped context.

* refactor(model): attach lyrics parse log attribution via context

Narrow ParseLyrics back to (ctx, suffix, lang, contents), dropping the path
parameter added by the previous commit. Attribution now uses the codebase's
existing idiom: callers that know the source attach it with log.NewContext
(e.g. "file" for the media file or sidecar), and the plugin adapter tags both
the plugin name and the track, fixing probe-miss logs that misattributed
plugin-returned content to the file's own tags. This removes three adjacent
string parameters that were easy to swap silently, and the "" placeholder most
call sites had to pass.

Also hardens the logging spec from the previous commit: the null test logger is
now swapped in before raising the level (SetLevel forces the current default
logger to trace, so the old order left the null logger at info and trace
entries never reached the hook), the sniff test now asserts probe misses are
observable at trace with file attribution instead of only asserting the absence
of warnings, and cleanup restores the actual previous logger — via a new return
value on log.SetDefaultLogger — instead of a bare logrus.New() that would
discard hooks configured on the process-wide logger.

* refactor(lyrics): hoist attributed log contexts out of loops

Address review feedback on #5702: build the log-attributed context once per
operation instead of per iteration, and reuse it on the surrounding log calls
so the error/trace lines around ParseLyrics carry the same attribution fields.
In fromExternalFile the sidecar path now rides the context for all log lines
in the function, replacing the repeated explicit "path" field.

* style(model): pass lyrics parse errors as final log arguments

Per the project logging convention, errors go as the last argument (the log
package normalizes them via its error case) instead of a keyed "error" pair,
which stores the raw error value and bypasses that handling. Flagged by review
on #5702; the keyed form was inherited from the original warning line.
2026-07-02 09:46:57 -04:00
..
20200130083147_create_schema.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200131183653_standardize_item_type.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200208222418_add_defaults_to_annotations.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200220143731_change_duration_to_float.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200310171621_enable_search_by_albumartist.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200310181627_add_transcoding_and_player_tables.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200319211049_merge_search_into_main_tables.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200325185135_add_album_artist_id.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200326090707_fix_album_artists_importing.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200327193744_add_year_range_to_album.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200404214704_add_indexes.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200409002249_enable_search_by_tracks_artists.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200411164603_add_created_and_updated_fields_to_playlists.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200418110522_reindex_to_fix_album_years.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200419222708_reindex_to_change_full_text_search.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200423204116_add_sort_fields.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200508093059_add_artist_song_count.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200512104202_add_disc_subtitle.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200516140647_add_playlist_tracks_table.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200608153717_referential_integrity.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200706231659_add_default_transcodings.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200710211442_add_playlist_path.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200731095603_create_play_queues_table.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200801101355_create_bookmark_table.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20200819111809_drop_email_unique_constraint.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20201003111749_add_starred_at_index.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20201010162350_add_album_size.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20201012210022_add_artist_playlist_size.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20201021085410_add_mbids.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20201021093209_add_media_file_indexes.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20201021135455_add_media_file_artist_index.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20201030162009_add_artist_info_table.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20201110205344_add_comments_and_lyrics.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20201128100726_add_real-path_option.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20201213124814_add_all_artist_ids_to_album.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210322132848_add_timestamp_indexes.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210418232815_fix_album_comments.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210430212322_add_bpm_metadata.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210530121921_create_shares_table.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210601231734_update_share_fieldnames.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210616150710_encrypt_all_passwords.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210619231716_drop_player_name_unique_constraint.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210623155401_add_user_prefs_player_scrobbler_enabled.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210625223901_add_referential_integrity_to_user_props.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210626213026_add_scrobble_buffer.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210715151153_add_genre_tables.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20210821212604_add_mediafile_channels.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20211008205505_add_smart_playlist.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20211023184825_add_order_title_to_media_file.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20211026191915_unescape_lyrics_and_comments.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20211029213200_add_userid_to_playlist.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20211102215414_add_alphabetical_by_artist_index.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20211105162746_remove_invalid_artist_ids.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20220724231849_add_musicbrainz_release_track_id.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20221219112733_add_album_image_paths.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20221219140528_remove_cover_art_id.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230112111457_add_album_paths.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230114121537_touch_playlists.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230115103212_create_internet_radio.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230117155559_add_replaygain_metadata.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230117180400_add_album_info.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230119152657_recreate_share_table.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230202143713_change_path_list_separator.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230209181414_change_image_files_list_separator.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230310222612_add_download_to_share.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230404104309_empty_sql_migration.sql Fix migration package name mismatch 2024-05-08 19:54:48 -04:00
20230515184510_add_release_date.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20230616214944_rename_musicbrainz_recording_id.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20231208182311_add_discs_to_album.go Fix migration package name mismatch 2024-05-08 19:54:48 -04:00
20231209211223_alter_lyric_column.go fix(scanner): stop logging expected lyrics sniff misses as warnings (#5702) 2026-07-02 09:46:57 -04:00
20240122223340_add_default_values_to_null_columns.go.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20240426202913_add_id_to_scrobble_buffer.go Fix migration package name mismatch 2024-05-08 19:54:48 -04:00
20240511210036_add_sample_rate.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20240511220020_add_library_table.go feat(bfr): Big Refactor: new scanner, lots of new fields and tags, improvements and DB schema changes (#2709) 2025-02-19 20:35:17 -05:00
20240629152843_remove_annotation_id.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20240802044339_player_use_user_id_over_username.go Use userId in player, other fixes (#3182) 2024-08-03 13:37:21 -04:00
20241020003138_add_sort_tags_index.sql perf(server): add index for sort tags. 2024-10-19 20:46:54 -04:00
20241024125533_fix_sort_tags_collation_and_index.sql fix(server): fix case-insensitive sort order and add indexes to improve performance (#3425) 2024-10-26 14:06:34 -04:00
20241026183640_support_new_scanner.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20250522013904_share_user_id_on_delete.sql fix(db): allow deleting users that have shares (#4098) 2025-05-21 22:16:10 -04:00
20250611010101_playqueue_current_to_index.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20250701010101_add_folder_hash.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20250701010102_add_annotation_user_foreign_key.sql fix(db): add user foreign key constraint to annotation table (#4211) 2025-06-13 17:27:57 -04:00
20250701010103_add_library_stats.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20250701010104_make_replaygain_fields_nullable.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20250701010105_remove_dangling_items.sql fix(db): clear dangling music from BFR upgrade (#4262) 2025-06-28 18:43:11 -04:00
20250701010106_add_participant_stats_to_all_artists.sql feat(server): expose main credit stat to reflect only album artist | artist credit (#4268) 2025-06-28 19:00:13 -04:00
20250701010107_add_mbid_indexes.sql feat: MBID search functionality for albums, artists and songs (#4286) 2025-06-30 17:11:54 -04:00
20250701010108_add_multi_library_support.go feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
20250823142158_make_playqueue_position_int.sql fix(db): make playqueue position field an integer (#4481) 2025-11-06 14:41:09 -05:00
20251109010105_add_annotation_rating_date.sql feat: add Rated At field - #4653 (#4660) 2025-11-24 23:18:05 -05:00
20251206013022_create_scrobbles_table.sql feat(server): track scrobble/linstens history (#4770) 2025-12-06 11:07:18 -05:00
20260104203627_playlist_case_insensitive_name.sql fix(ui): make playlist name sorting case-insensitive (#4845) 2026-01-05 19:05:11 -05:00
20260106000620_create_plugin_table.sql feat(plugins): New Plugin System with multi-language PDK support (#4833) 2026-01-14 19:22:48 -05:00
20260117201522_add_avg_rating_column.sql feat(subsonic): Add avgRating from subsonic spec (#4900) 2026-01-18 17:42:42 -05:00
20260220173400_add_fts5_search.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20260228020813_add_plugin_allow_write_access.sql feat(plugins): allow mounting library directories as read-write (#5122) 2026-02-28 10:59:13 -05:00
20260228172956_add_playlist_image_file.go feat(playlist): add custom playlist cover art upload (#5110) 2026-03-01 14:07:18 -05:00
20260302021413_rename_playlist_image_fields.go feat(playlist): support #EXTALBUMARTURL directive and sidecar images (#5131) 2026-03-02 11:39:59 -05:00
20260307175815_add_codec_and_update_transcodings.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20260309120007_fix_probe_data_null.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20260309203355_ensure_default_transcodings.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20260310113858_fix_aac_transcode_command.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20260315233131_add_artist_uploaded_image.go feat: add artist image uploads and image-folder artwork source (#5198) 2026-03-15 22:19:55 -04:00
20260316000000_normalize_timestamps.sql fix(db): normalize timestamps and fix recently added album sorting (#5176) 2026-03-16 07:55:22 -04:00
20260318182414_add_radio_uploaded_image.go feat(ui): add cover art support for internet radio stations (#5229) 2026-03-18 18:57:33 -04:00
20260405124200_fix_schema_inconsistencies.sql fix(db): resolve schema inconsistencies in library_artist and scrobble_buffer tables (#5047) 2026-04-05 12:56:32 -04:00
20260410201914_fix_zero_album_created_at.sql fix(subsonic): always emit required created field on AlbumID3 (#5340) 2026-04-10 19:29:20 -04:00
20260513173954_move_ss_before_input.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00
20260520211813_add_media_file_artists_composite_index.sql fix(smartplaylists): optimize smart playlist performance for role and tag criteria (#5515) 2026-05-22 18:00:13 -03:00
20260612171826_add_media_file_missing_library_id_index.sql fix(opensubsonic): make search3 empty-query pagination fast at large offsets (#5601) 2026-06-12 15:53:37 -04:00
20260612222838_make_bpm_bitdepth_nullable.sql feat(smartplaylist): extend isMissing/isPresent to bpm, bitDepth and many text fields (#5603) 2026-06-13 13:15:20 -04:00
20260618120509_add_metadata_to_default_transcodings.go fix(transcoding): preserve source metadata when transcoding downloads (#5628) 2026-06-18 09:58:43 -04:00
20260629123100_recently_added_plain_indexes.sql fix(subsonic): make "recently added" order reproducible and consistent with RecentlyAddedByModTime (#5678) 2026-06-29 16:18:29 -04:00
migration.go refactor(migrations): propagate context.Context through all DB calls 2026-06-18 09:58:43 -04:00