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;
}