diff --git a/app.go b/app.go index c0d5dea..8baa7d7 100644 --- a/app.go +++ b/app.go @@ -1041,10 +1041,17 @@ func (a *App) CheckAPIStatus(apiType string, apiURL string) bool { return false, nil }) if err != nil { + if apiType == "musicbrainz" { + backend.SetMusicBrainzStatusCheckResult(false) + } fmt.Printf("CheckAPIStatus timeout/error for %s (%s): %v\n", apiType, apiURL, err) return false } + if apiType == "musicbrainz" { + backend.SetMusicBrainzStatusCheckResult(isOnline) + } + return isOnline } diff --git a/backend/amazon.go b/backend/amazon.go index a0b8ed2..679f16b 100644 --- a/backend/amazon.go +++ b/backend/amazon.go @@ -252,12 +252,16 @@ func (a *AmazonDownloader) DownloadByURL(amazonURL, outputDir, quality, filename } res.ISRC = isrc if isrc != "" { - fmt.Println("Fetching MusicBrainz metadata...") - if fetchedMeta, err := FetchMusicBrainzMetadata(isrc, spotifyTrackName, spotifyArtistName, spotifyAlbumName, useSingleGenre, embedGenre); err == nil { - res.Metadata = fetchedMeta - fmt.Println("✓ MusicBrainz metadata fetched") + if ShouldSkipMusicBrainzMetadataFetch() { + fmt.Println("Skipping MusicBrainz metadata fetch because status check is offline.") } else { - fmt.Printf("Warning: Failed to fetch MusicBrainz metadata: %v\n", err) + fmt.Println("Fetching MusicBrainz metadata...") + if fetchedMeta, err := FetchMusicBrainzMetadata(isrc, spotifyTrackName, spotifyArtistName, spotifyAlbumName, useSingleGenre, embedGenre); err == nil { + res.Metadata = fetchedMeta + fmt.Println("✓ MusicBrainz metadata fetched") + } else { + fmt.Printf("Warning: Failed to fetch MusicBrainz metadata: %v\n", err) + } } } metaChan <- res diff --git a/backend/musicbrainz.go b/backend/musicbrainz.go index 7ba5009..81cb2f9 100644 --- a/backend/musicbrainz.go +++ b/backend/musicbrainz.go @@ -22,6 +22,7 @@ const ( musicBrainzRequestRetryWait = 3 * time.Second musicBrainzMinRequestInterval = 1100 * time.Millisecond musicBrainzThrottleCooldownOn503 = 5 * time.Second + musicBrainzStatusCheckSkipWindow = 5 * time.Minute ) type musicBrainzStatusError struct { @@ -46,8 +47,35 @@ var ( musicBrainzThrottleMu sync.Mutex musicBrainzNextRequest time.Time musicBrainzBlockedTill time.Time + + musicBrainzStatusMu sync.RWMutex + musicBrainzLastCheckedAt time.Time + musicBrainzLastCheckedOnline bool ) +func SetMusicBrainzStatusCheckResult(online bool) { + musicBrainzStatusMu.Lock() + defer musicBrainzStatusMu.Unlock() + + musicBrainzLastCheckedAt = time.Now() + musicBrainzLastCheckedOnline = online +} + +func ShouldSkipMusicBrainzMetadataFetch() bool { + musicBrainzStatusMu.RLock() + defer musicBrainzStatusMu.RUnlock() + + if musicBrainzLastCheckedAt.IsZero() { + return false + } + + if musicBrainzLastCheckedOnline { + return false + } + + return time.Since(musicBrainzLastCheckedAt) <= musicBrainzStatusCheckSkipWindow +} + type MusicBrainzRecordingResponse struct { Recordings []struct { ID string `json:"id"` @@ -216,6 +244,11 @@ func FetchMusicBrainzMetadata(isrc, title, artist, album string, useSingleGenre return cached.(Metadata), nil } + if ShouldSkipMusicBrainzMetadataFetch() { + resultErr = fmt.Errorf("skipping MusicBrainz lookup because the latest status check reported offline") + return meta, resultErr + } + musicBrainzInflightMu.Lock() if call, ok := musicBrainzInflight[cacheKey]; ok { musicBrainzInflightMu.Unlock() diff --git a/backend/qobuz.go b/backend/qobuz.go index b2b7735..ba1d36b 100644 --- a/backend/qobuz.go +++ b/backend/qobuz.go @@ -408,13 +408,18 @@ func (q *QobuzDownloader) DownloadTrackWithISRC(isrc, outputDir, quality, filena metaChan := make(chan Metadata, 1) if embedGenre && isrc != "" { go func() { - fmt.Println("Fetching MusicBrainz metadata...") - if fetchedMeta, err := FetchMusicBrainzMetadata(isrc, spotifyTrackName, spotifyArtistName, spotifyAlbumName, useSingleGenre, embedGenre); err == nil { - fmt.Println("✓ MusicBrainz metadata fetched") - metaChan <- fetchedMeta - } else { - fmt.Printf("Warning: Failed to fetch MusicBrainz metadata: %v\n", err) + if ShouldSkipMusicBrainzMetadataFetch() { + fmt.Println("Skipping MusicBrainz metadata fetch because status check is offline.") metaChan <- Metadata{} + } else { + fmt.Println("Fetching MusicBrainz metadata...") + if fetchedMeta, err := FetchMusicBrainzMetadata(isrc, spotifyTrackName, spotifyArtistName, spotifyAlbumName, useSingleGenre, embedGenre); err == nil { + fmt.Println("✓ MusicBrainz metadata fetched") + metaChan <- fetchedMeta + } else { + fmt.Printf("Warning: Failed to fetch MusicBrainz metadata: %v\n", err) + metaChan <- Metadata{} + } } }() } else { diff --git a/backend/tidal.go b/backend/tidal.go index af5fe31..ee16973 100644 --- a/backend/tidal.go +++ b/backend/tidal.go @@ -493,12 +493,16 @@ func (t *TidalDownloader) DownloadByURL(tidalURL, outputDir, quality, filenameFo } res.ISRC = isrc if isrc != "" { - fmt.Println("Fetching MusicBrainz metadata...") - if fetchedMeta, err := FetchMusicBrainzMetadata(isrc, trackTitle, artistName, albumTitle, useSingleGenre, embedGenre); err == nil { - res.Metadata = fetchedMeta - fmt.Println("✓ MusicBrainz metadata fetched") + if ShouldSkipMusicBrainzMetadataFetch() { + fmt.Println("Skipping MusicBrainz metadata fetch because status check is offline.") } else { - fmt.Printf("Warning: Failed to fetch MusicBrainz metadata: %v\n", err) + fmt.Println("Fetching MusicBrainz metadata...") + if fetchedMeta, err := FetchMusicBrainzMetadata(isrc, trackTitle, artistName, albumTitle, useSingleGenre, embedGenre); err == nil { + res.Metadata = fetchedMeta + fmt.Println("✓ MusicBrainz metadata fetched") + } else { + fmt.Printf("Warning: Failed to fetch MusicBrainz metadata: %v\n", err) + } } } metaChan <- res @@ -657,12 +661,16 @@ func (t *TidalDownloader) DownloadByURLWithFallback(tidalURL, outputDir, quality } res.ISRC = isrc if isrc != "" { - fmt.Println("Fetching MusicBrainz metadata...") - if fetchedMeta, err := FetchMusicBrainzMetadata(isrc, trackTitle, artistName, albumTitle, useSingleGenre, embedGenre); err == nil { - res.Metadata = fetchedMeta - fmt.Println("✓ MusicBrainz metadata fetched") + if ShouldSkipMusicBrainzMetadataFetch() { + fmt.Println("Skipping MusicBrainz metadata fetch because status check is offline.") } else { - fmt.Printf("Warning: Failed to fetch MusicBrainz metadata: %v\n", err) + fmt.Println("Fetching MusicBrainz metadata...") + if fetchedMeta, err := FetchMusicBrainzMetadata(isrc, trackTitle, artistName, albumTitle, useSingleGenre, embedGenre); err == nil { + res.Metadata = fetchedMeta + fmt.Println("✓ MusicBrainz metadata fetched") + } else { + fmt.Printf("Warning: Failed to fetch MusicBrainz metadata: %v\n", err) + } } } metaChan <- res