diff --git a/analysis_options.yaml b/analysis_options.yaml index 577a9667..e188dd4f 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -36,7 +36,11 @@ linter: rules: # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + always_declare_return_types: true avoid_dynamic_calls: true + avoid_types_as_parameter_names: true + strict_top_level_inference: true + type_annotate_public_apis: true cancel_subscriptions: true close_sinks: true diff --git a/go_backend/coverage_test_helpers_test.go b/go_backend/coverage_test_helpers_test.go index 16aefc48..822faec1 100644 --- a/go_backend/coverage_test_helpers_test.go +++ b/go_backend/coverage_test_helpers_test.go @@ -399,13 +399,3 @@ func createTestExtensionPackage(t *testing.T, path, name, version, js string, ex } } } - -func buildRawAPEItem(key, value string, flags uint32) []byte { - var buf bytes.Buffer - _ = binary.Write(&buf, binary.LittleEndian, uint32(len(value))) - _ = binary.Write(&buf, binary.LittleEndian, flags) - buf.WriteString(key) - buf.WriteByte(0) - buf.WriteString(value) - return buf.Bytes() -} diff --git a/go_backend/exports.go b/go_backend/exports.go index fcc22361..97416180 100644 --- a/go_backend/exports.go +++ b/go_backend/exports.go @@ -2230,7 +2230,7 @@ func ConvertSpotifyToDeezer(resourceType, spotifyID string) (string, error) { return string(jsonBytes), nil } - return "", fmt.Errorf("Spotify to Deezer conversion only supported for tracks and albums. Please search by name for %s", resourceType) + return "", fmt.Errorf("spotify to Deezer conversion only supported for tracks and albums: please search by name for %s", resourceType) } func CheckAvailabilityFromDeezerID(deezerTrackID string) (string, error) { diff --git a/go_backend/extension_manager.go b/go_backend/extension_manager.go index 07b70dba..80649d09 100644 --- a/go_backend/extension_manager.go +++ b/go_backend/extension_manager.go @@ -157,12 +157,12 @@ func (m *extensionManager) SetDirectories(extensionsDir, dataDir string) error { func (m *extensionManager) LoadExtensionFromFile(filePath string) (*loadedExtension, error) { if !strings.HasSuffix(strings.ToLower(filePath), ".spotiflac-ext") { - return nil, fmt.Errorf("Invalid file format. Please select a .spotiflac-ext file") + return nil, fmt.Errorf("invalid file format: please select a .spotiflac-ext file") } zipReader, err := zip.OpenReader(filePath) if err != nil { - return nil, fmt.Errorf("Cannot open extension file. The file may be corrupted or not a valid extension package") + return nil, fmt.Errorf("cannot open extension file: the file may be corrupted or not a valid extension package") } defer zipReader.Close() @@ -187,16 +187,16 @@ func (m *extensionManager) LoadExtensionFromFile(filePath string) (*loadedExtens } if manifestData == nil { - return nil, fmt.Errorf("Invalid extension package: manifest.json not found") + return nil, fmt.Errorf("invalid extension package: manifest.json not found") } if !hasIndexJS { - return nil, fmt.Errorf("Invalid extension package: index.js not found") + return nil, fmt.Errorf("invalid extension package: index.js not found") } manifest, err := ParseManifest(manifestData) if err != nil { - return nil, fmt.Errorf("Invalid extension manifest: %w", err) + return nil, fmt.Errorf("invalid extension manifest: %w", err) } m.mu.RLock() @@ -214,9 +214,9 @@ func (m *extensionManager) LoadExtensionFromFile(filePath string) (*loadedExtens if versionCompare > 0 { return m.UpgradeExtension(filePath) } else if versionCompare == 0 { - return nil, fmt.Errorf("Extension '%s' v%s is already installed", existingDisplayName, existingVersion) + return nil, fmt.Errorf("extension '%s' v%s is already installed", existingDisplayName, existingVersion) } else { - return nil, fmt.Errorf("Cannot downgrade '%s' from v%s to v%s", existingDisplayName, existingVersion, manifest.Version) + return nil, fmt.Errorf("cannot downgrade '%s' from v%s to v%s", existingDisplayName, existingVersion, manifest.Version) } } @@ -224,7 +224,7 @@ func (m *extensionManager) LoadExtensionFromFile(filePath string) (*loadedExtens defer m.mu.Unlock() if _, exists := m.extensions[manifest.Name]; exists { - return nil, fmt.Errorf("Extension '%s' was installed by another process", manifest.DisplayName) + return nil, fmt.Errorf("extension '%s' was installed by another process", manifest.DisplayName) } extDir := filepath.Join(m.extensionsDir, manifest.Name) @@ -426,7 +426,7 @@ func initializeExtensionRuntimeWithSettings( ) error { settingsJSON, err := json.Marshal(settings) if err != nil { - return fmt.Errorf("Failed to save settings") + return fmt.Errorf("failed to save settings") } script := fmt.Sprintf(` @@ -472,7 +472,7 @@ func initializeExtensionWithSettingsLocked( settings map[string]interface{}, ) error { if ext.VM == nil { - return fmt.Errorf("Extension failed to load. Please reinstall the extension") + return fmt.Errorf("extension failed to load: please reinstall the extension") } if err := initializeExtensionRuntimeWithSettings(ext.VM, ext.ID, settings); err != nil { @@ -570,7 +570,7 @@ func (m *extensionManager) UnloadExtension(extensionID string) error { ext, exists := m.extensions[extensionID] if !exists { - return fmt.Errorf("Extension not found") + return fmt.Errorf("extension not found") } ext.VMMu.Lock() @@ -589,7 +589,7 @@ func (m *extensionManager) GetExtension(extensionID string) (*loadedExtension, e ext, exists := m.extensions[extensionID] if !exists { - return nil, fmt.Errorf("Extension not found") + return nil, fmt.Errorf("extension not found") } return ext, nil } @@ -611,7 +611,7 @@ func (m *extensionManager) SetExtensionEnabled(extensionID string, enabled bool) ext, exists := m.extensions[extensionID] if !exists { - return fmt.Errorf("Extension not found") + return fmt.Errorf("extension not found") } if enabled { @@ -689,12 +689,12 @@ func (m *extensionManager) loadExtensionFromDirectory(dirPath string) (*loadedEx manifest, err := ParseManifest(manifestData) if err != nil { - return nil, fmt.Errorf("Invalid extension manifest: %w", err) + return nil, fmt.Errorf("invalid extension manifest: %w", err) } indexPath := filepath.Join(dirPath, "index.js") if _, err := os.Stat(indexPath); os.IsNotExist(err) { - return nil, fmt.Errorf("Extension is missing index.js file") + return nil, fmt.Errorf("extension is missing index.js file") } if existing, exists := m.extensions[manifest.Name]; exists { @@ -757,12 +757,12 @@ func (m *extensionManager) RemoveExtension(extensionID string) error { // Only allows upgrades (new version > current version), not downgrades func (m *extensionManager) UpgradeExtension(filePath string) (*loadedExtension, error) { if !strings.HasSuffix(strings.ToLower(filePath), ".spotiflac-ext") { - return nil, fmt.Errorf("Invalid file format. Please select a .spotiflac-ext file") + return nil, fmt.Errorf("invalid file format: please select a .spotiflac-ext file") } zipReader, err := zip.OpenReader(filePath) if err != nil { - return nil, fmt.Errorf("Cannot open extension file. The file may be corrupted or not a valid extension package") + return nil, fmt.Errorf("cannot open extension file: the file may be corrupted or not a valid extension package") } defer zipReader.Close() @@ -787,16 +787,16 @@ func (m *extensionManager) UpgradeExtension(filePath string) (*loadedExtension, } if manifestData == nil { - return nil, fmt.Errorf("Invalid extension package: manifest.json not found") + return nil, fmt.Errorf("invalid extension package: manifest.json not found") } if !hasIndexJS { - return nil, fmt.Errorf("Invalid extension package: index.js not found") + return nil, fmt.Errorf("invalid extension package: index.js not found") } newManifest, err := ParseManifest(manifestData) if err != nil { - return nil, fmt.Errorf("Invalid extension manifest: %w", err) + return nil, fmt.Errorf("invalid extension manifest: %w", err) } m.mu.RLock() @@ -804,15 +804,15 @@ func (m *extensionManager) UpgradeExtension(filePath string) (*loadedExtension, m.mu.RUnlock() if !exists { - return nil, fmt.Errorf("Extension '%s' is not installed. Use install instead of upgrade.", newManifest.DisplayName) + return nil, fmt.Errorf("extension '%s' is not installed; use install instead of upgrade", newManifest.DisplayName) } versionCompare := compareVersions(newManifest.Version, existing.Manifest.Version) if versionCompare < 0 { - return nil, fmt.Errorf("Cannot downgrade extension. Current version: %s, New version: %s", existing.Manifest.Version, newManifest.Version) + return nil, fmt.Errorf("cannot downgrade extension: current version: %s, new version: %s", existing.Manifest.Version, newManifest.Version) } if versionCompare == 0 { - return nil, fmt.Errorf("Extension is already at version %s", existing.Manifest.Version) + return nil, fmt.Errorf("extension is already at version %s", existing.Manifest.Version) } GoLog("[Extension] Upgrading %s from v%s to v%s\n", newManifest.DisplayName, existing.Manifest.Version, newManifest.Version) @@ -906,13 +906,13 @@ type ExtensionUpgradeInfo struct { func (m *extensionManager) checkExtensionUpgradeInternal(filePath string) (*ExtensionUpgradeInfo, error) { if !strings.HasSuffix(strings.ToLower(filePath), ".spotiflac-ext") { - return nil, fmt.Errorf("Invalid file format. Please select a .spotiflac-ext file") + return nil, fmt.Errorf("invalid file format: please select a .spotiflac-ext file") } zipReader, err := zip.OpenReader(filePath) if err != nil { - return nil, fmt.Errorf("Cannot open extension file") + return nil, fmt.Errorf("cannot open extension file") } defer zipReader.Close() @@ -939,7 +939,7 @@ func (m *extensionManager) checkExtensionUpgradeInternal(filePath string) (*Exte newManifest, err := ParseManifest(manifestData) if err != nil { - return nil, fmt.Errorf("Invalid manifest: %w", err) + return nil, fmt.Errorf("invalid manifest: %w", err) } m.mu.RLock() @@ -1082,7 +1082,7 @@ func (m *extensionManager) InitializeExtension(extensionID string, settings map[ ext, exists := m.extensions[extensionID] if !exists { - return fmt.Errorf("Extension not found") + return fmt.Errorf("extension not found") } ext.VMMu.Lock() @@ -1100,7 +1100,7 @@ func (m *extensionManager) CleanupExtension(extensionID string) error { ext, exists := m.extensions[extensionID] if !exists { - return fmt.Errorf("Extension not found") + return fmt.Errorf("extension not found") } if ext.VM == nil { diff --git a/go_backend/extension_providers.go b/go_backend/extension_providers.go index 0aac5418..33f5f539 100644 --- a/go_backend/extension_providers.go +++ b/go_backend/extension_providers.go @@ -3333,11 +3333,7 @@ func (p *extensionProviderWrapper) FetchLyrics(trackName, artistName, albumName } for _, line := range extResult.Lines { - response.Lines = append(response.Lines, LyricsLine{ - StartTimeMs: line.StartTimeMs, - Words: line.Words, - EndTimeMs: line.EndTimeMs, - }) + response.Lines = append(response.Lines, LyricsLine(line)) } if len(response.Lines) == 0 && response.PlainLyrics != "" && !response.Instrumental { diff --git a/go_backend/extension_runtime_binary.go b/go_backend/extension_runtime_binary.go index 07535420..1fb02c17 100644 --- a/go_backend/extension_runtime_binary.go +++ b/go_backend/extension_runtime_binary.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/dop251/goja" + //lint:ignore SA1019 Blowfish is required for legacy extension crypto compatibility. "golang.org/x/crypto/blowfish" ) diff --git a/go_backend/extension_runtime_storage.go b/go_backend/extension_runtime_storage.go index 541e67ba..86f95c3c 100644 --- a/go_backend/extension_runtime_storage.go +++ b/go_backend/extension_runtime_storage.go @@ -340,16 +340,6 @@ func (r *extensionRuntime) ensureCredentialsLoaded() error { return nil } -func (r *extensionRuntime) loadCredentials() (map[string]interface{}, error) { - if err := r.ensureCredentialsLoaded(); err != nil { - return nil, err - } - - r.credentialsMu.RLock() - defer r.credentialsMu.RUnlock() - return cloneInterfaceMap(r.credentialsCache), nil -} - func (r *extensionRuntime) saveCredentials(creds map[string]interface{}) error { data, err := json.Marshal(creds) if err != nil { diff --git a/go_backend/httputil_utls.go b/go_backend/httputil_utls.go index 8c9c721a..1ef51979 100644 --- a/go_backend/httputil_utls.go +++ b/go_backend/httputil_utls.go @@ -10,16 +10,13 @@ import ( "net/http" "net/url" "strings" - "sync" utls "github.com/refraction-networking/utls" "golang.org/x/net/http2" ) type utlsTransport struct { - dialer *net.Dialer - mu sync.Mutex - h2Transports map[string]*http2.Transport + dialer *net.Dialer } func newUTLSTransport() *utlsTransport { @@ -28,7 +25,6 @@ func newUTLSTransport() *utlsTransport { Timeout: 30 * Second, KeepAlive: 30 * Second, }, - h2Transports: make(map[string]*http2.Transport), } } diff --git a/go_backend/library_scan.go b/go_backend/library_scan.go index e1752d9a..ea153256 100644 --- a/go_backend/library_scan.go +++ b/go_backend/library_scan.go @@ -276,18 +276,10 @@ func ScanLibraryFolder(folderPath string) (string, error) { return string(jsonBytes), nil } -func scanAudioFile(filePath, scanTime string) (*LibraryScanResult, error) { - return scanAudioFileWithKnownModTimeAndDisplayName(filePath, "", scanTime, 0) -} - func scanAudioFileWithKnownModTime(filePath, scanTime string, knownModTime int64) (*LibraryScanResult, error) { return scanAudioFileWithKnownModTimeAndDisplayNameAndCoverCacheKey(filePath, "", "", scanTime, knownModTime) } -func scanAudioFileWithKnownModTimeAndDisplayName(filePath, displayNameHint, scanTime string, knownModTime int64) (*LibraryScanResult, error) { - return scanAudioFileWithKnownModTimeAndDisplayNameAndCoverCacheKey(filePath, displayNameHint, "", scanTime, knownModTime) -} - func scanAudioFileWithKnownModTimeAndDisplayNameAndCoverCacheKey(filePath, displayNameHint, coverCacheKey, scanTime string, knownModTime int64) (*LibraryScanResult, error) { ext := resolveLibraryAudioExt(filePath, displayNameHint) diff --git a/go_backend/lyrics_musixmatch.go b/go_backend/lyrics_musixmatch.go index 309f5480..027188de 100644 --- a/go_backend/lyrics_musixmatch.go +++ b/go_backend/lyrics_musixmatch.go @@ -16,32 +16,6 @@ type MusixmatchClient struct { baseURL string } -type musixmatchSearchResponse struct { - ID int64 `json:"id"` - SongName string `json:"songName"` - ArtistName string `json:"artistName"` - AlbumName string `json:"albumName"` - Artwork string `json:"artwork"` - ReleaseDate string `json:"releaseDate"` - Duration int `json:"duration"` - URL string `json:"url"` - AlbumID int64 `json:"albumId"` - HasSyncedLyrics bool `json:"hasSyncedLyrics"` - HasUnsyncedLyrics bool `json:"hasUnsyncedLyrics"` - AvailableLanguages []string `json:"availableLanguages"` - OriginalLanguage string `json:"originalLanguage"` - SyncedLyrics *musixmatchLyricsResponse `json:"syncedLyrics"` - UnsyncedLyrics *musixmatchLyricsResponse `json:"unsyncedLyrics"` -} - -type musixmatchLyricsResponse struct { - ID int64 `json:"id"` - Duration int `json:"duration"` - Language string `json:"language"` - UpdatedTime string `json:"updatedTime"` - Lyrics string `json:"lyrics"` -} - func NewMusixmatchClient() *MusixmatchClient { return &MusixmatchClient{ httpClient: NewMetadataHTTPClient(15 * time.Second), diff --git a/go_backend/metadata.go b/go_backend/metadata.go index 6ac35adf..cfa8432e 100644 --- a/go_backend/metadata.go +++ b/go_backend/metadata.go @@ -1150,17 +1150,6 @@ func readM4ATextValue(f *os.File, parent atomHeader, fileSize int64) (string, er return strings.TrimSpace(strings.TrimRight(string(payload), "\x00")), nil } -func readM4AIndexValue(f *os.File, parent atomHeader, fileSize int64) (int, error) { - payload, err := readM4ADataPayload(f, parent, fileSize) - if err != nil { - return 0, err - } - if len(payload) < 4 { - return 0, fmt.Errorf("index payload too short in %s", parent.typ) - } - return int(binary.BigEndian.Uint16(payload[2:4])), nil -} - func readM4AIndexPair(f *os.File, parent atomHeader, fileSize int64) (int, int, error) { payload, err := readM4ADataPayload(f, parent, fileSize) if err != nil { diff --git a/go_backend/progress.go b/go_backend/progress.go index 6fc20b65..5837dfb4 100644 --- a/go_backend/progress.go +++ b/go_backend/progress.go @@ -56,9 +56,6 @@ type progressBridgeState struct { } var ( - downloadDir string - downloadDirMu sync.RWMutex - multiProgress = MultiProgress{Items: make(map[string]*ItemProgress)} multiMu sync.RWMutex multiProgressDirty = true @@ -368,9 +365,6 @@ func ClearAllItemProgress() { } func setDownloadDir(path string) error { - downloadDirMu.Lock() - defer downloadDirMu.Unlock() - downloadDir = path return nil } diff --git a/go_backend/title_match_utils.go b/go_backend/title_match_utils.go index 00da7e08..52ecaeb4 100644 --- a/go_backend/title_match_utils.go +++ b/go_backend/title_match_utils.go @@ -138,11 +138,7 @@ func artistsMatch(expectedArtist, foundArtist string) bool { } } - if isLatinScript(expectedArtist) != isLatinScript(foundArtist) { - return true - } - - return false + return isLatinScript(expectedArtist) != isLatinScript(foundArtist) } func splitArtists(artists string) []string {