diff --git a/changelog.md b/changelog.md index 5bc10d73..d34925ba 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,6 @@ +`2024-06.25 v0.0.5` +【修复】修复重启软件后歌单丢失的问题;如果未出现上述问题可忽略此版本更新 + `2024-06.16 v0.0.4` 1. 【功能】播放列表支持拖拽排序 diff --git a/package.json b/package.json index 8e921ec0..95482674 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "musicfree-desktop", "productName": "MusicFree", - "version": "0.0.4", + "version": "0.0.5", "description": "一个插件化的音乐播放器", "main": ".webpack/main", "scripts": { diff --git a/release/version.json b/release/version.json index 1a3cc62c..2805f334 100644 --- a/release/version.json +++ b/release/version.json @@ -1,6 +1,8 @@ { - "version": "0.0.4", + "version": "0.0.5", "changeLog": [ + "【修复】修复重启软件后歌单丢失的问题;如果未出现上述问题可忽略此版本更新", + "--- 以下为 0.0.4 更新 ---", "1. 【功能】播放列表支持拖拽排序", "2. 【功能】支持多语言。本次支持简体中文、繁体中文、英文、西班牙语", "3. 【功能】支持歌词翻译功能(需要插件实现getLyric方法)", @@ -12,5 +14,5 @@ "9. 【修复】修复部分情况下本地歌词无法读取的问题", "10. 【修复】修复 linux 托盘点击无效的问题" ], - "download": ["https://www.123pan.com/s/grz2jv-XimAA.html"] + "download": ["https://www.123pan.com/s/grz2jv-CjmAA.html"] } diff --git a/res/lang/ru-RU.json b/res/lang/ru-RU.json new file mode 100644 index 00000000..1e4dce9a --- /dev/null +++ b/res/lang/ru-RU.json @@ -0,0 +1,395 @@ +{ + "common": { + "cancel": "Отменить", + "confirm": "Подтвердить", + "download": "Скачать", + "downloading": "Загрузка", + "downloaded": "Загружено", + "remove": "Удалить", + "delete": "Удалить", + "default": "По умолчанию", + "version_code": "Версия", + "operation": "Операция", + "update": "Обновить", + "uninstall": "Деинсталлировать", + "install": "Установить", + "about": "О", + "exit": "Выход", + "edit": "Редактировать", + "undo": "Отменить", + "redo": "Повторить", + "cut": "Вырезать", + "copy": "Копировать", + "paste": "Вставить", + "select_all": "Выбрать все", + "loading": "Загрузка", + "create": "Создать", + "add": "Добавить", + "save": "Сохранить", + "clear": "Очистить", + "open": "Открыть", + "status": "Статус" + }, + + "media": { + "unknown_title": "Без названия", + "unknown_artist": "Неизвестный исполнитель", + "unknown_album": "Неизвестный альбом", + + "default_favorite_sheet_name": "Избранное", + + "playlist": "Плейлист", + + "media_type_music": "Музыка", + "media_type_album": "Альбом", + "media_type_artist": "Исполнитель", + "media_type_sheet": "Плейлист", + "media_type_lyric": "Текст песни", + + "media_title": "Название", + "media_platform": "Источник", + "media_duration": "Длительность", + "media_create_at": "Дата создания", + "media_play_count": "Количество воспроизведений", + "media_music_count": "Количество песен", + "media_description": "Описание", + + "music_state_pause": "Пауза", + "music_state_play": "Воспроизведение", + "music_state_play_or_pause": "Воспроизведение/Пауза", + "music_quality_low": "Низкое качество", + "music_quality_standard": "Стандартное качество", + "music_quality_high": "Высокое качество", + "music_quality_super": "Супер качество", + + "music_repeat_mode": "Режим воспроизведения", + "music_repeat_mode_loop": "Повтор одной песни", + "music_repeat_mode_queue": "Повтор списка", + "music_repeat_mode_shuffle": "Случайное воспроизведение" + }, + + "plugin": { + "prop_user_variable": "Переменная пользователя", + "method_search": "Поиск", + "method_import_music_item": "Импортировать песню", + "method_import_music_sheet": "Импортировать плейлист", + "method_get_top_lists": "Топ-листы", + + "info_hint_you_have_no_plugin": "У вас нет установленных плагинов", + "info_hint_you_have_no_plugin_with_supported_method": "У вас нет установленных плагинов, поддерживающих {{supportMethod}} ", + "info_hint_install_plugin_before_use": "Сначала установите плагин в управлении плагинами" + }, + + "download_page": { + "waiting": "Ожидание...", + "failed": "Сбой загрузки" + }, + "plugin_management_page": { + "plugin_management": "Управление плагинами", + "choose_plugin": "Выбрать плагин", + "install": "Установить", + "musicfree_plugin": "Плагин MusicFree", + "install_successfully": "Плагин успешно установлен", + "install_failed": "Не удалось установить", + "invalid_plugin": "Недействительный плагин", + "install_from_local_file": "Установить с локального файла", + "install_from_network": "Установить из сети", + "install_plugin_from_network": "Установить плагин из сети", + "installing": "Установка", + "info_hint_install_placeholder": "Введите адрес источника плагина (ссылка должна заканчиваться на json или js)", + "error_hint_plugin_should_end_with_js_or_json": "Ссылка на плагин должна заканчиваться на json или js", + "info_hint_install_plugin": "Плагин должен соответствовать определенному протоколу плагинов MusicFree, подробности можно найти на официальном сайте", + "subscription_setting": "Настройка подписки", + "update_subscription": "Обновить подписку", + "update_successfully": "Успешное обновление", + "no_subscription": "Нет текущих подписок", + + "uninstall": "Удалить", + "uninstall_plugin": "Удалить плагин", + "confirm_text_uninstall_plugin": "Вы уверены, что хотите удалить плагин {{plugin}}?", + "uninstall_successfully": "{{plugin}} успешно удален", + "uninstall_failed": "Не удалось удалить", + + "toast_plugin_is_latest": "Плагин {{plugin}} обновлен до последней версии", + "update_failed": "Не удалось обновить", + + "update": "Обновить", + + "importing_media": "Импорт медиа", + "placeholder_import_music_item": "Введите ссылку на трек {{plugin}}", + "import_failed": "Не удалось импортировать", + "placeholder_import_music_sheet": "Введите ссылку на плейлист {{plugin}}" + }, + "local_music_page": { + "local_music": "Локальная музыка", + "auto_scan": "Автосканирование", + "search_local_music": "Поиск локальной музыки", + "list_view": "Вид списка", + "artist_view": "Вид исполнителя", + "album_view": "Вид альбома", + "folder_view": "Вид папки", + "total_music_num": "Всего {{number}} треков" + }, + + "music_list_context_menu": { + "next_play": "Играть следующую", + "add_to_my_sheets": "Добавить в плейлист", + "remove_from_sheet": "Удалить из плейлиста", + "delete_local_download": "Удалить локальную загрузку", + "reveal_local_music_in_file_explorer": "Показать в проводнике", + "reveal_local_music_in_file_explorer_fail": "Не удалось открыть: ", + + "delete_local_downloaded_songs_success": "Удалено {{musicNums}} локальных песен", + "delete_local_downloaded_song_success": "Удалена локальная песня [{{songName}}]" + }, + + "search_result_page": { + "search_result_title": "Результаты поиска для" + }, + "side_bar": { + "toplist": "Топ-листы", + "recommend_sheets": "Рекомендуемые плейлисты", + "download_management": "Управление загрузками", + "local_music": "Локальная музыка", + "plugin_management": "Управление плагинами", + + "my_sheets": "Мои плейлисты", + "create_local_sheet": "Создать плейлист", + "starred_sheets": "Избранное", + + "delete_sheet": "Удалить плейлист", + "rename_sheet": "Переименовать плейлист", + "unstar_sheet": "Убрать из избранного", + "recently_play": "Недавние воспроизведения" + }, + "app_header": { + "nav_back": "Назад", + "nav_forward": "Вперед", + "search_placeholder": "Введите запрос для поиска", + "search_history": "История поиска", + "settings": "Настройки", + "minimize": "Свернуть", + "minimode": "Мини-режим", + "exit": "Выход", + "theme": "Тема" + }, + "music_bar": { + "open_music_detail_page": "Открыть страницу с деталями песни", + "close_music_detail_page": "Закрыть страницу с деталями песни", + "previous_music": "Предыдущая песня", + "next_music": "Следующая песня", + "mute": "Выключить звук", + "unmute": "Включить звук", + "playback_speed": "Скорость воспроизведения", + "choose_music_quality": "Выбрать качество музыки", + "only_set_for_current_music": "Только для текущей песни", + "desktop_lyric": "Лирика на рабочем столе" + }, + "music_detail": { + "search_lyric": "Поиск текста песни", + "no_lyric": "Нет текста песни", + + "lyric_ctx_download_lyric": "Скачать текст песни", + "lyric_ctx_download_lyric_lrc": "Скачать текст песни (.lrc)", + "lyric_ctx_download_lyric_txt": "Скачать текст песни (.txt)", + "lyric_ctx_download_success": "Загрузка успешна", + "lyric_ctx_download_fail": "Ошибка загрузки", + "lyric_ctx_set_font_size": "Установить размер шрифта", + + "link_media_lyric": "Связать с текстом песни", + "media_lyric_linked": "Текст песни связан: ", + "unlink_media_lyric": "Отменить связь с текстом песни", + "toast_media_lyric_unlinked": "Связь с текстом песни отменена", + "translation": "Перевод", + "show_translation": "Показать перевод", + "hide_translation": "Скрыть перевод" + }, + "bottom_loading_state": { + "reached_end": "~~~ Конец списка ~~~", + "loading": "Загрузка...", + "load_more": "Загрузить больше" + }, + "empty": { + "hint_empty": "Здесь ничего нет~~~" + }, + "modal": { + "add_to_my_sheets": "Добавить в плейлист", + "total_music_num": "Всего {{number}} треков", + "create_local_sheet": "Создать плейлист", + "create_local_sheet_placeholder": "Введите название нового плейлиста", + "exit_confirm": "Вы уверены, что хотите выйти?", + "plugin_subscription": "Подписка на плагин", + "subscription_remarks": "Примечания: ", + "subscription_links": "Ссылки: ", + "subscription_save_success": "Адрес подписки сохранен", + "search_lyric": "Поиск текста песни", + "search_lyric_result_empty": "Результаты поиска пусты", + "media_lyric_linked": "Текст песни связан~", + "media_lyric_link_failed": "Ошибка связи с текстом песни:", + "new_version_found": "Найдена новая версия", + "latest_version": "Последняя версия: ", + "current_version": "Текущая версия: ", + "skip_this_version": "Пропустить эту версию", + "scan_local_music": "Сканировать локальную музыку", + "scan_local_music_hint": "Будут автоматически сканироваться выбранные папки (изменения в файлах синхронизируются в реальном времени)", + "add_folder": "Добавить папку" + }, + "panel": { + "play_list_song_num": "Плейлист ({{number}} треков)", + "user_variable": "Пользовательская переменная", + "user_variable_setting_success": "Настройка успешна~" + }, + "music_sheet_like_view": { + "play_all": "Играть все", + "add_to_sheet": "Добавить", + "star": "В избранное" + }, + "settings": { + "choose_path": "Выбрать путь", + "change_path": "Изменить путь", + "folder_not_exist": "Папка не существует", + "open_folder": "Открыть папку", + + "section_name": { + "normal": "Основные", + "play_music": "Воспроизведение", + "download": "Загрузка", + "lyric": "Текст песни", + "plugin": "Плагин", + "theme": "Тема", + "short_cut": "Горячие клавиши", + "network": "Сеть", + "backup": "Резервное копирование и восстановление", + "about": "О MusicFree" + }, + "normal": { + "check_update": "Проверять обновления при запуске приложения", + "close_behavior": "При нажатии на кнопку выхода", + "exit_app": "Закрыть приложение", + "minimize": "Свернуть в трей", + "taskbar_thumb": "Стиль эскиза в панели задач (вступит в силу после перезапуска приложения)", + "current_artwork": "Обложка текущей песни", + "main_window": "Интерфейс основного окна", + "max_history_length": "Максимальное количество сохраненных записей поиска", + "music_list_hide_columns": "Скрыть столбцы в списке песен", + "languages": "Языки", + "toast_switch_language_fail": "Не удалось изменить язык" + }, + "play_music": { + "case_sensitive_in_search": "Чувствительность к регистру при поиске в плейлисте", + "default_play_quality": "Качество воспроизведения по умолчанию", + "when_quality_missing": "При отсутствии качества воспроизведения", + "play_lower_quality_version": "Проигрывать версию с более низким качеством", + "play_higher_quality_version": "Проигрывать версию с более высоким качеством", + "when_play_error": "При ошибке воспроизведения", + "pause": "Приостановить воспроизведение", + "skip_to_next": "Перейти к следующей песне", + "double_click_music_list": "При двойном клике по списку музыки", + "add_music_to_playlist": "Добавить песню в очередь воспроизведения", + "replace_playlist_with_musiclist": "Заменить очередь воспроизведения текущим списком музыки", + "audio_output_device": "Аудио выходное устройство", + "when_device_removed": "При удалении аудио устройства", + "continue_playing": "Продолжить воспроизведение" + }, + "download": { + "download_folder": "Папка для загрузки", + "max_concurrency": "Максимальное количество одновременных загрузок", + "default_download_quality": "Качество загрузки по умолчанию", + "when_quality_missing": "При отсутствии качества загрузки", + "download_lower_quality_version": "Загрузить версию с более низким качеством", + "download_higher_quality_version": "Загрузить версию с более высоким качеством" + }, + "lyric": { + "enable_status_bar_lyric": "Включить текст песни в статусной строке", + "enable_desktop_lyric": "Включить текст песни на рабочем столе", + "lock_desktop_lyric": "Закрепить текст песни на рабочем столе", + "font": "Шрифт", + "font_size": "Размер шрифта", + "font_color": "Цвет шрифта", + "stroke_color": "Цвет обводки" + }, + "plugin": { + "auto_update_plugin": "Автоматически обновлять плагины при запуске приложения", + "not_check_plugin_version": "Не проверять версию при установке плагина" + }, + "short_cut": { + "enable_local": "Включить горячие клавиши в приложении", + "enable_global": "Включить глобальные горячие клавиши", + "ability": "Функция", + "local_short_cut": "Горячие клавиши приложения", + "global_short_cut": "Глобальные горячие клавиши", + "play/pause": "Воспроизведение/Пауза", + "skip-next": "Следующая песня", + "skip-previous": "Предыдущая песня", + "volume-up": "Увеличить громкость", + "volume-down": "Уменьшить громкость", + "toggle-desktop-lyric": "Включить/Выключить текст песни на рабочем столе", + "like/dislike": "Нравится/Не нравится текущая песня", + "no_short_cut": "Пусто" + }, + "network": { + "host": "Хост", + "port": "Порт", + "username": "Имя пользователя", + "password": "Пароль", + "local_cache": "Локальный кэш: {{cacheSize}}", + "clear_cache": "Очистить кэш", + "enable_network_proxy": "Включить сетевой прокси" + }, + "backup": { + "resume_mode_append": "Добавить в конец существующего плейлиста", + "resume_mode_overwrite": "Перезаписать существующий плейлист", + "backup_by_file": "Резервное копирование в файл", + "musicfree_backup_file": "Файл резервной копии MusicFree", + "backup_to": "Резервное копирование в...", + "backup_by_webdav": "Резервное копирование через WebDAV", + "backup_success": "Резервное копирование успешно~", + "backup_fail": "Ошибка резервного копирования: {{reason}}", + "resume_success": "Восстановление успешно~", + "resume_fail": "Ошибка восстановления: {{reason}}", + "backup_music_sheet": "Резервное копирование плейлиста", + "resume_music_sheet": "Восстановление плейлиста", + "webdav_server_url": "URL", + "username": "Имя пользователя", + "password": "Пароль", + "webdav_data_not_complete": "URL, имя пользователя и пароль не могут быть пустыми", + "webdav_backup_file_not_exist": "Файл резервной копии не существует" + }, + "about": { + "current_version": "Текущая версия: {{version}}", + "already_latest": "У вас последняя версия!", + "check_update": "Проверить обновления", + "software_author": "Автор программы: ", + "open_source_declaration": "Исходный код: Программа с открытым исходным кодом по лицензии GPL3.0. Ссылка на Github Ссылка на Gitee", + "official_site": "Официальный сайт", + "mobile_version": "Мобильная версия" + } + }, + "main": { + "previous_music": "Предыдущая песня", + "next_music": "Следующая песня", + "close_desktop_lyric": "Закрыть текст песни на рабочем столе", + "open_desktop_lyric": "Открыть текст песни на рабочем столе", + "unlock_desktop_lyric": "Разблокировать текст песни на рабочем столе", + "lock_desktop_lyric": "Заблокировать текст песни на рабочем столе", + "no_playing_music": "В данный момент нет воспроизводимой музыки" + }, + "theme": { + "tab_local": "Локальные темы", + "tab_remote": "Магазин тем", + "download_and_use": "Скачать и использовать", + "use_theme": "Использовать тему", + "install_theme": "Установить тему", + "update_theme": "Обновить тему", + "uninstall_theme": "Удалить тему", + "musicfree_theme": "Тема MusicFree", + "all_files": "Все файлы", + "install_theme_success": "Тема {{name}} успешно установлена~", + "install_theme_fail": "Не удалось установить тему: {{reason}}", + "uninstall_theme_success": "Тема {{name}} успешно удалена~", + "uninstall_theme_fail": "Не удалось удалить тему: {{reason}}", + "how_to_submit_new_theme": "💡Как подать новую тему: Темы в магазине синхронизируются с репозиторием MusicFreeThemePacks. Чтобы подать новую тему, создайте PR напрямую.", + "load_remote_theme_error": "Произошла ошибка...", + "invalid_theme": "Недействительная тема: {{reason}}" + } +} diff --git a/src/main/tray/index.ts b/src/main/tray/index.ts index d88c034d..32696f60 100644 --- a/src/main/tray/index.ts +++ b/src/main/tray/index.ts @@ -266,6 +266,7 @@ export async function setupTrayMenu() { export function setTrayTitle(str: string) { if (!str || !str.length) { tray.setTitle(""); + return; } if (str.length > 7) { tray?.setTitle(" " + str.slice(0) + "..."); diff --git a/src/renderer/components/Modal/templates/AddMusicToSheet/index.tsx b/src/renderer/components/Modal/templates/AddMusicToSheet/index.tsx index 6b1b4dc1..77b82d94 100644 --- a/src/renderer/components/Modal/templates/AddMusicToSheet/index.tsx +++ b/src/renderer/components/Modal/templates/AddMusicToSheet/index.tsx @@ -1,4 +1,4 @@ -import MusicSheet from "@/renderer/core/music-sheet"; +import MusicSheet, { defaultSheet } from "@/renderer/core/music-sheet"; import Base from "../Base"; import "./index.scss"; import { setFallbackAlbum } from "@/renderer/utils/img-on-error"; @@ -61,7 +61,11 @@ export default function AddMusicToSheet(props: IAddMusicToSheetProps) { src={sheet.artwork ?? albumImg} onError={setFallbackAlbum} > - {sheet.title} + + {sheet.id === defaultSheet.id + ? t("media.default_favorite_sheet_name") + : sheet.title} + ))} diff --git a/src/renderer/core/music-sheet/backend/index.ts b/src/renderer/core/music-sheet/backend/index.ts index 7a982bbe..924ff334 100644 --- a/src/renderer/core/music-sheet/backend/index.ts +++ b/src/renderer/core/music-sheet/backend/index.ts @@ -51,9 +51,7 @@ export function getAllStarredSheets() { export async function queryAllSheets() { try { // 读取全部歌单 - const allSheets = await musicSheetDB.sheets - .orderBy("$$sortIndex") - .toArray(); + const allSheets = await musicSheetDB.sheets.toArray(); const dbDefaultSheet = allSheets.find( (item) => item.id === defaultSheet.id ); diff --git a/src/renderer/core/music-sheet/common/default-sheet.ts b/src/renderer/core/music-sheet/common/default-sheet.ts index 4ddb062c..83faf5b8 100644 --- a/src/renderer/core/music-sheet/common/default-sheet.ts +++ b/src/renderer/core/music-sheet/common/default-sheet.ts @@ -6,5 +6,6 @@ export default { title: i18n.t("media.default_favorite_sheet_name"), platform: localPluginName, musicList: [], + $$sortIndex: -1, $sortIndex: -1, }; diff --git a/src/shared/global-context/main.ts b/src/shared/global-context/main.ts index e6a4dfe5..3b930c74 100644 --- a/src/shared/global-context/main.ts +++ b/src/shared/global-context/main.ts @@ -1,5 +1,6 @@ import { BrowserWindow, app, ipcMain } from "electron"; import { IpcRendererEvt } from "./internal/common"; +import path from "path"; declare const WORKER_DOWNLOADER_WEBPACK_ENTRY: string; declare const LOCAL_FILE_WATCHER_WEBPACK_ENTRY: string; @@ -18,6 +19,9 @@ export function setupGlobalContext() { downloads: app.getPath("downloads"), temp: app.getPath("temp"), userData: app.getPath("userData"), + res: app.isPackaged + ? path.resolve(process.resourcesPath, "res") + : path.resolve(__dirname, "../../res"), }, platform: process.platform, }; diff --git a/src/shared/global-context/type.d.ts b/src/shared/global-context/type.d.ts index 9f4ceb89..a4249f7c 100644 --- a/src/shared/global-context/type.d.ts +++ b/src/shared/global-context/type.d.ts @@ -13,6 +13,7 @@ export interface IGlobalContext { userData: string; temp: string; downloads: string; + res: string; }; platform: NodeJS.Platform; }