feat(metadata): implement single-track metadata editor page (§A7)
Replace the placeholder with a controlled form for title/artist/album/ year/genre/track number, an AcoustID "find matches" action showing ranked candidates with confidence, a diff/apply picker, a re-enrich button, and save via PUT /metadata. Adds matches/apply API endpoints, mappers, types, and en/ru i18n strings. Batch editor remains a placeholder (deferred).
This commit is contained in:
@@ -281,6 +281,39 @@ const en = {
|
||||
manual: 'Edited manually — not auto-updated',
|
||||
},
|
||||
},
|
||||
metadataEditor: {
|
||||
error: 'Failed to load track',
|
||||
saved: 'Metadata saved.',
|
||||
saveError: 'Failed to save metadata.',
|
||||
save: 'Save',
|
||||
fields: {
|
||||
title: 'Title',
|
||||
artist: 'Artist',
|
||||
album: 'Album',
|
||||
year: 'Year',
|
||||
genre: 'Genre',
|
||||
trackNumber: 'Track number',
|
||||
},
|
||||
autoEnrich: {
|
||||
title: 'AcoustID lookup',
|
||||
hint: 'Identify this track by audio fingerprint.',
|
||||
findMatches: 'Find matches',
|
||||
reEnrich: 'Re-run enrichment',
|
||||
enqueued: 'Enrichment queued — refresh in a moment.',
|
||||
error: 'Could not look up matches.',
|
||||
noMatches: 'No matches found.',
|
||||
},
|
||||
matches: {
|
||||
use: 'Use',
|
||||
unknownTitle: 'Unknown title',
|
||||
},
|
||||
diff: {
|
||||
title: 'Apply this match?',
|
||||
noChanges: 'No changes from current values.',
|
||||
cancel: 'Cancel',
|
||||
apply: 'Apply',
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export default en;
|
||||
|
||||
@@ -283,6 +283,39 @@ const ru: Translations = {
|
||||
manual: 'Изменено вручную — не обновляется автоматически',
|
||||
},
|
||||
},
|
||||
metadataEditor: {
|
||||
error: 'Не удалось загрузить трек',
|
||||
saved: 'Метаданные сохранены.',
|
||||
saveError: 'Не удалось сохранить метаданные.',
|
||||
save: 'Сохранить',
|
||||
fields: {
|
||||
title: 'Название',
|
||||
artist: 'Исполнитель',
|
||||
album: 'Альбом',
|
||||
year: 'Год',
|
||||
genre: 'Жанр',
|
||||
trackNumber: 'Номер трека',
|
||||
},
|
||||
autoEnrich: {
|
||||
title: 'Поиск по AcoustID',
|
||||
hint: 'Определить трек по аудио-отпечатку.',
|
||||
findMatches: 'Найти совпадения',
|
||||
reEnrich: 'Повторить обогащение',
|
||||
enqueued: 'Обогащение запущено — обновите через момент.',
|
||||
error: 'Не удалось найти совпадения.',
|
||||
noMatches: 'Совпадений не найдено.',
|
||||
},
|
||||
matches: {
|
||||
use: 'Использовать',
|
||||
unknownTitle: 'Неизвестное название',
|
||||
},
|
||||
diff: {
|
||||
title: 'Применить это совпадение?',
|
||||
noChanges: 'Нет изменений относительно текущих значений.',
|
||||
cancel: 'Отмена',
|
||||
apply: 'Применить',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default ru;
|
||||
|
||||
Reference in New Issue
Block a user