From 3a84c637fedd05f1ebdf7051fc9d36792ce8372d Mon Sep 17 00:00:00 2001 From: LumePart Date: Thu, 11 Jun 2026 23:22:33 +0300 Subject: [PATCH 01/11] override jellyfin API Key with admin API Key if set --- src/client/client.go | 4 ++-- src/client/jellyfin.go | 23 ++++++++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/client/client.go b/src/client/client.go index a38c57e..518b427 100644 --- a/src/client/client.go +++ b/src/client/client.go @@ -133,8 +133,8 @@ func (c *Client) systemSetup() error { return c.API.GetAuth() case "jellyfin": - if c.Cfg.Creds.APIKey == "" { - return fmt.Errorf("Jellyfin API_KEY is required") + if c.Cfg.Creds.APIKey == "" && c.Cfg.AdminCreds.APIKey == "" { + return fmt.Errorf("Jellyfin API_KEY or ADMIN_API_KEY is required") } if c.Cfg.Creds.User == "" { slog.Warn("It is recommended to set SYSTEM_USERNAME for Jellyfin") diff --git a/src/client/jellyfin.go b/src/client/jellyfin.go index 386a92d..df31ee2 100644 --- a/src/client/jellyfin.go +++ b/src/client/jellyfin.go @@ -81,11 +81,15 @@ func (c *Jellyfin) AddHeader() error { c.Cfg.Creds.Headers = make(map[string]string) } - if c.Cfg.Creds.APIKey != "" { - c.Cfg.Creds.Headers["Authorization"] = fmt.Sprintf("MediaBrowser Token=%s, Client=%s", c.Cfg.Creds.APIKey, c.Cfg.ClientID) - return nil + apiKey := c.resolveAPIKey() + + if apiKey == "" { + return fmt.Errorf("API_KEY or ADMIN_API_KEY not set") } - return fmt.Errorf("API_KEY not set") + + c.Cfg.Creds.Headers["Authorization"] = fmt.Sprintf("MediaBrowser Token=%s, Client=%s", apiKey, c.Cfg.ClientID) + + return nil } func (c *Jellyfin) GetAuth() error { @@ -216,13 +220,14 @@ func (c *Jellyfin) CreatePlaylist(tracks []*models.Track) error { } var userID string isPublic := c.Cfg.PublicPlaylist + if c.Cfg.Creds.User != "" { userID, err = c.ResolveUserID() if err != nil { return err } } else { - userID = c.Cfg.Creds.APIKey + userID = c.resolveAPIKey() isPublic = true } @@ -320,3 +325,11 @@ func (c *Jellyfin) ResolveUserID() (string, error) { return "", fmt.Errorf("failed to find Jellyfin user %q", c.Cfg.Creds.User) } + +// Check which API Key variable is used +func (c *Jellyfin) resolveAPIKey() string { + if c.Cfg.AdminCreds.APIKey != "" { + return c.Cfg.AdminCreds.APIKey + } + return c.Cfg.Creds.APIKey +} From 9e17fad790067a1fc04afb593a483f8c0b744d12 Mon Sep 17 00:00:00 2001 From: LumePart Date: Thu, 11 Jun 2026 23:28:07 +0300 Subject: [PATCH 02/11] edit sample.env --- sample.env | 16 +++++++++------- src/web/sample.env | 18 +++++++++++------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/sample.env b/sample.env index 498023b..374980d 100644 --- a/sample.env +++ b/sample.env @@ -25,10 +25,6 @@ SYSTEM_URL= SYSTEM_USERNAME= # Password for the user (required for subsonic, recommended for plex) SYSTEM_PASSWORD= -# Optional admin username for systems like Navidrome/Subsonic/Plex (used to trigger operations that need elevated permissions for multi-user setups) -# ADMIN_SYSTEM_USERNAME= -# Optional admin password for systems like Navidrome/Subsonic/Plex -# ADMIN_SYSTEM_PASSWORD= # API Key from your media system (required for emby and jellyfin, optional for plex) API_KEY= # Name of the music library in your system (emby, jellyfin, plex) @@ -36,6 +32,12 @@ LIBRARY_NAME= # Mark playlist as public (subsonic, jellyfin) # PUBLIC_PLAYLIST=false +# Optional admin username for systems like Navidrome/Subsonic/Plex (used to trigger operations that need elevated permissions for multi-user setups) +# ADMIN_SYSTEM_USERNAME= +# Optional admin password for systems like Navidrome/Subsonic/Plex +# ADMIN_SYSTEM_PASSWORD= +# Admin API Key for Jellyfin (or Plex when using MFA) (used for multi-user setups) +# ADMIN_API_KEY= # === Downloader Configuration === # Directory to store downloaded tracks. It's recommended to make a separate directory (under the music library) for Explo @@ -57,8 +59,8 @@ LIBRARY_NAME= # YouTube Data API key (optional, fall back is unofficial ytmusic API) # YOUTUBE_API_KEY= -# Custom file extension for tracks (e.g mp3) (default: opus) -# TRACK_EXTENSION=opus +# Custom file extension for tracks (default: mp3) +# TRACK_EXTENSION=mp3 # Include cover art in downloaded files (default: false) # EMBED_COVER_ART=false # Custom path to ffmpeg binary (default: defined in $PATH) @@ -142,4 +144,4 @@ LIBRARY_NAME= # Set the log level (DEBUG, INFO, WARN, ERROR) (default: INFO) # LOG_LEVEL=INFO # Set a custom HTTP timeout for music servers (in seconds) (default: 10) -# CLIENT_HTTP_TIMEOUT=10 +# CLIENT_HTTP_TIMEOUT=10 \ No newline at end of file diff --git a/src/web/sample.env b/src/web/sample.env index 9460fb2..374980d 100644 --- a/src/web/sample.env +++ b/src/web/sample.env @@ -25,10 +25,6 @@ SYSTEM_URL= SYSTEM_USERNAME= # Password for the user (required for subsonic, recommended for plex) SYSTEM_PASSWORD= -# Optional admin username for systems like Navidrome/Subsonic/Plex (used to trigger operations that need elevated permissions for multi-user setups) -# ADMIN_SYSTEM_USERNAME= -# Optional admin password for systems like Navidrome/Subsonic/Plex -# ADMIN_SYSTEM_PASSWORD= # API Key from your media system (required for emby and jellyfin, optional for plex) API_KEY= # Name of the music library in your system (emby, jellyfin, plex) @@ -36,6 +32,12 @@ LIBRARY_NAME= # Mark playlist as public (subsonic, jellyfin) # PUBLIC_PLAYLIST=false +# Optional admin username for systems like Navidrome/Subsonic/Plex (used to trigger operations that need elevated permissions for multi-user setups) +# ADMIN_SYSTEM_USERNAME= +# Optional admin password for systems like Navidrome/Subsonic/Plex +# ADMIN_SYSTEM_PASSWORD= +# Admin API Key for Jellyfin (or Plex when using MFA) (used for multi-user setups) +# ADMIN_API_KEY= # === Downloader Configuration === # Directory to store downloaded tracks. It's recommended to make a separate directory (under the music library) for Explo @@ -47,6 +49,8 @@ LIBRARY_NAME= # KEEP_PERMISSIONS=true # Comma-separated list (no spaces) of download services, in priority order (default: youtube) # DOWNLOAD_SERVICES=youtube +# Path templating, Options are Artist, Album, TrackName, TrackNumber, File, Ext (eg. "{{Artist}}/{{Album}}/{{File}}") +# PATH_TEMPLATING="" # Directory for writing .m3u playlists (required only for MPD) # PLAYLIST_DIR=/path/to/playlist/folder/ @@ -55,8 +59,8 @@ LIBRARY_NAME= # YouTube Data API key (optional, fall back is unofficial ytmusic API) # YOUTUBE_API_KEY= -# Custom file extension for tracks (e.g mp3) (default: opus) -# TRACK_EXTENSION=opus +# Custom file extension for tracks (default: mp3) +# TRACK_EXTENSION=mp3 # Include cover art in downloaded files (default: false) # EMBED_COVER_ART=false # Custom path to ffmpeg binary (default: defined in $PATH) @@ -140,4 +144,4 @@ LIBRARY_NAME= # Set the log level (DEBUG, INFO, WARN, ERROR) (default: INFO) # LOG_LEVEL=INFO # Set a custom HTTP timeout for music servers (in seconds) (default: 10) -# CLIENT_HTTP_TIMEOUT=10 +# CLIENT_HTTP_TIMEOUT=10 \ No newline at end of file From 144832b367c0c947cdcd69234b18a91c161f02ac Mon Sep 17 00:00:00 2001 From: LumePart Date: Thu, 11 Jun 2026 23:35:19 +0300 Subject: [PATCH 03/11] use base name for custom playlist --- src/config/config.go | 10 ++++++---- src/main/main.go | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/config/config.go b/src/config/config.go index 7ecc1ac..a68b6ce 100644 --- a/src/config/config.go +++ b/src/config/config.go @@ -264,7 +264,8 @@ func (cfg *Config) HandleDeprecation() { // } } -func (cfg *Config) GenPlaylistName() { // Generate playlist name and description +// Generate playlist name and description +func (cfg *Config) GenPlaylistDetails() { cfg.ClientCfg.PlaylistName = getPlaylistName(cfg.Flags.Playlist, cfg.ClientCfg.PlaylistNFormat, cfg.Persist) cfg.ClientCfg.PlaylistDescr = fmt.Sprintf( @@ -280,16 +281,17 @@ func (cfg *Config) GenPlaylistName() { // Generate playlist name and description } func getPlaylistName(playlistType, format string, persist bool) string { - now := time.Now() + toTitle := cases.Title(language.Und) base := toTitle.String(playlistType) - // Non-persistent playlists always use base name - if !persist { + // Non-persistent or custom playlists always use base name + if !persist || strings.HasPrefix(playlistType, "custom-") { return base } + now := time.Now() // Explicit date-based naming if format == "date" { return fmt.Sprintf( diff --git a/src/main/main.go b/src/main/main.go index e6e4920..32ad062 100644 --- a/src/main/main.go +++ b/src/main/main.go @@ -97,7 +97,7 @@ func setup(cfg *config.Config) { cfg.HandleDeprecation() notifyClient := logging.InitNotify(cfg.NotifyCfg) logging.Init(cfg.LogLevel, notifyClient) - cfg.GenPlaylistName() + cfg.GenPlaylistDetails() } func runSearchTest(cfg *config.Config, httpClient *util.HttpClient) { lb := discovery.NewListenBrainz(cfg.DiscoveryCfg, httpClient) From f0e4e0ddc710fdf89afd5509c56778a8c8d3ad19 Mon Sep 17 00:00:00 2001 From: LumePart Date: Thu, 11 Jun 2026 23:54:34 +0300 Subject: [PATCH 04/11] remove redundant title match --- src/client/emby.go | 3 +-- src/client/jellyfin.go | 3 +-- src/client/plex.go | 3 +-- src/client/subsonic.go | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/client/emby.go b/src/client/emby.go index 2ce88f5..843e274 100644 --- a/src/client/emby.go +++ b/src/client/emby.go @@ -143,14 +143,13 @@ func (c *Emby) SearchSongs(tracks []*models.Track) error { return err } - normalizedTrackTitle := util.NormalizeTitle(track.Title) normalizedCleanTitle := util.NormalizeTitle(track.CleanTitle) for _, item := range results.Items { normalizedItemTitle := util.NormalizeTitle(item.Name) musicBrainzMatch := track.MusicBrainzTrackID != "" && item.ProviderIds.MusicBrainzTrack == track.MusicBrainzTrackID - titleMatch := normalizedItemTitle == normalizedTrackTitle || normalizedItemTitle == normalizedCleanTitle + titleMatch := normalizedItemTitle == normalizedCleanTitle artistMatch := strings.EqualFold(item.AlbumArtist, track.MainArtist) || (len(item.Artists) > 0 && strings.EqualFold(item.Artists[0], track.MainArtist)) pathMatch := util.ContainsFold(item.Path,track.File) diff --git a/src/client/jellyfin.go b/src/client/jellyfin.go index df31ee2..4b18d94 100644 --- a/src/client/jellyfin.go +++ b/src/client/jellyfin.go @@ -161,14 +161,13 @@ func (c *Jellyfin) SearchSongs(tracks []*models.Track) error { if err = util.ParseResp(body, &results); err != nil { return err } - normalizedTrackTitle := util.NormalizeTitle(track.Title) normalizedCleanTitle := util.NormalizeTitle(track.CleanTitle) for _, item := range results.Items { normalizedItemTitle := util.NormalizeTitle(item.Name) musicBrainzMatch := track.MusicBrainzTrackID != "" && item.ProviderIds.MusicBrainzTrack == track.MusicBrainzTrackID - titleMatch := normalizedItemTitle == normalizedTrackTitle || normalizedItemTitle == normalizedCleanTitle + titleMatch := normalizedItemTitle == normalizedCleanTitle artistMatch := strings.EqualFold(item.AlbumArtist, track.MainArtist) || (len(item.Artists) > 0 && strings.EqualFold(item.Artists[0], track.MainArtist)) pathMatch := util.ContainsFold(item.Path,track.File) diff --git a/src/client/plex.go b/src/client/plex.go index 39a4ce6..a477965 100644 --- a/src/client/plex.go +++ b/src/client/plex.go @@ -575,7 +575,6 @@ func (c *Plex) getServer() error { func (c *Plex) getPlexSong(track *models.Track, metadata []SongMetadata) (string, error) { normArtist := util.AlnumOnly(track.MainArtist) - normalizedTrackTitle := util.NormalizeTitle(track.Title) normalizedCleanTitle := util.NormalizeTitle(track.CleanTitle) normalizedAlbum := util.AlnumOnly(strings.ToLower(track.Album)) @@ -593,7 +592,7 @@ func (c *Plex) getPlexSong(track *models.Track, metadata []SongMetadata) (string normalizedSongTitle := util.NormalizeTitle(md.Title) musicBrainzMatch := mbid != "" && track.MusicBrainzReleaseTrackID == mbid - titleMatch := normalizedSongTitle == normalizedTrackTitle || normalizedSongTitle == normalizedCleanTitle + titleMatch := normalizedSongTitle == normalizedCleanTitle albumMatch := util.AlnumOnly(strings.ToLower(md.ParentTitle)) == normalizedAlbum artistMatch := util.ContainsFold(util.AlnumOnly(md.OriginalTitle), normArtist) || util.ContainsFold(util.AlnumOnly(md.GrandparentTitle), normArtist) diff --git a/src/client/subsonic.go b/src/client/subsonic.go index 9ae9bfc..1cd0772 100644 --- a/src/client/subsonic.go +++ b/src/client/subsonic.go @@ -145,7 +145,6 @@ func (c *Subsonic) SearchSongs(tracks []*models.Track) error { slog.Debug(fmt.Sprintf("[subsonic] no results found for %s", searchQuery)) continue } - normalizedTrackTitle := util.NormalizeTitle(track.Title) normalizedCleanTitle := util.NormalizeTitle(track.CleanTitle) for _, song := range songs { normalizedSongTitle := util.NormalizeTitle(song.Title) @@ -153,7 +152,7 @@ func (c *Subsonic) SearchSongs(tracks []*models.Track) error { musicBrainzMatch := track.MusicBrainzTrackID != "" && song.MusicBrainzID == track.MusicBrainzTrackID artistMatch := util.ContainsFold(song.Artist, track.MainArtist) albumMatch := util.ContainsFold(song.Album, track.Album) - titleMatch := normalizedSongTitle == normalizedTrackTitle || normalizedSongTitle == normalizedCleanTitle + titleMatch := normalizedSongTitle == normalizedCleanTitle durationMatch := util.Abs(song.Duration - (track.Duration / 1000)) < 10 pathMatch := util.ContainsFold(song.Path, track.File) From f0332889f47eb04ca9a26de2afc89cd1b67dbe77 Mon Sep 17 00:00:00 2001 From: LumePart Date: Fri, 12 Jun 2026 14:47:51 +0300 Subject: [PATCH 05/11] add track title to log --- src/discovery/discovery.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/discovery/discovery.go b/src/discovery/discovery.go index 81d49b3..1a1b2e9 100644 --- a/src/discovery/discovery.go +++ b/src/discovery/discovery.go @@ -57,6 +57,7 @@ func (c DiscoverClient) filterArtists(tracks []*models.Track) []*models.Track { slog.Debug("filtered out artist", "name", track.MainArtist, "mbid", track.MusicBrainzArtistID, + "track", track.CleanTitle, ) continue } From d0e053499d78a520c437da8f54389b6c916cc9de Mon Sep 17 00:00:00 2001 From: LumePart Date: Fri, 12 Jun 2026 16:15:31 +0300 Subject: [PATCH 06/11] request providerID field from API --- src/client/emby.go | 2 +- src/client/jellyfin.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/emby.go b/src/client/emby.go index 843e274..219d910 100644 --- a/src/client/emby.go +++ b/src/client/emby.go @@ -131,7 +131,7 @@ func (c *Emby) CheckRefreshState() bool { func (c *Emby) SearchSongs(tracks []*models.Track) error { for _, track := range tracks { - reqParam := fmt.Sprintf("/emby/Items?IncludeMediaTypes=Audio&SearchTerm=%s&Recursive=true&Fields=Path", url.QueryEscape(util.CleanSearchTitle(track.CleanTitle))) + reqParam := fmt.Sprintf("/emby/Items?IncludeMediaTypes=Audio&SearchTerm=%s&Recursive=true&Fields=Path,ProviderIDs", url.QueryEscape(util.CleanSearchTitle(track.CleanTitle))) body, err := c.HttpClient.MakeRequest("GET", c.Cfg.URL+reqParam, nil, c.Cfg.Creds.Headers) if err != nil { diff --git a/src/client/jellyfin.go b/src/client/jellyfin.go index 4b18d94..08d911d 100644 --- a/src/client/jellyfin.go +++ b/src/client/jellyfin.go @@ -150,7 +150,7 @@ func (c *Jellyfin) CheckRefreshState() bool { func (c *Jellyfin) SearchSongs(tracks []*models.Track) error { for _, track := range tracks { - reqParam := fmt.Sprintf("/Items?IncludeMediaTypes=Audio&SearchTerm=%s&Recursive=true&Fields=Path", url.QueryEscape(util.CleanSearchTitle(track.CleanTitle))) + reqParam := fmt.Sprintf("/Items?IncludeMediaTypes=Audio&SearchTerm=%s&Recursive=true&Fields=Path,ProviderIDs", url.QueryEscape(util.CleanSearchTitle(track.CleanTitle))) body, err := c.HttpClient.MakeRequest("GET", c.Cfg.URL+reqParam, nil, c.Cfg.Creds.Headers) if err != nil { From 9985ea83a9ea7a7f17fdd68226dfe7fbb0061855 Mon Sep 17 00:00:00 2001 From: LumePart Date: Sat, 13 Jun 2026 00:28:26 +0300 Subject: [PATCH 07/11] add more variables --- sample.env | 2 ++ src/web/sample.env | 2 ++ 2 files changed, 4 insertions(+) diff --git a/sample.env b/sample.env index 374980d..360232b 100644 --- a/sample.env +++ b/sample.env @@ -141,6 +141,8 @@ LIBRARY_NAME= # WIZARD_COMPLETE=false # Minutes to sleep between library scans (default: 2) # SLEEP=2 +# Comma-separated list of MusicBrainz Artist IDs to exclude from import +# ARTIST_BLACKLIST= # Set the log level (DEBUG, INFO, WARN, ERROR) (default: INFO) # LOG_LEVEL=INFO # Set a custom HTTP timeout for music servers (in seconds) (default: 10) diff --git a/src/web/sample.env b/src/web/sample.env index 374980d..360232b 100644 --- a/src/web/sample.env +++ b/src/web/sample.env @@ -141,6 +141,8 @@ LIBRARY_NAME= # WIZARD_COMPLETE=false # Minutes to sleep between library scans (default: 2) # SLEEP=2 +# Comma-separated list of MusicBrainz Artist IDs to exclude from import +# ARTIST_BLACKLIST= # Set the log level (DEBUG, INFO, WARN, ERROR) (default: INFO) # LOG_LEVEL=INFO # Set a custom HTTP timeout for music servers (in seconds) (default: 10) From fdb96d7e0c658bfd8b3100f75778778f6eb60981 Mon Sep 17 00:00:00 2001 From: LumePart Date: Sat, 13 Jun 2026 00:46:52 +0300 Subject: [PATCH 08/11] edit readme --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f024098..3309206 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,12 @@ Explo uses the [ListenBrainz](https://listenbrainz.org/) recommendation engine t - Weekly Exploration - Weekly Jams - Daily Jams +- Import custom playlists from: + - Apple Music + - ListenBrainz + - Spotify - Request tracks from YouTube, Soulseek, or both -- Add metadata (title, artist, album) to YouTube downloads +- Add metadata to downloaded tracks - Create playlists in your music system - Keep previous playlists for later listening --- @@ -57,6 +61,6 @@ Explo uses the following 3rd-party libraries: ## Contributing -Contributions are always welcome! If you have any suggestions, bug reports, or feature requests, please open an issue or submit a pull request. +Contributions are always welcome! If you have any suggestions, bug reports, or feature requests, please open an issue or submit a pull request (be sure to [read the development section](https://github.com/LumePart/Explo/wiki/7.-Development) of our wiki). For discussion regarding development or help, join our [Discord!](https://discord.gg/uFWWPaN2zk) \ No newline at end of file From 06ceb1c51293328503f569a5431fecd83e668c77 Mon Sep 17 00:00:00 2001 From: LumePart Date: Sat, 13 Jun 2026 00:47:17 +0300 Subject: [PATCH 09/11] tidy --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index b045a15..a016dd0 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( golang.org/x/net v0.48.0 golang.org/x/sync v0.19.0 golang.org/x/text v0.32.0 + golang.org/x/time v0.15.0 maunium.net/go/mautrix v0.26.0 ) @@ -43,7 +44,6 @@ require ( go.mau.fi/util v0.9.3 // indirect golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 // indirect golang.org/x/sys v0.39.0 // indirect - golang.org/x/time v0.15.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect olympos.io/encoding/edn v0.0.0-20201019073823-d3554ca0b0a3 // indirect ) From 6b851620ad8f6dfb8b1b93bbebdbf0302832372e Mon Sep 17 00:00:00 2001 From: LumePart Date: Sat, 13 Jun 2026 01:00:19 +0300 Subject: [PATCH 10/11] remove duplicate text field --- src/web/frontend/src/components/Wizard.jsx | 30 +--------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/src/web/frontend/src/components/Wizard.jsx b/src/web/frontend/src/components/Wizard.jsx index eb9a7c3..ab9fe82 100644 --- a/src/web/frontend/src/components/Wizard.jsx +++ b/src/web/frontend/src/components/Wizard.jsx @@ -54,8 +54,7 @@ function Step1({ fields, setField, envSources, onNext, saving }) {
Step 1 of 3 — Discovery

- Explo uses your ListenBrainz listening history to find music - recommendations. + Explo uses your ListenBrainz listening history to find music recommendations.

@@ -64,33 +63,6 @@ function Step1({ fields, setField, envSources, onNext, saving }) { setField('user', e.target.value)} disabled={isLocked('LISTENBRAINZ_USER')} /> - label="ListenBrainz username" - labelFor="lb-user" - hint={ - <> - Don't have an account?{" "} - - Sign up free. - - - } - > - setField("user", e.target.value)} - disabled={isLocked("LISTENBRAINZ_USER")} - />
From 610538ae20aa9f6339b12672552d866ff684ff52 Mon Sep 17 00:00:00 2001 From: LumePart Date: Sat, 13 Jun 2026 01:02:10 +0300 Subject: [PATCH 11/11] add correct variable references --- src/web/backend/server.go | 2 +- src/web/frontend/src/components/Settings.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/web/backend/server.go b/src/web/backend/server.go index 113acb2..ffa1403 100644 --- a/src/web/backend/server.go +++ b/src/web/backend/server.go @@ -603,7 +603,7 @@ func (s *Server) handleSavePathTemplate(w http.ResponseWriter, r *http.Request) w.WriteHeader(http.StatusOK) } -// handleSaveEnrichMetadata writes ENRICH_METADATA=true/false to the .env file. +// handleSaveEnrichMetadata writes ENRICH_TRACK_METADATA=true/false to the .env file. func (s *Server) handleSaveEnrichMetadata(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { http.Error(w, "method not allowed", http.StatusMethodNotAllowed) diff --git a/src/web/frontend/src/components/Settings.jsx b/src/web/frontend/src/components/Settings.jsx index 5c9d166..ffd72cc 100644 --- a/src/web/frontend/src/components/Settings.jsx +++ b/src/web/frontend/src/components/Settings.jsx @@ -620,7 +620,7 @@ function DownloadPathSection() { return (
Folder Structure - {/* ENRICH_METADATA toggle */} + {/* ENRICH_TRACK_METADATA toggle */}
Auto-tag songs