improve CLI error semantics and soundcloud canonicalization

Auto-upgrade outdated configs on startup, add actionable SSL verification hints in rip error paths, and harden SoundCloud search/metadata with canonical URL handling and richer source IDs.
This commit is contained in:
2026-04-20 15:16:59 +02:00
parent 0748d5a325
commit 0ba8faa943
9 changed files with 502 additions and 106 deletions

View File

@@ -171,7 +171,7 @@ func Load(path string) (*Config, error) {
return nil, err
}
var data ConfigData
data := DefaultConfigData()
if err = toml.Unmarshal(raw, &data); err != nil {
return nil, err
}
@@ -184,6 +184,27 @@ func Load(path string) (*Config, error) {
return &Config{Path: resolvedPath, File: data, Session: cloneConfigData(data)}, nil
}
func UpgradeOutdated(path string) (string, error) {
resolvedPath, err := resolvePath(path)
if err != nil {
return "", err
}
raw, err := os.ReadFile(resolvedPath)
if err != nil {
return "", err
}
data := DefaultConfigData()
if err = toml.Unmarshal(raw, &data); err != nil {
return "", err
}
applyRuntimeDefaults(&data)
data.Misc.Version = CurrentConfigVersion
if err = saveConfigData(resolvedPath, data); err != nil {
return "", err
}
return resolvedPath, nil
}
func (c *Config) SaveFile() error {
return saveConfigData(c.Path, c.File)
}

View File

@@ -53,6 +53,37 @@ func TestLoadOutdatedConfig(t *testing.T) {
}
}
func TestUpgradeOutdatedConfig(t *testing.T) {
tmpDir := t.TempDir()
path := filepath.Join(tmpDir, "config.toml")
data := DefaultConfigData()
data.Misc.Version = "1.0.0"
data.Downloads.Folder = filepath.Join(tmpDir, "Music")
if err := saveConfigData(path, data); err != nil {
t.Fatalf("saveConfigData() error = %v", err)
}
resolved, err := UpgradeOutdated(path)
if err != nil {
t.Fatalf("UpgradeOutdated() error = %v", err)
}
if resolved != path {
t.Fatalf("resolved path = %q, want %q", resolved, path)
}
cfg, err := Load(path)
if err != nil {
t.Fatalf("Load() after upgrade error = %v", err)
}
if cfg.File.Misc.Version != CurrentConfigVersion {
t.Fatalf("version = %q, want %q", cfg.File.Misc.Version, CurrentConfigVersion)
}
if cfg.File.Downloads.Folder != data.Downloads.Folder {
t.Fatalf("downloads folder changed unexpectedly")
}
}
func TestSessionCloneDoesNotAliasSlices(t *testing.T) {
tmpDir := t.TempDir()
path := filepath.Join(tmpDir, "config.toml")