feat(library): add lyrics filtering and metadata actions

This commit is contained in:
zarzet
2026-08-27 01:44:06 +07:00
parent 04c42bd511
commit 1a7c20111a
60 changed files with 1454 additions and 276 deletions
+1
View File
@@ -39,6 +39,7 @@ type LibraryScanResult struct {
Comment string `json:"comment,omitempty"`
AlbumType string `json:"albumType,omitempty"`
Explicit bool `json:"explicit,omitempty"`
HasLyrics bool `json:"hasLyrics"`
UPC string `json:"upc,omitempty"`
Format string `json:"format,omitempty"`
MetadataFromFilename bool `json:"metadataFromFilename,omitempty"`
+40 -28
View File
@@ -30,38 +30,49 @@ func scanAudioFileWithKnownModTimeAndDisplayNameAndCoverCacheKey(filePath, displ
libraryCoverCacheMu.RLock()
coverCacheDir := libraryCoverCacheDir
libraryCoverCacheMu.RUnlock()
var scanned *LibraryScanResult
var scanErr error
if ext == ".flac" {
return scanFLACFileWithCoverCache(filePath, result, displayNameHint, coverCacheDir, coverCacheKey)
}
if ext == ".m4a" || ext == ".mp4" || ext == ".aac" {
return scanM4AFileWithCoverCache(filePath, result, displayNameHint, coverCacheDir, coverCacheKey)
}
if coverCacheDir != "" {
coverPath, err := SaveCoverToCacheWithHintAndKey(
filePath,
displayNameHint,
coverCacheDir,
coverCacheKey,
)
if err == nil && coverPath != "" {
result.CoverPath = coverPath
scanned, scanErr = scanFLACFileWithCoverCache(filePath, result, displayNameHint, coverCacheDir, coverCacheKey)
} else if ext == ".m4a" || ext == ".mp4" || ext == ".aac" {
scanned, scanErr = scanM4AFileWithCoverCache(filePath, result, displayNameHint, coverCacheDir, coverCacheKey)
} else {
if coverCacheDir != "" {
coverPath, err := SaveCoverToCacheWithHintAndKey(
filePath,
displayNameHint,
coverCacheDir,
coverCacheKey,
)
if err == nil && coverPath != "" {
result.CoverPath = coverPath
}
}
switch ext {
case ".mp3":
scanned, scanErr = scanMP3File(filePath, result, displayNameHint)
case ".opus", ".ogg":
scanned, scanErr = scanOggFile(filePath, result, displayNameHint)
case ".ape", ".wv", ".mpc":
scanned, scanErr = scanAPEFile(filePath, result, displayNameHint)
case ".wav":
scanned, scanErr = scanWAVFile(filePath, result, displayNameHint)
case ".aiff", ".aif", ".aifc":
scanned, scanErr = scanAIFFFile(filePath, result, displayNameHint)
default:
scanned, scanErr = scanFromFilename(filePath, displayNameHint, result)
}
}
switch ext {
case ".mp3":
return scanMP3File(filePath, result, displayNameHint)
case ".opus", ".ogg":
return scanOggFile(filePath, result, displayNameHint)
case ".ape", ".wv", ".mpc":
return scanAPEFile(filePath, result, displayNameHint)
case ".wav":
return scanWAVFile(filePath, result, displayNameHint)
case ".aiff", ".aif", ".aifc":
return scanAIFFFile(filePath, result, displayNameHint)
default:
return scanFromFilename(filePath, displayNameHint, result)
if scanErr != nil || scanned == nil {
return scanned, scanErr
}
if !scanned.HasLyrics {
if sidecar, err := extractLyricsFromSidecarLRC(filePath); err == nil {
scanned.HasLyrics = rawLyricsHasUsableContent(sidecar)
}
}
return scanned, nil
}
func embeddedCoverMIME(data []byte) string {
@@ -144,6 +155,7 @@ func scanFLACFileWithCoverCache(filePath string, result *LibraryScanResult, disp
result.Comment = metadata.Comment
result.AlbumType = metadata.AlbumType
result.Explicit = metadata.Explicit
result.HasLyrics = rawLyricsHasUsableContent(metadata.Lyrics)
result.UPC = metadata.UPC
quality, err := audioQualityFromParsedFlac(f)
+1
View File
@@ -976,6 +976,7 @@ func applyAudioMetadataToScan(metadata *AudioMetadata, result *LibraryScanResult
result.Comment = metadata.Comment
result.AlbumType = metadata.AlbumType
result.Explicit = metadata.Explicit
result.HasLyrics = rawLyricsHasUsableContent(metadata.Lyrics)
result.UPC = metadata.UPC
}