Compare commits

...

1871 Commits
v1.3.0 ... beta

Author SHA1 Message Date
lyswhut
f9f0e61c5b 更新版本号(2.12.6-beta.2) 2026-09-19 00:51:18 +08:00
lyswhut
d2f5485996 新增 Windows 旧版提示功能,提醒用户升级至新版系统以提高安全性和性能 2026-09-19 00:50:49 +08:00
lyswhut
e20b2844fb 优化透明窗口边框显示效果,修复全屏模式下的相关问题 2026-09-19 00:29:30 +08:00
lyswhut
e9bc6a572b 修复打开某些 kg 歌单时歌曲丢失的问题 2026-09-16 23:27:12 +08:00
lyswhut
bb8d07274f 优化 tx 推荐歌单列表 2026-09-16 21:18:54 +08:00
lyswhut
950029884c 更新版本号(2.12.6-beta.1) 2026-09-14 21:01:01 +08:00
lyswhut
7c78e557ed 修复 win7 无法启动的问题 2026-09-14 21:00:00 +08:00
lyswhut
78eb5c48d7 更新版本号(2.12.6-beta.0) 2026-09-14 20:14:29 +08:00
lyswhut
96fd33065a 修复 win7 无法启动的问题 2026-09-14 20:05:55 +08:00
lyswhut
abcbf5fa00 发布 v2.12.5 2026-09-14 01:07:30 +08:00
lyswhut
378174c277 fix: 降级 @simonwep/pickr 和 webpack 版本,修复依赖问题 2026-09-14 00:59:43 +08:00
lyswhut
39466f157c 发布 v2.12.4 2026-09-12 20:40:02 +08:00
lyswhut
d1fa51c2bb fix: 修复主题背景图片URL构建逻辑 2026-09-12 20:38:08 +08:00
lyswhut
a0e16fc4f9 发布 v2.12.3 2026-09-12 13:04:34 +08:00
lyswhut
f64da62aa8 更新依赖&版本号(2.12.3-beta.12) 2026-09-06 14:38:42 +08:00
3gf8jv4dv
75185cb50b chore: adjust item order of language options (#2946) 2026-08-25 13:39:41 +08:00
3gf8jv4dv
bf9b34b47f fix(l10n): correct window size option text in zh-tw (#2943)
resolves https://github.com/lyswhut/lx-music-desktop/issues/2932
2026-08-23 10:05:41 +08:00
lyswhut
6573a5cc8a fix: 修正armv7l架构映射以匹配正确的值 2026-08-21 20:38:31 +08:00
lyswhut
7c3ca2a0fc fix: 修复架构映射以正确复制库文件 2026-08-21 20:33:01 +08:00
lyswhut
e8214393e9 fix: 修复构建 2026-08-21 19:48:00 +08:00
lyswhut
f4f9496fda 更新依赖&版本号(2.12.3-beta.11) 2026-08-21 19:32:41 +08:00
jtcai
c68361719d 修正tx字段拼写错误 (#2911)
* 修正部分qq歌单返回字段

* 修正tx字段total_song_sum->total_song_num

---------

Co-authored-by: jtcai <jtcai@users.noreply.github.com>
2026-08-05 00:14:05 +08:00
lyswhut
936fcb79fa 更新依赖&版本号(2.12.3-beta.10) 2026-08-05 00:09:26 +08:00
lyswhut
65ff972d1a feat: 添加版本字符常量以优化歌曲匹配机制 2026-08-04 23:57:28 +08:00
moduvoice
9ff8ae2587 feat(i18n): add Korean (ko-kr) translation (#2902)
* feat(i18n): add Korean (ko-kr) translation

Add full Korean (ko-kr) locale for the app UI, translated from the
English (en-us) source with full key parity (746/746 keys) and all
placeholders preserved. Registers the new locale in languages.json
and src/lang/index.ts, mirroring how existing locales are wired up.

* feat(i18n): add Korean tray menu strings to tray.ts

Add ko-kr entry to the tray module's messages map, matching the
existing en-us/zh-cn/zh-tw pattern with full key parity (19/19 keys):
play/pause, next/prev song, collect/uncollect, show/hide main window,
show/hide/lock/unlock/top desktop lyric window, statusbar lyric
toggle, exit, and tooltip labels.

Addresses reviewer feedback on PR #2902.
2026-07-15 09:36:41 +08:00
3gf8jv4dv
c0dd64c71c fix: use IEC units for binary sizes (#2901) 2026-07-09 09:40:19 +08:00
lyswhut
f3fbbb3720 chore: 更新版本号至 2.12.3-beta.9 2026-07-07 22:23:02 +08:00
lyswhut
5279fbba56 chore: 更新版本号至 2.12.3-beta.8 2026-07-06 21:02:49 +08:00
lyswhut
bbbbfeda12 fix: 修复歌词解析中毫秒时间的处理逻辑 2026-07-06 20:56:58 +08:00
lyswhut
75ba99d9d1 修复歌词标签解析格式没有严格按照标准的问题(#2855) 2026-07-06 20:56:58 +08:00
jtcai
af4603d87b 修正部分qq歌单返回字段 (#2899)
Co-authored-by: jtcai <jtcai@users.noreply.github.com>
2026-07-06 20:56:44 +08:00
lyswhut
1cb9e2fd29 chore: 更新版本号至 2.12.3-beta.7 2026-07-02 12:43:43 +08:00
lyswhut
d5b1b3fd5f fix: 修复在某些情况下移动歌曲时可能导致保存的顺序不对的问题(#2842) 2026-07-02 12:42:54 +08:00
lyswhut
f0776becff 更新依赖&版本号(2.12.3-beta.6) 2026-06-21 13:11:44 +08:00
lyswhut
03fea45166 降级 electron 2026-06-21 13:08:23 +08:00
ikun0014
905b2c3c42 feat: kg 源搜索改用 AndroidFilter 接口并提供 albumAudioId (#2849)
将搜索接口 platform 从 WebFilter 切换到 AndroidFilter,新接口返回
MixSongID(即 album_audio_id),用于后续歌词精确搜索。

- songmid 各处仍保持原取值(Audioid / audio_id)不变,避免影响
  既有歌曲 id 与旧收藏/列表数据
- 所有歌曲列表产出点均新增 albumAudioId 字段:
    musicSearch(MixSongID)、songList 顶层(album_audio_id)、
    songList 详情/leaderboard/musicInfo(audio_group_id / album_audio_id)
- music.d.ts 的 MusicInfoMeta_kg 增加 albumAudioId 字段,
  tools.ts 新旧格式双向转换中保留,确保持久化后不丢失

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:31:46 +08:00
ikun0014
21619e72dc fix: 再次修复 tx 源搜索偶现风控 (#2848)
* fix: 修复 tx 源搜索偶现风控

将搜索接口从移动端 DoSearchForQQMusicMobile 切换到 PC 端
DoSearchForQQMusicDesktop,更新 comm 参数与 searchid 生成方式,
并兼容新旧返回结构(music.search.SearchCgiService / req)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* update

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: lyswhut <lyswhut@qq.com>
2026-06-21 10:30:06 +08:00
啊呜
33742bca6b Win文件名中存在#特殊字符时无法正常播放 (#2862)
(cherry picked from commit 890b6ea3da)
2026-06-14 20:34:42 +08:00
lyswhut
e0575fc179 fix: 移除请求函数中的不必要的类型注释 2026-06-14 20:14:01 +08:00
lyswhut
97fe5fa496 更新依赖&版本号(2.12.3-beta.5) 2026-06-14 19:41:56 +08:00
lyswhut
97533cd4aa fix: 修复在某些情况下添加列表、歌曲时可能导致保存的顺序不对的问题(#2842) 2026-06-10 09:24:34 +08:00
lyswhut
a7672168c6 修复旧版请求函数中的重定向选项 2026-06-07 11:45:59 +08:00
lyswhut
5c46ca648d 修复某些 tx 歌单打开失败的问题 2026-06-07 11:45:59 +08:00
lyswhut
38c7bc0d0d 修复 mg 图片、歌词获取 2026-06-07 11:45:59 +08:00
ikun0014
cb2798cba9 refactor: 将QRC解密替换为纯JS实现并简化kw歌词获取 (#2845)
* 简化kw歌词获取 && kw歌词解密逻辑移动

将酷我歌词解密从主进程 native/IPC 方案迁移到渲染进程纯 JS 实现,
移除 kw_decodeLyric 主进程入口与 handle_kw_decode_lyric IPC 通道。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* tx歌词解密改用js实现

将 QRC 歌词的 3DES 解密由主进程 native 插件(qrc_decode.node)按原 C++
算法 1:1 移植为渲染进程纯 JS 实现,移除 tx_decodeLyric 主进程入口、
handle_tx_decode_lyric IPC 通道,以及 build 配置中对 qrc_decode.node
的引用与各平台预构建二进制。

注意:QRC 使用的是非标准 DES 变体(S2[23]=15、S4[53]=10,标准为
14、1),新实现已逐字节对照原 native 二进制保持一致。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* update

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: lyswhut <lyswhut@qq.com>
2026-06-07 11:14:17 +08:00
lyswhut
f0342b852b 更新版本号(2.12.3-beta.4) 2026-06-04 21:43:22 +08:00
lyswhut
97346617a5 更新版本号(2.12.3-beta.3) 2026-06-04 21:22:23 +08:00
lyswhut
ecdc018fa1 Linux 点击托盘时将显示主界面(#2840) 2026-06-04 20:54:55 +08:00
lyswhut
cbcbe3e8c8 更新版本号(2.12.3-beta.2) 2026-05-23 11:01:51 +08:00
lyswhut
b12c5ed12b 同步服务在连接时允许URL重定向 2026-05-23 11:00:21 +08:00
3gf8jv4dv
96921b255f fix(l10n): update import songlist dialog text (#2797)
refs https://github.com/lyswhut/lx-music-doc/issues/64
refs https://github.com/lyswhut/lx-music-desktop/issues/2711
2026-05-17 14:42:49 +08:00
lyswhut
2df1077ee4 更新依赖&版本号(2.12.3-beta.1) 2026-05-15 12:36:43 +08:00
lyswhut
4937ddb09c 修复某些情况下开放 API 获取到的音量为0 的问题(#2790) 2026-05-15 12:15:04 +08:00
lyswhut
4b00a06a88 优化kw歌单列表数据显示 2026-05-15 12:13:13 +08:00
lyswhut
be48e78a6f 更新依赖&版本号(2.12.3-beta.0) 2026-05-05 15:31:34 +08:00
lyswhut
b7a3663078 修复 kg 搜索结果显示问题(#2782) 2026-05-05 14:50:34 +08:00
lyswhut
9c364b482e 更新依赖 2026-05-01 13:12:19 +08:00
lyswhut
355c5e584b 修复音调调节问题 2026-05-01 13:05:57 +08:00
lyswhut
f956fd93d5 将 actions/cache 版本从 v6 降级至 v5 2026-05-01 02:28:50 +08:00
lyswhut
69e285d3ca 升级 GitHub Actions 依赖至最新版本 2026-05-01 02:26:18 +08:00
lyswhut
728fed2ed3 发布 v2.12.2 2026-05-01 01:31:36 +08:00
lyswhut
bc0d2264a3 更新依赖 2026-05-01 01:30:51 +08:00
lyswhut
ba8a6bf76c 修复音乐名称和歌手信息格式化(#2733) 2026-04-23 18:08:44 +08:00
lyswhut
2cf84a796d 更新依赖&版本号(2.12.2-beta.1) 2026-04-10 12:16:30 +08:00
lyswhut
ba62ae27af 修复 tx 偶现搜索失败的问题 2026-04-10 09:11:29 +08:00
lyswhut
e35895d752 移除 babel 2026-04-10 09:10:58 +08:00
lyswhut
cc192cab44 fix: 修复 tx 搜索结果显示异常的问题(#2753) 2026-04-09 12:47:28 +08:00
lyswhut
e36792b76a 更新依赖&版本号(2.12.2-beta.0) 2026-03-31 18:14:35 +08:00
lyswhut
61231ab99e feat: 优化搜索功能,增强歌曲匹配逻辑 2026-03-31 18:11:31 +08:00
lyswhut
ae2ee0e61e 更新依赖 2026-03-23 09:29:30 +08:00
Stanislav Chernov
a339f0fd0c fix: 音源导入去重 (#2681)
* fix: 音源导入添加去重逻辑
修复音源导入时未对重复数据进行去重的问题。现在会根据url去重,避免导入重复的音源。
Fixes lyswhut/lx-music-desktop#2649

* fix: check script content instead of name for dedup

Allow duplicate source names (intentional behavior).
Only reject import when script content is identical to an existing
source, and report which source name conflicts.
2026-03-11 14:52:52 +08:00
lyswhut
b9c3c3506e 修复桌面歌词的鼠标悬停隐藏功能,优化鼠标事件处理逻辑 2026-03-07 14:11:44 +08:00
lyswhut
44d96264fb 修复某些情况下可能出现播放歌曲没有声音的问题 (#2693) 2026-03-07 14:06:12 +08:00
derr
19eab0418a fix(mac): 修复 Mac 睡眠导致音乐播放中断的问题 (#2692)
* fix(mac): prevent sleep on mac during playback

* Remove space between async and parentheses in functions

---------

Co-authored-by: ydm <ydm@49os.com>
Co-authored-by: lyswhut <lyswhut@qq.com>
2026-03-07 13:56:55 +08:00
Little_100
0695bbaa70 修复桌面歌词的 鼠标移入歌词区域时提高透明度 设置不稳定的问题 (#2679)
Co-authored-by: lyswhut <lyswhut@qq.com>
2026-03-07 13:52:35 +08:00
lyswhut
8d6b207833 发布 v2.12.1 2026-02-16 21:11:25 +08:00
lyswhut
3371a42822 更新依赖 2026-02-16 21:03:26 +08:00
lyswhut
fe712318b8 更新依赖&版本号(2.12.1-beta.3) 2026-01-31 12:44:16 +08:00
ikun0014
593d8327b2 fix: 网易云部分歌曲无法被搜索 (#2666)
* fix: 网易云部分歌曲无法被搜索

将搜索请求由原有 eapiRequest 改为通过 httpFetch 调用 /eapi/search/song/list/page 并使用 eapi 加密表单;调整导入(使用 eapi)、移除部分注释和冗余代码。更新结果解析以兼容新响应结构(使用 item.baseInfo.simpleSongData、result.data.resources 和 result.data.totalCount 等字段),并保留原有的分页与重试逻辑。

* update

* update

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2026-01-31 12:36:28 +08:00
lyswhut
d5c54b770f 更新依赖&版本号(2.12.1-beta.2) 2026-01-01 11:58:30 +08:00
lyswhut
32a9a21be1 优化托盘图标行为:在非 Windows 系统中,点击托盘图标时不再显示主窗口 2025-12-31 09:53:47 +08:00
lyswhut
e0735f8928 更新依赖&版本号(2.12.1-beta.1) 2025-12-21 13:46:31 +08:00
lyswhut
c6dc962134 修复某些情况下搜索框的搜索按钮布局错位的问题(#2622) 2025-12-21 13:45:40 +08:00
lyswhut
e068103e4d 修复构建 2025-12-12 12:52:31 +08:00
lyswhut
6eb5ade9ea 更新依赖&版本号(2.12.1-beta.0) 2025-12-12 12:37:16 +08:00
lyswhut
c40168cacd 更新构建流程,集成 undici 库并优化请求处理 2025-12-12 12:28:04 +08:00
lyswhut
a546b75986 修复音量条在调整音量时实际音量与显示的数值不一致的问题(#2606) 2025-12-07 14:07:12 +08:00
lyswhut
8686ecfa54 更新二进制库 2025-11-29 16:31:23 +08:00
lyswhut
270c48a1dd 发布 v2.12.0 2025-11-29 16:27:28 +08:00
lyswhut
fdbec2cbac 更新说明 2025-11-29 16:26:14 +08:00
lyswhut
46049fd15c 更新版本号(2.12.0-beta.15) 2025-11-28 12:06:21 +08:00
lyswhut
a81fe6ff7f 修复MG最新评论翻页 2025-11-28 12:06:17 +08:00
lyswhut
fd4e8ecb01 更新版本号(2.12.0-beta.14) 2025-11-26 13:41:57 +08:00
lyswhut
8142e5e79e 修复MG源评论加载失败 2025-11-26 13:41:22 +08:00
lyswhut
0c71772953 修复MG源歌单加载失败 2025-11-26 13:41:22 +08:00
lyswhut
d54bc21441 更新版本号(2.12.0-beta.13) 2025-11-23 10:21:40 +08:00
lyswhut
be4bca2c15 更新字体设置,支持最多设置两种字体,并调整选择组件宽度 2025-11-23 10:20:27 +08:00
lyswhut
2bd54673de 更新依赖&版本号(2.12.0-beta.12) 2025-11-21 09:09:01 +08:00
lyswhut
4a3359f773 更新依赖 2025-11-14 18:52:51 +08:00
lyswhut
c35095f90e 修复获取歌曲图片的函数,改为直接返回图片链接 2025-11-14 18:52:51 +08:00
lyswhut
32abccd8c2 更新版本号(2.12.0-beta.11) 2025-11-02 21:21:15 +08:00
Folltoshe
5d68ca3e18 修复TX源搜索失败 (#2575)
* 修复TX源搜索失败

* 清理音乐搜索模块中的多余空行

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2025-11-02 21:19:26 +08:00
lyswhut
8efa5335b0 更新版本号(2.12.0-beta.10) 2025-10-01 13:30:12 +08:00
lyswhut
4710bb16d8 下载列表菜单新增歌曲添加弹窗(#2537) 2025-10-01 13:29:35 +08:00
lyswhut
db4f3e4e1b 更新版本号(2.12.0-beta.9) 2025-09-29 12:48:33 +08:00
lyswhut
e18272a6d7 更新依赖 2025-09-29 12:43:24 +08:00
lyswhut
85aed9ce9d 修复隐藏状态下的透明度问题,增加鼠标悬停时恢复不透明度的效果 2025-09-29 12:43:12 +08:00
lyswhut
d03f93166f 新增完整歌词相关字段和API支持 2025-09-29 12:37:22 +08:00
lyswhut
a3b1a433c6 更新版本号(2.12.0-beta.8) 2025-09-19 23:54:44 +08:00
lyswhut
608f63bc9c 临时修复桌面歌词交互时背景异常的问题 2025-09-19 23:53:45 +08:00
lyswhut
a4c118648a mac下默认不使用透明窗口 2025-09-19 23:51:00 +08:00
lyswhut
42866b8e4f 修复构建 2025-09-07 12:14:31 +08:00
lyswhut
0b7455b74f 更新依赖&版本号(2.12.0-beta.7) 2025-09-07 11:53:50 +08:00
lyswhut
eab7bc3f5f 优化歌词解析 2025-08-11 13:49:26 +08:00
lyswhut
af2623d16c 更新版本号(2.12.0-beta.6) 2025-08-10 13:46:52 +08:00
lyswhut
e683034e77 新增 Any Listen 歌词标签数据嵌入、下载、读取播放(#2485) 2025-08-10 13:42:54 +08:00
lyswhut
ffa979ddc8 更新依赖版本,优化组件逻辑 2025-08-09 18:07:16 +08:00
3gf8jv4dv
8a8c8a5699 Revise text for lyric position switching feature (#2463)
- Fix incorrect i18n key
- Revise English translation
- Revise changelog descriptions to be more accurate
2025-08-06 12:24:03 +08:00
lyswhut
2aea956fd0 更新依赖&版本号(2.12.0-beta.5) 2025-08-06 12:22:20 +08:00
lyswhut
1803517943 优化 hidden 启动参数的行为 2025-08-06 12:21:47 +08:00
lyswhut
49c8081f68 尝试修复进度为0时仍然显示下载完成的问题(#2471) 2025-08-05 12:16:24 +08:00
lyswhut
3d64ca37e7 更新版本号(2.12.0-beta.4) 2025-07-19 14:29:32 +08:00
lyswhut
ccc88745a6 降级 electron 版本至 35.3.0 2025-07-19 14:28:47 +08:00
lyswhut
0bf6dbd402 更新依赖&版本号(2.12.0-beta.3) 2025-07-19 02:16:52 +08:00
lyswhut
b9abb4ce47 新增启动参数 -hidden,在启动时将软件最小化到系统托盘(#2459) 2025-07-18 22:24:15 +08:00
lyswhut
ad0c0f37c9 新增调换翻译歌词与罗马音歌词位置设置,优化歌词显示逻辑(#2451) 2025-07-09 08:58:34 +08:00
Folltoshe
4c6257c145 更新代理配置规则,现在不启用代理时,图片、音频加载将不再走系统代理 (#2382)
* 完善代理设置

* 更新

* update

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2025-05-10 10:43:58 +08:00
lyswhut
6c5231dbff 恢复更新日志 2025-05-10 10:07:45 +08:00
lyswhut
0454bb9b3c 更新依赖&版本号(2.12.0-beta.2) 2025-05-10 01:30:48 +08:00
lyswhut
021f89da29 新增播放器声音大小、静音、播放进度控制(#2386) 2025-05-10 00:58:19 +08:00
lyswhut
2ccca633ed 优化滚动事件监听,启用 passive 选项以提升性能 2025-05-09 10:02:37 +08:00
lyswhut
fe15e025aa 更新数据库备份逻辑 2025-05-09 10:02:37 +08:00
3gf8jv4dv
9e0c416db5 Revise chinese terminology for window and font size (#2384)
addresses https://github.com/lyswhut/lx-music-mobile/issues/769
2025-05-07 21:53:24 +08:00
3gf8jv4dv
fa9b84a9c9 Revise wording of main window style options - 2 (#2379)
- Not all operating systems use rounded corners. Like Windows 10.
- Further optimize wording.
- Forgot to add line breaks to CHANGELOG :(
2025-05-06 09:15:31 +08:00
lyswhut
b3b1bd7bc8 更新版本号(2.12.0-beta.1) 2025-05-03 11:23:53 +08:00
lyswhut
91e806a619 为数据库启用 WAL 模式 2025-05-03 11:22:35 +08:00
3gf8jv4dv
6df6eefd3d Revise wording of main window style options (#2372)
- Correct typos
- Edit i18n key name
- Avoid displaying long descriptions directly
2025-05-03 11:06:28 +08:00
lyswhut
ae35d05649 修正透明窗口设置逻辑 2025-05-02 13:02:01 +08:00
lyswhut
72939db2df 更新版本号(2.12.0-beta.0) 2025-05-02 12:36:08 +08:00
lyswhut
b6f5770dc2 新增「设置 → 其他设置 → 主窗口使用软件内置的圆角及阴影」设置 2025-05-02 12:28:16 +08:00
lyswhut
c1e7faa7bf 发布 2.11.0 2025-05-01 16:55:22 +08:00
lyswhut
37a18eae9c 更新依赖 2025-05-01 16:55:14 +08:00
lyswhut
010bc5e328 修复 kg 歌单打开失败的问题 2025-04-23 09:13:45 +08:00
lyswhut
a166051781 更新版本号(2.11.0-beta.6) 2025-04-19 19:55:36 +08:00
3gf8jv4dv
c2341d6697 Disable rounded corners for lyric window (#2356)
* Disable rounded corners for lyric window

Ensure that the lyric window looks the same
on Windows 11 as it does on other systems.

Ref: https://github.com/electron/electron/issues/46468

* update

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2025-04-19 19:54:43 +08:00
lyswhut
03bba4259e 更新版本号(2.11.0-beta.5) 2025-04-19 15:35:56 +08:00
lyswhut
80844580df 更新 Electron 到 35(#2354) 2025-04-19 15:34:29 +08:00
lyswhut
a8790b9835 更新依赖 2025-04-09 09:39:34 +08:00
lyswhut
36262ff166 更新 歌曲换源 机制 2025-04-09 09:24:45 +08:00
lyswhut
98d67be9d9 歌词选择模式下的歌词调整为跟随歌词字体大小显示 2025-03-29 13:11:07 +08:00
lyswhut
131f077c3f 更新空音频输出设备提示信息 2025-03-21 09:31:47 +08:00
lyswhut
2c428ef099 减少桌面歌词窗口自动置顶刷新间隔,修复窗口被遮挡时歌词会被暂停的问题(#2320) 2025-03-21 09:15:39 +08:00
lyswhut
08887cd6ed 更新 Node.js 版本至 22 2025-03-20 13:49:37 +08:00
lyswhut
f786a29b70 更新依赖&版本号(2.11.0-beta.3) 2025-03-20 13:08:01 +08:00
lyswhut
d3f1d7f378 更新依赖&版本号(2.11.0-beta.2) 2025-03-20 12:54:54 +08:00
lyswhut
c48a31fd63 修复 kw 歌单详情打开失败和 kg 热门评论获取问题 2025-03-20 09:22:21 +08:00
lyswhut
1217f06324 修复潜在播放暂停的问题 2025-03-07 12:20:41 +08:00
lyswhut
4cc3197be8 修复构建 2025-03-04 12:04:20 +08:00
lyswhut
eb940d5968 更新依赖&版本号(2.11.0-beta.1) 2025-03-04 11:59:44 +08:00
lyswhut
6381389cac 减少歌词延迟隐藏时间 2025-03-04 11:57:08 +08:00
3gf8jv4dv
ab939e859a Improve description of seek backward/forward shortcuts (english only) (#2297)
Match the style of other shortcuts' descriptions
2025-03-04 11:56:51 +08:00
3gf8jv4dv
9bdc71c487 Fix description of transparent lyric window in desktop lyrics settings (#2296)
- Fix incorrect i18n key
- Fix the wrong description
2025-03-04 11:55:40 +08:00
lyswhut
56a4abfaff 更新版本号(2.11.0-beta.1) 2025-03-03 22:32:57 +08:00
lyswhut
769bc7f109 新增「设置 → 桌面歌词设置 → 暂停时降低歌词透明度」设置,默认启用(#2294) 2025-03-03 22:14:21 +08:00
lyswhut
a587847e41 更新版本号(2.11.0-beta.0) 2025-03-01 20:04:08 +08:00
lyswhut
bda4650de8 新增 快进/快退5秒 自定义快捷键设置(#2289) 2025-03-01 20:03:25 +08:00
lyswhut
4f0af93b72 允许拖动桌面歌词控制栏空白处移动歌词窗口(#2280) 2025-02-28 18:40:47 +08:00
lyswhut
4a656268b8 update electron to 34.3.0 2025-02-28 13:01:10 +08:00
lyswhut
2ad9d5990f 更新依赖&版本号(2.10.1-beta.4) 2025-02-22 15:37:03 +08:00
3gf8jv4dv
32585bc453 Revise License (#2273)
* Revise License

* update rtf file

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2025-02-22 15:35:48 +08:00
3gf8jv4dv
66307d4545 Refine English translation (#2259) 2025-02-22 15:33:16 +08:00
3gf8jv4dv
8b9ae2734f Update publish/changeLog.md [skip ci] (#2270) 2025-02-20 00:29:22 +08:00
3gf8jv4dv
96f9e12d93 Optimize statusbar lyrics option description (#2269)
Clarify the meaning of enabling the system tray.

ref: https://support.apple.com/guide/mac-help/mchlp1446

related: comments on https://github.com/lyswhut/lx-music-desktop/pull/1940
2025-02-17 22:58:34 +08:00
lyswhut
43c4e13c11 修复本地 FLAC 文件内嵌歌词无法读取的问题 2025-02-12 22:00:03 +08:00
3gf8jv4dv
27f6168a29 Revise description about Kugou on "Open Playlist" dialog (#2266)
Related: https://github.com/lyswhut/lx-music-desktop/issues/2246
2025-02-12 20:27:24 +08:00
lyswhut
70dbbc93f4 更新依赖&版本号(2.10.1-beta.3) 2025-02-10 18:17:45 +08:00
lyswhut
92c9808bfb 修复 Windows 下桌面歌词最小高度与宽度设置问题,允许更小的桌面歌词窗口宽度(#2244) 2025-02-10 18:17:45 +08:00
3gf8jv4dv
1f8df84b87 Fix music api management dialog layout (#2247) 2025-02-08 09:57:46 +08:00
3gf8jv4dv
271c1bcd51 Change window title to LX Music (#2248) 2025-02-08 09:57:22 +08:00
lyswhut
f830b1199a 更新依赖&版本号(2.10.1-beta.2) 2025-02-07 12:55:24 +08:00
lyswhut
b80d48aa91 修复windows下界面缩放后移动桌面歌词会改变歌词窗口大小的问题(#2244) 2025-02-07 12:54:41 +08:00
lyswhut
691d835d16 更新依赖&版本号(2.10.1-beta.1) 2025-02-04 23:26:00 +08:00
lyswhut
3ac6d0ff5f 修复 tx 歌单搜索名字、描述出现乱码的问题(#2250) 2025-02-04 23:20:51 +08:00
lyswhut
68b32a20a4 更新版本号(2.10.1-beta.0) 2025-01-28 19:50:56 +08:00
lyswhut
88e4df4388 修复 Windows 下桌面歌词最小高度设置问题(#2244) 2025-01-28 19:49:33 +08:00
lyswhut
3e13980870 发布 v2.10.0 2025-01-27 00:59:37 +08:00
lyswhut
dd23af7051 更新依赖 2025-01-27 00:57:32 +08:00
lyswhut
7d5fc6de12 更新依赖&版本号(2.10.0-beta.12) 2025-01-25 20:11:32 +08:00
lyswhut
28233fbe58 更新依赖 2025-01-25 20:11:32 +08:00
3gf8jv4dv
32a35c6706 i18n cleanup 3 (#2229) 2025-01-18 22:15:39 +08:00
3gf8jv4dv
228ddace91 Update publish/changeLog.md (#2230) 2025-01-14 14:22:24 +08:00
lyswhut
f9ffdbbce7 更新依赖&版本号(2.10.0-beta.11) 2024-12-28 13:17:38 +08:00
3gf8jv4dv
9b233683a2 i18n cleanup 2 (#2215) 2024-12-28 13:14:05 +08:00
3gf8jv4dv
ff78fb6b30 i18n cleanup (#2211)
* i18n cleanup

- A final trimming of the language. (I hope it's the last.)
- For en-US and zh-TW, some of the terms have been revised again.
- For zh-CN, some of the terms have been revised to ensure that they do
not change the habits of users.

* update

* update

* update

* Apply suggestions from lyswhut

* Apply suggestions from lyswhut

* update

* update

* update

* Apply suggestions from lyswhut
2024-12-26 23:35:42 +08:00
3gf8jv4dv
8efda6478c Update publish/changeLog.md (#2212)
* Update publish/changeLog.md

* Apply suggestions from lyswhut

* update

* update

* update

* update
2024-12-26 23:31:57 +08:00
3gf8jv4dv
851c7871e3 Disable randomize popup animation option when animation is not turned on (#2210)
This option has no real purpose if "Show switch animation" is not turned
on. So I mimicked the option about lyrics in the download settings page.
2024-12-25 23:35:14 +08:00
3gf8jv4dv
a78c78f3e5 Revise app language text (3) (#2209) 2024-12-25 00:17:46 +08:00
3gf8jv4dv
05e8442ff1 Fix change music source dialog layout (#2204)
* Fix change music source dialog layout

* Apply suggestions from lyswhut

Co-authored-by: lyswhut <lyswhut@qq.com>

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-12-24 13:53:05 +08:00
3gf8jv4dv
977b842df3 Add missing quotes to language files (#2206) 2024-12-24 09:33:37 +08:00
3gf8jv4dv
5bde54aac1 Fix edit theme dialog title logic (#2205)
* Fix edit theme dialog title logic

As you can see from the code and the actual behavior, both share the
same code whether adding or editing a theme. So why does the title show
up as "Edit Theme" no matter what? It does seem strange in a way.

This feature appears to have been added in v2.0.0, but no one seems to
have cared about the issue during the two years.

Nonetheless, when I realized this recently, I decided to fix it.
Hopefully this will make things clearer for those users who may not be
able to tell the difference.

Now, when the "Add theme" button is clicked, the dialog title will
show "Add theme". If you right-click on a user-created theme, the dialog
title will show "Edit theme".

* Apply suggestions from lyswhut

Simpler code

Co-authored-by: lyswhut <lyswhut@qq.com>

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-12-23 23:53:10 +08:00
3gf8jv4dv
0f27e3ea42 Fix duplicate songs dialog layout (#2203) 2024-12-23 23:41:31 +08:00
3gf8jv4dv
d170725f0c Add scrollbar to "open shared playlist" dialog box (#2201) 2024-12-22 23:39:05 +08:00
3gf8jv4dv
a26fcf0cd8 Fix search page UI (#2200) 2024-12-22 23:38:33 +08:00
3gf8jv4dv
18a4455511 Fix edit theme dialog layout 3 (#2199) 2024-12-22 23:37:59 +08:00
3gf8jv4dv
2ab3286d0e Add scrollbar to the Sort Songs dialog box (#2197) 2024-12-22 23:32:59 +08:00
3gf8jv4dv
d4a411ab4a Fix list update management dialog UI (#2198) 2024-12-22 01:19:45 +08:00
lyswhut
c7facb38b1 更新依赖&版本号(2.10.0-beta.10) 2024-12-22 00:09:31 +08:00
3gf8jv4dv
b7434e9eaf Revise app language text (2) (#2195) 2024-12-21 23:57:50 +08:00
3gf8jv4dv
4a174c0084 Fix edit theme dialog layout again (#2192)
* Fix edit theme dialog layout again

Ensures that the layout looks better and doesn't get out of place in the
smallest windows and largest fonts, as well as in both English and
Chinese environments.

* update

* update

* fix

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-12-21 23:52:15 +08:00
3gf8jv4dv
db8ad1e8eb Optimize theme item name display (#2189)
Co-authored-by: lyswhut <lyswhut@qq.com>
2024-12-19 00:27:06 +08:00
3gf8jv4dv
1feaac003a Revise app language text (#2187)
* Revise app language text

Some additional revisions.

* Apply suggestion from lyswhut

Co-authored-by: lyswhut <lyswhut@qq.com>

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-12-18 23:54:02 +08:00
3gf8jv4dv
c42b2fb34c Fix edit theme dialog layout (#2188)
Co-authored-by: lyswhut <lyswhut@qq.com>
2024-12-18 23:37:59 +08:00
14K
5d48fa93ba fix: 修正拼写错误 inert*insert* (#2180) 2024-12-17 19:49:19 +08:00
3gf8jv4dv
527ac04c4e Revise zh-TW language (#2174)
* Revise zh-TW language

Revise according to Taiwanese language habits

Special thanks: Fanhuaji <https://zhconvert.org/>

* update

* Apply suggestion from lyswhut
2024-12-17 19:44:48 +08:00
14K
9644163dc5 fix: 修复了当listPosition未初始化时错误的删除操作 (#2178)
* feat: 新增了 当`列表歌曲位置`未初始化时删除列表时的判断

* fix

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-12-17 17:32:49 +08:00
3gf8jv4dv
d0090abd01 Optimize sort songs dialog layout (#2176)
Slightly increased width to ensure no layout issues in various languages
2024-12-17 17:16:13 +08:00
3gf8jv4dv
918d2ad156 Fix English (#2173)
- Fix some `playlist` terms
2024-12-16 23:28:41 +08:00
3gf8jv4dv
b028fb955f Optimize options with too long descriptions in settings (#2172) 2024-12-16 09:52:55 +08:00
3gf8jv4dv
ba33d5a39b Fix i18n keys (#2170)
`setting__setting__desktop_lyric_font_weight` to
`setting__desktop_lyric_font_weight`
2024-12-15 14:45:38 +08:00
3gf8jv4dv
fd0b9c55fc Revise zh-CN language (2) (#2169)
* Revise zh-CN language (2)

* Apply suggestion from lyswhut
2024-12-15 14:36:40 +08:00
3gf8jv4dv
b28fb5c9b4 Overhaul English (#2166)
* Overhaul English

Let's go!!!

Overhaul with reference to Simplified Chinese text
and English user habits.

* Clarify `Music API` and `Song Source`

* fix
2024-12-15 14:08:11 +08:00
lyswhut
77ecd4be9b 更新依赖&版本号(2.10.0-beta.9) 2024-12-14 12:48:20 +08:00
lyswhut
6f74003e14 新增下载的歌曲按列表名分组的功能(#2145) 2024-12-14 12:48:19 +08:00
lyswhut
63b2c2fb2f 修复本地歌曲同名歌词文件调整偏移时间后,下次再播放时调整的设置未被应用的问题(#2139) 2024-12-14 12:47:59 +08:00
3gf8jv4dv
08da7a37e6 Revise zh-CN language (#2159)
* Revise zh-CN language

- Optimize text typesetting.
- Fix some typos.
- Unify some terms.

* update

* update

* update
2024-12-10 23:30:29 +08:00
3gf8jv4dv
6b87a8d91b Fix zh-TW language name (#2155)
Write it in the native language.
2024-12-08 13:48:14 +08:00
3gf8jv4dv
0f1364a8d7 Revise ISSUE_TEMPLATE [skip ci] (#2153)
* Revise ISSUE_TEMPLATE [skip ci]

- Optimize typesetting and fix links.
- Rename the template file.
  - I don't know why git shows it as deleted & new files.

* update [skip ci]

* update [skip ci]

* update [skip ci]
2024-12-08 13:47:16 +08:00
3gf8jv4dv
9dbf70780d Revise English license (#2152)
* Revise English license

Fix some terms and mistakes.

* update
2024-12-08 13:40:55 +08:00
lyswhut
58e5592c2b 修复构建 2024-12-07 16:27:12 +08:00
lyswhut
02cc842cc8 更新依赖&版本号(2.10.0-beta.8) 2024-12-07 15:59:33 +08:00
lyswhut
e962e866b3 修复 Windows 任务管理器中的进程名显示为描述的问题(#2147) 2024-12-07 15:47:48 +08:00
lyswhut
af3b30096d 移除多余逻辑 2024-12-07 15:47:48 +08:00
3gf8jv4dv
aa7ab86b62 Fix some i18n keys (#2148) 2024-12-07 15:47:00 +08:00
3gf8jv4dv
7f864a9e35 Revise repo docs [skip ci] (#2146)
* Revise repo docs [skip ci]

Fix typos, optimize typesetting and descriptions.

* update

* update

* update

* update

* update

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-12-07 15:03:43 +08:00
lyswhut
609d345443 更新依赖&版本号(2.10.0-beta.7) 2024-12-04 09:07:04 +08:00
lyswhut
426815fa50 优化换源歌曲查找 2024-12-03 17:54:16 +08:00
lyswhut
5d1b1e48d7 Windows 下改用原生窗口调整方式(#2137) 2024-12-02 00:07:00 +08:00
lyswhut
28d0412adc 更新依赖&版本号(2.10.0-beta.6) 2024-11-30 18:50:11 +08:00
lyswhut
9d070b3671 修复kg id重复导致的问题 2024-11-30 11:54:26 +08:00
lyswhut
cd423752d1 优化歌曲换源机制,提升换源正确率 2024-11-29 12:39:42 +08:00
lyswhut
1f8a0eaf67 更新依赖与更新日志 2024-11-28 08:52:39 +08:00
lyswhut
42d9fcd8b0 更新依赖&版本号(2.10.0-beta.5) 2024-11-26 18:04:06 +08:00
lyswhut
4e1510c840 更新软件默认使用的字体 2024-11-26 18:03:52 +08:00
lyswhut
7ebfd43f65 更新关于说明 2024-11-24 00:06:05 +08:00
lyswhut
41d6157116 修复歌曲检查事件清理 2024-11-23 17:41:45 +08:00
lyswhut
f9f8297fd6 优化歌曲URL检查机制 2024-11-23 17:15:05 +08:00
lyswhut
dfbe3f665a 修复构建 2024-11-23 14:49:34 +08:00
lyswhut
b36df472e5 更新更新日志 2024-11-23 14:30:27 +08:00
lyswhut
0b147f708d 更新依赖&版本号(2.10.0-beta.4) 2024-11-23 14:29:31 +08:00
lyswhut
4e3bdbcc74 添加歌曲预加载功能 2024-11-23 14:21:59 +08:00
lyswhut
0345419ef3 客户端模式的同步服务连接允许重定向 5 次(#2109) 2024-11-10 11:05:59 +08:00
lyswhut
9237dbbc18 播放本地歌曲时,将优先尝试读取本地同名字的 jpgpng 图片作为播放封面显示 2024-10-28 23:04:48 +08:00
lyswhut
68ac1b7641 更新依赖&版本号(2.10.0-beta.3) 2024-10-25 20:13:30 +08:00
lyswhut
2cfe4d29ba 更新 electron 到 v32.2.2 2024-10-25 20:12:29 +08:00
lyswhut
b436497555 添加debug日志 2024-10-25 19:56:59 +08:00
lyswhut
7ac638c52c 修复 m4a 文件歌曲内嵌歌词无法读取的问题(#2090) 2024-10-25 19:56:41 +08:00
lyswhut
f21d2bc7c7 更新readme 2024-10-19 00:25:38 +08:00
lyswhut
550917bd16 更新依赖&版本号(2.10.0-beta.2) 2024-10-17 12:38:05 +08:00
lyswhut
c1c0311586 不再缓存换源歌曲信息 2024-10-17 12:36:59 +08:00
lyswhut
489bbb6902 Open API 新增播放器播放/暂停、切歌、收藏当前播放歌曲调用,详情看开放API文档 (原始 PR #2077) 2024-10-12 09:59:04 +08:00
lyswhut
86af25bde3 Scheme URL 的播放歌曲允许更长的专辑名称 2024-09-27 21:25:46 +08:00
lyswhut
a599e0716f 支持本地同名 krc 格式歌词文件的读取(#2053) 2024-09-25 18:04:42 +08:00
lyswhut
30fc818771 更新依赖&版本号(2.10.0-beta.1) 2024-09-24 18:49:46 +08:00
lyswhut
df08f677bd 优化播放详情页UI,歌曲名字、歌手等文字过长时被截断的问题(#2049) 2024-09-24 18:47:40 +08:00
lyswhut
7247bcad1b 修正搜索歌曲提示框文案(#2050) 2024-09-24 18:40:32 +08:00
lyswhut
c0bcac25ea fix build 2024-09-21 14:10:33 +08:00
lyswhut
ae06019bdb 更新依赖&版本号(2.10.0-beta.0) 2024-09-21 14:01:59 +08:00
lyswhut
432861780a 修复获取自定义环境音效预设列表逻辑问题 2024-09-21 12:45:04 +08:00
lyswhut
111ee88833 更新依赖 2024-09-06 09:44:30 +08:00
lyswhut
487ee7015e 修复歌单详情页内歌单名字过长时的UI显示问题(#2028) 2024-09-04 13:04:41 +08:00
lyswhut
061cc16c27 新增托盘图标颜色 跟随系统亮暗模式 设置,可以在 设置-其他 启用 (#2016) 2024-08-30 20:21:18 +08:00
lyswhut
af8d9dff2d 更新检查连接链接顺序 2024-08-24 13:39:27 +08:00
lyswhut
cb16bd0324 发布 v2.9.0 2024-08-24 12:57:27 +08:00
lyswhut
acf8171617 npm audit fix 2024-08-24 12:56:59 +08:00
lyswhut
da7429f03e 将下载歌曲的歌手信息中的分隔符从 替换为 ; 以确保音乐元数据在写入时的兼容性和一致性(#1989 @qnnp-me) 2024-08-24 12:51:09 +08:00
lyswhut
4a121db39d 更新 better-sqlite3 11.2.1 二进制文件 2024-08-24 12:28:50 +08:00
lyswhut
0e8e287fe2 update actions cache dir 2024-08-23 21:22:31 +08:00
lyswhut
cf942121dd 更新依赖&版本号(2.9.0-beta.12) 2024-08-23 20:07:09 +08:00
lyswhut
77c2e962ec 优化本地歌曲内嵌封面过大时的加载方式 2024-08-23 20:06:17 +08:00
lyswhut
05f5cc4fe8 更新依赖&版本号(2.9.0-beta.11) 2024-08-18 13:14:01 +08:00
lyswhut
684f09feaf 修复列表数据同步问题 2024-08-18 10:10:38 +08:00
lyswhut
38bea3ced1 优化换源机制 2024-08-17 20:30:07 +08:00
lyswhut
6a6f9a53bd 更新依赖&版本号(2.9.0-beta.10) 2024-08-17 13:45:33 +08:00
lyswhut
584c12e60f 新增 我的列表-换源播放 功能 2024-08-17 13:44:11 +08:00
lyswhut
bb5b667613 更新版本号(2.9.0-beta.9) 2024-08-11 11:24:25 +08:00
lyswhut
0628d3533f 新增设置-下载设置-同时下载任务数设置(#1498) 2024-08-10 14:31:35 +08:00
lyswhut
e1bd4c9a0a 更新依赖&版本号(2.9.0-beta.8) 2024-08-10 10:27:05 +08:00
lyswhut
85c9ec38db 新增鼠标在音量按钮使用滚轮时可以调整音量大小的功能(#2000) 2024-08-10 10:18:27 +08:00
lyswhut
6ff7cfde11 优化某些UI的字体可能出现被截断的问题 2024-08-04 11:33:44 +08:00
lyswhut
c52034f992 更新版本号(2.9.0-beta.7) 2024-08-04 10:49:41 +08:00
lyswhut
b982dd90e4 修复程序目录路径存在 #% 时,自定义源、托盘等图标异常的问题(#1997) 2024-08-04 10:48:31 +08:00
lyswhut
80e36688e8 更新依赖 2024-08-03 12:26:53 +08:00
lyswhut
c6c1071d2d 优化添加不喜欢歌曲时的提示文案 2024-08-02 12:32:20 +08:00
lyswhut
481817c607 更新依赖&版本号(2.9.0-beta.6) 2024-07-27 17:23:02 +08:00
lyswhut
2e5739f042 Revert "优化代码"
This reverts commit 72d44ec783.
2024-07-27 17:21:09 +08:00
lyswhut
0bb9f5ece5 更新依赖&版本号(2.9.0-beta.5) 2024-07-26 18:55:59 +08:00
lyswhut
d454f51993 新增设置-播放详情页设置-延迟歌词滚动设置(#1985) 2024-07-26 18:52:27 +08:00
lyswhut
7f3ab31ad5 尝试修复某些情况下播放音频时,处于播放状态但是进度条不走的问题 2024-07-26 18:50:45 +08:00
lyswhut
98fe433819 更新依赖&版本号(2.9.0-beta.4) 2024-07-24 19:32:39 +08:00
lyswhut
4b01326420 更新依赖 2024-07-20 13:11:35 +08:00
lyswhut
3a4acd2693 更新依赖&版本号(2.9.0-beta.3) 2024-07-16 19:06:16 +08:00
lyswhut
b8e9937083 托盘图标添加当前播放歌曲名字显示 2024-07-15 19:42:51 +08:00
lyswhut
72d44ec783 优化代码 2024-07-11 18:52:48 +08:00
lyswhut
680b60cb07 更新依赖&版本号(2.9.0-beta.2) 2024-07-04 19:49:39 +08:00
lyswhut
45527b320d 修复开发模式下 vue devtools 扩展没有加载的问题 2024-07-04 19:41:49 +08:00
lyswhut
0acc9a553e 优化侧栏图标显示,修复图标可能被裁切的问题(#1960) 2024-06-26 19:21:55 +08:00
lyswhut
19f81cf379 优化代码 2024-06-19 19:25:21 +08:00
lyswhut
96ddbdf0f0 更新依赖&版本号(2.9.0-beta.1) 2024-06-19 12:40:04 +08:00
lyswhut
9eb87911a6 修复界面不可见时状态栏歌词没有更新的问题 2024-06-19 12:39:44 +08:00
lyswhut
b0881726fa 更新依赖&版本号(2.9.0-beta.0) 2024-06-18 19:33:46 +08:00
lyswhut
308248d8ec 新增 是否将歌词显示在状态栏 设置,默认关闭,该功能只在 MacOS 下可用(#1940) 2024-06-18 19:30:54 +08:00
lyswhut
de5ea4f0aa 修复切换音源时可能出现切换死循环的问题 2024-06-17 12:37:26 +08:00
lyswhut
305ce6ff11 更新依赖&版本号(2.8.1-beta.3) 2024-06-11 19:47:40 +08:00
lyswhut
bd4dbb55e4 现在如果在设置或者启动参数配置了代理服务,那么应用内的图片、音频加载,歌曲下载也将走代理 2024-06-11 19:41:10 +08:00
lyswhut
1fefb2bcaf 更新 electron 到 v29.4.2 2024-06-11 14:09:31 +08:00
3gf8jv4dv
e094e80ecf Some fixes to lang files (#1935)
* `Closure` -> `Close`

* Fix `player__sound_effect_features_tip`
2024-06-10 22:44:00 +08:00
lyswhut
9715db1229 更新版本号(2.8.1-beta.2) 2024-06-04 18:44:46 +08:00
lyswhut
3c0daa2bf1 修复 OpenAPI 的 lyricLineAllText 在切换到无歌词的音乐时内容没有更新的问题(#1925) 2024-06-04 18:42:52 +08:00
lyswhut
435fec2f1c 更新版本号(2.8.1-beta.1) 2024-06-03 18:30:26 +08:00
lyswhut
69ba619f24 修复 MacOS 下点击 dock 右键菜单的退出按钮时,程序没有退出的问题(#1923) 2024-06-03 18:29:54 +08:00
lyswhut
b7bb21f091 更新版本号(2.8.1-beta.0) 2024-06-03 12:50:19 +08:00
lyswhut
77f51a3e9f 修复 MacOS 下点击 dock 右键菜单的退出按钮时,程序没有退出的问题(#1923) 2024-06-03 12:49:26 +08:00
lyswhut
7799e511e8 修复构建 2024-06-01 14:15:35 +08:00
lyswhut
416f4a4dee 发布v2.8.0 2024-06-01 12:01:33 +08:00
lyswhut
2fd5158839 更新依赖 2024-06-01 11:45:27 +08:00
lyswhut
b8287acff3 更新导入歌单的id生成方式 2024-05-25 19:54:46 +08:00
lyswhut
53b470ed09 更新ci npm缓存设置 2024-05-18 18:55:41 +08:00
lyswhut
8a20b773fb fix code 2024-05-17 09:55:02 +08:00
lyswhut
aa576fe7db 修复依赖关系 2024-05-17 09:41:45 +08:00
lyswhut
582321c1ae 更新版本号(2.8.0-beta.5) 2024-05-16 19:23:37 +08:00
lyswhut
541f5041fb 更新依赖 2024-05-16 19:23:00 +08:00
lyswhut
d16babefbe 修复翻页按钮栏切页按钮只显示前几页的问题 2024-05-15 13:21:26 +08:00
lyswhut
4ac6768b7a 修复潜在自定义源切换问题 2024-05-14 19:28:24 +08:00
lyswhut
97d3d3c616 添加媒体输出设备检测提示 2024-05-14 19:27:55 +08:00
lyswhut
2ee7572634 Scheme URL API新增 music/searchPlay 支持(#1886) 2024-05-14 09:58:07 +08:00
lyswhut
8e7fd1ecef 更新版本号(2.8.0-beta.4) 2024-05-03 18:54:47 +08:00
lyswhut
6b4e6533f5 修复文本提示气泡在内容过长时,文本未被换行而被截断的问题 2024-05-03 18:52:39 +08:00
lyswhut
b680a89033 修复歌曲时文件名过长导致歌曲无法下载的问题(#1877) 2024-05-03 18:49:48 +08:00
lyswhut
ee6a6f4b94 默认禁用 使用设备能处理的最大声道数输出音频 设置,修复高级音频API与自定义音频输出设备功能冲突的提示显示 2024-05-02 14:13:16 +08:00
lyswhut
6933baafca 修复事件监听潜在问题 2024-05-02 13:03:02 +08:00
lyswhut
0f3a6782b8 修复与优化繁体中文、英语翻译显示(#1845) 2024-05-02 12:56:41 +08:00
lyswhut
f99cc021f8 更新版本号(2.8.0-beta.3) 2024-05-02 12:41:28 +08:00
lyswhut
e4de4b8c1b 新增 设置-播放设置-使用设备能处理的最大声道数输出音频 设置(#1873) 2024-05-02 12:33:07 +08:00
lyswhut
793b5a679c 修复播放详情页的歌词无法使用触碰拖动的问题(#1865) 2024-05-01 17:58:36 +08:00
筱莱Ceale
1b75cf822d 开放API支持跨域请求 (#1872)
* 增加 Access-Control-Allow-Origin: *

* 完善

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-05-01 17:57:47 +08:00
lyswhut
60604020c7 更新版本号(2.8.0-beta.2) 2024-04-28 21:19:58 +08:00
lyswhut
09780d02e3 修复Mac下即使开启了托盘, cmd+w 仍会中断播放的问题(#1844) 2024-04-28 18:59:09 +08:00
lyswhut
4760f79ab5 修正描述,统一在线导入音源大小限制 2024-04-28 18:57:22 +08:00
zclorne
05363a0d22 fix #731 #887,修复桌面歌词与主窗口阴影残留 (#1869)
* fix #731

* fix #887

* Revert "在歌词滚动结束后清理窗口阴影,缓解Mac下桌面歌词出现残留阴影的问题"

This reverts commit 1f6a6bbb39.

* update

* fix

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-04-28 18:53:04 +08:00
lyswhut
49797f891c 修复构建 2024-04-27 15:40:14 +08:00
lyswhut
9d38fe6764 更新版本号(2.8.0-beta.1) 2024-04-27 15:07:52 +08:00
lyswhut
f340b18408 允许添加 m4agoa 格式的本地歌曲到列表中(#1864) 2024-04-27 15:06:27 +08:00
lyswhut
358c449b17 修正文案 2024-04-25 18:58:07 +08:00
lyswhut
1f6a6bbb39 在歌词滚动结束后清理窗口阴影,缓解Mac下桌面歌词出现残留阴影的问题 2024-04-24 18:51:53 +08:00
lyswhut
10028cf500 增大在线导入自定义源文件的大小限制问题(#1857) 2024-04-23 19:24:37 +08:00
lyswhut
a977458881 暂时固定ci node版本 2024-04-17 00:44:15 +08:00
lyswhut
dc811d8b84 更新版本号(2.8.0-beta.0) 2024-04-16 18:52:15 +08:00
lyswhut
5bc119bd9d 修复win7下的电源锁清理问题 2024-04-16 18:37:35 +08:00
lyswhut
9016796497 优化托盘图标显示(#1842) 2024-04-16 18:13:52 +08:00
lyswhut
32f47aaa34 开放API 添加歌词翻译字段 2024-04-16 16:18:07 +08:00
lyswhut
c54b38a068 修复存在多级弹窗时的背景显示问题 2024-04-16 11:25:21 +08:00
lyswhut
a9a708d0f6 更新描述 2024-04-15 20:22:21 +08:00
NKXingXh
ab3f118588 允许设置其他优先播放的歌曲音质 (#1839)
* 在线播放更高音质

* 修改对应翻译

* 设置-播放设置-优先播放320k音质选项改为“优先播放的音质”

* 修复拼写

* 优化

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-04-15 19:46:28 +08:00
lyswhut
87852acb14 发布v2.7.0 2024-04-14 16:43:14 +08:00
lyswhut
65ab26365d 拒绝在CI环境使用不干净的工作区构建应用 2024-04-13 18:59:42 +08:00
lyswhut
e7630e98d9 修复工作区不干净的问题 2024-04-13 18:46:36 +08:00
lyswhut
9779c1ebee 更新版本号(2.7.0-beta.7) 2024-04-13 18:11:37 +08:00
lyswhut
9cef7e3370 添加当前软件版本所对应的代码提交版本、提交时间的显示 2024-04-13 18:08:45 +08:00
lyswhut
b6bc545e7d 更新默认设置 2024-04-13 12:08:32 +08:00
lyswhut
85326be7bb 更新依赖&版本号(2.7.0-beta.6) 2024-04-11 13:22:28 +08:00
lyswhut
75750ad38d 修复封面链接事件在封面链接相同时仍然触发的问题 2024-04-11 13:07:54 +08:00
lyswhut
0522114c5d 修复切歌时的状态栏进度条显示问题 2024-04-11 12:42:58 +08:00
lyswhut
6300236cdb 更新依赖 2024-04-10 11:42:09 +08:00
lyswhut
1dbb950b3c 修复开发模式启动问题 2024-04-08 19:25:48 +08:00
lyswhut
bfd2ecd26c 更新electron到28.2.10,修复开发模式重启electron进程时偶现旧进程残留的问题 2024-04-05 13:10:45 +08:00
lyswhut
e60c2f5f19 修复注册的事件未被清理的问题 2024-04-02 11:07:50 +08:00
lyswhut
274f71615f 更新依赖&版本号(2.7.0-beta.5) 2024-04-01 22:49:00 +08:00
lyswhut
cd7d5ed665 添加开发API允许局域网访问选项(#1828) 2024-04-01 22:44:34 +08:00
lyswhut
703327ed41 添加SSE订阅字段过滤参数 2024-03-30 12:20:12 +08:00
lyswhut
a7ce24c84b 更新版本号(2.7.0-beta.4) 2024-03-29 18:22:21 +08:00
lyswhut
c3c42e33ee 添加SSE支持 2024-03-29 18:22:08 +08:00
lyswhut
530ace6b81 添加播放速率 2024-03-29 16:48:25 +08:00
lyswhut
5345b001e8 修复http服务关闭时没有断开所有连接的问题 2024-03-29 16:38:07 +08:00
lyswhut
07c9e2f675 更新依赖&版本号(2.7.0-beta.3) 2024-03-29 15:59:04 +08:00
lyswhut
7a08cb5ddd 托盘菜单新增播放、切歌、收藏控制 2024-03-29 15:59:00 +08:00
lyswhut
9c0ae12959 新增HTTP开放API服务 2024-03-29 14:43:32 +08:00
lyswhut
1e03791e82 更新依赖 2024-03-23 21:55:50 +08:00
lyswhut
d92e34949c 更新依赖&版本号(2.7.0-beta.2) 2024-03-17 16:34:39 +08:00
lyswhut
c8423c0b4f 移除未使用的网络代理设置用户名、密码设置 2024-03-14 18:23:54 +08:00
lyswhut
2c1b4acfcc 修复网络代理设置没有对自定义源的网络请求生效的问题(#1814) 2024-03-14 18:23:47 +08:00
lyswhut
b14883c9af 新增在线自定义源导入功能,允许通过http/https链接导入自定义源 2024-03-12 14:33:21 +08:00
lyswhut
53245e9e4f 更新依赖 2024-03-11 21:58:02 +08:00
lyswhut
45fc8c77b6 优化本地歌曲换源匹配机制 2024-03-08 11:54:00 +08:00
lyswhut
9d8fe4be06 托盘菜单添加多语言支持(#1802) 2024-03-03 19:20:20 +08:00
lyswhut
03781ea692 修复kg最新评论无法获取的问题(@helloplhm-qwq) 2024-03-02 15:04:05 +08:00
lyswhut
3c28c4861b 修复构建问题 2024-03-01 15:18:25 +08:00
lyswhut
0c986ee68c 更新依赖&版本号(2.7.0-beta.0) 2024-03-01 15:08:46 +08:00
lyswhut
17d45d7406 主题编辑器添加“深色字体”选项(#1799) 2024-03-01 14:56:12 +08:00
lyswhut
07ed408129 修复更新超时弹窗在非更新阶段意外弹出的问题(#1797) 2024-02-29 12:06:06 +08:00
lyswhut
c001803d71 主题设置默认折叠其他主题以优化进入设置界面时的性能 2024-02-20 22:57:19 +08:00
lyswhut
4ce54ea395 更新运行项目nodejs版本要求 2024-02-19 12:09:51 +08:00
梓澄qwq
2039431735 update (#1791)
- 支持kw排行榜显示大小
- 支持某些kg逐行歌词
- 修复mg歌单搜索
2024-02-19 12:08:21 +08:00
SamLukeYes
15c9207542 修复 Linux 端 hostnamectl 命令不可用时无法与手机端同步的问题 (#1784)
* Don't fail to sync without hostnamectl

* update

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-02-15 00:00:14 +08:00
lyswhut
79d8d79b9d 更新依赖&版本号 2024-02-14 11:13:25 +08:00
lyswhut
806925333f 修复mg歌词在某些情况下获取失败的问题(#1783) 2024-02-14 10:52:03 +08:00
lyswhut
2e196656ba 更新 electron 到 v27.3.1 2024-02-06 11:09:53 +08:00
lyswhut
55204df130 加长自定义源返回的歌词长度 2024-02-06 10:38:24 +08:00
lyswhut
627c50910c 修复某些情况下歌曲加载时间过长时不会自动跳到下一首的问题 2024-02-04 18:05:08 +08:00
lyswhut
959e11b77c 发布v2.6.0 2024-02-01 12:44:58 +08:00
lyswhut
6cc9da338b 更新版本号(2.6.0-beta.10) 2024-01-30 20:17:11 +08:00
lyswhut
1cd93344dd 自定义源新增支持local源的musicUrlpiclyric的获取操作 2024-01-30 19:25:01 +08:00
lyswhut
7893814da4 优化自定义源调用处理逻辑 2024-01-30 17:40:23 +08:00
lyswhut
da2d3237b6 简化自定义源名称显示 2024-01-30 12:33:25 +08:00
lyswhut
431b04a011 添加创建同名列表时的二次确认(#1621) 2024-01-30 12:33:25 +08:00
lyswhut
f13c6f0153 更新action依赖版本 2024-01-30 12:33:25 +08:00
梓澄qwq
160693f608 fix: migu search (#1761) 2024-01-30 12:14:48 +08:00
lyswhut
b127a1e98c 修复封面图片嵌入后没有被删除的问题 2024-01-26 16:14:25 +08:00
lyswhut
b0a9cd70ac 更新 sqlite3 预编译文件 2024-01-26 16:06:40 +08:00
lyswhut
5955831809 更新依赖&版本号(2.6.0-beta.9) 2024-01-26 15:44:22 +08:00
lyswhut
b13f10d624 新增播放歌曲时阻止电脑休眠(#1563) 2024-01-22 12:42:46 +08:00
lyswhut
47635c95e1 添加对下载歌曲时封面图片大小的控制处理(#1609) 2024-01-22 12:35:34 +08:00
lyswhut
c238d49584 修复潜在自定义源切换问题 2024-01-22 12:35:34 +08:00
lyswhut
2ff6455231 更新依赖 2024-01-22 12:35:34 +08:00
lyswhut
110db561a9 修复最小化后再隐藏窗口时,托盘菜单的显示主界面功能异常的问题 2024-01-22 12:35:34 +08:00
lyswhut
61013e9d2d 修复临时列表变更会意外触发同步的问题 2024-01-22 12:35:34 +08:00
lyswhut
2de6d1c5f1 更新版本号(2.6.0-beta.8) 2024-01-07 19:11:46 +08:00
lyswhut
991e453881 降级vue修复某些情况下切换界面时出现空白的问题 2024-01-07 19:11:06 +08:00
lyswhut
edcf501a22 更新依赖 2024-01-06 20:26:30 +08:00
lyswhut
1fc5cf0aa5 不再丢弃酷我某些带翻译歌词 2024-01-06 20:14:56 +08:00
lyswhut
ce072ae9d3 不再丢弃大部分带翻译的酷我歌词 2024-01-01 19:46:31 +08:00
lyswhut
a811b1da1a 更新依赖&版本号(2.6.0-beta.7) 2023-12-30 14:20:31 +08:00
lyswhut
1de087eac7 优化任务下载状态显示 2023-12-30 12:31:18 +08:00
lyswhut
2337a3e8a3 修复本地歌曲歌词获取问题 2023-12-28 14:53:12 +08:00
lyswhut
1637ae4d17 修复构建顺序导致的更新信息被覆盖的问题 2023-12-25 14:28:16 +08:00
lyswhut
f46a08fe89 更新依赖&更新版本号(2.6.0-beta.6) 2023-12-23 18:20:16 +08:00
lyswhut
2c0d2c4497 优化黑色主题颜色计算 2023-12-17 21:50:12 +08:00
lyswhut
f75eeb07be 改进本地音乐在线信息的匹配机制 2023-12-14 20:43:43 +08:00
lyswhut
965a1d03ba 修复下载模块在数据写入速度较慢的情况下出现任务及文件异常的问题 2023-12-13 01:19:17 +08:00
lyswhut
12f947ed2e 注释调试代码 2023-12-12 14:33:09 +08:00
lyswhut
97d684fde1 修复构建 2023-12-12 14:20:39 +08:00
lyswhut
75c1069251 修复构建 2023-12-12 14:14:35 +08:00
lyswhut
050b641d79 更新依赖&版本号(2.6.0-beta.5) 2023-12-12 14:00:22 +08:00
lyswhut
e9539b5c5c 添加对wy源某些歌曲有问题的歌词进行修复 2023-12-12 13:44:12 +08:00
lyswhut
6fc5a47970 优化搜索框交互逻辑 2023-12-12 13:25:25 +08:00
lyswhut
11317154f6 优化GitHub actions工作流 2023-12-11 11:31:57 +08:00
lyswhut
98b4abfa19 为播放详情页歌词选择界面添加全选快捷键支持 2023-12-08 16:34:33 +08:00
lyswhut
f40f019d2e 禁止默认的全选行为 2023-12-08 16:34:28 +08:00
lyswhut
42109ce000 更新依赖&版本号(2.6.0-beta.4) 2023-12-08 11:52:02 +08:00
lyswhut
a38df1280b 修复歌单分类标签列表无法打开的问题 2023-12-08 11:45:29 +08:00
lyswhut
e19002caca 构建阶段压缩代码、外置map 2023-12-08 11:13:22 +08:00
lyswhut
b67d99e5a5 修复 MacOS 平台在 Finder 打开文件或目录时应用卡死的问题(#1684) 2023-12-08 10:47:41 +08:00
lyswhut
15942a7b96 优化窗口控制按钮聚焦效果显示时机 2023-12-05 13:06:48 +08:00
lyswhut
cac2d0e050 优化列表全选机制,修复列表未获得焦点时仍然可以全选的问题 2023-12-05 11:14:44 +08:00
lyswhut
7d504f9231 添加win7_x64架构的安装版安装包构建 2023-12-05 10:43:14 +08:00
lyswhut
c0f78b023f 显示源版本号信息 2023-12-04 13:35:21 +08:00
lyswhut
3803ab045c 更新版本号(2.6.0-beta.3) 2023-12-04 12:36:13 +08:00
lyswhut
bee2790af3 切换到简易的 store 实现 2023-12-04 12:34:12 +08:00
lyswhut
182a3076fc 更新依赖 2023-12-03 15:34:37 +08:00
lyswhut
a9bcb71afe 隐藏源描述 2023-12-03 15:34:32 +08:00
lyswhut
4f5baa1ac8 添加超时 2023-12-03 15:06:04 +08:00
lyswhut
323743e426 更新依赖(v2.6.0-beta.2) 2023-11-25 12:31:45 +08:00
lyswhut
3ba51fd6fe 自定义源列显示源版本号、作者名字,优化自定义源脚本数据存储 2023-11-25 12:19:36 +08:00
lyswhut
ff98e06afa 关闭mac下的圆角 2023-11-25 10:29:06 +08:00
lyswhut
6f22c73d99 fix code 2023-11-22 12:59:30 +08:00
lyswhut
87bd27f814 更新依赖 2023-11-22 12:47:55 +08:00
lyswhut
3e7db5617b 修复亮暗主题自动切换功能无效的问题(#1697) 2023-11-22 12:20:15 +08:00
lyswhut
1712e466d5 更新翻译 2023-11-13 13:59:58 +08:00
梓澄
abf49529d6 fix: kg源在海外无法搜索 (#1686) 2023-11-11 13:59:48 +08:00
lyswhut
3e31a78af1 修复win构建 2023-11-11 13:20:58 +08:00
lyswhut
41fc46c8b5 修复构建 2023-11-11 12:56:07 +08:00
lyswhut
db8cfec7ad 更新依赖 2023-11-10 15:08:06 +08:00
lyswhut
66376daad4 优化移除源时的行为 2023-11-09 10:54:57 +08:00
lyswhut
182f08d221 优化 2023-11-09 00:19:07 +08:00
lyswhut
887cf39321 修复错误处理问题 2023-11-08 15:27:36 +08:00
lyswhut
e2f6ec308c 更新依赖 2023-11-08 13:43:08 +08:00
lyswhut
b1f2a27eac 自定义源变更 2023-11-07 22:18:56 +08:00
lyswhut
0c6cedf879 更新依赖 2023-10-25 14:22:41 +08:00
lyswhut
1ff6a00653 移除所有内置源 2023-10-18 19:46:05 +08:00
lyswhut
016821a8ce 更新依赖 2023-10-17 18:14:49 +08:00
lyswhut
a786ae24e9 Windows、MacOS平台下的字体列表取消使用原生方式获取(#1596) 2023-10-07 11:17:04 +08:00
lyswhut
799b768367 修复备份文件无法导入json格式的问题 2023-10-05 14:45:37 +08:00
lyswhut
24610f9c0a 更新依赖 2023-10-05 14:45:27 +08:00
lyswhut
172307d53b 更新许可协议的排版,使其看起来更加清晰明了 2023-10-05 14:45:15 +08:00
lyswhut
d7816729d0 优化代码逻辑 2023-10-03 15:10:54 +08:00
lyswhut
ac7daa70f7 添加win arm 7z构建 2023-09-28 13:15:14 +08:00
lyswhut
0372f0647b 更新正式版构建流程 2023-09-28 12:54:00 +08:00
lyswhut
60f98ac438 发布v2.5.0 2023-09-28 12:02:32 +08:00
lyswhut
6d76814aed 更新依赖 2023-09-28 11:56:01 +08:00
lyswhut
2cf5bb689f 修复点击搜索、排行榜等在线列表歌曲右键菜单歌曲详情页会意外将该歌曲添加不喜欢的问题 2023-09-21 13:19:55 +08:00
lyswhut
e18c295ca6 更新版本号 2023-09-20 13:54:48 +08:00
lyswhut
58346d6fc9 优化不喜欢编辑框滚动条显示 2023-09-20 13:53:34 +08:00
lyswhut
5364b7a09b 通过歌曲菜单添加不喜欢歌曲时需要二次确认防止手抖 2023-09-20 13:41:25 +08:00
lyswhut
52630aa735 修复更换语言设置后源名称未更新的问题 2023-09-20 12:23:48 +08:00
lyswhut
89255a8c84 修复dev模式运行问题 2023-09-20 12:22:27 +08:00
lyswhut
6d5cc38235 更新构建设置 2023-09-20 11:09:11 +08:00
lyswhut
c4234ddcff 更新版本号 2023-09-17 14:06:51 +08:00
lyswhut
7a9872d42f 更新依赖 2023-09-17 14:00:49 +08:00
lyswhut
f5165d517c 修复音频输出设备设置在重启软件后被重置的问题(#1568) 2023-09-17 13:56:10 +08:00
lyswhut
0b125e29b5 新增Scheme URL对播放器的控制操作 2023-09-14 17:19:13 +08:00
lyswhut
aabd6d8985 更新依赖 2023-09-14 11:04:58 +08:00
lyswhut
94dccae48a 添加换源超时定时器 2023-09-12 12:52:31 +08:00
lyswhut
74ef112d57 修复同步数据字段顺序不一致的问题 2023-09-10 16:10:51 +08:00
lyswhut
0da63c6ef0 发布v2.4.1 2023-09-09 16:04:01 +08:00
lyswhut
3c145c7dd7 修复 v2.4.0 的默认数据库版本号不对导致无法启动问题 2023-09-09 15:52:51 +08:00
lyswhut
63590119bb 发布v2.4.0 2023-09-09 12:16:16 +08:00
lyswhut
7845d65119 修改code lint时机 2023-09-08 22:16:43 +08:00
lyswhut
2454738224 更新版本号 2023-09-06 21:58:08 +08:00
lyswhut
3685cb8868 修复潜在同步问题 2023-09-06 21:50:58 +08:00
lyswhut
fcffcb5b59 更新同步协商流程 2023-09-06 16:01:23 +08:00
lyswhut
19049fb890 修复信息更新问题 2023-09-06 12:21:12 +08:00
lyswhut
50950cc9d2 更新版本号 2023-09-06 12:02:38 +08:00
lyswhut
b1f9e525ab 新增同步功能对“不喜欢歌曲”列表的同步 2023-09-05 23:11:09 +08:00
lyswhut
fc03cd77fc 移除日志 2023-09-05 13:28:50 +08:00
lyswhut
9a3434b02e 新增设置-播放设置-点击相同列表内的歌曲切歌时是否清空已播放列表 2023-09-05 12:50:16 +08:00
lyswhut
eab5e51f66 修复潜在问题 2023-09-05 12:14:25 +08:00
lyswhut
ff6b7cbec2 更新better-sqlite3 2023-09-05 00:29:43 +08:00
lyswhut
abe62d84ed 修复同步功能列表元数据合并问题 2023-09-04 22:55:36 +08:00
lyswhut
1aa9627e4a 去重 2023-09-04 18:04:54 +08:00
lyswhut
8bbe549b0c 优化 2023-09-04 14:21:08 +08:00
lyswhut
baf69e397a 新增“不喜欢歌曲”功能&新增“收藏歌曲”、“取消收藏”、“不喜欢该歌曲”快捷键设置 2023-09-04 14:13:47 +08:00
lyswhut
3ca8f09971 优化歌词滚动 2023-09-03 18:08:10 +08:00
lyswhut
3381ad0e0e 修正事件名字 2023-09-03 17:29:43 +08:00
lyswhut
150342f699 单曲循环模式不应对“稍后播放”的歌曲有效 2023-09-03 00:58:31 +08:00
lyswhut
44830752f7 更新依赖 2023-09-02 13:50:09 +08:00
lyswhut
5e7ef691ae 优化歌词在短时间内快速播放时的滚动效果 2023-09-02 13:39:46 +08:00
lyswhut
ed858bafdc 修复kg无评论时的加载处理问题 2023-09-02 13:33:44 +08:00
lyswhut
2fff8652ca lint code 2023-08-30 14:30:47 +08:00
lyswhut
358142c1cc 更新新版本获取地址 2023-08-30 13:01:27 +08:00
lyswhut
903ca18b75 修改code lint的执行时机 2023-08-29 17:52:24 +08:00
lyswhut
6a91d3eec2 更新版本号 2023-08-29 17:50:22 +08:00
lyswhut
0d5e880fb2 优化同步服务逻辑 2023-08-29 17:46:16 +08:00
lyswhut
03f322f92a 优化桌面歌词在开启 缩放当前播放的歌词 并关闭 延迟歌词滚动 时的歌词滚动位置计算问题 2023-08-29 17:45:48 +08:00
lyswhut
5cf2acfff2 修复同步问题 2023-08-29 16:10:26 +08:00
lyswhut
7d17423e4b 新增数据同步服务端模式已认证设备列表管理 2023-08-29 15:40:42 +08:00
lyswhut
5d877d81e3 修复潜在问题 2023-08-29 12:32:31 +08:00
lyswhut
a968410431 添加连接超时处理 2023-08-28 16:04:58 +08:00
lyswhut
c6f4bfa875 修改同步逻辑 2023-08-28 13:39:23 +08:00
lyswhut
71b84fb10d lint code 2023-08-27 15:09:07 +08:00
lyswhut
0d76c9ccb4 重构同步服务端功能部分代码,使其更易扩展新功能 2023-08-25 19:13:50 +08:00
lyswhut
70815e276e 更新依赖 2023-08-21 20:18:24 +08:00
lyswhut
72fe8f3af1 修复潜在同步问题 2023-08-21 13:57:36 +08:00
lyswhut
53bc50d05c Revert vite build 2023-08-17 17:49:47 +08:00
lyswhut
99eb2856f7 更新版本号 2023-08-15 15:52:41 +08:00
lyswhut
616135ac14 修复某些UI显示异常的问题 2023-08-15 15:51:32 +08:00
lyswhut
5ca490d233 修正描述错误 2023-08-14 16:06:43 +08:00
lyswhut
1c159f59bb 优化同步逻辑 2023-08-14 15:33:59 +08:00
lyswhut
4ad9c81381 点击打开歌单弹窗背景将不再自动关闭弹窗 2023-08-11 22:22:37 +08:00
lyswhut
d11eaec7d5 opm 2023-08-11 14:30:01 +08:00
lyswhut
a02748d518 更新依赖 2023-08-11 14:21:59 +08:00
lyswhut
0ab2940347 修复本地文件解析异常时的错误处理问题 2023-08-11 14:17:17 +08:00
lyswhut
fc2585eb95 更新说明 2023-08-11 13:40:09 +08:00
lyswhut
c2789312ba 修复首句歌词被提前播放的问题 2023-08-11 13:28:29 +08:00
lyswhut
e1646a3127 修复windows平台下隐藏窗口后再显示时任务栏按钮丢失的问题 2023-08-10 21:08:16 +08:00
lyswhut
0fc1de9f29 移除日志输出 2023-08-09 14:37:54 +08:00
lyswhut
7c5969e580 修补依赖以使vite恢复构建 2023-08-09 14:37:48 +08:00
lyswhut
e719999d8a 移除多余代码 2023-08-08 20:05:22 +08:00
lyswhut
59ea4e4b44 修复构建 2023-08-07 18:56:26 +08:00
lyswhut
df52e8ede9 更新版本号 2023-08-07 18:50:35 +08:00
lyswhut
028bf5919d 从webpack迁移到vite 2023-08-07 18:49:14 +08:00
彭狸花喵
31e16a7ed7 优化kg评论区at显示 (#1515)
* 优化kg评论区at显示

* lint code

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2023-08-07 18:36:13 +08:00
lyswhut
aa6696dfcc 修复tx排行榜、歌单列表歌曲名称显示 2023-08-04 16:25:58 +08:00
彭狸花喵
838355a5e9 修复KGMusic歌单歌曲无扩展信息 & 修复QQMusic搜索歌曲无扩展信息 (#1509)
* fix: QQMusic搜索歌曲扩展信息

* 修复KGMusic调用musicInfo时无括号中数据

* 修复KGMusic歌单歌曲括号中信息

* 修复

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2023-08-03 20:30:48 +08:00
lyswhut
f87962f1a0 修复图片显示问题 2023-08-02 20:09:45 +08:00
lyswhut
8e4158d11d 更新默认设置 2023-08-01 11:35:15 +08:00
lyswhut
60f8f10bb5 过滤翻译歌词或罗马音歌词中只有“//”的行(#1499) 2023-07-30 14:45:35 +08:00
lyswhut
de5e1d7274 更新依赖 2023-07-30 12:32:20 +08:00
lyswhut
cfe78fc387 减少歌词定时器调用阈值 2023-07-30 12:32:12 +08:00
lyswhut
2a8bfac2c5 更新依赖 2023-07-25 15:49:11 +08:00
lyswhut
3c5c684641 优化音效设置-环境音效启用、禁用时的操作效果显示 2023-07-25 15:37:23 +08:00
lyswhut
c757ac8517 修复音效文件被意外重复打包的问题 2023-07-24 14:58:55 +08:00
lyswhut
2597ab4ea1 修复某些tx源歌词因数据异常解析失败的问题 2023-07-23 19:57:36 +08:00
Folltoshe
783799b2a4 更新酷我评论区带图消息 (#1471)
* 更新酷我评论区带图消息

* 移除多余代码

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2023-07-21 12:31:23 +08:00
lyswhut
87aec33833 添加说明 2023-07-19 12:04:35 +08:00
lyswhut
06087cd853 修复kw音质列表数据 2023-07-19 12:03:20 +08:00
lyswhut
afaef43017 更新依赖 2023-07-18 19:04:25 +08:00
lyswhut
e7f3f27104 修复搜索框在某些情况下输入内容后搜索时会自动清空的问题(#1472) 2023-07-18 18:39:12 +08:00
lyswhut
6c0e11eebc 添加说明 2023-07-14 15:11:10 +08:00
lyswhut
809752e4ec 修复若路径存在 # 字符时,软件无法启动的问题(#1461) 2023-07-14 15:01:05 +08:00
lyswhut
54f6255fe4 更新依赖 2023-07-11 15:18:08 +08:00
brstlig
d97a27307c 增加列表中歌曲随机乱序排列,修复专辑名排序无效bug (#1440)
* Update zh-cn.json

* Update ListSortModal.vue

* Add files via upload

* Update ListSortModal.vue

修复无法按专辑名排序bug,因变量名不一致导致

* 完善&优化

* 添加更新日志

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2023-07-11 15:04:13 +08:00
Folltoshe
6423066cb2 修复kw搜索联想词 (#1452)
* 修复kw搜索联想词

* 完善

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2023-07-07 23:54:32 +08:00
lyswhut
e8d8feb042 更新依赖 2023-07-04 21:34:18 +08:00
lyswhut
816caa6415 修复字体设置某些字体无法应用的问题 2023-07-04 19:47:19 +08:00
Folltoshe
a11d123815 修复歌曲排序时默认列表名称显示错误 (#1439) 2023-07-01 10:24:39 +08:00
lyswhut
c24d1d1e41 发布v2.3.0 2023-06-29 23:48:02 +08:00
lyswhut
1b2daef90c 更新依赖 2023-06-29 23:30:01 +08:00
lyswhut
6284fd8024 更新依赖 2023-06-27 18:58:51 +08:00
lyswhut
763874ac55 更新依赖 2023-06-26 10:53:46 +08:00
lyswhut
4defaa103e 修复linux arm64下无法启动的问题 2023-06-23 10:28:48 +08:00
Folltoshe
181ac937d2 修复mg歌单搜索 (#1414) 2023-06-21 12:30:06 +08:00
lyswhut
f6884524e2 更新依赖 2023-06-21 12:16:06 +08:00
lyswhut
23f118fb1a 过滤嵌入、下载的翻译、罗马音歌词时间标签(#1358) 2023-06-21 11:59:38 +08:00
lyswhut
a3b8f31b1e 修复tx翻译歌词解析丢失的问题 2023-06-21 10:58:04 +08:00
lyswhut
c6fb2232d0 修复mg歌单搜索歌单播放数量显示问题 2023-06-17 20:05:03 +08:00
lyswhut
ef411ddb47 更新依赖 2023-06-16 11:23:11 +08:00
lyswhut
7aed2828bb 修复添加单首歌曲弹窗列表创建按钮无法取消的问题 2023-06-16 11:23:08 +08:00
lyswhut
560445a518 添加提示 2023-06-14 11:46:50 +08:00
Folltoshe
3549ed2da0 修复wy热门评论显示 (#1411) 2023-06-14 11:25:10 +08:00
lyswhut
ec9f86c450 修复构建 2023-06-10 23:44:42 +08:00
lyswhut
c6e829be4f 更新依赖 2023-06-10 20:40:22 +08:00
lyswhut
5ef84916bb 修复初始化列表信息可能导致崩溃的问题 2023-06-10 20:34:25 +08:00
Folltoshe
94403be9a8 预留歌手API (#1407)
* 更新歌手API

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
Co-authored-by: 彭狸花喵 <helloplhm-qwq@outlook.com>
2023-06-10 20:33:21 +08:00
lyswhut
6403b8ce38 code lint 2023-06-09 09:55:54 +08:00
lyswhut
3f34fa26bf 更新依赖 2023-06-09 09:46:35 +08:00
彭狸花喵
b1a6c6b59c 更新kg最新评论接口(cmtlist->newest) & kg源歌手相关 (#1405)
* 修复wy源热搜词失效

* 更新kg最新评论接口(cmtlist->newest) & kg源歌手相关

---------

Co-authored-by: Folltoshe <folltoshe@foxmail.com>
2023-06-09 09:45:01 +08:00
lyswhut
76981a59d4 更新默认设置 2023-06-08 09:57:15 +08:00
Folltoshe
d93fbd699d 修复wy源热搜词 (#1403)
* 修复wy源热搜词失效

* 添加更新日志

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2023-06-08 09:50:16 +08:00
lyswhut
fd2dca0769 移除桌面歌词窗口透明边距 2023-06-05 23:12:43 +08:00
lyswhut
5097102ca1 修复Deepin 20下启用桌面歌词时可能会导致桌面卡死的问题 2023-06-05 22:36:00 +08:00
lyswhut
fa3fd8d8a4 Windows、MacOS平台下的字体列表改用原生方式获取 2023-06-05 15:05:03 +08:00
lyswhut
5582e78315 更新版本号 2023-06-04 13:13:02 +08:00
lyswhut
b7fd32067f 优化升降调性能占用 2023-06-04 12:53:46 +08:00
彭狸花喵
2a2fdc57bd 修复tx热门评论昵称被错误切割的问题 (#1397)
* 修复tx热门评论昵称被错误切割的问题

* fix

---------

Co-authored-by: Folltoshe <folltoshe@foxmail.com>
2023-06-04 12:14:34 +08:00
lyswhut
025739e35c 优化&更新依赖 2023-06-02 12:27:41 +08:00
lyswhut
c8f6153831 移除升降调预设 2023-06-01 14:35:46 +08:00
lyswhut
3c02e3dddc 更新版本号 2023-05-31 21:41:22 +08:00
lyswhut
40997c34ff 添加音调升降调节 2023-05-31 21:40:25 +08:00
lyswhut
677c3f16e4 播放速率设置面板新增是否音调补偿设置 2023-05-31 20:26:19 +08:00
lyswhut
0adb4f5ae5 修复改变播放速率时会导致歌词报错的问题 2023-05-31 09:07:35 +08:00
lyswhut
cbbcf914ad 更新依赖 2023-05-30 14:43:44 +08:00
lyswhut
d68a29a5a2 更新依赖 2023-05-25 14:30:20 +08:00
lyswhut
368eeed0d0 修复不同数据类型的列表id合并问题 2023-05-23 14:33:36 +08:00
lyswhut
a522b78496 更新依赖 2023-05-23 11:56:54 +08:00
lyswhut
dab81116e9 修复播放某些在线音频会没有声音的问题 2023-05-22 15:37:28 +08:00
lyswhut
b7f355bd1a 更新翻译 2023-05-21 10:34:56 +08:00
lyswhut
dbeaebaee3 更新版本号 2023-05-19 22:06:48 +08:00
lyswhut
fe94a1eac9 更新依赖,code lint 2023-05-19 22:01:18 +08:00
lyswhut
bd5107bbaf 修复下载时出现302错误的问题 2023-05-18 16:16:58 +08:00
lyswhut
8018d9b418 修复因插入数字类型的ID导致其意外在末尾追加 .0 导致列表数据异常的问题 2023-05-18 15:22:45 +08:00
lyswhut
0454d300ec 修改code判断方式 2023-05-16 17:35:42 +08:00
lyswhut
1e5c9ebc91 更新默认主题设置 2023-05-15 10:33:15 +08:00
lyswhut
5c7e9728e6 修复列表名翻译显示 2023-05-13 12:39:25 +08:00
lyswhut
da4be33a04 添加上限设置 2023-05-12 20:13:35 +08:00
lyswhut
47e2a5a460 更新依赖 2023-05-08 18:07:26 +08:00
lyswhut
04337ef4b8 添加音效用户预设 2023-05-08 18:04:04 +08:00
lyswhut
df58c8eb80 添加强行构建环境变量参数 2023-05-06 16:36:33 +08:00
lyswhut
b0bf1bf4be 添加繁忙重试重试 2023-05-05 19:01:57 +08:00
lyswhut
1a3d84d4c4 更新版本号 2023-05-04 19:15:52 +08:00
lyswhut
735f629ca1 添加更多环境混响音效 2023-05-04 19:14:00 +08:00
lyswhut
9dc927b50b 修复名称显示 2023-05-04 19:13:48 +08:00
lyswhut
47a336eb64 修复 2023-05-03 18:16:53 +08:00
lyswhut
33b66aaea0 改名 2023-05-03 17:56:32 +08:00
lyswhut
7b9eefdf2d 新增音效设置 2023-05-03 17:45:43 +08:00
lyswhut
ea5e8b56dd 发布v2.2.2 2023-05-01 17:44:11 +08:00
lyswhut
e52fff4d0e 修复添加歌曲弹窗默认列表名字显示问题 2023-05-01 16:15:39 +08:00
lyswhut
8d108509c9 修改默认设置 2023-05-01 16:04:41 +08:00
lyswhut
d3cc630501 更新版本号 2023-05-01 15:32:59 +08:00
lyswhut
e74f297f9e 修复在低版本Linux amd64系统上无法启动的问题 2023-05-01 14:55:35 +08:00
lyswhut
8be9c75734 修改安装依赖的命令 2023-05-01 12:27:46 +08:00
lyswhut
851851a7e6 更新 2023-05-01 11:47:34 +08:00
lyswhut
1cbe46dc3b 发布v2.2.1 2023-05-01 11:13:24 +08:00
lyswhut
675a943d59 更新依赖 2023-04-29 15:19:57 +08:00
Folltoshe
908815def3 更新音源API (#1352)
* 更新API

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2023-04-29 15:09:17 +08:00
lyswhut
200ca1eeda 移除多余翻译 2023-04-29 14:16:38 +08:00
Folltoshe
b81cc139b3 优化UI (#1353)
* 优化UI

* 更新

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2023-04-29 13:10:56 +08:00
lyswhut
f8ae906326 支持wy热门评论翻页 2023-04-28 19:49:53 +08:00
lyswhut
e6f55804f4 更新依赖 2023-04-27 14:04:01 +08:00
lyswhut
1432a19d7d 更新版本号 2023-04-24 13:13:10 +08:00
lyswhut
74fbfb130c 修复歌单加载 2023-04-24 13:05:11 +08:00
lyswhut
3cf45f602f 修复对存在错误时间标签的歌词的解析 2023-04-22 18:32:49 +08:00
lyswhut
7a9dcc71fd 更新导航栏样式 2023-04-20 23:35:57 +08:00
lyswhut
fb5249a979 修复 2023-04-16 15:02:30 +08:00
lyswhut
3f694b75f8 修复列表加载问题 2023-04-16 14:52:22 +08:00
彭狸花喵
0e1ee66dd6 更新kg获取歌单gid接口 & 修复歌单介绍显示 (#1328) 2023-04-16 13:28:55 +08:00
lyswhut
920e002247 优化搜索框背景配色,使其适应高透明主题 2023-04-15 18:22:54 +08:00
Folltoshe
ab0b352d36 修复tx热门评论回复图片显示异常 (#1326) 2023-04-15 17:59:52 +08:00
lyswhut
aa4b08a156 更新依赖 2023-04-14 19:46:05 +08:00
lyswhut
66514908d2 更新版本号 2023-04-13 15:07:47 +08:00
lyswhut
60f0801a7c 修复评论图片显示问题 2023-04-13 15:07:33 +08:00
lyswhut
7149d0d43f 优化更新弹窗弹出时机 2023-04-13 14:34:18 +08:00
Folltoshe
d970687ebe 音源API更新 & 其他改动 (#1295)
## API

### kg源

- 增加歌单歌曲flac24bit显示
- 修复酷狗码只能导入500首的问题
- 更新排行榜

### mg源

- 修复搜索不显示时长的问题
- 修复评论加载失败的问题
- 更新排行榜

### tx源

- 增加热门评论图片显示
- 更新排行榜

### wy源

- 更新排行榜

## 其他

- 添加自定义源zlib模块的支持

---------

Co-authored-by: 彭狸花喵 <94218819+helloplhm-qwq@users.noreply.github.com>
Co-authored-by: lyswhut <lyswhut@qq.com>
2023-04-13 14:32:59 +08:00
lyswhut
d0425fc0d6 更新版本号 2023-04-09 15:36:52 +08:00
lyswhut
bdd5b46708 更新依赖 2023-04-09 15:35:00 +08:00
lyswhut
6d949d7e4d 更新依赖 2023-03-31 20:12:14 +08:00
lyswhut
5d72d092fc 优化&修复同步机制 2023-03-30 17:46:37 +08:00
lyswhut
667fc8c8a6 修复缺失的翻译 2023-03-30 17:45:58 +08:00
lyswhut
f7a2d9fd06 启用桌面歌词时,取消对歌词窗口的聚焦(#1273) 2023-03-29 12:49:30 +08:00
lyswhut
85946efd0b 修复启用全局快捷键时与Media Session注册冲突的问题 2023-03-27 19:57:31 +08:00
lyswhut
f6a853bfe9 发布v2.2.0 2023-03-26 12:14:30 +08:00
lyswhut
4bfbdeb9a5 添加搜索重试 2023-03-26 12:00:29 +08:00
lyswhut
1e53508d67 修复聚合搜索跳转到最后一页后由于列表是空的导致翻页组件隐藏的问题(#1217) 2023-03-26 12:00:20 +08:00
lyswhut
b8fca59cbb 更新依赖 2023-03-25 10:34:41 +08:00
lyswhut
9ada6fe4a7 更新默认设置 2023-03-25 10:04:07 +08:00
lyswhut
b1593a2053 播放速率的粒度调整为0.01,范围0.6-2.0x 2023-03-25 10:04:07 +08:00
彭狸花喵
22a5125a11 修复一个拼写错误导致kg搜索AlbumID为undefined的问题 (#1255) 2023-03-25 10:03:32 +08:00
lyswhut
dfd9a0019b 更新版号 2023-03-23 17:34:01 +08:00
lyswhut
e1d81c199b 更新文案 2023-03-23 17:32:15 +08:00
lyswhut
e8f574ee9c 修复潜在问题 2023-03-23 17:31:59 +08:00
lyswhut
472af1bca6 更新版本号 2023-03-21 17:56:04 +08:00
lyswhut
671346bcdd 修复连续选择时的初始选择歌曲位置被意外改变的问题 2023-03-20 16:33:18 +08:00
lyswhut
9132abb3fe 移除动画预热 2023-03-18 11:13:04 +08:00
lyswhut
1c681e9f82 修复标签显示 2023-03-17 14:50:07 +08:00
lyswhut
19286ef99d 更新依赖 2023-03-17 14:40:56 +08:00
lyswhut
37ad2f522a 更新日志 2023-03-15 17:47:16 +08:00
lyswhut
1e1aa65fc0 新增设置-其他-列表数据清理功能 2023-03-15 17:44:20 +08:00
lyswhut
ec6e067938 新增设置-桌面歌词设置-重置窗口设置功能 2023-03-15 17:44:20 +08:00
Folltoshe
ea515fdd85 增加kg排行榜flac24bit显示 (#1238)
* 增加kg排行榜flac24bit显示
---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2023-03-15 17:42:40 +08:00
lyswhut
c11c202248 更新版本号 2023-03-12 14:13:15 +08:00
lyswhut
1cfee31483 修复企鹅歌单列表歌单名字不显示的问题 2023-03-12 14:12:06 +08:00
lyswhut
00a5aa01c7 更新依赖 2023-03-12 11:31:25 +08:00
lyswhut
fc61cf16ed 修复快照被意外删除的问题 2023-03-09 16:53:35 +08:00
lyswhut
0684e29098 更新字段获取 2023-03-07 16:44:09 +08:00
lyswhut
66d29293cd 更新说明 2023-03-05 20:04:18 +08:00
lyswhut
e9fd657852 优化tx歌单打开 2023-03-05 18:29:57 +08:00
lyswhut
bd7f51358c 更新版本号 2023-03-05 17:34:30 +08:00
lyswhut
371b8fad05 kg源数据更新 (#1232)
* kg源评论接口更新,热门评论完整支持
* kg搜索HiRes支持
---------

Co-authored-by: 彭狸花喵 <94218819+helloplhm-qwq@users.noreply.github.com>
2023-03-05 17:27:17 +08:00
lyswhut
fe259747dc 音量、播放模式等设置弹出式按钮在鼠标移到按钮上时将自动弹出设置内容 2023-03-05 14:30:15 +08:00
lyswhut
d4d94ddbee 修复tx源某些歌单因为歌曲信息缺失导致打开失败的问题 2023-03-04 21:39:08 +08:00
lyswhut
f62d773246 更新依赖 2023-03-04 17:48:13 +08:00
lyswhut
20294233e6 快捷键调整音量时每次加减2%音量改为4% 2023-03-04 16:26:39 +08:00
lyswhut
cb4ab411f9 新增全屏时自动关闭歌词设置 2023-03-04 16:10:34 +08:00
lyswhut
7f008d1f9c 优化自动重连 2023-03-04 13:22:08 +08:00
lyswhut
fe0487c3f9 更新版本号 2023-03-02 17:44:48 +08:00
lyswhut
a54e810af1 修复新设备同步时快照key没有被保存导致的下次同步仍然需要选择同步模式的问题 2023-03-01 22:46:24 +08:00
lyswhut
5cc1f20fac 更新依赖 2023-03-01 18:51:17 +08:00
lyswhut
da804e1f69 更新名字 2023-03-01 18:47:18 +08:00
lyswhut
3399333360 完善同步 2023-03-01 18:44:51 +08:00
lyswhut
e75ab3a7d7 更新版本号 2023-02-28 18:29:42 +08:00
lyswhut
3b70acc3ca 重构数据同步功能,新增客户端模式 2023-02-28 18:01:56 +08:00
lyswhut
b42092884e 支持wy源flac hires歌曲类型的显示 2023-02-26 17:20:05 +08:00
lyswhut
fea2db0e29 修复使用酷狗码无法打开某些类型的歌单的问题 2023-02-26 16:58:27 +08:00
lyswhut
fe7bc924da 修复记住播放进度的情况下,使用Scheme URL打开应用播放的歌曲进度没有被重置的问题 2023-02-22 15:43:45 +08:00
lyswhut
60b357e6f9 修复同步连接的处理问题 2023-02-22 14:44:34 +08:00
lyswhut
5544a469c4 优化wy翻译、罗马音歌词解析 2023-02-19 17:12:19 +08:00
lyswhut
067ca91c4d 发布v2.1.2 2023-02-18 19:57:55 +08:00
lyswhut
afd8d692fd 发布v2.1.1 2023-02-18 19:14:01 +08:00
lyswhut
a9a8fa2857 发布v2.1.0 2023-02-18 13:50:31 +08:00
lyswhut
4b3a624ed9 更新electron到22.3.0 2023-02-17 23:10:16 +08:00
lyswhut
549ea19c26 移除不需要的代码 2023-02-15 09:12:55 +08:00
lyswhut
c0515c9c4f 修复去重列表移除歌曲后列表没有刷新的问题 2023-02-10 21:06:09 +08:00
lyswhut
e81d594d01 修复重启后歌词快进不生效的问题 2023-02-10 19:44:00 +08:00
lyswhut
3d469a4986 更新依赖 2023-02-10 18:07:19 +08:00
lyswhut
b91bd7ede0 修复竖向桌面歌词无法加粗的问题 2023-02-10 13:09:18 +08:00
lyswhut
6048af99bc 添加下载失败信息状态 2023-02-10 08:58:24 +08:00
lyswhut
ef9427122e 新增是否加粗扩展歌词设置 2023-02-09 17:52:58 +08:00
lyswhut
02402f5207 新增设置-下载设置-是否嵌入翻译歌词、罗马音歌词设置 2023-02-09 17:52:23 +08:00
lyswhut
80197ee18c 降级glibc版本编译 2023-02-08 20:23:39 +08:00
lyswhut
8989b05a69 更新版本号 2023-02-08 18:28:30 +08:00
lyswhut
f809782559 新增播放速率调整功能 2023-02-08 18:27:35 +08:00
lyswhut
9522e975a0 修复API初始化失败的问题 2023-02-08 18:07:00 +08:00
lyswhut
8854fb69d8 更新native module 2023-02-08 18:06:31 +08:00
lyswhut
10bd75ea7b 更新Electron到v22.2.0 2023-02-08 00:27:31 +08:00
lyswhut
f33ffb55a7 修复 2023-02-08 00:11:00 +08:00
lyswhut
3bff44da0c 防止桌面歌词窗口在屏幕分辨率变小时,窗口位置跟随分辨率变化的问题 2023-02-07 11:56:19 +08:00
lyswhut
cf960e3695 添加启动时的数据库表及表结构完整性校验 2023-02-06 17:33:21 +08:00
lyswhut
c8eac2690f 修复某些kg歌单链接无法打开的问题 2023-02-06 14:21:16 +08:00
lyswhut
8af458e61a 更新版本号 2023-02-05 20:41:33 +08:00
lyswhut
07899327f1 新增是否在更新版本的首次启动时显示更新日志弹窗设置 2023-02-05 20:40:30 +08:00
lyswhut
dd5bffe071 为所有文本输入框添加右键快速粘贴的功能 2023-02-05 15:32:11 +08:00
lyswhut
83000b75ca 添加忽略二次提示 2023-02-05 13:38:25 +08:00
lyswhut
e6c3815493 完善歌词获取流程 2023-02-05 13:28:43 +08:00
lyswhut
32626ef773 完善lib替换 2023-02-04 18:56:47 +08:00
lyswhut
ab1d18debe 添加x源逐字歌词的支持 2023-02-04 18:38:06 +08:00
lyswhut
62330571a3 更新版号 2023-02-03 19:42:07 +08:00
lyswhut
a8827c361c 优化 2023-02-03 19:41:34 +08:00
lyswhut
4635481c77 修改列表响应式更新机制,尝试修复偶现的删除歌曲列表未更新的问题 2023-02-03 19:41:22 +08:00
lyswhut
c6f9e421c1 更新版本号 2023-02-03 01:23:10 +08:00
lyswhut
448e1cd0c3 修复较旧Linux arm64系统下无法启动软件的问题 2023-02-03 01:00:31 +08:00
lyswhut
5ee7c5a319 优化 2023-02-02 14:10:05 +08:00
lyswhut
89625188f1 更新版本号 2023-02-01 17:30:54 +08:00
lyswhut
fdd19068a8 fix 2023-02-01 16:50:13 +08:00
lyswhut
ef7033cac0 调整了桌面歌词在启用滚动到顶部时的距离 2023-02-01 16:23:41 +08:00
lyswhut
65840e45cd 优化 2023-02-01 14:12:52 +08:00
lyswhut
6075f413dc lint fix 2023-02-01 12:50:52 +08:00
lyswhut
ba3b2f613a 修复更新日志弹窗显示 2023-02-01 12:50:38 +08:00
lyswhut
165832e703 完善支持wy歌词获取 2023-02-01 11:24:58 +08:00
lyswhut
7e27ec488b 添加wy源逐字歌词的支持 2023-01-31 23:40:25 +08:00
lyswhut
4e3356ccb2 更新依赖 2023-01-31 18:35:34 +08:00
lyswhut
6b69cdf12f 优化版本更新操作 2023-01-31 17:48:38 +08:00
lyswhut
c24b29a42c 新增桌面歌词设置字体加粗设置&优化歌词字体显示 2023-01-30 17:48:47 +08:00
lyswhut
c013d19530 修复播放下载列表的歌曲时,调整歌词偏移时间功能异常的问题 2023-01-25 20:14:49 +08:00
lyswhut
5a1e1864d9 修正错别字 2023-01-18 22:31:10 +08:00
lyswhut
7c56b2fce2 发布v2.0.5 2023-01-18 22:14:29 +08:00
lyswhut
7266352ca0 修复字母被截取的问题 2023-01-18 21:41:42 +08:00
lyswhut
c1cff1e3c2 修复macOS下的软件系统菜单中的退出功能不会完全退出软件的问题(#1148) 2023-01-18 17:25:51 +08:00
lyswhut
c003efe1e9 fix type 2023-01-18 15:57:06 +08:00
lyswhut
68d847aca5 修复随机播放模式下使用稍后播放功能播放我的列表的歌曲时,切换下一曲永远是当前歌曲的问题(#1147) 2023-01-18 15:56:05 +08:00
lyswhut
82bea640c4 重写桌面歌词窗口坐标的计算逻辑 2023-01-18 15:43:26 +08:00
lyswhut
4fa88dd7a0 修复声音输出设备更改时后的自动暂停播放设置无效的问题 2023-01-18 14:04:04 +08:00
lyswhut
900bdd3afe 发布v2.0.4 2023-01-15 15:15:00 +08:00
lyswhut
8dff457422 优化虚拟列表 2023-01-14 16:48:20 +08:00
lyswhut
850a429243 优化代码逻辑,修复潜在播放问题 2023-01-14 16:03:56 +08:00
lyswhut
d3c8f16aed 更新依赖 2023-01-14 00:50:43 +08:00
lyswhut
a43e127dd0 修复备份与恢复的列表导入列表信息设置逻辑问题与潜在问题 2023-01-14 00:50:29 +08:00
lyswhut
84e52f5525 修复Linux armv7l系统(如树莓派)下无法启动的问题 2023-01-14 00:06:04 +08:00
lyswhut
1dce2c1f7a 更新 2023-01-12 14:08:28 +08:00
lyswhut
1c802ad5f5 fix type 2023-01-11 16:47:57 +08:00
lyswhut
db38db9256 修复桌面歌词启用歌词缩放后的阴影显示问题;就放桌面歌词在启用卡拉OK歌词后字体边缘可能被截断的问题 2023-01-11 13:08:28 +08:00
lyswhut
cb9fa62dac 修复从搜索界面进入歌单详情后,若启用强迫症设置的清空功能会导致意外清空搜索框、搜索列表的问题 2023-01-11 10:53:17 +08:00
lyswhut
9cc36e2a6a 优化临时播放逻辑 2023-01-11 09:28:31 +08:00
lyswhut
bf310adc12 fix type 2023-01-11 08:33:13 +08:00
lyswhut
7273b6ad67 修复备份文件导入指引无法识别v2配置的问题 2023-01-11 08:32:49 +08:00
lyswhut
a02f9e1151 发布v2.0.3 2023-01-08 13:25:39 +08:00
lyswhut
6ef8015179 修复歌词阴影问题 2023-01-07 18:59:44 +08:00
lyswhut
db38b27e52 修复桌面歌词开启不允许换行后出现字体截断的问题(#1106) 2023-01-07 15:59:30 +08:00
lyswhut
cccb5b191d 修复修改播放设置-音频输出设置后,所做的更改没有被保存的问题(#1116) 2023-01-07 15:17:07 +08:00
lyswhut
3c589743b1 更新版本号 2023-01-06 17:47:21 +08:00
lyswhut
65270e02da 优化定时停止 2023-01-06 14:49:09 +08:00
lyswhut
27c1bf8eb6 eslint 2023-01-06 14:39:44 +08:00
lyswhut
1db54195f5 修复禁用切歌时歌曲播放完毕后的歌曲信息显示问题 2023-01-06 14:39:08 +08:00
lyswhut
399208429d 修复暂停按钮图标显示 2023-01-06 14:35:52 +08:00
lyswhut
b40e57f191 修复某些情况下歌词的滚动问题 2023-01-06 14:22:17 +08:00
lyswhut
be350e49f0 更新版本号 2023-01-05 19:04:50 +08:00
lyswhut
bae732016c 修复桌面歌词使用斜体出现截断的问题(#1106) 2023-01-05 18:49:50 +08:00
lyswhut
e50a67f0e4 点击打开歌单弹窗背景可以关闭弹窗(#1096) 2023-01-05 18:49:08 +08:00
lyswhut
26e8e0a1b1 修复Linux arm64系统下无法启动的问题(#1102) 2023-01-05 18:47:27 +08:00
lyswhut
c8210e0516 修复初始设置的桌面歌词窗口没有完全居右下角的问题 2023-01-05 11:57:44 +08:00
lyswhut
95590dd07f 修复列表备份文件存在异常歌曲信息时无法导入的问题 2023-01-02 18:35:42 +08:00
lyswhut
7e94e96bcc 优化迁移 2023-01-02 17:57:01 +08:00
lyswhut
5009494e89 发布v2.0.2 2023-01-02 17:52:40 +08:00
lyswhut
e58c2f86aa 修复无效的歌曲信息导致我的列表数据迁移失败的问题(#1095) 2023-01-02 17:52:19 +08:00
lyswhut
fcea542def 发布v2.0.1 2023-01-02 16:41:25 +08:00
lyswhut
44407585fa 合并sql语句 2023-01-02 13:40:46 +08:00
lyswhut
3d93d88bf0 发布v2.0.0 2023-01-01 14:21:26 +08:00
lyswhut
8a49e32d2a 优化 2023-01-01 14:16:29 +08:00
lyswhut
8bbc4a3c4a 修复输入框字体不跟随设置的问题 2022-12-30 18:37:08 +08:00
lyswhut
3a9dbbb577 完善同步 2022-12-30 17:06:03 +08:00
lyswhut
5f11fa65b4 修复列表覆盖问题 2022-12-30 16:07:59 +08:00
lyswhut
6f4129d317 更新依赖 2022-12-30 15:21:16 +08:00
lyswhut
e2a1d7b99d 新增下载目录存在同名的文件时跳过下载此任务设置 2022-12-30 14:00:49 +08:00
lyswhut
18b6f73008 导入备份时过滤歌曲 2022-12-30 13:24:37 +08:00
lyswhut
c16de232ad 完善同步 2022-12-30 13:16:40 +08:00
lyswhut
6ff1d683a5 添加主题字体颜色设置 2022-12-30 12:12:09 +08:00
lyswhut
a7c2857808 完善同步 2022-12-26 17:40:45 +08:00
lyswhut
4cea16c326 更新版本号 2022-12-26 17:40:27 +08:00
lyswhut
a8228159b7 屏蔽同步功能 2022-12-26 17:39:27 +08:00
lyswhut
4594f2fd1f 修复tx源评论加载失败的问题 2022-12-26 17:39:11 +08:00
lyswhut
9c7661d1ae 更新依赖 2022-12-26 14:36:46 +08:00
lyswhut
dd2416b5ae 修复新旧歌曲信息转换 2022-12-26 14:14:21 +08:00
lyswhut
54ddb7473b 修改scheme校验 2022-12-26 14:13:18 +08:00
lyswhut
cc7ad7c71f 移除重复预置颜色 2022-12-26 09:52:59 +08:00
lyswhut
bfc07b2a97 更新依赖 2022-12-20 17:34:48 +08:00
lyswhut
2aad2c6b8a 特效 2022-12-17 16:01:31 +08:00
lyswhut
959df65e0a update match 2022-12-10 15:42:26 +08:00
lyswhut
76d32c1cb4 fix match 2022-12-10 14:48:01 +08:00
lyswhut
da59164664 修复潜在匹配问题 2022-12-10 14:15:43 +08:00
lyswhut
01c3a7d687 更新版本号(2.0.0-beta.22) 2022-12-10 13:47:58 +08:00
lyswhut
9a57118300 修复kg某些歌单链接无法打开的问题 2022-12-10 13:06:18 +08:00
lyswhut
8ecd6e6f54 修复扩展歌词匹配问题 2022-12-07 20:11:15 +08:00
lyswhut
b9ac754c07 更新依赖 2022-12-06 18:25:17 +08:00
lyswhut
3bd48e547d 更新版本号 2022-12-05 18:45:18 +08:00
lyswhut
92c77332a0 修复桌面歌词在关闭软件时被重置回关闭状态的问题 2022-12-05 13:05:17 +08:00
lyswhut
5c7652afe8 图片懒加载 2022-11-30 12:19:14 +08:00
lyswhut
c2dd35790f 减淡评论点赞数颜色 2022-11-30 00:44:31 +08:00
lyswhut
5dae561b70 更新版本号 2022-11-29 17:57:00 +08:00
lyswhut
b3600bef34 修复tx歌单无法显示的问题,添加歌单更新时间显示(如果有) 2022-11-29 13:48:57 +08:00
lyswhut
c6087f577d 添加kg源评论图片展示 2022-11-29 09:32:19 +08:00
lyswhut
c695c00e76 更新版本号 2022-11-28 18:19:36 +08:00
lyswhut
0d10d1f95b 添加进度条样式设置 2022-11-28 18:16:56 +08:00
lyswhut
f80d03ed15 修复潜在报错 2022-11-27 19:41:00 +08:00
lyswhut
f2b023193c 更新版本号 2022-11-27 19:18:59 +08:00
lyswhut
e467b92bb9 修复wy源我喜欢个人云盘歌曲信息获取问题 2022-11-27 19:14:27 +08:00
lyswhut
ae467cd515 修复缺失参数警告 2022-11-27 18:07:32 +08:00
lyswhut
9e51a55d45 桌面歌词新增在任务栏显示歌词进程设置(#1063) 2022-11-26 13:51:27 +08:00
lyswhut
67a3ab164a 更新依赖 2022-11-25 23:37:46 +08:00
lyswhut
77ea6d3748 更新ts类型导入导出语法 2022-11-25 23:01:39 +08:00
lyswhut
5e9b3a16fa 修复潜在的报错 2022-11-25 23:00:08 +08:00
lyswhut
bdeab55d3c 以非透明透明模式下启动时为主界面添加边框 2022-11-25 22:59:11 +08:00
lyswhut
bb10474cbb 修复默认的软件内快捷键与全局快捷键设置被调换的问题 2022-11-25 22:57:42 +08:00
lyswhut
d7a8e3dc51 更新版本号 2022-11-23 18:05:44 +08:00
lyswhut
2d5e336f0f 修复程序初始化顺序导致的问题 2022-11-23 18:04:28 +08:00
lyswhut
2aa4ff8422 修复播放稍后播放的歌曲时在原播放列表被更新是意外切歌的问题 2022-11-23 18:04:21 +08:00
lyswhut
8f7523dd95 更新依赖 2022-11-22 17:57:02 +08:00
lyswhut
f5cdd99fe6 更新日志 2022-11-21 17:32:55 +08:00
lyswhut
2459b4c64c 修复弹出层进度条调整位置时存在时间偏移的问题 2022-11-20 13:42:17 +08:00
lyswhut
54ea4c03d6 更新版本号 2022-11-19 18:06:11 +08:00
lyswhut
59061a0672 修改播放栏进度条布局 2022-11-19 18:05:37 +08:00
lyswhut
03b73e89b3 修复切歌方式按钮提示文本错误的问题 2022-11-19 12:30:10 +08:00
lyswhut
3bc6fc97a2 修复迁移旧版本配置失败的问题 2022-11-18 20:54:57 +08:00
lyswhut
82176a831d 更新版本号 2022-11-18 19:10:09 +08:00
lyswhut
9920e5ef99 修复导入列表数据时的歌曲信息转换问题 2022-11-18 09:58:02 +08:00
lyswhut
f3852b20ca 修复空路径检查处理问题 2022-11-17 22:40:23 +08:00
lyswhut
b20886f08a 修复以全屏启动设置与窗口大小检测冲突的问题 2022-11-17 18:21:25 +08:00
lyswhut
ec2b802912 聚合搜索歌单添加源名称显示 2022-11-17 18:06:14 +08:00
lyswhut
3b5832eceb 更新依赖,尝试修复某些系统环境下获取字体列表出现乱码的问题 2022-11-17 17:40:26 +08:00
lyswhut
589e373bd8 更新依赖 2022-11-16 19:19:04 +08:00
lyswhut
a6fd41900f 修复自定义主题背景路径存在空格时无法显示的问题 2022-11-16 19:18:59 +08:00
lyswhut
7daa626d55 修复播放详情页鼠标不会自动隐藏的问题 2022-11-16 13:23:06 +08:00
lyswhut
72da89235a 移除播放详情页左边竖线 2022-11-15 19:46:14 +08:00
lyswhut
8a14fe7985 更新版本号 2022-11-15 18:28:20 +08:00
lyswhut
1e1c0515d1 修复列表渲染性能bug 2022-11-15 12:33:10 +08:00
lyswhut
95a398da23 添加播放状态 2022-11-14 21:26:22 +08:00
lyswhut
ff8a8d860f 修复列表编号与图标显示问题 2022-11-14 21:12:27 +08:00
lyswhut
928cf264b0 更新依赖 2022-11-14 20:28:09 +08:00
lyswhut
7139682bc7 修复图标显示问题 2022-11-14 20:25:31 +08:00
lyswhut
b5ad039980 添加“近墨者黑”皮肤 2022-11-14 20:22:40 +08:00
lyswhut
ab37817d26 添加列表激活图标 2022-11-14 20:22:35 +08:00
lyswhut
e79f8b357c 修复编辑列表名字时按esc键无法退出编辑状态的问题 2022-11-14 19:02:36 +08:00
lyswhut
bdb9f9b949 添加对wy源评论表情的emoji转换 2022-11-13 16:44:45 +08:00
lyswhut
07708c7a56 修改弹出层动画 2022-11-13 15:38:34 +08:00
lyswhut
05e9c07aa1 修复上一曲按钮图标不清晰的问题 2022-11-13 14:43:00 +08:00
lyswhut
3486cfaab7 修复播放时间意外换行 2022-11-13 12:31:01 +08:00
lyswhut
313eba409c 更新版本号 2022-11-12 15:29:51 +08:00
lyswhut
88cae5d8e9 优化与修复 2022-11-12 14:52:36 +08:00
lyswhut
52c4a77934 支持打开波点音乐歌单(需在酷我源打开) 2022-11-12 14:52:21 +08:00
lyswhut
e526c244f3 更新依赖 2022-11-11 13:09:48 +08:00
lyswhut
54b5517222 更新播放栏UI 2022-11-10 18:35:15 +08:00
lyswhut
70a691bc68 优化单选框交互 2022-11-10 17:54:40 +08:00
lyswhut
55d22e424d 更新依赖 2022-11-09 17:44:11 +08:00
lyswhut
69ea40abc0 下拉选择器自动定位选中项位置 2022-11-09 17:23:27 +08:00
lyswhut
953fc94cb0 优化大列表增删操作性能 2022-11-09 17:08:12 +08:00
lyswhut
4b22518532 优化翻译 2022-11-09 10:41:39 +08:00
lyswhut
b60c438694 修复强迫症设置的搜索清理问题 2022-11-09 10:41:01 +08:00
lyswhut
d1d9d65a06 修改播放栏UI 2022-11-06 15:47:55 +08:00
lyswhut
b1ee4d10d7 更新版本号 2022-11-06 14:02:50 +08:00
lyswhut
908ef635fa 修复列表歌曲移动问题 2022-11-06 13:30:59 +08:00
lyswhut
6b2cf5df2f 减淡阴影 2022-11-05 15:41:18 +08:00
lyswhut
1105a9f31c 修复依赖问题 2022-11-05 15:17:04 +08:00
lyswhut
689724db6c 更新依赖 2022-11-05 14:37:10 +08:00
lyswhut
3530a95738 优化UI 2022-11-05 13:59:31 +08:00
lyswhut
c9d8bbe874 fix 2022-11-05 09:45:28 +08:00
lyswhut
8d87990793 保存utf8格式歌词时添加bom 2022-11-05 09:45:28 +08:00
lyswhut
5c4590d507 fix 2022-11-05 09:45:28 +08:00
lyswhut
11d3754c08 处理路径中存在百分号导致的问题 2022-11-04 20:27:51 +08:00
lyswhut
209bf9e0aa fix 2022-11-04 19:17:13 +08:00
lyswhut
9eaf072e8f 修改构建顺序 2022-11-04 19:16:44 +08:00
lyswhut
065bbef781 修复在歌曲添加弹窗中创建的新列表没有显示的问题 2022-11-04 18:46:44 +08:00
lyswhut
beb5589a4a 更新版本号 2022-11-04 18:29:48 +08:00
lyswhut
d88d5e7818 修复文字被截取的问题 2022-11-04 18:28:35 +08:00
lyswhut
12336148d9 禁用gpu沙盒 2022-11-04 16:41:43 +08:00
lyswhut
9bec54c454 迁移搜索、播放启动参数支持 2022-11-04 15:56:34 +08:00
lyswhut
303d712860 添加源存在性检查 2022-11-04 15:18:25 +08:00
lyswhut
9e6bfaada4 移除多余类型 2022-11-04 14:50:46 +08:00
lyswhut
3f8c47100d 更新依赖 2022-11-03 07:35:48 +08:00
lyswhut
716120ea61 更新歌曲播放栏布局 2022-11-03 06:34:57 +08:00
lyswhut
2003c5a0c9 兼容url格式的主题背景图片 2022-10-29 20:25:24 +08:00
lyswhut
07898cdfd6 添加桌面歌词滚动对齐方式、歌词间距设置 2022-10-29 15:20:59 +08:00
lyswhut
72418194e9 移除歌词文件分离 2022-10-29 13:20:11 +08:00
lyswhut
358b93fb70 自定义支持flac24bit声明 2022-10-29 13:19:52 +08:00
lyswhut
3e9a111643 修改图片读取顺序 2022-10-29 13:19:15 +08:00
lyswhut
8841951fe3 fix path 2022-10-29 11:40:36 +08:00
lyswhut
e45cee6596 v2.0.0 2022-10-29 11:36:35 +08:00
lyswhut
66b965d9f7 Merge branch 'dev' 2022-09-03 01:17:26 +08:00
lyswhut
f4285ae106 发布v1.22.3 2022-09-03 01:17:05 +08:00
lyswhut
657e65bc6a 修复因音源的域名到期导致的音源失效的问题 2022-09-03 01:16:23 +08:00
lyswhut
41fc8d2e2e 修正错误 2022-09-03 01:15:24 +08:00
lyswhut
25ca781d76 更新faq 2022-08-22 18:39:08 +08:00
lyswhut
41f4130e5d Merge branch 'dev' 2022-08-18 17:15:24 +08:00
lyswhut
8e19f3fc0b 发布v1.22.2 2022-08-18 17:15:00 +08:00
lyswhut
c4b8ac8b0b 修复hires类型显示 2022-08-11 17:20:07 +08:00
lyswhut
0ac2df1297 更新版本号 2022-08-11 17:01:18 +08:00
lyswhut
251450fd50 修复企鹅音乐搜索失效的问题 2022-08-11 15:44:37 +08:00
lyswhut
85c5595f43 更新依赖 2022-08-06 18:26:10 +08:00
lyswhut
ca3188c930 优化列表保存性能 2022-08-06 18:20:58 +08:00
lyswhut
2f47f82b0f 修复某些缺失的繁体中文翻译 2022-08-06 17:33:23 +08:00
lyswhut
0e09598b10 降级electron到v15.5.7 2022-08-05 10:45:17 +08:00
lyswhut
a705420528 修复依赖安全警告 2022-08-04 09:31:39 +08:00
lyswhut
4089887514 升级electron到v18.3.7 2022-08-04 09:18:53 +08:00
lyswhut
a3d02e5f39 修复列表移动的更新问题 2022-08-04 08:38:30 +08:00
lyswhut
6e09363832 修复无法批量排序歌曲的问题 2022-08-04 08:37:57 +08:00
lyswhut
1c58a64847 修复wy源音质获取问题 2022-07-22 14:29:57 +08:00
lyswhut
2a716e4d5a 更新依赖 2022-07-17 12:40:21 +08:00
lyswhut
a2c613d380 修复默认设置的语言显示问题 2022-07-10 16:06:07 +08:00
lyswhut
aa4b09436c Merge branch 'dev' 2022-07-09 12:03:42 +08:00
lyswhut
9521bba4ba 发布v1.22.1 2022-07-09 12:03:16 +08:00
lyswhut
55d10021f8 更新依赖 2022-07-08 19:03:36 +08:00
lyswhut
7fe35748d0 更新依赖 2022-07-08 16:43:28 +08:00
lyswhut
ff9efbd4ea 歌单列表添加歌单内歌曲数量显示 2022-07-08 16:39:56 +08:00
lyswhut
23b8c325f4 修复tx源搜索失效的问题 2022-07-08 09:12:45 +08:00
lyswhut
ecfccb4c40 修复临时列表meta信息丢失的问题 2022-07-03 22:55:33 +08:00
lyswhut
2472574cde 更新依赖 2022-07-03 22:16:06 +08:00
lyswhut
bf81c8facc 更新版本号 2022-06-25 13:23:30 +08:00
lyswhut
9bf0d69ab6 更新依赖 2022-06-25 10:29:55 +08:00
lyswhut
cf9d98d434 修复若桌面歌词窗口与主窗口重叠时,鼠标划过重叠区域鼠标会闪烁的问题 2022-06-20 12:02:55 +08:00
lyswhut
da8e67d4e5 修复处于不支持的源时,歌单、排行榜的右键下载菜单没有禁用的问题 2022-06-19 14:36:04 +08:00
lyswhut
d695cdef08 Merge branch 'dev' 2022-06-19 12:34:09 +08:00
lyswhut
d7a7701c09 发布v1.22.0 2022-06-19 11:59:11 +08:00
lyswhut
a31180260b 屏蔽设置 2022-06-18 11:50:54 +08:00
lyswhut
f33947287c 更新版本号 2022-06-17 20:26:08 +08:00
lyswhut
c054ceeab5 修复 2022-06-17 20:17:42 +08:00
lyswhut
c8dce1bcb6 更新更新 Electron 到 v17.4.7 2022-06-17 20:16:07 +08:00
lyswhut
6195c10646 更新常见问题地址 2022-06-17 19:20:08 +08:00
lyswhut
535cbbbd16 修复ctrl跳转播放失效的问题 2022-06-17 14:44:28 +08:00
lyswhut
fa99f35bc0 修复歌词显示问题 2022-06-15 11:08:00 +08:00
lyswhut
5800f0e354 添加导入文件错误时的指引提示 2022-06-15 09:30:58 +08:00
lyswhut
aa5e621184 新增设置-桌面歌词设置-鼠标移入歌词区域时降低歌词透明度(#883) 2022-06-14 11:43:18 +08:00
lyswhut
283bdd6246 添加歌曲列表更新操作的二次确认 2022-06-13 12:57:25 +08:00
lyswhut
2884e67109 修复esc键冲突问题 2022-06-12 18:01:26 +08:00
lyswhut
4542f9b2e3 更新依赖 2022-06-12 14:46:34 +08:00
lyswhut
9d08f91079 修复在新建歌单输入框、歌单内歌曲搜索输入框会意外触发设置的全局快捷键的问题(#879) 2022-06-12 14:39:58 +08:00
lyswhut
0704a4ad12 修复设置快捷键时的处理逻辑问题 2022-06-11 18:52:52 +08:00
lyswhut
bb8509a21c 支持mg源逐字歌词的播放 2022-06-09 13:03:46 +08:00
lyswhut
f2e3d4a53d 更新版本号 2022-06-07 19:49:01 +08:00
lyswhut
b8a221e67e 更新t文档 2022-06-07 08:52:19 +08:00
lyswhut
f4147cce37 添加其他开发者工具打开方式 2022-06-07 08:51:41 +08:00
lyswhut
01f9fd502f 还原文档 2022-06-06 10:00:12 +08:00
lyswhut
5d20adc81e 更新依赖 2022-06-05 14:51:58 +08:00
lyswhut
6a78f659e3 移除http_proxy环境变量 2022-06-05 14:51:46 +08:00
lyswhut
211f584bf8 更新文档说明 2022-06-04 13:03:20 +08:00
lyswhut
fcfba8b12c 新增添加歌曲到“我的列表”时,若按住ctrl键,则不会自动关闭添加窗口 2022-06-04 12:48:26 +08:00
lyswhut
85e4c7555a 修复多选后切换列表后不会清空多选内容的问题 2022-06-04 12:43:15 +08:00
lyswhut
19dccffdde 优化换源匹配 2022-05-31 09:13:59 +08:00
lyswhut
359514a83c 修复变量移除问题 2022-05-29 10:58:04 +08:00
lyswhut
90ea0dc857 修复环境变量被替换的问题 2022-05-29 10:48:05 +08:00
lyswhut
ae18db45a4 修复若配置了http_proxy环境变量时,会意外使用此代理配置的问题 2022-05-29 10:39:14 +08:00
lyswhut
4783c9be8d 更新依赖 2022-05-26 13:02:52 +08:00
lyswhut
ff41fa9829 修复kuwo歌词解析 2022-05-26 12:03:40 +08:00
lyswhut
aa56dafd5f 新增设置-以全屏模式启动设置 2022-05-24 08:57:04 +08:00
lyswhut
f2f2008d5d Merge branch 'dev' 2022-05-22 11:17:47 +08:00
lyswhut
15d2589db8 发布v1.21.0 2022-05-22 11:17:13 +08:00
lyswhut
47a8da49ca 修改包大小提示 2022-05-22 01:50:34 +08:00
lyswhut
2250cac7f9 不处理可能存在翻译的歌词 2022-05-22 01:50:02 +08:00
lyswhut
94e3063307 添加flac 24bit显示 2022-05-20 19:32:31 +08:00
lyswhut
88691b3f18 更新依赖 2022-05-19 17:33:12 +08:00
lyswhut
3851880007 添加稍后播放说明 2022-05-19 15:19:37 +08:00
lyswhut
e5d2e089f4 在全屏状态下使用Esc键可以退出全屏 2022-05-19 14:57:42 +08:00
lyswhut
bfe7f24a4b 删除未下载完成的任务时,只同时尝试删除已有下载进度的本地文件(#849) 2022-05-17 10:07:34 +08:00
lyswhut
0d1e2c3349 更新链接 2022-05-17 09:22:43 +08:00
lyswhut
bc6272a0ed 更新依赖 2022-05-17 09:11:52 +08:00
lyswhut
56a752dc26 更新依赖 2022-05-13 10:48:32 +08:00
lyswhut
0fe443c92a 修复潜在歌单更新失败的问题 2022-05-12 12:03:45 +08:00
lyswhut
74afdb2a46 更新依赖 2022-05-11 15:52:04 +08:00
lyswhut
ebd6ff36ed 合并打包的页面文件 2022-05-11 15:37:06 +08:00
lyswhut
a5ec36bf89 新增设置-播放设置-显示歌词罗马音 2022-05-10 11:12:14 +08:00
lyswhut
c65802c1c3 修复长度大于一行的歌词在使用歌词调整播放进度时的时间不准问题 2022-05-10 09:36:12 +08:00
lyswhut
784515e411 修复原始歌词存在偏移时,歌词偏移设置的重置未按预期工作的问题 2022-05-09 14:07:31 +08:00
lyswhut
e859d39b2b 更新依赖 2022-05-08 13:34:59 +08:00
lyswhut
62c4bfb9eb 修复评论换行处理问题 2022-05-07 12:56:46 +08:00
lyswhut
8ab1bdf30a 修复关闭“显示切换动画”设置后,在应用启动时该设置没有被应用的问题 2022-05-05 16:02:09 +08:00
lyswhut
c758066e25 禁用透明窗口时右侧不再偏移5px距离 2022-05-05 14:57:04 +08:00
lyswhut
06b7f69b3c 同时删除一首歌以上时将需要二次确认删除 2022-05-04 10:06:02 +08:00
lyswhut
c3c43a2645 修复某些情况下歌曲播放出错时不会自动切歌的问题 2022-05-03 19:53:13 +08:00
lyswhut
343395a5de 更新依赖 2022-05-03 18:55:39 +08:00
lyswhut
3c9bb74b61 lint fix 2022-04-26 13:04:28 +08:00
lyswhut
c9cf30692f 更新依赖 2022-04-26 13:04:19 +08:00
lyswhut
c979339c4e Merge branch 'dev' 2022-04-17 10:06:33 +08:00
lyswhut
9393906eb9 修复构建 2022-04-17 10:06:13 +08:00
lyswhut
1b4c910264 Merge branch 'dev' 2022-04-17 09:08:06 +08:00
lyswhut
4db5d26b1e 发布v1.20.0 2022-04-17 09:07:44 +08:00
lyswhut
c09a4131db 修复歌词菜单弹出位置问题 2022-04-16 14:41:58 +08:00
lyswhut
ce6f3f23c6 修复歌曲匹配 2022-04-16 14:19:19 +08:00
lyswhut
7b898c2d91 更新依赖 2022-04-16 13:49:29 +08:00
lyswhut
3da797a0ad 修复linux构建 2022-04-13 20:04:25 +08:00
lyswhut
517899cd03 优化逻辑 2022-04-13 11:52:01 +08:00
lyswhut
1d6a14685e 更新依赖 2022-04-13 11:09:30 +08:00
lyswhut
737d00f550 修复正在下载的歌曲暂停任务后,再开始会导致程序卡死的问题 2022-04-13 11:08:29 +08:00
lyswhut
68798a9627 优化歌词选择UI问题 2022-04-11 11:56:22 +08:00
lyswhut
5b1dfee05c 修复歌曲信息更新时的保存问题 2022-04-10 22:40:28 +08:00
lyswhut
e75863e99d 跳过空白歌词 2022-04-10 22:25:25 +08:00
lyswhut
1c542a9b17 跳过空白歌词 2022-04-10 22:11:42 +08:00
lyswhut
729ac5a0d7 修复全屏切换的事件清理问题 2022-04-10 21:37:25 +08:00
lyswhut
ff8195df46 添加列表元数据清理 2022-04-10 21:03:40 +08:00
lyswhut
692ab6dacb 更新依赖 2022-04-10 20:28:29 +08:00
lyswhut
128039d678 修复歌词偏移处理问题 2022-04-09 13:42:12 +08:00
lyswhut
bb5de056d4 更新依赖 2022-04-09 10:40:45 +08:00
lyswhut
d927ac90e7 修复按键监听问题 2022-04-08 14:04:50 +08:00
lyswhut
f61099ecad 修改按键绑定 2022-04-08 11:43:43 +08:00
lyswhut
f96b663bbe 更新版本号 2022-04-07 19:29:18 +08:00
lyswhut
f65213f8aa 修复启用代理时,https请求可能被挂起或被转为http的问题 2022-04-07 14:41:09 +08:00
lyswhut
2e5adeb50c 优化滚动 2022-04-07 09:54:06 +08:00
lyswhut
6de84d3b9b 修复歌词调整时间显示问题 2022-04-07 09:24:09 +08:00
lyswhut
65ae08add6 修复网易歌单详情无法打开的问题 2022-04-07 08:28:02 +08:00
lyswhut
3c970c24c1 修复换源失败时的处理问题 2022-04-05 22:08:35 +08:00
lyswhut
93f3507dc8 添加说明 2022-04-05 17:15:29 +08:00
lyswhut
e92e291409 修复鼠标自动隐藏问题 2022-04-05 16:47:37 +08:00
lyswhut
4b4de8937e 更新windows下的图标 2022-04-05 14:34:56 +08:00
lyswhut
27a036bc00 优化布局 2022-04-04 20:56:40 +08:00
lyswhut
1eb2540c67 更新依赖 2022-04-04 20:11:30 +08:00
lyswhut
3a5bd6029f 更新版本号 2022-04-03 14:00:20 +08:00
lyswhut
249ff7f2d2 尝试修改应用名称 2022-04-03 13:56:39 +08:00
lyswhut
9afa965d5d 修复使用Scheme URL搜索歌曲时,不会自动关闭播放详情页(若处于打开状态)的问题 2022-04-03 00:37:38 +08:00
lyswhut
28b7b5581d 添加提示 2022-04-02 22:14:47 +08:00
lyswhut
26aab15e50 修复wy源搜索某些歌曲时第一页之后的歌曲无法加载的问题 2022-04-02 21:16:41 +08:00
lyswhut
92351049f1 修复潜在更新问题 2022-04-02 14:26:31 +08:00
lyswhut
47d3c50863 新增列表更新管理 2022-04-02 14:13:58 +08:00
lyswhut
36ac3532e6 修复歌词菜单的弹出问题 2022-04-01 14:29:07 +08:00
lyswhut
dee16f6943 修复播放详情页的鼠标隐藏问题 2022-04-01 14:28:22 +08:00
lyswhut
3541b568c9 更新版本号 2022-03-31 17:54:35 +08:00
lyswhut
4dfa4d9525 新增设置-桌面歌词设置-自动刷新歌词置顶 2022-03-31 17:54:22 +08:00
lyswhut
5938f4e591 修复窗口尺寸设置对应的字体大小在启动后不生效的问题 2022-03-31 13:19:50 +08:00
lyswhut
9ac26be65d 记录连接时间 2022-03-30 16:22:13 +08:00
lyswhut
5099ba9c96 添加源有效性校验 2022-03-30 13:14:23 +08:00
lyswhut
bca5b13516 修复鼠标不会隐藏的问题 2022-03-28 20:28:33 +08:00
lyswhut
6ceb984393 更新版本号 2022-03-28 19:04:40 +08:00
lyswhut
17b29f376a 更新说明文档 2022-03-28 18:46:13 +08:00
lyswhut
36bef673d3 在全屏状态下鼠标在空白处静止不动3秒后自动将其隐藏 2022-03-28 18:05:58 +08:00
lyswhut
c2fa4e5220 修复不启用热门搜索时,搜索历史不显示的问题 2022-03-28 14:11:03 +08:00
lyswhut
ddf06d20c2 移除右击调整 2022-03-28 13:04:43 +08:00
lyswhut
e51f640371 在全屏状态下的播放详情页仍会显示退出播放详情页按钮 2022-03-28 09:41:30 +08:00
lyswhut
e302f53d5c Update 2022-03-27 12:23:48 +08:00
lyswhut
b2058b9581 调整颜色 2022-03-26 14:59:13 +08:00
lyswhut
35501d328b 加深颜色 2022-03-26 13:15:39 +08:00
lyswhut
cb746c64db 更新版本号 2022-03-26 13:06:34 +08:00
lyswhut
e2f6d117bc 优化播放详情页背景显示 2022-03-26 13:06:07 +08:00
lyswhut
9fd9449eca 新增播放错误时自动切换歌曲设置 2022-03-25 15:52:33 +08:00
lyswhut
1f97af6ff1 修复歌词解析问题 2022-03-25 15:52:19 +08:00
lyswhut
f1a7862a9c 更新node版本 2022-03-25 14:34:12 +08:00
lyswhut
8aeac3ed2e 更新依赖 2022-03-25 10:24:47 +08:00
lyswhut
469832a598 通过歌词调整进度时添加对偏移时间的计算 2022-03-23 17:49:34 +08:00
lyswhut
e0e65e4374 更新版本号 2022-03-22 20:21:01 +08:00
lyswhut
66f78d6979 修复偏移标签的匹配问题 2022-03-22 20:19:16 +08:00
lyswhut
efc58f7dd1 更新版本号 2022-03-22 17:49:18 +08:00
lyswhut
bc301c27c2 新增播放详情页歌词右键菜单,新增歌词偏移设置 2022-03-22 16:55:44 +08:00
lyswhut
82ea1935de 修复任务栏收藏按钮的下载列表歌曲收藏问题 2022-03-21 10:03:35 +08:00
lyswhut
226fb05337 修复Linux无法全屏的问题 2022-03-20 20:16:01 +08:00
lyswhut
be219f03d5 typo 2022-03-20 14:28:59 +08:00
lyswhut
f10c1e923e Merge branch 'dev' 2022-03-20 13:52:15 +08:00
lyswhut
66121e5ff3 发布v1.19.0 2022-03-20 13:50:32 +08:00
lyswhut
478b71172d 添加切歌逻辑注释 2022-03-20 12:53:48 +08:00
lyswhut
e7370f12ae 切换devtools版本 2022-03-20 12:26:03 +08:00
lyswhut
b844a577c7 迁移提示文本字段 2022-03-20 12:04:01 +08:00
lyswhut
9bf33fdb25 优化播放下载列表时的切歌性能 2022-03-20 01:47:09 +08:00
lyswhut
8b988b227b 修复下载列表播放歌曲序号更新问题 2022-03-20 00:43:16 +08:00
lyswhut
8b2be019c6 移除偏移 2022-03-19 19:46:13 +08:00
lyswhut
4d7d92759f 过滤id重复的歌曲 2022-03-19 16:25:28 +08:00
lyswhut
798b840472 fix syntax 2022-03-19 13:07:43 +08:00
lyswhut
48db75a995 更新依赖 2022-03-19 13:05:49 +08:00
lyswhut
7072541ba7 Generate file MD5 2022-03-19 13:03:10 +08:00
lyswhut
7119c915ec 修复依赖漏洞警告问题 2022-03-18 20:30:58 +08:00
lyswhut
5e3035cc15 更新依赖 2022-03-18 19:32:00 +08:00
lyswhut
7cf2e4c4ed 修复歌单详情获取流程问题 2022-03-18 14:56:29 +08:00
lyswhut
674a3a0a3f 优化歌词解析 2022-03-18 14:36:00 +08:00
lyswhut
7486a99494 修改延迟 2022-03-18 13:15:52 +08:00
lyswhut
783d96bd7d 更新文档 2022-03-18 11:38:08 +08:00
lyswhut
64eea42092 优化歌词播放机制 2022-03-18 11:27:31 +08:00
lyswhut
8453ad0fb4 修复歌词播放问题 2022-03-18 11:26:52 +08:00
lyswhut
0acfeff006 优化托盘菜单操作#686 2022-03-18 10:56:28 +08:00
lyswhut
a338b7ef39 取消默认偏移 2022-03-15 15:29:53 +08:00
lyswhut
e821660124 添加动画 2022-03-15 11:23:58 +08:00
lyswhut
bad6045164 修复歌词解析问题 2022-03-15 10:54:51 +08:00
lyswhut
6779fd7ae5 优化歌词偏移时间计算 2022-03-15 10:23:47 +08:00
lyswhut
04858cc42c 修复歌词解析问题 2022-03-14 19:38:48 +08:00
lyswhut
916975b0a9 更新版本号 2022-03-14 17:59:38 +08:00
lyswhut
644db88e58 添加对歌词offset字段的支持 2022-03-14 17:37:27 +08:00
lyswhut
b025af45fa 优化歌词播放器 2022-03-14 17:06:50 +08:00
lyswhut
0f11731c01 修复歌词解析问题 2022-03-14 15:37:44 +08:00
lyswhut
ea1d21a3ef 修复歌词解析问题 2022-03-14 10:24:30 +08:00
lyswhut
545ba6521b 新增对kw源卡拉OK歌词的支持 2022-03-14 10:02:31 +08:00
lyswhut
1fd3e6c9fa 更换kw歌词获取方式 2022-03-13 15:00:43 +08:00
lyswhut
2913c0c7de 优化音频可视化与音频设备输出设置冲突的提示机制 2022-03-13 11:32:40 +08:00
lyswhut
a4c851899f 修复依赖漏洞警告 2022-03-12 21:32:51 +08:00
lyswhut
df1c58e79b 修复依赖安全警告 2022-03-12 20:53:59 +08:00
lyswhut
67edeab09b 更新版本号 2022-03-11 21:44:46 +08:00
lyswhut
fe07ac025a 修复设置的迁移问题 2022-03-11 21:44:38 +08:00
lyswhut
fc72d99ab3 优化大屏的UI布局 2022-03-11 21:36:33 +08:00
lyswhut
377f665361 修复UI问题 2022-03-11 20:44:40 +08:00
lyswhut
4e458ec4cb 修复计算问题 2022-03-11 20:08:41 +08:00
lyswhut
6f4500f31a 修复与优化列表渲染 2022-03-11 15:10:29 +08:00
lyswhut
a363c5525b 修复使用链接导入的歌单无法在我的列表打开原歌单详情页的问题 2022-03-11 12:02:59 +08:00
lyswhut
65027fceba 修复设置迁移问题 2022-03-11 11:30:47 +08:00
lyswhut
2b0c75a649 添加提示 2022-03-11 11:29:30 +08:00
lyswhut
bcc79541c1 优化大屏下的UI展示 2022-03-11 10:52:13 +08:00
lyswhut
081d6dc91e 修复评论列表显示问题 2022-03-11 10:10:01 +08:00
lyswhut
09a5111e36 修复列表渲染问题 2022-03-10 19:52:03 +08:00
lyswhut
253746843c 更新描述 2022-03-10 19:02:09 +08:00
lyswhut
5d2fac9247 更新版本号 2022-03-10 17:47:05 +08:00
lyswhut
3c2a1093a0 更新依赖 2022-03-10 17:46:41 +08:00
lyswhut
88b3d8ee4a 新增动态主题“道法自然” 2022-03-10 16:07:51 +08:00
lyswhut
d35a6f504f 优化下载、歌曲添加弹窗在大屏幕下的排版 2022-03-09 15:03:35 +08:00
lyswhut
4965dad6a2 修复评论宽度计算问题 2022-03-09 15:02:49 +08:00
lyswhut
3ad4584159 修复设置意外被更改的问题 2022-03-08 18:20:09 +08:00
lyswhut
5e291255bb 修复切换全屏问题 2022-03-08 18:02:45 +08:00
lyswhut
205c99372e 修复标签列表宽度问题 2022-03-08 17:42:42 +08:00
lyswhut
a05f3a969b 更新版本号 2022-03-08 17:19:57 +08:00
lyswhut
3acc0931d8 新增全屏状态 2022-03-08 17:19:34 +08:00
lyswhut
05f6a953ea 添加音频可视化与音频输出设备冲突的提示 2022-03-08 14:51:29 +08:00
lyswhut
6253368f05 更新版本号 2022-03-08 08:32:00 +08:00
lyswhut
9483f2f178 修复依赖 2022-03-07 19:10:15 +08:00
lyswhut
8df6e7ef90 修复展开评论时的歌词大小问题 2022-03-07 17:23:33 +08:00
lyswhut
b09dba0a95 添加通过歌词调整播放进度开关设置 2022-03-07 16:10:18 +08:00
lyswhut
cfee4a0b24 新增通过播放详情页歌词调整播放进度 2022-03-07 15:33:04 +08:00
lyswhut
34febf4949 确保音频输出改变时能暂停播放 2022-03-06 21:57:32 +08:00
lyswhut
6aed9dfb9f 修复Windows任务栏缩略图工具栏控制按钮的歌曲收藏按钮状态更新问题 2022-03-06 21:38:45 +08:00
lyswhut
c7360993c9 更新说明 2022-03-06 14:29:44 +08:00
lyswhut
34a072bada 修复展开评论时的歌词间隔问题 2022-03-06 13:43:58 +08:00
lyswhut
dda0d54f20 添加歌词间隔跟随字体大小改变 2022-03-06 13:33:13 +08:00
lyswhut
d710c31d48 修复翻译依赖导致的错误 2022-03-06 13:11:03 +08:00
lyswhut
02c74f7d96 修复AppImage包无法运行的问题 2022-03-06 10:27:37 +08:00
lyswhut
5bdccba29e 修复高度塌陷的问题 2022-03-05 16:11:25 +08:00
lyswhut
cdc819fbe8 新增对播放详情页歌词大小、是否缩放、对齐方式的设置 2022-03-05 16:06:45 +08:00
lyswhut
4629d4cd3e 修复桌面歌词没有处理停止播放状态的问题 2022-03-03 17:39:33 +08:00
lyswhut
ba3a70c524 更新快捷操作说明 2022-03-03 13:15:56 +08:00
lyswhut
52b985dd8e 更新依赖 2022-03-02 18:41:29 +08:00
lyswhut
b51c8e1552 修复“当前的声音输出设备被改变时暂停播放歌曲”设置无效的问题 2022-02-28 12:00:54 +08:00
lyswhut
86f9c03707 添加LX中定义的快捷操作汇总说明 2022-02-27 12:25:53 +08:00
lyswhut
e61c84ee08 优化Windows任务栏缩略图工具栏控制按钮在浅色任务栏下的显示效果 2022-02-27 11:36:18 +08:00
lyswhut
2f39808275 Merge branch 'dev' 2022-02-26 13:39:58 +08:00
lyswhut
f5aee4cbd0 修复依赖 2022-02-26 13:39:37 +08:00
lyswhut
9fd9bb4eef Merge branch 'dev' 2022-02-26 13:31:14 +08:00
lyswhut
685cae8993 更新依赖 2022-02-26 13:30:54 +08:00
lyswhut
ec14aadec6 Merge branch 'dev' 2022-02-26 13:14:33 +08:00
lyswhut
b934770e1e 更新依赖 2022-02-26 13:14:19 +08:00
lyswhut
2f76433f34 Merge branch 'dev' 2022-02-26 12:58:31 +08:00
lyswhut
535c63be2b 修改构建顺序 2022-02-26 12:57:58 +08:00
lyswhut
53d4f08ee7 Merge branch 'dev' 2022-02-26 12:22:00 +08:00
lyswhut
81b72fe72b 发布v1.18.0 2022-02-26 12:21:40 +08:00
lyswhut
e496794052 更新依赖 2022-02-26 12:19:48 +08:00
lyswhut
442b4fb30f 分离方法 2022-02-25 10:26:59 +08:00
lyswhut
9528b10d01 添加debug启动参数 2022-02-25 10:18:57 +08:00
lyswhut
a9f9c887b5 更新版本号 2022-02-24 17:25:03 +08:00
lyswhut
6105a331aa 修复播放器的停止逻辑问题 2022-02-24 17:23:33 +08:00
lyswhut
0f0be95c12 修复任务栏按钮的控制问题 2022-02-24 17:21:36 +08:00
lyswhut
d6ca9e4539 修复windows平台下软件目录存在portable文件夹时,仍会在默认目录创建文件的问题 2022-02-24 13:09:13 +08:00
lyswhut
d3b5171237 优化滚动 2022-02-22 17:05:18 +08:00
lyswhut
cf501ac19e 修复字体设置不生效的问题 2022-02-22 08:56:10 +08:00
lyswhut
4fd4746ddf 更新版本号 2022-02-21 17:41:56 +08:00
lyswhut
61c1476823 新增任务栏缩略图工具栏控制按钮 2022-02-21 16:05:41 +08:00
lyswhut
e28b8bb6e8 修改默认字体 2022-02-21 10:28:09 +08:00
lyswhut
5eb9107adf 新增设置-基本设置-软件字体设置 2022-02-20 17:22:58 +08:00
lyswhut
83ddf74890 修复歌单详情的播放按钮无效的问题 2022-02-18 17:21:11 +08:00
lyswhut
6aa7f2a0ee 移除多余样式 2022-02-18 16:34:35 +08:00
lyswhut
d801d55c3c 修复进度条动画问题 2022-02-18 16:21:03 +08:00
lyswhut
491e644c3c 修改进度条高度 2022-02-18 16:15:08 +08:00
lyswhut
5844232a00 添加源数量限制 2022-02-18 15:50:51 +08:00
lyswhut
abbf067625 修复歌单无法从用data传参调用的问题 2022-02-18 14:48:15 +08:00
lyswhut
806c882965 更新说明 2022-02-18 11:26:17 +08:00
lyswhut
3fe5a85ffe 更新依赖 2022-02-18 10:33:56 +08:00
lyswhut
95dae62bb3 更新说明 2022-02-17 16:29:42 +08:00
lyswhut
f7edd54ea7 修复宽度计算问题 2022-02-17 15:48:55 +08:00
lyswhut
78ae89199e 更新说明 2022-02-17 14:53:51 +08:00
lyswhut
fc12a235f2 自定义源添加更新地址参数 2022-02-17 10:13:45 +08:00
lyswhut
48fc96226c 更新版本号 2022-02-16 18:38:11 +08:00
lyswhut
3534dd27dc 自定义源新增更新弹窗方法 2022-02-16 18:32:55 +08:00
lyswhut
a7e3c1a0c4 优化进度条动画 2022-02-16 11:30:35 +08:00
lyswhut
43c5051158 打开播放详情页时隐藏外部进度条 2022-02-16 10:33:52 +08:00
lyswhut
2f56a7090a 新增Scheme URL对音乐搜索的调用支持;新增Scheme URL以url传参的方式调用 2022-02-15 18:49:02 +08:00
lyswhut
13ffcfbbcd 更新调用错误信息弹窗按钮文案 2022-02-15 15:29:13 +08:00
lyswhut
1aeb8e29e2 更新依赖 2022-02-15 15:13:25 +08:00
lyswhut
a3b844d2e3 添加缺失的翻译 2022-02-14 15:55:12 +08:00
lyswhut
5aa027f1a9 修复问题 2022-02-14 15:48:43 +08:00
lyswhut
c12be6a1c8 新增定时暂停播放功能 2022-02-14 15:38:27 +08:00
lyswhut
c891ed81e1 修复某些歌曲无法下载的问题 2022-02-13 14:17:38 +08:00
lyswhut
c48921990d 修复下载功能的歌词换源时会进入死循环的问题 2022-02-13 14:16:45 +08:00
lyswhut
54bfd945e5 修复wy源某些歌曲获取歌词翻译的问题处理 2022-02-13 14:14:23 +08:00
lyswhut
1d8c4db5eb 更新版本号 2022-02-12 18:25:39 +08:00
lyswhut
055ab98d4c 把歌曲的热门评论与最新评论拆分成两个列表显示 2022-02-11 19:38:51 +08:00
lyswhut
777551cb43 新增打开收藏的在线列表的对应平台详情页功能 2022-02-11 16:51:39 +08:00
lyswhut
68827f7697 修复修改列表名时无法使用Ctrl键的问题 2022-02-11 16:06:07 +08:00
lyswhut
8e5b144f00 新增“双击列表里的歌曲时自动切换到当前列表播放”设置 2022-02-10 12:48:01 +08:00
lyswhut
748a420b64 修复排行榜名字右击菜单的播放功能在播放非激活的列表时的列表获取问题 2022-02-09 21:02:43 +08:00
lyswhut
80fc43a075 更新依赖 2022-02-09 19:53:26 +08:00
lyswhut
0588f2846b 添加链接 2022-02-08 17:34:58 +08:00
lyswhut
8e4e7d9efa 更新依赖 2022-02-07 13:02:46 +08:00
lyswhut
6df01edc7a 更新electron到v13.6.9 2022-02-04 18:30:06 +08:00
lyswhut
996396c943 过滤tx源某些不支持播放的歌曲,解决播放此类内容会导致意外的问题 2022-02-04 18:29:48 +08:00
lyswhut
e3dddb9288 Merge branch 'dev' 2022-01-28 19:16:01 +08:00
lyswhut
47ce71c959 发布v1.17.1 2022-01-28 19:09:56 +08:00
lyswhut
8921aeb3f2 更新依赖 2022-01-28 19:08:13 +08:00
lyswhut
35be9739d4 修复列表的聚焦问题 2022-01-27 09:33:49 +08:00
lyswhut
f5ce46431b 修复快捷键与默认按键行为冲突的问题 2022-01-27 09:31:28 +08:00
lyswhut
81ed70d291 更新依赖 2022-01-26 17:49:25 +08:00
lyswhut
4b0fdceb76 优化kw源英文与翻译歌词的匹配 2022-01-26 17:47:03 +08:00
lyswhut
58e537732c 更新依赖 2022-01-25 17:36:35 +08:00
lyswhut
02ad79b12a 更新依赖 2022-01-24 16:01:26 +08:00
lyswhut
b179887efc 更新链接 2022-01-22 13:27:06 +08:00
lyswhut
0580b059fc Merge branch 'dev' 2022-01-22 13:02:05 +08:00
lyswhut
bebd0e7258 发布v1.17.0 2022-01-22 13:01:38 +08:00
lyswhut
6e96b2163e 更新依赖 2022-01-22 13:00:18 +08:00
lyswhut
ca15ac987c 更新依赖 2022-01-21 16:46:01 +08:00
lyswhut
6d3414caa9 更新版本号 2022-01-18 16:41:18 +08:00
lyswhut
85b80312e0 修改颜色 2022-01-18 16:04:26 +08:00
lyswhut
30d5f53c1d 更新已收藏的在线列表时,将始终重新加载,不再使用缓存 2022-01-18 15:34:48 +08:00
lyswhut
bad2e98757 更新依赖 2022-01-18 08:49:56 +08:00
lyswhut
45da396cb2 修复tx源无搜索结果的问题 2022-01-18 08:49:36 +08:00
lyswhut
d195176a46 修复列表跳转问题 2022-01-17 09:21:12 +08:00
lyswhut
53078f79a6 新增桌面歌词是否延迟滚动设置 2022-01-16 20:00:22 +08:00
lyswhut
dbb7f0c683 更新版本号 2022-01-16 13:54:54 +08:00
lyswhut
cb7703ecbb 修复从网页打开歌单时无法收藏的问题 2022-01-16 13:54:07 +08:00
lyswhut
e63d7174bb 加深颜色 2022-01-16 11:34:07 +08:00
lyswhut
31ab7a0493 更新文档 2022-01-15 16:28:21 +08:00
lyswhut
c503f09529 新增“便携”功能 2022-01-15 16:28:16 +08:00
lyswhut
f5bb9189af 修复播放状态的提示问题 2022-01-14 17:24:38 +08:00
lyswhut
9ed8ba80c4 更新依赖 2022-01-14 13:34:29 +08:00
lyswhut
f9cce82a93 更新依赖 2022-01-14 11:19:26 +08:00
lyswhut
79d418d1a1 修复依赖 2022-01-13 08:39:48 +08:00
lyswhut
15d7f73aca 更新依赖 2022-01-12 22:59:51 +08:00
lyswhut
4561870ece 修复构建 2022-01-12 18:01:40 +08:00
lyswhut
dbc8c9d07d 更新依赖 2022-01-12 17:16:21 +08:00
lyswhut
d81a2029ec 更新版本号 2022-01-12 16:55:51 +08:00
lyswhut
d04a5a2f92 更新依赖 2022-01-12 16:52:12 +08:00
lyswhut
5146f083ff 新增打开主窗口开发者工具快捷键 2022-01-11 16:58:33 +08:00
lyswhut
57122c6eea 优化代码 2022-01-11 15:40:06 +08:00
lyswhut
ca748906c0 修复从Scheme URL启动软件打开歌单详情时会加载两次的问题 2022-01-11 15:25:35 +08:00
lyswhut
4d31bde98a 更新版本号 2022-01-08 01:36:31 +08:00
lyswhut
3f98c332bd 修复问题 2022-01-08 01:25:05 +08:00
lyswhut
fb3eced1fb 添加类型 2022-01-07 23:02:01 +08:00
lyswhut
9641ea0b3a 修复url长度校验 2022-01-07 23:01:50 +08:00
lyswhut
1df05a5529 修复文档显示问题 2022-01-07 17:59:40 +08:00
lyswhut
a393bb02dd 新增 Scheme URL 支持 2022-01-07 17:23:48 +08:00
lyswhut
20518cbe2b 更新依赖 2022-01-07 09:42:02 +08:00
lyswhut
9447034deb 修复稍后播放问题 2022-01-06 18:27:30 +08:00
lyswhut
c7f0fcbe9f 调整音频可视化参数 2022-01-05 15:51:49 +08:00
lyswhut
fce8719432 优化程序初始化逻辑,修复无网络的情况下的初始化问题 2022-01-05 11:50:13 +08:00
lyswhut
ce383769da 更新版本号 2022-01-05 11:18:14 +08:00
lyswhut
342af62aea 修复openDevTools选项无效的问题 2022-01-05 11:17:29 +08:00
lyswhut
b3ab05cc86 新增启动参数-proxy-server-proxy-bypass-list 2022-01-04 15:27:25 +08:00
lyswhut
36966e220c 修复代理不生效的问题 2022-01-04 15:27:20 +08:00
lyswhut
8ae3347c05 减淡新年主题搜索框底色 2022-01-04 10:13:41 +08:00
lyswhut
4f51a8ce31 优化频谱、修改频谱均值加成 2022-01-04 09:41:18 +08:00
lyswhut
1371bbe6fb 为可视化音频的频谱整体添加频谱均值加成,使频谱显示更有节奏感 2022-01-03 16:36:08 +08:00
lyswhut
94f4c9e334 修复播放列表为空时点击播放按钮会报错的问题 2022-01-01 16:26:17 +08:00
lyswhut
c5c89f9d9e Merge branch 'dev' 2022-01-01 15:28:19 +08:00
lyswhut
6a79f8ec0d 发布v1.16.0 2022-01-01 15:27:52 +08:00
lyswhut
aa940ef9f7 更新依赖 2022-01-01 15:06:46 +08:00
lyswhut
7a20f06cf4 修复界面切换问题 2022-01-01 15:06:17 +08:00
lyswhut
b9596f2a6e 更新新年皮肤 2022-01-01 14:37:40 +08:00
lyswhut
bb2dfc269c 修正错别字 2021-12-31 19:29:58 +08:00
lyswhut
684af4e7db 调整添加按钮宽度 2021-12-31 11:55:55 +08:00
lyswhut
1c946ac661 添加帮助图标 2021-12-31 11:48:11 +08:00
lyswhut
f8d06d38ab 修改右边位置时的控制按钮为windows风格 2021-12-31 10:07:05 +08:00
lyswhut
2a679c914b 降级node 2021-12-30 19:12:58 +08:00
lyswhut
3f8d5ed570 更新版本号 2021-12-27 18:14:58 +08:00
lyswhut
028c2f9f03 我的列表新增拖动调整位置功能 2021-12-27 18:14:43 +08:00
lyswhut
b783c0c227 修复列表无法重命名的问题 2021-12-27 15:57:02 +08:00
lyswhut
30787a372e 禁用拼写检查 2021-12-27 11:19:11 +08:00
lyswhut
b99169cc3b 更新说明 2021-12-25 22:56:59 +08:00
lyswhut
78cf146a92 修复潜在歌词滚动问题 2021-12-25 15:42:32 +08:00
lyswhut
b867167b78 优化 2021-12-24 19:31:50 +08:00
lyswhut
d8dfbf6995 更新版本号 2021-12-24 17:40:16 +08:00
lyswhut
c2d6737796 播放详情页新增音频可视化功能 2021-12-24 17:39:50 +08:00
lyswhut
dcfe055461 更新依赖 2021-12-24 11:40:31 +08:00
lyswhut
c86b1c259c 为播放详情页、桌面歌词添加延迟滚动,播放详情页略微减小已激活歌词的缩放大小及桌面歌词翻译大小 2021-12-24 11:06:00 +08:00
lyswhut
400c16ba2d 更新版本号 2021-12-23 17:49:37 +08:00
lyswhut
3ff0dbb7ef 优化歌单、排行榜一键播放按钮的播放机制 2021-12-23 15:28:01 +08:00
lyswhut
469a88f368 优化歌词滚动 2021-12-23 11:31:38 +08:00
lyswhut
217ff27e72 优化列表滚动性能 2021-12-23 10:37:51 +08:00
lyswhut
e337f7121b 为导出CSV文件头部自动应用相应翻译 2021-12-19 19:41:51 +08:00
lyswhut
665ac5ee99 更新版本号 2021-12-19 19:09:09 +08:00
lyswhut
f06c493458 调整评论组件位置 2021-12-19 18:23:42 +08:00
lyswhut
f383e47344 修复播放栏的歌曲添加按钮打开的添加窗口不会自动关闭的问题 2021-12-19 18:23:21 +08:00
lyswhut
e15518cd51 为CSV格式添加头部 2021-12-18 13:06:26 +08:00
lyswhut
27ce62dd4f 修复列表顺序同步问题 2021-12-18 13:03:26 +08:00
lyswhut
26202d8e56 更新版本号 2021-12-17 17:46:28 +08:00
lyswhut
d93b5a3374 支持对移动端的位置同步调整 2021-12-17 17:36:10 +08:00
lyswhut
e3acb7ce4e 同步功能添加对列表顺序调整的控制 2021-12-17 17:18:56 +08:00
lyswhut
5b7c965c48 更新依赖 2021-12-17 14:51:58 +08:00
lyswhut
5f1e670dd7 更新win图标 2021-12-16 17:29:58 +08:00
lyswhut
ab1562ea33 添加一个获取歌曲URL超时的定时器 2021-12-15 09:00:55 +08:00
lyswhut
2359a1444b 修复最小化托盘设置不起作用的问题 2021-12-14 23:00:20 +08:00
lyswhut
9075b6629f 整理事件代码 2021-12-14 20:24:11 +08:00
lyswhut
583e8c43d6 移除多余代码 2021-12-14 20:02:39 +08:00
lyswhut
26369dd14b 更新版本号 2021-12-14 17:47:27 +08:00
lyswhut
9d40e7c004 修复热搜词获取问题 2021-12-13 15:57:45 +08:00
lyswhut
267535844e 更新依赖 2021-12-13 14:10:32 +08:00
lyswhut
0f5d2189e0 修复无法关闭状态栏歌曲进度的问题 2021-12-13 14:07:26 +08:00
lyswhut
f76f4d9d29 修复保存歌曲进度设置问题 2021-12-13 13:12:50 +08:00
lyswhut
2ba5e40012 移除多余代码 2021-12-12 21:48:36 +08:00
lyswhut
1fe6ae4556 修复某些情况下切歌会导致错误的状态提示内容 2021-12-12 20:14:10 +08:00
lyswhut
3d8a1894f6 还原linux平台下的图标更改 2021-12-11 17:14:07 +08:00
lyswhut
70cfce833c 更新版本号 2021-12-11 16:24:27 +08:00
lyswhut
96c3034a07 修复调整当前播放歌曲的位置时会导致切歌的问题 2021-12-11 16:24:00 +08:00
lyswhut
5aad81c696 修复刚从线列表的歌曲无法批量添加、添加到我的列表后无法调整顺序等问题 2021-12-11 15:54:08 +08:00
lyswhut
b0e2f44f01 修复歌曲搜索多选不准确的问题 2021-12-11 15:32:56 +08:00
lyswhut
442e633800 修复无法移动歌曲的问题 2021-12-11 14:46:27 +08:00
lyswhut
5f1e788a25 调整linux、Mac平台下的图标大小 2021-12-11 13:50:05 +08:00
lyswhut
3808e7e78f 修改图标大小 2021-12-10 21:02:17 +08:00
lyswhut
650edc1b1e 修复歌曲排序描述 2021-12-10 20:28:04 +08:00
lyswhut
cb5e1bd795 更新依赖 2021-12-10 14:21:09 +08:00
lyswhut
3282557769 修复无法批量稍后播放的问题 2021-12-10 08:37:26 +08:00
lyswhut
dff18b6b9d 修复潜在报错 2021-12-09 17:51:51 +08:00
lyswhut
2a64ead1c4 添加加载超时时尝试刷新URL 2021-12-08 17:51:06 +08:00
lyswhut
eb0a61d35b 添加图片加载失败的处理 2021-12-08 17:18:37 +08:00
lyswhut
ddca70980e 修改托盘图标顺序 2021-12-07 17:48:01 +08:00
lyswhut
5aa3502ef5 调整黑色主题翻页器背景颜色 2021-12-07 15:07:23 +08:00
lyswhut
3b02703805 添加vue devtools 2021-12-07 11:32:19 +08:00
lyswhut
f39d13c8f8 更新版本号 2021-12-06 18:58:02 +08:00
lyswhut
16a203227a 修复问题 2021-12-06 18:56:56 +08:00
lyswhut
b350f133b0 新增将播放与下载的歌词转换为繁体中文选项 2021-12-06 16:07:12 +08:00
lyswhut
ec3a0e08c3 新增根据歌曲名、歌手名等字段对列表自动排序的功能 2021-12-06 15:33:36 +08:00
lyswhut
a96eea5e44 修复切换切歌模式切换时提示实时不更新的问题 2021-12-05 23:17:27 +08:00
lyswhut
0dc7815e35 新增将我的列表保存为TXT、CSV格式 2021-12-05 21:36:46 +08:00
lyswhut
7f6e1c25e9 修复列表搜索不能用键盘选择的问题 2021-12-05 19:16:33 +08:00
lyswhut
9291c35b00 修复某些歌曲评论的时间显示 2021-12-05 18:58:30 +08:00
lyswhut
90b67fc05c 优化快捷键设置 2021-12-04 20:32:22 +08:00
lyswhut
09afd2c6f8 修复列表高度计算问题 2021-12-04 19:10:04 +08:00
lyswhut
1def571191 添加源显示 2021-12-04 18:09:21 +08:00
lyswhut
ef52f2465e 优化 2021-12-04 17:32:02 +08:00
lyswhut
845e5de43f 移除日志 2021-12-04 17:28:55 +08:00
lyswhut
b7433264eb 更新版本号 2021-12-04 17:26:36 +08:00
lyswhut
60e606a413 修复问题 2021-12-04 17:25:21 +08:00
lyswhut
9afafec9d6 修复列表问题 2021-12-04 02:25:55 +08:00
lyswhut
c9cb84a28d 修复导入 2021-12-04 02:15:08 +08:00
lyswhut
8949383ade 修复列表操作问题 2021-12-04 01:55:36 +08:00
lyswhut
f732ea4dab 关闭devtools 2021-12-04 01:45:28 +08:00
lyswhut
162842415f 移除日志 2021-12-04 01:44:20 +08:00
lyswhut
07d200a752 修复同步问题 2021-12-04 01:30:34 +08:00
lyswhut
822e1ea6c9 修复搜索问题 2021-12-04 00:27:13 +08:00
lyswhut
f79ae1541d 修复批量下载 2021-12-04 00:00:19 +08:00
lyswhut
2dfa93383f 修复kw源某些歌曲的歌词提取异常的问题 2021-12-03 23:46:41 +08:00
lyswhut
1ab5db8507 添加vue eslint规则,修复问题 2021-12-03 23:45:03 +08:00
lyswhut
ccd951b5d3 修复 2021-12-03 22:27:36 +08:00
lyswhut
6259690d12 更新依赖 2021-12-03 22:12:42 +08:00
lyswhut
8059d9cd73 升级到 vue3 2021-12-03 22:11:11 +08:00
lyswhut
c6635e554a 更新依赖 2021-12-03 21:49:49 +08:00
lyswhut
d7ca662e70 更新说明 2021-11-29 10:45:55 +08:00
lyswhut
b6f885b250 优化歌词自动换源机制 2021-11-28 01:54:45 +08:00
lyswhut
63141c4ac9 优化进度条逻辑 2021-11-28 00:15:51 +08:00
lyswhut
94e9f01e62 Merge branch 'dev' 2021-11-21 12:13:30 +08:00
lyswhut
cffa74b1c2 发布v1.15.3 2021-11-21 12:12:00 +08:00
lyswhut
1fb917941e 更新依赖 2021-11-21 12:10:45 +08:00
lyswhut
08c6a4e2fb 修复列表切换问题 2021-11-19 22:15:58 +08:00
lyswhut
976be6d96f 修复因kw源歌词接口停用导致该源歌词获取失败的问题 2021-11-18 14:51:00 +08:00
lyswhut
fe95b45820 更新依赖 2021-11-13 23:29:18 +08:00
lyswhut
47dffeee76 修复潜在的音乐加载超时不会切歌的问题 2021-11-13 23:29:09 +08:00
lyswhut
be7b06f5c8 修复播放下载列表时存在失效的歌曲会导致切歌不准确的问题 2021-11-13 23:29:00 +08:00
lyswhut
3a371f8d75 修复设置-控制按钮位置选项与下载歌词编码格式选项命名冲突导致选项显示异常的问题 2021-11-13 23:04:27 +08:00
lyswhut
fa97058895 优化字典#682 2021-11-13 21:57:01 +08:00
lyswhut
df9289367b 修改文案 2021-11-09 20:07:29 +08:00
lyswhut
3a824b1d5e 更新模板 2021-11-09 20:03:03 +08:00
lyswhut
6f72da87b1 Merge branch 'dev' of github.com:lyswhut/lx-music-desktop into dev 2021-11-09 19:34:55 +08:00
lyswhut
1b1c5ad6da Merge branch 'dev' 2021-11-09 18:37:40 +08:00
lyswhut
f4777f787c 发布v1.15.2 2021-11-09 18:37:19 +08:00
lyswhut
6bcf45fba7 降级electron到v13.4.0 2021-11-09 18:35:17 +08:00
lyswhut
1e8a05e313 更新问题模板 2021-11-09 16:54:55 +08:00
lyswhut
1cf0f2dd0b Merge branch 'dev' 2021-11-09 09:25:40 +08:00
lyswhut
25a0439928 发布v1.15.1 2021-11-09 09:25:13 +08:00
lyswhut
df20e97d60 添加媒体播放进度条的信息设置 2021-11-09 09:17:21 +08:00
lyswhut
fd764a28a4 更新electron到v15.3.1 2021-11-09 08:52:00 +08:00
lyswhut
81bd8fbb74 支持启动软件时恢复播放下载列表里的歌曲 2021-11-06 16:15:29 +08:00
lyswhut
47ee572640 更新依赖 2021-11-06 14:26:33 +08:00
lyswhut
a0b9553158 优化播放详情页的打开 2021-11-06 14:26:16 +08:00
lyswhut
7659a6cadf 更新说明 2021-11-03 16:30:31 +08:00
lyswhut
a65bae8243 移除过时的选项 2021-11-03 16:30:22 +08:00
lyswhut
421abac30a 更新依赖 2021-11-03 16:29:58 +08:00
lyswhut
0b11e97427 添加列表歌手、专辑的提示气泡 2021-11-03 16:27:13 +08:00
lyswhut
fbe1ff73f1 修复下载列表无法切下一首歌的问题 2021-11-03 16:26:43 +08:00
lyswhut
68e831468b 修复潜在播放详情页问题 2021-11-01 09:21:54 +08:00
lyswhut
e382f0dba0 优化下载功能的添加、删除、暂停任务时的流畅度 2021-10-31 21:50:57 +08:00
lyswhut
f0f92952d6 优化我的列表、下载列表等列表的滚动流畅度 2021-10-30 12:16:58 +08:00
lyswhut
58f016ca00 修复潜在同步问题 2021-10-30 10:07:08 +08:00
lyswhut
faff0edb4a 更新 2021-10-29 21:16:30 +08:00
lyswhut
5e9a9e5b55 移除多余代码 2021-10-29 20:29:28 +08:00
lyswhut
e182dde718 修复了某些情况下会列表同步失败,导致连接断开无限重连的问题 2021-10-29 20:09:43 +08:00
lyswhut
7dfc2e8736 修复列表数据过大导致同步失败的问题 2021-10-29 20:09:37 +08:00
lyswhut
b27a547fb8 修复某些情况下获取URL失败时会意外切歌的问题 2021-10-29 20:05:11 +08:00
lyswhut
379c752cf8 Merge branch 'dev' 2021-10-29 15:15:03 +08:00
lyswhut
35abdc63d4 降级 electron-builder 2021-10-29 15:14:41 +08:00
lyswhut
a386915b50 Merge branch 'dev' 2021-10-29 14:23:27 +08:00
lyswhut
ab16bc849d 发布v1.15.0 2021-10-29 14:23:03 +08:00
lyswhut
90007127ba 更新依赖 2021-10-29 14:21:04 +08:00
lyswhut
a1935cbdac 修复列表项高度随窗口的大小适配问题 2021-10-29 14:20:51 +08:00
lyswhut
7de91bd923 更新图标 2021-10-28 09:56:23 +08:00
lyswhut
cdbcae21ac 添加黑色托盘图标 2021-10-27 17:11:35 +08:00
lyswhut
ea62033cf3 修改图标 2021-10-27 16:21:41 +08:00
lyswhut
a48423944a 修复缺失的包问题 2021-10-27 14:22:02 +08:00
lyswhut
b7fb3cd208 调整图标尺寸 2021-10-27 14:21:32 +08:00
lyswhut
34825b5063 兼容桌面歌词以触摸的方式移动、调整大小 2021-10-26 15:51:48 +08:00
lyswhut
7737012103 更新依赖 2021-10-26 15:33:14 +08:00
lyswhut
3912a375c5 更新版本号 2021-10-26 14:44:35 +08:00
lyswhut
35ca6db1ee 优化我的列表、下载、歌单、排行榜列表性能 2021-10-26 14:44:15 +08:00
lyswhut
0d20869337 优化进入、离开播放详情页的性能 2021-10-26 10:30:01 +08:00
lyswhut
89d161268e 更新说明 2021-10-23 20:12:49 +08:00
lyswhut
5ae39ef8d3 更新依赖 2021-10-21 14:57:34 +08:00
lyswhut
e57696d4ff 优化开关评论时的动画性能 2021-10-17 13:49:35 +08:00
lyswhut
15c9a5468b 更新依赖 2021-10-15 20:08:46 +08:00
lyswhut
30318b7c61 更新版本号 2021-10-15 19:56:01 +08:00
lyswhut
8b0fc9bf5f 更新 Electron 到 v15.2.0 2021-10-15 19:54:48 +08:00
lyswhut
5fdba7720c 添加弹窗 2021-10-14 08:54:33 +08:00
lyswhut
ca12dc604d 完善评论 2021-10-13 12:00:02 +08:00
lyswhut
09f4d8ac0c 修复同一首歌的URL、歌词等同时需要换源时的处理问题 2021-10-09 10:21:34 +08:00
lyswhut
254b82cc60 修复kg源的歌单链接无法打开的问题 2021-10-07 20:01:19 +08:00
lyswhut
d4240006f1 自定义源新增version字段,新增utils.buffer.bufToString方法 2021-10-07 12:28:03 +08:00
lyswhut
68518e609d 增加自定义脚本名字长度 2021-10-07 10:22:30 +08:00
lyswhut
001eba6729 优化列表同步代码逻辑 2021-10-06 13:37:23 +08:00
lyswhut
ff47a224c7 Merge branch 'dev' 2021-10-04 12:28:08 +08:00
lyswhut
8810e25ea9 发布v1.14.1 2021-10-04 12:22:52 +08:00
lyswhut
eb67d67a60 修复v1.14.0出现的备份与恢复功能备份的数据无法恢复的问题 2021-10-04 12:22:16 +08:00
lyswhut
e12f95ff74 更新版本号 2021-10-03 11:00:20 +08:00
lyswhut
2fe213d060 修复我的列表搜索输入某些字符会导致应用崩溃的问题 2021-10-03 10:55:09 +08:00
lyswhut
b726ee42f7 Merge branch 'dev' 2021-10-02 13:43:46 +08:00
lyswhut
6b71b4709e 发布v1.14.0 2021-10-02 13:43:19 +08:00
lyswhut
0701b78720 优化英文歌曲名匹配 2021-10-01 22:47:55 +08:00
lyswhut
82d1ac1e83 更新依赖 2021-10-01 22:18:50 +08:00
lyswhut
8acf98631f 更新版本号 2021-10-01 22:16:08 +08:00
lyswhut
0a31d19561 新增重复歌曲列表 2021-10-01 22:15:45 +08:00
lyswhut
91279922f1 新增歌词文本选择复制功能 2021-10-01 12:30:07 +08:00
lyswhut
96804ae2e2 更新版本号 2021-09-30 16:45:20 +08:00
lyswhut
3ae8a89961 更新依赖 2021-09-30 16:44:32 +08:00
lyswhut
f8f13fd32c 优化歌词处理 2021-09-30 14:56:35 +08:00
lyswhut
ae61d2c629 调整位置 2021-09-30 14:56:24 +08:00
lyswhut
b1918e8b15 新增删除列表前的确认弹窗 2021-09-30 14:45:14 +08:00
lyswhut
ce7bca5b36 新增单个列表导入/导出功能 2021-09-30 14:27:32 +08:00
lyswhut
51be62bc29 更新依赖 2021-09-30 08:52:14 +08:00
Unintended
c1ff3971de Typo (#643) 2021-09-25 11:16:56 +08:00
Wei Yijun
57db286405 修复GNOME等桌面下每次打开应用时需重新设置歌词窗口置顶的问题 (#636) 2021-09-22 10:33:48 +08:00
lyswhut
592b670e96 更新版本号 2021-09-18 17:31:21 +08:00
lyswhut
97fdcaac51 新增歌词简体中文转繁体中文,当软件语言被设置为繁体中文后,播放歌曲的歌词也将自动转成繁体中文显示 2021-09-18 17:30:46 +08:00
lyswhut
271d9ac13e 更新依赖 2021-09-15 17:08:38 +08:00
lyswhut
b6cea110a7 修复在有提示信息的地方长按鼠标按键时提示信息会闪烁的问题 2021-09-11 15:39:02 +08:00
lyswhut
4b5dae4779 修复点击播放详情页的进度条跳进度时会出现偏移的问题 2021-09-10 14:31:07 +08:00
lyswhut
a250317a28 修复mg排行榜无法加载的问题 2021-09-09 16:45:10 +08:00
lyswhut
431605e793 Merge branch 'dev' of github.com:lyswhut/lx-music-desktop into dev 2021-09-07 22:20:06 +08:00
lyswhut
a4d3c06119 Merge branch 'dev' 2021-09-05 12:16:56 +08:00
lyswhut
246412cb2c 发布v1.13.0 2021-09-05 12:14:17 +08:00
lyswhut
2fb013fb41 修正排版 2021-09-05 12:13:44 +08:00
lyswhut
6f9d684b2d 复从电脑浏览器复制的企鹅歌单链接无法打开的问题 2021-09-05 12:13:32 +08:00
lyswhut
af6a2ec581 更新依赖 2021-09-04 21:24:42 +08:00
lyswhut
488b28921f 添加“Windows 7 下桌面歌词字体列表为空”问题解答 2021-08-29 21:31:44 +08:00
lyswhut
4c23fc1011 移除eiows包 2021-08-29 18:32:03 +08:00
lyswhut
db1c903f1b 更新版本号 2021-08-29 18:27:38 +08:00
lyswhut
3fdf7411fc 新增桌面歌词字体设置 2021-08-29 18:27:01 +08:00
lyswhut
1da275ff3a 更新依赖 2021-08-28 13:25:34 +08:00
lyswhut
bc5167f38d 使用中文括号 2021-08-26 16:21:26 +08:00
lyswhut
609b6f3123 更新版本号 2021-08-26 16:00:43 +08:00
lyswhut
fe35081e03 新增“下载的歌词文件编码格式”设置 2021-08-26 16:00:03 +08:00
lyswhut
72df1a35a0 更新推荐的DNS值 2021-08-26 08:54:58 +08:00
lyswhut
90ffcf5071 更新依赖 2021-08-25 16:29:11 +08:00
lyswhut
35f60cc536 添加说明 2021-08-24 08:46:42 +08:00
lyswhut
31bb40c50b 更新版本号 2021-08-23 11:25:53 +08:00
lyswhut
bc7b35f816 修复无法从歌单界面打开网易歌单详情的问题 2021-08-23 11:23:42 +08:00
lyswhut
0c76612a4c 更新版本号 2021-08-22 13:10:28 +08:00
lyswhut
ab86674aa3 软件内快捷键的最小化触发时,如果已启用托盘,则隐藏程序,否则最小化程序 2021-08-22 10:26:59 +08:00
lyswhut
8cd5a01dd5 更新依赖 2021-08-20 21:59:16 +08:00
lyswhut
4ef5bafcca 更新依赖 2021-08-20 21:56:15 +08:00
lyswhut
2c783e0657 修复错误 2021-08-20 11:15:51 +08:00
lyswhut
0c7ead5b21 Merge branch 'dev' of github.com:lyswhut/lx-music-desktop into dev 2021-08-19 19:27:42 +08:00
lyswhut
57a8b7842e 修复某些情况下列表同步不一致的问题 2021-08-19 15:23:29 +08:00
lyswhut
4b5a7b6a74 添加测试群 2021-08-18 17:04:38 +08:00
lyswhut
c09c31767d 更新依赖 2021-08-18 16:10:13 +08:00
lyswhut
ecff04618b 支持网易源“我喜欢”歌单以注入token的方式打开 2021-08-18 14:03:00 +08:00
lyswhut
c377469dad 歌曲搜索框新增清理按钮 2021-08-16 15:46:43 +08:00
lyswhut
ecb41382cb 更新常见问题 2021-08-16 09:10:23 +08:00
lyswhut
3150b12b99 修复重名问题 2021-08-15 19:45:11 +08:00
lyswhut
364260b070 修复某些情况下同步功能会导致切歌混乱的问题 2021-08-12 10:40:45 +08:00
lyswhut
5ccf6f077d Merge branch 'dev' 2021-08-11 17:07:02 +08:00
lyswhut
5b113c5c22 发布v1.12.2 2021-08-11 17:06:18 +08:00
lyswhut
ff53900ea3 修复同步服务器启动失败时,关闭同步服务不会清空失败信息的问题 2021-08-11 16:39:33 +08:00
lyswhut
b0b0403d9a 移除多余内容 2021-08-11 15:23:20 +08:00
lyswhut
21c3b3ab57 修复上一曲切换问题 2021-08-11 13:28:51 +08:00
lyswhut
e85709a341 修复稍后播放切歌问题 2021-08-11 11:57:41 +08:00
lyswhut
04be42a4d6 添加规则 2021-08-11 10:22:15 +08:00
lyswhut
8196e8a84d 更新依赖 2021-08-11 10:00:04 +08:00
lyswhut
1f85492690 修复播放下载列表的歌曲时切歌、歌词显示问题 2021-08-11 09:59:47 +08:00
lyswhut
e15178150b 移除日志 2021-08-08 12:16:22 +08:00
lyswhut
d83aee2507 Merge branch 'dev' 2021-08-08 11:54:46 +08:00
lyswhut
354a9904e9 发布v1.12.1 2021-08-08 11:54:21 +08:00
lyswhut
fe3379ffbb 修复随机播放下无法切歌的问题 2021-08-08 11:54:13 +08:00
lyswhut
0164936038 Merge branch 'dev' 2021-08-08 10:29:09 +08:00
lyswhut
9106d6455f 发布v1.12.0 2021-08-08 10:28:43 +08:00
lyswhut
5ddea2b1da 修复图片为空时设置歌曲信息出错的问题 2021-08-07 19:35:13 +08:00
lyswhut
2549c5587e 更新依赖 2021-08-07 13:45:44 +08:00
lyswhut
c9f28d8105 更新依赖 2021-08-05 10:39:59 +08:00
lyswhut
75b2db4749 添加播放器对系统媒体控制与显示的兼容处理 2021-08-05 10:21:20 +08:00
lyswhut
b6f291d721 添加提示语 2021-08-02 14:32:45 +08:00
lyswhut
4f7e227392 移除日志输出 2021-08-01 20:12:38 +08:00
lyswhut
7d95eb34c7 修复同步服务启动失败刷新连接码按钮仍然可以点击的问题 2021-08-01 20:11:38 +08:00
lyswhut
7e3ee38920 修复删除列表中正在播放的歌曲时不会自动切歌的问题 2021-08-01 20:07:40 +08:00
lyswhut
d44c2c26a8 修复beta版MAC包构建失败的问题 2021-08-01 13:46:16 +08:00
lyswhut
d77a41c20f 更新版本 2021-08-01 13:35:58 +08:00
lyswhut
c50c747691 完善代码 2021-08-01 13:28:12 +08:00
lyswhut
bcf3dde60d 完成同步功能 2021-08-01 12:57:13 +08:00
lyswhut
33ec3de1b4 更新依赖 2021-08-01 12:46:17 +08:00
lyswhut
26be5b5c4f 移除多余依赖 2021-07-23 22:01:34 +08:00
lyswhut
56af57c682 修复某些情况下所显示的歌词、封面图片与当前正在播放的歌曲不一致的问题 2021-07-23 16:14:56 +08:00
lyswhut
3a5cb3f7c2 修复导入kg歌单最多只能加载100、500首歌曲的问题 2021-07-21 15:33:41 +08:00
lyswhut
724c6be85b 禁用win arm版本的自动下载更新 2021-07-18 14:56:18 +08:00
lyswhut
1c4a56f95b Merge branch 'dev' 2021-07-18 13:59:58 +08:00
lyswhut
9c21e96538 发布v1.11.0 2021-07-18 13:56:26 +08:00
lyswhut
67074bd682 更新依赖 2021-07-17 16:40:52 +08:00
lyswhut
b535987392 更新依赖 2021-07-14 14:27:59 +08:00
lyswhut
d5c0c2e3d3 更新依赖 2021-07-10 12:26:14 +08:00
lyswhut
7580c79c00 替换过时API 2021-07-07 15:02:46 +08:00
lyswhut
c0a13622b0 更新依赖 2021-07-06 16:51:18 +08:00
lyswhut
58d7326f77 优化mg源打开歌单的链接兼容 2021-07-06 16:51:13 +08:00
lyswhut
45d7a12d0d 更新依赖 2021-07-05 10:08:44 +08:00
lyswhut
40b4f15340 更新说明 2021-07-02 14:58:14 +08:00
lyswhut
9c28ff67c1 更新 2021-07-02 10:28:32 +08:00
lyswhut
e3f146dabf 移除wy源歌单列表按“最新”排序的按钮 2021-06-30 11:55:32 +08:00
lyswhut
2b2a6a7f10 更新依赖 2021-06-30 11:44:51 +08:00
lyswhut
192574dfe8 更新依赖 2021-06-27 14:47:19 +08:00
lyswhut
8e95e06b2d 添加网易歌单无法打开的说明 2021-06-24 14:50:04 +08:00
lyswhut
1963b3ee71 修复mg源搜索失效的问题 2021-06-19 13:26:58 +08:00
lyswhut
507f66b3b6 修复dns查询问题 2021-06-18 15:13:15 +08:00
lyswhut
94bf9eae8b 更新依赖 2021-06-17 15:38:03 +08:00
lyswhut
0fa32f976c 移除日志输出 2021-06-16 16:24:39 +08:00
lyswhut
198238d4b5 优化网络请求,尝试去解决无法连接服务器的问题 2021-06-16 10:23:48 +08:00
lyswhut
66631ac105 修复进度条高度问题 2021-06-14 13:52:46 +08:00
lyswhut
19c5996351 更新依赖 2021-06-11 16:25:36 +08:00
lyswhut
cd3140a9c7 新增“添加歌曲到列表时的位置”设置 2021-06-11 15:45:09 +08:00
lyswhut
56201d6a01 更新依赖 2021-06-10 18:10:52 +08:00
lyswhut
654cb41e3e 添加 win arm64 架构的安装包构建 2021-06-07 09:04:34 +08:00
lyswhut
fa744d9204 添加i18n-ally扩展设置 2021-06-06 20:31:09 +08:00
lyswhut
3e1c56ff82 修复打包失败的问题 2021-06-05 12:18:43 +08:00
lyswhut
5d5164c4e9 更新依赖 2021-06-04 16:08:15 +08:00
lyswhut
0791e760a4 修复打开kw歌单失败时会无限重试的问题 2021-06-03 15:12:53 +08:00
lyswhut
b53fe2dd5e 优化wy源歌单导入匹配 2021-06-03 14:50:37 +08:00
lyswhut
1648b0c2dd 更新依赖 2021-05-31 17:12:53 +08:00
lyswhut
1a5adfabf4 更新依赖 2021-05-27 08:44:37 +08:00
lyswhut
c538e9c4fc Merge branch 'dev' 2021-05-25 16:19:49 +08:00
lyswhut
98422b296d 发布v1.10.2 2021-05-25 16:19:23 +08:00
lyswhut
e35068137d 修复企鹅音乐搜索歌曲没有结果的问题 2021-05-25 16:18:45 +08:00
lyswhut
83dda92603 Merge branch 'dev' 2021-05-25 15:42:13 +08:00
lyswhut
6bbcb519d7 发布v1.10.1 2021-05-25 15:40:57 +08:00
lyswhut
7fa3baacfd 更新依赖 2021-05-25 15:40:07 +08:00
lyswhut
f94c1ef852 不允许播放空列表 2021-05-24 11:03:21 +08:00
lyswhut
cc4cb1a6a7 修复企鹅音乐搜索歌曲没有结果的问题 2021-05-23 16:31:31 +08:00
lyswhut
247a322366 修复播放在空的歌单列表点击播放全部时报错的问题 2021-05-23 16:31:26 +08:00
lyswhut
7ec7023d1b Merge branch 'dev' 2021-05-20 08:28:13 +08:00
lyswhut
b4edd95bab 移除多余选项 2021-05-20 08:22:44 +08:00
lyswhut
50ddc8caa3 去除多余选项 2021-05-20 01:16:44 +08:00
lyswhut
6263dbbd0f Merge branch 'dev' 2021-05-20 00:14:56 +08:00
lyswhut
64c45daf16 修改安装包构建顺序,使latest.yml仍指向x86_64版本的包 2021-05-20 00:14:36 +08:00
lyswhut
5ed41cb5ac Merge branch 'dev' 2021-05-19 21:19:05 +08:00
lyswhut
29dea5f829 添加win x64与x86版本安装包的单独构建 2021-05-19 21:17:27 +08:00
lyswhut
e51b21421d Merge branch 'dev' 2021-05-19 18:28:10 +08:00
lyswhut
5cae4ae0bf 使用更新的node版本 2021-05-19 18:27:48 +08:00
lyswhut
5f2cbb30c2 Merge branch 'dev' 2021-05-19 18:21:49 +08:00
lyswhut
1ddec2cb69 发布v1.10.0 2021-05-19 18:21:16 +08:00
lyswhut
96b54cc77a 稍微加高进度条 2021-05-19 18:15:41 +08:00
lyswhut
4da6524493 修复了一个歌曲下载失败时不会跳过任务的问题 2021-05-19 18:15:04 +08:00
lyswhut
1364d58065 新增Mac arm64位dmg包的构建 2021-05-19 16:55:02 +08:00
lyswhut
4383966051 更新依赖 2021-05-19 11:15:36 +08:00
lyswhut
86451fb5d0 更新依赖 2021-05-17 16:47:09 +08:00
lyswhut
0878c7398d 排行榜界面添加播放、收藏整个排行榜功能 2021-05-17 15:43:47 +08:00
lyswhut
81643165c2 修复在线列表的请求取消问题 2021-05-16 22:46:46 +08:00
lyswhut
b37802949c 更新依赖 2021-05-16 14:12:11 +08:00
lyswhut
a53f2388b4 更新网盘地址 2021-05-16 14:09:03 +08:00
lyswhut
e823543cad 更新 2021-05-15 20:40:01 +08:00
lyswhut
bdf7f903e9 修复mg源歌单标签、排行榜歌曲列表无法加载的问题 2021-05-15 20:39:53 +08:00
lyswhut
336b40a102 修复wy源的歌曲音质匹配问题 2021-05-15 17:27:25 +08:00
lyswhut
354922195f 修复请求重试bug 2021-05-15 01:42:23 +08:00
lyswhut
9c1199fc48 更新FAQ 2021-05-12 17:20:38 +08:00
lyswhut
ea35ed25d8 修复kw部分歌单无法打开的问题 2021-05-12 14:04:08 +08:00
lyswhut
add05ef913 修复在当前正常播放的列表中使用稍后播放功能时,播放完后稍后播放的歌曲后不会恢复原来播放位置播放的问题 2021-05-10 16:35:34 +08:00
lyswhut
e3aa4110fc 更新依赖 2021-05-09 13:33:46 +08:00
lyswhut
8a0ed1bc13 更新说明 2021-05-03 12:41:03 +08:00
lyswhut
0db490d444 更新依赖 2021-04-30 21:22:50 +08:00
lyswhut
4fd89c8a83 修正错别字 2021-04-28 17:47:33 +08:00
lyswhut
4fe17e556e 修复快捷键设置框内的提示问题 2021-04-26 15:17:01 +08:00
lyswhut
e95553163c 修复全局快捷键对桌面歌词无效的问题 2021-04-26 14:13:11 +08:00
lyswhut
8ae72074ef 更新 2021-04-25 13:18:49 +08:00
lyswhut
b6c1403f4b 显示换源提示 2021-04-25 10:29:08 +08:00
lyswhut
920d696d0b 更新歌曲无法下载、播放说明 2021-04-24 17:22:45 +08:00
lyswhut
a8dcb0b973 优化逻辑 2021-04-24 17:22:28 +08:00
lyswhut
895198b7b8 修正描述 2021-04-24 16:10:22 +08:00
lyswhut
144941d991 Merge branch 'dev' 2021-04-24 15:55:49 +08:00
lyswhut
f203517ce8 发布1.9.0版本 2021-04-24 15:55:40 +08:00
lyswhut
6dd6741237 Merge branch 'dev' 2021-04-24 15:53:37 +08:00
lyswhut
066e9c2fd5 修复上传包名匹配 2021-04-24 15:38:02 +08:00
lyswhut
f500b9b2d5 优化beta打包流程 2021-04-24 15:13:10 +08:00
lyswhut
c80e35872e 修改打包名 2021-04-24 14:34:52 +08:00
lyswhut
05eda6e406 修复打包失败 2021-04-24 14:13:13 +08:00
lyswhut
1686182616 更新版本号 2021-04-24 13:50:34 +08:00
lyswhut
fd5720451e 更新依赖 2021-04-24 13:48:27 +08:00
lyswhut
5b9adc8daa 修复属性计算 2021-04-23 10:57:47 +08:00
lyswhut
3efd6867d8 新增自动换源下载功能 2021-04-22 16:01:47 +08:00
lyswhut
cd1a55652f 修复换源错误的处理 2021-04-18 15:06:21 +08:00
lyswhut
47d0a4a343 修复正在播放“稍后播放”的歌曲时,对“稍后播放”前播放的列表进行添加、删除操作会导致切歌的问题 2021-04-16 16:58:20 +08:00
lyswhut
fe76d103f0 更新依赖 2021-04-16 14:18:53 +08:00
lyswhut
789a9bfe1a 更新依赖 2021-04-15 09:21:35 +08:00
lyswhut
391f97d3bb 修复js加载顺序问题 2021-04-14 16:11:57 +08:00
lyswhut
d077a03e60 优化配色 2021-04-14 15:38:59 +08:00
lyswhut
3317b6a9e5 优化配色 2021-04-14 15:01:55 +08:00
lyswhut
0b0f0e4649 新增黑色皮肤“黑纸白字” 2021-04-14 14:46:57 +08:00
lyswhut
f75e416479 添加黑色皮肤 2021-04-14 13:33:36 +08:00
lyswhut
d83db6bdf5 Merge branch 'dev' into 黑色主题 2021-04-14 08:35:00 +08:00
lyswhut
92ec461a77 修正设置页“搜索设置”部分内容的缩进显示问题 2021-04-13 15:57:25 +08:00
lyswhut
144fe3b8ac 更新依赖 2021-04-10 20:43:20 +08:00
lyswhut
af2e650538 兼容打开咪咕移动端分享的歌单链接,添加打开歌单的信息显示 2021-04-06 15:39:16 +08:00
lyswhut
1c585dc479 分离歌曲URL的缓存 2021-04-05 19:31:07 +08:00
lyswhut
c6853b197c 修复列表清除Bug 2021-04-03 21:31:19 +08:00
lyswhut
ef591c883a 移除列表lrc存储 2021-04-03 21:17:27 +08:00
lyswhut
4918db9cb1 分离歌词与歌曲列表信息的保存 2021-04-03 20:26:28 +08:00
lyswhut
b8250b67c9 升级到 webpack 5 2021-04-03 13:58:10 +08:00
lyswhut
d6f87894aa 更新依赖 2021-04-03 13:12:11 +08:00
lyswhut
c808500083 新增Windows arm64位免安装版的构建 2021-03-31 08:54:47 +08:00
lyswhut
3a6c2be48a 更新依赖 2021-03-29 08:54:55 +08:00
lyswhut
a28d01704a 更新faq 2021-03-27 19:34:45 +08:00
lyswhut
8bed654756 修复聚合搜索总页计算问题 2021-03-24 11:06:18 +08:00
lyswhut
8845884b24 更新发布流程 2021-03-21 13:23:13 +08:00
lyswhut
ea5de9a289 优化歌曲自动换源匹配 2021-03-20 20:55:44 +08:00
lyswhut
7922920f51 修改默认每页条数 2021-03-20 20:19:04 +08:00
lyswhut
dcf6ab0792 清理列表缓存将同时清理歌词 2021-03-20 19:52:02 +08:00
lyswhut
57fe510138 更新网盘链接 2021-03-20 00:10:36 +08:00
lyswhut
b4c7a6e448 自动禁用空代理 2021-03-18 17:30:44 +08:00
lyswhut
1d8702e95f 添加路径提示支持 2021-03-16 11:01:57 +08:00
lyswhut
8171fcd346 序启动时对数据文件做读取校验,数据出现损坏时自动备份损坏的数据 2021-03-14 02:06:35 +08:00
lyswhut
b1ccdeb0d3 修正错误 2021-03-13 16:49:05 +08:00
lyswhut
969b03b364 略微减小翻译字体大小 2021-03-13 15:25:35 +08:00
lyswhut
5ed81132fb 优化错误处理 2021-03-13 14:35:20 +08:00
lyswhut
c663cdbe0d 分离store逻辑 2021-03-13 14:10:36 +08:00
lyswhut
a4d46fd501 修正描述 2021-03-12 22:49:27 +08:00
lyswhut
c3e1ead90a Merge branch 'dhmkh' into dev 2021-03-12 22:42:17 +08:00
lyswhut
92c10eb534 修改协议阅读时间 2021-03-12 16:30:27 +08:00
lyswhut
08d0758616 修复备份与恢复功能在恢复数据时某些设置不立即生效的问题 2021-03-12 16:22:22 +08:00
lyswhut
68d8369a8b 修正单词拼写错误 2021-03-12 09:02:40 +08:00
lyswhut
af59a4472a 调整翻译字体大小 2021-03-11 17:34:29 +08:00
lyswhut
269546add1 Merge branch 'dev' 2021-03-10 10:23:50 +08:00
lyswhut
65246f8856 修正beta打包规则 2021-03-10 10:22:19 +08:00
lyswhut
ab35fe793d Merge branch 'dev' 2021-03-10 10:20:34 +08:00
lyswhut
e7b897e67c 优化打包命令 2021-03-10 10:19:49 +08:00
lyswhut
0b5dbb464d Merge branch 'dev' 2021-03-10 09:36:04 +08:00
lyswhut
60419f4319 修正徽章地址 2021-03-10 09:35:48 +08:00
lyswhut
1ddf0db18d 重命名beta打包工作流文件名 2021-03-10 09:34:43 +08:00
lyswhut
0732ca37b8 优化打包规则 2021-03-10 09:33:04 +08:00
lyswhut
801ea899e6 迁移到GitHub Actions 2021-03-10 09:21:43 +08:00
lyswhut
ba5159d2ad 修复Linux构建错误 2021-03-10 01:39:08 +08:00
lyswhut
ab2cf5a50f 修正错误,添加dev构建 2021-03-10 01:34:58 +08:00
lyswhut
d533c12315 修复Linux配置 2021-03-10 01:24:28 +08:00
lyswhut
1d90719053 Merge branch 'dev' 2021-03-10 01:18:49 +08:00
lyswhut
127d279266 修正语法错误 2021-03-10 01:15:30 +08:00
lyswhut
a484f66e69 修正语法错误 2021-03-10 01:02:30 +08:00
lyswhut
b34924e264 Merge branch 'dev' 2021-03-10 00:59:36 +08:00
lyswhut
4d5494c256 更新文件夹名 2021-03-10 00:59:06 +08:00
lyswhut
46b094a57a Merge branch 'dev' 2021-03-10 00:51:44 +08:00
lyswhut
0ef89c30e3 更新更新日志 2021-03-10 00:50:55 +08:00
lyswhut
dc2a89ce3f Merge branch 'dev' 2021-03-10 00:47:42 +08:00
lyswhut
47adcfec30 添加缓存 2021-03-10 00:42:27 +08:00
lyswhut
25e848702f 更新依赖 2021-03-10 00:42:15 +08:00
lyswhut
756a285978 修复收藏的在线列表id迁移保存出错的问题 2021-03-10 00:41:38 +08:00
lyswhut
fcf79bda03 Merge branch 'dev' 2021-03-09 22:55:20 +08:00
lyswhut
6b170f3116 尝试迁移到GitHub Actions 2021-03-09 22:50:08 +08:00
lyswhut
ea6bc245ff Merge branch 'dev' 2021-03-09 20:50:50 +08:00
lyswhut
61dc344d89 发布v1.8.2 2021-03-09 20:49:49 +08:00
lyswhut
fa6b7eacaa 修复歌曲ID存储变更导致酷狗图片获取失败的问题 2021-03-09 17:40:33 +08:00
lyswhut
23dafe539d 修正错误 2021-03-08 19:20:49 +08:00
lyswhut
0a654efda0 修改api窗口名 2021-03-07 21:43:00 +08:00
lyswhut
bec10ebe34 Merge branch 'dev' 2021-03-07 17:56:13 +08:00
lyswhut
0e03ca5d48 发布v1.8.1 2021-03-07 17:55:04 +08:00
lyswhut
4b1bf29ea0 新增启动参数-dhmkh 2021-03-07 17:54:02 +08:00
lyswhut
b391b2c16d 添加链接锚点 2021-03-07 17:53:24 +08:00
lyswhut
7b9cf93b40 修复歌词翻译的主题颜色适配问题 2021-03-07 15:07:22 +08:00
lyswhut
dd55e5e086 修改api窗口名 2021-03-07 13:30:47 +08:00
lyswhut
ba2b1dac92 Merge branch 'dev' 2021-03-07 12:38:11 +08:00
lyswhut
56ffeb3008 发布v1.8.0 2021-03-07 12:36:57 +08:00
lyswhut
b3757fd6b5 修复在下载列表右击未下载完成的歌曲弹出的右击菜单中没有开始下载选项的问题 2021-03-07 12:22:53 +08:00
lyswhut
e0de81230e Merge branch 'api' into dev 2021-03-07 12:01:59 +08:00
lyswhut
2bc669c828 添加更新日志 2021-03-07 01:29:23 +08:00
lyswhut
493f7809a4 优化歌词特殊字符移除 2021-03-07 01:22:25 +08:00
lyswhut
ef52cd6991 Merge branch 'dev' into lrc 2021-03-07 01:18:54 +08:00
lyswhut
480f15b6f6 优化酷狗搜索结果 2021-03-07 01:18:44 +08:00
lyswhut
fcfee88ef4 移除日志打印 2021-03-07 00:56:00 +08:00
lyswhut
19f647e6ab Merge branch 'dev' into lrc 2021-03-04 15:27:45 +08:00
lyswhut
27e5ec02f4 优化单首歌曲的“添加到列表”弹窗歌曲列表状态的显示 2021-03-04 15:27:29 +08:00
lyswhut
0808d77a2d 修复鼠标显示状态 2021-03-04 14:33:23 +08:00
lyswhut
90d9e9b911 修复歌词缩放设置失效的问题 2021-03-04 13:20:19 +08:00
lyswhut
ebfbc11c20 Merge branch 'dev' into lrc 2021-03-03 17:21:13 +08:00
lyswhut
2764743062 更新说明 2021-03-03 16:52:19 +08:00
lyswhut
c66d7d6187 完善歌词 2021-03-03 16:51:02 +08:00
lyswhut
f2b6c0a443 支持桌面歌词拖动 2021-03-02 18:41:27 +08:00
lyswhut
aef0ffa506 修改桌面歌词为逐字播放 2021-03-02 18:10:12 +08:00
lyswhut
040fcfba4f 初步完善歌词 2021-03-02 08:32:26 +08:00
lyswhut
9f72831e4a 更新依赖 2021-02-23 19:51:01 +08:00
lyswhut
fa0d9ad4c3 新增启动参数-play 2021-02-22 12:59:39 +08:00
lyswhut
b6107b7281 优化列表存储逻辑 2021-02-21 16:19:08 +08:00
lyswhut
6ffe61562b 移除自动换源清理 2021-02-21 15:46:19 +08:00
lyswhut
b5f5e13f22 移除xm verify窗口 2021-02-21 12:34:50 +08:00
lyswhut
376b7545e1 修复我的列表的灰色歌曲会显示下载按钮的问题 2021-02-20 01:01:58 +08:00
lyswhut
ffaa3e591b 修复kg获取图片失败的错误处理 2021-02-20 00:50:00 +08:00
lyswhut
24d5722ef7 移除log 2021-02-19 22:10:37 +08:00
lyswhut
9e1fe0a6c1 移除多余代码 2021-02-19 21:59:58 +08:00
lyswhut
d128aeb6ef 修复kg歌曲详情页的歌曲无法播放的问题 2021-02-19 11:47:25 +08:00
lyswhut
ef371dedb4 修正描述 2021-02-15 19:53:46 +08:00
lyswhut
00d262f0e6 修复mg源歌单列表无法加载的问题 2021-02-15 12:40:12 +08:00
lyswhut
475b8924c3 修复歌单列表加载失败时无法进入歌单打开界面的问题 2021-02-15 10:52:29 +08:00
lyswhut
0afb1417a3 修复下载列表数据存储问题 2021-02-06 00:09:09 +08:00
lyswhut
b6b41660d6 移除未使用的变量 2021-02-05 23:07:36 +08:00
lyswhut
c78811fe36 移除虾米源,允许播放除了搜索列表以外的所有歌曲 2021-02-05 23:06:08 +08:00
lyswhut
a0254eb4f2 优化英文名歌曲匹配 2021-02-04 17:26:11 +08:00
lyswhut
e9c96ecde2 修复搜索列表双击不支持播放的源时会导致切歌的问题 2021-02-04 14:37:52 +08:00
lyswhut
f9cbf9254c 新增设置-其他-列表缓存信息清理功能 2021-02-02 15:08:07 +08:00
lyswhut
70d24ffdfd 修复音乐搜索列表的稍后播放功能无效的问题 2021-02-01 18:26:26 +08:00
lyswhut
84530ca0a2 添加网盘无法打开的提示 2021-02-01 16:17:57 +08:00
lyswhut
e848fda4e3 将下载列表与我的列表分离存储 2021-02-01 14:55:39 +08:00
lyswhut
51964e51c6 Merge branch 'dev' 2021-01-30 14:33:58 +08:00
lyswhut
0c63268df1 发布v1.7.1版本 2021-01-30 14:30:05 +08:00
lyswhut
316f62c3c8 修复MAC下xm音乐滑块验证问题 2021-01-30 14:29:20 +08:00
lyswhut
9e37800426 修复非透明模式下右侧滚动条无法拖动的问题 2021-01-30 14:18:12 +08:00
lyswhut
3e0ee374c9 移除对changelog的html对version.json的写入 2021-01-30 13:46:46 +08:00
lyswhut
bb411a365c Merge branch 'dev' 2021-01-30 13:17:47 +08:00
lyswhut
da0878a7a7 更新依赖到最新 2021-01-30 13:15:32 +08:00
lyswhut
d0328f17e1 发布v1.7.0版本 2021-01-30 13:14:33 +08:00
lyswhut
c6f49984a7 修改默认弹出层动画 2021-01-30 12:53:39 +08:00
lyswhut
f53fb071f0 更新electron到9.4.2 2021-01-29 22:24:37 +08:00
lyswhut
2cc8af71d0 修复自动换源遇到不支持的源时报错的问题 2021-01-29 10:18:48 +08:00
lyswhut
006da66028 导出歌单移除换源信息 2021-01-28 14:09:22 +08:00
lyswhut
2a74abdef4 修复xm源验证问题 2021-01-28 10:22:26 +08:00
lyswhut
269b14394d 修复了一个由版本更新日志显示导致的潜在远程代码执行攻击漏洞 2021-01-27 19:20:29 +08:00
lyswhut
d6d6fae2ca 禁止打开非http协议链接 2021-01-26 08:43:07 +08:00
lyswhut
331afc37df 新增“记住播放进度”功能的控制,优化设置项展示 2021-01-25 10:44:03 +08:00
lyswhut
041bfdaf3c 修复切换音乐来源可能无法切歌的问题 2021-01-23 19:36:29 +08:00
lyswhut
023cd15cd0 调整加载动画速度 2021-01-23 16:45:01 +08:00
lyswhut
f2fb37df4c 修复快速切换歌曲时, 会出现播放的歌曲和界面展示的歌曲不一致的问题 2021-01-23 16:33:12 +08:00
lyswhut
c4ae0dddb0 修改自动更新阶段的描述 2021-01-23 15:43:14 +08:00
lyswhut
f66077f012 修复手动切歌不清除稍后播放列表的问题 2021-01-23 14:56:57 +08:00
lyswhut
a31d6bc5ae 修改菜单大小 2021-01-23 14:42:01 +08:00
lyswhut
fad13f517b 更新electron到9.4.1 2021-01-21 16:26:46 +08:00
lyswhut
ef36517a26 修复恢复播放会导致重复播放的问题 2021-01-21 15:16:46 +08:00
lyswhut
085e45a50f 新增“稍后播放”功能 2021-01-21 14:39:37 +08:00
lyswhut
43b06a686b 修改构建命令 2021-01-20 14:55:34 +08:00
lyswhut
e8dba4d133 优化播放歌曲换源匹配规则 2021-01-18 16:28:11 +08:00
lyswhut
1af3cd1d77 优化播放歌曲换源匹配 2021-01-18 16:21:57 +08:00
lyswhut
4c44310fea 移除下面热搜词的加载 2021-01-16 01:11:55 +08:00
lyswhut
3e343a80fd 搜索界面新增搜索状态的提示 2021-01-16 01:11:17 +08:00
lyswhut
313fac9f18 Merge branch 'dev' 2021-01-13 21:35:00 +08:00
lyswhut
2c242c66e5 发布v1.6.1版本 2021-01-13 21:34:28 +08:00
lyswhut
4e2b525c99 移除initTOC调用 2021-01-13 14:06:59 +08:00
lyswhut
93c76d4ba0 添加参数修改说明 2021-01-13 14:05:47 +08:00
lyswhut
b69ecca252 修改目录 2021-01-13 11:16:16 +08:00
lyswhut
947011103c 降级electron到9.3.3修复部分系统没有声音的问题 2021-01-13 11:14:53 +08:00
lyswhut
2fd7e4503a 修复自动换源导致的搜索列表每页变成10条数据的问题 2021-01-12 11:42:56 +08:00
lyswhut
a5fce15661 改进自动换源时的歌曲匹配 2021-01-12 11:09:27 +08:00
lyswhut
f1561ddc21 修复某些情况下自动换源的时间过长时会终止换源自动切歌的问题 2021-01-11 16:21:08 +08:00
lyswhut
74ce094d79 更新无法试听解决方法 2021-01-11 14:12:58 +08:00
lyswhut
f832d70701 更新-dha参数的描述 2021-01-10 13:14:50 +08:00
lyswhut
24521bf50d Merge branch 'dev' 2021-01-10 12:53:15 +08:00
lyswhut
cfe84fc2dd 发布v1.6.0版本 2021-01-10 12:52:45 +08:00
lyswhut
8efeb169af 优化歌曲匹配 2021-01-09 21:10:58 +08:00
lyswhut
7b7711d410 Merge branch 'dev' into 黑色主题 2021-01-09 20:32:55 +08:00
lyswhut
8b0779ac17 修复对dt参数的读取 2021-01-09 20:13:32 +08:00
lyswhut
1e904e5ebb 优化自动换源功能 2021-01-09 19:40:31 +08:00
lyswhut
1d3b93d4a3 更新依赖 2021-01-09 18:28:51 +08:00
lyswhut
7756b62f4c 优化歌曲匹配规则 2021-01-09 15:15:52 +08:00
lyswhut
7990e841e0 优化歌曲查找匹配功能 2021-01-09 01:15:20 +08:00
lyswhut
ae348a71e6 移除log 2021-01-09 00:48:59 +08:00
lyswhut
9a1a537bfd 新增播放自动换源功能 2021-01-09 00:45:15 +08:00
lyswhut
6b7d2ea657 整理代码 2021-01-08 22:57:10 +08:00
lyswhut
98ef7c2385 新增-dha参数,修复-nt启动参数不真正生效的问题 2021-01-08 22:09:08 +08:00
lyswhut
093bfd26a3 我的列表右键菜单添加搜索当前歌曲功能 2021-01-06 15:04:00 +08:00
lyswhut
9953c61d62 添加对tips实例的销毁处理 2021-01-03 14:07:50 +08:00
lyswhut
e61072ddc9 更新快速隐藏详情页英文翻译 2021-01-03 01:24:06 +08:00
lyswhut
2269cd54be 隐藏播放详情页按钮添加快速隐藏详情页提示 2021-01-03 01:22:25 +08:00
lyswhut
76d5e64097 添加桌面歌词字体、透明度调整按钮微调提示 2021-01-03 01:11:08 +08:00
lyswhut
06073f3982 添加鼠标提示的自动关闭功能 2021-01-03 00:46:13 +08:00
lyswhut
0f71a93c5e 添加鼠标指向歌曲封面的提示 2021-01-03 00:04:33 +08:00
lyswhut
fa41c32a3e 更新依赖 2020-12-26 10:20:10 +08:00
lyswhut
3b00efdeae Merge branch 'dev' into 黑色主题 2020-12-24 17:22:30 +08:00
lyswhut
0f323ce04f Merge branch 'dev' 2020-12-24 17:22:22 +08:00
lyswhut
ad2acc2a16 更新更新日志 2020-12-24 17:20:27 +08:00
lyswhut
162fea6e28 移除多余文件 2020-12-24 17:17:54 +08:00
lyswhut
30e939c354 更新electron版本到9.5.0 2020-12-24 14:27:57 +08:00
lyswhut
94c25b5dcb 优化列表排序弹窗界面 2020-12-24 14:27:44 +08:00
lyswhut
a58d65e8af 修复恢复上次播放的歌曲时在随机播放模式下不把恢复播放的歌曲放入已播放队列的问题 2020-12-24 11:33:01 +08:00
lyswhut
06b453ebe7 新增歌曲下载失败FAQ 2020-12-23 17:03:38 +08:00
lyswhut
f00c6b1cb6 更新Linux桌面歌词说明 2020-12-19 15:39:33 +08:00
lyswhut
027466dfc2 更新排序说明 2020-12-19 15:19:24 +08:00
lyswhut
bc69a98df1 我的列表右键菜单新增列表排序功能 2020-12-19 15:16:22 +08:00
lyswhut
ba9fd8d1f1 新增 更新已收藏的在线歌单 问答 2020-12-18 19:36:38 +08:00
lyswhut
0fcc3f257d 修正描述 2020-12-18 19:36:29 +08:00
lyswhut
382235c556 移除多余代码 2020-12-13 13:30:21 +08:00
lyswhut
0a919d7076 修复getAttribute的报错 2020-12-13 12:32:55 +08:00
lyswhut
0709aa56a4 Merge branch 'dev' 2020-12-13 11:48:17 +08:00
lyswhut
684d90d0e7 发布v1.5.0 2020-12-13 11:47:46 +08:00
lyswhut
227c05a696 降级electron到9.3.3 2020-12-12 21:00:58 +08:00
lyswhut
8cf1a4a790 更新依赖 2020-12-12 19:35:10 +08:00
lyswhut
75e3976bfa 添加同步歌单状态指示 2020-12-12 09:41:31 +08:00
lyswhut
e9791fd493 修正进度条状态 2020-12-12 09:26:15 +08:00
lyswhut
f9f445489c Update template 2020-12-11 08:34:47 +08:00
lyswhut
10e5460e39 优化软件启动时恢复上一次播放的歌曲进度功能 2020-12-11 08:29:30 +08:00
lyswhut
f1049169b5 直接从歌单详情收藏的列表新增同步功能 2020-12-10 12:57:48 +08:00
lyswhut
2056bdb43d 搜索框为空时不进行歌单打开 2020-12-07 17:32:21 +08:00
lyswhut
785bf3ce3a 添加Linux arm64 deb包的构建 2020-12-06 22:54:03 +08:00
lyswhut
c29bf61e59 修复某些酷狗源歌单链接无法打开的问题 2020-12-06 21:33:39 +08:00
lyswhut
a98c0516a3 修复酷狗源的某些歌曲没有专辑字段导致的列表加载失败问题 2020-12-06 21:17:18 +08:00
lyswhut
a6989a2aba 移除log 2020-12-04 21:34:11 +08:00
lyswhut
30e43170f8 修复MAC平台首次运行软件最小化、关闭控制按钮默认在右边的问题 2020-11-30 09:59:38 +08:00
lyswhut
d8feb3e794 修改相对路径别名 2020-11-28 20:23:17 +08:00
lyswhut
99bdf6d173 增加歌曲加载等待时间 2020-11-28 20:22:58 +08:00
lyswhut
8424a9e4de 降级node-id3修复MAC平台上下载歌曲封面嵌入无法显示的问题 2020-11-28 20:22:33 +08:00
lyswhut
4c0cbe3253 Merge branch 'dev' 2020-11-25 08:27:53 +08:00
lyswhut
462dc5da51 发布v1.4.1版本 2020-11-25 08:26:43 +08:00
lyswhut
40fad5f785 调整FAQ顺序 2020-11-24 15:17:04 +08:00
lyswhut
c0791acbf6 修复某些电脑上的某些歌曲没有声音的问题 2020-11-24 15:16:46 +08:00
lyswhut
3cb0a56647 修复歌曲URL过期时,等待刷新URL的自动切换歌曲时间间隔太短的问题 2020-11-23 10:18:35 +08:00
lyswhut
95f38e8048 修复有歌词翻译与无歌词的音乐间切换会导致歌词翻译残留显示的问题 2020-11-22 11:06:45 +08:00
lyswhut
a3493a6c74 Merge branch 'dev' 2020-11-21 19:01:16 +08:00
lyswhut
3535bb4e4e 发布v01.4.0 2020-11-21 19:00:35 +08:00
lyswhut
3be6242cb5 更新多选说明 2020-11-20 10:55:23 +08:00
lyswhut
64a53830e4 新增播放进度信息保存 2020-11-19 15:52:00 +08:00
lyswhut
b3e3860b23 修复kg源歌曲信息带有单引号等特殊字符被转义的问题 2020-11-17 17:14:47 +08:00
lyswhut
4db560fb4b 修复移动单首歌曲时出现的问题 2020-11-15 14:08:11 +08:00
lyswhut
b00de4d976 托盘菜单新增显示、隐藏主界面选项,为Linux、MAC版添加托盘菜单 2020-11-14 22:29:27 +08:00
lyswhut
0a0d6969ec 初始提交 2020-11-14 11:48:51 +08:00
lyswhut
ac162103a7 更新依赖 2020-11-14 10:22:47 +08:00
lyswhut
16876502d1 修复播放状态栏切换“上一首”歌曲按钮提示错误的问题 2020-11-13 14:57:45 +08:00
lyswhut
4cdd2110a6 更新依赖 2020-11-10 10:59:45 +08:00
lyswhut
b820adf0bf 优化切歌逻辑 2020-11-10 08:33:07 +08:00
lyswhut
1cee2febf4 修复专辑图片无法嵌入的问题 2020-11-10 08:31:47 +08:00
lyswhut
43f8d9d72b 更新FAQ问题顺序 2020-11-06 21:33:27 +08:00
lyswhut
66ffe03224 修改评论按钮提示 2020-11-04 09:08:18 +08:00
lyswhut
5c96c83f98 移除kg源的歌词文件开头的空白字符串 2020-11-02 15:13:09 +08:00
1042 changed files with 105403 additions and 43334 deletions

View File

@@ -1,21 +0,0 @@
platform:
- x64
cache:
- node_modules
- '%APPDATA%\npm-cache'
- '%LOCALAPPDATA%\electron\Cache'
- '%LOCALAPPDATA%\electron-builder\Cache'
install:
- ps: Install-Product node 12 x64
- npm install
build_script:
- npm run publish:gh
test: off
branches:
only:
- master

View File

@@ -1,24 +0,0 @@
{
"presets": [
[
"@babel/preset-env",
{
"corejs": "3",
"useBuiltIns": "usage"
}
],
[
"minify",
{
"builtIns": false,
"evaluate": false,
"mangle": false
}
]
],
"plugins": [
"@babel/plugin-syntax-dynamic-import",
"@babel/plugin-transform-modules-umd",
"@babel/plugin-transform-runtime"
]
}

View File

@@ -1,24 +0,0 @@
{
"extends": "standard",
"plugins": [
"html"
],
"parser": "babel-eslint",
"rules": {
"no-new": "off",
"camelcase": "off",
"no-return-assign": "off",
"space-before-function-paren": ["error", "never"],
"no-var": "error",
"no-fallthrough": "off",
"prefer-promise-reject-errors": "off",
"eqeqeq": "off",
"no-multiple-empty-lines": [1, {"max": 2}],
"comma-dangle": [2, "always-multiline"],
"standard/no-callback-literal": "off",
"prefer-const": "off"
},
"settings": {
"html/html-extensions": [".html", ".vue"]
}
}

97
.eslintrc.base.cjs Normal file
View File

@@ -0,0 +1,97 @@
const baseRule = {
'no-new': 'off',
camelcase: 'off',
'no-return-assign': 'off',
'space-before-function-paren': ['error', 'never'],
'no-var': 'error',
'no-fallthrough': 'off',
eqeqeq: 'off',
'require-atomic-updates': ['error', { allowProperties: true }],
'no-multiple-empty-lines': [1, { max: 2 }],
'comma-dangle': [2, 'always-multiline'],
'standard/no-callback-literal': 'off',
'prefer-const': 'off',
'no-labels': 'off',
'node/no-callback-literal': 'off',
'multiline-ternary': 'off',
}
const typescriptRule = {
...baseRule,
'@typescript-eslint/strict-boolean-expressions': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/space-before-function-paren': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/restrict-template-expressions': [1, {
allowBoolean: true,
allowAny: true,
}],
'@typescript-eslint/restrict-plus-operands': [1, {
allowBoolean: true,
allowAny: true,
}],
'@typescript-eslint/no-misused-promises': [
'error',
{
checksVoidReturn: {
arguments: false,
attributes: false,
},
},
],
'@typescript-eslint/naming-convention': 'off',
'@typescript-eslint/return-await': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/comma-dangle': 'off',
'@typescript-eslint/no-unsafe-argument': 'off',
}
const vueRule = {
...typescriptRule,
'vue/multi-word-component-names': 'off',
'vue/max-attributes-per-line': 'off',
'vue/singleline-html-element-content-newline': 'off',
'vue/use-v-on-exact': 'off',
}
exports.base = {
extends: ['standard'],
rules: baseRule,
}
exports.html = {
files: ['*.html'],
plugins: ['html'],
}
exports.typescript = {
files: ['*.ts'],
rules: typescriptRule,
parser: '@typescript-eslint/parser',
extends: [
'standard-with-typescript',
],
}
exports.vue = {
files: ['*.vue'],
rules: vueRule,
parser: 'vue-eslint-parser',
extends: [
// 'plugin:vue/vue3-essential',
'plugin:vue/base',
'plugin:vue/vue3-recommended',
'plugin:vue-pug/vue3-recommended',
// "plugin:vue/strongly-recommended"
'standard-with-typescript',
],
parserOptions: {
sourceType: 'module',
parser: {
// Script parser for `<script>`
js: '@typescript-eslint/parser',
// Script parser for `<script lang="ts">`
ts: '@typescript-eslint/parser',
},
extraFileExtensions: ['.vue'],
},
}

20
.eslintrc.cjs Normal file
View File

@@ -0,0 +1,20 @@
const { base, typescript } = require('./.eslintrc.base.cjs')
module.exports = {
root: true,
...base,
overrides: [
{
...typescript,
parserOptions: {
project: './tsconfig.json',
},
},
],
ignorePatterns: [
'node_modules',
'*.min.js',
'dist',
'build',
],
}

View File

@@ -1,22 +0,0 @@
---
name: 功能请求(请先查看常见问题及搜索issue列表中有无你要提的问题)
about: 为这个项目提出一个想法
title: 例如添加xxx功能、优化xxx功能
labels: ''
assignees: ''
---
**解决方案检查**
<!-- 请确保你已从以下渠道寻找过解决方案,然后将 [ ] 替换成 [x] -->
- [ ] 我已阅读常见问题(<https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md>)
- [ ] 我已搜索issue列表(<https://github.com/lyswhut/lx-music-desktop/issues?utf8=✓&q=>)
**描述您想要的解决方案**
简洁明了地描述您要发生的事情。
**描述您考虑过的替代方案**
对您考虑过的所有替代解决方案或功能的简洁明了的描述。
**其他内容**
在此处添加有关功能请求的任何其他上下文或屏幕截图(直接把图片拖到编辑框即可添加图片)。

View File

@@ -1,36 +0,0 @@
---
name: 报告Bug(请先查看常见问题及搜索issue列表中有无你要提的问题)
about: 创建报告以帮助我们改进
title: 例如:音乐无法播放
labels: ''
assignees: ''
---
**解决方案检查**
<!-- 请确保你已从以下渠道寻找过解决方案,然后将 [ ] 替换成 [x] -->
- [ ] 我已阅读常见问题(<https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md>)
- [ ] 我已搜索issue列表(<https://github.com/lyswhut/lx-music-desktop/issues?utf8=✓&q=>)
**描述错误**
清楚简洁地说明错误是什么。
**重现**
重现行为的步骤:
1.转到“ ...”
2.点击“ ....”
3.向下滚动到“ ....”
4.看到错误
**预期行为**
对您期望发生的事情的简洁明了的描述。
**截图**
如果适用,请添加屏幕截图以帮助解释您的问题(直接把图片拖到编辑框即可添加图片)。
**环境:**
  -操作系统及版本:[例如Windows 10 64位 18362.156]
  -软件安装包及版本:[例如Windows 64位绿色版 1.0.0]
**其他内容**
在此处添加有关该问题的任何其他上下文。

59
.github/ISSUE_TEMPLATE/bug.yml vendored Normal file
View File

@@ -0,0 +1,59 @@
name: 🐞 报告错误
description: 报告一个错误Bug请先查看常见问题及搜索 Issue 列表中有无你要提的问题。
title: "[Bug]: "
body:
- type: checkboxes
id: check-answer
attributes:
label: 解决方案检查
description: 请确保你已完成以下所有操作。
options:
- label: 我已阅读 [常见问题](https://lyswhut.github.io/lx-music-doc/desktop/faq),并没有找到解决方案。
required: true
- label: 我已搜索 [Issue 列表](https://github.com/lyswhut/lx-music-desktop/issues?q=is%3Aissue+),并没有发现类似的问题。
required: true
- type: textarea
id: expected-behavior
attributes:
label: 预期行为
description: 对期望发生的事情的清晰简明描述。
validations:
required: true
- type: textarea
id: actual-behavior
attributes:
label: 实际行为
description: 对实际发生的事情的清晰简明描述。
validations:
required: true
- type: input
id: version
attributes:
label: LX Music 版本
description: 你使用什么版本的 LX Music
placeholder: 例如 2.9.0
validations:
required: true
- type: input
id: last-known-working-version
attributes:
label: 最后正常的版本
description: 如果有,请在此处填写最后正常的版本。
placeholder: 例如 2.8.0
- type: input
id: operating-system-version
attributes:
label: 操作系统版本
description: |
你使用什么版本的操作系统?
在 macOS 上单击「Apple 菜单 > 关于本机」;
在 Linux 上,执行 `lsb_release` 或 `uname -a` 命令;
在 Windows 上,单击「开始按钮 > 设置 > 系统 > 关于」。
placeholder: "例如 Windows 11 版本 24H2、macOS Sequoia 15.1.1 或 Ubuntu 24.10"
validations:
required: true
- type: textarea
id: additional-information
attributes:
label: 附加信息
description: 如果你的问题需要进一步解释,或者你所遇到的问题不容易重现,请在此处添加更多信息。(直接把图片/视频拖到编辑框即可添加图片/视频)

38
.github/ISSUE_TEMPLATE/feature.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
name: ✨ 功能请求
description: 为这个项目提出一个想法,请先查看常见问题及搜索 Issue 列表中有无你要提的问题。
title: "[Feature]: "
body:
- type: checkboxes
id: check-answer
attributes:
label: 解决方案检查
description: 请确保你已完成以下所有操作。
options:
- label: 我已阅读 [常见问题](https://lyswhut.github.io/lx-music-doc/desktop/faq),但没有找到解决方案。
required: true
- label: 我已搜索 [Issue 列表](https://github.com/lyswhut/lx-music-desktop/issues?q=is%3Aissue+),但没有发现类似的问题。
required: true
- type: textarea
id: problem-description
attributes:
label: 问题描述
description: 请添加清晰简洁的描述,说明你希望通过此功能请求解决的问题。
validations:
required: true
- type: textarea
id: proposed-solution
attributes:
label: 描述你想要的解决方案
description: 简洁明了地描述你要发生的事情。
validations:
required: true
- type: textarea
id: alternatives-considered
attributes:
label: 描述你考虑过的替代方案
description: 对你考虑过的所有替代解决方案或功能的简洁明了的描述。
- type: textarea
id: additional-information
attributes:
label: 附加信息
description: 如果你的问题需要进一步解释,或者想要表达其他内容,请在此处添加更多信息。(直接把图片/视频拖到编辑框即可添加图片/视频)

28
.github/actions/setup/action.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: Setup
description: Setup Node Env
runs:
using: composite
steps:
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '22'
# - name: Get npm cache directory
# run: node -p -e '`NPM_CACHE_DIR=${require("child_process").execSync("npm config get cache").toString()}`' >> $GITHUB_ENV
# run: echo "NPM_CACHE_DIR=$(npm config get cache)" >> $GITHUB_ENV
# https://docs.npmjs.com/cli/v10/configuring-npm/folders#cache
- name: Cache node modules
id: cache-npm
uses: actions/cache@v5
with:
path: ${{ env.NPM_CACHE }}
key: ${{ runner.os }}-npm-cache-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-cache-
- name: Install dependencies
run: npm ci
shell: bash

291
.github/workflows/beta-pack.yml vendored Normal file
View File

@@ -0,0 +1,291 @@
name: Build Beta
on:
push:
branches:
- beta
env:
IS_CI: 'true'
jobs:
# CheckCode:
# name: Lint Code
# runs-on: ubuntu-latest
# steps:
# - name: Check out git repository
# uses: actions/checkout@v6
# - name: Install Node.js
# uses: actions/setup-node@v4
# with:
# node-version: 20
# - name: Cache file
# uses: actions/cache@v4
# with:
# path: |
# node_modules
# $HOME/.cache/electron
# $HOME/.cache/electron-builder
# $HOME/.npm/_prebuilds
# key: ${{ runner.os }}-build-caches-${{ hashFiles('**/package-lock.json') }}
# restore-keys: |
# ${{ runner.os }}-build-
# - name: Install Dependencies
# run: |
# npm ci
# - name: Lint src code
# run: npm run lint
Windows:
name: Windows
runs-on: windows-latest
# needs: CheckCode
steps:
- name: Check out git repository
uses: actions/checkout@v6
- name: Get npm cache directory
shell: pwsh
run: echo "NPM_CACHE=$(npm config get cache)" >> $env:GITHUB_ENV
- name: Setup Node Env
env:
NPM_CACHE: ${{ env.NPM_CACHE }}
uses: ./.github/actions/setup
- name: Build src code
run: |
git status --porcelain
npm run build
- name: Build Package Setup x64
run: npm run pack:win:setup:x64
- name: Upload Artifact Setup x64
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-x64-Setup
path: build/*-x64-Setup.exe
- name: Build Package 7z x64
run: npm run pack:win:7z:x64
- name: Upload Artifact 7z x64
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-win_x64-green
path: build/*win_x64-green.7z
- name: Build Package Setup arm64
run: npm run pack:win:setup:arm64
- name: Upload Artifact Setup arm64
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-arm64-Setup
path: build/*-arm64-Setup.exe
- name: Build Package 7z arm64
run: npm run pack:win:7z:arm64
- name: Upload Artifact 7z arm64
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-win_arm64-green
path: build/*win_arm64-green.7z
- name: Generate file MD5
run: |
cd build
Get-FileHash *.exe,*.7z -Algorithm MD5 | Format-List
Windows_7:
name: Windows_7
runs-on: windows-latest
env:
BUILD_WIN7: true
# needs: CheckCode
steps:
- name: Check out git repository
uses: actions/checkout@v6
- name: Get npm cache directory
shell: pwsh
run: echo "NPM_CACHE=$(npm config get cache)" >> $env:GITHUB_ENV
- name: Setup Node Env
env:
NPM_CACHE: ${{ env.NPM_CACHE }}
uses: ./.github/actions/setup
- name: Prepare win7 undici env
run: |
npm install undici@5
Set-Content -Path .\src\common\utils\request.ts -Value "export * from './request_node16'"
- name: Build src code
env:
BUILD_WIN7: true
run: |
git status --porcelain
npm run build
- name: Prepare win7 electron env
run: |
npm install electron@22 better-sqlite3@12
pip.exe install setuptools
- name: Build Package win7 Setup x64
run: npm run pack:win7:setup:x64
- name: Upload Artifact win7 Setup x64
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-win7_x64-Setup
path: build/*win7_x64-Setup.exe
- name: Build Package win7 7z x64
run: npm run pack:win7:7z:x64
- name: Upload Artifact win7 7z x64
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-win7_x64-green
path: build/*win7_x64-green.7z
- name: Build Package win7 7z x86
run: npm run pack:win7:7z:x86
- name: Upload Artifact win7 7z x86
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-win7_x86-green
path: build/*win7_x86-green.7z
- name: Generate file MD5
run: |
cd build
Get-FileHash *.exe,*.7z -Algorithm MD5 | Format-List
Mac:
name: Mac
runs-on: macos-latest
# needs: CheckCode
steps:
- name: Check out git repository
uses: actions/checkout@v6
- name: Install python setuptools
run: brew install python-setuptools
- name: Get npm cache directory
shell: bash
run: echo "NPM_CACHE=$(npm config get cache)" >> $GITHUB_ENV
- name: Setup Node Env
env:
NPM_CACHE: ${{ env.NPM_CACHE }}
uses: ./.github/actions/setup
- name: Build src code
run: |
git status --porcelain
npm run build
- name: Build Package dmg
run: |
npm run pack:mac:dmg
npm run pack:mac:dmg:arm64
- name: Upload Artifact dmg
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-mac-dmg
path: |
build/*.dmg
!build/*-arm64.dmg
- name: Upload Artifact dmg
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-mac-dmg-arm64
path: build/*-arm64.dmg
- name: Generate file MD5
run: |
cd build
md5 *.dmg
Linux:
name: Linux
runs-on: ubuntu-latest
# needs: CheckCode
steps:
- name: Install package
run: sudo apt-get update && sudo apt-get install -y rpm libarchive-tools
- name: Check out git repository
uses: actions/checkout@v6
- name: Get npm cache directory
shell: bash
run: echo "NPM_CACHE=$(npm config get cache)" >> $GITHUB_ENV
- name: Setup Node Env
env:
NPM_CACHE: ${{ env.NPM_CACHE }}
uses: ./.github/actions/setup
- name: Build src code
run: |
git status --porcelain
npm run build
- name: Build Package deb amd64
run: npm run pack:linux:deb:amd64
- name: Upload Artifact deb amd64
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-deb-amd64
path: build/*_amd64.deb
- name: Build Package deb arm64
run: npm run pack:linux:deb:arm64
- name: Upload Artifact deb arm64
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-deb-arm64
path: build/*_arm64.deb
- name: Build Package deb armv7l
run: npm run pack:linux:deb:armv7l
- name: Upload Artifact deb armv7l
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-deb-armv7l
path: build/*_armv7l.deb
- name: Build Package x64 appImage
run: npm run pack:linux:appImage
- name: Upload Artifact x64 appImage
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-x64-appImage
path: build/*_x64.AppImage
- name: Build Package x64 rpm
run: npm run pack:linux:rpm
- name: Upload Artifact x64 rpm
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-x64-rpm
path: build/*.x64.rpm
- name: Build Package x64 pacman
run: npm run pack:linux:pacman
- name: Upload Artifact x64 pacman
uses: actions/upload-artifact@v7
with:
name: lx-music-desktop-x64-pacman
path: build/*_x64.pacman
- name: Generate file MD5
run: |
cd build
md5sum *.deb *.rpm *.pacman *.AppImage

28
.github/workflows/build-test.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: Run build test
on:
pull_request:
branches:
- dev
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Check out git repository
uses: actions/checkout@v6
- name: Install Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Install Dependencies
run: npm ci
- name: Eslint check
run: npm run lint
- name: Test Build
run: npm run build

View File

@@ -0,0 +1,16 @@
name: Publish NPM Version Info
on:
release:
types: [published]
jobs:
dispatch:
runs-on: ubuntu-latest
steps:
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v4
with:
token: ${{ secrets.PAT }}
repository: lyswhut/lx-music-desktop-version-info
event-type: npm-release

214
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,214 @@
name: Build
on:
push:
branches:
- master
env:
IS_CI: 'true'
jobs:
# CheckCode:
# name: Lint Code
# runs-on: ubuntu-latest
# steps:
# - name: Check out git repository
# uses: actions/checkout@v6
# - name: Install Node.js
# uses: actions/setup-node@v4
# with:
# node-version: 20
# - name: Cache file
# uses: actions/cache@v4
# with:
# path: |
# node_modules
# $HOME/.cache/electron
# $HOME/.cache/electron-builder
# $HOME/.npm/_prebuilds
# key: ${{ runner.os }}-build-caches-${{ hashFiles('**/package-lock.json') }}
# restore-keys: |
# ${{ runner.os }}-build-
# - name: Install Dependencies
# run: |
# npm ci
# - name: Lint src code
# run: npm run lint
Windows:
name: Windows
runs-on: windows-latest
# needs: CheckCode
steps:
- name: Check out git repository
uses: actions/checkout@v6
- name: Get npm cache directory
shell: pwsh
run: echo "NPM_CACHE=$(npm config get cache)" >> $env:GITHUB_ENV
- name: Show Env
run: echo "${{ env.NPM_CACHE }}"
- name: Setup Node Env
env:
NPM_CACHE: ${{ env.NPM_CACHE }}
uses: ./.github/actions/setup
- name: Build src code
run: |
git status --porcelain
npm run build
- name: Release package
run: |
npm run publish:win:7z:x64
npm run publish:win:7z:arm64
npm run publish:win:setup:arm64
npm run publish:win:setup:x64
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BT_TOKEN: ${{ secrets.BT_TOKEN }}
- name: Generate file MD5
run: |
cd build
Get-FileHash *.exe,*.7z -Algorithm MD5 | Format-List
Windows_7:
name: Windows_7
runs-on: windows-latest
# needs: CheckCode
steps:
- name: Check out git repository
uses: actions/checkout@v6
- name: Get npm cache directory
shell: pwsh
run: echo "NPM_CACHE=$(npm config get cache)" >> $env:GITHUB_ENV
- name: Setup Node Env
env:
NPM_CACHE: ${{ env.NPM_CACHE }}
uses: ./.github/actions/setup
- name: Prepare win7 undici env
run: |
npm install undici@5
Set-Content -Path .\src\common\utils\request.ts -Value "export * from './request_node16'"
- name: Build src code
env:
BUILD_WIN7: true
run: |
git status --porcelain
npm run build
- name: Prepare win7 electron env
run: |
npm install electron@22 better-sqlite3@12
pip.exe install setuptools
- name: Release win7 package
run: |
npm run publish:win7:setup:x64
npm run publish:win7:7z:x64
npm run publish:win7:7z:x86
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BT_TOKEN: ${{ secrets.BT_TOKEN }}
- name: Generate file MD5
run: |
cd build
Get-FileHash *.exe,*.7z -Algorithm MD5 | Format-List
Mac:
name: Mac
runs-on: macos-latest
# needs: CheckCode
steps:
- name: Check out git repository
uses: actions/checkout@v6
- name: Install python3 setuptools
run: brew install python-setuptools
- name: Get npm cache directory
shell: bash
run: echo "NPM_CACHE=$(npm config get cache)" >> $GITHUB_ENV
- name: Show Env
run: echo "${{ env.NPM_CACHE }}"
- name: Setup Node Env
env:
NPM_CACHE: ${{ env.NPM_CACHE }}
uses: ./.github/actions/setup
- name: Build src code
run: |
git status --porcelain
npm run build
- name: Release package
run: |
npm run publish:mac:dmg
npm run publish:mac:dmg:arm64
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BT_TOKEN: ${{ secrets.BT_TOKEN }}
- name: Generate file MD5
run: |
cd build
md5 *.dmg
Linux:
name: Linux
runs-on: ubuntu-latest
# needs: CheckCode
steps:
- name: Install package
run: sudo apt-get update && sudo apt-get install -y rpm libarchive-tools
- name: Check out git repository
uses: actions/checkout@v6
- name: Get npm cache directory
shell: bash
run: echo "NPM_CACHE=$(npm config get cache)" >> $GITHUB_ENV
- name: Show Env
run: echo "${{ env.NPM_CACHE }}"
- name: Setup Node Env
env:
NPM_CACHE: ${{ env.NPM_CACHE }}
uses: ./.github/actions/setup
- name: Build src code
run: |
git status --porcelain
npm run build
- name: Release package
run: |
npm run publish:linux:deb:amd64
npm run publish:linux:deb:arm64
npm run publish:linux:deb:armv7l
npm run publish:linux:appImage
npm run publish:linux:rpm
npm run publish:linux:pacman
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BT_TOKEN: ${{ secrets.BT_TOKEN }}
- name: Generate file MD5
run: |
cd build
md5sum *.deb *.rpm *.pacman *.AppImage

59
.ncurc.js Normal file
View File

@@ -0,0 +1,59 @@
module.exports = {
upgrade: true,
reject: [
'electron',
'chalk',
'del',
'comlink',
'vue',
'vue-router',
'image-size',
'message2call',
'@types/ws',
'eslint',
'@types/node',
'electron-debug',
'eslint-webpack-plugin',
'typescript',
'undici',
'@types/better-sqlite3',
'changelog-parser',
'webpack-dev-server',
'eslint-plugin-vue',
'vue-eslint-parser',
// 'eslint-config-standard-with-typescript',
'webpack',
],
// target: 'newest',
// filter: [
// 'electron-builder',
// 'electron-updater',
// ],
// target: 'patch',
// filter: [
// 'electron',
// 'vue',
// 'vue-router',
// ],
// target: 'minor',
// filter: [
// 'electron',
// 'eslint',
// 'eslint-webpack-plugin',
// 'electron-debug',
// 'typescript',
// '@types/node',
// 'undici',
// 'eslint-plugin-vue',
// 'vue-eslint-parser',
// 'better-sqlite3',
// '@types/better-sqlite3',
// 'webpack-dev-server',
// ],
}

View File

@@ -1,49 +0,0 @@
language: node_js
node_js: 12
matrix:
include:
- os: osx
osx_image: xcode10.2
env:
- ELECTRON_CACHE=$HOME/.cache/electron
- ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder
- os: linux
dist: trusty
sudo: required
addons:
apt:
packages:
- rpm
- bsdtar
cache:
directories:
- node_modules
- $HOME/.cache/electron
- $HOME/.cache/electron-builder
- $HOME/.npm/_prebuilds
notifications:
email: false
script:
- node --version
- npm --version
- |
if [ "$TRAVIS_OS_NAME" == "linux" ]; then
npm install && npm run publish:gh:linux
else
npm run publish:gh:mac
fi
before_cache:
- rm -rf $HOME/.cache/electron-builder/wine
# only run this script on pull requests and merges into
# the 'master' and 'prod' branches
branches:
only:
- master
- dev

29
.vscode/i18n-ally-custom-framework.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
# .vscode/i18n-ally-custom-framework.yml
# An array of strings which contain Language Ids defined by VS Code
# You can check avaliable language ids here: https://code.visualstudio.com/docs/languages/overview#_language-id
languageIds:
- javascript
- typescript
- vue
# An array of RegExes to find the key usage. **The key should be captured in the first match group**.
# You should unescape RegEx strings in order to fit in the YAML file
# To help with this, you can use https://www.freeformatter.com/json-escape.html
usageMatchRegex:
# The following example shows how to detect `t("your.i18n.keys")`
# the `{key}` will be placed by a proper keypath matching regex,
# you can ignore it and use your own matching rules as well
- "[^\\w\\d]t\\(['\"`]({key})['\"`]"
# An array of strings containing refactor templates.
# The "$1" will be replaced by the keypath specified.
# Optional: uncomment the following two lines to use
# refactorTemplates:
# - i18n.get("$1")
# If set to true, only enables this custom framework (will disable all built-in frameworks)
monopoly: true

37
.vscode/javascript.code-snippets vendored Normal file
View File

@@ -0,0 +1,37 @@
{
// Place your lx-music-desktop-new 工作区 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
// Placeholders with the same ids are connected.
// Example:
// "Print to console": {
// "scope": "javascript,typescript",
// "prefix": "log",
// "body": [
// "console.log('$1');",
// "$2"
// ],
// "description": "Log output to console"
// }
"use i18n": {
"prefix": "ui18n",
"body": [
"import { useI18n } from '@renderer/plugins/i18n'",
"${1:const t = useI18n()}"
]
},
"list action": {
"prefix": "listacion",
"body": [
"import { $1 } from '@renderer/store/list/action'",
]
},
"import vue tools": {
"prefix": "imvt",
"body": [
"import { $1 } from '@common/utils/vueTools'",
]
}
}

17
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,17 @@
{
"i18n-ally.localesPaths": [
"src/lang"
],
// "i18n-ally.fullReloadOnChanged": true,
"i18n-ally.keystyle": "nested",
"i18n-ally.displayLanguage": "zh-cn",
"i18n-ally.sourceLanguage": "zh-cn",
"i18n-ally.translate.engines": [
"google-cn",
"google"
],
"i18n-ally.sortKeys": true,
"javascript.preferences.importModuleSpecifier": "non-relative",
"typescript.tsdk": "node_modules/typescript/lib",
"vue.codeActions.enabled": false
}

31
.vscode/typescript.code-snippets vendored Normal file
View File

@@ -0,0 +1,31 @@
{
// Place your lx-music-desktop-new 工作区 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
// Placeholders with the same ids are connected.
// Example:
// "Print to console": {
// "scope": "javascript,typescript",
// "prefix": "log",
// "body": [
// "console.log('$1');",
// "$2"
// ],
// "description": "Log output to console"
// }
"use i18n": {
"prefix": "ui18n",
"body": [
"import { useI18n } from '@renderer/plugins/i18n'",
"${1:const t = useI18n()}"
]
},
"import vue tools": {
"prefix": "imvt",
"body": [
"import { $1 } from '@common/utils/vueTools'",
]
}
}

File diff suppressed because it is too large Load Diff

523
FAQ.md
View File

@@ -1,27 +1,89 @@
# lx-music-desktop 常见问题
本文档已迁移至:<https://lyswhut.github.io/lx-music-doc/desktop/faq>
<!--
在阅读本常见问题后仍然无法解决你的问题请提交issue或者加企鹅群`830125506`反馈(无事勿加,入群先看群公告),反馈时请**注明**已阅读常见问题!
## 软件为什么没有桌面歌词与自定义列表功能
## ~~软件为什么没有桌面歌词与自定义列表功能~~
洛雪音乐的最初定位不是作为播放器开发的,它主要用于**查找歌曲**,软件的播放功能仅用于试听,不建议用作为常用播放器使用。
## 音乐播放列表机制
1. 默认情况下,播放搜索列表、歌单列表、排行榜列表的歌曲时会自动将该歌曲添加到“我的列表”的试听列表后再播放,这与手动将歌曲添加到试听列表,再去试听列表找到这首歌点播放是等价的
2. 如果你想要播放多首歌曲,需要使用多选功能(若不知道如何多选请看常见问题)多选后,将这些歌曲添加到“我的列表”播放,或使用稍后播放功能播放
3. 第2条适用于搜索列表、歌单列表、排行榜列表、我的列表中的歌曲
4. 对于歌单详情列表除了可以使用第2条的方式播放外你可以点击详情页上面的播放按钮临时播放当前歌单或点击收藏将当前歌单收藏到“我的列表”后再去播放
5. 对于排行榜详情列表除了可以使用第2条的方式播放外你可以在右击排行榜名字后弹出的菜单中播放或收藏整个排行榜这与第四条的歌单中的播放、与收藏按钮功能一致
6. v1.18.0及之后新增了“双击列表里的歌曲时自动切换到当前列表播放”设置,默认关闭,此功能仅对歌单、排行榜有效
7. 将歌曲添加“稍后播放”后,它们会被放在一个优先级最高的特殊队列中,点击“下一曲”时会消耗该队列中的歌曲,并且无法通过“上一曲”功能播放该队列的上一首歌曲
8. 在切歌时若不是通过“上一曲”、“下一曲”功能切歌(例如直接点击“排行榜列表”、“我的列表”中的歌曲切歌),“稍后播放”队列将会被清空
## 可用的鼠标、键盘快捷操作
- 鼠标右击播放栏的歌曲图片封面可以定位当前播放的歌曲
- 鼠标右击播放栏进度条上的`LRC`按钮可以锁定/解锁桌面歌词
- 歌曲搜索框、歌单链接输入框内鼠标右击可以将当前剪贴板上的文字粘贴到输入框内
- 鼠标右击搜索界面中的单条搜索历史可以将其移除
- 歌曲列表内的文字在选中后,鼠标右击可以复制已选中的文字,此功能只对搜索、歌单、排行榜、我的列表中的列表有效
- 鼠标在播放详情页内右键双击可以关闭播放详情页
- 鼠标左击播放栏上的歌曲名字可以将它复制
- 鼠标右击设置-主题设置的“道法自然英文Auto”主题可以打开亮、暗主题设置窗口
- 歌曲搜索框的候选内容可以用键盘上下方向键选择,按回车键搜索已选内容
- 在歌单详情页按退格键可以返回歌单列表
- 歌曲列表中可以使用`Ctrl``Shift`键进行多选这类似Windows下的文件选择详情看常见问题列表多选部分
- 在我的列表内可以使用`Ctrl + f`键打开搜索框进行列表内歌曲搜索,搜索框按`Esc`键可以关闭搜索框,搜索框内按上下方向键可以选择歌曲,按`回车`键跳转到已选歌曲,按`Ctrl + 回车`可以跳转并播放已选歌曲
- 在我的列表按住`Ctrl`键可以进入列表拖动模式,此时可以用鼠标拖动列表调整列表的位置
- 编辑列表名时按`Esc`键可以取消编辑
- `F11`可以进入、退出全屏状态v1.19.0新增)
- 在歌曲添加弹窗中,若按住`Ctrl`键后再点击列表名将不会自动关闭添加窗口这对想要将同一首一批歌曲添加到多个列表时会很有用v1.22.0新增)
在macOS上`Ctrl`键对应`Command`
## 歌曲无法试听与下载
该问题解决顺序如下:
### 所有歌曲都提示 `请求异常😮,可以多试几次,若还是不行就换一首吧。。。`
尝试更换网络,如切换到移动网络,若移动网络还是不行则尝试开关下手机的飞行模式后再试,<br>
若使用家庭网络的话可尝试将光猫断电5分钟左右再通电联网后播放。
### 提示 `getaddrinfo EAI_AGAIN ...` 或 `无法连接到服务器`
尝试在在浏览器打开这个地址`http://ts.tempmusics.tk`浏览器显示404是正常的如果不是404那就证明所在网络无法访问接口服务器。
若网页无法打开或打开来不是404则可能是DNS的问题可以尝试以下办法
1. 将DNS改成自动获取试试改完可能需要清理下系统DNS缓存才生效
2. 手动把DNS改一下不要用360的DNS可以把DNS改成`223.6.6.6``8.8.8.8`改完可能需要清理下系统DNS缓存才生效
改完DNS后可能需要重启软件才生效
### 通用解决方法
尝试按以下顺序解决:
1. 尝试更新到最新版本
2. 尝试切换其他歌曲(或直接搜索该歌曲),若全部歌曲都无法试听与下载则进行下一步
3. 尝试到 设置-音乐来源 切换到其他接口
4. 尝试切换网络,比如用手机开热点(目前存在某些网络无法访问接口服务器的情况
4. 尝试切换网络,比如用手机开热点(所有歌曲都提示请求异常时可通过此方法解决,或等一两天后再试
5. 若还不行请到这个链接查看详情:<https://github.com/lyswhut/lx-music-desktop/issues/5>
6. 若没有在第5条链接中的第一条评论中看到接口无法使用的说明则应该是你网络无法访问接口服务器的问题如果接口有问题我会在那里说明。
想要知道是不是自己网络的问题可以看看`http://ts.tempmusic.tk`能不能在浏览器打开浏览器显示404是正常的如果不是404那就证明所在网络无法访问接口服务器。
想要知道是不是自己网络的问题可以看看`http://ts.tempmusics.tk`能不能在浏览器打开浏览器显示404是正常的如果不是404那就证明所在网络无法访问接口服务器。
若网页无法打开或打来不是404则应该是DNS的问题可以尝试以下办法
1. 将DNS改成自动获取试试
2. 手动把DNS改一下不要用360的DNS可以把DNS改成`114.114.114.114``8.8.8.8`
2. 手动把DNS改一下不要用360的DNS可以把DNS改成`223.6.6.6``8.8.8.8`
### Windows版所有歌曲都提示 `音频加载错误5秒后切换下一首`
尝试关闭 Internet选项 的代理设置。
如果你不知道怎么做,可以尝试按以下步骤去做:
按<kbd>windows</kbd>+<kbd>r</kbd>键打开“运行”窗口,输入`inetcpl.cpl`后回车,在打开的 Internet选项 对话框中,切换到 连接 -> 局域网设置,在弹出的新窗口中把代理服务器下的勾去掉,如果自动配置下的勾也有被勾选,那么建议也去掉,最后按确定关闭所有弹窗。
> 来源:<https://github.com/lyswhut/lx-music-desktop/issues/873#issuecomment-1146945724>
## 列表多选
@@ -33,15 +95,166 @@
`Shift``Ctrl`选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按`Shift``Alt`键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S`Ctrl`键对应Mac OS上的`Command`键)
注:选完后可用鼠标右击弹出右键菜单操作已选的内容
## 播放整个歌单或排行榜
播放在线列表内的歌曲需要将它们都添加到我的列表才能播放,你可以全选列表内的歌曲然后添加到现有列表或者新创建的列表,然后去播放该列表内的歌曲。
从v1.10.0起,你可以右击排行榜名字的弹出菜单中直接播放或收藏整个排行榜的歌曲。
## 无法打开外部歌单
不支持跨源打开歌单,请**确认**你需要打开的歌单平台是否与软件标签所写的**歌单源**对应(不一样的话请通过右上角切换歌单源);<br>
对于分享出来的歌单若打开失败可尝试先在浏览器中打开后再从浏览器地址栏复制URL地址到软件打开<br>
或者如果你知道歌单 id 也可以直接输入歌单 id 打开。<br>
注:网易源的“我喜欢”歌单无法在未登录的情况下打开,所以你需要手动创建一个歌单后将“我喜欢”里的歌曲移动到该歌单打开
### 打开网易源“我喜欢”歌单
由于网易源的“我喜欢”歌单需要登录才能打开从v1.13.0起提供了可以以注入token的方式打开网易源“我喜欢”歌单的功能现若想要打开此类歌单需要在歌单链接或id后面拼上 `###` 再加上有效的token拼接格式`[id|url]###token`例子最后面的xxxxxx替换成你的token
- `https://music.163.com/#/playlist?id=11332&userid=123456###xxxxxx`
- `11332###xxxxxx`
即:将 `歌单链接或者歌单ID``###``token` 这三者拼到一起。
#### `token`的获取方法
**注:`token`是你账号的临时身份令牌,不要随便泄露给他人**<br>
在浏览器打开登录网易云音乐并**登录**后,按`F12`,此时将会打开开发者窗口,然后按你使用的浏览器操作:
##### Chrome、360、QQ等浏览器
这些浏览器打开此窗口时界面可能是中文也可能是英文,英文的话按括号里的来
1. 点击窗口顶部`应用程序(application)`(若找不到此选项,则可能是被折叠起来了,看看顶部菜单的`>>`
2. 展开左侧 `Cookies`
3. 点击 `https://music.163.com`
4. 在右侧窗口找到 `名称(Name)``MUSIC_U` 的这行,这行的第二列(`值(Value)`)内的那串内容就是`token`,双击它进入编辑状态,然后按`ctrl + c`键就可以将它复制
##### 火狐浏览器
1. 点击窗口顶部`存储`
2. 展开左侧 `Cookie`
3. 点击 `https://music.163.com`
4. 在右侧窗口找到 `名称``MUSIC_U` 的这行,这行的最后一列(`值`)内的那串内容就是`token`,双击它进入编辑状态,然后按`ctrl + c`键就可以将它复制
## 更新已收藏的在线歌单
该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“更新”使用该功能,
需要注意的是:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表。
## 调整我的列表的列表顺序
按住Ctrl键Mac上对应Command键的时候将进入“拖动模式”此时可以拖动列表的位置来调整顺序。
## 同步功能的使用(实验性,首次使用前建议先备份一次列表)
**注意:由于同步传输时的数据是明文传输,请在受信任的网络下使用此功能!**<br>
此功能需要配合移动端使用PC端与移动端处在同一个局域网路由器的网络下时可以多端实时同步歌曲列表使用方法
1. 在PC端的设置-数据同步开启同步功能(这时如果出现安全软件、防火墙等提示网络连接弹窗时需要点击允许)
2. 在移动端的设置-同步-同步服务器地址输入PC端显示的同步服务器地址如果显示可以多个则输入与**移动端上显示的本机地址**最相似的那个端口号与PC端的同步端口一致**输入完毕后需要按一下键盘上的回车键使输入的内容生效**
3. 输入完这两项后点击“启动同步”
4. 若连接成功对于首次同步时若两边的设备的列表不为空则PC端会弹出选择列表同步方式的弹窗同步方式的说明弹窗下面有介绍
#### 关于同步弹窗的说明
对于首次同步时若两边的设备的列表不为空则PC端会弹出选择列表同步方式的弹窗此弹窗内的同步方式仅针对**首次同步**<br>
第一次同步成功后,以后再同步时将会自动根据两边设备的列表内容合并同步,不信你可以在同步完成后断开两边的连接,然后在两边增删一些歌曲或列表后再同步试试看~😉
#### 连接同步服务失败的可能原因
- 此功能需要PC端与移动端都连接在同一个路由器下的网络才能使用
- 检查防火墙是否拦截了PC端的服务端口
- 路由器若开启了AP隔离则此功能无法使用
#### 连接同步服务失败的检查
1. 确保PC端的同步服务已启用成功若连接码、同步服务地址没有内容则证明服务启动失败此时看启用同步功能复选框后面的错误信息自行解决另外若你不知道端口号是什么意思就不要乱改或不要改得太大与太小
2. 在手机浏览器地址栏输入`http://x.x.x.x:23332/hello` **(注:将`x.x.x.x`换成PC端显示的同步服务地址`23332`为PC端的端口号** 后回车,若此地址可以打开并显示 `Hello~::^-^::`则证明移动端与PC端网络已互通
3. 若移动端无法打开第2步的地址则在PC端的浏览器地址栏输入并打开该地址若可以打开则要么是被LX Music PC端被电脑防火墙拦截要么PC端与移动端不在同一个网络下或者路由器开启了AP隔离一般在公共网络下会出现这种情况
## 界面异常(界面显示不完整)
### Windows 10、11界面异常、界面无法显示
尝试添加运行参数 `--disable-gpu-sandbox` 启动,例如:`.\lx-music-desktop.exe --disable-gpu-sandbox`,添加方法可自行百度“给快捷方式加参数”。
若以上方法无效,则尝试将 `--disable-gpu-sandbox` 逐个换成以下参数启动,直到恢复正常为止:
- `--no-sandbox`
- `-dha`
- `--disable-gpu`
:::caution
这些参数会禁用程序的某些安全特性或降低程序性能,没有遇到问题不要使用它们!
:::
对于界面无法显示,任务栏里也没看到图标,但是任务管理器里面看到进程的问题,还可尝试更换软件安装目录(对于安装版需要先卸载再换目录安装,绿色版直接剪切移动即可,只要目录换了就行),<br />
此方法的相关讨论看:<https://github.com/lyswhut/lx-music-desktop/issues/943#issuecomment-1217832186>
### Windows 7 下界面异常
由于软件默认使用了透明窗口根据Electron官方文档的[说明](https://www.electronjs.org/docs/latest/tutorial/window-customization#limitations)
> 在 windows 操作系统上, 当 DWM 被禁用时, 透明窗口将无法工作。
因此,当 win7 没有使用**Aero**主题时界面将会显示异常开启AERO的方法请自行百度`win7开启Aero效果`(开启后可看到任务栏变透明)。<br>
`0.14.0`版本起不再强制要求开启透明效果,若你实在不想开启(若非电脑配置太低,墙裂建议开启!),可通过添加运行参数`-dt`来运行程序即可,例如:`.\lx-music-desktop.exe -dt`,添加方法可自行百度“给快捷方式加参数”,该参数的作用是用来控制程序是否使用非透明窗口运行。
注:启用**Aero**主题后,若软件出现黑边框,则重启软件即可恢复正常。
对于一些完全无法正常显示界面、开启了AERO后问题仍未解决的情况请阅读下面的 **Window 7 下软件启动后,界面无法显示** 解决。
### Linux 下界面异常
根据Electron里issue的[解决方案](https://github.com/electron/electron/issues/2170#issuecomment-736223269)<br>
若你遇到透明问题可尝试添加启动参数 `-dha` 来禁用硬件加速,例如:`.\lx-music-desktop.exe -dha`
v1.6.0及之后的版本才支持`-dha`参数
## Windows 7 下软件启动后,界面无法显示
对于软件启动后,可以在任务栏看到软件,但软件界面在桌面上无任何显示,或者整个界面偶尔闪烁的情况。<br>
原始问题看:<https://github.com/electron/electron/issues/19569#issuecomment-522231083><br>
解决办法:下载`.NET Framework 4.7.1`或**更高**版本安装即可(建议安装最新版,若安装过程中遇到问题可尝试自行百度解决)。<br>
微软官方下载地址:<https://dotnet.microsoft.com/download/dotnet-framework><br>
下载`Runtime(运行时)`版即可,安装完成后可能需要重启才生效,**若出现闪烁的情况**,可阅读下面的**Windows 7 下整个界面闪烁**解决。
## Windows 7 下整个界面闪烁(消失又出现)
可尝试在关掉软件后,在桌面空白处鼠标右击,在弹出的菜单中选择**个性化**,在弹出的窗口中**切换到系统内置的Aero主题**,然后再启动软件看是否解决。
## Windows 7 下桌面歌词字体列表为空
Windows 7 系统系统需要安装 Powershell 5.1及以上版本才可正常获取系统字体列表。
想要查看当前 Powershell 版本可以在 Powershell 窗口输入命令:`Get-Host`
最新 Powershell 安装包可以去官方 [Github releases](https://github.com/PowerShell/PowerShell/releases) 页下载,安装过程中若出现错误,请自行按照提示或者百度/Google解决。
## 安装版安装失败,提示安装程序并未成功地运行完成
对于部分电脑出现安装失败的问题,可以做出以下尝试:
- 若你之前可以安装成功,但现在安装失败,就去**控制面板-程序和功能**或用第三方卸载工具看下有没有之前的版本残留,若同时在不同路径下安装了多个版本就可能会出现该问题,这种情况卸载掉所有版本重新安装即可
- 清理安装路径下的残留文件
- 清理注册表(建议用清理工具清理)
## 软件无法联网
软件的排行榜、歌单、搜索列表**都**无法加载:
- 检查是否在设置界面开启了代理(当代理乱设置时软件将无法联网)
- 检查软件是否被第三方软件/防火墙阻止联网
## 桌面歌词显示异常
### Windows 7 系统桌面歌词显示异常
Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看面的 **Windows 7 下界面异常(界面显示不完整)** 方法解决。
Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看面的 **Windows 7 下界面异常** 方法解决。
### MAC OS 系统、桌面歌词有残留阴影
@@ -52,10 +265,20 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看下面的
### Linux 系统下桌面歌词窗口异常
目前在 Ubuntu 18.10 下第一次开启桌面歌词时歌词窗口会变白,需要关闭后再开启,
`v1.2.1`以前的版本在 Ubuntu 18.10 下第一次开启桌面歌词时歌词窗口会变白,需要关闭后再开启,
`v1.2.1`及之后的版本已修复该问题。
其他 Linux 系统未测试,如有异常也是意料之中,目前不打算去处理 Linux 平台的桌面歌词问题。
其他 Linux 系统未测试,如有异常也是意料之中,目前不打算去处理 Linux 平台的桌面歌词问题,但你可以尝试按照`Linux 下界面异常`的解决方案去解决
## 歌曲下载失败,提示 `ENOENT: no such file or directory, mkdir`
更换下载歌曲目录即可解决(一般是设置的歌曲下载目录没有读写权限导致的)。
## 使用软件时导致耳机意外关机
据反馈,漫步者部分型号的耳机与本软件一起使用时将会导致耳机意外关机,
详情看:<https://github.com/lyswhut/lx-music-desktop/issues/457>
若出现该问题可尝试添加`-dhmkh`启动参数解决启动参数添加方法请自行百度“windows给快捷方式添加启动参数”。
## 软件安装包说明
@@ -67,9 +290,9 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看下面的
**`.dmg`** 结尾的文件为 MAC 版本;
**`.AppImage`**、**`.deb`** 结尾的为 Linux 版本。
**`.AppImage`**、**`.deb`**、**`.rpm`**、**`.pacman`** 结尾的为 Linux 版本。
带有`x64`的为64位的系统版本`x86`的为32位的系统版本若两个都带有的则为集合版安装时会自动根据系统位数选择对应的版本安装。
带有`x64`的为64位的系统版本`x86`的为32位的系统版本若两个都带有的则为集合版安装时会自动根据系统位数选择对应的版本安装;带有`arm`的为arm架构系统的版本
## 软件更新
@@ -77,38 +300,13 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看下面的
若下载未完成时软件被关闭,下次启动软件会再次自动下载。<br>
若还是**更新失败**可能是无法访问GitHub导致的这时需要手动更新即下载最新安装包直接覆盖安装即可。<br>
注意:**绿色版**的软件自动更新功能**不可用**,建议使用安装版!!<br>
注意:**Mac版**、**Linux deb**版不支持自动更新!
注意:**Mac版**、**Linux**版不支持自动更新!
## Windows 7 下界面异常(界面显示不完整)
### Windows 安装版在升级后,卸载了旧版本,但没有安装新版本
由于软件默认使用了透明窗口根据Electron官方文档的[说明](https://electronjs.org/docs/api/frameless-window#%E5%B1%80%E9%99%90%E6%80%A7)
> 在 windows 操作系统上, 当 DWM 被禁用时, 透明窗口将无法工作。
出现这个问题的原因一般是你当初在安装本软件的时候是以管理员身份安装的,运行软件的时候没有以管理员身份运行,所以卸载后无法再装上。
因此,当 win7 没有使用**AERO**主题时界面将会显示异常开启AERO的方法请自行百度`win7开启aero效果`(开启后可看到任务栏变透明)。<br>
`0.14.0`版本起不再强制要求开启透明效果,若你实在不想开启(若非电脑配置太低,墙裂建议开启!),可通过添加运行参数`-nt`来运行程序即可,例如:`.\lx-music-desktop.exe -nt`,添加方法可自行百度“给快捷方式加参数”,该参数的作用是用来控制程序是否使用非透明窗口运行。
对于一些完全无法正常显示界面、开启了AERO后问题仍未解决的情况请阅读下面的 **软件启动后,界面无法显示** 解决
## 软件启动后,界面无法显示
对于软件启动后,可以在任务栏看到软件,但软件界面在桌面上无任何显示,或者整个界面偶尔闪烁的情况。<br>
原始问题看:<https://github.com/electron/electron/issues/19569#issuecomment-522231083><br>
解决办法:下载`.NET Framework 4.7.1`或**更高**版本安装即可(建议安装最新版,若安装过程中遇到问题可尝试自行百度解决)。<br>
微软官方下载地址:<https://dotnet.microsoft.com/download/dotnet-framework><br>
下载`Runtime(运行时)`版即可,安装完成后可能需要重启才生效。
若还是不行可尝试以下操作:
- 更新显卡驱动
- 尝试将绿色版的软件放在**桌面**或**我的文档**运行
## 安装版安装失败,提示安装程序并未成功地运行完成
对于部分电脑出现安装失败的问题,可以做出以下尝试:
- 若你之前可以安装成功,但现在安装失败,就去**控制面板-程序和功能**或用第三方卸载工具看下有没有之前的版本残留,若同时在不同路径下安装了多个版本就可能会出现该问题,这种情况卸载掉所有版本重新安装即可
- 清理安装路径下的残留文件
- 清理注册表(建议用清理工具清理)
安装本软件时建议选择 `为当前用户安装`,并安装在当前用户目录或者安装在不需要管理员权限的目录(即其他分区下),不要选`为所有用户安装`
## 缺少`xxx.dll`
@@ -117,25 +315,252 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看下面的
- 以管理员权限打开`cmd`,输入`sfc /scannow`回车等待检查完成重启电脑
- 若上面的方法**修复、重启**电脑后仍然不行,就自行百度弹出的**错误信息**看下别人是怎么解决的
## MAC OS无法启动软件提示 lx-music-desktop 已损坏
这是因为软件没有签名,被系统阻止运行,<br>
在终端里输入 `sudo xattr -rd com.apple.quarantine /Applications/lx-music-desktop.app`,然后输入你的电脑密码即可
还可以参考:
- <http://www.pc6.com/edu/168719.html>
- <https://blog.csdn.net/for641/article/details/104811538>
## 数据存储路径
默认情况下,软件的数据存储在:
- Windows`%APPDATA%/lx-music-desktop`
- Linux`$XDG_CONFIG_HOME/lx-music-desktop``~/.config/lx-music-desktop`
- macOS`~/Library/Application/lx-music-desktop`
在Windows平台下若程序目录下存在`portable`目录则自动使用此目录作为数据存储目录v1.17.0新增)。
## 杀毒软件提示有病毒或恶意行为
本人只能保证我写的代码不包含任何**恶意代码**、**收集用户信息**的行为并且软件代码已开源请自行查阅软件安装包也是由CI拉取源代码构建构建日志[windows包](https://ci.appveyor.com/project/lyswhut/lx-music-desktop)、[Mac/Linux包](https://travis-ci.com/github/lyswhut/lx-music-desktop)<br>
本人只能保证我写的代码不包含任何**恶意代码**、**收集用户信息**的行为并且软件代码已开源请自行查阅软件安装包也是由CI拉取源代码构建构建日志[GitHub Actions](https://github.com/lyswhut/lx-music-desktop/actions)<br>
尽管如此但这不意味着软件是100%安全的,由于软件使用了第三方依赖,当这些依赖存在恶意行为时([供应链攻击](https://docs.microsoft.com/zh-cn/windows/security/threat-protection/intelligence/supply-chain-malware)),软件也将会受到牵连,所以我只能尽量选择使用较多人用、信任度较高的依赖。<br>
当然,以上说明建立的前提是在你所用的安装包是从**本项目主页上写的链接**下载的,或者有相关能力者还可以下载源代码自己构建安装包。
`0.17.0`起,由于加入了音频输出设备切换功能,该功能调用了 [MediaDevices.enumerateDevices()](https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/enumerateDevices),可能导致安全软件提示洛雪要访问摄像头(目前发现卡巴斯基会提示),但实际上没有用到摄像头,并且摄像头的提示灯也不会亮,你可以选择阻止访问。
`v0.17.0`起,由于加入了音频输出设备切换功能,该功能调用了 [MediaDevices.enumerateDevices()](https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/enumerateDevices),可能导致安全软件提示洛雪要访问摄像头(目前发现卡巴斯基会提示),但实际上没有用到摄像头,并且摄像头的提示灯也不会亮,你可以选择阻止访问。
最后,若出现杀毒软件报毒、存在恶意行为,请自行判断选择是否继续使用本软件!
## 软件无法联网
## 启动参数
软件的排行榜、歌单、搜索列表**都**无法加载
目前软件已支持的启动参数如下
- 检查是否在设置界面开启了代理(当代理乱设置时软件将无法联网)
- 检查软件是否被第三方软件/防火墙阻止联网
- `-search` 启动软件时自动在搜索框搜索指定的内容,例如:`-search="突然的自我 - 伍佰"`
- `-dha` 禁用硬件加速启动Disable Hardware Acceleration窗口显示有问题时可以尝试添加此参数启动v1.6.0起新增)
- `-dt` 以非透明模式启动Disable Transparent对于未开启AERO效果的win7系统可加此参数启动以确保界面正常显示该参数对桌面歌词无效原来的`-nt`参数已重命名为`-dt`v1.6.0起重命名)
- `-dhmkh` 禁用硬件媒体密钥处理Disable Hardware Media Key Handling此选项将禁用Chromium的Hardware Media Key Handling特性v1.9.0起新增)
- `-proxy-server` 设置代理服务器,代理应用的所有流量,例:`-proxy-server="127.0.0.1:1081"`不支持设置账号密码v1.17.0起新增)。注:应用内“设置-网络-代理设置”仅代理接口请求的流量,优先级更高
- `-proxy-bypass-list` 以分号分隔的主机列表绕过代理服务器,例:`-proxy-bypass-list="<local>;*.google.com;*foo.com;1.2.3.4:5678"`(与`-proxy-server`一起使用才有效v1.17.0起新增)。注:此设置对应用内接口请求无效
- `-play` 启动时播放指定列表的音乐,参数说明:
- `type`:播放类型,目前固定为`songList`
- `source`:播放源,可用值为`kw/kg/tx/wy/mg/myList`,其中`kw/kg/tx/wy/mg`对应各源的在线列表,`myList`为本地列表
- `link`要播放的在线列表歌单链接、或IDsource为`kw/kg/tx/wy/mg`之一(在线列表)时必传,举例:`./lx-music-desktop -play="type=songList&source=kw&link=歌单URL or ID"`注意如果传入URL时必须对URL进行编码后再传入
- `name`要播放的本地列表歌单名字source为`myList`时必传,举例:`./lx-music-desktop -play="type=songList&source=myList&name=默认列表"`
- `index`:从列表的哪个位置开始播放,选传,若不传默认播放第一首歌曲,举例:`./lx-music-desktop -play="type=songList&source=myList&name=默认列表&index=2"`
## 无法打开外部歌单
## Scheme URL支持
不支持垮源打开歌单,请确认你需要打开的歌单平台是否与软件标签所写的歌单源对应;<br>
对于分享出来的歌单若打开失败可尝试先在浏览器中打开后再从浏览器地址栏复制URL地址到软件打开<br>
或者如果你知道歌单 id 也可以直接输入歌单 id 打开。<br>
从v1.17.0起支持 Scheme URL可以使用此功能从浏览器等场景下调用LX Music我们开发了一个[油猴脚本](https://github.com/lyswhut/lx-music-script#readme)配套使用<br>
脚本安装地址:<https://greasyfork.org/zh-CN/scripts/438148><br>
以下是目前可用的Scheme URL调用方式
- URL统一以`lxmusic://`开头
- 若无特别说明,源的可用值为:`kw/kg/tx/wy/mg`
- 若无特别说明,音质的可用值为:`128k/320k/flac/flac24bit`
目前支持两种传参方式:
- 通过`data`传参以经过URL编码的JSON数据传参`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过URL编码后的JSON数据支持复杂的参数调用
- 通过`URL`传参适用于简单传参的调用不需要转成JSON格式`lxmusic://music/search/xxxx`但仍然需要对数据进行URL编码只适应于简单参数调用v1.18.0新增)
### `data`方式传参
以经过URL编码的JSON数据传参`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过URL编码后的JSON数据JSON数据内容取决于下表的参数部分
| 描述 | URL | 参数
| --- | --- | ---
| 打开歌单 | `songlist/open` | `source<String>`(源,必须)<br>`id<String/Number>`歌单ID可选<br>`url<String>`歌单URL可选其中ID与URL必需传一个
| 播放歌单 | `songlist/play` | `source<String>`(源,必须)<br>`id<String/Number>`歌单ID可选<br>`url<String>`歌单URL可选其中`id``url`必需传一个<br>`index<Number>`播放第几首歌可选从0开始
| 搜索歌曲 | `music/search` | `keywords<String/Number>`(要搜索的内容,必须)<br>`source<String>`(源,可选)
| 播放歌曲 | `music/play` | `name<String>`(歌曲名,必传)<br>`singer<String>`(艺术家名,必传)<br>`source<String>`(源,必传)<br>`songmid<String/Number>`歌曲ID必传<br>`img<String>`(歌曲图片链接,选传)<br>`albumId<String/Number>`歌曲专辑ID选传<br>`interval<String>`(格式化后的歌曲时长,选传,例:`03:55`<br>`albumName<String>`(歌曲专辑名称,选传)<br>`types<Object>`(歌曲可用音质数组,必传,<br>数组格式:`[{"type": "<音质>", size: "<格式化后的文件大小,选传>", hash: "<kg源必传>"}]`<br>例:`[{"type": "128k", size: "3.56M"}, {"type": "320k", size: null}]`<br><br>以下为平台特定参数:<br>`hash<String>`歌曲hashkg源必传<br>`strMediaMid<String>`歌曲strMediaMidtx源必传<br>`albumMid<String>`歌曲albumMidtx源专用选传<br>`copyrightId<String>`歌曲copyrightIdmg源必传<br>`lrcUrl<String>`歌曲lrcUrlmg源专用选传
### `URL`方式传参
由于URL传参只适用于简单传参场景所以目前只支持以下功能的调用
| 描述 | URL | 参数
| --- | --- | ---
| 搜索歌曲 | `music/search/{source}/{keywords}` | `source`(源,可选)<br>`keywords`(要搜索的内容,必须)<br>例:`music/search/kw/xxx``music/search/xxx`
| 打开歌单 | `songlist/open/{source}/{id/url}` | `source`(源,必须)<br>`id/url`歌单ID或歌单URL必须<br>例:`songlist/open/kw/123456`
## 自定义源脚本编写说明
文件请使用UTF-8编码格式编写脚本所用编程语言为JavaScript可以使用ES6+语法,脚本与应用的交互是使用类似事件收发的方式进行,这是一个基本的脚本例子:
```js
/**
* @name 测试音乐源
* @description 我只是一个测试音乐源哦
* @version 1.0.0
* @author xxx
* @homepage http://xxx
*/
const { EVENT_NAMES, request, on, send } = window.lx
const qualitys = {
kw: {
'128k': '128',
'320k': '320',
flac: 'flac',
},
}
const httpRequest = (url, options) => new Promise((resolve, reject) => {
request(url, options, (err, resp) => {
if (err) return reject(err)
resolve(resp.body)
})
})
const apis = {
kw: {
musicUrl({ songmid }, quality) {
return httpRequest('http://xxx').then(data => {
return data.url
})
},
},
}
// 注册应用API请求事件
// source 音乐源可能的值取决于初始化时传入的sources对象的源key值
// info 请求附加信息内容根据action变化
// action 请求操作类型目前只有musicUrl即获取音乐URL链接
// 当action为musicUrl时info的结构{type, musicInfo}
// info.type音乐质量可能的值有128k / 320k / flac取决于初始化时对应源传入的qualitys值中的一个
// info.musicInfo音乐信息对象里面有音乐ID、名字等信息
on(EVENT_NAMES.request, ({ source, action, info }) => {
// 回调必须返回 Promise 对象
switch (action) {
// action 为 musicUrl 时需要在 Promise 返回歌曲 url
case 'musicUrl':
return apis[source].musicUrl(info.musicInfo, qualitys[source][info.type]).catch(err => {
console.log(err)
return Promise.reject(err)
})
}
})
// 脚本初始化完成后需要发送inited事件告知应用
send(EVENT_NAMES.inited, {
status: true, // 初始化成功 or 失败
openDevTools: false, // 是否打开开发者工具,方便用于调试脚本
sources: { // 当前脚本支持的源
kw: { // 支持的源对象可用key值kw/kg/tx/wy/mg
name: '酷我音乐',
type: 'music', // 目前固定为 music
actions: ['musicUrl'], // 目前固定为 ['musicUrl']
qualitys: ['128k', '320k', 'flac', 'flac24bit'], // 当前脚本的该源所支持获取的Url音质有效的值有['128k', '320k', 'flac', 'flac24bit']
},
},
})
```
### 自定义源信息
文件的开头必须包含以下注释:
```js
/**
* @name 测试脚本
* @description 我只是一个测试脚本
* @version 1.0.0
* @author xxx
* @homepage http://xxx
*/
```
- `@name `源的名字建议不要过长24个字符以内
- `@description `源的描述建议不要过长36个字符以内可不填不填时必须保留 @description
- `@version`:源的版本号,可不填,不填时可以删除 @version
- `@author `:脚本作者名字,可不填,不填时可以删除 @author
- `@homepage `:脚本主页,可不填,不填时可以删除 @homepage
### `window.lx`
应用为脚本暴露的API对象。
#### `window.lx.version`
自定义源API版本API变更时此版本号将会更改新增于v1.14.0之后)
#### `window.lx.EVENT_NAMES`
常量事件名称对象,发送、注册事件时传入事件名时使用,可用值:
| 事件名 | 描述
| --- | ---
| `inited` | 脚本初始化完成后发送给应用的事件名,发送该事件时需要传入以下信息:`{status, sources, openDevTools}`<br>`status`:初始化结果(`true`成功,`false`失败)<br>`openDevTools`是否打开DevTools此选项可用于开发脚本时的调试<br>`sources`:支持的源信息对象,<br>`sources[kw/kg/tx/wy/mg].name`:源的名字(目前非必须)<br>`sources[kw/kg/tx/wy/mg].type`:源类型,目前固定值需为`music`<br>`sources[kw/kg/tx/wy/mg].actions`支持的actions由于目前只支持`musicUrl`,所以固定传`['musicUrl']`即可<br>`sources[kw/kg/tx/wy/mg].qualitys`:该源支持的音质列表,有效的值为`['128k', '320k', 'flac', 'flac24bit']`,该字段用于控制应用可用的音质类型
| `request` | 应用API请求事件名回调入参`handler({ source, action, info})`,回调必须返回`Promise`对象<br>`source`:音乐源,可能的值取决于初始化时传入的`sources`对象的源key值<br>`info`:请求附加信息,内容根据`action`变化<br>`action`:请求操作类型,目前只有`musicUrl`即获取音乐URL链接需要在 Promise 返回歌曲 url`info`的结构:`{type, musicInfo}``info.type`:音乐质量,可能的值有`128k` / `320k` / `flac` / `flac24bit`(取决于初始化时对应源传入的`qualitys`值中的一个),`info.musicInfo`音乐信息对象里面有音乐ID、名字等信息
| `updateAlert` | 显示源更新弹窗,发送该事件时的参数:`{log, updateUrl}`<br>`log`:更新日志,必传,字符串类型,内容可以使用`\n`换行最大长度1024超过此长度后将被截取超出的部分<br>`updateUrl`更新地址用于引导用户去该地址更新源选传需为http协议的url地址最大长度1024<br>此事件每次运行脚本只能调用一次源版本v1.2.0新增)<br>例子:`lx.send(lx.EVENT_NAMES.updateAlert, { log: 'hello world', updateUrl: 'https://xxx.com' })`
#### `window.lx.on`
事件注册方法,应用主动与脚本通信时使用:
```js
/**
* @param event_name 事件名
* @param handler 事件处理回调 -- 注意:注册的回调必须返回 Promise 对象
*/
window.lx.on(event_name, handler)
```
**注意:** 注册的回调必须返回 `Promise` 对象。
#### `window.lx.send`
事件发送方法,脚本主动与应用通信时使用:
```js
/**
* @param event_name 事件名
* @param datas 要传给应用的数据
*/
window.lx.send(event_name, datas)
```
#### `window.lx.request`
HTTP请求方法用于发送HTTP请求此HTTP请求方法不受跨域规则限制
```js
/**
* @param url 请求的URL
* @param options 请求选项,可用选项有 method / headers / body / form / formData / timeout
* @param callback 请求结果的回调 入参err, resp, body
* @return 返回一个方法调用此方法可以终止HTTP请求
*/
const cancelHttp = window.lx.request(url, options, callback)
```
#### `window.lx.utils`
应用提供给脚本的工具方法:
- `window.lx.utils.buffer.from`对应Node.js的 `Buffer.from`
- `window.lx.utils.buffer.bufToString`Buffer转字符串 `bufToString(buffer, format)``format`对应Node.js `Buffer.toString`的参数v1.14.0之后新增)
- `window.lx.utils.crypto.aesEncrypt`AES加密 `aesEncrypt(buffer, mode, key, iv)`
- `window.lx.utils.crypto.md5`MD5加密 `md5(str)`
- `window.lx.utils.crypto.randomBytes`:生成随机字符串 `randomBytes(size)`
- `window.lx.utils.crypto.rsaEncrypt`RSA加密 `rsaEncrypt(buffer, key)`
目前仅提供以上工具方法如果需要其他方法可以开issue讨论。 -->

155
README.md
View File

@@ -1,9 +1,11 @@
<p align="center"><a href="https://github.com/lyswhut/lx-music-desktop"><img width="200" src="https://github.com/lyswhut/lx-music-desktop/blob/master/doc/images/icon.png" alt="lx-music logo"></a></p>
<h1 align="center">LX Music 桌面版</h1>
<p align="center">
<a href="https://github.com/lyswhut/lx-music-desktop/releases"><img src="https://img.shields.io/github/release/lyswhut/lx-music-desktop" alt="Release version"></a>
<a href="https://ci.appveyor.com/project/lyswhut/lx-music-desktop"><img src="https://ci.appveyor.com/api/projects/status/flrsqd5ymp8fnte5?svg=true" alt="Build status"></a>
<a href="https://travis-ci.com/lyswhut/lx-music-desktop"><img src="https://travis-ci.com/lyswhut/lx-music-desktop.svg?branch=master" alt="Build status"></a>
<a href="https://github.com/lyswhut/lx-music-desktop/actions/workflows/release.yml"><img src="https://github.com/lyswhut/lx-music-desktop/workflows/Build/badge.svg" alt="Build status"></a>
<a href="https://github.com/lyswhut/lx-music-desktop/actions/workflows/beta-pack.yml"><img src="https://github.com/lyswhut/lx-music-desktop/workflows/Build%20Beta/badge.svg" alt="Build status"></a>
<a href="https://electronjs.org/releases/stable"><img src="https://img.shields.io/github/package-json/dependency-version/lyswhut/lx-music-desktop/dev/electron/master" alt="Electron version"></a>
<!-- <a href="https://github.com/lyswhut/lx-music-desktop/releases"><img src="https://img.shields.io/github/downloads/lyswhut/lx-music-desktop/latest/total" alt="Downloads"></a> -->
<a href="https://github.com/lyswhut/lx-music-desktop/tree/dev"><img src="https://img.shields.io/github/package-json/v/lyswhut/lx-music-desktop/dev" alt="Dev branch version"></a>
@@ -28,79 +30,138 @@
[9]: https://img.shields.io/github/license/lyswhut/lx-music-desktop
[10]: https://github.com/lyswhut/lx-music-desktop/blob/master/LICENSE -->
<h2 align="center">洛雪音乐助手桌面版</h2>
<p align="center">一个基于 Electron & Vue 开发的音乐软件</p>
### 说明
一个基于 Electron + Vue 开发的音乐软件。
## 说明
所用技术栈:
- Electron 10
- Vue 2
- Electron 30+
- Vue 3
已支持的平台:
- Windows 7 及以上
- Mac OS
- Linux
- macOS
- Windows 7 及以上
软件变化请查看:[更新日志](https://github.com/lyswhut/lx-music-desktop/blob/master/CHANGELOG.md)<br>
软件下载请转到:[发布页面](https://github.com/lyswhut/lx-music-desktop/releases)<br>
或者到网盘下载网盘内有MAC、windows版`https://www.lanzoux.com/b0bf2cfa/` 密码:`glqw`<br>
使用常见问题请转至:[常见问题](https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md)
*移动版项目地址:https://github.com/lyswhut/lx-music-mobile*
### 源码使用方法
> [!NOTE]
> 目前新项目 [Any Listen](https://github.com/any-listen/any-listen) 的桌面版、Web 版已实现 LX Music 的大部分功能,并额外支持 WebDAV 歌曲播放、WebDAV 数据同步、独立播放列表等功能。
> 我们以后的开发精力将主要集中在新项目上,之前大家在 LX Music 提的功能我们也会考虑在新项目中添加。
> 对于日常使用 LX Music 的人可以试试迁移到 Any Listen若遇到任何问题可以发 issue 反馈。
>
> 关于我们开发新项目的原因,可以参考:[LX Music 项目发展调整与新项目计划](https://github.com/lyswhut/lx-music-desktop/issues/1912)。
环境要求Node.js 12.x+
软件变化请查看[更新日志](https://github.com/lyswhut/lx-music-desktop/blob/master/CHANGELOG.md)。
```bash
# 开发模式
npm run dev
软件下载请查看 [GitHub Releases](https://github.com/lyswhut/lx-music-desktop/releases)。
# 构建免安装版
npm run pack:dir
使用常见问题请参阅[桌面版常见问题](https://lyswhut.github.io/lx-music-doc/desktop/faq)。
# 构建安装包Windows版
npm run pack
目前本项目的原始发布地址只有 [**GitHub**](https://github.com/lyswhut/lx-music-desktop/releases),其他渠道均为第三方转载发布,与本项目无关!
# 构建安装包Mac版
npm run pack:mac
为了提高使用门槛本软件内的默认设置、UI 操作不以新手友好为目标,所以使用前建议先根据你的喜好浏览调整一遍软件设置,阅读一遍[音乐播放列表机制](https://lyswhut.github.io/lx-music-doc/desktop/faq/playlist)及[可用的鼠标、键盘快捷操作](https://lyswhut.github.io/lx-music-doc/desktop/faq/hotkey)。
# 构建安装包Linux版
npm run pack:linux
### Scheme URL 支持
```
从 v1.17.0 起支持 Scheme URL可以使用此功能在浏览器等场景下调用 LX Music我们开发了一个[油猴脚本](https://github.com/lyswhut/lx-music-script#readme)配套使用。
### UI界面
脚本安装地址:[LX Music 辅助脚本](https://greasyfork.org/zh-CN/scripts/438148)。
<p><a href="https://github.com/lyswhut/lx-music-desktop"><img width="100%" src="https://github.com/lyswhut/lx-music-desktop/blob/master/doc/images/app.png" alt="lx-music UI"></a></p>
若你想自己调用 LX Music可以参考文档「[Scheme URL 支持](https://lyswhut.github.io/lx-music-doc/desktop/scheme-url)」部分。
### 启动参
### 数据同步服务
目前软件已支持的启动参数如下:
从 v2.2.0 起,我们发布了一个独立的[数据同步服务](https://github.com/lyswhut/lx-music-sync-server#readme)。如果你有服务器,可以将其部署到服务器上作为私人多端同步服务使用,详情看该项目说明。
- `-search` 启动软件时自动在搜索框搜索指定的内容,例如:`-search="突然的自我 - 伍佰"`
- `-nt` 以非透明模式启动对于未开启AERO效果的win7系统可加此参数启动以确保界面正常显示
### 开放 API 支持
### 常见问题
从 v2.7.0 起支持开放 API 服务。启用该功能后,将会在本地启动一个 HTTP 服务,提供播放器相关的接口供第三方软件调用,详情看文档「[开放 API 服务](https://lyswhut.github.io/lx-music-doc/desktop/open-api)」部分。
常见问题已移至:<https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md>
### 数据存储目录
### 项目协议
默认情况下,软件的数据存储在:
- Linux`$XDG_CONFIG_HOME/lx-music-desktop``~/.config/lx-music-desktop`
- macOS`~/Library/Application Support/lx-music-desktop`
- Windows`%APPDATA%/lx-music-desktop`
在 Windows 平台上,若程序文件夹中存在 `portable` 文件夹,则自动使用此文件夹作为数据存储文件夹(适用于 v1.17.0 及以上版本)。
## 用户界面
<p><img width="100%" src="./doc/images/app.png" alt="lx-music desktop UI"></p>
## 贡献代码
本项目欢迎 PR但为了 PR 能顺利合并,需要注意以下几点:
- 对于添加新功能的 PR建议在提交 PR 前先创建 Issue 进行说明,以确认该功能是否确实需要。
- 对于修复 bug 的 PR请提供修复前后的说明及重现方式。
- 对于其他类型的 PR则适当附上说明。
贡献代码步骤:
1. 参照[源码使用方法](https://lyswhut.github.io/lx-music-doc/desktop/use-source-code)设置开发环境;
2. 克隆本仓库代码并切换至 `dev` 分支进行开发;
3. 提交 PR 至 `dev` 分支。
## 源码使用方法
请参阅:<https://lyswhut.github.io/lx-music-doc/desktop/use-source-code>
## 项目协议
本项目基于 [Apache License 2.0](https://github.com/lyswhut/lx-music-desktop/blob/master/LICENSE) 许可证发行,以下协议是对于 Apache License 2.0 的补充,如有冲突,以以下协议为准。
词语约定:本协议中的“本项目”指洛雪音乐桌面版项目;“使用者”指签署本协议的使用者;“官方音乐平台”指对本项目内置的包括酷我、酷狗、咪咕等音乐源的官方平台统称;“版权数据”指包括但不限于图像、音频、名字等在内的他人拥有所属版权的数据。
---
1. 本项目的数据来源原理是从各官方音乐平台的公开服务器中拉取数据,经过对数据简单地筛选与合并后进行展示,因此本项目不对数据的准确性负责。
2. 使用本项目的过程中可能会产生版权数据,对于这些版权数据,本项目不拥有它们的所有权,为了避免造成侵权,使用者务必在**24小时**内清除使用本项目的过程中所产生的版权数据。
3. 本项目内的官方音乐平台别名为本项目内对官方音乐平台的一个称呼,不包含恶意,如果官方音乐平台觉得不妥,可联系本项目更改或移除。
4. 本项目内使用的部分包括但不限于字体、图片等资源来源于互联网,如果出现侵权可联系本项目移除。
5. 由于使用本项目产生的包括由于本协议或由于使用或无法使用本项目而引起的任何性质的任何直接、间接、特殊、偶然或结果性损害(包括但不限于因商誉损失、停工、计算机故障或故障引起的损害赔偿,或任何及所有其他商业损害或损失)由使用者负责。
6. 本项目完全免费,且开源发布于 GitHub 面向全世界人用作对技术的学习交流,本项目不对项目内的技术可能存在违反当地法律法规的行为作保证,**禁止在违反当地法律法规的情况下使用本项目**,对于使用者在明知或不知当地法律法规不允许的情况下使用本项目所造成的任何违法违规行为由使用者承担,本项目不承担由此造成的任何直接、间接、特殊、偶然或结果性责任。
*词语约定:本协议中的“本项目”指 LX Music洛雪音乐助手桌面版项目“使用者”指签署本协议的使用者“官方音乐平台”指对本项目内置的包括酷我、酷狗、咪咕等音乐源的官方平台统称“版权数据”指包括但不限于图像、音频、名字等在内的他人拥有所属版权的数据。*
若你使用了本项目,将代表你接受以上协议。
### 一、数据来源
音乐平台不易,请尊重版权,支持正版。<br>
若对此有疑问请 mail to: lyswhut+qq.com (请将`+`替换成`@`)
1.1 本项目的各官方平台在线数据来源原理是从其公开服务器中拉取数据(与未登录状态在官方平台 APP 获取的数据相同),经过对数据简单地筛选与合并后进行展示,因此本项目不对数据的合法性、准确性负责。
1.2 本项目本身没有获取某个音频数据的能力,本项目使用的在线音频数据来源来自软件设置内“自定义源”设置所选择的“源”返回的在线链接。例如播放某首歌,本项目所做的只是将希望播放的歌曲名、艺术家等信息传递给“源”,若“源”返回了一个链接,则本项目将认为这就是该歌曲的音频数据而进行使用,至于这是不是正确的音频数据本项目无法校验其准确性,所以使用本项目的过程中可能会出现希望播放的音频与实际播放的音频不对应或者无法播放的问题。
1.3 本项目的非官方平台数据(例如“我的列表”内列表)来自使用者本地系统或者使用者连接的同步服务,本项目不对这些数据的合法性、准确性负责。
### 二、版权数据
2.1 使用本项目的过程中可能会产生版权数据。对于这些版权数据,本项目不拥有它们的所有权。为了避免侵权,使用者务必在 **24 小时内** 清除使用本项目的过程中所产生的版权数据。
### 三、音乐平台别名
3.1 本项目内的官方音乐平台别名为本项目内对官方音乐平台的一个称呼,不包含恶意。如果官方音乐平台觉得不妥,可联系本项目更改或移除。
### 四、资源使用
4.1 本项目内使用的部分包括但不限于字体、图片等资源来源于互联网。如果出现侵权可联系本项目移除。
### 五、免责声明
5.1 由于使用本项目产生的包括由于本协议或由于使用或无法使用本项目而引起的任何性质的任何直接、间接、特殊、偶然或结果性损害(包括但不限于因商誉损失、停工、计算机故障或故障引起的损害赔偿,或任何及所有其他商业损害或损失)由使用者负责。
### 六、使用限制
6.1 本项目完全免费,且开源发布于 GitHub 面向全世界人用作对技术的学习交流。本项目不对项目内的技术可能存在违反当地法律法规的行为作保证。
6.2 **禁止在违反当地法律法规的情况下使用本项目。** 对于使用者在明知或不知当地法律法规不允许的情况下使用本项目所造成的任何违法违规行为由使用者承担,本项目不承担由此造成的任何直接、间接、特殊、偶然或结果性责任。
### 七、版权保护
7.1 音乐平台不易,请尊重版权,支持正版。
### 八、非商业性质
8.1 本项目仅用于对技术可行性的探索及研究,不接受任何商业(包括但不限于广告等)合作及捐赠。
### 九、接受协议
9.1 若你使用了本项目,即代表你接受本协议。
---
若对此有疑问请 mail to: lyswhut+qq.com (请将 `+` 替换为 `@`)

View File

@@ -0,0 +1,28 @@
const { afterPack } = require('./deps')
const fs = require('fs').promises
// https://github.com/electron-userland/electron-builder/issues/4630
// https://github.com/electron-userland/electron-builder/issues/4630#issuecomment-782020139
module.exports = async(context) => {
await afterPack()
const { electronPlatformName, appOutDir } = context
if (electronPlatformName !== 'darwin') return
const {
productFilename,
info: {
_metadata: { macLanguagesInfoPlistStrings },
},
} = context.packager.appInfo
const resPath = `${appOutDir}/${productFilename}.app/Contents/Resources`
// 创建APP语言包文件
return Promise.all(
Object.entries(macLanguagesInfoPlistStrings).map(([lang, config]) => {
let infos = Object.entries(config).map(([k, v]) => `"${k}" = "${v}";`).join('\n')
return fs.writeFile(`${resPath}/${lang}.lproj/InfoPlist.strings`, infos)
}),
)
}

View File

@@ -0,0 +1,60 @@
// const fs = require('fs')
// const fsPromises = require('fs').promises
// const path = require('path')
const { Arch } = require('electron-builder')
// const nodeAbi = require('node-abi')
const { beforePack, copyLib } = require('./deps')
// const better_sqlite3_fileNameMap = {
// [Arch.x64]: 'linux-x64',
// [Arch.arm64]: 'linux-arm64',
// [Arch.armv7l]: 'linux-arm',
// }
// const replaceSqliteLib = async(arch) => {
// // console.log(await fs.readdir(path.join(context.appOutDir, './resources/')))
// // if (context.electronPlatformName != 'linux' || context.arch != Arch.arm64) return
// // https://github.com/lyswhut/lx-music-desktop/issues/1102
// // https://github.com/lyswhut/lx-music-desktop/issues/1161
// console.log('replace sqlite lib...')
// const filePath = path.join(__dirname, `./lib/better_sqlite3_${better_sqlite3_fileNameMap[arch]}.node`)
// console.log(filePath)
// const targetPath = path.join(__dirname, '../node_modules/better-sqlite3/build/Release/better_sqlite3.node')
// await fsPromises.unlink(targetPath).catch(_ => _)
// await fsPromises.copyFile(filePath, targetPath)
// }
const archMap = {
[Arch.x64]: 'x64',
[Arch.ia32]: 'ia32',
[Arch.arm64]: 'arm64',
[Arch.armv7l]: 'arm',
}
module.exports = async(context) => {
await beforePack()
const { arch } = context
const electronVersion = context.packager?.info?._framework?.version ?? require('../package.json').devDependencies.electron.replace(/^[^\d]*?(\d+)/, '$1')
await copyLib(archMap[arch], parseInt(electronVersion) == 22)
// const electronNodeAbi = nodeAbi.getAbi(electronVersion, 'electron')
// if (electronPlatformName !== 'linux' || process.env.FORCE) return
// // const bindingFilePath = path.join(__dirname, '../node_modules/better-sqlite3/binding.gyp')
// // const bindingBakFilePath = path.join(__dirname, '../node_modules/better-sqlite3/binding.gyp.bak')
// switch (arch) {
// case Arch.x64:
// case Arch.arm64:
// case Arch.armv7l:
// // if (fs.existsSync(bindingFilePath)) {
// // // console.log('rename binding file...')
// // await fsPromises.rename(bindingFilePath, bindingBakFilePath)
// // }
// await replaceSqliteLib(arch)
// break
// default:
// // if (fs.existsSync(bindingFilePath)) return
// // console.log('restore binding file...')
// // await fsPromises.rename(bindingBakFilePath, bindingFilePath)
// await copyLib(arch)
// break
// }
}

308
build-config/build-pack.js Normal file
View File

@@ -0,0 +1,308 @@
/* eslint-disable no-template-curly-in-string */
const builder = require('electron-builder')
const beforePack = require('./build-before-pack')
const afterPack = require('./build-after-pack')
/**
* @type {import('electron-builder').Configuration}
* @see https://www.electron.build/configuration/configuration
*/
const options = {
appId: 'cn.toside.music.desktop',
productName: 'lx-music-desktop',
beforePack,
afterPack,
protocols: {
name: 'lx-music-protocol',
schemes: [
'lxmusic',
],
},
directories: {
buildResources: './resources',
output: './build',
},
files: [
'!node_modules/**/*',
'node_modules/font-list',
'node_modules/better-sqlite3/lib',
'node_modules/better-sqlite3/package.json',
'node_modules/better-sqlite3/build/Release/better_sqlite3.node',
'node_modules/electron-font-manager/index.js',
'node_modules/electron-font-manager/package.json',
'node_modules/electron-font-manager/build/Release/font_manager.node',
'node_modules/node-gyp-build',
'node_modules/bufferutil',
'node_modules/utf-8-validate',
'dist/**/*',
],
asar: {
smartUnpack: false,
},
extraResources: [
'./licenses',
],
publish: [
{
provider: 'github',
owner: 'lyswhut',
repo: 'lx-music-desktop',
},
],
}
/**
* @type {import('electron-builder').Configuration}
* @see https://www.electron.build/configuration/configuration
*/
const winOptions = {
win: {
icon: './resources/icons/icon.ico',
legalTrademarks: 'lyswhut',
// artifactName: '${productName}-v${version}-${env.ARCH}-${env.TARGET}.${ext}',
},
nsis: {
oneClick: false,
language: '2052',
allowToChangeInstallationDirectory: true,
// differentialPackage: true,
license: './licenses/license.rtf',
shortcutName: 'LX Music',
},
}
/**
* @type {import('electron-builder').Configuration}
* @see https://www.electron.build/configuration/configuration
*/
const linuxOptions = {
linux: {
maintainer: 'lyswhut <lyswhut@qq.com>',
// artifactName: '${productName}-${version}.${env.ARCH}.${ext}',
icon: './resources/icons',
category: 'Utility;AudioVideo;Audio;Player;Music;',
desktop: {
// https://www.electron.build/app-builder-lib.interface.linuxdesktopfile
// https://www.electronjs.org/docs/latest/tutorial/linux-desktop-actions
// https://specifications.freedesktop.org/desktop-entry-spec/latest/example.html
// https://developer.gnome.org/documentation/guidelines/maintainer/integrating.html#desktop-files
entry: {
Name: 'LX Music',
'Name[zh_CN]': 'LX Music',
'Name[zh_TW]': 'LX Music',
Encoding: 'UTF-8',
MimeType: 'x-scheme-handler/lxmusic',
StartupNotify: 'false',
},
},
},
appImage: {
license: './licenses/license_zh.txt',
category: 'Utility;AudioVideo;Audio;Player;Music;',
},
}
/**
* @type {import('electron-builder').Configuration}
* @see https://www.electron.build/configuration/configuration
*/
const macOptions = {
mac: {
icon: './resources/icons/icon.icns',
category: 'public.app-category.music',
// artifactName: '${productName}-${version}.${ext}',
},
dmg: {
window: {
width: 530,
height: 380,
},
contents: [
{
x: 140,
y: 200,
},
{
x: 390,
y: 200,
type: 'link',
path: '/Applications',
},
],
title: 'LX Music v${version}',
},
}
// win: {
// tagret: {
// setup: ['nsis', '${productName}-v${version}-${env.ARCH}-Setup.${ext}'],
// green: ['7z', '${productName}-v${version}-${env.ARCH}-green.${ext}'],
// portable: ['portable', '${productName}-v${version}-${env.ARCH}-portable.${ext}'],
// },
// },
// linux: {
// platform: Platform.WINDOWS,
// arch: {
// x64: builder.Arch.x64,
// arm64: builder.Arch.arm64,
// armv7l: builder.Arch.armv7l,
// },
// tagret: {
// deb: ['deb', '${productName}_${version}_${env.ARCH}.${ext}'],
// appImage: ['AppImage', '${productName}_${version}_${env.ARCH}.${ext}'],
// pacman: ['pacman', '${productName}_${version}_${env.ARCH}.${ext}'],
// rpm: ['rpm', '${productName}-${version}.${env.ARCH}.${ext}'],
// },
// },
// mac: {
// arch: {
// x64: builder.Arch.x64,
// x86: builder.Arch.ia32,
// arm64: builder.Arch.arm64,
// },
// tagret: {
// dmg: ['dmg', '${productName}-${version}-${env.ARCH}.${ext}'],
// },
// },
const createTarget = {
/**
*
* @param {*} arch
* @param {*} packageType
* @returns {{ buildOptions: import('electron-builder').CliOptions, options: import('electron-builder').Configuration }}
*/
win(arch, packageType) {
switch (packageType) {
case 'setup':
winOptions.artifactName = `\${productName}-v\${version}-${arch}-Setup.\${ext}`
return {
buildOptions: { win: ['nsis'] },
options: winOptions,
}
case 'green':
winOptions.artifactName = `\${productName}-v\${version}-win_${arch}-green.\${ext}`
return {
buildOptions: { win: ['7z'] },
options: winOptions,
}
case 'win7_setup':
winOptions.artifactName = `\${productName}-v\${version}-win7_${arch}-Setup.\${ext}`
return {
buildOptions: { win: ['nsis'] },
options: winOptions,
}
case 'win7_green':
winOptions.artifactName = `\${productName}-v\${version}-win7_${arch}-green.\${ext}`
return {
buildOptions: { win: ['7z'] },
options: winOptions,
}
case 'portable':
winOptions.artifactName = `\${productName}-v\${version}-${arch}-portable.\${ext}`
return {
buildOptions: { win: ['portable'] },
options: winOptions,
}
default: throw new Error('Unknown package type: ' + packageType)
}
},
/**
*
* @param {*} arch
* @param {*} packageType
* @returns {{ buildOptions: import('electron-builder').CliOptions, options: import('electron-builder').Configuration }}
*/
linux(arch, packageType) {
switch (packageType) {
case 'deb':
linuxOptions.artifactName = `\${productName}_\${version}_${arch == 'x64' ? 'amd64' : arch}.\${ext}`
return {
buildOptions: { linux: ['deb'] },
options: linuxOptions,
}
case 'appImage':
linuxOptions.artifactName = `\${productName}_\${version}_${arch}.\${ext}`
return {
buildOptions: { linux: ['AppImage'] },
options: linuxOptions,
}
case 'pacman':
linuxOptions.artifactName = `\${productName}_\${version}_${arch}.\${ext}`
return {
buildOptions: { linux: ['pacman'] },
options: linuxOptions,
}
case 'rpm':
linuxOptions.artifactName = `\${productName}-\${version}.${arch}.\${ext}`
return {
buildOptions: { linux: ['rpm'] },
options: linuxOptions,
}
default: throw new Error('Unknown package type: ' + packageType)
}
},
/**
*
* @param {*} arch
* @param {*} packageType
* @returns {{ buildOptions: import('electron-builder').CliOptions, options: import('electron-builder').Configuration }}
*/
mac(arch, packageType) {
switch (packageType) {
case 'dmg':
macOptions.artifactName = `\${productName}-\${version}-${arch}.\${ext}`
return {
buildOptions: { mac: ['dmg'] },
options: macOptions,
}
default: throw new Error('Unknown package type: ' + packageType)
}
},
}
/**
*
* @param {'win' | 'mac' | 'linux' | 'dir'} target 构建目标平台
* @param {'x86_64' | 'x64' | 'x86' | 'arm64' | 'armv7l'} arch 包架构
* @param {*} packageType 包类型
* @param {'onTagOrDraft' | 'always' | 'never'} publishType 发布类型
*/
const build = async(target, arch, packageType, publishType) => {
if (target == 'dir') {
await builder.build({
dir: true,
config: { ...options, ...winOptions, ...linuxOptions, ...macOptions },
})
return
}
const targetInfo = createTarget[target](arch, packageType)
// Promise is returned
await builder.build({
...targetInfo.buildOptions,
publish: publishType ?? 'never',
x64: arch == 'x64' || arch == 'x86_64',
ia32: arch == 'x86' || arch == 'x86_64',
arm64: arch == 'arm64',
armv7l: arch == 'armv7l',
config: { ...options, ...targetInfo.options },
})
// .then((result) => {
// console.log(JSON.stringify(result))
// })
// .catch((error) => {
// console.error(error)
// })
}
const params = {}
for (const param of process.argv.slice(2)) {
const [name, value] = param.split('=')
params[name] = value
}
if (params.target == null) throw new Error('Missing target')
if (params.target != 'dir' && params.arch == null) throw new Error('Missing arch')
if (params.target != 'dir' && params.type == null) throw new Error('Missing type')
console.log(params.target, params.arch, params.type, params.publish ?? '')
build(params.target, params.arch, params.type, params.publish)

View File

@@ -2,7 +2,9 @@ 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',
namedExport: false,
},
sourceMap: isDev,
}

View File

@@ -0,0 +1,46 @@
// 修补依赖源码以使vite构建的依赖恢复正常工作
const fs = require('node:fs')
const path = require('node:path')
const rootPath = path.join(__dirname, '../')
const patchs = [
// [
// path.join(rootPath, './node_modules/ws/package.json'),
// '\n "browser": "./browser.js",',
// '',
// ],
// [
// path.join(rootPath, './node_modules/music-metadata/package.json'),
// '"default": "./lib/core.js"',
// '"default": "./lib/index.js"',
// ],
// [
// path.join(rootPath, './node_modules/strtok3/package.json'),
// '"default": "./lib/core.js"',
// '"default": "./lib/index.js"',
// ],
[
path.join(rootPath, './node_modules/better-sqlite3/package.json'),
`{
"build-release": "node-gyp clean && node-gyp rebuild --release --force_build=1",`,
`{
"install": "node -e \\"process.exit(require('fs').existsSync('build/Release/better_sqlite3.node') ? 0 : 1)\\" || node-gyp rebuild --release --force_build=1",
"build-release": "node-gyp clean && node-gyp rebuild --release --force_build=1",`,
],
]
;(async() => {
for (const [filePath, fromStr, toStr] of patchs) {
console.log(`Patching ${filePath.replace(rootPath, '')}`)
try {
const file = (await fs.promises.readFile(filePath)).toString()
await fs.promises.writeFile(filePath, file.replace(fromStr, toStr))
} catch (err) {
console.error(`Patch ${filePath.replace(rootPath, '')} failed: ${err.message}`)
}
}
console.log('\nDependencies patch finished.\n')
})()

55
build-config/deps.js Normal file
View File

@@ -0,0 +1,55 @@
const fs = require('fs')
const path = require('path')
const bindingFilePath = path.join(__dirname, '../node_modules/better-sqlite3/binding.gyp')
const bindingBakFilePath = path.join(__dirname, '../node_modules/better-sqlite3/binding.gyp.bak')
exports.beforePack = async() => {
if (!fs.existsSync(bindingFilePath)) return
fs.renameSync(bindingFilePath, bindingBakFilePath)
// try {
// fs.writeFileSync(
// bindingFilePath,
// fs.readFileSync(bindingFilePath, 'utf-8').replace('\'force_build%\': 0,', '\'force_build%\': 1,'),
// )
// } catch (error) {
// console.error(error)
// }
}
exports.afterPack = async() => {
if (fs.existsSync(bindingFilePath)) return
fs.renameSync(bindingBakFilePath, bindingFilePath)
// try {
// fs.writeFileSync(
// bindingFilePath,
// fs.readFileSync(bindingFilePath, 'utf-8').replace('\'force_build%\': 1,', '\'force_build%\': 0,'),
// )
// } catch (error) {
// console.error(error)
// }
}
const replaceSqliteLib = async(arch) => {
// console.log(await fs.readdir(path.join(context.appOutDir, './resources/')))
// if (context.electronPlatformName != 'linux' || context.arch != Arch.arm64) return
// https://github.com/lyswhut/lx-music-desktop/issues/1102
// https://github.com/lyswhut/lx-music-desktop/issues/1161
console.log('replace sqlite lib...')
const filePath = path.join(__dirname, `./lib/better_sqlite3_${process.platform}-${arch}.node`)
console.log(filePath)
const targetPath = path.join(__dirname, '../node_modules/better-sqlite3/build/Release/better_sqlite3.node')
await fs.promises.unlink(targetPath).catch(_ => _)
await fs.promises.copyFile(filePath, targetPath)
}
exports.copyLib = async(arch = process.arch, replaceLocal = false) => {
if (process.platform === 'linux' || replaceLocal) {
await replaceSqliteLib(arch)
return
}
const libPath = path.join(__dirname, `../node_modules/better-sqlite3/prebuilds/${process.platform}-${arch}.node`)
if (!fs.existsSync(libPath)) {
console.error(`Better-sqlite3 prebuild not found for ${process.platform}-${arch}`)
return
}
const targetPath = path.join(__dirname, '../node_modules/better-sqlite3/build/Release/better_sqlite3.node')
await fs.promises.cp(libPath, targetPath, { recursive: true, force: true })
}

View File

@@ -0,0 +1,49 @@
const fs = require('fs')
const path = require('path')
const tar = require('tar')
const libDir = path.join(__dirname, 'lib')
const getGzipFiles = async() => {
const names = await fs.promises.readdir(libDir)
// for (const name of names) {
// if (name.endsWith('.node')) await fs.promises.unlink(path.join(libDir, name))
// }
return names.filter((name) => name.endsWith('.gz'))
}
const unzip = async(filePath) => {
const targetDir = filePath.replace('.tar.gz', '')
if (fs.existsSync(targetDir)) await fs.promises.rm(targetDir, { recursive: true })
await fs.promises.mkdir(targetDir)
await tar.x({
file: filePath,
strip: 0,
C: targetDir,
})
return targetDir
}
const files = ['better_sqlite3']
const moveFile = async(filePath) => {
const name = `${path.basename(filePath).split('_v')[0].replace('_', '-')}`
for (const fileName of files) {
// if (fileName == 'better_sqlite3' && !name.includes('linux')) continue
const targetPath = path.join(libDir, `${fileName}_${name}.node`)
if (fs.existsSync(targetPath)) await fs.promises.unlink(targetPath)
await fs.promises.rename(path.join(filePath, `${fileName}.node`), targetPath)
}
await fs.promises.rm(filePath, { recursive: true })
}
const run = async() => {
const files = await getGzipFiles()
for (const name of files) {
await moveFile(await unzip(path.join(libDir, name)))
}
for (const name of files) {
await fs.promises.unlink(path.join(libDir, name))
}
}
run()

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,41 +1,45 @@
const path = require('path')
const ESLintPlugin = require('eslint-webpack-plugin')
module.exports = {
target: 'electron-main',
output: {
filename: '[name].js',
libraryTarget: 'commonjs2',
path: path.join(__dirname, '../../dist/electron'),
library: {
type: 'commonjs2',
},
path: path.join(__dirname, '../../dist'),
},
externals: {
'font-list': 'font-list',
'better-sqlite3': 'better-sqlite3',
'electron-font-manager': 'electron-font-manager',
bufferutil: 'bufferutil',
'utf-8-validate': 'utf-8-validate',
},
resolve: {
alias: {
'@': path.join(__dirname, '../../src/main'),
events: path.join(__dirname, '../../src/main/events'),
common: path.join(__dirname, '../../src/common'),
'@main': path.join(__dirname, '../../src/main'),
'@renderer': path.join(__dirname, '../../src/renderer'),
'@lyric': path.join(__dirname, '../../src/renderer-lyric'),
'@common': path.join(__dirname, '../../src/common'),
},
extensions: ['*', '.js', '.json', '.node'],
extensions: ['.tsx', '.ts', '.js', '.mjs', '.json', '.node'],
},
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'eslint-loader',
options: {
formatter: require('eslint-formatter-friendly'),
},
},
exclude: /node_modules/,
enforce: 'pre',
test: /\.node$/,
use: 'node-loader',
},
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
// {
// test: /\.js$/,
// loader: 'babel-loader',
// exclude: /node_modules/,
// },
],
},
performance: {
maxEntrypointSize: 300000,
},
plugins: [
new ESLintPlugin(),
],
}

View File

@@ -1,7 +1,6 @@
const path = require('path')
const { merge } = require('webpack-merge')
const webpack = require('webpack')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const baseConfig = require('./webpack.config.base')
@@ -9,27 +8,21 @@ const baseConfig = require('./webpack.config.base')
module.exports = merge(baseConfig, {
mode: 'development',
entry: {
main: path.join(__dirname, '../../src/main/index.dev.js'),
main: path.join(__dirname, '../../src/main/index-dev.ts'),
// 'dbService.worker': path.join(__dirname, '../../src/main/worker/dbService/index.ts'),
},
devtool: 'eval-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"development"',
},
__static: `"${path.join(__dirname, '../../src/static').replace(/\\/g, '\\\\')}"`,
}),
new webpack.NoEmitOnErrorsPlugin(),
new FriendlyErrorsPlugin({
onErrors(severity, errors) { // Silent warning from electron-debug
if (severity != 'warning') return
for (let i = errors.length - 1; i > -1; i--) {
const error = errors[i]
if (error.file == './node_modules/electron-debug/index.js') errors.splice(i, 1)
}
// You can listen to errors transformed and prioritized by the plugin
// severity can be 'error' or 'warning'
},
webpackStaticPath: `"${path.join(__dirname, '../../src/static').replace(/\\/g, '\\\\')}"`,
webpackUserApiPath: `"${path.join(__dirname, '../../src/main/modules/userApi').replace(/\\/g, '\\\\')}"`,
}),
],
performance: {
maxEntrypointSize: 1024 * 1024 * 50,
maxAssetSize: 1024 * 1024 * 30,
},
})

View File

@@ -1,29 +1,51 @@
const path = require('path')
const { merge } = require('webpack-merge')
const webpack = require('webpack')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const baseConfig = require('./webpack.config.base')
const { dependencies } = require('../../package.json')
// const { dependencies } = require('../../package.json')
// const buildConfig = require('../webpack-build-config')
module.exports = merge(baseConfig, {
mode: 'production',
devtool: false,
entry: {
main: path.join(__dirname, '../../src/main/index.js'),
main: path.join(__dirname, '../../src/main/index.ts'),
// 'dbService.worker': path.join(__dirname, '../../src/main/worker/dbService/index.ts'),
},
externals: [
...Object.keys(dependencies || {}),
],
node: {
__dirname: false,
__filename: false,
},
plugins: [
new CopyWebpackPlugin({
patterns: [
{
from: path.join(__dirname, '../../src/main/modules/userApi/renderer/user-api.html'),
to: path.join(__dirname, '../../dist/userApi/renderer/user-api.html'),
},
{
from: path.join(__dirname, '../../src/common/theme/images/*').replace(/\\/g, '/'),
to: path.join(__dirname, '../../dist/theme_images/[name][ext]'),
},
],
}),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"',
BUILD_WIN7: `'${process.env.BUILD_WIN7}'`,
},
}),
],
performance: {
maxEntrypointSize: 1024 * 1024 * 10,
maxAssetSize: 1024 * 1024 * 20,
},
optimization: {
minimize: false,
},
})

View File

@@ -5,21 +5,26 @@ const del = require('del')
const webpack = require('webpack')
const Spinnies = require('spinnies')
const mainConfig = require('./main/webpack.config.prod')
const rendererConfig = require('./renderer/webpack.config.prod')
const rendererLyricConfig = require('./renderer-lyric/webpack.config.prod')
const mainConfig = './main/webpack.config.prod'
const rendererConfig = './renderer/webpack.config.prod'
const rendererLyricConfig = './renderer-lyric/webpack.config.prod'
const rendererScriptConfig = './renderer-scripts/webpack.config.prod'
const errorLog = chalk.bgRed.white(' ERROR ') + ' '
const okayLog = chalk.bgGreen.white(' OKAY ') + ' '
const { Worker, isMainThread, parentPort } = require('worker_threads')
function build() {
del.sync(['dist/electron/**', 'build/**'])
console.time('build')
del.sync(['dist/**', 'build/**'])
const spinners = new Spinnies({ color: 'blue' })
spinners.add('main', { text: 'main building' })
spinners.add('renderer', { text: 'renderer building' })
spinners.add('renderer-lyric', { text: 'renderer-lyric building' })
spinners.add('renderer-scripts', { text: 'renderer-scripts building' })
let results = ''
// m.on('success', () => {
@@ -32,6 +37,7 @@ function build() {
process.stdout.write('\x1B[2J\x1B[0f')
console.log(`\n\n${results}`)
console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`)
console.timeEnd('build')
process.exit()
}
@@ -63,11 +69,35 @@ function build() {
console.error(`\n${err}\n`)
process.exit(1)
}),
pack(rendererScriptConfig).then(result => {
results += result + '\n\n'
spinners.succeed('renderer-scripts', { text: 'renderer-scripts build success!' })
}).catch(err => {
spinners.fail('renderer-scripts', { text: 'renderer-scripts build fail :(' })
console.log(`\n ${errorLog}failed to build renderer-scripts process`)
console.error(`\n${err}\n`)
process.exit(1)
}),
]).then(handleSuccess)
}
function pack(config) {
return new Promise((resolve, reject) => {
const worker = new Worker(__filename)
const subChannel = new MessageChannel()
worker.postMessage({ port: subChannel.port1, config }, [subChannel.port1])
subChannel.port2.on('message', ({ status, message }) => {
switch (status) {
case 'success': return resolve(message)
case 'error': return reject(message)
}
})
})
}
function runPack(config) {
return new Promise((resolve, reject) => {
config = require(config)
config.mode = 'production'
webpack(config, (err, stats) => {
if (err) reject(err.stack || err)
@@ -95,5 +125,22 @@ function pack(config) {
})
}
build()
if (isMainThread) build()
else {
parentPort.once('message', ({ port, config }) => {
// assert(port instanceof MessagePort)
runPack(config).then((result) => {
port.postMessage({
status: 'success',
message: result,
})
}).catch((err) => {
port.postMessage({
status: 'error',
message: err,
})
}).finally(() => {
port.close()
})
})
}

View File

@@ -0,0 +1,2 @@
const { Arch } = require('electron-builder')
require('./build-before-pack')({ electronPlatformName: process.platform, arch: Arch[process.arch] })

View File

@@ -0,0 +1,3 @@
const { copyLib } = require('./deps')
copyLib()

View File

@@ -1,7 +1,8 @@
const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const { VueLoaderPlugin } = require('vue-loader')
const HTMLPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const ESLintPlugin = require('eslint-webpack-plugin')
const vueLoaderConfig = require('../vue-loader.config')
const { mergeCSSLoader } = require('../utils')
@@ -11,33 +12,42 @@ const isDev = process.env.NODE_ENV === 'development'
module.exports = {
target: 'electron-renderer',
entry: {
'renderer-lyric': path.join(__dirname, '../../src/renderer-lyric/main.js'),
'renderer-lyric': path.join(__dirname, '../../src/renderer-lyric/main.ts'),
},
output: {
filename: '[name].js',
libraryTarget: 'commonjs2',
path: path.join(__dirname, '../../dist/electron'),
publicPath: './',
library: {
type: 'commonjs2',
},
path: path.join(__dirname, '../../dist'),
publicPath: '',
},
resolve: {
alias: {
'@': path.join(__dirname, '../../src/renderer'),
common: path.join(__dirname, '../../src/common'),
'@root': path.join(__dirname, '../../src'),
'@main': path.join(__dirname, '../../src/main'),
'@renderer': path.join(__dirname, '../../src/renderer'),
'@lyric': path.join(__dirname, '../../src/renderer-lyric'),
'@static': path.join(__dirname, '../../src/static'),
'@common': path.join(__dirname, '../../src/common'),
},
extensions: ['*', '.js', '.json', '.vue', '.node'],
extensions: ['.tsx', '.ts', '.js', '.json', '.node'],
},
module: {
rules: [
{
test: /\.(vue|js)$/,
test: /\.tsx?$/,
exclude: /node_modules/,
use: {
loader: 'eslint-loader',
loader: 'ts-loader',
options: {
formatter: require('eslint-formatter-friendly'),
appendTsSuffixTo: [/\.vue$/],
},
},
exclude: /node_modules/,
enforce: 'pre',
},
{
test: /\.node$/,
use: 'node-loader',
},
{
test: /\.vue$/,
@@ -45,9 +55,8 @@ module.exports = {
options: vueLoaderConfig,
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
test: /\.pug$/,
loader: 'pug-plain-loader',
},
{
test: /\.css$/,
@@ -62,62 +71,63 @@ module.exports = {
},
}),
},
{
test: /\.styl(:?us)?$/,
oneOf: mergeCSSLoader({
loader: 'stylus-loader',
options: {
sourceMap: true,
},
}),
},
{
test: /\.pug$/,
oneOf: [
// Use pug-plain-loader handle .vue file
{
resourceQuery: /vue/,
use: ['pug-plain-loader'],
},
// Use pug-loader handle .pug file
{
use: ['pug-loader'],
},
],
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'imgs/[name]--[folder].[ext]',
exclude: path.join(__dirname, '../../src/renderer/assets/svgs'),
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 10000,
},
},
generator: {
filename: 'imgs/[name]-[contenthash:8][ext]',
},
},
{
test: /\.svg$/,
include: path.join(__dirname, '../../src/renderer/assets/svgs'),
use: [
{
loader: 'svg-sprite-loader',
options: {
symbolId: 'icon-[name]',
},
},
'svg-transform-loader',
'svgo-loader',
],
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'media/[name]--[folder].[ext]',
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 10000,
},
},
generator: {
filename: 'media/[name]-[contenthash:8][ext]',
},
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'fonts/[name]--[folder].[ext]',
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 10000,
},
},
generator: {
filename: 'fonts/[name]-[contenthash:8][ext]',
},
},
],
},
performance: {
maxEntrypointSize: 300000,
},
plugins: [
new HTMLPlugin({
filename: 'lyric.html',
template: path.join(__dirname, '../../src/renderer-lyric/index.pug'),
template: path.join(__dirname, '../../src/renderer-lyric/index.html'),
isProd: process.env.NODE_ENV == 'production',
browser: process.browser,
__dirname,
@@ -129,5 +139,9 @@ module.exports = {
filename: isDev ? '[name].css' : '[name].[contenthash:8].css',
chunkFilename: isDev ? '[id].css' : '[id].[contenthash:8].css',
}),
new ESLintPlugin({
extensions: ['js', 'vue'],
formatter: require('eslint-formatter-friendly'),
}),
],
}

View File

@@ -1,6 +1,5 @@
const path = require('path')
const webpack = require('webpack')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const { merge } = require('webpack-merge')
@@ -10,15 +9,15 @@ module.exports = merge(baseConfig, {
mode: 'development',
devtool: 'eval-source-map',
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
new FriendlyErrorsPlugin(),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"development"',
ELECTRON_DISABLE_SECURITY_WARNINGS: 'true',
},
__static: `"${path.join(__dirname, '../../src/static').replace(/\\/g, '\\\\')}"`,
__VUE_OPTIONS_API__: 'true',
__VUE_PROD_DEVTOOLS__: 'false',
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',
staticPath: `"${path.join(__dirname, '../../src/static').replace(/\\/g, '\\\\')}"`,
}),
],
performance: {

View File

@@ -1,46 +1,44 @@
const path = require('path')
// const path = require('path')
const webpack = require('webpack')
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
const TerserPlugin = require('terser-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const { merge } = require('webpack-merge')
const baseConfig = require('./webpack.config.base')
const buildConfig = require('../webpack-build-config')
const { dependencies } = require('../../package.json')
// const { dependencies } = require('../../package.json')
let whiteListedModules = ['vue']
// let whiteListedModules = ['vue']
// let whiteListedModules = ['vue', 'vue-router', 'vuex', 'vue-i18n']
module.exports = merge(baseConfig, {
mode: 'production',
devtool: false,
devtool: 'source-map',
externals: [
...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d)),
// ...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d)),
],
plugins: [
new CopyWebpackPlugin({
patterns: [
{
from: path.join(__dirname, '../../src/static'),
to: path.join(__dirname, '../../dist/electron/static'),
},
],
}),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"',
},
__VUE_OPTIONS_API__: 'true',
__VUE_PROD_DEVTOOLS__: 'false',
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',
}),
],
optimization: {
chunkIds: 'named',
minimize: buildConfig.minimize,
minimizer: [
new TerserPlugin(),
new OptimizeCSSAssetsPlugin({}),
new CssMinimizerPlugin(),
],
},
performance: {
maxEntrypointSize: 1024 * 1024 * 10,
maxAssetSize: 1024 * 1024 * 20,
hints: 'warning',
},
node: {

View File

@@ -0,0 +1,52 @@
const path = require('path')
const ESLintPlugin = require('eslint-webpack-plugin')
module.exports = {
target: 'electron-renderer',
entry: {
'user-api-preload': path.join(__dirname, '../../src/main/modules/userApi/renderer/preload.js'),
},
output: {
filename: '[name].js',
library: {
type: 'commonjs2',
},
path: path.join(__dirname, '../../dist'),
publicPath: '',
},
resolve: {
alias: {
'@root': path.join(__dirname, '../../src'),
'@main': path.join(__dirname, '../../src/main'),
'@renderer': path.join(__dirname, '../../src/renderer'),
'@lyric': path.join(__dirname, '../../src/renderer-lyric'),
'@static': path.join(__dirname, '../../src/static'),
'@common': path.join(__dirname, '../../src/common'),
},
extensions: ['.tsx', '.ts', '.js', '.json', '.node'],
},
module: {
rules: [
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: {
loader: 'ts-loader',
options: {
appendTsSuffixTo: [/\.vue$/],
},
},
},
{
test: /\.node$/,
use: 'node-loader',
},
],
},
plugins: [
new ESLintPlugin({
extensions: ['js'],
formatter: require('eslint-formatter-friendly'),
}),
],
}

View File

@@ -0,0 +1,24 @@
const path = require('path')
const webpack = require('webpack')
const { merge } = require('webpack-merge')
const baseConfig = require('./webpack.config.base')
module.exports = merge(baseConfig, {
mode: 'development',
devtool: 'eval-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"development"',
ELECTRON_DISABLE_SECURITY_WARNINGS: 'true',
},
staticPath: `"${path.join(__dirname, '../../src/static').replace(/\\/g, '\\\\')}"`,
}),
],
performance: {
hints: false,
},
})

View File

@@ -0,0 +1,45 @@
// const path = require('path')
const webpack = require('webpack')
const TerserPlugin = require('terser-webpack-plugin')
const { merge } = require('webpack-merge')
const baseConfig = require('./webpack.config.base')
const buildConfig = require('../webpack-build-config')
// const { dependencies } = require('../../package.json')
// let whiteListedModules = ['vue']
// let whiteListedModules = ['vue', 'vue-router', 'vuex', 'vue-i18n']
module.exports = merge(baseConfig, {
mode: 'production',
devtool: 'source-map',
externals: [
// ...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d)),
],
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"',
},
}),
],
optimization: {
minimize: buildConfig.minimize,
minimizer: [
new TerserPlugin(),
],
},
performance: {
maxEntrypointSize: 1024 * 1024 * 10,
maxAssetSize: 1024 * 1024 * 20,
hints: 'warning',
},
node: {
__dirname: false,
__filename: false,
},
})

View File

@@ -1,7 +1,8 @@
const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const { VueLoaderPlugin } = require('vue-loader')
const HTMLPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const ESLintPlugin = require('eslint-webpack-plugin')
const vueLoaderConfig = require('../vue-loader.config')
const { mergeCSSLoader } = require('../utils')
@@ -11,33 +12,48 @@ const isDev = process.env.NODE_ENV === 'development'
module.exports = {
target: 'electron-renderer',
entry: {
renderer: path.join(__dirname, '../../src/renderer/main.js'),
renderer: path.join(__dirname, '../../src/renderer/main.ts'),
},
output: {
filename: '[name].js',
libraryTarget: 'commonjs2',
path: path.join(__dirname, '../../dist/electron'),
publicPath: './',
library: {
type: 'commonjs2',
},
path: path.join(__dirname, '../../dist'),
publicPath: '',
},
resolve: {
alias: {
'@': path.join(__dirname, '../../src/renderer'),
common: path.join(__dirname, '../../src/common'),
'@root': path.join(__dirname, '../../src'),
'@main': path.join(__dirname, '../../src/main'),
'@renderer': path.join(__dirname, '../../src/renderer'),
'@lyric': path.join(__dirname, '../../src/renderer-lyric'),
'@static': path.join(__dirname, '../../src/static'),
'@common': path.join(__dirname, '../../src/common'),
},
extensions: ['*', '.js', '.json', '.vue', '.node'],
extensions: ['.tsx', '.ts', '.js', '.json', '.node'],
},
module: {
rules: [
{
test: /\.(vue|js)$/,
test: /\.tsx?$/,
exclude: /node_modules/,
use: {
loader: 'eslint-loader',
loader: 'ts-loader',
options: {
formatter: require('eslint-formatter-friendly'),
appendTsSuffixTo: [/\.vue$/],
},
},
exclude: /node_modules/,
enforce: 'pre',
parser: {
worker: [
'*audioContext.audioWorklet.addModule()',
'...',
],
},
},
{
test: /\.node$/,
use: 'node-loader',
},
{
test: /\.vue$/,
@@ -45,9 +61,8 @@ module.exports = {
options: vueLoaderConfig,
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
test: /\.pug$/,
loader: 'pug-plain-loader',
},
{
test: /\.css$/,
@@ -62,62 +77,63 @@ module.exports = {
},
}),
},
{
test: /\.styl(:?us)?$/,
oneOf: mergeCSSLoader({
loader: 'stylus-loader',
options: {
sourceMap: true,
},
}),
},
{
test: /\.pug$/,
oneOf: [
// Use pug-plain-loader handle .vue file
{
resourceQuery: /vue/,
use: ['pug-plain-loader'],
},
// Use pug-loader handle .pug file
{
use: ['pug-loader'],
},
],
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'imgs/[name]--[folder].[ext]',
exclude: path.join(__dirname, '../../src/renderer/assets/svgs'),
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 10000,
},
},
generator: {
filename: 'imgs/[name]-[contenthash:8][ext]',
},
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'media/[name]--[folder].[ext]',
test: /\.svg$/,
include: path.join(__dirname, '../../src/renderer/assets/svgs'),
use: [
{
loader: 'svg-sprite-loader',
options: {
symbolId: 'icon-[name]',
},
},
'svg-transform-loader',
'svgo-loader',
],
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)$/,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 10000,
},
},
generator: {
filename: 'media/[name]-[contenthash:8][ext]',
},
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'fonts/[name]--[folder].[ext]',
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 10000,
},
},
generator: {
filename: 'fonts/[name]-[contenthash:8][ext]',
},
},
],
},
performance: {
maxEntrypointSize: 300000,
},
plugins: [
new HTMLPlugin({
filename: 'index.html',
template: path.join(__dirname, '../../src/renderer/index.pug'),
template: path.join(__dirname, '../../src/renderer/index.html'),
isProd: process.env.NODE_ENV == 'production',
browser: process.browser,
__dirname,
@@ -129,5 +145,9 @@ module.exports = {
filename: isDev ? '[name].css' : '[name].[contenthash:8].css',
chunkFilename: isDev ? '[id].css' : '[id].[contenthash:8].css',
}),
new ESLintPlugin({
extensions: ['js', 'vue'],
formatter: require('eslint-formatter-friendly'),
}),
],
}

View File

@@ -1,24 +1,31 @@
const path = require('path')
const webpack = require('webpack')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const { merge } = require('webpack-merge')
const baseConfig = require('./webpack.config.base')
const gitInfo = {
commit_id: '',
commit_date: '',
}
module.exports = merge(baseConfig, {
mode: 'development',
devtool: 'eval-source-map',
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
new FriendlyErrorsPlugin(),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"development"',
ELECTRON_DISABLE_SECURITY_WARNINGS: 'true',
},
__static: `"${path.join(__dirname, '../../src/static').replace(/\\/g, '\\\\')}"`,
// ENVIRONMENT: 'process.env',
__VUE_OPTIONS_API__: 'true',
__VUE_PROD_DEVTOOLS__: 'false',
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',
COMMIT_ID: `"${gitInfo.commit_id}"`,
COMMIT_DATE: `"${gitInfo.commit_date}"`,
staticPath: `"${path.join(__dirname, '../../src/static').replace(/\\/g, '\\\\')}"`,
}),
],
performance: {

View File

@@ -1,29 +1,50 @@
const path = require('path')
const { execSync } = require('child_process')
const webpack = require('webpack')
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
const TerserPlugin = require('terser-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const { merge } = require('webpack-merge')
const baseConfig = require('./webpack.config.base')
const buildConfig = require('../webpack-build-config')
const { dependencies } = require('../../package.json')
// const { dependencies } = require('../../package.json')
let whiteListedModules = ['vue']
// let whiteListedModules = ['vue', 'vue-router', 'vuex', 'vue-i18n']
const gitInfo = {
commit_id: '',
commit_date: '',
}
try {
let isClean = !execSync('git status --porcelain').toString().trim()
if (process.env.BUILD_WIN7) {
console.warn('BUILD_WIN7 is set, skipping git status check.')
console.log('Workspace status:', execSync('git status --porcelain').toString().trim())
isClean = true
}
if (isClean) {
gitInfo.commit_id = execSync('git log -1 --pretty=format:"%H"').toString().trim()
gitInfo.commit_date = execSync('git log -1 --pretty=format:"%ad" --date=iso-strict').toString().trim()
} else if (process.env.IS_CI) {
throw new Error('Working directory is not clean')
}
} catch {}
module.exports = merge(baseConfig, {
mode: 'production',
devtool: false,
devtool: 'source-map',
externals: [
...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d)),
// ...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d)),
],
plugins: [
new CopyWebpackPlugin({
patterns: [
{
from: path.join(__dirname, '../../src/static'),
to: path.join(__dirname, '../../dist/electron/static'),
to: path.join(__dirname, '../../dist/static'),
},
],
}),
@@ -31,16 +52,28 @@ module.exports = merge(baseConfig, {
'process.env': {
NODE_ENV: '"production"',
},
// ENVIRONMENT: 'process.env',
__VUE_OPTIONS_API__: 'true',
__VUE_PROD_DEVTOOLS__: 'false',
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',
COMMIT_ID: `"${gitInfo.commit_id}"`,
COMMIT_DATE: `"${gitInfo.commit_date}"`,
}),
],
optimization: {
chunkIds: 'named',
minimize: buildConfig.minimize,
minimizer: [
new TerserPlugin(),
new OptimizeCSSAssetsPlugin({}),
new CssMinimizerPlugin(),
],
splitChunks: {
chunks: 'initial',
minChunks: 2,
},
},
performance: {
maxEntrypointSize: 1024 * 1024 * 10,
maxAssetSize: 1024 * 1024 * 20,
hints: 'warning',
},
node: {

View File

@@ -13,10 +13,15 @@ const webpackHotMiddleware = require('webpack-hot-middleware')
const mainConfig = require('./main/webpack.config.dev')
const rendererConfig = require('./renderer/webpack.config.dev')
const rendererLyricConfig = require('./renderer-lyric/webpack.config.dev')
const rendererScriptConfig = require('./renderer-scripts/webpack.config.dev')
const { Arch } = require('electron-builder')
const replaceLib = require('./build-before-pack')
const treeKill = require('tree-kill')
const { debounce } = require('./utils')
let electronProcess = null
let manualRestart = false
let hotMiddleware
let hotMiddlewareRenderer
let hotMiddlewareRendererLyric
function startRenderer() {
@@ -24,7 +29,7 @@ function startRenderer() {
// rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
// rendererConfig.mode = 'development'
const compiler = webpack(rendererConfig)
hotMiddleware = webpackHotMiddleware(compiler, {
hotMiddlewareRenderer = webpackHotMiddleware(compiler, {
log: false,
heartbeat: 2500,
})
@@ -32,37 +37,39 @@ function startRenderer() {
compiler.hooks.compilation.tap('compilation', compilation => {
// console.log(Object.keys(compilation.hooks))
HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => {
hotMiddleware.publish({ action: 'reload' })
hotMiddlewareRenderer.publish({ action: 'reload' })
cb()
})
})
compiler.hooks.done.tap('done', stats => {
// logStats('Renderer', 'Compile done')
// logStats('Renderer', stats)
})
// compiler.hooks.done.tap('done', stats => {
// // logStats('Renderer', 'Compile done')
// // logStats('Renderer', stats)
// })
const server = new WebpackDevServer(
compiler,
{
contentBase: path.join(__dirname, '../'),
quiet: true,
hot: true,
historyApiFallback: true,
clientLogLevel: 'warning',
overlay: {
errors: true,
},
before(app, ctx) {
app.use(hotMiddleware)
ctx.middleware.waitUntilValid(() => {
resolve()
})
},
const server = new WebpackDevServer({
port: 9080,
hot: true,
historyApiFallback: true,
static: {
directory: path.join(__dirname, '../src/common/theme/images'),
publicPath: '/theme_images',
},
)
client: {
logging: 'warn',
overlay: true,
},
setupMiddlewares(middlewares, devServer) {
devServer.app.use(hotMiddlewareRenderer)
setImmediate(() => {
devServer.middleware.waitUntilValid(resolve)
})
server.listen(9080)
return middlewares
},
}, compiler)
server.start()
})
}
@@ -71,7 +78,7 @@ function startRendererLyric() {
// rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
// rendererConfig.mode = 'development'
const compiler = webpack(rendererLyricConfig)
hotMiddleware = webpackHotMiddleware(compiler, {
hotMiddlewareRendererLyric = webpackHotMiddleware(compiler, {
log: false,
heartbeat: 2500,
})
@@ -79,71 +86,86 @@ function startRendererLyric() {
compiler.hooks.compilation.tap('compilation', compilation => {
// console.log(Object.keys(compilation.hooks))
HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => {
hotMiddleware.publish({ action: 'reload' })
hotMiddlewareRendererLyric.publish({ action: 'reload' })
cb()
})
})
compiler.hooks.done.tap('done', stats => {
// logStats('Renderer', 'Compile done')
// logStats('Renderer', stats)
})
// compiler.hooks.done.tap('done', stats => {
// // logStats('Renderer', 'Compile done')
// // logStats('Renderer', stats)
// })
const server = new WebpackDevServer(
compiler,
{
contentBase: path.join(__dirname, '../'),
quiet: true,
hot: true,
historyApiFallback: true,
clientLogLevel: 'warning',
overlay: {
errors: true,
},
before(app, ctx) {
app.use(hotMiddleware)
ctx.middleware.waitUntilValid(() => {
resolve()
})
},
const server = new WebpackDevServer({
port: 9081,
hot: true,
historyApiFallback: true,
// static: {
// directory: path.join(__dirname, '../'),
// },
client: {
logging: 'warn',
overlay: true,
},
)
setupMiddlewares(middlewares, devServer) {
devServer.app.use(hotMiddlewareRenderer)
setImmediate(() => {
devServer.middleware.waitUntilValid(resolve)
})
return middlewares
},
}, compiler)
server.listen(9081)
server.start()
})
}
function startMain() {
function startRendererScripts() {
return new Promise((resolve, reject) => {
// mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main)
// mainConfig.mode = 'development'
const compiler = webpack(mainConfig)
compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => {
hotMiddleware.publish({ action: 'compiling' })
done()
})
const compiler = webpack(rendererScriptConfig)
compiler.watch({}, (err, stats) => {
if (err) {
console.log(err)
return
}
resolve()
})
})
}
// logStats('Main', stats)
function startMain() {
let firstRun = true
return new Promise((resolve, reject) => {
// mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main)
// mainConfig.mode = 'development'
const runElectronDelay = debounce(startElectron, 200)
const compiler = webpack(mainConfig)
if (electronProcess && electronProcess.kill) {
manualRestart = true
process.kill(electronProcess.pid)
electronProcess = null
startElectron()
compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => {
hotMiddlewareRenderer.publish({ action: 'compiling' })
hotMiddlewareRendererLyric.publish({ action: 'compiling' })
done()
})
setTimeout(() => {
manualRestart = false
}, 5000)
compiler.watch({}, (err, stats) => {
if (err) {
console.log(err)
reject(err)
return
}
resolve()
// logStats('Main', stats)
if (electronProcess) {
electronProcess.removeAllListeners()
treeKill(electronProcess.pid)
}
if (firstRun) {
firstRun = false
resolve()
} else runElectronDelay()
})
})
}
@@ -152,7 +174,7 @@ function startElectron() {
let args = [
'--inspect=5858',
// 'NODE_ENV=development',
path.join(__dirname, '../dist/electron/main.js'),
path.join(__dirname, '../dist/main.js'),
]
// detect yarn or npm and process commandline args accordingly
@@ -172,13 +194,24 @@ function startElectron() {
})
electronProcess.on('close', () => {
if (!manualRestart) process.exit()
process.exit()
})
}
const logs = [
'Manifest version 2 is deprecated, and support will be removed in 2023',
'"Extension server error: Operation failed: Permission denied", source: devtools://devtools/bundled',
// https://github.com/electron/electron/issues/32133
'"Electron sandbox_bundle.js script failed to run"',
'"TypeError: object null is not iterable (cannot read property Symbol(Symbol.iterator))",',
]
function electronLog(data, color) {
let log = data.toString()
if (/[0-9A-z]+/.test(log)) {
// 抑制某些无关的报错日志
if (color == 'red' && typeof log === 'string' && logs.some(l => log.includes(l))) return
console.log(chalk[color](log))
}
}
@@ -189,16 +222,28 @@ function init() {
spinners.add('main', { text: 'main compiling' })
spinners.add('renderer', { text: 'renderer compiling' })
spinners.add('renderer-lyric', { text: 'renderer-lyric compiling' })
spinners.add('renderer-scripts', { text: 'renderer-scripts compiling' })
function handleSuccess(name) {
spinners.succeed(name, { text: name + ' compile success!' })
}
function handleFail(name) {
spinners.fail(name, { text: name + ' compile fail!' })
}
replaceLib({ electronPlatformName: process.platform, arch: Arch[process.arch] })
Promise.all([
startRenderer().then(() => handleSuccess('renderer')).catch(() => handleFail('renderer')),
startRendererLyric().then(() => handleSuccess('renderer-lyric')).catch(() => handleFail('renderer-lyric')),
startRenderer().then(() => handleSuccess('renderer')).catch((err) => {
console.error(err.message)
return handleFail('renderer')
}),
startRendererLyric().then(() => handleSuccess('renderer-lyric')).catch((err) => {
console.error(err.message)
return handleFail('renderer-lyric')
}),
startRendererScripts().then(() => handleSuccess('renderer-scripts')).catch((err) => {
console.error(err.message)
return handleFail('renderer-scripts')
}),
startMain().then(() => handleSuccess('main')).catch(() => handleFail('main')),
]).then(startElectron).catch(err => {
console.error(err)

View File

@@ -2,8 +2,6 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const cssLoaderConfig = require('./css-loader.config')
const chalk = require('chalk')
const isDev = process.env.NODE_ENV === 'development'
// merge css-loader
exports.mergeCSSLoader = beforeLoader => {
const loader = [
@@ -14,7 +12,7 @@ exports.mergeCSSLoader = beforeLoader => {
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: isDev,
esModule: false,
},
},
{
@@ -30,10 +28,15 @@ exports.mergeCSSLoader = beforeLoader => {
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: isDev,
esModule: false,
},
},
{
loader: 'css-loader',
options: {
esModule: false,
},
},
'css-loader',
'postcss-loader',
],
},
@@ -65,3 +68,15 @@ exports.logStats = (proc, data) => {
console.log(log)
}
exports.debounce = (fn, delay = 100) => {
let timer = null
let _args
return (...args) => {
_args = args
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
timer = null
fn(..._args)
}, delay)
}
}

View File

@@ -0,0 +1,3 @@
module.exports = {
minimize: true,
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 487 KiB

18
jsconfig.json Normal file
View File

@@ -0,0 +1,18 @@
{
"compilerOptions": {
"rootDir": "./",
"paths": {
"@main/*": ["./src/main/*"],
"@renderer/*": ["./src/renderer/*"],
"@lyric/*": ["./src/renderer-lyric/*"],
"@static/*": ["./src/static/*"],
"@common/*": ["./src/common/*"],
}
},
"vueCompilerOptions": {
"plugins": [
"@vue/language-plugin-pug"
]
},
"exclude": ["node_modules", "build", "dist"]
}

View File

@@ -1,16 +1,19 @@
{\rtf1\adeflang1025\ansi\ansicpg936\uc2\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}
{\f44\fbidi \fnil\fcharset134\fprq2{\*\panose 00000000000000000000}@\'cb\'ce\'cc\'e5;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\f36\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'b5\'c8\'cf\'df{\*\falt DengXian};}{\f44\fbidi \fnil\fcharset134\fprq2{\*\panose 00000000000000000000}@\'cb\'ce\'cc\'e5;}
{\f45\fbidi \fnil\fcharset134\fprq2{\*\panose 00000000000000000000}@\'b5\'c8\'cf\'df;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'b5\'c8\'cf\'df Light;}{\fhimajor\f31502\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'b5\'c8\'cf\'df Light;}
{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'b5\'c8\'cf\'df{\*\falt DengXian};}{\fhiminor\f31506\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'b5\'c8\'cf\'df{\*\falt DengXian};}
{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f45\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f46\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
{\f48\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f49\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f50\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f51\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\f52\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f53\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f65\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f66\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;}
{\f68\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f69\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f70\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f71\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}
{\f72\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f73\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f177\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f385\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}
{\f386\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f388\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f389\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f392\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}
{\f393\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f487\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f46\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f47\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
{\f49\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f50\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f51\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f52\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\f53\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f54\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f66\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f67\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;}
{\f69\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f70\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f71\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f72\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}
{\f73\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f74\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f178\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f386\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}
{\f387\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f389\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f390\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f393\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}
{\f394\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f408\fbidi \fnil\fcharset0\fprq2 DengXian Western{\*\falt DengXian};}{\f406\fbidi \fnil\fcharset238\fprq2 DengXian CE{\*\falt DengXian};}
{\f407\fbidi \fnil\fcharset204\fprq2 DengXian Cyr{\*\falt DengXian};}{\f409\fbidi \fnil\fcharset161\fprq2 DengXian Greek{\*\falt DengXian};}{\f488\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\f498\fbidi \fnil\fcharset0\fprq2 @DengXian Western;}
{\f496\fbidi \fnil\fcharset238\fprq2 @DengXian CE;}{\f497\fbidi \fnil\fcharset204\fprq2 @DengXian Cyr;}{\f499\fbidi \fnil\fcharset161\fprq2 @DengXian Greek;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 DengXian Light Western;}{\fdbmajor\f31518\fbidi \fnil\fcharset238\fprq2 DengXian Light CE;}
@@ -38,12 +41,12 @@
\fs21\lang1033\langfe2052\kerning2\loch\f31505\hich\af2\dbch\af31505\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext15 \slink16 \sunhideused Plain Text;}{\*\cs16 \additive \rtlch\fcs1 \af2 \ltrch\fcs0 \loch\f31505\hich\af2 \sbasedon10 \slink15 \slocked
\'b4\'bf\'ce\'c4\'b1\'be \'d7\'d6\'b7\'fb;}{\*\cs17 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf19 \sbasedon10 \sunhideused \styrsid9533173 Hyperlink;}{\*\cs18 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \cf20\chshdng0\chcfpat0\chcbpat21
\sbasedon10 \ssemihidden \sunhideused \styrsid9533173 Unresolved Mention;}{\*\cs19 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf22 \sbasedon10 \ssemihidden \sunhideused \styrsid9533173 FollowedHyperlink;}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}
{\*\rsidtbl \rsid927107\rsid1398824\rsid2109456\rsid3950508\rsid4133944\rsid4355753\rsid9533173\rsid10447395\rsid11081282\rsid12910709\rsid13643782\rsid14384001\rsid15226681}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0
\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author lysyw}{\operator lysyw}{\creatim\yr2019\mo8\dy17\hr10\min22}{\revtim\yr2020\mo4\dy28\hr13\min46}{\version8}{\edmins3}{\nofpages1}{\nofwords135}{\nofchars772}{\nofcharsws906}{\vern1}}
{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl2253\margr2253\margt1440\margb1440\gutter0\ltrsect
{\*\rsidtbl \rsid927107\rsid1398824\rsid2109456\rsid2766548\rsid3758332\rsid3950508\rsid4133944\rsid4355753\rsid9533173\rsid10447395\rsid11081282\rsid12910709\rsid13643782\rsid14384001\rsid14511311\rsid15225067\rsid15226681}{\mmathPr\mmathFont34\mbrkBin0
\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author lysyw}{\operator lysyw}{\creatim\yr2019\mo8\dy17\hr10\min22}{\revtim\yr2025\mo2\dy22\hr15\min34}{\version12}{\edmins5}{\nofpages2}
{\nofwords195}{\nofchars1117}{\nofcharsws1310}{\vern77}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl2253\margr2253\margt1440\margb1440\gutter0\ltrsect
\deftab420\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\formshade\horzdoc\dgmargin\dghspace180\dgvspace156
\dghorigin2253\dgvorigin1440\dghshow0\dgvshow2\jcompress\lnongrid
\viewkind1\viewscale120\splytwnine\ftnlytwnine\htmautsp\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot3950508\newtblstyruls
\viewkind1\viewscale100\splytwnine\ftnlytwnine\htmautsp\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot3950508\newtblstyruls
\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat {\upr{\*\fchars
!%),.:\'3b>?]\'7d\'a1\'e9\'a1\'a7\'a1\'e3\'a1\'a4\'a1\'a6\'a1\'a5\'a8\'44\'a1\'ac\'a1\'af\'a1\'b1\'a1\'ad\'a1\'eb\'a1\'e4\'a1\'e5?\'a1\'e6\'a1\'c3\'a1\'a2\'a1\'a3\'a1\'a8\'a1\'b5\'a1\'b7\'a1\'b9\'a1\'bb\'a1\'bf\'a1\'b3\'a1\'bd\'a8\'95\'a6\'e1\'a6\'e3\'a6\'e7\'a6\'e5\'a6\'eb\'a9\'77\'a9\'79\'a9\'7b\'a3\'a1\'a3\'a2\'a3\'a5\'a3\'a7\'a3\'a9\'a3\'ac\'a3\'ae\'a3\'ba\'a3\'bb\'a3\'bf\'a3\'dd\'a3\'e0\'a3\'fc\'a3\'fd\'a1\'ab\'a1\'e9
}{\*\ud\uc0{\*\fchars
@@ -53,66 +56,128 @@ $([\'7b{\uc2\u163 \'a1\'ea\u165 \'a3\'a4\'a1\'a4\'a1\'ae\'a1\'b0\'a1\'b4\'a1\'b6
\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery851\footery992\colsx425\endnhere\sectlinegrid312\sectspecifyl\sectrsid2109456\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta \dbch .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang
{\pntxta \dbch .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta \dbch .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta \dbch )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}{\*\pnseclvl6
\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}{\*\pnseclvl9
\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}\pard\plain \ltrpar\s15\qj \li0\ri0\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1398824 \rtlch\fcs1 \af2\afs22\alang1025 \ltrch\fcs0
\fs21\lang1033\langfe2052\kerning2\loch\af31505\hich\af2\dbch\af31505\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'b1\'be\'cf\'ee\'c4\'bf\'a3\'a8
\'c8\'ed\'bc\'fe\'a3\'a9\'bb\'f9\'d3\'da}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid4133944 \hich\af13\dbch\af13\loch\f13 Apache License 2.0}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \hich\af13\dbch\af13\loch\f13 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'d0\'ed\'bf\'c9\'d6\'a4\'b7\'a2
\'d0\'d0\'a3\'ac\'d4\'da\'ca\'b9\'d3\'c3\'b1\'be\'c8\'ed\'bc\'fe\'c7\'b0\'a3\'ac\'c4\'e3\'a3\'a8\'ca\'b9\'d3\'c3\'d5\'df\'a3\'a9\'d0\'e8\'c7\'a9\'ca\'f0\'b1\'be\'d0\'ad\'d2\'e9\'b2\'c5\'bf\'c9\'bc\'cc\'d0\'f8\'ca\'b9\'d3\'c3\'a3\'ac\'d2\'d4\'cf\'c2
\'d0\'ad\'d2\'e9\'ca\'c7\'b6\'d4\'d3\'da}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \hich\af13\dbch\af13\loch\f13 Apache Li\hich\af13\dbch\af13\loch\f13 cense 2.0 }{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'b5\'c4\'b2\'b9\'b3\'e4\'a3\'ac\'c8\'e7\'d3\'d0\'b3\'e5\'cd\'bb\'a3\'ac\'d2\'d4\'d2\'d4\'cf\'c2\'d0\'ad\'d2\'e9\'ce\'aa\'d7\'bc\'a1\'a3}{\rtlch\fcs1 \af13
\ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid15226681
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid10447395\charrsid1398824
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'b4\'ca\'d3\'ef\'d4\'bc\'b6\'a8\'a3\'ba\'b1\'be\'d0\'ad\'d2\'e9\'d6\'d0\'b5\'c4\'a1\'b0\'b1\'be\'c8\'ed\'bc\'fe\'a1\'b1\'d6\'b8
\'c2\'e5\'d1\'a9\'d2\'f4\'c0\'d6\'d7\'c0\'c3\'e6\'b0\'e6\'cf\'ee\'c4\'bf\'a3\'bb\'a1\'b0\'ca\'b9\'d3\'c3\'d5\'df\'a1\'b1\'d6\'b8\'c7\'a9\'ca\'f0\'b1\'be\'d0\'ad\'d2\'e9\'b5\'c4\'ca\'b9\'d3\'c3\'d5\'df\'a3\'bb\'a1\'b0\'b9\'d9\'b7\'bd\'d2\'f4\'c0\'d6
\'c6\'bd\'cc\'a8\'a1\'b1\'d6\'b8\'b6\'d4\'b1\'be\'c8\'ed\'bc\'fe\'c4\'da\'d6\'c3\'b5\'c4\'b0\'fc\'c0\'a8\'bf\'e1\'ce\'d2\'a1\'a2\'bf\'e1\'b9\'b7\'a1\'a2\'df\'e4\'b9\'be\'b5\'c8\'d2\'f4\'c0\'d6\'d4\'b4\'b5\'c4\'b9\'d9\'b7\'bd\'c6\'bd\'cc\'a8\'cd\'b3
\'b3\'c6\'a3\'bb\'a1\'b0\'b0\'e6\'c8\'a8\'ca\'fd\'be\'dd\'a1\'b1\'d6\'b8\'b0\'fc\'c0\'a8\'b5\'ab\'b2\'bb\'cf\'de\'d3\'da\'cd\'bc\'cf\'f1\'a1\'a2\'d2\'f4\'c6\'b5\'a1\'a2\'c3\'fb\'d7\'d6\'b5\'c8\'d4\'da\'c4\'da\'b5\'c4\'cb\'fb\'c8\'cb\'d3\'b5\'d3\'d0
\'cb\'f9\'ca\'f4\'b0\'e6\'c8\'a8\'b5\'c4\'ca\'fd\'be\'dd\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824
\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}\pard\plain \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2766548 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0
\fs21\lang1033\langfe2052\kerning2\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b1\'be\'cf\'ee\'c4\'bf
\'bb\'f9\'d3\'da}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \hich\af13\dbch\af13\loch\f13 Apache License 2.0 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\loch\af13\hich\af13\dbch\f13 \'d0\'ed\'bf\'c9\'d6\'a4\'b7\'a2\'d0\'d0\'a3\'ac\'d2\'d4\'cf\'c2\'d0\'ad\'d2\'e9\'ca\'c7\'b6\'d4\'d3\'da}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\hich\af13\dbch\af13\loch\f13 Apache License 2.0 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b5\'c4\'b2\'b9\'b3\'e4\'a3\'ac\'c8\'e7\'d3\'d0\'b3\'e5\'cd\'bb\'a3\'ac\'d2\'d4
\'d2\'d4\'cf\'c2\'d0\'ad\'d2\'e9\'ce\'aa\'d7\'bc\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 1}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'a1\'a2\'b1\'be\'c8\'ed\'bc\'fe\'b5\'c4\'ca\'fd\'be\'dd\'c0\'b4\'d4\'b4\'d4\'ad\'c0\'ed\'ca\'c7
\'b4\'d3\'b8\'f7\'b9\'d9\'b7\'bd\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8\'b5\'c4\'b9\'ab\'bf\'aa\'b7\'fe\'ce\'f1\'c6\'f7\'d6\'d0\'c0\'ad\'c8\'a1\'ca\'fd\'be\'dd\'a3\'ac\'be\'ad\'b9\'fd\'b6\'d4\'ca\'fd\'be\'dd\'bc\'f2\'b5\'a5\'b5\'d8\'c9\'b8\'d1\'a1\'d3\'eb
\'ba\'cf\'b2\'a2\'ba\'f3\'bd\'f8\'d0\'d0\'d5\'b9\'ca\'be\'a3\'ac\'d2\'f2\'b4\'cb\'b1\'be\'c8\'ed\'bc\'fe\'b2\'bb\'b6\'d4\'ca\'fd\'be\'dd\'b5\'c4\'d7\'bc\'c8\'b7\'d0\'d4\'b8\'ba\'d4\'f0\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824
\par \hich\af13\dbch\af13\loch\f13 2}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'a1\'a2\'ca\'b9\'d3\'c3\'b1\'be\'c8\'ed\'bc\'fe\'b5\'c4\'b9\'fd\'b3\'cc\'d6\'d0\'bf\'c9\'c4\'dc
\'bb\'e1\'b2\'fa\'c9\'fa\'b0\'e6\'c8\'a8\'ca\'fd\'be\'dd\'a3\'ac\'b6\'d4\'d3\'da\'d5\'e2\'d0\'a9\'b0\'e6\'c8\'a8\'ca\'fd\'be\'dd\'a3\'ac\'b1\'be\'c8\'ed\'bc\'fe\'b2\'bb\'d3\'b5\'d3\'d0\'cb\'fc\loch\af13\hich\af13\dbch\f13 \'c3\'c7\'b5\'c4\'cb\'f9\'d3\'d0
\'c8\'a8\'a3\'ac\'ce\'aa\'c1\'cb\'b1\'dc\'c3\'e2\'d4\'ec\'b3\'c9\'c7\'d6\'c8\'a8\'a3\'ac\'ca\'b9\'d3\'c3\'d5\'df\'ce\'f1\'b1\'d8\'d4\'da}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824
\hich\af13\dbch\af13\loch\f13 24}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'d0\'a1\'ca\'b1\'c4\'da\'c7\'e5\'b3\'fd\'ca\'b9\'d3\'c3\'b1\'be\'c8\'ed\'bc\'fe\'b5\'c4\'b9\'fd
\'b3\'cc\'d6\'d0\'cb\'f9\'b2\'fa\'c9\'fa\'b5\'c4\'b0\'e6\'c8\'a8\'ca\'fd\'be\'dd\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824
\par \hich\af13\dbch\af13\loch\f13 3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'a1\'a2\'b1\'be\'c8\'ed\'bc\'fe\'c4\'da\'b5\'c4\'b9\'d9\'b7\'bd\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8
\'b1\'f0\'c3\'fb\'ce\'aa\'b1\'be\'c8\'ed\'bc\'fe\'c4\'da\'b6\'d4\'b9\'d9\'b7\'bd\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8\'b5\'c4\'d2\'bb\'b8\'f6\'b3\'c6\'ba\'f4\'a3\'ac\'b2\'bb\'b0\'fc\'ba\'ac\'b6\'f1\'d2\'e2\'a3\'ac\'c8\'e7\'b9\'fb\'b9\'d9\'b7\'bd\'d2\'f4
\'c0\'d6\'c6\'bd\'cc\'a8\'be\'f5\'b5\'c3\'b2\'bb\'cd\'d7\'a3\'ac\'bf\'c9\'c1\'aa\'cf\'b5\'b1\'be\'c8\'ed\'bc\'fe\'b8\'fc\'b8\'c4\'bb\'f2\'d2\'c6\'b3\'fd\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824
\par \hich\af13\dbch\af13\loch\f13 4}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'a1\'a2\'b1\'be\'c8\'ed\'bc\'fe\'c4\'da\'ca\'b9\'d3\'c3\'b5\'c4\'b2\'bf\'b7\'d6\'b0\'fc\'c0\'a8
\'b5\'ab\'b2\'bb\'cf\'de\'d3\'da\'d7\'d6\'cc\'e5\'a1\'a2\'cd\'bc\'c6\'ac\'b5\'c8\'d7\'ca\'d4\'b4\'c0\'b4\'d4\'b4\'d3\'da\'bb\'a5\'c1\'aa\'cd\'f8\'a3\'ac\'c8\'e7\'b9\'fb\'b3\'f6\'cf\'d6\'c7\'d6\'c8\'a8\'bf\'c9\'c1\'aa\'cf\'b5\'b1\'be\'c8\'ed\'bc\'fe
\'d2\'c6\'b3\'fd\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824
\par \hich\af13\dbch\af13\loch\f13 5}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'a1\'a2\'d3\'c9\'d3\'da\'ca\'b9\'d3\'c3\'b1\'be\'c8\'ed\'bc\'fe\'b2\'fa\'c9\'fa\'b5\'c4\'b0\'fc
\'c0\'a8\'d3\'c9\'d3\'da\'b1\'be\'d0\'ad\'d2\'e9\'bb\'f2\'d3\'c9\'d3\'da\'ca\'b9\'d3\'c3\'bb\'f2\'ce\'de\'b7\'a8\'ca\'b9\'d3\'c3\'b1\'be\'c8\'ed\'bc\'fe\'b6\'f8\'d2\'fd\'c6\'f0\'b5\'c4\'c8\'ce\'ba\'ce\'d0\'d4\'d6\'ca\'b5\'c4\'c8\'ce\'ba\'ce\'d6\'b1
\'bd\'d3\'a1\'a2\'bc\'e4\'bd\'d3\'a1\'a2\'cc\'d8\'ca\'e2\'a1\'a2\'c5\'bc\'c8\'bb\'bb\'f2\'bd\'e1\'b9\'fb\'d0\'d4\'cb\'f0\'ba\'a6\'a3\'a8\'b0\'fc\'c0\'a8\'b5\'ab\'b2\'bb\'cf\'de\'d3\'da\'d2\'f2\'c9\'cc\'d3\'fe\'cb\'f0\'ca\'a7\'a1\'a2\'cd\'a3\'b9\'a4
\'a1\'a2\'bc\'c6\'cb\'e3\'bb\'fa\'b9\'ca\'d5\'cf\'bb\'f2\'b9\'ca\'d5\'cf\'d2\'fd\'c6\'f0\'b5\'c4\'cb\'f0\'ba\'a6\'c5\'e2\'b3\'a5\'a3\'ac\'bb\'f2\'c8\'ce\'ba\'ce\'bc\'b0\loch\af13\hich\af13\dbch\f13 \'cb\'f9\'d3\'d0\'c6\'e4\'cb\'fb\'c9\'cc\'d2\'b5\'cb\'f0
\'ba\'a6\'bb\'f2\'cb\'f0\'ca\'a7\'a3\'a9\'d3\'c9\'ca\'b9\'d3\'c3\'d5\'df\'b8\'ba\'d4\'f0\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824
\par \hich\af13\dbch\af13\loch\f13 6}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13 \'a1\'a2\'b1\'be\'cf\'ee\'c4\'bf\'cd\'ea\'c8\'ab\'c3\'e2\'b7\'d1\'a3\'ac\'c7\'d2\'bf\'aa\'d4\'b4
\'b7\'a2\'b2\'bc\'d3\'da}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \hich\af13\dbch\af13\loch\f13 GitHub }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824
\loch\af13\hich\af13\dbch\f13 \'c3\'e6\'cf\'f2\'c8\'ab\'ca\'c0\'bd\'e7\'c8\'cb\'d3\'c3\'d7\'f7\'b6\'d4\'bc\'bc\'ca\'f5\'b5\'c4\'d1\'a7\'cf\'b0\'bd\'bb\'c1\'f7\'a3\'ac\'b1\'be\'c8\'ed\'bc\'fe\'b2\'bb\'b6\'d4\'cf\'ee\'c4\'bf\'c4\'da\'b5\'c4\'bc\'bc\'ca\'f5
\'bf\'c9\'c4\'dc\'b4\'e6\'d4\'da\'ce\'a5\'b7\'b4\'b5\'b1\'b5\'d8\'b7\'a8\'c2\'c9\'b7\'a8\'b9\'e6\'b5\'c4\'d0\'d0\'ce\'aa\'d7\'f7\'b1\'a3\'d6\'a4\'a3\'ac\'bd\'fb\'d6\'b9\'d4\'da\'ce\'a5\'b7\'b4\'b5\'b1\'b5\'d8\'b7\'a8\'c2\'c9\'b7\'a8\'b9\'e6\'b5\'c4
\'c7\'e9\'bf\'f6\'cf\'c2\'ca\'b9\'d3\'c3\'b1\'be\'c8\'ed\'bc\'fe\'a3\'ac\'b6\'d4\'d3\'da\'ca\'b9\'d3\'c3\'d5\'df\'d4\'da\'c3\'f7\'d6\'aa\'bb\'f2\'b2\'bb\'d6\'aa\'b5\'b1\'b5\'d8\'b7\'a8\'c2\'c9\'b7\'a8\'b9\'e6\'b2\'bb\'d4\'ca\'d0\'ed\'b5\'c4\'c7\'e9
\'bf\'f6\'cf\'c2\'ca\'b9\'d3\'c3\'b1\'be\'c8\'ed\'bc\'fe\'cb\'f9\'d4\'ec\'b3\'c9\'b5\'c4\'c8\'ce\'ba\'ce\'ce\'a5\'b7\'a8\'ce\'a5\'b9\'e6\'d0\'d0\'ce\'aa\'d3\'c9\'ca\'b9\'d3\'c3\'d5\'df\'b3\'d0\'b5\'a3\'a3\'ac\'b1\'be\'c8\'ed\'bc\'fe\'b2\'bb\'b3\'d0
\'b5\'a3\'d3\'c9\'b4\'cb\'d4\'ec\'b3\'c9\'b5\'c4\'c8\'ce\'ba\'ce\'d6\'b1\'bd\'d3\'a1\'a2\'bc\'e4\'bd\'d3\'a1\'a2\'cc\'d8\'ca\'e2\'a1\'a2\'c5\'bc\'c8\'bb\'bb\'f2\'bd\'e1\'b9\'fb\'d0\'d4\'d4\'f0\'c8\'ce\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid1398824
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid15226681
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid10447395\charrsid1398824
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \hich\af13\dbch\af13\loch\f13 * }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13
\'c8\'f4\'d0\'ad\'d2\'e9\'b8\'fc\'d0\'c2\'a3\'ac\'cb\'a1\'b2\'bb\'c1\'ed\'d0\'d0\'cd\'a8\'d6\'aa\'a3\'ac\'bf\'c9\'b5\'bd\'bf\'aa\'d4\'b4\'b5\'d8\'d6\'b7\'b2\'e9\'bf\'b4\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid15226681
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \hich\af13\dbch\af13\loch\f13 * }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13
\'b1\'be\'c8\'ed\'bc\'fe\'b5\'c4\'b3\'f5\'d6\'d4\'ca\'c7\'b0\'ef\'d6\'fa\'b9\'d9\'b7\'bd\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8\'bc\'f2\'bb\'af\'ca\'fd\'be\'dd\'ba\'f3\'b4\'fa\'ce\'aa\'d5\'b9\'ca\'be\'a3\'ac\'b0\'ef\'d6\'fa\'ca\'b9\'d3\'c3\'d5\'df\'b8\'f9
\'be\'dd\'b8\'e8\'c7\'fa\loch\af13\hich\af13\dbch\f13 \'c3\'fb\'a1\'a2\'d2\'d5\'ca\'f5\'bc\'d2\'b5\'c8\'b9\'d8\'bc\'fc\'d7\'d6\'bf\'ec\'cb\'d9\'b5\'d8\'b6\'a8\'ce\'bb\'cb\'f9\'d0\'e8\'c4\'da\'c8\'dd\'cb\'f9\'d4\'da\'b5\'c4\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8
\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid15226681
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \hich\af13\dbch\af13\loch\f13 * }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid1398824\charrsid1398824 \loch\af13\hich\af13\dbch\f13
\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8\'b2\'bb\'d2\'d7\'a3\'ac\'bd\'a8\'d2\'e9\'b5\'bd\'b6\'d4\'d3\'a6\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8\'d6\'a7\'b3\'d6\'d5\'fd\'b0\'e6\'d7\'ca\'d4\'b4\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid12910709
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid9533173\charrsid15226681
\par }\pard \ltrpar\s15\qj \li0\ri0\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12910709 {\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid12910709\charrsid12910709 \hich\af13\dbch\af13\loch\f13 By: }{
\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid12910709\charrsid12910709 \loch\af13\hich\af13\dbch\f13 \'c2\'e4\'d1\'a9\'ce\'de\'ba\'db}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid12910709\charrsid12910709
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b4\'ca\'d3\'ef\'d4\'bc\'b6\'a8\'a3\'ba\'b1\'be\'d0\'ad\'d2\'e9\'d6\'d0\'b5\'c4\'a1\'b0\'b1\'be\'cf\'ee\'c4\'bf\'a1\'b1\'d6\'b8}{
\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \hich\af13\dbch\af13\loch\f13 LX Music }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\loch\af13\hich\af13\dbch\f13 \'d7\'c0\'c3\'e6\'b0\'e6\'cf\'ee\'c4\'bf\'a3\'bb}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8220\'a1\'b0}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'ca\'b9\'d3\'c3\'d5\'df}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8221\'a1\'b1}{\rtlch\fcs1 \af13
\ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'d6\'b8\'c7\'a9\'ca\'f0\'b1\'be\'d0\'ad\'d2\'e9\'b5\'c4\'ca\'b9\'d3\'c3\'d5\'df\'a3\'bb}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8220\'a1\'b0}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b9\'d9\'b7\'bd\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8}{
\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8221\'a1\'b1}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'d6\'b8\'b6\'d4\'b1\'be
\'cf\'ee\'c4\'bf\'c4\'da\'d6\'c3\'b5\'c4\'b0\'fc\'c0\'a8\'bf\'e1\'ce\'d2\'a1\'a2\'bf\'e1\'b9\'b7\'a1\'a2\'df\'e4\'b9\'be\'b5\'c8\'d2\'f4\'c0\'d6\'d4\'b4\'b5\'c4\'b9\'d9\'b7\'bd\'c6\'bd\'cc\'a8\'cd\'b3\'b3\'c6\'a3\'bb}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8220\'a1\'b0}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b0\'e6\'c8\'a8\'ca\'fd\'be\'dd}{\rtlch\fcs1 \af13
\ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8221\'a1\'b1}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'d6\'b8\'b0\'fc\'c0\'a8\'b5\'ab\'b2\'bb
\'cf\'de\'d3\'da\'cd\'bc\'cf\'f1\'a1\'a2\'d2\'f4\'c6\'b5\'a1\'a2\'c3\'fb\'d7\'d6\'b5\'c8\'d4\'da\'c4\'da\'b5\'c4\'cb\'fb\'c8\'cb\'d3\'b5\'d3\'d0\'cb\'f9\'ca\'f4\'b0\'e6\'c8\'a8\'b5\'c4\'ca\'fd\'be\'dd\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'d2\'bb\'a1\'a2\'ca\'fd\'be\'dd\'c0\'b4\'d4\'b4}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 1.1 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b1\'be\'cf\'ee\'c4\'bf\'b5\'c4\'b8\'f7\'b9\'d9\'b7\'bd\'c6\'bd\'cc\'a8\'d4\'da\'cf\'df\'ca\'fd
\'be\'dd\'c0\'b4\'d4\'b4\'d4\'ad\'c0\'ed\'ca\'c7\'b4\'d3\'c6\'e4\'b9\'ab\'bf\'aa\'b7\'fe\'ce\'f1\'c6\'f7\'d6\'d0\'c0\'ad\'c8\'a1\'ca\'fd\'be\'dd\'a3\'a8\'d3\'eb\'ce\'b4\'b5\'c7\'c2\'bc\'d7\'b4\'cc\'ac\'d4\'da\'b9\'d9\'b7\'bd\'c6\'bd\'cc\'a8}{\rtlch\fcs1
\af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \hich\af13\dbch\af13\loch\f13 APP }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'bb\'f1\'c8\'a1
\'b5\'c4\'ca\'fd\'be\'dd\'cf\'e0\'cd\'ac\'a3\'a9\'a3\'ac\'be\'ad\'b9\'fd\'b6\'d4\'ca\'fd\'be\'dd\'bc\'f2\'b5\'a5\'b5\'d8\'c9\'b8\'d1\'a1\'d3\'eb\'ba\'cf\'b2\'a2\'ba\'f3\'bd\'f8\'d0\'d0\'d5\'b9\'ca\'be\'a3\'ac\'d2\'f2\'b4\'cb\'b1\'be\'cf\'ee\'c4\'bf
\'b2\'bb\'b6\'d4\'ca\'fd\'be\'dd\'b5\'c4\'ba\'cf\'b7\'a8\'d0\'d4\'a1\'a2\'d7\'bc\'c8\'b7\'d0\'d4\'b8\'ba\'d4\'f0\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 1.2 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b1\'be\'cf\'ee\'c4\'bf\'b1\'be\'c9\'ed\'c3\'bb\'d3\'d0\'bb\'f1\'c8\'a1\'c4\'b3\'b8\'f6\'d2\'f4
\'c6\'b5\'ca\'fd\'be\'dd\'b5\'c4\'c4\'dc\'c1\'a6\'a3\'ac\'b1\'be\'cf\'ee\'c4\'bf\'ca\'b9\'d3\'c3\'b5\'c4\'d4\'da\'cf\'df\'d2\'f4\'c6\'b5\'ca\'fd\'be\'dd\'c0\'b4\'d4\'b4\'c0\'b4\'d7\'d4\'c8\'ed\'bc\'fe\'c9\'e8\'d6\'c3\'c4\'da}{\rtlch\fcs1 \af13
\ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8220\'a1\'b0}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'d7\'d4\'b6\'a8\'d2\'e5\'d4\'b4}{
\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8221\'a1\'b1}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'c9\'e8\'d6\'c3\'cb\'f9
\'d1\'a1\'d4\'f1\'b5\'c4}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8220\'a1\'b0}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\loch\af13\hich\af13\dbch\f13 \'d4\'b4}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8221\'a1\'b1}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\loch\af13\hich\af13\dbch\f13 \'b7\'b5\'bb\'d8\'b5\'c4\'d4\'da\'cf\'df\'c1\'b4\'bd\'d3\'a1\'a3\'c0\'fd\'c8\'e7\'b2\'a5\'b7\'c5\'c4\'b3\'ca\'d7\'b8\'e8\'a3\'ac\'b1\'be\'cf\'ee\'c4\'bf\'cb\'f9\'d7\'f6\'b5\'c4\'d6\'bb\'ca\'c7\'bd\'ab\'cf\'a3\'cd\'fb\'b2\'a5
\'b7\'c5\'b5\'c4\'b8\'e8\'c7\'fa\'c3\'fb\'a1\'a2\'d2\'d5\'ca\'f5\'bc\'d2\'b5\'c8\'d0\'c5\'cf\'a2\'b4\'ab\'b5\'dd\'b8\'f8}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8220\'a1\'b0}{\rtlch\fcs1 \af13
\ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'d4\'b4}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8221\'a1\'b1}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'a3\'ac\'c8\'f4}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8220\'a1\'b0}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'d4\'b4}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8221\'a1\'b1}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b7\'b5\'bb\'d8\'c1\'cb\'d2\'bb\'b8\'f6\'c1\'b4\'bd\'d3\'a3\'ac\'d4\'f2\'b1\'be\'cf\'ee\'c4\'bf\'bd\'ab\'c8\'cf\'ce\'aa\'d5\'e2\'be\'cd\'ca\'c7\'b8\'c3\'b8\'e8
\'c7\'fa\'b5\'c4\'d2\'f4\'c6\'b5\'ca\'fd\'be\'dd\'b6\'f8\'bd\'f8\'d0\'d0\'ca\'b9\'d3\'c3\'a3\'ac\'d6\'c1\'d3\'da\'d5\'e2\'ca\'c7\'b2\'bb\'ca\'c7\'d5\'fd\'c8\'b7\'b5\'c4\'d2\'f4\'c6\'b5\'ca\'fd\'be\'dd\'b1\'be\'cf\'ee\'c4\'bf\'ce\'de\'b7\'a8\'d0\'a3
\'d1\'e9\'c6\'e4\'d7\'bc\'c8\'b7\'d0\'d4\'a3\'ac\'cb\'f9\'d2\'d4\'ca\'b9\'d3\'c3\'b1\'be\'cf\'ee\'c4\'bf\'b5\'c4\'b9\'fd\'b3\'cc\'d6\'d0\'bf\'c9\'c4\'dc\'bb\'e1\'b3\'f6\'cf\'d6\'cf\'a3\'cd\'fb\'b2\'a5\'b7\'c5\'b5\'c4\'d2\'f4\'c6\'b5\'d3\'eb\'ca\'b5
\'bc\'ca\'b2\'a5\'b7\'c5\'b5\'c4\'d2\'f4\'c6\'b5\'b2\'bb\'b6\'d4\'d3\'a6\'bb\'f2\'d5\'df\'ce\'de\'b7\'a8\'b2\'a5\'b7\'c5\'b5\'c4\'ce\'ca\'cc\'e2\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 1.3 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b1\'be\'cf\'ee\'c4\'bf\'b5\'c4\'b7\'c7\'b9\'d9\'b7\'bd\'c6\'bd\'cc\'a8\'ca\'fd\'be\'dd\'a3\'a8
\'c0\'fd\'c8\'e7}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8220\'a1\'b0}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13
\'ce\'d2\'b5\'c4\'c1\'d0\'b1\'ed}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \u8221\'a1\'b1}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\loch\af13\hich\af13\dbch\f13 \'c4\'da\'c1\'d0\'b1\'ed\'a3\'a9\'c0\'b4\'d7\'d4\'ca\'b9\'d3\'c3\'d5\'df\'b1\'be\'b5\'d8\'cf\'b5\'cd\'b3\'bb\'f2\'d5\'df\'ca\'b9\'d3\'c3\'d5\'df\'c1\'ac\'bd\'d3\'b5\'c4\'cd\'ac\'b2\'bd\'b7\'fe\'ce\'f1\'a3\'ac\'b1\'be\'cf\'ee
\'c4\'bf\'b2\'bb\'b6\'d4\'d5\'e2\'d0\'a9\'ca\'fd\'be\'dd\'b5\'c4\'ba\'cf\'b7\'a8\'d0\'d4\'a1\'a2\'d7\'bc\'c8\'b7\'d0\'d4\'b8\'ba\'d4\'f0\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b6\'fe\'a1\'a2\'b0\'e6\'c8\'a8\'ca\'fd\'be\'dd}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 2\hich\af13\dbch\af13\loch\f13 .1 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'ca\'b9\'d3\'c3\'b1\'be\'cf\'ee\'c4\'bf\'b5\'c4\'b9\'fd\'b3\'cc
\'d6\'d0\'bf\'c9\'c4\'dc\'bb\'e1\'b2\'fa\'c9\'fa\'b0\'e6\'c8\'a8\'ca\'fd\'be\'dd\'a1\'a3\'b6\'d4\'d3\'da\'d5\'e2\'d0\'a9\'b0\'e6\'c8\'a8\'ca\'fd\'be\'dd\'a3\'ac\'b1\'be\'cf\'ee\'c4\'bf\'b2\'bb\'d3\'b5\'d3\'d0\'cb\'fc\'c3\'c7\'b5\'c4\'cb\'f9\'d3\'d0
\'c8\'a8\'a1\'a3\'ce\'aa\'c1\'cb\'b1\'dc\'c3\'e2\'c7\'d6\'c8\'a8\'a3\'ac\'ca\'b9\'d3\'c3\'d5\'df\'ce\'f1\'b1\'d8\'d4\'da}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \hich\af13\dbch\af13\loch\f13 **24 }{
\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'d0\'a1\'ca\'b1\'c4\'da}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\hich\af13\dbch\af13\loch\f13 ** }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'c7\'e5\'b3\'fd\'ca\'b9\'d3\'c3\'b1\'be\'cf\'ee\'c4\'bf\'b5\'c4\'b9\'fd\'b3\'cc\'d6\'d0\'cb\'f9
\'b2\'fa\'c9\'fa\'b5\'c4\'b0\'e6\'c8\'a8\'ca\'fd\'be\'dd\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'c8\'fd\'a1\'a2\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8\'b1\'f0\'c3\'fb}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 3.1 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b1\'be\'cf\'ee\'c4\'bf\'c4\'da\'b5\'c4\'b9\'d9\'b7\'bd\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8\'b1\'f0
\'c3\'fb\'ce\'aa\'b1\'be\'cf\'ee\'c4\'bf\'c4\'da\'b6\'d4\'b9\'d9\'b7\'bd\'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8\'b5\'c4\'d2\'bb\'b8\'f6\'b3\'c6\'ba\'f4\'a3\'ac\'b2\'bb\'b0\'fc\'ba\'ac\'b6\'f1\'d2\'e2\'a1\'a3\'c8\'e7\'b9\'fb\'b9\'d9\'b7\'bd\'d2\'f4\'c0\'d6
\'c6\'bd\'cc\'a8\'be\'f5\'b5\'c3\'b2\'bb\'cd\'d7\'a3\'ac\'bf\'c9\'c1\'aa\'cf\'b5\'b1\'be\'cf\'ee\'c4\'bf\'b8\'fc\'b8\'c4\'bb\'f2\'d2\'c6\'b3\'fd\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'cb\'c4\'a1\'a2\'d7\'ca\'d4\'b4\'ca\'b9\'d3\'c3}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 4.1 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b1\'be\'cf\'ee\'c4\'bf\'c4\'da\'ca\'b9\'d3\'c3\'b5\'c4\'b2\'bf\'b7\'d6\'b0\'fc\'c0\'a8\'b5\'ab
\'b2\'bb\'cf\'de\'d3\'da\'d7\'d6\'cc\'e5\'a1\'a2\'cd\'bc\'c6\'ac\'b5\'c8\'d7\'ca\'d4\'b4\'c0\'b4\'d4\'b4\'d3\'da\'bb\'a5\'c1\'aa\'cd\'f8\'a1\'a3\'c8\'e7\'b9\'fb\'b3\'f6\'cf\'d6\'c7\'d6\'c8\'a8\'bf\'c9\'c1\'aa\'cf\'b5\'b1\'be\'cf\'ee\'c4\'bf\'d2\'c6
\'b3\'fd\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'ce\'e5\'a1\'a2\'c3\'e2\'d4\'f0\'c9\'f9\'c3\'f7}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 5.1 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'d3\'c9\'d3\'da\'ca\'b9\'d3\'c3\'b1\'be\'cf\'ee\'c4\'bf\'b2\'fa\'c9\'fa\'b5\'c4\'b0\'fc\'c0\'a8
\'d3\'c9\'d3\'da\'b1\'be\'d0\'ad\'d2\'e9\'bb\'f2\'d3\'c9\'d3\'da\'ca\'b9\'d3\'c3\'bb\'f2\'ce\'de\'b7\'a8\'ca\'b9\'d3\'c3\'b1\'be\'cf\'ee\'c4\'bf\'b6\'f8\'d2\'fd\'c6\'f0\'b5\'c4\'c8\'ce\'ba\'ce\'d0\'d4\'d6\'ca\'b5\'c4\'c8\'ce\'ba\'ce\'d6\'b1\'bd\'d3
\'a1\'a2\'bc\'e4\'bd\'d3\'a1\'a2\'cc\'d8\'ca\'e2\'a1\'a2\'c5\'bc\'c8\'bb\'bb\'f2\'bd\'e1\'b9\'fb\'d0\'d4\'cb\'f0\'ba\'a6\'a3\'a8\'b0\'fc\'c0\'a8\'b5\'ab\'b2\'bb\'cf\'de\'d3\'da\'d2\'f2\'c9\'cc\'d3\'fe\'cb\'f0\'ca\'a7\'a1\'a2\'cd\'a3\'b9\'a4\'a1\'a2
\'bc\'c6\'cb\'e3\'bb\'fa\'b9\'ca\'d5\'cf\'bb\'f2\'b9\'ca\'d5\'cf\'d2\'fd\'c6\'f0\'b5\'c4\'cb\'f0\'ba\'a6\'c5\'e2\'b3\'a5\'a3\'ac\'bb\'f2\'c8\'ce\'ba\'ce\'bc\'b0\'cb\'f9\'d3\'d0\'c6\'e4\'cb\'fb\'c9\'cc\'d2\'b5\'cb\'f0\'ba\'a6\'bb\'f2\'cb\'f0\'ca\'a7
\'a3\'a9\'d3\'c9\'ca\'b9\'d3\'c3\'d5\'df\'b8\'ba\'d4\'f0\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'c1\'f9\'a1\'a2\'ca\'b9\'d3\'c3\'cf\'de\'d6\'c6}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 6.1 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b1\'be\'cf\'ee\'c4\'bf\'cd\'ea\'c8\'ab\'c3\'e2\'b7\'d1\'a3\'ac\'c7\'d2\'bf\'aa\'d4\'b4\'b7\'a2
\'b2\'bc\'d3\'da}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \hich\af13\dbch\af13\loch\f13 GitHub }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\loch\af13\hich\af13\dbch\f13 \'c3\'e6\'cf\'f2\'c8\'ab\'ca\'c0\'bd\'e7\'c8\'cb\'d3\'c3\'d7\'f7\'b6\'d4\'bc\'bc\'ca\'f5\'b5\'c4\'d1\'a7\'cf\'b0\'bd\'bb\'c1\'f7\'a1\'a3\'b1\'be\'cf\'ee\'c4\'bf\'b2\'bb\'b6\'d4\'cf\'ee\'c4\'bf\'c4\'da\'b5\'c4\'bc\'bc\'ca\'f5
\'bf\'c9\'c4\'dc\'b4\'e6\'d4\'da\'ce\'a5\'b7\'b4\'b5\'b1\'b5\'d8\'b7\'a8\'c2\'c9\'b7\'a8\'b9\'e6\'b5\'c4\'d0\'d0\'ce\'aa\'d7\'f7\'b1\'a3\'d6\'a4\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 6.2 **}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'bd\'fb\'d6\'b9\'d4\'da\'ce\'a5\'b7\'b4\'b5\'b1\'b5\'d8\'b7\'a8\'c2\'c9\'b7\'a8\'b9\'e6
\'b5\'c4\'c7\'e9\'bf\'f6\'cf\'c2\'ca\'b9\'d3\'c3\'b1\'be\'cf\'ee\'c4\'bf\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \hich\af13\dbch\af13\loch\f13 ** }{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b6\'d4\'d3\'da\'ca\'b9\'d3\'c3\'d5\'df\'d4\'da\'c3\'f7\'d6\'aa\'bb\'f2\'b2\'bb\'d6\'aa\'b5\'b1\'b5\'d8\'b7\'a8\'c2\'c9\'b7\'a8\'b9\'e6\'b2\'bb\'d4\'ca\'d0\'ed
\'b5\'c4\'c7\'e9\'bf\'f6\'cf\'c2\'ca\'b9\'d3\'c3\'b1\'be\'cf\'ee\'c4\'bf\'cb\'f9\'d4\'ec\'b3\'c9\'b5\'c4\'c8\'ce\'ba\'ce\'ce\'a5\'b7\'a8\'ce\'a5\'b9\'e6\'d0\'d0\'ce\'aa\'d3\'c9\'ca\'b9\'d3\'c3\'d5\'df\'b3\'d0\'b5\'a3\'a3\'ac\'b1\'be\'cf\'ee\'c4\'bf
\'b2\'bb\'b3\'d0\'b5\'a3\'d3\'c9\'b4\'cb\'d4\'ec\'b3\'c9\'b5\'c4\'c8\'ce\'ba\'ce\'d6\'b1\'bd\'d3\'a1\'a2\'bc\'e4\'bd\'d3\'a1\'a2\'cc\'d8\'ca\'e2\'a1\'a2\'c5\'bc\'c8\'bb\'bb\'f2\'bd\'e1\'b9\'fb\'d0\'d4\'d4\'f0\'c8\'ce\'a1\'a3}{\rtlch\fcs1 \af13
\ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'c6\'df\'a1\'a2\'b0\'e6\'c8\'a8\'b1\'a3\'bb\'a4}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 7.1 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'d2\'f4\'c0\'d6\'c6\'bd\'cc\'a8\'b2\'bb\'d2\'d7\'a3\'ac\'c7\'eb\'d7\'f0\'d6\'d8\'b0\'e6\'c8\'a8
\'a3\'ac\'d6\'a7\'b3\'d6\'d5\'fd\'b0\'e6\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b0\'cb\'a1\'a2\'b7\'c7\'c9\'cc\'d2\'b5\'d0\'d4\'d6\'ca}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 8.1 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'b1\'be\'cf\'ee\'c4\'bf\'bd\'f6\'d3\'c3\'d3\'da\'b6\'d4\'bc\'bc\'ca\'f5\'bf\'c9\'d0\'d0\'d0\'d4
\'b5\'c4\'cc\'bd\'cb\'f7\'bc\'b0\'d1\'d0\'be\'bf\'a3\'ac\'b2\'bb\'bd\'d3\'ca\'dc\'c8\'ce\'ba\'ce\'c9\'cc\'d2\'b5\'a3\'a8\'b0\'fc\'c0\'a8\'b5\'ab\'b2\'bb\'cf\'de\'d3\'da\'b9\'e3\'b8\'e6\'b5\'c8\'a3\'a9\'ba\'cf\'d7\'f7\'bc\'b0\'be\'e8\'d4\'f9\'a1\'a3}{
\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'be\'c5\'a1\'a2\'bd\'d3\'ca\'dc\'d0\'ad\'d2\'e9}{\rtlch\fcs1 \af13 \ltrch\fcs0
\loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 9.1 }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'c8\'f4\'c4\'e3\'ca\'b9\'d3\'c3\'c1\'cb\'b1\'be\'cf\'ee\'c4\'bf\'a3\'ac\'bc\'b4\'b4\'fa\'b1\'ed
\'c4\'e3\'bd\'d3\'ca\'dc\'b1\'be\'d0\'ad\'d2\'e9\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 * }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'c8\'f4\'d0\'ad\'d2\'e9\'b8\'fc\'d0\'c2\'a3\'ac\'cb\'a1\'b2\'bb\'c1\'ed\'d0\'d0\'cd\'a8\'d6\'aa
\'a3\'ac\'bf\'c9\'b5\'bd\'bf\'aa\'d4\'b4\'b5\'d8\'d6\'b7\'b2\'e9\'bf\'b4\'a1\'a3}{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548
\par
\par \hich\af13\dbch\af13\loch\f13 By: }{\rtlch\fcs1 \af13 \ltrch\fcs0 \loch\af13\hich\af13\dbch\af13\insrsid2766548\charrsid2766548 \loch\af13\hich\af13\dbch\f13 \'c2\'e4\'d1\'a9\'ce\'de\'ba\'db}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12910709\charrsid2766548
\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
@@ -255,8 +320,8 @@ fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000b026
8d59201dd601feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000d096
bf3efc84db01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000105000000000000}}

View File

@@ -1,18 +1,52 @@
This project (software) is issued based on the Apache License 2.0 license. Before using this software, you (users) need to sign this agreement before you can continue to use it. The following agreement is a supplement to the Apache License 2.0. In case of conflict, use the following agreement Shall prevail.
This project is issued based on the Apache License 2.0 license. The following agreements are supplemental to the Apache License 2.0. In the event of a conflict, the following agreements shall prevail.
DEFINITIONS:
Terms agreed: "this software" in this agreement refers to the Luo Xue Music desktop version of the project; "user" refers to the user who signed this agreement; "official music platform" refers to the built-in software including Kuwo, Kugou, Migu The official platforms of music sources, etc. are collectively referred to; "copyright data" refers to data including but not limited to images, audio, names, etc. that others own the copyright.
"This Project" refers to the LX Music Desktop Edition (aka lx-music-desktop) project. "User" refers to the user who signed this agreement. "Official Music Streaming Service" refers to collectively the official streaming service corresponding to the music source. "Copyrighted Data" refers to data including, but not limited to, pictures, audio, names, etc., for which others own the copyright.
1. The principle of the data source of this software is to pull data from the public servers of each official music platform. After simply filtering and merging the data for display, this software is not responsible for the accuracy of the data.
2. Copyright data may be generated during the use of this software. For this copyright data, the software does not own their ownership. In order to avoid infringement, users must clear the copyright generated during the use of this software within 24 hours data.
3. The alias of the official music platform in this software is a name for the official music platform in the software. It does not contain maliciousness. If the official music platform feels inappropriate, you can contact the software to change or remove it.
4. The parts used in this software include but are not limited to fonts, pictures and other resources from the Internet. If there is infringement, you can contact this software to remove it.
5. Any direct, indirect, special, accidental or consequential damage of any nature arising from the use of this software, including this agreement or the use or inability to use this software (including but not limited to due to loss of goodwill, work stoppage, Compensation for computer failure or damage caused by the failure, or any and all other commercial damage or loss) is the responsibility of the user.
6. This project is completely free, and the open source is published on GitHub. It is used by people all over the world to learn and exchange technology. This software does not guarantee that the technology in the project may violate local laws and regulations. It is prohibited to violate local laws and regulations. Using this software, the user shall be responsible for any violations caused by the user's use of the software without knowing or not permitted by local laws and regulations. The software shall not be responsible for any direct, indirect, special, accidental Or consequential responsibility.
1. Data Source
1.1 The principle of the online data sources of the various official music streaming services of this project is to draw data from its open servers (the same as the data obtained in the unlogged-in state in the official music streaming service app). After simply screening and merging the data, this project is responsible for the legitimacy and accuracy of the data.
* If the agreement is updated without prior notice, you can check it at the open source address.
* The original intention of this software is to help the official music platform to simplify the data generation for display, and to help users quickly locate the music platform where the desired content is based on the song title, artist and other keywords.
* Music platform is not easy, it is recommended to support genuine resources to the corresponding music platform.
1.2 The ability of this project itself does not obtain certain audio data. The online audio data source used in this project comes from the online link provided by the "API" selected in the software settings. For example, when playing a song, this project only transmits information such as the song title, artist, and other information to the "API". If the "API" returns a link, this project will think that this is the audio data of the song for use, but as for whether this is the correct audio data, this project cannot verify its accuracy. So, in the process of using this project, there may be a problem that the audio you want to play does not correspond to the audio you actually play, or you cannot play it.
1.3 Data in this project other than official music streaming service (such as lists in "Your Library") comes from the user's local system or a synchronization service that the user connected to. This project is not responsible for the legality and accuracy of this data.
2. Copyrighted Data
2.1 During the process of using this project, copyrighted data may be generated. For this copyrighted data, this project does not have their ownership. In order to avoid infringement, users must remove copyrighted data generated during the process of using this project ** within 24 hours **.
3. Alias of Music Streaming Service
3.1 The official music streaming service alias within this project is a term used within this project to refer to the official music streaming service and does not contain malicious intent. If the operator of the official music streaming service feels it is inappropriate, you can contact this project to request changes or removals.
4. Use of Resources
4.1 The parts used in this project include, but are not limited to, fonts, pictures, and other resources from the Internet. If infringement occurs, you can contact this project.
5. Disclaimer
5.1 The use of this project includes any direct, indirect, special, accidental, or result damage due to any nature caused by this agreement or use or inability to use this item (including but not limited to the loss of goodwill, stop work, computer, computer Damage compensation caused by faults or any or all other commercial damage or losses) is the responsibility of users.
6. Use Restrictions
6.1 This project is completely free and open source and is published on GitHub for the learning exchanges of technology for people all over the world. This project does not guarantee that the technology in this project may violate local laws and regulations.
6.2 ** This project is prohibited in violation of local laws and regulations. ** The user is solely responsible for any violation of law caused by the use of this project that the user knows or does not know is not permitted by local law and regulations.
7. Copyright Protection
7.1 The operation of a music streaming service is not an easy task. Please respect copyrights and support the genuine.
8. Non-commercial Nature
8.1 This project is only used for exploring and research on technical feasibility and does not accept any business (including but not limited to advertising, etc.) cooperation and donations.
9. Accepting Agreement
9.1 If you use this project, it will represent you accept this agreement.
* If the agreement is updated, you will not be notified separately. You can check it out by visiting the project address.
* The content of this agreement is translated from the Chinese version of the agreement.
By: lyswhut

View File

@@ -1,18 +1,49 @@
本项目(软件)基于Apache License 2.0 许可证发行,在使用本软件前,你(使用者)需签署本协议才可继续使用,以下协议是对于 Apache License 2.0 的补充,如有冲突,以以下协议为准。
本项目基于 Apache License 2.0 许可证发行,以下协议是对于 Apache License 2.0 的补充,如有冲突,以以下协议为准。
词语约定:本协议中的“本项目”指 LX Music 桌面版项目;“使用者”指签署本协议的使用者;“官方音乐平台”指对本项目内置的包括酷我、酷狗、咪咕等音乐源的官方平台统称;“版权数据”指包括但不限于图像、音频、名字等在内的他人拥有所属版权的数据。
词语约定:本协议中的“本软件”指洛雪音乐桌面版项目;“使用者”指签署本协议的使用者;“官方音乐平台”指对本软件内置的包括酷我、酷狗、咪咕等音乐源的官方平台统称;“版权数据”指包括但不限于图像、音频、名字等在内的他人拥有所属版权的数据。
一、数据来源
1、本软件的数据来源原理是从各官方音乐平台的公开服务器中拉取数据,经过对数据简单地筛选与合并后进行展示,因此本软件不对数据的准确性负责。
2、使用本软件的过程中可能会产生版权数据对于这些版权数据本软件不拥有它们的所有权为了避免造成侵权使用者务必在24小时内清除使用本软件的过程中所产生的版权数据。
3、本软件内的官方音乐平台别名为本软件内对官方音乐平台的一个称呼不包含恶意如果官方音乐平台觉得不妥可联系本软件更改或移除。
4、本软件内使用的部分包括但不限于字体、图片等资源来源于互联网如果出现侵权可联系本软件移除。
5、由于使用本软件产生的包括由于本协议或由于使用或无法使用本软件而引起的任何性质的任何直接、间接、特殊、偶然或结果性损害包括但不限于因商誉损失、停工、计算机故障或故障引起的损害赔偿或任何及所有其他商业损害或损失由使用者负责。
6、本项目完全免费且开源发布于 GitHub 面向全世界人用作对技术的学习交流,本软件不对项目内的技术可能存在违反当地法律法规的行为作保证,禁止在违反当地法律法规的情况下使用本软件,对于使用者在明知或不知当地法律法规不允许的情况下使用本软件所造成的任何违法违规行为由使用者承担,本软件不承担由此造成的任何直接、间接、特殊、偶然或结果性责任。
1.1 本项目的各官方平台在线数据来源原理是从其公开服务器中拉取数据(与未登录状态在官方平台 APP 获取的数据相同),经过对数据简单地筛选与合并后进行展示,因此本项目不对数据的合法性、准确性负责。
1.2 本项目本身没有获取某个音频数据的能力,本项目使用的在线音频数据来源来自软件设置内“自定义源”设置所选择的“源”返回的在线链接。例如播放某首歌,本项目所做的只是将希望播放的歌曲名、艺术家等信息传递给“源”,若“源”返回了一个链接,则本项目将认为这就是该歌曲的音频数据而进行使用,至于这是不是正确的音频数据本项目无法校验其准确性,所以使用本项目的过程中可能会出现希望播放的音频与实际播放的音频不对应或者无法播放的问题。
1.3 本项目的非官方平台数据(例如“我的列表”内列表)来自使用者本地系统或者使用者连接的同步服务,本项目不对这些数据的合法性、准确性负责。
二、版权数据
2.1 使用本项目的过程中可能会产生版权数据。对于这些版权数据,本项目不拥有它们的所有权。为了避免侵权,使用者务必在 **24 小时内** 清除使用本项目的过程中所产生的版权数据。
三、音乐平台别名
3.1 本项目内的官方音乐平台别名为本项目内对官方音乐平台的一个称呼,不包含恶意。如果官方音乐平台觉得不妥,可联系本项目更改或移除。
四、资源使用
4.1 本项目内使用的部分包括但不限于字体、图片等资源来源于互联网。如果出现侵权可联系本项目移除。
五、免责声明
5.1 由于使用本项目产生的包括由于本协议或由于使用或无法使用本项目而引起的任何性质的任何直接、间接、特殊、偶然或结果性损害(包括但不限于因商誉损失、停工、计算机故障或故障引起的损害赔偿,或任何及所有其他商业损害或损失)由使用者负责。
六、使用限制
6.1 本项目完全免费,且开源发布于 GitHub 面向全世界人用作对技术的学习交流。本项目不对项目内的技术可能存在违反当地法律法规的行为作保证。
6.2 **禁止在违反当地法律法规的情况下使用本项目。** 对于使用者在明知或不知当地法律法规不允许的情况下使用本项目所造成的任何违法违规行为由使用者承担,本项目不承担由此造成的任何直接、间接、特殊、偶然或结果性责任。
七、版权保护
7.1 音乐平台不易,请尊重版权,支持正版。
八、非商业性质
8.1 本项目仅用于对技术可行性的探索及研究,不接受任何商业(包括但不限于广告等)合作及捐赠。
九、接受协议
9.1 若你使用了本项目,即代表你接受本协议。
* 若协议更新,恕不另行通知,可到开源地址查看。
* 本软件的初衷是帮助官方音乐平台简化数据后代为展示,帮助使用者根据歌曲名、艺术家等关键字快速地定位所需内容所在的音乐平台。
* 音乐平台不易,建议到对应音乐平台支持正版资源。
By: 落雪无痕

30957
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,143 +1,92 @@
{
"name": "lx-music-desktop",
"version": "1.3.0",
"description": "一个免费的音乐下载助手",
"main": "./dist/electron/main.js",
"productName": "lx-music-desktop",
"version": "2.12.6-beta.2",
"description": "一个免费的音乐查找助手",
"main": "./dist/main.js",
"scripts": {
"pack": "node build-config/pack.js && npm run pack:win",
"pack:win": "npm run pack:win:setup:x86_64 && npm run pack:win:7z",
"pack:win:setup:x86_64": "cross-env TARGET=win_安装版 ARCH=x86_64 electron-builder -w=nsis --x64 --ia32",
"pack:win:setup:x64": "cross-env TARGET=win_安装版 ARCH=x64 electron-builder -w=nsis --x64",
"pack:win:setup:x86": "cross-env TARGET=win_安装版 ARCH=x86 electron-builder -w=nsis --ia32",
"pack": "node build-config/pack.js && npm run pack:win:setup:x64",
"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": "node build-config/build-pack.js target=win arch=x86_64 type=setup",
"pack:win:setup:x64": "node build-config/build-pack.js target=win arch=x64 type=setup",
"pack:win:setup:x86": "node build-config/build-pack.js target=win arch=x86 type=setup",
"pack:win:setup:arm64": "node build-config/build-pack.js target=win arch=arm64 type=setup",
"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=便携版 ARCH=x86_64 electron-builder -w=portable --x64 --ia32",
"pack:win:portable:x64": "cross-env TARGET=便携版 ARCH=x64 electron-builder -w=portable --x64",
"pack:win:portable:x86": "cross-env TARGET=便携版 ARCH=x86 electron-builder -w=portable --ia32",
"pack:win:7z": "npm run pack:win:7z:x64 && npm run pack:win:7z:x86",
"pack:win:7z:x64": "cross-env TARGET=win_绿色版 ARCH=x64 electron-builder -w=7z --x64",
"pack:win:7z:x86": "cross-env TARGET=win_绿色版 ARCH=x86 electron-builder -w=7z --ia32",
"publish": "node publish",
"publish:gh": "node build-config/pack.js && npm run publish:win",
"publish:win": "npm run publish:win:7z && npm run publish:win:setup",
"publish:win:setup": "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",
"publish:win:portable:x64": "cross-env TARGET=portable ARCH=x64 electron-builder -w=portable --x64 -p onTagOrDraft",
"publish:win:portable:x86": "cross-env TARGET=portable ARCH=x86 electron-builder -w=portable --ia32 -p onTagOrDraft",
"publish:win:7z": "npm run publish:win:7z:x64 && npm run publish:win:7z:x86",
"publish:win:7z:x64": "cross-env TARGET=green ARCH=win_x64 electron-builder -w=7z --x64 -p always",
"publish:win:7z:x86": "cross-env TARGET=green ARCH=win_x86 electron-builder -w=7z --ia32 -p onTagOrDraft",
"publish:gh:mac": "node build-config/pack.js && npm run publish:mac",
"publish:mac": "npm run publish:mac:dmg",
"publish:mac:dmg": "electron-builder -m=dmg -p onTagOrDraft",
"publish:gh:linux": "node build-config/pack.js && npm run publish:linux",
"publish:linux": "npm run publish:linux:deb && npm run publish:linux:appImage && npm run publish:linux:rpm && npm run publish:linux:pacman",
"publish:linux:appImage": "cross-env ARCH=x64 electron-builder -l=AppImage -p onTagOrDraft",
"publish:linux:deb": "npm run publish:linux:deb:x64 && npm run publish:linux:deb:x86",
"publish:linux:deb:x64": "cross-env ARCH=x64 electron-builder -l=deb --x64 -p onTagOrDraft",
"publish:linux:deb:x86": "cross-env ARCH=x86 electron-builder -l=deb --ia32 -p onTagOrDraft",
"publish:linux:rpm": "cross-env ARCH=x64 electron-builder -l=rpm --x64 -p onTagOrDraft",
"publish:linux:pacman": "cross-env ARCH=x64 electron-builder -l=pacman --x64 -p onTagOrDraft",
"pack:win:portable:x86_64": "node build-config/build-pack.js target=win arch=x86_64 type=portable",
"pack:win:portable:x64": "node build-config/build-pack.js target=win arch=x64 type=portable",
"pack:win:portable:x86": "node build-config/build-pack.js target=win arch=x86 type=portable",
"pack:win:7z": "npm run pack:win:7z:x64",
"pack:win:7z:x64": "node build-config/build-pack.js target=win arch=x64 type=green",
"pack:win:7z:arm64": "node build-config/build-pack.js target=win arch=arm64 type=green",
"pack:win7:setup:x64": "node build-config/build-pack.js target=win arch=x64 type=win7_setup",
"pack:win7:7z:x64": "node build-config/build-pack.js target=win arch=x64 type=win7_green",
"pack:win7:7z:x86": "node build-config/build-pack.js target=win arch=x86 type=win7_green",
"pack:linux": "node build-config/pack.js && npm run pack:linux:deb && npm run pack:linux:appImage && npm run pack:linux:rpm && npm run pack:linux:pacman",
"pack:linux:appImage": "cross-env ARCH=x64 electron-builder -l=AppImage",
"pack:linux:deb": "npm run pack:linux:deb:x64 && npm run pack:linux:deb:x86",
"pack:linux:deb:x64": "cross-env ARCH=x64 electron-builder -l=deb --x64",
"pack:linux:deb:x86": "cross-env ARCH=x86 electron-builder -l=deb --ia32",
"pack:linux:rpm": "cross-env ARCH=x64 electron-builder -l=rpm --x64",
"pack:linux:pacman": "cross-env ARCH=x64 electron-builder -l=pacman --x64",
"pack:mac": "node build-config/pack.js && electron-builder -m=dmg",
"pack:dir": "node build-config/pack.js && electron-builder --dir",
"dev": "node build-config/runner-dev.js",
"clean:electron": "rimraf dist/electron",
"clean": "rimraf dist && rimraf build",
"build:main": "cross-env NODE_ENV=production webpack --config build-config/main/webpack.config.prod.js --progress --hide-modules",
"build:renderer": "cross-env NODE_ENV=production webpack --config build-config/renderer/webpack.config.prod.js --progress --hide-modules",
"build:renderer-lyric": "cross-env NODE_ENV=production webpack --config build-config/renderer-lyric/webpack.config.prod.js --progress --hide-modules",
"build": "npm run clean:electron && npm run build:main && npm run build:renderer && npm run build:renderer-lyric",
"lint": "eslint --ext .js,.vue -f ./node_modules/eslint-formatter-friendly src",
"lint:fix": "eslint --ext .js,.vue -f ./node_modules/eslint-formatter-friendly --fix src"
"pack:linux:appImage": "node build-config/build-pack.js target=linux arch=x64 type=appImage",
"pack:linux:deb": "npm run pack:linux:deb:amd64 && npm run pack:linux:deb:arm64 && npm run pack:linux:deb:armv7l",
"pack:linux:deb:amd64": "node build-config/build-pack.js target=linux arch=x64 type=deb",
"pack:linux:deb:arm64": "node build-config/build-pack.js target=linux arch=arm64 type=deb",
"pack:linux:deb:armv7l": "node build-config/build-pack.js target=linux arch=armv7l type=deb",
"pack:linux:rpm": "node build-config/build-pack.js target=linux arch=x64 type=rpm",
"pack:linux:pacman": "node build-config/build-pack.js target=linux arch=x64 type=pacman",
"pack:mac": "node build-config/pack.js && npm run pack:mac:dmg && npm run pack:mac:dmg:arm64",
"pack:mac:dmg": "node build-config/build-pack.js target=mac arch=x64 type=dmg",
"pack:mac:dmg:arm64": "node build-config/build-pack.js target=mac arch=arm64 type=dmg",
"pack:dir": "node build-config/pack.js && node build-config/build-pack.js target=dir",
"publish": "node publish",
"publish:win:setup:x64": "node build-config/build-pack.js target=win arch=x64 type=setup publish=always",
"publish:win:setup:x86": "node build-config/build-pack.js target=win arch=x86 type=setup publish=always",
"publish:win:setup:arm64": "node build-config/build-pack.js target=win arch=arm64 type=setup publish=always",
"publish:win:setup:x86_64": "node build-config/build-pack.js target=win arch=x86_64 type=setup publish=always",
"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": "node build-config/build-pack.js target=win arch=x86_64 type=portable publish=always",
"publish:win:portable:x64": "node build-config/build-pack.js target=win arch=x64 type=portable publish=always",
"publish:win:portable:x86": "node build-config/build-pack.js target=win arch=x86 type=portable publish=always",
"publish:win:7z:x64": "node build-config/build-pack.js target=win arch=x64 type=green publish=always",
"publish:win:7z:arm64": "node build-config/build-pack.js target=win arch=arm64 type=green publish=always",
"publish:win7:setup:x64": "node build-config/build-pack.js target=win arch=x64 type=win7_setup publish=always",
"publish:win7:7z:x64": "node build-config/build-pack.js target=win arch=x64 type=win7_green publish=always",
"publish:win7:7z:x86": "node build-config/build-pack.js target=win arch=x86 type=win7_green publish=always",
"publish:mac:dmg": "node build-config/build-pack.js target=mac arch=x64 type=dmg publish=always",
"publish:mac:dmg:arm64": "node build-config/build-pack.js target=mac arch=arm64 type=dmg publish=always",
"publish:linux:deb:amd64": "node build-config/build-pack.js target=linux arch=x64 type=deb publish=always",
"publish:linux:deb:arm64": "node build-config/build-pack.js target=linux arch=arm64 type=deb publish=always",
"publish:linux:deb:armv7l": "node build-config/build-pack.js target=linux arch=armv7l type=deb publish=always",
"publish:linux:appImage": "node build-config/build-pack.js target=linux arch=x64 type=appImage publish=always",
"publish:linux:rpm": "node build-config/build-pack.js target=linux arch=x64 type=rpm publish=always",
"publish:linux:pacman": "node build-config/build-pack.js target=linux arch=x64 type=pacman publish=always",
"dev": "cross-env NODE_OPTIONS=--max-http-header-size=200000 node build-config/runner-dev.js",
"build:theme": "node src/common/theme/createThemes.js",
"build": "node build-config/pack.js",
"build:main": "cross-env NODE_ENV=production webpack --config build-config/main/webpack.config.prod.js --progress",
"build:renderer": "cross-env NODE_ENV=production webpack --config build-config/renderer/webpack.config.prod.js --progress",
"build:renderer-lyric": "cross-env NODE_ENV=production webpack --config build-config/renderer-lyric/webpack.config.prod.js --progress",
"build:renderer-scripts": "cross-env NODE_ENV=production webpack --config build-config/renderer-scripts/webpack.config.prod.js --progress",
"lint": "eslint --ext .ts,.js,.vue -f node_modules/eslint-formatter-friendly src",
"lint:fix": "eslint --ext .ts,.js,.vue -f node_modules/eslint-formatter-friendly --fix src",
"postinstall": "node build-config/postinstall.js",
"dp": "cross-env ELECTRON_GET_USE_PROXY=true GLOBAL_AGENT_HTTPS_PROXY=http://127.0.0.1:2081 npm run pack",
"up": "cross-env ELECTRON_GET_USE_PROXY=true GLOBAL_AGENT_HTTPS_PROXY=http://127.0.0.1:2081 npm i"
},
"browserslist": [
"Electron 10.1.3"
"Electron 22.3.0"
],
"engines": {
"node": ">= 12"
"node": ">= 22",
"npm": ">=8.5.2"
},
"build": {
"appId": "cn.toside.music.desktop",
"directories": {
"output": "./build"
"macLanguagesInfoPlistStrings": {
"en": {
"CFBundleDisplayName": "LX Music",
"CFBundleName": "LX Music"
},
"files": [
"dist/electron/**/*"
],
"extraResources": [
"./licenses"
],
"win": {
"icon": "./resources/icons/256x256.ico",
"legalTrademarks": "lyswhut",
"artifactName": "${productName} v${version} ${env.ARCH} ${env.TARGET}.${ext}"
"zh_CN": {
"CFBundleDisplayName": "LX Music",
"CFBundleName": "LX Music"
},
"mac": {
"icon": "./resources/icons/512x512.icns",
"category": "public.app-category.music"
},
"linux": {
"maintainer": "lyswhut <lyswhut@qq.com>",
"artifactName": "${productName} v${version} ${env.ARCH}.${ext}",
"icon": "./resources/icons",
"category": "Utility;AudioVideo;Audio;Player;Music;",
"desktop": {
"Name[zh_CN]": "洛雪音乐助手"
}
},
"nsis": {
"oneClick": false,
"language": "2052",
"allowToChangeInstallationDirectory": true,
"differentialPackage": true,
"license": "./licenses/license.rtf",
"shortcutName": "LX Music"
},
"dmg": {
"window": {
"width": 600,
"height": 400
},
"contents": [
{
"x": 106,
"y": 252,
"name": "LX Music"
},
{
"x": 490,
"y": 252,
"type": "link",
"path": "/Applications"
}
],
"title": "洛雪音乐助手 v${version}"
},
"appImage": {
"license": "./licenses/license_zh.txt",
"category": "Utility;AudioVideo;Audio;Player;Music;"
},
"publish": [
{
"provider": "github",
"owner": "lyswhut",
"repo": "lx-music-desktop"
},
{
"package": "lx-music-desktop",
"repo": "lx-music-desktop",
"user": "lyswhut",
"provider": "bintray"
}
]
"zh_TW": {
"CFBundleDisplayName": "LX Music",
"CFBundleName": "LX Music"
}
},
"repository": {
"type": "git",
@@ -146,7 +95,7 @@
"keywords": [
"music-player",
"electron-app",
"vuejs2"
"vuejs3"
],
"author": {
"name": "lyswhut",
@@ -158,82 +107,117 @@
},
"homepage": "https://github.com/lyswhut/lx-music-desktop#readme",
"devDependencies": {
"@babel/core": "^7.12.3",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-modules-umd": "^7.12.1",
"@babel/plugin-transform-runtime": "^7.12.1",
"@babel/polyfill": "^7.12.1",
"@babel/preset-env": "^7.12.1",
"babel-eslint": "^10.1.0",
"babel-loader": "^8.1.0",
"babel-minify-webpack-plugin": "^0.3.1",
"babel-preset-minify": "^0.5.1",
"cfonts": "^2.8.6",
"chalk": "^4.1.0",
"changelog-parser": "^2.8.0",
"copy-webpack-plugin": "^6.2.1",
"core-js": "^3.6.5",
"cross-env": "^7.0.2",
"css-loader": "^4.3.0",
"del": "^6.0.0",
"electron": "^9.3.3",
"electron-builder": "^22.9.1",
"electron-debug": "^3.1.0",
"electron-devtools-installer": "^3.1.1",
"eslint": "^7.12.1",
"eslint-config-standard": "^14.1.1",
"eslint-formatter-friendly": "^7.0.0",
"eslint-loader": "^4.0.2",
"eslint-plugin-html": "^6.1.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.2",
"file-loader": "^6.2.0",
"friendly-errors-webpack-plugin": "^1.7.0",
"html-webpack-plugin": "^4.5.0",
"less": "^3.12.2",
"less-loader": "^7.0.2",
"markdown-it": "^11.0.1",
"mini-css-extract-plugin": "^0.12.0",
"optimize-css-assets-webpack-plugin": "^5.0.4",
"postcss-loader": "^4.0.4",
"postcss-pxtorem": "^5.1.1",
"pug": "^3.0.0",
"pug-loader": "^2.4.0",
"pug-plain-loader": "^1.0.0",
"raw-loader": "^4.0.2",
"rimraf": "^3.0.2",
"spinnies": "^0.5.1",
"stylus": "^0.54.8",
"stylus-loader": "^4.2.0",
"terser-webpack-plugin": "^4.2.3",
"url-loader": "^4.1.1",
"vue-loader": "^15.9.4",
"vue-template-compiler": "^2.6.12",
"webpack": "^4.44.2",
"webpack-cli": "^3.3.12",
"webpack-dev-server": "^3.11.0",
"webpack-hot-middleware": "^2.25.0",
"webpack-merge": "^5.3.0"
"@tsconfig/recommended": "^1.0.13",
"@types/better-sqlite3": "^7.6.13",
"@types/needle": "^3.3.0",
"@types/node": "^20.19.43",
"@types/tunnel": "^0.0.7",
"@types/ws": "8.5.4",
"@vue/language-plugin-pug": "^3.3.11",
"browserslist": "^4.28.9",
"chalk": "^4.1.2",
"changelog-parser": "3.0.1",
"copy-webpack-plugin": "^14.0.0",
"core-js": "^3.50.0",
"cross-env": "^10.1.0",
"css-loader": "^7.1.5",
"css-minimizer-webpack-plugin": "^8.0.0",
"del": "^6.1.1",
"electron": "42.11.3",
"electron-builder": "^26.15.7",
"electron-debug": "^3.2.0",
"electron-devtools-installer": "github:lyswhut/electron-devtools-installer#64596d615c1fc891eefd8aef1dfcb2c87aaadf03",
"electron-to-chromium": "^1.5.427",
"electron-updater": "6.8.9",
"eslint": "^8.57.1",
"eslint-config-standard": "^17.1.0",
"eslint-config-standard-with-typescript": "^43.0.1",
"eslint-formatter-friendly": "github:lyswhut/eslint-friendly-formatter#2170d1320e2fad13615a9dcf229669f0bb473a53",
"eslint-plugin-html": "^8.2.0",
"eslint-plugin-vue": "^9.33.0",
"eslint-plugin-vue-pug": "^0.6.2",
"eslint-webpack-plugin": "^4.2.0",
"html-webpack-plugin": "^5.6.8",
"less": "^4.9.1",
"less-loader": "^13.0.0",
"mini-css-extract-plugin": "^2.10.2",
"node-loader": "^2.1.0",
"postcss": "^8.5.28",
"postcss-loader": "^8.2.1",
"postcss-pxtorem": "^6.1.0",
"pug": "^3.0.4",
"pug-plain-loader": "^1.1.0",
"rimraf": "^6.1.3",
"spinnies": "github:lyswhut/spinnies#233305c58694aa3b053e3ab9af9049993f918b9d",
"svg-sprite-loader": "^6.0.11",
"svg-transform-loader": "^2.0.13",
"svgo-loader": "^5.0.0",
"terser": "^5.51.2",
"terser-webpack-plugin": "^5.6.1",
"tree-kill": "^1.2.2",
"ts-loader": "^9.6.2",
"typescript": "5.9.3",
"vue-eslint-parser": "^9.4.3",
"vue-loader": "^17.4.2",
"webpack": "5.106.2",
"webpack-cli": "^7.2.3",
"webpack-dev-server": "5.2.6",
"webpack-hot-middleware": "github:lyswhut/webpack-hot-middleware#329c4375134b89d39da23a56a94db651247c74a1",
"webpack-merge": "^6.0.1"
},
"dependencies": {
"crypto-js": "^4.0.0",
"dnscache": "^1.0.2",
"electron-log": "^4.2.4",
"electron-store": "^6.0.1",
"electron-updater": "^4.3.5",
"iconv-lite": "^0.6.2",
"image-size": "^0.9.3",
"js-htmlencode": "^0.3.0",
"lrc-file-parser": "^1.0.5",
"needle": "^2.5.2",
"node-id3": "^0.2.1",
"request": "^2.88.2",
"vue": "^2.6.12",
"vue-i18n": "^8.22.1",
"vue-router": "^3.4.8",
"vuex": "^3.5.1",
"vuex-router-sync": "^5.0.0"
"@simonwep/pickr": "1.9.1",
"better-sqlite3": "^13.0.3",
"bufferutil": "^4.1.0",
"comlink": "~4.3.1",
"crypto-js": "^4.2.0",
"electron-log": "^5.4.4",
"font-list": "^2.1.0",
"iconv-lite": "^0.7.3",
"image-size": "^1.1.0",
"jschardet": "^3.1.4",
"long": "^5.3.2",
"message2call": "^0.1.3",
"music-metadata": "^11.15.0",
"needle": "github:lyswhut/needle#93299ac841b7e9a9f82ca7279b88aaaeda404060",
"node-id3": "^0.2.9",
"sortablejs": "^1.15.7",
"tunnel": "^0.0.6",
"undici": "^7.29.1",
"utf-8-validate": "^6.0.6",
"vue": "~3.3.13",
"vue-router": "~4.5.1",
"ws": "^8.21.3"
},
"overrides": {
"got": "^11",
"json5": "latest",
"node-abi": "latest",
"minimatch": "latest",
"semver": "latest",
"posthtml": "latest",
"node-gyp": "latest",
"sockjs": {
"uuid": "^12"
},
"svg-transform-loader": {
"postcss": "^8"
},
"svg-sprite-loader": {
"postcss": "^8"
},
"svg-baker": {
"postcss": "^8"
},
"braces": "latest",
"node-gyp-build": "latest",
"micromatch": "latest",
"http-cache-semantics": "latest"
},
"allowScripts": {
"bufferutil": false,
"core-js": false,
"electron-winstaller": false,
"utf-8-validate": false
}
}

View File

@@ -15,7 +15,7 @@ module.exports = {
'*-height', '*-width',
'flex', '::-webkit-scrollbar',
'top', 'left', 'bottom', 'right',
'border-radius',
'border-radius', 'gap',
],
selectorBlackList: ['html', 'ignore-to-rem'],
replace: true,

View File

@@ -1,11 +1,15 @@
### 新增
- 播放详情页新增歌曲评论加载显示(某些平台暂不支持显示子评论)
目前新项目 Any Listen 的桌面版、Web 版已实现 LX Music 的大部分功能,并额外支持 WebDAV 歌曲播放、WebDAV 数据同步、独立播放列表等功能。
以后的开发精力将主要集中在新项目上,之前大家在 LX Music 提的功能我们也会考虑在新项目中添加。
对于日常使用 LX Music 的人可以试试迁移到 Any Listen若遇到任何问题可以发 issue 反馈。
Any Listen 的项目地址为 https://github.com/any-listen/any-listen
### 优化
- 修改播放详情页的歌曲图片的显示效果
- 优化 tx 推荐歌单列表
- 优化禁用透明窗口的窗口边框显示效果
### 修复
- 修复小芸源音乐搜索结果最多只有20条搜索结果的问题
- 修复打开某些 kg 歌单时歌曲丢失的问题
- 修复 Windows 7 无法启动的问题
- 修复禁用透明窗口时按 F11 无法全屏的问题

View File

@@ -34,7 +34,7 @@ function fm(value) {
exports.sizeFormate = size => {
// https://gist.github.com/thomseddon/3511330
if (!size) return '0 b'
let units = ['b', 'kB', 'MB', 'GB', 'TB']
let units = ['B', 'KiB', 'MiB', 'GiB', 'TiB']
let number = Math.floor(Math.log(size) / Math.log(1024))
return `${(size / Math.pow(1024, Math.floor(number))).toFixed(2)} ${units[number]}`
}

View File

@@ -0,0 +1,40 @@
/**
*
* @param {string} text
* @returns
*/
export const parseChangelog = async(text) => {
const versions = []
const lines = text.split(/\r\n|\r|\n/)
let currentVersion = null
let currentDate = null
let currentDesc = ''
for (const line of lines) {
const versionMatch = line.match(/^\s*##\s+\[?(\d+\.\d+\.\d+)\]?.*?-\s+(\d{4}-\d{2}-\d{2})$/)
if (versionMatch) {
if (currentVersion) {
versions.push({
version: currentVersion,
date: currentDate,
desc: currentDesc.trim(),
})
}
currentVersion = versionMatch[1]
currentDate = versionMatch[3]
currentDesc = ''
} else {
currentDesc += `${line}\n`
}
}
if (currentVersion) {
versions.push({
version: currentVersion,
date: currentDate,
desc: currentDesc.trim(),
})
}
return versions
}

View File

@@ -6,45 +6,41 @@ const version = require('../version.json')
const chalk = require('chalk')
const pkg_bak = JSON.stringify(pkg, null, 2)
const version_bak = JSON.stringify(version, null, 2)
const parseChangelog = require('changelog-parser')
const changelogPath = jp('../../CHANGELOG.md')
const { parseChangelog } = require('./parseChangelog')
const md_renderer = markdownStr => new (require('markdown-it'))({
html: true,
linkify: true,
typographer: true,
breaks: true,
}).render(markdownStr)
// const md_renderer = markdownStr => new (require('markdown-it'))({
// html: true,
// linkify: true,
// typographer: true,
// breaks: true,
// }).render(markdownStr)
const getPrevVer = () => parseChangelog(changelogPath).then(res => {
if (!res.versions.length) throw new Error('CHANGELOG 无法解析到版本号')
return res.versions[0].version
const getPrevVer = () => parseChangelog(fs.readFileSync(changelogPath, 'utf-8').toString()).then(versions => {
if (!versions.length) throw new Error('CHANGELOG 无法解析到版本号')
return versions[0].version
})
const updateChangeLog = async(newVerNum, newChangeLog) => {
let changeLog = fs.readFileSync(changelogPath, 'utf-8')
const prevVer = await getPrevVer()
const log = `## [${newVerNum}](${pkg.repository.url.replace(/^git\+(http.+)\.git$/, '$1')}/compare/v${prevVer}...v${newVerNum}) - ${formatTime()}\n\n${newChangeLog}`
fs.writeFileSync(changelogPath, changeLog.replace(new RegExp('(## [?0.1.1]?)'), log + '\n$1'), 'utf-8')
fs.writeFileSync(changelogPath, changeLog.replace(/(## \[(?:\d+\.))/, log + '\n$1'), 'utf-8')
}
const renderChangeLog = md => md_renderer(md)
// const renderChangeLog = md => md_renderer(md)
module.exports = async newVerNum => {
if (!newVerNum) {
let verArr = pkg.version.split('.')
verArr[verArr.length - 1] = parseInt(verArr[verArr.length - 1]) + 1
newVerNum = verArr.join('.')
}
if (!newVerNum) newVerNum = pkg.version
const newMDChangeLog = fs.readFileSync(jp('../changeLog.md'), 'utf-8')
const newChangeLog = renderChangeLog(newMDChangeLog)
// const newChangeLog = renderChangeLog(newMDChangeLog)
version.history.unshift({
version: version.version,
desc: version.desc,
})
version.version = newVerNum
version.desc = newChangeLog
version.desc = newMDChangeLog.replace(/(?:^|(\n))#{1,6} (.+)\n/g, '$1$2').trim()
pkg.version = newVerNum
console.log(chalk.blue('new version: ') + chalk.green(newVerNum))
@@ -58,7 +54,7 @@ module.exports = async newVerNum => {
return {
pkg_bak,
version_bak,
changeLog: newChangeLog,
// changeLog: newChangeLog,
}
}

File diff suppressed because one or more lines are too long

BIN
resources/icons/128x128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
resources/icons/16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

BIN
resources/icons/256x256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
resources/icons/32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 901 B

BIN
resources/icons/48x48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 17 KiB

BIN
resources/icons/64x64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
resources/icons/icon.icns Normal file

Binary file not shown.

BIN
resources/icons/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
resources/icons/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

15
src/common/.eslintrc.cjs Normal file
View File

@@ -0,0 +1,15 @@
/* eslint-env node */
const { base, typescript } = require('../../.eslintrc.base.cjs')
module.exports = {
root: true,
...base,
overrides: [
{
...typescript,
parserOptions: {
project: './tsconfig.json',
},
},
],
}

View File

@@ -1,56 +0,0 @@
module.exports = {
windowSizeList: [
{
id: 0,
name: 'smaller',
width: 828,
height: 530,
fontSize: '14px',
},
{
id: 1,
name: 'small',
width: 920,
height: 590,
fontSize: '16px',
},
{
id: 2,
name: 'medium',
width: 1018,
height: 650,
fontSize: '16px',
},
{
id: 3,
name: 'big',
width: 1114,
height: 708,
fontSize: '17px',
},
{
id: 4,
name: 'larger',
width: 1202,
height: 766,
fontSize: '17px',
},
{
id: 5,
name: 'oversized',
width: 1382,
height: 886,
fontSize: '18px',
},
{
id: 6,
name: 'huge',
width: 1686,
height: 1062,
fontSize: '19px',
},
],
navigationUrlWhiteList: [
/^https:\/\/www\.xiami\.com/,
],
}

86
src/common/config.ts Normal file
View File

@@ -0,0 +1,86 @@
export interface WindowSize {
id: number
name: string
width: number
height: number
}
export const windowSizeList: WindowSize[] = [
{
id: 0,
name: 'smaller',
width: 828,
height: 540,
},
{
id: 1,
name: 'small',
width: 920,
height: 600,
},
{
id: 2,
name: 'medium',
width: 1020,
height: 660,
},
{
id: 3,
name: 'big',
width: 1114,
height: 718,
},
{
id: 4,
name: 'larger',
width: 1202,
height: 776,
},
{
id: 5,
name: 'oversized',
width: 1385,
height: 896,
},
{
id: 6,
name: 'huge',
width: 1700,
height: 1070,
},
]
export const navigationUrlWhiteList: RegExp[] = []
// 基础黑白色
// export const commonColorNames = [
// '--color-000', '--color-050', '--color-100', '--color-200', '--color-300', '--color-400',
// '--color-500', '--color-600', '--color-700', '--color-800', '--color-900',
// ] as const
// export const commonLightColorValues = [
// 'rgb(255, 255, 255)',
// 'rgb(217,217,217)',
// 'rgb(184,184,184)',
// 'rgb(156,156,156)',
// 'rgb(133,133,133)',
// 'rgb(113,113,113)',
// 'rgb(96,96,96)',
// 'rgb(82,82,82)',
// 'rgb(70,70,70)',
// 'rgb(60,60,60)',
// 'rgb(51,51,51)',
// ] as const
// export const commonDarkColorValues = [
// 'rgb(11, 11, 11)',
// 'rgb(60,60,60)',
// 'rgb(99,99,99)',
// 'rgb(130,130,130)',
// 'rgb(155,155,155)',
// 'rgb(175,175,175)',
// 'rgb(191,191,191)',
// 'rgb(204,204,204)',
// 'rgb(214,214,214)',
// 'rgb(222,222,222)',
// 'rgb(229,229,229)',
// ] as const

84
src/common/constants.ts Normal file
View File

@@ -0,0 +1,84 @@
export const URL_SCHEME_RXP = /^lxmusic:\/\//
export const SPLIT_CHAR = {
DISLIKE_NAME: '@',
DISLIKE_NAME_ALIAS: '#',
} as const
export const STORE_NAMES = {
APP_SETTINGS: 'config_v2',
DATA: 'data',
SYNC: 'sync',
HOTKEY: 'hot_key',
USER_API: 'user_api',
LRC_RAW: 'lyrics',
LRC_EDITED: 'lyrics_edited',
THEME: 'theme',
SOUND_EFFECT: 'sound_effect',
} as const
export const APP_EVENT_NAMES = {
winMainName: 'win_main',
winLyricName: 'win_lyric',
trayName: 'tray',
} as const
export const LIST_IDS = {
DEFAULT: 'default',
LOVE: 'love',
TEMP: 'temp',
DOWNLOAD: 'download',
PLAY_LATER: null,
} as const
export const DATA_KEYS = {
viewPrevState: 'viewPrevState',
playInfo: 'playInfo',
searchHistoryList: 'searchHistoryList',
listScrollPosition: 'listScrollPosition',
listPrevSelectId: 'listPrevSelectId',
listUpdateInfo: 'listUpdateInfo',
ignoreVersion: 'ignoreVersion',
leaderboardSetting: 'leaderboardSetting',
songListSetting: 'songListSetting',
searchSetting: 'searchSetting',
lastStartInfo: 'lastStartInfo',
} as const
export const DEFAULT_SETTING = {
leaderboard: {
source: 'kw',
boardId: 'kw__16',
},
songList: {
source: 'kw',
sortId: 'new',
tagId: '',
},
search: {
temp_source: 'kw',
source: 'all',
type: 'music',
},
viewPrevState: {
url: '/search',
query: {},
},
}
export const DOWNLOAD_STATUS = {
RUN: 'run',
WAITING: 'waiting',
PAUSE: 'pause',
ERROR: 'error',
COMPLETED: 'completed',
} as const
export const QUALITYS = ['flac24bit', 'flac', 'wav', 'ape', '320k', '192k', '128k'] as const
export const TRAY_AUTO_ID = -1

View File

@@ -0,0 +1,74 @@
export const ENV_PARAMS = [
'PORT',
'BIND_IP',
'CONFIG_PATH',
'LOG_PATH',
'DATA_PATH',
'PROXY_HEADER',
'MAX_SNAPSHOT_NUM',
'LIST_ADD_MUSIC_LOCATION_TYPE',
'LX_USER_',
] as const
export const LIST_IDS = {
DEFAULT: 'default',
LOVE: 'love',
TEMP: 'temp',
DOWNLOAD: 'download',
PLAY_LATER: null,
} as const
export const SYNC_CODE = {
helloMsg: 'Hello~::^-^::~v4~',
idPrefix: 'OjppZDo6',
authMsg: 'lx-music auth::',
msgAuthFailed: 'Auth failed',
msgBlockedIp: 'Blocked IP',
msgConnect: 'lx-music connect',
authFailed: 'Auth failed',
missingAuthCode: 'Missing auth code',
getServiceIdFailed: 'Get service id failed',
connectServiceFailed: 'Connect service failed',
connecting: 'Connecting...',
unknownServiceAddress: 'Unknown service address',
} as const
export const SYNC_CLOSE_CODE = {
normal: 1000,
failed: 4100,
} as const
export const TRANS_MODE: Readonly<Record<LX.Sync.List.SyncMode, LX.Sync.List.SyncMode>> = {
merge_local_remote: 'merge_remote_local',
merge_remote_local: 'merge_local_remote',
overwrite_local_remote: 'overwrite_remote_local',
overwrite_remote_local: 'overwrite_local_remote',
overwrite_local_remote_full: 'overwrite_remote_local_full',
overwrite_remote_local_full: 'overwrite_local_remote_full',
cancel: 'cancel',
} as const
export const File = {
serverDataPath: 'sync/server',
clientDataPath: 'sync/client',
serverInfoJSON: 'serverInfo.json',
userDir: 'users',
userDevicesJSON: 'devices.json',
listDir: 'list',
listSnapshotDir: 'snapshot',
listSnapshotInfoJSON: 'snapshotInfo.json',
dislikeDir: 'dislike',
dislikeSnapshotDir: 'snapshot',
dislikeSnapshotInfoJSON: 'snapshotInfo.json',
syncAuthKeysJSON: 'syncAuthKey.json',
} as const
export const FeaturesList = [
'list',
'dislike',
] as const

View File

@@ -1,89 +0,0 @@
const { player: hotKeyPlayer, common: hotKeyCommon, desktop_lyric: hotKeyDesktopLyric } = require('./hotKey')
module.exports = {
local: {
enable: true,
keys: {
'mod+f5': {
type: hotKeyPlayer.toggle_play.type,
name: hotKeyPlayer.toggle_play.name,
action: hotKeyPlayer.toggle_play.action,
},
'mod+arrowleft': {
type: hotKeyPlayer.prev.type,
name: hotKeyPlayer.prev.name,
action: hotKeyPlayer.prev.action,
},
'mod+arrowright': {
type: hotKeyPlayer.next.type,
name: hotKeyPlayer.next.name,
action: hotKeyPlayer.next.action,
},
f1: {
type: hotKeyCommon.focusSearchInput.type,
name: hotKeyCommon.focusSearchInput.name,
action: hotKeyCommon.focusSearchInput.action,
},
},
},
global: {
enable: false,
keys: {
MediaPlayPause: {
type: hotKeyPlayer.toggle_play.type,
name: null,
action: hotKeyPlayer.toggle_play.action,
},
MediaPreviousTrack: {
type: hotKeyPlayer.prev.type,
name: null,
action: hotKeyPlayer.prev.action,
},
MediaNextTrack: {
type: hotKeyPlayer.next.type,
name: null,
action: hotKeyPlayer.next.action,
},
'mod+alt+f5': {
type: hotKeyPlayer.toggle_play.type,
name: hotKeyPlayer.toggle_play.name,
action: hotKeyPlayer.toggle_play.action,
},
'mod+alt+arrowleft': {
type: hotKeyPlayer.prev.type,
name: hotKeyPlayer.prev.name,
action: hotKeyPlayer.prev.action,
},
'mod+alt+arrowright': {
type: hotKeyPlayer.next.type,
name: hotKeyPlayer.next.name,
action: hotKeyPlayer.next.action,
},
'mod+alt+arrowup': {
type: hotKeyPlayer.volume_up.type,
name: hotKeyPlayer.volume_up.name,
action: hotKeyPlayer.volume_up.action,
},
'mod+alt+arrowdown': {
type: hotKeyPlayer.volume_down.type,
name: hotKeyPlayer.volume_down.name,
action: hotKeyPlayer.volume_down.action,
},
'mod+alt+0': {
type: hotKeyDesktopLyric.toggle_visible.type,
name: hotKeyDesktopLyric.toggle_visible.name,
action: hotKeyDesktopLyric.toggle_visible.action,
},
'mod+alt+-': {
type: hotKeyDesktopLyric.toggle_lock.type,
name: hotKeyDesktopLyric.toggle_lock.name,
action: hotKeyDesktopLyric.toggle_lock.action,
},
'mod+alt+=': {
type: hotKeyDesktopLyric.toggle_always_top.type,
name: hotKeyDesktopLyric.toggle_always_top.name,
action: hotKeyDesktopLyric.toggle_always_top.action,
},
},
},
}

View File

@@ -0,0 +1,93 @@
import { HOTKEY_PLAYER, HOTKEY_COMMON, HOTKEY_DESKTOP_LYRIC } from './hotKey'
const local: LX.HotKeyConfig = {
enable: true,
keys: {
'mod+f5': {
type: HOTKEY_PLAYER.toggle_play.type,
name: HOTKEY_PLAYER.toggle_play.name,
action: HOTKEY_PLAYER.toggle_play.action,
},
'mod+arrowleft': {
type: HOTKEY_PLAYER.prev.type,
name: HOTKEY_PLAYER.prev.name,
action: HOTKEY_PLAYER.prev.action,
},
'mod+arrowright': {
type: HOTKEY_PLAYER.next.type,
name: HOTKEY_PLAYER.next.name,
action: HOTKEY_PLAYER.next.action,
},
f1: {
type: HOTKEY_COMMON.focusSearchInput.type,
name: HOTKEY_COMMON.focusSearchInput.name,
action: HOTKEY_COMMON.focusSearchInput.action,
},
},
}
const global: LX.HotKeyConfig = {
enable: false,
keys: {
// MediaPlayPause: {
// type: HOTKEY_PLAYER.toggle_play.type,
// name: '',
// action: HOTKEY_PLAYER.toggle_play.action,
// },
// MediaPreviousTrack: {
// type: HOTKEY_PLAYER.prev.type,
// name: '',
// action: HOTKEY_PLAYER.prev.action,
// },
// MediaNextTrack: {
// type: HOTKEY_PLAYER.next.type,
// name: '',
// action: HOTKEY_PLAYER.next.action,
// },
'mod+alt+f5': {
type: HOTKEY_PLAYER.toggle_play.type,
name: HOTKEY_PLAYER.toggle_play.name,
action: HOTKEY_PLAYER.toggle_play.action,
},
'mod+alt+arrowleft': {
type: HOTKEY_PLAYER.prev.type,
name: HOTKEY_PLAYER.prev.name,
action: HOTKEY_PLAYER.prev.action,
},
'mod+alt+arrowright': {
type: HOTKEY_PLAYER.next.type,
name: HOTKEY_PLAYER.next.name,
action: HOTKEY_PLAYER.next.action,
},
'mod+alt+arrowup': {
type: HOTKEY_PLAYER.volume_up.type,
name: HOTKEY_PLAYER.volume_up.name,
action: HOTKEY_PLAYER.volume_up.action,
},
'mod+alt+arrowdown': {
type: HOTKEY_PLAYER.volume_down.type,
name: HOTKEY_PLAYER.volume_down.name,
action: HOTKEY_PLAYER.volume_down.action,
},
'mod+alt+0': {
type: HOTKEY_DESKTOP_LYRIC.toggle_visible.type,
name: HOTKEY_DESKTOP_LYRIC.toggle_visible.name,
action: HOTKEY_DESKTOP_LYRIC.toggle_visible.action,
},
'mod+alt+-': {
type: HOTKEY_DESKTOP_LYRIC.toggle_lock.type,
name: HOTKEY_DESKTOP_LYRIC.toggle_lock.name,
action: HOTKEY_DESKTOP_LYRIC.toggle_lock.action,
},
'mod+alt+=': {
type: HOTKEY_DESKTOP_LYRIC.toggle_always_top.type,
name: HOTKEY_DESKTOP_LYRIC.toggle_always_top.name,
action: HOTKEY_DESKTOP_LYRIC.toggle_always_top.action,
},
},
}
export default {
local,
global,
}

View File

@@ -1,107 +0,0 @@
const path = require('path')
const os = require('os')
const { isMac } = require('./utils')
const defaultSetting = {
version: '1.0.38',
player: {
togglePlayMethod: 'listLoop',
highQuality: false,
isShowTaskProgess: true,
volume: 1,
isMute: false,
mediaDeviceId: 'default',
isMediaDeviceRemovedStopPlay: false,
isShowLyricTransition: true,
},
desktopLyric: {
enable: false,
isLock: false,
isAlwaysOnTop: false,
width: 380,
height: 420,
x: null,
y: null,
theme: 0,
isLockScreen: true,
style: {
fontSize: 120,
opacity: 95,
isZoomActiveLrc: true,
},
},
list: {
isShowAlbumName: true,
isShowSource: true,
prevSelectListId: 'default',
isSaveScrollLocation: true,
},
download: {
enable: false,
savePath: path.join(os.homedir(), 'Desktop'),
fileName: '歌名 - 歌手',
maxDownloadNum: 3,
isDownloadLrc: false,
isEmbedPic: true,
isEmbedLyric: false,
},
leaderboard: {
source: 'kw',
tabId: 'kw__16',
},
songList: {
source: 'kg',
sortId: '5',
tagInfo: {
name: '默认',
id: null,
},
},
odc: {
isAutoClearSearchInput: false,
isAutoClearSearchList: false,
},
search: {
searchSource: 'all',
tempSearchSource: 'kw',
isShowHotSearch: false,
isShowHistorySearch: false,
isFocusSearchBox: false,
},
network: {
proxy: {
enable: false,
host: '',
port: '',
username: '',
password: '',
},
},
tray: {
isShow: false,
isToTray: false,
themeId: 0,
},
windowSizeId: 2,
themeId: 0,
langId: null,
sourceId: 'kw',
apiSource: 'temp',
sourceNameType: 'alias',
isShowAnimation: true,
randomAnimate: true,
ignoreVersion: null,
isAgreePact: false,
controlBtnPosition: isMac ? 'left' : 'right',
}
const overwriteSetting = {
}
// 使用新年皮肤
if (new Date().getMonth() < 2) defaultSetting.themeId = 9
exports.defaultSetting = defaultSetting
exports.overwriteSetting = overwriteSetting

View File

@@ -0,0 +1,171 @@
import path from 'node:path'
import os from 'node:os'
const isMac = process.platform == 'darwin'
const isWin = process.platform == 'win32'
const defaultSetting: LX.AppSetting = {
version: '2.1.0',
'common.windowSizeId': 3,
'common.fontSize': 16,
'common.startInFullscreen': false,
'common.langId': null,
'common.apiSource': 'temp',
'common.sourceNameType': 'alias',
'common.font': '',
'common.isShowAnimation': true,
'common.randomAnimate': true,
'common.isAgreePact': false,
'common.controlBtnPosition': isMac ? 'left' : 'right',
'common.playBarProgressStyle': 'mini',
'common.transparentWindow': !isMac,
'common.tryAutoUpdate': true,
'common.showChangeLog': true,
'player.startupAutoPlay': false,
'player.togglePlayMethod': 'listLoop',
'player.playQuality': '128k',
'player.isShowTaskProgess': true,
'player.isShowStatusBarLyric': false,
'player.volume': 1,
'player.powerSaveBlocker': true,
'player.isMute': false,
'player.playbackRate': 1,
'player.preservesPitch': true,
'player.isMaxOutputChannelCount': false,
'player.mediaDeviceId': 'default',
'player.isMediaDeviceRemovedStopPlay': false,
'player.isShowLyricTranslation': false,
'player.isShowLyricRoma': false,
'player.isSwapLyricTranslationAndRoma': false,
'player.isS2t': false,
'player.isPlayLxlrc': !isMac,
'player.isSavePlayTime': false,
'player.audioVisualization': false,
'player.waitPlayEndStop': true,
'player.waitPlayEndStopTime': '',
'player.autoSkipOnError': true,
'player.isAutoCleanPlayedList': false,
'player.soundEffect.convolution.fileName': '',
'player.soundEffect.convolution.mainGain': 10,
'player.soundEffect.convolution.sendGain': 0,
'player.soundEffect.biquadFilter.hz31': 0,
'player.soundEffect.biquadFilter.hz62': 0,
'player.soundEffect.biquadFilter.hz125': 0,
'player.soundEffect.biquadFilter.hz250': 0,
'player.soundEffect.biquadFilter.hz500': 0,
'player.soundEffect.biquadFilter.hz1000': 0,
'player.soundEffect.biquadFilter.hz2000': 0,
'player.soundEffect.biquadFilter.hz4000': 0,
'player.soundEffect.biquadFilter.hz8000': 0,
'player.soundEffect.biquadFilter.hz16000': 0,
'player.soundEffect.panner.enable': false,
'player.soundEffect.panner.soundR': 5,
'player.soundEffect.panner.speed': 25,
'player.soundEffect.pitchShifter.playbackRate': 1,
'playDetail.isZoomActiveLrc': false,
'playDetail.isShowLyricProgressSetting': false,
'playDetail.style.fontSize': 140,
'playDetail.style.align': 'center',
'playDetail.isDelayScroll': true,
'desktopLyric.enable': false,
'desktopLyric.isLock': false,
'desktopLyric.isAlwaysOnTop': false,
'desktopLyric.isAlwaysOnTopLoop': false,
'desktopLyric.isShowTaskbar': false,
'desktopLyric.audioVisualization': false,
'desktopLyric.fullscreenHide': true,
'desktopLyric.pauseHide': true,
'desktopLyric.width': 450,
'desktopLyric.height': 300,
'desktopLyric.x': null,
'desktopLyric.y': null,
'desktopLyric.isLockScreen': isWin,
'desktopLyric.isDelayScroll': true,
'desktopLyric.scrollAlign': 'center',
'desktopLyric.isHoverHide': false,
'desktopLyric.direction': 'horizontal',
'desktopLyric.style.align': 'center',
'desktopLyric.style.font': '',
'desktopLyric.style.fontSize': 20,
'desktopLyric.style.lineGap': 15,
'desktopLyric.style.lyricUnplayColor': 'rgba(255, 255, 255, 1)',
'desktopLyric.style.lyricPlayedColor': 'rgba(7, 197, 86, 1)',
'desktopLyric.style.lyricShadowColor': 'rgba(0, 0, 0, 0.18)',
// 'desktopLyric.style.fontWeight': false,
'desktopLyric.style.opacity': 95,
'desktopLyric.style.ellipsis': false,
'desktopLyric.style.isZoomActiveLrc': false,
'desktopLyric.style.isFontWeightFont': true,
'desktopLyric.style.isFontWeightLine': true,
'desktopLyric.style.isFontWeightExtended': true,
'list.isClickPlayList': false,
'list.isShowSource': true,
'list.isSaveScrollLocation': true,
'list.addMusicLocationType': 'top',
'list.actionButtonsVisible': false,
'download.enable': false,
'download.isSavePathGroupByListName': false,
'download.savePath': path.join(os.homedir(), 'Desktop'),
'download.fileName': '歌名 - 歌手',
'download.maxDownloadNum': 3,
'download.skipExistFile': true,
'download.isDownloadLrc': false,
'download.isDownloadLxLrc': true,
'download.isDownloadTLrc': false,
'download.isDownloadRLrc': false,
'download.lrcFormat': 'utf8',
'download.isEmbedPic': true,
'download.isEmbedLyric': false,
'download.isEmbedLyricLx': true,
'download.isEmbedLyricT': false,
'download.isEmbedLyricR': false,
'download.isUseOtherSource': false,
'search.isShowHotSearch': false,
'search.isShowHistorySearch': false,
'search.isFocusSearchBox': false,
'network.proxy.enable': false,
'network.proxy.host': '',
'network.proxy.port': '',
'tray.enable': false,
// 'tray.isToTray': false,
'tray.themeId': 0,
'sync.mode': 'server',
'sync.enable': false,
'sync.server.port': '23332',
'sync.server.maxSsnapshotNum': 5,
'sync.client.host': '',
'openAPI.enable': false,
'openAPI.port': '23330',
'openAPI.bindLan': false,
// 'theme.id': 'blue_plus',
'theme.id': 'green',
'theme.lightId': 'green',
'theme.darkId': 'black',
'odc.isAutoClearSearchInput': false,
'odc.isAutoClearSearchList': false,
}
// 使用新年皮肤
if (new Date().getMonth() < 2) {
defaultSetting['theme.id'] = 'happy_new_year'
defaultSetting['desktopLyric.style.lyricPlayedColor'] = 'rgba(255, 57, 71, 1)'
}
export default defaultSetting

View File

@@ -1,6 +1,12 @@
const { log } = require('./utils')
import { log } from './utils'
process.on('uncaughtException', function(err) {
const ignoreErrorMessage = [
'Possible side-effect in debug-evaluate',
'Unexpected end of input',
]
process.on('uncaughtException', err => {
if (ignoreErrorMessage.includes(err?.message)) return
console.error('An uncaught error occurred!')
console.error(err)
log.error(err)

View File

@@ -1,83 +0,0 @@
const names = require('../main/events/_name')
const hotKey = {
common: {
min: {
name: 'min',
action: 'min',
},
min_toggle: {
name: 'toggle_min',
action: 'toggle_min',
},
hide_toggle: {
name: 'toggle_hide',
action: 'toggle_hide',
},
close: {
name: 'toggle_close',
action: 'toggle_close',
},
focusSearchInput: {
name: 'focus_search_input',
action: 'focus_search_input',
},
},
player: {
toggle_play: {
name: 'toggle_play',
action: 'toggle_play',
},
next: {
name: 'next',
action: 'next',
},
prev: {
name: 'prev',
action: 'prev',
},
volume_up: {
name: 'volume_up',
action: 'volume_up',
},
volume_down: {
name: 'volume_down',
action: 'volume_down',
},
volume_mute: {
name: 'volume_mute',
action: 'volume_mute',
},
},
desktop_lyric: {
toggle_visible: {
name: 'toggle_visible',
action: 'toggle_visible',
},
toggle_lock: {
name: 'toggle_lock',
action: 'toggle_lock',
},
toggle_always_top: {
name: 'toggle_always_top',
action: 'toggle_always_top',
},
},
}
const keyName = {
player: names.mainWindow.name,
desktop_lyric: names.winLyric.name,
}
for (const type of Object.keys(hotKey)) {
let item = hotKey[type]
for (const key of Object.keys(item)) {
item[key].action = `${type}_${item[key].action}`
item[key].name = `${type}_${item[key].name}`
item[key].type = keyName[type]
}
}
exports.common = hotKey.common
exports.player = hotKey.player
exports.desktop_lyric = hotKey.desktop_lyric

126
src/common/hotKey.ts Normal file
View File

@@ -0,0 +1,126 @@
import { APP_EVENT_NAMES } from './constants'
const keyName = {
common: APP_EVENT_NAMES.winMainName,
player: APP_EVENT_NAMES.winMainName,
desktop_lyric: APP_EVENT_NAMES.winLyricName,
}
const hotKey = {
common: {
min: {
name: 'min',
action: 'min',
type: '',
},
min_toggle: {
name: 'toggle_min',
action: 'toggle_min',
type: '',
},
hide_toggle: {
name: 'toggle_hide',
action: 'toggle_hide',
type: '',
},
close: {
name: 'toggle_close',
action: 'toggle_close',
type: '',
},
focusSearchInput: {
name: 'focus_search_input',
action: 'focus_search_input',
type: '',
},
},
player: {
toggle_play: {
name: 'toggle_play',
action: 'toggle_play',
type: '',
},
next: {
name: 'next',
action: 'next',
type: '',
},
prev: {
name: 'prev',
action: 'prev',
type: '',
},
seekbackward: {
name: 'seekbackward',
action: 'seekbackward',
type: '',
},
seekforward: {
name: 'seekforward',
action: 'seekforward',
type: '',
},
volume_up: {
name: 'volume_up',
action: 'volume_up',
type: '',
},
volume_down: {
name: 'volume_down',
action: 'volume_down',
type: '',
},
volume_mute: {
name: 'volume_mute',
action: 'volume_mute',
type: '',
},
music_love: {
name: 'music_love',
action: 'music_love',
type: '',
},
music_unlove: {
name: 'music_unlove',
action: 'music_unlove',
type: '',
},
music_dislike: {
name: 'music_dislike',
action: 'music_dislike',
type: '',
},
},
desktop_lyric: {
toggle_visible: {
name: 'toggle_visible',
action: 'toggle_visible',
type: '',
},
toggle_lock: {
name: 'toggle_lock',
action: 'toggle_lock',
type: '',
},
toggle_always_top: {
name: 'toggle_always_top',
action: 'toggle_always_top',
type: '',
},
},
}
for (const type of Object.keys(hotKey) as Array<keyof typeof hotKey>) {
let keys = hotKey[type]
for (const key of Object.keys(keys) as Array<keyof typeof keys>) {
const keyInfo: LX.HotKey = keys[key]
keyInfo.action = `${type}_${keyInfo.action}`
keyInfo.name = `${type}_${keyInfo.name}`
keyInfo.type = keyName[type] as keyof typeof hotKey
}
}
export const HOTKEY_COMMON = hotKey.common
export const HOTKEY_PLAYER = hotKey.player
export const HOTKEY_DESKTOP_LYRIC = hotKey.desktop_lyric

View File

@@ -1,37 +0,0 @@
const { ipcMain, ipcRenderer } = require('electron')
const names = require('./ipcNames')
exports.mainOn = (event, callback) => {
ipcMain.on(event, callback)
}
exports.mainOnce = (event, callback) => {
ipcMain.once(event, callback)
}
exports.mainHandle = (name, callback) => {
ipcMain.handle(name, callback)
}
exports.mainHandleOnce = (name, callback) => {
ipcMain.handleOnce(name, callback)
}
exports.mainSend = (window, name, params) => {
window.webContents.send(name, params)
}
exports.rendererSend = (name, params) => {
ipcRenderer.send(name, params)
}
exports.rendererSendSync = (name, params) => ipcRenderer.sendSync(name, params)
exports.rendererInvoke = (name, params) => ipcRenderer.invoke(name, params)
exports.rendererOn = (name, callback) => {
ipcRenderer.on(name, callback)
}
exports.rendererOnce = (name, callback) => {
ipcRenderer.once(name, callback)
}
exports.NAMES = names

View File

@@ -1,79 +0,0 @@
const names = {
mainWindow: {
focus: 'focus',
close: 'close',
min: 'min',
max: 'max',
set_app_name: 'set_app_name',
clear_cache: 'clear_cache',
get_cache_size: 'get_cache_size',
get_env_params: 'get_env_params',
set_music_meta: 'set_music_meta',
progress: 'progress',
change_tray: 'change_tray',
quit_update: 'quit_update',
update_available: 'update_available',
update_error: 'update_error',
update_progress: 'update_progress',
update_downloaded: 'update_downloaded',
update_not_available: 'update_not_available',
set_ignore_mouse_events: 'set_ignore_mouse_events',
set_app_setting: 'set_app_setting',
set_window_size: 'set_window_size',
show_save_dialog: 'show_save_dialog',
handle_request: 'handle_request',
cancel_request: 'cancel_request',
handle_xm_verify_open: 'handle_xm_verify_open',
handle_xm_verify_close: 'handle_xm_verify_close',
select_dir: 'select_dir',
restart_window: 'restart_window',
handle_kw_decode_lyric: 'handle_kw_decode_lyric',
get_lyric_info: 'get_lyric_info',
set_lyric_info: 'set_lyric_info',
set_config: 'set_config',
set_hot_key_config: 'set_hot_key_config',
key_down: 'key_down',
quit: 'quit',
min_toggle: 'min_toggle',
hide_toggle: 'hide_toggle',
get_data_path: 'get_data_path',
show_dialog: 'show_dialog',
get_setting: 'get_setting',
get_playlist: 'get_playlist',
save_playlist: 'save_playlist',
get_data: 'get_data',
save_data: 'save_data',
get_hot_key: 'get_hot_key',
},
winLyric: {
close: 'close',
set_lyric_info: 'set_lyric_info',
get_lyric_info: 'get_lyric_info',
set_lyric_config: 'set_lyric_config',
get_lyric_config: 'get_lyric_config',
set_win_bounds: 'set_win_bounds',
key_down: 'key_down',
},
hotKey: {
enable: 'enable',
status: 'status',
set_config: 'set_config',
},
}
for (const item of Object.keys(names)) {
let name = names[item]
for (const key of Object.keys(name)) {
name[key] = `${item}_${name[key]}`
}
}
exports.mainWindow = names.mainWindow
exports.winLyric = names.winLyric
exports.hotKey = names.hotKey

195
src/common/ipcNames.ts Normal file
View File

@@ -0,0 +1,195 @@
const modules = {
common: {
get_env_params: 'get_env_params',
deeplink: 'deeplink',
clear_env_params_deeplink: 'clear_env_params_deeplink',
system_theme_change: 'system_theme_change',
theme_change: 'theme_change',
get_system_fonts: 'get_system_fonts',
get_app_setting: 'get_app_setting',
set_app_setting: 'set_app_setting',
},
player: {
invoke_play_music: 'play_music',
invoke_play_next: 'play_next',
invoke_play_prev: 'play_prev',
invoke_toggle_play: 'toggle_play',
player_play: 'player_play',
player_pause: 'player_pause',
player_stop: 'player_stop',
player_error: 'player_error',
list_data_overwire: 'list_data_overwire',
list_get: 'list_get',
list_add: 'list_add',
list_remove: 'list_remove',
list_update: 'list_update',
list_update_position: 'list_update_position',
list_music_get: 'list_music_get',
list_music_add: 'list_music_add',
list_music_move: 'list_music_move',
list_music_remove: 'list_music_remove',
list_music_update: 'list_music_update',
list_music_update_position: 'list_music_update_position',
list_music_overwrite: 'list_music_overwrite',
list_music_clear: 'list_music_clear',
list_music_check_exist: 'list_music_check_exist',
list_music_get_list_ids: 'list_music_get_list_ids',
},
dislike: {
get_dislike_music_infos: 'get_dislike_music_infos',
add_dislike_music_infos: 'add_dislike_music_infos',
overwrite_dislike_music_infos: 'overwrite_dislike_music_infos',
clear_dislike_music_infos: 'clear_dislike_music_infos',
},
winMain: {
focus: 'focus',
close: 'close',
min: 'min',
max: 'max',
fullscreen: 'fullscreen',
set_app_name: 'set_app_name',
clear_cache: 'clear_cache',
get_cache_size: 'get_cache_size',
inited: 'inited',
show_save_dialog: 'show_save_dialog',
show_select_dialog: 'show_select_dialog',
show_dialog: 'show_dialog',
open_dir_in_explorer: 'open_dir_in_explorer',
open_dev_tools: 'open_dev_tools',
set_power_save_blocker: 'set_power_save_blocker',
player_status: 'player_status',
change_tray: 'change_tray',
quit_update: 'quit_update',
update_check: 'update_check',
update_download_update: 'update_download_update',
update_available: 'update_available',
update_error: 'update_error',
update_progress: 'update_progress',
update_downloaded: 'update_downloaded',
update_not_available: 'update_not_available',
set_ignore_mouse_events: 'set_ignore_mouse_events',
set_window_size: 'set_window_size',
handle_request: 'handle_request',
cancel_request: 'cancel_request',
restart_window: 'restart_window',
get_lyric_info: 'get_lyric_info',
set_lyric_info: 'set_lyric_info',
set_config: 'set_config',
set_hot_key_config: 'set_hot_key_config',
on_config_change: 'on_config_change',
key_down: 'key_down',
quit: 'quit',
min_toggle: 'min_toggle',
hide_toggle: 'hide_toggle',
get_other_source: 'get_other_source',
save_other_source: 'save_other_source',
clear_other_source: 'clear_other_source',
get_other_source_count: 'get_other_source_count',
get_data: 'get_data',
save_data: 'save_data',
get_sound_effect_eq_preset: 'get_sound_effect_eq_preset',
save_sound_effect_eq_preset: 'save_sound_effect_eq_preset',
get_sound_effect_convolution_preset: 'get_sound_effect_convolution_preset',
save_sound_effect_convolution_preset: 'save_sound_effect_convolution_preset',
// get_sound_effect_pitch_shifter_preset: 'get_sound_effect_pitch_shifter_preset',
// save_sound_effect_pitch_shifter_preset: 'save_sound_effect_pitch_shifter_preset',
get_hot_key: 'get_hot_key',
import_user_api: 'import_user_api',
remove_user_api: 'remove_user_api',
set_user_api: 'set_user_api',
get_user_api_list: 'get_user_api_list',
request_user_api: 'request_user_api',
request_user_api_cancel: 'request_user_api_cancel',
get_user_api_status: 'get_user_api_status',
user_api_status: 'user_api_status',
user_api_show_update_alert: 'user_api_show_update_alert',
user_api_set_allow_update_alert: 'user_api_set_allow_update_alert',
get_palyer_lyric: 'get_lyric',
// save_lyric: 'save_lyric',
// clear_lyric: 'clear_lyric',
get_lyric_raw: 'get_lyric_raw',
save_lyric_raw: 'save_lyric_raw',
clear_lyric_raw: 'clear_lyric_raw',
get_lyric_raw_count: 'get_lyric_raw_count',
get_lyric_edited: 'get_lyric_edited',
save_lyric_edited: 'save_lyric_edited',
remove_lyric_edited: 'remove_lyric_edited',
clear_lyric_edited: 'clear_lyric_edited',
get_lyric_edited_count: 'get_lyric_edited_count',
get_music_url: 'get_music_url',
save_music_url: 'save_music_url',
clear_music_url: 'clear_music_url',
get_music_url_count: 'get_music_url_count',
open_api_action: 'open_api_action',
sync_action: 'sync_action',
sync_get_server_devices: 'sync_get_server_devices',
sync_remove_server_device: 'sync_remove_server_device',
process_new_desktop_lyric_client: 'process_new_desktop_lyric_client',
player_action_set_buttons: 'player_action_set_buttons',
// player_action_set_thumbnail_clip: 'player_action_set_thumbnail_clip',
player_action_on_button_click: 'player_action_on_button_click',
get_themes: 'get_themes',
save_theme: 'save_theme',
remove_theme: 'remove_theme',
download_list_get: 'download_list_get',
download_list_add: 'download_list_add',
download_list_update: 'download_list_update',
download_list_remove: 'download_list_remove',
download_list_clear: 'download_list_clear',
},
winLyric: {
close: 'close',
set_config: 'set_config',
get_config: 'get_config',
on_config_change: 'on_config_change',
main_window_inited: 'main_window_inited',
set_win_bounds: 'set_win_bounds',
set_win_resizeable: 'set_win_resizeable',
key_down: 'key_down',
request_main_window_channel: 'request_main_window_channel',
provide_main_window_channel: 'provide_main_window_channel',
mouse_enter_leave: 'mouse_enter_leave',
},
hotKey: {
enable: 'enable',
status: 'status',
set_config: 'set_config',
},
}
for (const moduleName of Object.keys(modules) as Array<keyof typeof modules>) {
let eventNames = modules[moduleName]
for (const eventName of Object.keys(eventNames) as Array<keyof typeof eventNames>) {
eventNames[eventName] = `${moduleName}_${eventName as string}` as never
}
}
// for (const moduleName of Object.keys(modules) as Array<keyof typeof modules>) {
// let eventNames = modules[moduleName]
// for (const eventName of Object.keys(eventNames)) {
// eventNames[eventName] = `${moduleName}_${eventName}`
// }
// }
export const CMMON_EVENT_NAME = modules.common
export const PLAYER_EVENT_NAME = modules.player
export const DISLIKE_EVENT_NAME = modules.dislike
export const WIN_MAIN_RENDERER_EVENT_NAME = modules.winMain
export const WIN_LYRIC_RENDERER_EVENT_NAME = modules.winLyric
export const HOTKEY_RENDERER_EVENT_NAME = modules.hotKey

54
src/common/mainIpc.ts Normal file
View File

@@ -0,0 +1,54 @@
import { ipcMain } from 'electron'
export function mainOn(name: string, listener: LX.IpcMainEventListener): void
export function mainOn<T>(name: string, listener: LX.IpcMainEventListenerParams<T>): void
export function mainOn<T>(name: string, listener: LX.IpcMainEventListenerParams<T>): void {
ipcMain.on(name, (event, params) => {
listener({ event, params })
})
}
export function mainOnce(name: string, listener: LX.IpcMainEventListener): void
export function mainOnce<T>(name: string, listener: LX.IpcMainEventListenerParams<T>): void
export function mainOnce<T>(name: string, listener: LX.IpcMainEventListenerParams<T>): void {
ipcMain.once(name, (event, params) => {
listener({ event, params })
})
}
export const mainOff = (name: string, listener: (...args: any[]) => void) => {
ipcMain.removeListener(name, listener)
}
export const mainOffAll = (name: string) => {
ipcMain.removeAllListeners(name)
}
export function mainHandle(name: string, listener: LX.IpcMainInvokeEventListener): void
export function mainHandle<T>(name: string, listener: LX.IpcMainInvokeEventListenerParams<T>): void
export function mainHandle<V>(name: string, listener: LX.IpcMainInvokeEventListenerValue<V>): void
export function mainHandle<T, V>(name: string, listener: LX.IpcMainInvokeEventListenerParamsValue<T, V>): void
export function mainHandle<T, V>(name: string, listener: LX.IpcMainInvokeEventListenerParamsValue<T, V>): void {
ipcMain.handle(name, async(event, params) => {
return listener({ event, params })
})
}
export function mainHandleOnce(name: string, listener: LX.IpcMainInvokeEventListener): void
export function mainHandleOnce<T>(name: string, listener: LX.IpcMainInvokeEventListenerParams<T>): void
export function mainHandleOnce<V>(name: string, listener: LX.IpcMainInvokeEventListenerValue<V>): void
export function mainHandleOnce<T, V>(name: string, listener: LX.IpcMainInvokeEventListenerParamsValue<T, V>): void
export function mainHandleOnce<T, V>(name: string, listener: LX.IpcMainInvokeEventListenerParamsValue<T, V>): void {
ipcMain.handleOnce(name, async(event, params) => {
return listener({ event, params })
})
}
export const mainHandleRemove = (name: string) => {
ipcMain.removeHandler(name)
}
export function mainSend(window: Electron.BrowserWindow, name: string): void
export function mainSend<T>(window: Electron.BrowserWindow, name: string, params: T): void
export function mainSend<T>(window: Electron.BrowserWindow, name: string, params?: T): void {
window.webContents.send(name, params)
}

45
src/common/rendererIpc.ts Normal file
View File

@@ -0,0 +1,45 @@
import { ipcRenderer } from 'electron'
export function rendererSend(name: string): void
export function rendererSend<T>(name: string, params: T): void
export function rendererSend<T>(name: string, params?: T): void {
ipcRenderer.send(name, params)
}
export function rendererSendSync(name: string): void
export function rendererSendSync<T>(name: string, params: T): void
export function rendererSendSync<T>(name: string, params?: T): void {
ipcRenderer.sendSync(name, params)
}
export async function rendererInvoke(name: string): Promise<void>
export async function rendererInvoke<V>(name: string): Promise<V>
export async function rendererInvoke<T>(name: string, params: T): Promise<void>
export async function rendererInvoke<T, V>(name: string, params: T): Promise<V>
export async function rendererInvoke <T, V>(name: string, params?: T): Promise<V> {
return ipcRenderer.invoke(name, params)
}
export function rendererOn(name: string, listener: LX.IpcRendererEventListener): void
export function rendererOn<T>(name: string, listener: LX.IpcRendererEventListenerParams<T>): void
export function rendererOn<T>(name: string, listener: LX.IpcRendererEventListenerParams<T>): void {
ipcRenderer.on(name, (event, params) => {
listener({ event, params })
})
}
export function rendererOnce(name: string, listener: LX.IpcRendererEventListener): void
export function rendererOnce<T>(name: string, listener: LX.IpcRendererEventListenerParams<T>): void
export function rendererOnce<T>(name: string, listener: LX.IpcRendererEventListenerParams<T>): void {
ipcRenderer.once(name, (event, params) => {
listener({ event, params })
})
}
export const rendererOff = (name: string, listener: (...args: any[]) => any) => {
ipcRenderer.removeListener(name, listener)
}
export const rendererOffAll = (name: string) => {
ipcRenderer.removeAllListeners(name)
}

View File

@@ -0,0 +1,73 @@
/* eslint-disable */
// https://github.com/PimpTrizkit/PJs/wiki/12.-Shade,-Blend-and-Convert-a-Web-Color-(pSBC.js)#micro-functions-version-4
/**
* Blend color (Lighten or Darken)
* @param {number} p 混合百分比 范围 0.0 - 1.0
* @param {string} c0 rgb(a) color1
* @param {string} c1 rgb(a) color2
* @returns color
*/
exports.RGB_Linear_Blend=(p,c0,c1)=>{
var i=parseInt,r=Math.round,P=1-p,[a,b,c,d]=c0.split(","),[e,f,g,h]=c1.split(","),x=d||h,j=x?","+(!d?h:!h?d:r((parseFloat(d)*P+parseFloat(h)*p)*1000)/1000+")"):")";
return"rgb"+(x?"a(":"(")+r(i(a[3]=="a"?a.slice(5):a.slice(4))*P+i(e[3]=="a"?e.slice(5):e.slice(4))*p)+","+r(i(b)*P+i(f)*p)+","+r(i(c)*P+i(g)*p)+j;
}
/**
* Blend color (Lighten or Darken)
* @param {number} p 混合百分比 范围 0.0 - 1.0
* @param {string} c0 rgb(a) color1
* @param {string} c1 rgb(a) color2
* @returns color
*/
exports.RGB_Log_Blend=(p,c0,c1)=>{
var i=parseInt,r=Math.round,P=1-p,[a,b,c,d]=c0.split(","),[e,f,g,h]=c1.split(","),x=d||h,j=x?","+(!d?h:!h?d:r((parseFloat(d)*P+parseFloat(h)*p)*1000)/1000+")"):")";
return"rgb"+(x?"a(":"(")+r((P*i(a[3]=="a"?a.slice(5):a.slice(4))**2+p*i(e[3]=="a"?e.slice(5):e.slice(4))**2)**0.5)+","+r((P*i(b)**2+p*i(f)**2)**0.5)+","+r((P*i(c)**2+p*i(g)**2)**0.5)+j;
}
/**
* Shade color (Lighten or Darken)
* @param {number} p Shade 百分比范围为 -1.0 - 1.0 负为黑色,正为白色
* @param {string} c0 rgb(a) color
* @returns color
*/
exports.RGB_Linear_Shade=(p,c0)=>{
var i=parseInt,r=Math.round,[a,b,c,d]=c0.split(","),n=p<0,t=n?0:255*p,P=n?1+p:1-p;
return"rgb"+(d?"a(":"(")+r(i(a[3]=="a"?a.slice(5):a.slice(4))*P+t)+","+r(i(b)*P+t)+","+r(i(c)*P+t)+(d?","+d:")");
}
/**
* Shade color (Lighten or Darken)
* @param {number} p Shade 百分比范围为 -1.0 - 1.0 负为黑色,正为白色
* @param {string} c0 rgb(a) color
* @returns color
*/
exports.RGB_Log_Shade=(p,c0)=>{
var i=parseInt,r=Math.round,[a,b,c,d]=c0.split(","),n=p<0,t=n?0:p*255**2,P=n?1+p:1-p;
return"rgb"+(d?"a(":"(")+r((P*i(a[3]=="a"?a.slice(5):a.slice(4))**2+t)**0.5)+","+r((P*i(b)**2+t)**0.5)+","+r((P*i(c)**2+t)**0.5)+(d?","+d:")");
}
/**
* 修改透明度
* @param {number} p 透明度 -1.0 - 1.0
* @param {string} color
* @returns color
*/
exports.RGB_Alpha_Shade = (p, color) => {
var i = parseInt
var n = p < 0
var [r, g, b, a] = color.split(",")
r = r[3] == 'a' ? r.slice(5) : r.slice(4)
if (a) {
a = parseFloat(a)
a = a - (n ? (1 - a) * p : a * p)
a = n ? Math.max(0, a) : Math.min(1, a)
} else {
a = 1 - p
a = Math.min(1, a)
}
return `rgba(${i(r)}, ${i(g)}, ${i(b)}, ${a.toFixed(2)})`
}

View File

@@ -0,0 +1,384 @@
//! 更新默认主题配置后,需要执行 npm run build:theme 重新构建index.json
const fs = require('fs')
const path = require('path')
const { createThemeColors } = require('./utils')
const defaultThemes = [
{
id: 'green',
name: '绿意盎然',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(77, 175, 124)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'var(--color-primary-light-600-alpha-700)',
'--color-main-background': 'rgba(255, 255, 255, 1)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'none',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': '#4baed5',
'--color-badge-tertiary': '#e7aa36',
},
},
{
id: 'blue',
name: '蓝田生玉',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(52, 152, 219)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'var(--color-primary-light-600-alpha-700)',
'--color-main-background': 'rgba(255, 255, 255, 1)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'none',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': '#5cbf9b',
'--color-badge-tertiary': '#5cbf9b',
},
},
{
id: 'blue_plus',
name: '蛋雅深蓝',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(77, 131, 175)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'var(--color-primary-light-600-alpha-600)',
'--color-main-background': 'rgba(255, 255, 255, 1)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'none',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': 'rgba(66.6, 150.7, 171, 1)',
'--color-badge-tertiary': 'rgba(54, 196, 231, 1)',
},
},
{
id: 'orange',
name: '橙黄橘绿',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(245, 171, 53)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'var(--color-primary-light-600-alpha-700)',
'--color-main-background': 'rgba(255, 255, 255, 1)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'none',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': '#9ed458',
'--color-badge-tertiary': '#9ed458',
},
},
{
id: 'red',
name: '热情似火',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(214, 69, 65)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'var(--color-primary-light-600-alpha-700)',
'--color-main-background': 'rgba(255, 255, 255, 1)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'none',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': '#dfbb6b',
'--color-badge-tertiary': '#dfbb6b',
},
},
{
id: 'pink',
name: '粉装玉琢',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(241, 130, 141)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'var(--color-primary-light-600-alpha-700)',
'--color-main-background': 'rgba(255, 255, 255, 1)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'none',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': '#f5b684',
'--color-badge-tertiary': '#f5b684',
},
},
{
id: 'purple',
name: '重斤球紫',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(155, 89, 182)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'var(--color-primary-light-600-alpha-700)',
'--color-main-background': 'rgba(255, 255, 255, 1)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'none',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': '#e5a39f',
'--color-badge-tertiary': '#e5a39f',
},
},
{
id: 'grey',
name: '灰常美丽',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(108, 122, 137)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'var(--color-primary-light-600-alpha-700)',
'--color-main-background': 'rgba(255, 255, 255, 1)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'none',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': '#b19b9f',
'--color-badge-tertiary': '#b19b9f',
},
},
{
id: 'ming',
name: '青出于黑',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(51, 110, 123)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'var(--color-primary-light-600-alpha-700)',
'--color-main-background': 'rgba(255, 255, 255, 1)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'none',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': '#6376a2',
'--color-badge-tertiary': '#6376a2',
},
},
{
id: 'blue2',
name: '清热板蓝',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(79, 98, 208)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'var(--color-primary-light-600-alpha-700)',
'--color-main-background': 'rgba(255, 255, 255, 1)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'none',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': '#b080db',
'--color-badge-tertiary': '#b080db',
},
},
{
id: 'black',
name: '黑灯瞎火',
isDark: true,
isDarkFont: false,
config: {
primary: 'rgb(150, 150, 150)',
font: 'rgb(229, 229, 229)',
'--color-app-background': 'rgba(0, 0, 0, 0)',
'--color-main-background': 'rgba(19, 19, 19, 0.9)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'url(./theme_images/landingMoon.png)',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary-dark-200)',
'--color-badge-secondary': 'var(--color-primary)',
'--color-badge-tertiary': 'var(--color-primary-dark-300)',
},
},
{
id: 'mid_autumn',
name: '月里嫦娥',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(74, 55, 82)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'rgba(255, 255, 255, 0)',
'--color-main-background': 'rgba(255, 255, 255, 0.9)',
'--color-nav-font': 'var(--color-primary-light-600)',
'--background-image': 'url(./theme_images/jqbg.jpg)',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': '#af9479',
'--color-badge-tertiary': '#af9479',
},
},
{
id: 'naruto',
name: '木叶之村',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(87, 144, 167)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'rgba(255, 255, 255, 0.15)',
'--color-main-background': 'rgba(255, 255, 255, 0.8)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'url(./theme_images/myzcbg.jpg)',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': 'var(--color-primary)',
'--color-badge-secondary': 'var(--color-primary-light-100)',
'--color-badge-tertiary': 'var(--color-primary-light-100)',
},
},
{
id: 'china_ink',
name: '近墨者黑',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgba(47, 47, 47, 1)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'rgba(255, 255, 255, 0)',
'--color-main-background': 'rgba(255, 255, 255, 0.8)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'url(./theme_images/china_ink.jpg)',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': 'rgba(183, 212, 208, 1)',
'--color-btn-min': 'rgba(200, 214, 183, 1)',
'--color-btn-close': 'rgba(218, 195, 188, 1)',
'--color-badge-primary': 'rgba(137, 70, 70, 1)',
'--color-badge-secondary': 'rgba(67, 139, 65, 1)',
'--color-badge-tertiary': 'rgba(132, 135, 65, 1)',
},
},
{
id: 'happy_new_year',
name: '新年快乐',
isDark: false,
isDarkFont: false,
config: {
primary: 'rgb(192, 57, 43)',
font: 'rgb(33, 33, 33)',
'--color-app-background': 'rgba(255, 255, 255, 0.15)',
'--color-main-background': 'rgba(255, 255, 255, 0.8)',
'--color-nav-font': 'var(--color-primary)',
'--background-image': 'url(./theme_images/xnkl.png)',
'--background-image-position': 'center',
'--background-image-size': 'cover',
'--color-btn-hide': '#3bc2b2',
'--color-btn-min': '#85c43b',
'--color-btn-close': '#fab4a0',
'--color-badge-primary': '#7fb575',
'--color-badge-secondary': '#dfbb6b',
'--color-badge-tertiary': 'var(--color-primary-light-100)',
},
},
]
const themes = defaultThemes.map(({ config: { primary, font, ...extInfo }, ...themeInfo }) => {
return {
...themeInfo,
isCustom: false,
config: {
themeColors: createThemeColors(primary, font, themeInfo.isDark),
extInfo,
},
}
})
fs.writeFileSync(path.join(__dirname, 'index.json'), JSON.stringify(themes, null, 2))

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

Before

Width:  |  Height:  |  Size: 353 KiB

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Some files were not shown because too many files have changed in this diff Show More