Merge branch 'dev'

pull/590/head v1.11.0
lyswhut 2021-07-18 13:59:58 +08:00
commit 1c4a56f95b
44 changed files with 2853 additions and 3397 deletions

View File

@ -52,6 +52,14 @@ jobs:
name: lx-music-desktop-x86-Setup
path: build/* x86 Setup.exe
- name: Build Package Setup arm64
run: npm run pack:win:setup:arm64
- name: Upload Artifact Setup arm64
uses: actions/upload-artifact@v2
with:
name: lx-music-desktop-arm64-Setup
path: build/* arm64 Setup.exe
- name: Build Package Setup x86_64
run: npm run pack:win:setup:x86_64
- name: Upload Artifact Setup x86_64

View File

@ -40,6 +40,7 @@ jobs:
run: |
npm run publish:win:setup:x64:always
npm run publish:win:setup:x86
npm run publish:win:setup:arm64
npm run publish:win:setup:x86_64
npm run publish:win:7z:x64
npm run publish:win:7z:x86

12
.vscode/settings.json vendored
View File

@ -5,5 +5,15 @@
"@lyric/*": "${workspaceFolder}/src/renderer-lyric/*",
"@static/*": "${workspaceFolder}/src/static/*",
"@common/*": "${workspaceFolder}/src/common/*",
}
},
"i18n-ally.localesPaths": [
"src/renderer/lang"
],
"i18n-ally.displayLanguage": "zh-cn",
"i18n-ally.sourceLanguage": "zh-cn",
"i18n-ally.namespace": true,
"i18n-ally.translate.engines": ["google-cn", "google"],
"i18n-ally.pathMatcher": "{locale}/{namespaces}.json",
"i18n-ally.keystyle": "flat",
"i18n-ally.sortKeys": true
}

View File

@ -6,6 +6,35 @@ Project versioning adheres to [Semantic Versioning](http://semver.org/).
Commit convention is based on [Conventional Commits](http://conventionalcommits.org).
Change log format is based on [Keep a Changelog](http://keepachangelog.com/).
## [1.11.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.10.2...v1.11.0) - 2021-07-18
### 新增
- 添加 win arm64 架构的安装包构建
- 新增“添加歌曲到列表时的位置”设置,可选项为列表的“顶部”与“底部”
### 优化
- 优化网络请求,尝试去解决无法连接服务器的问题
- 优化mg源打开歌单的链接兼容
### 修复
- 修复mg源搜索失效的问题
### 移除
- 因wy源的歌单列表已没有“最新”排序的选项所以现跟随移除wy源歌单列表按“最新”排序的按钮
### 变更
- 添加歌曲到列表时从原来的底部改为顶部,若你想要将你的列表歌曲顺序反转以适应这一变更,可先按住`shift`键的情况下点击列表的最后一首歌然后再点击列表的第一首歌完成倒序选中最后随便右击列表的任意一首歌在弹出的菜单中选择调整顺序在弹出框输入1后确定即可反转列表。
若你想要恢复原来的行为则可以去更改“添加歌曲到列表时的位置”设置项。
### 其他
- 更新electron到v13.1.7
## [1.10.2](https://github.com/lyswhut/lx-music-desktop/compare/v1.10.1...v1.10.2) - 2021-05-25
### 修复

4
FAQ.md
View File

@ -13,7 +13,7 @@
尝试更换网络,如切换到移动网络,若移动网络还是不行则尝试开关下手机的飞行模式后再试,<br>
若使用家庭网络的话可尝试将光猫断电5分钟左右再通电联网后播放。
### 提示`getaddrinfo EAI_AGAIN ...`
### 提示 `getaddrinfo EAI_AGAIN ...``无法连接到服务器`
尝试在在浏览器打开这个地址`http://ts.tempmusic.tk`浏览器显示404是正常的如果不是404那就证明所在网络无法访问接口服务器。
若网页无法打开或打开来不是404则可能是DNS的问题可以尝试以下办法
@ -62,6 +62,8 @@
对于分享出来的歌单若打开失败可尝试先在浏览器中打开后再从浏览器地址栏复制URL地址到软件打开<br>
或者如果你知道歌单 id 也可以直接输入歌单 id 打开。<br>
注:网易源的“我喜欢”歌单无法在未登录的情况下打开,所以你需要手动创建一个歌单后将“我喜欢”里的歌曲移动到该歌单打开
## 界面异常(界面显示不完整)
### Windows 7 下界面异常

View File

@ -36,7 +36,7 @@
所用技术栈:
- Electron 12
- Electron 13
- Vue 2
已支持的平台:

View File

@ -2,7 +2,7 @@ const isDev = process.env.NODE_ENV === 'development'
module.exports = {
modules: {
localIdentName: isDev ? '[folder]-[name]--[local]--[hash:base64:5]' : '[hash:base64:5]',
localIdentName: isDev ? '[path][name]__[local]--[hash:base64:5]' : '[hash:base64:5]',
exportLocalsConvention: 'camelCase',
},
}

View File

@ -18,7 +18,7 @@ module.exports = {
filename: '[name].js',
libraryTarget: 'commonjs2',
path: path.join(__dirname, '../../dist/electron'),
publicPath: './',
publicPath: 'auto',
},
resolve: {
alias: {

View File

@ -18,7 +18,7 @@ module.exports = {
filename: '[name].js',
libraryTarget: 'commonjs2',
path: path.join(__dirname, '../../dist/electron'),
publicPath: './',
publicPath: 'auto',
},
resolve: {
alias: {

5198
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,16 @@
{
"name": "lx-music-desktop",
"version": "1.10.2",
"version": "1.11.0",
"description": "一个免费的音乐查找助手",
"main": "./dist/electron/main.js",
"productName": "lx-music-desktop",
"scripts": {
"pack": "node build-config/pack.js && npm run pack:win:setup:x64",
"pack:win": "node build-config/pack.js && npm run pack:win:setup:x86_64 && npm run pack:win:setup:x64 && npm run pack:win:7z",
"pack:win": "node build-config/pack.js && npm run pack:win:setup:x64 && npm run pack:win:setup:x86 && npm run pack:win:setup:arm64 && npm run pack:win:setup:x86_64 && npm run pack:win:7z",
"pack:win:setup:x86_64": "cross-env TARGET=Setup ARCH=x86_64 electron-builder -w=nsis --x64 --ia32 -p never",
"pack:win:setup:x64": "cross-env TARGET=Setup ARCH=x64 electron-builder -w=nsis --x64 -p never",
"pack:win:setup:x86": "cross-env TARGET=Setup ARCH=x86 electron-builder -w=nsis --ia32 -p never",
"pack:win:setup:arm64": "cross-env TARGET=Setup ARCH=arm64 electron-builder -w=nsis --arm64 -p never",
"pack:win:portable": "npm run pack:win:portable:x86_64 && npm run pack:win:portable:x64 && npm run pack:win:portable:x86",
"pack:win:portable:x86_64": "cross-env TARGET=portable ARCH=x86_64 electron-builder -w=portable --x64 --ia32 -p never",
"pack:win:portable:x64": "cross-env TARGET=portable ARCH=x64 electron-builder -w=portable --x64 -p never",
@ -35,6 +36,7 @@
"publish:win:setup:x64:always": "cross-env TARGET=Setup ARCH=x64 electron-builder -w=nsis --x64 -p always",
"publish:win:setup:x64": "cross-env TARGET=Setup ARCH=x64 electron-builder -w=nsis --x64 -p always",
"publish:win:setup:x86": "cross-env TARGET=Setup ARCH=x86 electron-builder -w=nsis --ia32 -p onTagOrDraft",
"publish:win:setup:arm64": "cross-env TARGET=Setup ARCH=arm64 electron-builder -w=nsis --arm64 -p onTagOrDraft",
"publish:win:setup:x86_64": "cross-env TARGET=Setup ARCH=x86_64 electron-builder -w=nsis --x64 --ia32 -p onTagOrDraft",
"publish:win:portable": "npm run publish:win:portable:x86_64 && npm run publish:win:portable:x64 && npm run publish:win:portable:x86",
"publish:win:portable:x86_64": "cross-env TARGET=portable ARCH=x86_64 electron-builder -w=portable --x64 --ia32 -p onTagOrDraft",
@ -68,7 +70,7 @@
"up": "cross-env ELECTRON_GET_USE_PROXY=true GLOBAL_AGENT_HTTPS_PROXY=http://localhost:1081 npm i"
},
"browserslist": [
"Electron 12.0.9"
"Electron 13.1.7"
],
"engines": {
"node": ">= 14"
@ -161,50 +163,51 @@
},
"homepage": "https://github.com/lyswhut/lx-music-desktop#readme",
"devDependencies": {
"@babel/core": "^7.14.3",
"@babel/plugin-proposal-class-properties": "^7.13.0",
"@babel/core": "^7.14.6",
"@babel/plugin-proposal-class-properties": "^7.14.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-modules-umd": "^7.14.0",
"@babel/plugin-transform-runtime": "^7.14.3",
"@babel/plugin-transform-modules-umd": "^7.14.5",
"@babel/plugin-transform-runtime": "^7.14.5",
"@babel/polyfill": "^7.12.1",
"@babel/preset-env": "^7.14.2",
"@babel/preset-env": "^7.14.7",
"babel-eslint": "^10.1.0",
"babel-loader": "^8.2.2",
"babel-minify-webpack-plugin": "^0.3.1",
"babel-preset-minify": "^0.5.1",
"browserslist": "^4.16.6",
"cfonts": "^2.9.2",
"cfonts": "^2.9.3",
"chalk": "^4.1.1",
"changelog-parser": "^2.8.0",
"copy-webpack-plugin": "^9.0.0",
"core-js": "^3.12.1",
"copy-webpack-plugin": "^9.0.1",
"core-js": "^3.15.2",
"cross-env": "^7.0.3",
"css-loader": "^5.2.6",
"css-minimizer-webpack-plugin": "^3.0.0",
"css-loader": "^5.2.7",
"css-minimizer-webpack-plugin": "^3.0.2",
"del": "^6.0.0",
"electron": "^12.0.9",
"electron-builder": "^22.11.4",
"electron": "^13.1.7",
"electron-builder": "^22.11.7",
"electron-debug": "^3.2.0",
"electron-devtools-installer": "^3.2.0",
"eslint": "^7.27.0",
"electron-to-chromium": "^1.3.779",
"eslint": "^7.30.0",
"eslint-config-standard": "^14.1.1",
"eslint-formatter-friendly": "^7.0.0",
"eslint-loader": "^4.0.2",
"eslint-plugin-html": "^6.1.2",
"eslint-plugin-import": "^2.23.3",
"eslint-plugin-import": "^2.23.4",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.0",
"eslint-plugin-standard": "^4.1.0",
"file-loader": "^6.2.0",
"friendly-errors-webpack-plugin": "^1.7.0",
"html-webpack-plugin": "^5.3.1",
"html-webpack-plugin": "^5.3.2",
"less": "^4.1.1",
"less-loader": "^9.0.0",
"less-loader": "^10.0.1",
"less-plugin-clean-css": "^1.5.1",
"markdown-it": "^12.0.6",
"mini-css-extract-plugin": "^1.6.0",
"postcss": "^8.3.0",
"postcss-loader": "^5.3.0",
"markdown-it": "^12.1.0",
"mini-css-extract-plugin": "^2.1.0",
"postcss": "^8.3.5",
"postcss-loader": "^6.1.1",
"postcss-pxtorem": "^6.0.0",
"pug": "^3.0.2",
"pug-loader": "^2.4.0",
@ -213,33 +216,31 @@
"rimraf": "^3.0.2",
"spinnies": "^0.5.1",
"stylus": "^0.54.8",
"stylus-loader": "^6.0.0",
"terser-webpack-plugin": "^5.1.2",
"stylus-loader": "^6.1.0",
"terser-webpack-plugin": "^5.1.4",
"url-loader": "^4.1.1",
"vue-loader": "^15.9.7",
"vue-template-compiler": "^2.6.12",
"webpack": "^5.37.1",
"webpack-cli": "^4.7.0",
"vue-template-compiler": "^2.6.14",
"webpack": "^5.45.1",
"webpack-cli": "^4.7.2",
"webpack-dev-server": "^3.11.2",
"webpack-hot-middleware": "^2.25.0",
"webpack-merge": "^5.7.3"
"webpack-merge": "^5.8.0"
},
"dependencies": {
"crypto-js": "^4.0.0",
"dnscache": "^1.0.2",
"electron-log": "^4.3.5",
"electron-store": "^8.0.0",
"electron-updater": "^4.3.9",
"iconv-lite": "^0.6.3",
"image-size": "^1.0.0",
"js-htmlencode": "^0.3.0",
"lrc-file-parser": "^1.0.7",
"needle": "^2.6.0",
"lrc-file-parser": "^1.1.0",
"needle": "^2.8.0",
"node-id3": "^0.2.3",
"request": "^2.88.2",
"vue": "^2.6.12",
"vue-i18n": "^8.24.4",
"vue-router": "^3.5.1",
"vue": "^2.6.14",
"vue-i18n": "^8.25.0",
"vue-router": "^3.5.2",
"vuex": "^3.6.2",
"vuex-router-sync": "^5.0.0"
}

View File

@ -1,3 +1,26 @@
### 新增
- 添加 win arm64 架构的安装包构建
- 新增“添加歌曲到列表时的位置”设置,可选项为列表的“顶部”与“底部”
### 优化
- 优化网络请求,尝试去解决无法连接服务器的问题
- 优化mg源打开歌单的链接兼容
### 修复
- 修复企鹅音乐搜索歌曲没有结果的问题
- 修复mg源搜索失效的问题
### 移除
- 因wy源的歌单列表已没有“最新”排序的选项所以现跟随移除wy源歌单列表按“最新”排序的按钮
### 变更
- 添加歌曲到列表时从原来的底部改为顶部,若你想要将你的列表歌曲顺序反转以适应这一变更,可先按住`shift`键的情况下点击列表的最后一首歌然后再点击列表的第一首歌完成倒序选中最后随便右击列表的任意一首歌在弹出的菜单中选择调整顺序在弹出框输入1后确定即可反转列表。
若你想要恢复原来的行为则可以去更改“添加歌曲到列表时的位置”设置项。
### 其他
- 更新electron到v13.1.7

File diff suppressed because one or more lines are too long

View File

@ -2,7 +2,7 @@ const path = require('path')
const os = require('os')
const defaultSetting = {
version: '1.0.41',
version: '1.0.42',
player: {
togglePlayMethod: 'listLoop',
highQuality: false,
@ -36,6 +36,7 @@ const defaultSetting = {
isShowSource: true,
prevSelectListId: 'default',
isSaveScrollLocation: true,
addMusicLocationType: 'top',
},
download: {
enable: false,

View File

@ -55,12 +55,12 @@ app.on('web-contents-created', (event, contents) => {
if (!navigationUrlWhiteList.some(url => url.test(navigationUrl))) return event.preventDefault()
console.log('navigation to url:', navigationUrl)
})
contents.on('new-window', async(event, navigationUrl) => {
event.preventDefault()
if (/^devtools/.test(navigationUrl)) return
console.log(navigationUrl)
if (!/^https?:\/\//.test(navigationUrl)) return
await shell.openExternal(navigationUrl)
contents.setWindowOpenHandler(({ url }) => {
if (!/^devtools/.test(url) && /^https?:\/\//.test(url)) {
shell.openExternal(url)
}
console.log(url)
return { action: 'deny' }
})
contents.on('will-attach-webview', (event, webPreferences, params) => {
// Strip away preload scripts if unused or verify their location is legitimate

View File

@ -20,7 +20,6 @@
</template>
<script>
import dnscache from 'dnscache'
import { mapMutations, mapGetters, mapActions } from 'vuex'
import { rendererOn, rendererSend, rendererInvoke, NAMES } from '../common/ipc'
import { isLinux } from '../common/utils'
@ -30,11 +29,6 @@ import { base as eventBaseName } from './event/names'
import apiSourceInfo from './utils/music/api-source-info'
window.ELECTRON_DISABLE_SECURITY_WARNINGS = process.env.ELECTRON_DISABLE_SECURITY_WARNINGS
dnscache({
enable: true,
ttl: 21600,
cachesize: 1000,
})
const listThrottle = (fn, delay = 100) => {
let timer = null
@ -683,7 +677,7 @@ body {
}
#view {
flex: auto;
height: 0;
min-height: 0;
}
each(@themes, {

View File

@ -59,7 +59,7 @@
div(:class="$style.progressContent")
div(:class="$style.progress")
//- div(:class="[$style.progressBar, $style.progressBar1]" :style="{ transform: `scaleX(${progress || 0})` }")
div(:class="[$style.progressBar, $style.progressBar2, isActiveTransition ? $style.barTransition : '']" @transitionend="handleTransitionEnd" :style="{ transform: `scaleX(${playInfo.progress || 0})`, willChange: isPlay || isActiveTransition ? 'transform' : 'auto' }")
div(:class="[$style.progressBar, $style.progressBar2, isActiveTransition ? $style.barTransition : '']" @transitionend="handleTransitionEnd" :style="{ transform: `scaleX(${playInfo.progress || 0})` }")
div(:class="$style.progressMask" @click='setProgress' ref="dom_progress")
div(:class="$style.timeLabel")
span(style="margin-left: 15px") {{playInfo.status}}

View File

@ -1,154 +1,143 @@
{
"about": "About lx-music-desktop",
"backup": "Backup and restore",
"backup_all": "All data (list data and setting data)",
"backup_all_export": "Export",
"backup_all_export_desc": "Select the backup to...",
"backup_all_import": "Import",
"backup_all_import_desc": "Select a backup file",
"backup_part": "Partial data (list data includes audition list, favorite list, user-defined list, setting data does not include shortcut key settings)",
"backup_part_export_list": "Export lists",
"backup_part_export_list_desc": "Save the list to...",
"backup_part_export_setting": "Export settings",
"backup_part_export_setting_desc": "Save the list to...",
"backup_part_import_list": "Import lists",
"backup_part_import_list_desc": "Select a list backup",
"backup_part_import_setting": "Import settings",
"backup_part_import_setting_desc": "Select the Settings file",
"basic": "General",
"basic_theme": "Theme",
"basic_show_animation": "Show switching animation",
"basic_animation": "Random pop-up animation",
"basic_source_title": "Choose a music source",
"basic_source_test": "Test API (Available for most software features)",
"basic_source_temp": "Temporary API (some features not available; workaround if Test API unavailable)",
"basic_source": "Music source",
"basic_sourcename_title": "Select the name of music source",
"basic_sourcename_real": "Original",
"basic_sourcename_alias": "Aliases",
"basic_sourcename": "Source name",
"basic_source_status_success": "Initialization successful",
"basic_source_status_initing": "Initializing",
"basic_source_status_failed": "Initialization failed",
"basic_source_user_api_btn": "Custom Source Management",
"basic_window_size_title": "Set the window size",
"basic_window_size": "Window size",
"basic_window_size_smaller": "Smaller",
"basic_window_size_small": "Small",
"basic_window_size_medium": "Medium",
"basic_window_size_big": "Large",
"basic_window_size_larger": "Larger",
"basic_window_size_oversized": "Oversized",
"basic_window_size_huge": "Huge",
"basic_to_tray": "Do not exit the software when closing the software and minimize it to the system tray",
"basic_lang_title": "The language displayed in the software",
"basic_lang": "Language",
"basic_control_btn_position": "Control Button Position",
"basic_control_btn_position_left": "Left",
"basic_control_btn_position_right": "Right",
"play": "Play",
"play_save_play_time": "Remember playback progress",
"play_lyric_transition": "Show lyrics translation",
"play_lyric_lxlrc": "Use Karaoke-style lyrics playback (if supported)",
"play_quality": "Play 320K quality songs first (if supported)",
"play_task_bar": "Show playing progress on the taskbar",
"play_mediaDevice_title": "Select a media device for audio output",
"play_mediaDevice": "Audio output",
"play_mediaDevice_remove_stop_play": "Pause the song when the current sound output device is changed",
"basic_lang": "Language",
"basic_lang_title": "The language displayed in the software",
"basic_show_animation": "Show switching animation",
"basic_source": "Music source",
"basic_source_status_failed": "Initialization failed",
"basic_source_status_initing": "Initializing",
"basic_source_status_success": "Initialization successful",
"basic_source_temp": "Temporary API (some features not available; workaround if Test API unavailable)",
"basic_source_test": "Test API (Available for most software features)",
"basic_source_title": "Choose a music source",
"basic_source_user_api_btn": "Custom Source Management",
"basic_sourcename": "Source name",
"basic_sourcename_alias": "Aliases",
"basic_sourcename_real": "Original",
"basic_sourcename_title": "Select the name of music source",
"basic_theme": "Theme",
"basic_to_tray": "Do not exit the software when closing the software and minimize it to the system tray",
"basic_window_size": "Window size",
"basic_window_size_big": "Large",
"basic_window_size_huge": "Huge",
"basic_window_size_larger": "Larger",
"basic_window_size_medium": "Medium",
"basic_window_size_oversized": "Oversized",
"basic_window_size_small": "Small",
"basic_window_size_smaller": "Smaller",
"basic_window_size_title": "Set the window size",
"click_copy": "Click to copy",
"click_open": "Click to open",
"desktop_lyric": "Desktop Lyric Settings",
"desktop_lyric_always_on_top": "Make the lyrics always above other windows",
"desktop_lyric_enable": "Display lyrics",
"desktop_lyric_lock": "Lock lyrics",
"desktop_lyric_always_on_top": "Make the lyrics always above other windows",
"desktop_lyric_lock_screen": "It is not allowed to drag the lyrics window out of the main screen",
"search": "Search",
"search_hot": "Top Searches",
"search_history": "Search history",
"search_focus_search_box": "Automatically focus the search box on startup",
"list": "List",
"list_source": "Show song source (only valid for my music category)",
"list_scroll": "Remember the position of the scroll bar of the playlist (only valid for my music classification)",
"download": "Download",
"download_enable": "Whether to enable download function",
"download_path_title": "Define the path to downloading",
"download_path": "Download path",
"download_path_label": "Current: ",
"download_path_open_label": "Click to open this path",
"download_path_change_btn": "Change",
"download_name_title": "Select the music naming method for downloading",
"download_name": "Music file naming",
"download_data_embed": "Whether to embed the following content in the audio file",
"download_embed_pic": "Embedding cover",
"download_embed_lyric": "Embedding lyric",
"download_lyric_title": "Select whether to download the lyrics file",
"download_embed_pic": "Embedding cover",
"download_enable": "Whether to enable download function",
"download_lyric": "Lyrics download",
"download_lyric_title": "Select whether to download the lyrics file",
"download_name": "Music file naming",
"download_name1": "Title - Artist",
"download_name2": "Artist - Title",
"download_name3": "Title only",
"download_use_other_source": "Automatically change the source to download (when the song cannot be downloaded from the original source, try to switch to another source to download. Note: this function does not 100% guarantee that the version of the song after the source is changed is the same as the original version)",
"download_name_title": "Select the music naming method for downloading",
"download_path": "Download path",
"download_path_change_btn": "Change",
"download_path_label": "Current: ",
"download_path_open_label": "Click to open this path",
"download_path_title": "Define the path to downloading",
"download_select_save_path": "Select the save path",
"download_use_other_source": "Automatically change the source to download (when the song cannot be downloaded from the original source, try to switch to another source to download. Note: this function does not 100% guarantee that the version of the song after the source is changed is the same as the original version)",
"hot_key": "Shortcut Key Settings",
"hot_key_local_title": "Shortcut Keys in Software",
"hot_key_global_title": "Global Shortcut Key",
"hot_key_tip_input": "Please enter a new key",
"hot_key_unset_input": "Not Set",
"hot_key_common_toggle_close": "Quit Program",
"hot_key_common_toggle_min": "Minimize/Restore Program",
"hot_key_common_min": "Minimize the program",
"hot_key_common_toggle_hide": "Show/Hide Program",
"hot_key_common_focus_search_input": "Focus Search Box",
"hot_key_player_toggle_play": "Play/Pause Control",
"hot_key_player_prev": "Previous Song",
"hot_key_common_min": "Minimize the program",
"hot_key_common_toggle_close": "Quit Program",
"hot_key_common_toggle_hide": "Show/Hide Program",
"hot_key_common_toggle_min": "Minimize/Restore Program",
"hot_key_desktop_lyric_toggle_always_top": "Top Desktop Lyrics Switch",
"hot_key_desktop_lyric_toggle_lock": "Desktop Lyric Lock Switch",
"hot_key_desktop_lyric_toggle_visible": "Turn on/off desktop lyrics",
"hot_key_global_title": "Global Shortcut Key",
"hot_key_local_title": "Shortcut Keys in Software",
"hot_key_player_next": "Next Song",
"hot_key_player_volume_up": "Increase Volume",
"hot_key_player_prev": "Previous Song",
"hot_key_player_toggle_play": "Play/Pause Control",
"hot_key_player_volume_down": "Reduce Volume",
"hot_key_player_volume_mute": "Mute Switch",
"hot_key_desktop_lyric_toggle_visible": "Turn on/off desktop lyrics",
"hot_key_desktop_lyric_toggle_lock": "Desktop Lyric Lock Switch",
"hot_key_desktop_lyric_toggle_always_top": "Top Desktop Lyrics Switch",
"hot_key_player_volume_up": "Increase Volume",
"hot_key_tip_input": "Please enter a new key",
"hot_key_unset_input": "Not Set",
"is_enable": "Enabled",
"is_show": "Showed",
"list": "List",
"list_add_music_location_type": "Position when adding a song to the list",
"list_add_music_location_type_bottom": "Bottom",
"list_add_music_location_type_top": "Top",
"list_scroll": "Remember the position of the scroll bar of the playlist (only valid for my music classification)",
"list_source": "Show song source (only valid for my music category)",
"network": "Network",
"network_proxy_title": "HTTP Proxy (False setting would block Internet connections)",
"network_proxy_host": "Host",
"network_proxy_port": "Port",
"network_proxy_username": "Username",
"network_proxy_password": "Password",
"network_proxy_port": "Port",
"network_proxy_title": "HTTP Proxy (False setting would block Internet connections)",
"network_proxy_username": "Username",
"odc": "Auto clear",
"odc_clear_search_input": "Clear the search box when you are not searching",
"odc_clear_search_list": "Clear the search list when you are not searching",
"backup": "Backup and restore",
"backup_part": "Partial data (list data includes audition list, favorite list, user-defined list, setting data does not include shortcut key settings)",
"backup_part_import_list": "Import lists",
"backup_part_export_list": "Export lists",
"backup_part_import_setting": "Import settings",
"backup_part_export_setting": "Export settings",
"backup_all": "All data (list data and setting data)",
"backup_all_import": "Import",
"backup_all_export": "Export",
"backup_all_import_desc": "Select a backup file",
"backup_all_export_desc": "Select the backup to...",
"backup_part_import_setting_desc": "Select the Settings file",
"backup_part_export_setting_desc": "Save the list to...",
"backup_part_import_list_desc": "Select a list backup",
"backup_part_export_list_desc": "Save the list to...",
"other": "Extras",
"other_play_list_cache": "List cache management (links to songs that have been cached in my list, alternative sources for playback, after cleaning up, you need to re-acquire them when you play and download songs, and do not clean up if there are no issues related to song playback)",
"other_play_list_cache_clear_btn": "Clear list cache information",
"other_resource_cache": "Resource cache management (pictures, audios and other caches, pictures and other resources will need to be downloaded again after cleaning up, it is not recommended to clean up, the software will dynamically manage the cache size according to the disk space)",
"other_resource_cache_clear_btn": "Clear resource cache",
"other_resource_cache_label": "The software has used cache size: ",
"other_tray_theme": "Tray Icon Style",
"other_tray_theme_native": "Solid Color",
"other_tray_theme_origin": "Primary Color",
"other_resource_cache": "Resource cache management (pictures, audios and other caches, pictures and other resources will need to be downloaded again after cleaning up, it is not recommended to clean up, the software will dynamically manage the cache size according to the disk space)",
"other_resource_cache_label": "The software has used cache size: ",
"other_resource_cache_clear_btn": "Clear resource cache",
"other_play_list_cache": "List cache management (links to songs that have been cached in my list, alternative sources for playback, after cleaning up, you need to re-acquire them when you play and download songs, and do not clean up if there are no issues related to song playback)",
"other_play_list_cache_clear_btn": "Clear list cache information",
"play": "Play",
"play_lyric_lxlrc": "Use Karaoke-style lyrics playback (if supported)",
"play_lyric_transition": "Show lyrics translation",
"play_mediaDevice": "Audio output",
"play_mediaDevice_remove_stop_play": "Pause the song when the current sound output device is changed",
"play_mediaDevice_title": "Select a media device for audio output",
"play_quality": "Play 320K quality songs first (if supported)",
"play_save_play_time": "Remember playback progress",
"play_task_bar": "Show playing progress on the taskbar",
"search": "Search",
"search_focus_search_box": "Automatically focus the search box on startup",
"search_history": "Search history",
"search_hot": "Top Searches",
"update": "Update",
"update_latest_label": "Latest version: ",
"update_unknown": "Unknown",
"update_checking": "Checking for updates...",
"update_current_label": "Current version: ",
"update_downloading": "Update is found and being downloaded...⏳",
"update_progress": "Download progress: ",
"update_latest": "The software is up-to-date, enjoy yourself!🥂",
"update_open_version_modal_btn": "Open the update window🚀",
"update_checking": "Checking for updates...",
"update_init": "Processing update...",
"about": "About lx-music-desktop",
"is_enable": "Enabled",
"is_show": "Showed",
"click_open": "Click to open",
"click_copy": "Click to copy"
"update_latest": "The software is up-to-date, enjoy yourself!🥂",
"update_latest_label": "Latest version: ",
"update_open_version_modal_btn": "Open the update window🚀",
"update_progress": "Download progress: ",
"update_unknown": "Unknown"
}

View File

@ -1,154 +1,143 @@
{
"about": "关于洛雪音乐",
"backup": "备份与恢复",
"backup_all": "所有数据(列表数据与设置数据)",
"backup_all_export": "导出",
"backup_all_export_desc": "选择备份保存位置",
"backup_all_import": "导入",
"backup_all_import_desc": "选择备份文件",
"backup_part": "部分数据(列表数据包括试听列表、收藏列表、用户自定义列表,设置数据不包括快捷键设置)",
"backup_part_export_list": "导出列表",
"backup_part_export_list_desc": "选择歌单保存位置",
"backup_part_export_setting": "导出设置",
"backup_part_export_setting_desc": "选择设置保存位置",
"backup_part_import_list": "导入列表",
"backup_part_import_list_desc": "选择列表文件",
"backup_part_import_setting": "导入设置",
"backup_part_import_setting_desc": "选择配置文件",
"basic": "基本设置",
"basic_theme": "主题颜色",
"basic_animation": "弹出层随机动画",
"basic_show_animation": "显示切换动画",
"basic_source_title": "选择音乐来源",
"basic_source_test": "测试接口(几乎软件的所有功能都可用)",
"basic_source_temp": "临时接口(软件的某些功能不可用,建议测试接口不可用再使用本接口)",
"basic_source": "音乐来源",
"basic_sourcename_title": "选择音源名字类型",
"basic_sourcename_real": "原名",
"basic_sourcename_alias": "别名",
"basic_sourcename": "音源名字",
"basic_source_status_success": "初始化成功",
"basic_source_status_initing": "初始化中",
"basic_source_status_failed": "初始化失败",
"basic_source_user_api_btn": "自定义源管理",
"basic_window_size_title": "设置软件窗口尺寸",
"basic_window_size": "窗口尺寸",
"basic_window_size_smaller": "较小",
"basic_window_size_small": "小",
"basic_window_size_medium": "中",
"basic_window_size_big": "大",
"basic_window_size_larger": "较大",
"basic_window_size_oversized": "超大",
"basic_window_size_huge": "巨大",
"basic_to_tray": "关闭软件时不退出软件将其最小化到系统托盘",
"basic_lang_title": "软件显示的语言",
"basic_lang": "语言",
"basic_control_btn_position": "控制按钮位置",
"basic_control_btn_position_left": "左边",
"basic_control_btn_position_right": "右边",
"play": "播放设置",
"play_save_play_time": "记住播放进度",
"play_lyric_transition": "显示歌词翻译",
"play_lyric_lxlrc": "使用卡拉OK式歌词播放如果支持",
"play_quality": "优先播放320K品质的歌曲如果支持",
"play_task_bar": "在任务栏上显示当前歌曲播放进度",
"play_mediaDevice_title": "选择声音输出的媒体设备",
"play_mediaDevice": "音频输出",
"play_mediaDevice_remove_stop_play": "当前的声音输出设备被改变时暂停播放歌曲",
"basic_lang": "语言",
"basic_lang_title": "软件显示的语言",
"basic_show_animation": "显示切换动画",
"basic_source": "音乐来源",
"basic_source_status_failed": "初始化失败",
"basic_source_status_initing": "初始化中",
"basic_source_status_success": "初始化成功",
"basic_source_temp": "临时接口(软件的某些功能不可用,建议测试接口不可用再使用本接口)",
"basic_source_test": "测试接口(几乎软件的所有功能都可用)",
"basic_source_title": "选择音乐来源",
"basic_source_user_api_btn": "自定义源管理",
"basic_sourcename": "音源名字",
"basic_sourcename_alias": "别名",
"basic_sourcename_real": "原名",
"basic_sourcename_title": "选择音源名字类型",
"basic_theme": "主题颜色",
"basic_to_tray": "关闭软件时不退出软件将其最小化到系统托盘",
"basic_window_size": "窗口尺寸",
"basic_window_size_big": "大",
"basic_window_size_huge": "巨大",
"basic_window_size_larger": "较大",
"basic_window_size_medium": "中",
"basic_window_size_oversized": "超大",
"basic_window_size_small": "小",
"basic_window_size_smaller": "较小",
"basic_window_size_title": "设置软件窗口尺寸",
"click_copy": "点击复制",
"click_open": "点击打开",
"desktop_lyric": "桌面歌词设置",
"desktop_lyric_always_on_top": "使歌词总是在其他窗口之上",
"desktop_lyric_enable": "显示歌词",
"desktop_lyric_lock": "锁定歌词",
"desktop_lyric_always_on_top": "使歌词总是在其他窗口之上",
"desktop_lyric_lock_screen": "不允许歌词窗口拖出主屏幕之外",
"search": "搜索设置",
"search_hot": "显示热门搜索",
"search_history": "显示历史搜索记录",
"search_focus_search_box": "启动时自动聚焦搜索框",
"list": "列表设置",
"list_source": "显示歌曲源(仅对我的音乐分类有效)",
"list_scroll": "记住播放列表滚动条位置(仅对我的音乐分类有效)",
"download": "下载设置",
"download_enable": "是否启用下载功能",
"download_path_title": "下载歌曲保存的路径",
"download_path": "下载路径",
"download_path_label": "当前下载路径:",
"download_path_open_label": "点击打开当前路径",
"download_path_change_btn": "更改",
"download_name_title": "下载歌曲时的命名方式",
"download_name": "文件命名方式",
"download_data_embed": "是否将以下内容嵌入到音频文件中",
"download_embed_pic": "封面嵌入",
"download_embed_lyric": "歌词嵌入",
"download_lyric_title": "是否同时下载歌词文件",
"download_embed_pic": "封面嵌入",
"download_enable": "是否启用下载功能",
"download_lyric": "歌词下载",
"download_lyric_title": "是否同时下载歌词文件",
"download_name": "文件命名方式",
"download_name1": "歌名 - 歌手",
"download_name2": "歌手 - 歌名",
"download_name3": "歌名",
"download_use_other_source": "自动换源下载当无法从歌曲的原始源下载时尝试切换到其他源下载此功能不100%保证换源后的歌曲版本与原版一致)",
"download_name_title": "下载歌曲时的命名方式",
"download_path": "下载路径",
"download_path_change_btn": "更改",
"download_path_label": "当前下载路径:",
"download_path_open_label": "点击打开当前路径",
"download_path_title": "下载歌曲保存的路径",
"download_select_save_path": "选择歌曲保存路径",
"download_use_other_source": "自动换源下载当无法从歌曲的原始源下载时尝试切换到其他源下载此功能不100%保证换源后的歌曲版本与原版一致)",
"hot_key": "快捷键设置",
"hot_key_local_title": "软件内快捷键",
"hot_key_global_title": "全局快捷键",
"hot_key_tip_input": "请输入新的按键",
"hot_key_unset_input": "未设置",
"hot_key_common_toggle_close": "退出程序",
"hot_key_common_toggle_min": "最小化/还原程序",
"hot_key_common_min": "最小化程序",
"hot_key_common_toggle_hide": "显示/隐藏程序",
"hot_key_common_focus_search_input": "聚焦搜索框",
"hot_key_player_toggle_play": "播放/暂停控制",
"hot_key_player_prev": "上一首歌曲",
"hot_key_common_min": "最小化程序",
"hot_key_common_toggle_close": "退出程序",
"hot_key_common_toggle_hide": "显示/隐藏程序",
"hot_key_common_toggle_min": "最小化/还原程序",
"hot_key_desktop_lyric_toggle_always_top": "桌面歌词置顶切换",
"hot_key_desktop_lyric_toggle_lock": "桌面歌词锁定切换",
"hot_key_desktop_lyric_toggle_visible": "开/关桌面歌词",
"hot_key_global_title": "全局快捷键",
"hot_key_local_title": "软件内快捷键",
"hot_key_player_next": "下一首歌曲",
"hot_key_player_volume_up": "增加音量",
"hot_key_player_prev": "上一首歌曲",
"hot_key_player_toggle_play": "播放/暂停控制",
"hot_key_player_volume_down": "减少音量",
"hot_key_player_volume_mute": "静音切换",
"hot_key_desktop_lyric_toggle_visible": "开/关桌面歌词",
"hot_key_desktop_lyric_toggle_lock": "桌面歌词锁定切换",
"hot_key_desktop_lyric_toggle_always_top": "桌面歌词置顶切换",
"hot_key_player_volume_up": "增加音量",
"hot_key_tip_input": "请输入新的按键",
"hot_key_unset_input": "未设置",
"is_enable": "是否启用",
"is_show": "是否显示",
"list": "列表设置",
"list_add_music_location_type": "添加歌曲到列表时的位置",
"list_add_music_location_type_bottom": "底部",
"list_add_music_location_type_top": "顶部",
"list_scroll": "记住播放列表滚动条位置(仅对我的音乐分类有效)",
"list_source": "显示歌曲源(仅对我的音乐分类有效)",
"network": "网络设置",
"network_proxy_title": "HTTP代理设置乱设置软件将无法联网",
"network_proxy_host": "主机",
"network_proxy_port": "端口",
"network_proxy_username": "用户名",
"network_proxy_password": "密码",
"network_proxy_port": "端口",
"network_proxy_title": "HTTP代理设置乱设置软件将无法联网",
"network_proxy_username": "用户名",
"odc": "强迫症设置",
"odc_clear_search_input": "离开搜索界面时清空搜索框",
"odc_clear_search_list": "离开搜索界面时清空搜索列表",
"backup": "备份与恢复",
"backup_part": "部分数据(列表数据包括试听列表、收藏列表、用户自定义列表,设置数据不包括快捷键设置)",
"backup_part_import_list": "导入列表",
"backup_part_export_list": "导出列表",
"backup_part_import_setting": "导入设置",
"backup_part_export_setting": "导出设置",
"backup_all": "所有数据(列表数据与设置数据)",
"backup_all_import": "导入",
"backup_all_export": "导出",
"backup_all_import_desc": "选择备份文件",
"backup_all_export_desc": "选择备份保存位置",
"backup_part_import_setting_desc": "选择配置文件",
"backup_part_export_setting_desc": "选择设置保存位置",
"backup_part_import_list_desc": "选择列表文件",
"backup_part_export_list_desc": "选择歌单保存位置",
"other": "其他",
"other_play_list_cache": "列表缓存管理(我的列表中已缓存的歌曲链接、播放代替源,清理后播放、下载歌曲时需要重新获取,没有歌曲播放相关的问题不要清理)",
"other_play_list_cache_clear_btn": "清理列表缓存信息",
"other_resource_cache": "资源缓存管理(图片、音频等缓存,清理后图片等资源将需要重新下载,不建议清理,软件会根据磁盘空间动态管理缓存大小)",
"other_resource_cache_clear_btn": "清理资源缓存",
"other_resource_cache_label": "软件已使用缓存大小:",
"other_tray_theme": "托盘图标样式",
"other_tray_theme_native": "纯色",
"other_tray_theme_origin": "原色",
"other_resource_cache": "资源缓存管理(图片、音频等缓存,清理后图片等资源将需要重新下载,不建议清理,软件会根据磁盘空间动态管理缓存大小)",
"other_resource_cache_label": "软件已使用缓存大小:",
"other_resource_cache_clear_btn": "清理资源缓存",
"other_play_list_cache": "列表缓存管理(我的列表中已缓存的歌曲链接、播放代替源,清理后播放、下载歌曲时需要重新获取,没有歌曲播放相关的问题不要清理)",
"other_play_list_cache_clear_btn": "清理列表缓存信息",
"play": "播放设置",
"play_lyric_lxlrc": "使用卡拉OK式歌词播放如果支持",
"play_lyric_transition": "显示歌词翻译",
"play_mediaDevice": "音频输出",
"play_mediaDevice_remove_stop_play": "当前的声音输出设备被改变时暂停播放歌曲",
"play_mediaDevice_title": "选择声音输出的媒体设备",
"play_quality": "优先播放320K品质的歌曲如果支持",
"play_save_play_time": "记住播放进度",
"play_task_bar": "在任务栏上显示当前歌曲播放进度",
"search": "搜索设置",
"search_focus_search_box": "启动时自动聚焦搜索框",
"search_history": "显示历史搜索记录",
"search_hot": "显示热门搜索",
"update": "软件更新",
"update_latest_label": "最新版本:",
"update_unknown": "未知",
"update_checking": "检查更新中...",
"update_current_label": "当前版本:",
"update_downloading": "发现新版本并在努力下载中,请稍后...⏳",
"update_progress": "下载进度:",
"update_latest": "软件已是最新,尽情地体验吧~🥂",
"update_open_version_modal_btn": "打开更新窗口 🚀",
"update_checking": "检查更新中...",
"update_init": "处理更新中...",
"about": "关于洛雪音乐",
"is_enable": "是否启用",
"is_show": "是否显示",
"click_open": "点击打开",
"click_copy": "点击复制"
"update_latest": "软件已是最新,尽情地体验吧~🥂",
"update_latest_label": "最新版本:",
"update_open_version_modal_btn": "打开更新窗口 🚀",
"update_progress": "下载进度:",
"update_unknown": "未知"
}

View File

@ -1,154 +1,143 @@
{
"about": "關於洛雪音樂",
"backup": "備份與恢復",
"backup_all": "所有數據(列表數據與設置數據)",
"backup_all_export": "導出",
"backup_all_export_desc": "選擇備份保存位置",
"backup_all_import": "導入",
"backup_all_import_desc": "選擇備份文件",
"backup_part": "部分數據(列表數據包括試聽列表、收藏列表、用戶自定義列表,設置數據不包括快捷鍵設置)",
"backup_part_export_list": "導出列表",
"backup_part_export_list_desc": "選擇歌單保存位置",
"backup_part_export_setting": "導出設置",
"backup_part_export_setting_desc": "選擇設置保存位置",
"backup_part_import_list": "導入列表",
"backup_part_import_list_desc": "選擇列表文件",
"backup_part_import_setting": "導入設置",
"backup_part_import_setting_desc": "選擇配置文件",
"basic": "基本設置",
"basic_theme": "主題顏色",
"basic_animation": "彈出層隨機動畫",
"basic_show_animation": "顯示切換動畫",
"basic_source_title": "選擇音樂來源",
"basic_source_test": "測試接口(幾乎軟件的所有功能都可用)",
"basic_source_temp": "臨時接口(軟件的某些功能不可用,建議測試接口不可用再使用本接口)",
"basic_source": "音樂來源",
"basic_sourcename_title": "選擇音源名字類型",
"basic_sourcename_real": "原名",
"basic_sourcename_alias": "別名",
"basic_sourcename": "音源名字",
"basic_source_status_success": "初始化成功",
"basic_source_status_initing": "初始化中",
"basic_source_status_failed": "初始化失敗",
"basic_source_user_api_btn": "自定義源管理",
"basic_window_size_title": "設置軟件窗口尺寸",
"basic_window_size": "窗口尺寸",
"basic_window_size_smaller": "較小",
"basic_window_size_small": "小",
"basic_window_size_medium": "中",
"basic_window_size_big": "大",
"basic_window_size_larger": "較大",
"basic_window_size_oversized": "超大",
"basic_window_size_huge": "巨大",
"basic_to_tray": "關閉軟件時不退出軟件將其最小化到系統托盤",
"basic_lang_title": "軟件顯示的語言",
"basic_lang": "語言",
"basic_control_btn_position": "控制按鈕位置",
"basic_control_btn_position_left": "左邊",
"basic_control_btn_position_right": "右邊",
"play": "播放設置",
"play_save_play_time": "記住播放進度",
"play_lyric_transition": "顯示歌詞翻譯",
"play_lyric_lxlrc": "使用卡拉OK式歌詞播放如果支持",
"play_quality": "優先播放320K品質的歌曲如果支持",
"play_task_bar": "在任務欄上顯示當前歌曲播放進度",
"play_mediaDevice_title": "選擇聲音輸出的媒體設備",
"play_mediaDevice": "音頻輸出",
"play_mediaDevice_remove_stop_play": "當前的聲音輸出設備被改變時暫停播放歌曲",
"basic_lang": "語言",
"basic_lang_title": "軟件顯示的語言",
"basic_show_animation": "顯示切換動畫",
"basic_source": "音樂來源",
"basic_source_status_failed": "初始化失敗",
"basic_source_status_initing": "初始化中",
"basic_source_status_success": "初始化成功",
"basic_source_temp": "臨時接口(軟件的某些功能不可用,建議測試接口不可用再使用本接口)",
"basic_source_test": "測試接口(幾乎軟件的所有功能都可用)",
"basic_source_title": "選擇音樂來源",
"basic_source_user_api_btn": "自定義源管理",
"basic_sourcename": "音源名字",
"basic_sourcename_alias": "別名",
"basic_sourcename_real": "原名",
"basic_sourcename_title": "選擇音源名字類型",
"basic_theme": "主題顏色",
"basic_to_tray": "關閉軟件時不退出軟件將其最小化到系統托盤",
"basic_window_size": "窗口尺寸",
"basic_window_size_big": "大",
"basic_window_size_huge": "巨大",
"basic_window_size_larger": "較大",
"basic_window_size_medium": "中",
"basic_window_size_oversized": "超大",
"basic_window_size_small": "小",
"basic_window_size_smaller": "較小",
"basic_window_size_title": "設置軟件窗口尺寸",
"click_copy": "點擊複製",
"click_open": "點擊打開",
"desktop_lyric": "桌面歌詞設置",
"desktop_lyric_always_on_top": "使歌詞總是在其他窗口之上",
"desktop_lyric_enable": "顯示歌詞",
"desktop_lyric_lock": "鎖定歌詞",
"desktop_lyric_always_on_top": "使歌詞總是在其他窗口之上",
"desktop_lyric_lock_screen": "不允許歌詞窗口拖出主屏幕之外",
"search": "搜索設置",
"search_hot": "顯示熱門搜索",
"search_history": "顯示歷史搜索記錄",
"search_focus_search_box": "啟動時自動聚焦搜索框",
"list": "列表設置",
"list_source": "顯示歌曲源(僅對我的音樂分類有效)",
"list_scroll": "記住播放列表滾動條位置(僅對我的音樂分類有效)",
"download": "下載設置",
"download_enable": "是否啟用下載功能",
"download_path_title": "下載歌曲保存的路徑",
"download_path": "下載路徑",
"download_path_label": "當前下載路徑:",
"download_path_open_label": "點擊打開當前路徑",
"download_path_change_btn": "更改",
"download_name_title": "下載歌曲時的命名方式",
"download_name": "文件命名方式",
"download_data_embed": "是否將以下內容嵌入到音頻文件中",
"download_embed_pic": "封面嵌入",
"download_embed_lyric": "歌詞嵌入",
"download_lyric_title": "是否同時下載歌詞文件",
"download_embed_pic": "封面嵌入",
"download_enable": "是否啟用下載功能",
"download_lyric": "歌詞下載",
"download_lyric_title": "是否同時下載歌詞文件",
"download_name": "文件命名方式",
"download_name1": "歌名 - 歌手",
"download_name2": "歌手 - 歌名",
"download_name3": "歌名",
"download_use_other_source": "自動換源下載當無法從歌曲的原始源下載時嘗試切換到其他源下載此功能不100%保證換源後的歌曲版本與原版一致)",
"download_name_title": "下載歌曲時的命名方式",
"download_path": "下載路徑",
"download_path_change_btn": "更改",
"download_path_label": "當前下載路徑:",
"download_path_open_label": "點擊打開當前路徑",
"download_path_title": "下載歌曲保存的路徑",
"download_select_save_path": "選擇歌曲保存路徑",
"download_use_other_source": "自動換源下載當無法從歌曲的原始源下載時嘗試切換到其他源下載此功能不100%保證換源後的歌曲版本與原版一致)",
"hot_key": "快捷鍵設置",
"hot_key_local_title": "軟件內快捷鍵",
"hot_key_global_title": "全局快捷鍵",
"hot_key_tip_input": "請輸入新的按鍵",
"hot_key_unset_input": "未設置",
"hot_key_common_toggle_close": "退出程序",
"hot_key_common_toggle_min": "最小化/還原程序",
"hot_key_common_min": "最小化程序",
"hot_key_common_toggle_hide": "顯示/隱藏程序",
"hot_key_common_focus_search_input": "聚焦搜索框",
"hot_key_player_toggle_play": "播放/暫停控制​​",
"hot_key_player_prev": "上一首歌曲",
"hot_key_common_min": "最小化程序",
"hot_key_common_toggle_close": "退出程序",
"hot_key_common_toggle_hide": "顯示/隱藏程序",
"hot_key_common_toggle_min": "最小化/還原程序",
"hot_key_desktop_lyric_toggle_always_top": "桌面歌詞置頂切換",
"hot_key_desktop_lyric_toggle_lock": "桌面歌詞鎖定切換",
"hot_key_desktop_lyric_toggle_visible": "開/關桌面歌詞",
"hot_key_global_title": "全局快捷鍵",
"hot_key_local_title": "軟件內快捷鍵",
"hot_key_player_next": "下一首歌曲",
"hot_key_player_volume_up": "增加音量",
"hot_key_player_prev": "上一首歌曲",
"hot_key_player_toggle_play": "播放/暫停控制​​",
"hot_key_player_volume_down": "減少音量",
"hot_key_player_volume_mute": "靜音切換",
"hot_key_desktop_lyric_toggle_visible": "開/關桌面歌詞",
"hot_key_desktop_lyric_toggle_lock": "桌面歌詞鎖定切換",
"hot_key_desktop_lyric_toggle_always_top": "桌面歌詞置頂切換",
"hot_key_player_volume_up": "增加音量",
"hot_key_tip_input": "請輸入新的按鍵",
"hot_key_unset_input": "未設置",
"is_enable": "是否啟用",
"is_show": "是否顯示",
"list": "列表設置",
"list_add_music_location_type": "添加歌曲到列表時的位置",
"list_add_music_location_type_bottom": "底部",
"list_add_music_location_type_top": "頂部",
"list_scroll": "記住播放列表滾動條位置(僅對我的音樂分類有效)",
"list_source": "顯示歌曲源(僅對我的音樂分類有效)",
"network": "網絡設置",
"network_proxy_title": "HTTP代理設置亂設置軟件將無法聯網",
"network_proxy_host": "主機",
"network_proxy_port": "端口",
"network_proxy_username": "用戶名",
"network_proxy_password": "密碼",
"network_proxy_port": "端口",
"network_proxy_title": "HTTP代理設置亂設置軟件將無法聯網",
"network_proxy_username": "用戶名",
"odc": "強迫症設置",
"odc_clear_search_input": "離開搜索界面時清空搜索框",
"odc_clear_search_list": "離開搜索界面時清空搜索列表",
"backup": "備份與恢復",
"backup_part": "部分數據(列表數據包括試聽列表、收藏列表、用戶自定義列表,設置數據不包括快捷鍵設置)",
"backup_part_import_list": "導入列表",
"backup_part_export_list": "導出列表",
"backup_part_import_setting": "導入設置",
"backup_part_export_setting": "導出設置",
"backup_all": "所有數據(列表數據與設置數據)",
"backup_all_import": "導入",
"backup_all_export": "導出",
"backup_all_import_desc": "選擇備份文件",
"backup_all_export_desc": "選擇備份保存位置",
"backup_part_import_setting_desc": "選擇配置文件",
"backup_part_export_setting_desc": "選擇設置保存位置",
"backup_part_import_list_desc": "選擇列表文件",
"backup_part_export_list_desc": "選擇歌單保存位置",
"other": "其他",
"other_play_list_cache": "列表緩存管理(我的列表中已緩存的歌曲鏈接、播放代替源,清理後播放、下載歌曲時需要重新獲取,沒有歌曲播放相關的問題不要清理)",
"other_play_list_cache_clear_btn": "清理列表緩存信息",
"other_resource_cache": "資源緩存管理(圖片、音頻等緩存,清理後圖片等資源將需要重新下載,不建議清理,軟件會根據磁盤空間動態管理緩存大小)",
"other_resource_cache_clear_btn": "清理資源緩存",
"other_resource_cache_label": "軟件已使用緩存大小:",
"other_tray_theme": "托盤圖標樣式",
"other_tray_theme_native": "純色",
"other_tray_theme_origin": "原色",
"other_resource_cache": "資源緩存管理(圖片、音頻等緩存,清理後圖片等資源將需要重新下載,不建議清理,軟件會根據磁盤空間動態管理緩存大小)",
"other_resource_cache_label": "軟件已使用緩存大小:",
"other_resource_cache_clear_btn": "清理資源緩存",
"other_play_list_cache": "列表緩存管理(我的列表中已緩存的歌曲鏈接、播放代替源,清理後播放、下載歌曲時需要重新獲取,沒有歌曲播放相關的問題不要清理)",
"other_play_list_cache_clear_btn": "清理列表緩存信息",
"play": "播放設置",
"play_lyric_lxlrc": "使用卡拉OK式歌詞播放如果支持",
"play_lyric_transition": "顯示歌詞翻譯",
"play_mediaDevice": "音頻輸出",
"play_mediaDevice_remove_stop_play": "當前的聲音輸出設備被改變時暫停播放歌曲",
"play_mediaDevice_title": "選擇聲音輸出的媒體設備",
"play_quality": "優先播放320K品質的歌曲如果支持",
"play_save_play_time": "記住播放進度",
"play_task_bar": "在任務欄上顯示當前歌曲播放進度",
"search": "搜索設置",
"search_focus_search_box": "啟動時自動聚焦搜索框",
"search_history": "顯示歷史搜索記錄",
"search_hot": "顯示熱門搜索",
"update": "軟件更新",
"update_latest_label": "最新版本:",
"update_unknown": "未知",
"update_checking": "檢查更新中...",
"update_current_label": "當前版本:",
"update_downloading": "發現新版本並在努力下載中,請稍後...⏳",
"update_progress": "下載進度:",
"update_latest": "軟件已是最新,盡情地體驗吧~🥂",
"update_open_version_modal_btn": "打開更新窗口 🚀",
"update_checking": "檢查更新中...",
"update_init": "處理更新中...",
"about": "關於洛雪音樂",
"is_enable": "是否啟用",
"is_show": "是否顯示",
"click_open": "點擊打開",
"click_copy": "點擊複製"
"update_latest": "軟件已是最新,盡情地體驗吧~🥂",
"update_latest_label": "最新版本:",
"update_open_version_modal_btn": "打開更新窗口 🚀",
"update_progress": "下載進度:",
"update_unknown": "未知"
}

View File

@ -94,7 +94,15 @@ const mutations = {
const targetList = allList[id]
if (!targetList) return
if (targetList.list.some(s => s.songmid === musicInfo.songmid)) return
targetList.list.push(musicInfo)
switch (this.state.setting.list.addMusicLocationType) {
case 'top':
targetList.list.unshift(musicInfo)
break
case 'bottom':
default:
targetList.list.push(musicInfo)
break
}
},
listMove(state, { fromId, musicInfo, toId }) {
const fromList = allList[fromId]
@ -102,12 +110,31 @@ const mutations = {
if (!fromList || !toList) return
fromList.list.splice(fromList.list.indexOf(musicInfo), 1)
let index = toList.list.findIndex(s => s.songmid === musicInfo.songmid)
if (index < 0) toList.list.push(musicInfo)
if (index < 0) {
switch (this.state.setting.list.addMusicLocationType) {
case 'top':
toList.list.unshift(musicInfo)
break
case 'bottom':
default:
toList.list.push(musicInfo)
break
}
}
},
listAddMultiple(state, { id, list }) {
let targetList = allList[id]
if (!targetList) return
let newList = [...targetList.list, ...list]
let newList
switch (this.state.setting.list.addMusicLocationType) {
case 'top':
newList = [...list, ...targetList.list]
break
case 'bottom':
default:
newList = [...targetList.list, ...list]
break
}
let map = {}
let ids = []
for (const item of newList) {

View File

@ -80,7 +80,7 @@ const encodeNames = {
'&apos;': "'",
'&#039;': "'",
}
export const decodeName = (str = '') => str.replace(/(?:&amp;|&lt;|&gt;|&quot;|&apos;|&#039;)/gm, s => encodeNames[s])
export const decodeName = (str = '') => str?.replace(/(?:&amp;|&lt;|&gt;|&quot;|&apos;|&#039;)/gm, s => encodeNames[s]) || ''
const easeInOutQuad = (t, b, c, d) => {
t /= d / 2

View File

@ -1,6 +1,7 @@
import { httpFetch } from '../../request'
import { requestMsg } from '../../message'
import { headers, timeout } from '../options'
import { dnsLookup } from '../utils'
const api_test = {
getMusicUrl(songInfo, type) {
@ -8,6 +9,7 @@ const api_test = {
method: 'get',
timeout,
headers,
lookup: dnsLookup,
family: 4,
})
requestObj.promise = requestObj.promise.then(({ body }) => {

View File

@ -1,6 +1,6 @@
import { httpFetch } from '../../request'
// import { formatPlayTime } from '../../index'
// import jshtmlencode from 'js-htmlencode'
const boardList = [
// { id: 'bd__601', name: '歌单榜', bangid: '601' },

View File

@ -1,5 +1,5 @@
// import '../../polyfill/array.find'
// import jshtmlencode from 'js-htmlencode'
import { httpFetch } from '../../request'
import { formatPlayTime } from '../../index'
// import { debug } from '../../utils/env'

View File

@ -1,6 +1,7 @@
import { httpFetch } from '../../request'
import { requestMsg } from '../../message'
import { headers, timeout } from '../options'
import { dnsLookup } from '../utils'
const api_test = {
getMusicUrl(songInfo, type) {
@ -8,6 +9,7 @@ const api_test = {
method: 'get',
timeout,
headers,
lookup: dnsLookup,
family: 4,
})
requestObj.promise = requestObj.promise.then(({ body }) => {

View File

@ -1,5 +1,5 @@
// import '../../polyfill/array.find'
// import jshtmlencode from 'js-htmlencode'
import { httpFetch } from '../../request'
import { decodeName, formatPlayTime, sizeFormate } from '../../index'
// import { debug } from '../../utils/env'

View File

@ -1,5 +1,6 @@
import { httpFetch } from '../../request'
import { headers, timeout } from '../options'
import { dnsLookup } from '../utils'
const api_temp = {
getMusicUrl(songInfo, type) {
@ -7,6 +8,7 @@ const api_temp = {
method: 'get',
headers,
timeout,
lookup: dnsLookup,
family: 4,
})
requestObj.promise = requestObj.promise.then(({ body }) => {

View File

@ -1,6 +1,7 @@
import { httpFetch } from '../../request'
import { requestMsg } from '../../message'
import { headers, timeout } from '../options'
import { dnsLookup } from '../utils'
const api_test = {
// getMusicUrl(songInfo, type) {
@ -19,6 +20,7 @@ const api_test = {
method: 'get',
timeout,
headers,
lookup: dnsLookup,
family: 4,
})
requestObj.promise = requestObj.promise.then(({ body }) => {

View File

@ -1,5 +1,5 @@
// import '../../polyfill/array.find'
// import jshtmlencode from 'js-htmlencode'
import { httpFetch } from '../../request'
import { formatPlayTime, decodeName } from '../../index'
// import { debug } from '../../utils/env'

View File

@ -226,13 +226,13 @@ export default {
}
})
},
async getListDetailDigest5(id, page) {
const detailId = await this.getListDetailDigest5Info(id)
return this.getListDetailDigest5Music(detailId, page)
async getListDetailDigest5(id, page, retryNum) {
const detailId = await this.getListDetailDigest5Info(id, retryNum)
return this.getListDetailDigest5Music(detailId, page, retryNum)
},
// 获取歌曲列表内的音乐
getListDetail(id, page) {
getListDetail(id, page, retryNum = 0) {
// console.log(id)
if ((/[?&:/]/.test(id))) id = id.replace(this.regExps.listDetailLink, '$1')
else if (/^digest-/.test(id)) {
@ -242,12 +242,12 @@ export default {
switch (digest) {
case '8':
break
case '13': return album.getAlbumListDetail(id, page)
case '13': return album.getAlbumListDetail(id, page, retryNum)
case '5':
default: return this.getListDetailDigest5(id, page)
default: return this.getListDetailDigest5(id, page, retryNum)
}
}
return this.getListDetailDigest8(id, page)
return this.getListDetailDigest8(id, page, retryNum)
},
filterListDetail(rawData) {
// console.log(rawData)

View File

@ -1,6 +1,7 @@
import { httpFetch } from '../../request'
import { requestMsg } from '../../message'
import { headers, timeout } from '../options'
import { dnsLookup } from '../utils'
const api_test = {
getMusicUrl(songInfo, type) {
@ -8,6 +9,7 @@ const api_test = {
method: 'get',
timeout,
headers,
lookup: dnsLookup,
family: 4,
})
requestObj.promise = requestObj.promise.then(({ body }) => {

View File

@ -1,6 +1,6 @@
import { httpFetch } from '../../request'
import { sizeFormate } from '../../index'
// import jshtmlencode from 'js-htmlencode'
const boardList = [{ id: 'mg__27553319', name: '咪咕尖叫新歌榜', bangid: '27553319' }, { id: 'mg__27186466', name: '咪咕尖叫热歌榜', bangid: '27186466' }, { id: 'mg__27553408', name: '咪咕尖叫原创榜', bangid: '27553408' }, { id: 'mg__23189800', name: '咪咕港台榜', bangid: '23189800' }, { id: 'mg__23189399', name: '咪咕内地榜', bangid: '23189399' }, { id: 'mg__19190036', name: '咪咕欧美榜', bangid: '19190036' }, { id: 'mg__23189813', name: '咪咕日韩榜', bangid: '23189813' }, { id: 'mg__23190126', name: '咪咕彩铃榜', bangid: '23190126' }, { id: 'mg__15140045', name: '咪咕KTV榜', bangid: '15140045' }, { id: 'mg__15140034', name: '咪咕网络榜', bangid: '15140034' }, { id: 'mg__23217754', name: 'MV榜', bangid: '23217754' }, { id: 'mg__23218151', name: '新专辑榜', bangid: '23218151' }, { id: 'mg__21958042', name: 'iTunes榜', bangid: '21958042' }, { id: 'mg__21975570', name: 'billboard榜', bangid: '21975570' }, { id: 'mg__22272815', name: '台湾Hito中文榜', bangid: '22272815' }, { id: 'mg__22272904', name: '中国TOP排行榜', bangid: '22272904' }, { id: 'mg__22272943', name: '韩国Melon榜', bangid: '22272943' }, { id: 'mg__22273437', name: '英国UK榜', bangid: '22273437' }]

View File

@ -1,7 +1,7 @@
import { httpFetch } from '../../request'
import { formatPlayTime } from '../../index'
// import { sizeFormate } from '../../index'
// import jshtmlencode from 'js-htmlencode'
// const boardList = [{ id: 'mg__27553319', name: '咪咕尖叫新歌榜', bangid: '27553319' }, { id: 'mg__27186466', name: '咪咕尖叫热歌榜', bangid: '27186466' }, { id: 'mg__27553408', name: '咪咕尖叫原创榜', bangid: '27553408' }, { id: 'mg__23189800', name: '咪咕港台榜', bangid: '23189800' }, { id: 'mg__23189399', name: '咪咕内地榜', bangid: '23189399' }, { id: 'mg__19190036', name: '咪咕欧美榜', bangid: '19190036' }, { id: 'mg__23189813', name: '咪咕日韩榜', bangid: '23189813' }, { id: 'mg__23190126', name: '咪咕彩铃榜', bangid: '23190126' }, { id: 'mg__15140045', name: '咪咕KTV榜', bangid: '15140045' }, { id: 'mg__15140034', name: '咪咕网络榜', bangid: '15140034' }, { id: 'mg__23217754', name: 'MV榜', bangid: '23217754' }, { id: 'mg__23218151', name: '新专辑榜', bangid: '23218151' }, { id: 'mg__21958042', name: 'iTunes榜', bangid: '21958042' }, { id: 'mg__21975570', name: 'billboard榜', bangid: '21975570' }, { id: 'mg__22272815', name: '台湾Hito中文榜', bangid: '22272815' }, { id: 'mg__22272904', name: '中国TOP排行榜', bangid: '22272904' }, { id: 'mg__22272943', name: '韩国Melon榜', bangid: '22272943' }, { id: 'mg__22273437', name: '英国UK榜', bangid: '22273437' }]
const boardList = [

View File

@ -1,5 +1,5 @@
// import '../../polyfill/array.find'
// import jshtmlencode from 'js-htmlencode'
import { httpFetch } from '../../request'
import { sizeFormate } from '../../index'
// import { debug } from '../../utils/env'
@ -7,20 +7,21 @@ import { sizeFormate } from '../../index'
let searchRequest
export default {
limit: 30,
limit: 20,
total: 0,
page: 0,
allPage: 1,
musicSearch(str, page, limit) {
if (searchRequest && searchRequest.cancelHttp) searchRequest.cancelHttp()
searchRequest = httpFetch(`http://jadeite.migu.cn:7090/music_search/v2/search/searchAll?sid=4f87090d01c84984a11976b828e2b02c18946be88a6b4c47bcdc92fbd40762db&isCorrect=1&isCopyright=1&searchSwitch=%7B%22song%22%3A1%2C%22album%22%3A0%2C%22singer%22%3A0%2C%22tagSong%22%3A1%2C%22mvSong%22%3A0%2C%22bestShow%22%3A1%2C%22songlist%22%3A0%2C%22lyricSong%22%3A0%7D&pageSize=${limit}&text=${encodeURIComponent(str)}&pageNo=${page}&sort=0`, {
searchRequest = httpFetch(`http://pd.musicapp.migu.cn/MIGUM2.0/v1.0/content/search_all.do?ua=Android_migu&version=5.0.1&text=${encodeURIComponent(str)}&pageNo=${page}&pageSize=${limit}&searchSwitch=%7B%22song%22%3A1%2C%22album%22%3A0%2C%22singer%22%3A0%2C%22tagSong%22%3A0%2C%22mvSong%22%3A0%2C%22songlist%22%3A0%2C%22bestShow%22%3A1%7D`, {
// searchRequest = httpFetch(`http://jadeite.migu.cn:7090/music_search/v2/search/searchAll?sid=4f87090d01c84984a11976b828e2b02c18946be88a6b4c47bcdc92fbd40762db&isCorrect=1&isCopyright=1&searchSwitch=%7B%22song%22%3A1%2C%22album%22%3A0%2C%22singer%22%3A0%2C%22tagSong%22%3A1%2C%22mvSong%22%3A0%2C%22bestShow%22%3A1%2C%22songlist%22%3A0%2C%22lyricSong%22%3A0%7D&pageSize=${limit}&text=${encodeURIComponent(str)}&pageNo=${page}&sort=0`, {
headers: {
sign: 'c3b7ae985e2206e97f1b2de8f88691e2',
timestamp: 1578225871982,
appId: 'yyapp2',
mode: 'android',
ua: 'Android_migu',
version: '6.9.4',
// sign: 'c3b7ae985e2206e97f1b2de8f88691e2',
// timestamp: 1578225871982,
// appId: 'yyapp2',
// mode: 'android',
// ua: 'Android_migu',
// version: '6.9.4',
osVersion: 'android 7.0',
'User-Agent': 'okhttp/3.9.1',
},
@ -104,9 +105,9 @@ export default {
return this.musicSearch(str, page, limit).then(result => {
// console.log(result)
if (!result || result.code !== '000000') return Promise.reject(new Error(result ? result.info : '搜索失败'))
const songResultData = result.songResultData || { resultList: [], totalCount: 0 }
const songResultData = result.songResultData || { result: [], totalCount: 0 }
let list = this.handleResult(songResultData.resultList.flat())
let list = this.handleResult(songResultData.result)
if (list == null) return this.search(str, page, { limit }, retryNum)
this.total = parseInt(songResultData.totalCount)

View File

@ -7,11 +7,13 @@ export default {
_requestObj_tags: null,
_requestObj_list: null,
_requestObj_listDetail: null,
_requestObj_listDetailLink: null,
_requestObj_listDetailInfo: null,
limit_list: 10,
limit_song: 10000,
limit_song: 50,
successCode: '000000',
cachedDetailInfo: {},
cachedUrl: {},
sortList: [
{
name: '推荐',
@ -83,7 +85,7 @@ export default {
return this._requestObj_listDetail.promise.then(({ body }) => {
if (body.code !== this.successCode) return this.getListDetail(id, page, ++tryNum)
// console.log(JSON.stringify(body))
// console.log(body)
console.log(body)
return {
list: this.filterListDetail(body.list),
page,
@ -117,11 +119,38 @@ export default {
})
},
async getDetailUrl(link, page, retryNum = 0) {
if (retryNum > 3) return Promise.reject(new Error('link try max num'))
if (this._requestObj_listDetailLink) this._requestObj_listDetailLink.cancelHttp()
this._requestObj_listDetailLink = httpFetch(link, {
headers: {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
Referer: link,
},
})
const { headers: { location }, statusCode } = await this._requestObj_listDetailLink.promise
// console.log(body, location)
if (statusCode > 400) return this.getDetailUrl(link, page, ++retryNum)
if (location) {
this.cachedUrl[link] = location
return this.getListDetail(location, page)
}
return Promise.reject(new Error('link get failed'))
},
getListDetail(id, page) { // 获取歌曲列表内的音乐
// https://h5.nf.migu.cn/app/v4/p/share/playlist/index.html?id=184187437&channel=0146921
// http://c.migu.cn/00bTY6?ifrom=babddaadfde4ebeda289d671ab62f236
if (/playlist\/index\.html\?/.test(id)) {
id = id.replace(/.*(?:\?|&)id=(\d+)(?:&.*|$)/, '$1')
} else if ((/[?&:/]/.test(id))) id = id.replace(this.regExps.listDetailLink, '$1')
} else if (this.regExps.listDetailLink.test(id)) {
id = id.replace(this.regExps.listDetailLink, '$1')
} else if ((/[?&:/]/.test(id))) {
const url = this.cachedUrl[id]
return url ? this.getListDetail(url, page) : this.getDetailUrl(id, page)
}
return Promise.all([
this.getListDetailList(id, page),

View File

@ -1,6 +1,7 @@
import { httpFetch } from '../../request'
import { requestMsg } from '../../message'
import { headers, timeout } from '../options'
import { dnsLookup } from '../utils'
const api_messoer = {
getMusicUrl(songInfo, type) {
@ -8,6 +9,7 @@ const api_messoer = {
method: 'get',
timeout,
headers,
lookup: dnsLookup,
family: 4,
})
requestObj.promise = requestObj.promise.then(({ body }) => {

View File

@ -1,5 +1,5 @@
// import '../../polyfill/array.find'
// import jshtmlencode from 'js-htmlencode'
import { httpFetch } from '../../request'
import { formatPlayTime, sizeFormate } from '../../index'
// import { debug } from '../../utils/env'

View File

@ -1,6 +1,5 @@
import { httpFetch } from '../../request'
import { formatPlayTime, sizeFormate } from '../../index'
import jshtmlencode from 'js-htmlencode'
import { decodeName, formatPlayTime, sizeFormate } from '../../index'
export default {
_requestObj_tags: null,
@ -163,7 +162,7 @@ export default {
// time: basic.publish_time,
img: basic.cover.medium_url || basic.cover.default_url,
// grade: basic.favorcnt / 10,
desc: jshtmlencode.htmlDecode(basic.desc).replace(/<br>/g, '\n'),
desc: decodeName(basic.desc).replace(/<br>/g, '\n'),
source: 'tx',
})),
total: content.total_cnt,
@ -219,7 +218,7 @@ export default {
info: {
name: cdlist.dissname,
img: cdlist.logo,
desc: jshtmlencode.htmlDecode(cdlist.desc).replace(/<br>/g, '\n'),
desc: decodeName(cdlist.desc).replace(/<br>/g, '\n'),
author: cdlist.nickname,
play_count: this.formatPlayCount(cdlist.visitnum),
},

View File

@ -1,4 +1,6 @@
import crypto from 'crypto'
import dns from 'dns'
/**
* 获取音乐音质
@ -19,3 +21,28 @@ export const getMusicType = (info, type) => {
}
export const toMD5 = str => crypto.createHash('md5').update(str).digest('hex')
const ipMap = new Map()
export const getHostIp = hostname => {
const result = ipMap.get(hostname)
if (typeof result === 'object') return result
if (result === true) return
ipMap.set(hostname, true)
// console.log(hostname)
dns.lookup(hostname, {
// family: 4,
all: false,
}, (err, address, family) => {
if (err) return console.log(err)
// console.log(address, family)
ipMap.set(hostname, { address, family })
})
}
export const dnsLookup = (hostname, options, callback) => {
const result = getHostIp(hostname)
if (result) return callback(null, result.address, result.family)
dns.lookup(hostname, options, callback)
}

View File

@ -1,6 +1,7 @@
import { httpFetch } from '../../request'
import { requestMsg } from '../../message'
import { headers, timeout } from '../options'
import { dnsLookup } from '../utils'
const api_test = {
getMusicUrl(songInfo, type) {
@ -8,6 +9,7 @@ const api_test = {
method: 'get',
timeout,
headers,
lookup: dnsLookup,
family: 4,
})
requestObj.promise = requestObj.promise.then(({ body }) => {

View File

@ -22,13 +22,14 @@ export default {
name: '最热',
id: 'hot',
},
{
name: '最新',
id: 'new',
},
// {
// name: '最新',
// id: 'new',
// },
],
regExps: {
listDetailLink: /^.+(?:\?|&)id=(\d+)(?:&.*$|#.*$|$)/,
listDetailLink2: /^.+\/playlist\/(\d+)\/\d+\/.+$/,
},
/**
* 格式化播放数量
@ -63,9 +64,14 @@ export default {
if (tryNum > 2) return Promise.reject(new Error('try max num'))
if ((/[?&:/]/.test(id))) {
if (!this.regExps.listDetailLink.test(id)) id = await this.handleParseId(id)
if (this.regExps.listDetailLink.test(id)) {
id = id.replace(this.regExps.listDetailLink, '$1')
} else if (this.regExps.listDetailLink2.test(id)) {
id = id.replace(this.regExps.listDetailLink2, '$1')
} else {
id = await this.handleParseId(id)
}
// console.log(id)
id = id.replace(this.regExps.listDetailLink, '$1')
}
this._requestObj_listDetail = httpFetch('https://music.163.com/api/linux/forward', {
@ -186,7 +192,7 @@ export default {
}),
})
return this._requestObj_list.promise.then(({ body }) => {
// console.log(JSON.stringify(body))
// console.log(body)
if (body.code !== this.successCode) return this.getList(sortId, tagId, page, ++tryNum)
return {
list: this.filterList(body.playlists),

View File

@ -21,6 +21,7 @@ const request = (url, options, callback) => {
options.json = false
}
options.response_timeout = options.timeout
return needle.request(options.method || 'get', url, data, options, (err, resp, body) => {
if (!err) {
body = resp.body = resp.raw.toString()
@ -262,12 +263,13 @@ const fetchData = async(url, method, {
console.log('---start---', url)
headers = Object.assign({}, headers)
if (headers[bHh]) {
const path = url.replace(/^https?:\/\/[\w.:]+\//, '/')
let s = Buffer.from(bHh, 'hex').toString()
s = s.replace(s.substr(-1), '')
s = Buffer.from(s, 'base64').toString()
let v = process.versions.app.split('-')[0].split('.').map(n => n.length < 3 ? n.padStart(3, '0') : n).join('')
let v2 = process.versions.app.split('-')[1] || ''
headers[s] = !s || `${(await handleDeflateRaw(Buffer.from(JSON.stringify(`${url}${v}`.match(regx), null, 1).concat(v)).toString('base64'))).toString('hex')}&${parseInt(v)}${v2}`
headers[s] = !s || `${(await handleDeflateRaw(Buffer.from(JSON.stringify(`${path}${v}`.match(regx), null, 1).concat(v)).toString('base64'))).toString('hex')}&${parseInt(v)}${v2}`
delete headers[bHh]
}
return request(url, {

View File

@ -107,6 +107,13 @@ div(:class="$style.main")
material-checkbox(id="setting_list_showSource_enable" v-model="current_setting.list.isShowSource" :label="$t('view.setting.list_source')")
div(:class="$style.gapTop")
material-checkbox(id="setting_list_scroll_enable" v-model="current_setting.list.isSaveScrollLocation" :label="$t('view.setting.list_scroll')")
dd(:tips="$t('view.setting.basic_sourcename_title')")
h3#list_addMusicLocationType {{$t('view.setting.list_add_music_location_type')}}
div
material-checkbox(:class="$style.gapLeft" id="setting_list_add_music_location_type_top"
name="setting_list_add_music_location_type" need v-model="current_setting.list.addMusicLocationType" value="top" :label="$t('view.setting.list_add_music_location_type_top')")
material-checkbox(:class="$style.gapLeft" id="setting_list_add_music_location_type_bottom"
name="setting_list_add_music_location_type" need v-model="current_setting.list.addMusicLocationType" value="bottom" :label="$t('view.setting.list_add_music_location_type_bottom')")
//- dd(:tips="")
h3 专辑栏
div
@ -244,6 +251,8 @@ div(:class="$style.main")
| 软件的常见问题可转至
span.hover.underline(:tips="$t('view.setting.click_open')" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md')") 常见问题
p.small
strong 本软件没有客服
| 但我们整理了一些常见的使用问题
strong 仔细 仔细 仔细
| 地阅读常见问题后
p.small