feat(playlists): библиотека плейлистов приложения

CRUD в редакторе, read-only окно на пульте, отдельный аудиоканал, экспорт/импорт и маппинг из Foundry.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-09-03 10:37:21 +08:00
parent cfb6e62331
commit 278eb78637
46 changed files with 2438 additions and 41 deletions
@@ -111,6 +111,7 @@ export const EDITOR_MESSAGES: Record<EditorLocale, Record<string, string>> = {
'top.project': 'Проект',
'top.file': 'Файл',
'top.players': 'Игроки',
'top.playlists': 'Плейлисты',
'top.backToProjects': 'К списку проектов',
'top.appVersion': 'Версия приложения',
'top.run': 'Запустить',
@@ -325,6 +326,8 @@ export const EDITOR_MESSAGES: Record<EditorLocale, Record<string, string>> = {
'export.npcsHint':
'Отметьте НПС для экспорта. Вместе с ними попадут связи между отмеченными и группы этих персонажей.',
'export.selectAllNpcs': 'Отметить всех',
'export.playlists': 'Плейлисты',
'export.playlistsHint': 'По умолчанию не выбраны. Отметьте плейлисты, которые нужно упаковать в архив.',
'export.next': 'Далее',
'export.back': 'Назад',
'export.exporting': 'Экспорт…',
@@ -459,6 +462,31 @@ export const EDITOR_MESSAGES: Record<EditorLocale, Record<string, string>> = {
'players.deleteTeamTitle': 'Удаление команды',
'players.deleteTeamConfirm': 'Вы уверены, что хотите удалить команду «{name}»? Игроки останутся без команды.',
'playlists.title': 'Плейлисты',
'playlists.search': 'Поиск по плейлистам и трекам…',
'playlists.create': 'Создать',
'playlists.rename': 'Переименовать',
'playlists.duplicate': 'Дублировать',
'playlists.delete': 'Удалить',
'playlists.deleteTitle': 'Удаление плейлиста',
'playlists.deleteConfirm':
'Удалить плейлист «{name}»? Если он сейчас играет — воспроизведение остановится.',
'playlists.addAudio': 'Добавить аудио',
'playlists.empty': 'Нет плейлистов. Создайте первый.',
'playlists.emptyTracks': 'В плейлисте пока нет треков.',
'playlists.dropAudioHint': 'Перетащите аудиофайлы сюда',
'playlists.untitled': 'Без названия',
'playlists.play': 'Играть',
'playlists.pause': 'Пауза',
'playlists.prev': 'Предыдущий',
'playlists.next': 'Следующий',
'playlists.volume': 'Громкость',
'playlists.scrub': 'Перемотка',
'playlists.emptyPlayer': 'Ничего не играет',
'playlists.playPlaylist': 'Играть плейлист',
'playlists.removeTrack': 'Убрать',
'playlists.renameAudio': 'Переименовать трек',
'npcs.open': 'НПС',
'npcs.editorTitle': 'НПС',
'npcs.add': 'Добавить',
@@ -619,6 +647,7 @@ export const EDITOR_MESSAGES: Record<EditorLocale, Record<string, string>> = {
'control.markerTool': 'Маркер',
'control.markerColor': 'Цвет маркера',
'control.materialsTool': 'Материалы',
'control.playlistsTool': 'Плейлисты',
'control.npcsTool': 'НПС',
'control.descriptionMissing': 'Описание отсутствует',
'control.effects': 'ЭФФЕКТЫ',
@@ -761,6 +790,7 @@ export const EDITOR_MESSAGES: Record<EditorLocale, Record<string, string>> = {
'top.project': 'Project',
'top.file': 'File',
'top.players': 'Players',
'top.playlists': 'Playlists',
'top.backToProjects': 'Back to projects',
'top.appVersion': 'App version',
'top.run': 'Run',
@@ -975,6 +1005,8 @@ export const EDITOR_MESSAGES: Record<EditorLocale, Record<string, string>> = {
'export.npcsHint':
'Select NPCs to export. Relations between selected NPCs and their groups are included.',
'export.selectAllNpcs': 'Select all',
'export.playlists': 'Playlists',
'export.playlistsHint': 'None selected by default. Check playlists to include in the archive.',
'export.next': 'Next',
'export.back': 'Back',
'export.exporting': 'Exporting…',
@@ -1111,6 +1143,31 @@ export const EDITOR_MESSAGES: Record<EditorLocale, Record<string, string>> = {
'players.deleteTeamConfirm':
'Are you sure you want to delete team “{name}”? Players will become ungrouped.',
'playlists.title': 'Playlists',
'playlists.search': 'Search playlists and tracks…',
'playlists.create': 'Create',
'playlists.rename': 'Rename',
'playlists.duplicate': 'Duplicate',
'playlists.delete': 'Delete',
'playlists.deleteTitle': 'Delete playlist',
'playlists.deleteConfirm':
'Delete playlist “{name}”? If it is playing, playback will stop.',
'playlists.addAudio': 'Add audio',
'playlists.empty': 'No playlists yet. Create one.',
'playlists.emptyTracks': 'This playlist has no tracks yet.',
'playlists.dropAudioHint': 'Drop audio files here',
'playlists.untitled': 'Untitled',
'playlists.play': 'Play',
'playlists.pause': 'Pause',
'playlists.prev': 'Previous',
'playlists.next': 'Next',
'playlists.volume': 'Volume',
'playlists.scrub': 'Seek',
'playlists.emptyPlayer': 'Nothing playing',
'playlists.playPlaylist': 'Play playlist',
'playlists.removeTrack': 'Remove',
'playlists.renameAudio': 'Rename track',
'npcs.open': 'NPCs',
'npcs.editorTitle': 'NPCs',
'npcs.add': 'Add',
@@ -1271,6 +1328,7 @@ export const EDITOR_MESSAGES: Record<EditorLocale, Record<string, string>> = {
'control.markerTool': 'Marker',
'control.markerColor': 'Marker color',
'control.materialsTool': 'Materials',
'control.playlistsTool': 'Playlists',
'control.npcsTool': 'NPCs',
'control.descriptionMissing': 'No description',
'control.effects': 'EFFECTS',