feat: a held album below the quality you settle for, or holding a video rip, stays wanted for a better copy, and the import replaces the old tracks with their likes and plays carried over (M502 #5524)
release / govulncheck (push) Successful in 15s
release / web (push) Successful in 1m23s
release / go (push) Successful in 1m41s
release / integration (push) Successful in 5m20s
release / android (push) Successful in 5m28s
release / Build signed APK (releases and dev) (push) Successful in 5m30s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 27s
release / Verify release artifacts (tag releases only) (push) Skipped
release / govulncheck (push) Successful in 15s
release / web (push) Successful in 1m23s
release / go (push) Successful in 1m41s
release / integration (push) Successful in 5m20s
release / android (push) Successful in 5m28s
release / Build signed APK (releases and dev) (push) Successful in 5m30s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 27s
release / Verify release artifacts (tag releases only) (push) Skipped
- acquisition_settings.upgrade_until (default High quality lossy, Lidarr's cutoff, note #5527; "" is off), an "Upgrade until" row under Searching. - The wanted worker judges held albums hourly: tier per format from size per second (the scanner records no bitrate), the album's worst. Below the cutoff it is wanted for quality; a video rip among its tracks always. - The schedule searches upgrades weekly, after open wants; a release no better than the copy held is refused ("not_better"). - The import matches each file to the track it would replace (recording, then disc/track) and replaces it when it is a rip or the file is a better tier: over the same path in one rename, or filed beside it and the old track folded in (library.ReplaceTrack: file first, then foldTrackInto). Nothing better: the release is set aside. - Collection › Upgrades (Lidarr's Cutoff Unmet); Suspect sources says when a clean copy was looked for instead of Lidarr's search. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -92,7 +92,19 @@ var taggable = map[string]bool{".flac": true, ".ogg": true, ".opus": true, ".mp3
|
||||
// container will not take the file's streams) the file is copied as it is
|
||||
// and tagged reports false. An existing dst is never overwritten.
|
||||
func Place(ctx context.Context, src, dst string, t Tags) (tagged bool, err error) {
|
||||
if _, err := os.Lstat(dst); err == nil {
|
||||
return placeFile(ctx, src, dst, t, false)
|
||||
}
|
||||
|
||||
// Overwrite is Place onto a file an upgrade replaces (#5524): the new copy
|
||||
// takes the old one's path in one rename, so the library never sees the
|
||||
// path empty, and the track row at that path, history and all, carries on
|
||||
// with the new file.
|
||||
func Overwrite(ctx context.Context, src, dst string, t Tags) (tagged bool, err error) {
|
||||
return placeFile(ctx, src, dst, t, true)
|
||||
}
|
||||
|
||||
func placeFile(ctx context.Context, src, dst string, t Tags, overwrite bool) (tagged bool, err error) {
|
||||
if _, err := os.Lstat(dst); err == nil && !overwrite {
|
||||
return false, fmt.Errorf("%w: %s", ErrOccupied, dst)
|
||||
}
|
||||
dir := filepath.Dir(dst)
|
||||
@@ -114,7 +126,7 @@ func Place(ctx context.Context, src, dst string, t Tags) (tagged bool, err error
|
||||
if err := os.Chmod(tmp, 0o644); err != nil {
|
||||
return false, fmt.Errorf("chmod %s: %w", tmp, err)
|
||||
}
|
||||
if _, err := os.Lstat(dst); err == nil {
|
||||
if _, err := os.Lstat(dst); err == nil && !overwrite {
|
||||
return false, fmt.Errorf("%w: %s", ErrOccupied, dst)
|
||||
}
|
||||
if err := os.Rename(tmp, dst); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user