Compare commits
125 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f56f5e240 | ||
|
|
7af7779e5c | ||
|
|
669a348218 | ||
|
|
f02264c80c | ||
|
|
d0d5f918bd | ||
|
|
761d265d18 | ||
|
|
204df64535 | ||
|
|
cc814eddbd | ||
|
|
51df14a9e9 | ||
|
|
2473b36928 | ||
|
|
dbba7a3d26 | ||
|
|
a817865bd8 | ||
|
|
c4a4d26bd8 | ||
|
|
dfa36d872e | ||
|
|
995859e661 | ||
|
|
34fb0f7c2f | ||
|
|
191ba1e199 | ||
|
|
324e81c0dc | ||
|
|
7ec269e0cb | ||
|
|
6f10aae535 | ||
|
|
0c54a852ba | ||
|
|
bc53203bfa | ||
|
|
c149e5c904 | ||
|
|
d983abd3d5 | ||
|
|
f48369e1a2 | ||
|
|
2af9a4ea9f | ||
|
|
87f69fc782 | ||
|
|
59d3b0c65c | ||
|
|
e861ea8f78 | ||
|
|
6692751c62 | ||
|
|
65e876a2e9 | ||
|
|
496c88a629 | ||
|
|
2086bd1663 | ||
|
|
d6f8d0e63c | ||
|
|
cc4dd8284f | ||
|
|
6f688cbbb3 | ||
|
|
e0a1e0af39 | ||
|
|
c1d3a61f9f | ||
|
|
d6d806c96e | ||
|
|
089406464b | ||
|
|
c28d5d6ad0 | ||
|
|
471147ac82 | ||
|
|
7558a67df3 | ||
|
|
4a3f0ee124 | ||
|
|
5fe6d93d5e | ||
|
|
30fd2ebb9f | ||
|
|
0f78f117d0 | ||
|
|
c79b6951d6 | ||
|
|
5118874712 | ||
|
|
7e5baba969 | ||
|
|
a7af89e35d | ||
|
|
d511efdfce | ||
|
|
9b6050be7a | ||
|
|
57736e60f3 | ||
|
|
6165a2619e | ||
|
|
c933b6e0b4 | ||
|
|
e0e01cbdca | ||
|
|
9b34ecbed9 | ||
|
|
1dda213013 | ||
|
|
94c2dc740f | ||
|
|
61f062455e | ||
|
|
79827f14f7 | ||
|
|
394bdd573c | ||
|
|
d03d62c8d4 | ||
|
|
be0b0b0390 | ||
|
|
c1d2f3dc8d | ||
|
|
e590c33c66 | ||
|
|
604ac7b553 | ||
|
|
18e233ae10 | ||
|
|
61699c4853 | ||
|
|
6e69920a5d | ||
|
|
a767b008a0 | ||
|
|
41b104e96d | ||
|
|
8562b7c954 | ||
|
|
b61e88b7d9 | ||
|
|
cc1dbcaf3f | ||
|
|
941af10830 | ||
|
|
576f9697d4 | ||
|
|
53d9197196 | ||
|
|
7a349272b2 | ||
|
|
29dfa45791 | ||
|
|
c2fcb25686 | ||
|
|
3bb23e4765 | ||
|
|
5af7df60e4 | ||
|
|
4280cab090 | ||
|
|
7e1111cd33 | ||
|
|
194b88519f | ||
|
|
7d20b23fb0 | ||
|
|
909547ad2e | ||
|
|
9779e38140 | ||
|
|
0021f32a19 | ||
|
|
4784f63ca0 | ||
|
|
fb007eaa9c | ||
|
|
790530b71f | ||
|
|
49bd1c66c0 | ||
|
|
1f6dd81e78 | ||
|
|
faaf904e9f | ||
|
|
faac6273bb | ||
|
|
07a9c515a2 | ||
|
|
179ff34063 | ||
|
|
3aff332758 | ||
|
|
d2b1d69929 | ||
|
|
67430a25a3 | ||
|
|
7f971f0256 | ||
|
|
a7d4d877a9 | ||
|
|
0c349bd4d5 | ||
|
|
a8f7c620d0 | ||
|
|
8077138609 | ||
|
|
9deb6a937b | ||
|
|
1259a6d70d | ||
|
|
14496d5d0b | ||
|
|
5f042e15eb | ||
|
|
6945c733e9 | ||
|
|
eea157b8d6 | ||
|
|
0c22eaa212 | ||
|
|
44542c4d29 | ||
|
|
2e398b7874 | ||
|
|
d0cd96e1df | ||
|
|
89b085381e | ||
|
|
9830e51fa0 | ||
|
|
400c97fc31 | ||
|
|
c168e42c8d | ||
|
|
e6ea6b11f3 | ||
|
|
046ac4edb6 | ||
|
|
6d14cda0a7 |
@@ -1,29 +0,0 @@
|
||||
{
|
||||
"title": "音频播放器控件功能完善",
|
||||
"features": [
|
||||
"播放列表管理(添加/删除/排序)",
|
||||
"音量调节控件",
|
||||
"多种播放模式(顺序/随机/单曲循环)",
|
||||
"播放列表导出/导入功能",
|
||||
"播放列表一键清空功能"
|
||||
],
|
||||
"tech": { "Web": { "arch": "vue", "component": "tdesign" } },
|
||||
"design": "现代简约风格,深色背景配合高对比度控件,主色调为TDesign主题蓝(#0052D9),包含固定底部播放控制区、垂直弹出式音量控制、图标式播放模式选择器和可拖拽排序的播放列表侧边栏。新增导出/导入功能使用TDesign对话框组件,提供文件导出/导入和内容复制/粘贴两种方式,所有导出内容进行加密处理。清空功能添加二次确认对话框防止误操作。",
|
||||
"plan": {
|
||||
"扩展Pinia状态管理,在ControlAudioStore中添加音量控制、播放模式和播放列表相关状态": "holding",
|
||||
"创建VolumeControl.vue组件,实现音量调节滑动条和静音按钮功能": "holding",
|
||||
"创建PlayModeSelector.vue组件,实现三种播放模式的切换功能": "holding",
|
||||
"创建PlaylistManager.vue组件,实现播放列表的基本显示功能": "holding",
|
||||
"在PlaylistManager组件中实现添加和删除曲目功能": "holding",
|
||||
"集成拖拽排序功能到PlaylistManager组件": "holding",
|
||||
"将新组件集成到主播放器界面,调整布局确保合理性": "holding",
|
||||
"实现播放列表与音频控制的联动,确保播放状态正确反映": "holding",
|
||||
"添加键盘快捷键支持和状态反馈机制": "holding",
|
||||
"进行组件间通信测试,确保功能协调工作": "holding",
|
||||
"创建播放列表加密/解密工具函数": "holding",
|
||||
"实现播放列表导出功能(文件导出和内容复制)": "holding",
|
||||
"实现播放列表导入功能(文件导入和内容粘贴)": "holding",
|
||||
"实现播放列表一键清空功能及二次确认机制": "holding",
|
||||
"测试导出/导入功能的加密解密正确性": "holding"
|
||||
}
|
||||
}
|
||||
10
.eslintrc.backup.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": ["@electron-toolkit/eslint-config-ts", "@electron-toolkit/eslint-config-prettier"],
|
||||
"rules": {
|
||||
"vue/require-default-prop": "off",
|
||||
"vue/multi-word-component-names": "off",
|
||||
"@typescript-eslint/explicit-function-return-type": "off",
|
||||
"@typescript-eslint/no-explicit-any": "warn",
|
||||
"no-console": "warn"
|
||||
}
|
||||
}
|
||||
158
.github/workflows/auto-sync-release.yml
vendored
Normal file
@@ -0,0 +1,158 @@
|
||||
name: Auto Sync New Release to WebDAV
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
auto-sync-to-webdav:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y curl jq
|
||||
|
||||
- name: Get release info
|
||||
id: release-info
|
||||
run: |
|
||||
echo "tag_name=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT
|
||||
echo "release_id=${{ github.event.release.id }}" >> $GITHUB_OUTPUT
|
||||
echo "release_name=${{ github.event.release.name }}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Sync new release to WebDAV
|
||||
run: |
|
||||
TAG_NAME="${{ steps.release-info.outputs.tag_name }}"
|
||||
RELEASE_ID="${{ steps.release-info.outputs.release_id }}"
|
||||
RELEASE_NAME="${{ steps.release-info.outputs.release_name }}"
|
||||
|
||||
echo "🚀 开始同步新发布的版本到 WebDAV..."
|
||||
echo "版本标签: $TAG_NAME"
|
||||
echo "版本名称: $RELEASE_NAME"
|
||||
echo "Release ID: $RELEASE_ID"
|
||||
echo "WebDAV 根路径: ${{ secrets.WEBDAV_BASE_URL }}/yd/ceru"
|
||||
|
||||
# 获取该release的所有资源文件
|
||||
assets_json=$(curl -s \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
"https://api.github.com/repos/${{ github.repository }}/releases/$RELEASE_ID/assets")
|
||||
|
||||
assets_count=$(echo "$assets_json" | jq '. | length')
|
||||
echo "找到 $assets_count 个资源文件"
|
||||
|
||||
if [ "$assets_count" -eq 0 ]; then
|
||||
echo "⚠️ 该版本没有资源文件,跳过同步"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 先创建版本目录
|
||||
dir_path="/yd/ceru/$TAG_NAME"
|
||||
dir_url="${{ secrets.WEBDAV_BASE_URL }}$dir_path"
|
||||
|
||||
echo "创建版本目录: $dir_path"
|
||||
if curl -s -f -X MKCOL \
|
||||
-u "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" \
|
||||
"$dir_url"; then
|
||||
echo "✅ 目录创建成功"
|
||||
else
|
||||
echo "ℹ️ 目录可能已存在或创建失败,继续执行"
|
||||
fi
|
||||
|
||||
# 处理每个asset
|
||||
success_count=0
|
||||
failed_count=0
|
||||
|
||||
for i in $(seq 0 $(($assets_count - 1))); do
|
||||
asset=$(echo "$assets_json" | jq -c ".[$i]")
|
||||
asset_name=$(echo "$asset" | jq -r '.name')
|
||||
asset_url=$(echo "$asset" | jq -r '.url')
|
||||
asset_size=$(echo "$asset" | jq -r '.size')
|
||||
|
||||
echo "📦 处理资源: $asset_name (大小: $asset_size bytes)"
|
||||
|
||||
# 下载资源文件
|
||||
safe_filename="./temp_${TAG_NAME}_$(date +%s)_$i"
|
||||
|
||||
if ! curl -sL -o "$safe_filename" \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/octet-stream" \
|
||||
"$asset_url"; then
|
||||
echo "❌ 下载失败: $asset_name"
|
||||
failed_count=$((failed_count + 1))
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ -f "$safe_filename" ]; then
|
||||
actual_size=$(wc -c < "$safe_filename")
|
||||
if [ "$actual_size" -ne "$asset_size" ]; then
|
||||
echo "❌ 文件大小不匹配: $asset_name (期望: $asset_size, 实际: $actual_size)"
|
||||
rm -f "$safe_filename"
|
||||
failed_count=$((failed_count + 1))
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "⬆️ 上传到 WebDAV: $asset_name"
|
||||
|
||||
# 构建远程路径
|
||||
remote_path="/yd/ceru/$TAG_NAME/$asset_name"
|
||||
full_url="${{ secrets.WEBDAV_BASE_URL }}$remote_path"
|
||||
|
||||
# 使用 WebDAV PUT 方法上传文件
|
||||
if curl -s -f -X PUT \
|
||||
-u "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" \
|
||||
-T "$safe_filename" \
|
||||
"$full_url"; then
|
||||
|
||||
echo "✅ 上传成功: $asset_name"
|
||||
success_count=$((success_count + 1))
|
||||
|
||||
# 验证文件是否存在
|
||||
sleep 1
|
||||
if curl -s -f -u "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" \
|
||||
-X PROPFIND \
|
||||
-H "Depth: 0" \
|
||||
"$full_url" > /dev/null 2>&1; then
|
||||
echo "✅ 文件验证成功: $asset_name"
|
||||
else
|
||||
echo "⚠️ 文件验证失败,但上传可能成功: $asset_name"
|
||||
fi
|
||||
|
||||
else
|
||||
echo "❌ 上传失败: $asset_name"
|
||||
failed_count=$((failed_count + 1))
|
||||
fi
|
||||
|
||||
# 清理临时文件
|
||||
rm -f "$safe_filename"
|
||||
echo "----------------------------------------"
|
||||
else
|
||||
echo "❌ 临时文件不存在: $safe_filename"
|
||||
failed_count=$((failed_count + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
echo "========================================"
|
||||
echo "🎉 同步完成!"
|
||||
echo "成功: $success_count 个文件"
|
||||
echo "失败: $failed_count 个文件"
|
||||
echo "总计: $assets_count 个文件"
|
||||
|
||||
if [ "$failed_count" -gt 0 ]; then
|
||||
echo "⚠️ 有文件同步失败,请检查日志"
|
||||
exit 1
|
||||
else
|
||||
echo "✅ 所有文件同步成功!"
|
||||
fi
|
||||
|
||||
- name: Notify completion
|
||||
if: always()
|
||||
run: |
|
||||
if [ "${{ job.status }}" == "success" ]; then
|
||||
echo "✅ 版本 ${{ steps.release-info.outputs.tag_name }} 已成功同步到 alist"
|
||||
else
|
||||
echo "❌ 版本 ${{ steps.release-info.outputs.tag_name }} 同步失败"
|
||||
fi
|
||||
66
.github/workflows/deploydocs.yml
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
# 构建 VitePress 站点并将其部署到 GitHub Pages 的示例工作流程
|
||||
#
|
||||
name: Deploy VitePress site to Pages
|
||||
|
||||
on:
|
||||
# 在针对 `main` 分支的推送上运行。如果你
|
||||
# 使用 `master` 分支作为默认分支,请将其更改为 `master`
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
# 允许你从 Actions 选项卡手动运行此工作流程
|
||||
workflow_dispatch:
|
||||
|
||||
# 设置 GITHUB_TOKEN 的权限,以允许部署到 GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
# 只允许同时进行一次部署,跳过正在运行和最新队列之间的运行队列
|
||||
# 但是,不要取消正在进行的运行,因为我们希望允许这些生产部署完成
|
||||
concurrency:
|
||||
group: pages
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
# 构建工作
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0 # 如果未启用 lastUpdated,则不需要
|
||||
- uses: pnpm/action-setup@v3 # 如果使用 pnpm,请取消此区域注释
|
||||
with:
|
||||
version: 9
|
||||
# - uses: oven-sh/setup-bun@v1 # 如果使用 Bun,请取消注释
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22
|
||||
cache: pnpm # 或 pnpm / yarn
|
||||
- name: Setup Pages
|
||||
uses: actions/configure-pages@v4
|
||||
- name: Install dependencies
|
||||
run: pnpm add -D vitepress@next # 或 pnpm install / yarn install / bun install
|
||||
- name: Build with VitePress
|
||||
run: pnpm run docs:build # 或 pnpm docs:build / yarn docs:build / bun run docs:build
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
with:
|
||||
path: docs/.vitepress/dist
|
||||
|
||||
# 部署工作
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
name: Deploy
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
215
.github/workflows/main.yml
vendored
Normal file
@@ -0,0 +1,215 @@
|
||||
name: AutoBuild # 工作流的名称
|
||||
|
||||
permissions:
|
||||
contents: write # 给予写入仓库内容的权限
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*' # 当推送以v开头的标签时触发此工作流
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: build and release electron app # 任务名称
|
||||
runs-on: ${{ matrix.os }} # 在matrix.os定义的操作系统上运行
|
||||
strategy:
|
||||
fail-fast: false # 如果一个任务失败,其他任务继续运行
|
||||
matrix:
|
||||
os: [windows-latest, macos-latest, ubuntu-latest] # 在Windows和macOS上运行任务
|
||||
|
||||
steps:
|
||||
- name: Check out git repository
|
||||
uses: actions/checkout@v4 # 检出代码仓库
|
||||
|
||||
- name: Install Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22 # 安装Node.js 22 (这里node环境是能够运行代码的环境)
|
||||
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
npm i -g yarn
|
||||
yarn install # 安装项目依赖
|
||||
|
||||
- name: Build Electron App for windows
|
||||
if: matrix.os == 'windows-latest' # 只在Windows上运行
|
||||
run: yarn run build:win # 构建Windows版应用
|
||||
|
||||
- name: Build Electron App for macos
|
||||
if: matrix.os == 'macos-latest' # 只在macOS上运行
|
||||
run: |
|
||||
yarn run build:mac
|
||||
|
||||
- name: Build Electron App for linux
|
||||
if: matrix.os == 'ubuntu-latest' # 只在Linux上运行
|
||||
run: yarn run build:linux # 构建Linux版应用
|
||||
|
||||
- name: Cleanup Artifacts for Windows
|
||||
if: matrix.os == 'windows-latest'
|
||||
run: |
|
||||
npx del-cli "dist/*" "!dist/*.exe" "!dist/*.zip" "!dist/*.yml" # 清理Windows构建产物,只保留特定文件
|
||||
|
||||
- name: Cleanup Artifacts for MacOS
|
||||
if: matrix.os == 'macos-latest'
|
||||
run: |
|
||||
npx del-cli "dist/*" "!dist/(*.dmg|*.zip|latest*.yml)" # 清理macOS构建产物,只保留特定文件
|
||||
|
||||
- name: Cleanup Artifacts for Linux
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
run: |
|
||||
npx del-cli "dist/*" "!dist/(*.AppImage|*.deb|*.snap|latest*.yml)" # 清理Linux构建产物,只保留特定文件
|
||||
|
||||
- name: upload artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.os }}
|
||||
path: dist # 上传构建产物作为工作流artifact
|
||||
|
||||
- name: release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
files: 'dist/**' # 将dist目录下所有文件添加到release
|
||||
|
||||
# 新增:自动同步到 WebDAV
|
||||
sync-to-webdav:
|
||||
name: Sync to WebDAV
|
||||
needs: release # 等待 release 任务完成
|
||||
runs-on: ubuntu-latest
|
||||
if: startsWith(github.ref, 'refs/tags/v') # 只在标签推送时执行
|
||||
steps:
|
||||
- name: Wait for release to be ready
|
||||
run: |
|
||||
echo "等待 Release 准备就绪..."
|
||||
sleep 30 # 等待30秒确保 release 完全创建
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y curl jq
|
||||
|
||||
- name: Get latest release info
|
||||
id: get-release
|
||||
run: |
|
||||
# 获取当前标签对应的 release 信息
|
||||
TAG_NAME=${GITHUB_REF#refs/tags/}
|
||||
echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT
|
||||
|
||||
# 获取 release 详细信息
|
||||
response=$(curl -s \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
"https://api.github.com/repos/${{ github.repository }}/releases/tags/$TAG_NAME")
|
||||
|
||||
release_id=$(echo "$response" | jq -r '.id')
|
||||
echo "release_id=$release_id" >> $GITHUB_OUTPUT
|
||||
echo "找到 Release ID: $release_id"
|
||||
|
||||
- name: Sync release to WebDAV
|
||||
run: |
|
||||
TAG_NAME="${{ steps.get-release.outputs.tag_name }}"
|
||||
RELEASE_ID="${{ steps.get-release.outputs.release_id }}"
|
||||
|
||||
echo "🚀 开始同步版本 $TAG_NAME 到 WebDAV..."
|
||||
echo "Release ID: $RELEASE_ID"
|
||||
echo "WebDAV 根路径: ${{ secrets.WEBDAV_BASE_URL }}/yd/ceru"
|
||||
|
||||
# 获取该release的所有资源文件
|
||||
assets_json=$(curl -s \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
"https://api.github.com/repos/${{ github.repository }}/releases/$RELEASE_ID/assets")
|
||||
|
||||
assets_count=$(echo "$assets_json" | jq '. | length')
|
||||
echo "找到 $assets_count 个资源文件"
|
||||
|
||||
if [ "$assets_count" -eq 0 ]; then
|
||||
echo "⚠️ 该版本没有资源文件,跳过同步"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 先创建版本目录
|
||||
dir_path="/yd/ceru/$TAG_NAME"
|
||||
dir_url="${{ secrets.WEBDAV_BASE_URL }}$dir_path"
|
||||
|
||||
echo "创建版本目录: $dir_path"
|
||||
curl -s -X MKCOL \
|
||||
-u "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" \
|
||||
"$dir_url" || echo "目录可能已存在"
|
||||
|
||||
# 处理每个asset
|
||||
success_count=0
|
||||
failed_count=0
|
||||
|
||||
for i in $(seq 0 $(($assets_count - 1))); do
|
||||
asset=$(echo "$assets_json" | jq -c ".[$i]")
|
||||
asset_name=$(echo "$asset" | jq -r '.name')
|
||||
asset_url=$(echo "$asset" | jq -r '.url')
|
||||
asset_size=$(echo "$asset" | jq -r '.size')
|
||||
|
||||
echo "📦 处理资源: $asset_name (大小: $asset_size bytes)"
|
||||
|
||||
# 下载资源文件
|
||||
safe_filename="./temp_${TAG_NAME}_$(date +%s)_$i"
|
||||
|
||||
if ! curl -sL -o "$safe_filename" \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/octet-stream" \
|
||||
"$asset_url"; then
|
||||
echo "❌ 下载失败: $asset_name"
|
||||
failed_count=$((failed_count + 1))
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ -f "$safe_filename" ]; then
|
||||
actual_size=$(wc -c < "$safe_filename")
|
||||
if [ "$actual_size" -ne "$asset_size" ]; then
|
||||
echo "❌ 文件大小不匹配: $asset_name (期望: $asset_size, 实际: $actual_size)"
|
||||
rm -f "$safe_filename"
|
||||
failed_count=$((failed_count + 1))
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "⬆️ 上传到 WebDAV: $asset_name"
|
||||
|
||||
# 构建远程路径
|
||||
remote_path="/yd/ceru/$TAG_NAME/$asset_name"
|
||||
full_url="${{ secrets.WEBDAV_BASE_URL }}$remote_path"
|
||||
|
||||
# 使用 WebDAV PUT 方法上传文件
|
||||
if curl -s -f -X PUT \
|
||||
-u "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" \
|
||||
-T "$safe_filename" \
|
||||
"$full_url"; then
|
||||
|
||||
echo "✅ 上传成功: $asset_name"
|
||||
success_count=$((success_count + 1))
|
||||
|
||||
else
|
||||
echo "❌ 上传失败: $asset_name"
|
||||
failed_count=$((failed_count + 1))
|
||||
fi
|
||||
|
||||
# 清理临时文件
|
||||
rm -f "$safe_filename"
|
||||
echo "----------------------------------------"
|
||||
else
|
||||
echo "❌ 临时文件不存在: $safe_filename"
|
||||
failed_count=$((failed_count + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
echo "========================================"
|
||||
echo "🎉 同步完成!"
|
||||
echo "成功: $success_count 个文件"
|
||||
echo "失败: $failed_count 个文件"
|
||||
echo "总计: $assets_count 个文件"
|
||||
|
||||
- name: Notify completion
|
||||
if: always()
|
||||
run: |
|
||||
if [ "${{ job.status }}" == "success" ]; then
|
||||
echo "✅ 版本 ${{ steps.get-release.outputs.tag_name }} 已成功同步到 alist"
|
||||
else
|
||||
echo "❌ 版本 ${{ steps.get-release.outputs.tag_name }} 同步失败"
|
||||
fi
|
||||
154
.github/workflows/sync-releases-to-webdav.yml
vendored
Normal file
@@ -0,0 +1,154 @@
|
||||
name: Sync Existing Releases to Alist
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag_name:
|
||||
description: '要同步的特定标签(如 v1.0.0),留空则同步所有版本'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
sync-releases-to-alist:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y curl jq
|
||||
|
||||
- name: Get all releases
|
||||
id: get-releases
|
||||
run: |
|
||||
response=$(curl -s \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
"https://api.github.com/repos/${{ github.repository }}/releases")
|
||||
echo "releases_json=$(echo "$response" | jq -c '.')" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Sync releases to Alist(自动登录 & 上传)
|
||||
run: |
|
||||
# ========== 1. 读取输入参数 ==========
|
||||
SPECIFIC_TAG="${{ github.event.inputs.tag_name }}"
|
||||
RELEASES_JSON='${{ steps.get-releases.outputs.releases_json }}'
|
||||
|
||||
# ========== 2. Alist 连接信息 ==========
|
||||
ALIST_URL="https://alist.shiqianjiang.cn" # https://pan.example.com
|
||||
ALIST_USER="${{ secrets.WEBDAV_USERNAME }}" # Alist 登录账号
|
||||
ALIST_PASS="${{ secrets.WEBDAV_PASSWORD }}" # Alist 登录密码
|
||||
ALIST_DIR="/yd/ceru" # 目标根目录
|
||||
|
||||
# ========== 3. 登录拿 token ==========
|
||||
echo "正在登录 Alist ..."
|
||||
login_resp=$(curl -s -X POST "$ALIST_URL/api/auth/login" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{
|
||||
\"username\": \"$ALIST_USER\",
|
||||
\"password\": \"$ALIST_PASS\"
|
||||
}")
|
||||
echo "$login_resp"
|
||||
token=$(echo "$login_resp" | jq -r '.data.token // empty')
|
||||
|
||||
if [ -z "$token" ]; then
|
||||
echo "❌ 登录失败,返回:$login_resp"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ 登录成功,token 已获取"
|
||||
|
||||
# ========== 4. 循环处理 release ==========
|
||||
releases_count=$(echo "$RELEASES_JSON" | jq '. | length')
|
||||
echo "找到 $releases_count 个 releases"
|
||||
for i in $(seq 0 $(($releases_count - 1))); do
|
||||
release=$(echo "$RELEASES_JSON" | jq -c ".[$i]")
|
||||
tag_name=$(echo "$release" | jq -r '.tag_name')
|
||||
release_id=$(echo "$release" | jq -r '.id')
|
||||
|
||||
[ -n "$SPECIFIC_TAG" ] && [ "$tag_name" != "$SPECIFIC_TAG" ] && {
|
||||
echo "跳过 $tag_name,不是指定标签"
|
||||
continue
|
||||
}
|
||||
|
||||
echo "处理版本: $tag_name (ID: $release_id)"
|
||||
assets_json=$(curl -s \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
"https://api.github.com/repos/${{ github.repository }}/releases/$release_id/assets")
|
||||
assets_count=$(echo "$assets_json" | jq '. | length')
|
||||
echo "找到 $assets_count 个资源文件"
|
||||
|
||||
for j in $(seq 0 $(($assets_count - 1))); do
|
||||
asset=$(echo "$assets_json" | jq -c ".[$j]")
|
||||
asset_name=$(echo "$asset" | jq -r '.name')
|
||||
asset_url=$(echo "$asset" | jq -r '.url')
|
||||
asset_size=$(echo "$asset" | jq -r '.size')
|
||||
|
||||
echo "下载资源: $asset_name (大小: $asset_size bytes)"
|
||||
safe_filename="./temp_download_$(date +%s)_$j"
|
||||
|
||||
# 下载
|
||||
curl -sL -o "$safe_filename" \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/octet-stream" \
|
||||
"$asset_url" || {
|
||||
echo "❌ 下载失败: $asset_name"
|
||||
continue
|
||||
}
|
||||
|
||||
# 大小校验
|
||||
actual_size=$(wc -c < "$safe_filename")
|
||||
[ "$actual_size" -ne "$asset_size" ] && {
|
||||
echo "❌ 文件大小不匹配: $asset_name"
|
||||
rm -f "$safe_filename"
|
||||
continue
|
||||
}
|
||||
|
||||
# 组装远程路径(URL 编码)
|
||||
remote_path="$ALIST_DIR/$tag_name/$asset_name"
|
||||
file_path_encoded=$(printf %s "$remote_path" | jq -sRr @uri)
|
||||
echo "上传到 Alist: $remote_path"
|
||||
|
||||
# 调用 /api/fs/put 上传(带 As-Task 异步)
|
||||
response=$(
|
||||
curl -s -X PUT "$ALIST_URL/api/fs/put" \
|
||||
-H "Authorization: $token" \
|
||||
-H "File-Path: $file_path_encoded" \
|
||||
-H "Content-Type: application/octet-stream" \
|
||||
-H "Content-Length: $actual_size" \
|
||||
-H "As-Task: true" \
|
||||
--data-binary @"$safe_filename"
|
||||
)
|
||||
echo "==== 上传接口原始返回 ===="
|
||||
echo "$response"
|
||||
code=$(echo "$response" | jq -r '.code // empty')
|
||||
if [ "$code" = "200" ]; then
|
||||
echo "✅ Alist 上传任务创建成功: $asset_name"
|
||||
else
|
||||
echo "❌ Alist 上传失败: $asset_name"
|
||||
fi
|
||||
|
||||
rm -f "$safe_filename"
|
||||
echo "----------------------------------------"
|
||||
done
|
||||
echo "版本 $tag_name 处理完成"
|
||||
echo "========================================"
|
||||
done
|
||||
|
||||
# ========== 5. 退出登录 ==========
|
||||
echo "退出登录 ..."
|
||||
curl -s -X POST "$ALIST_URL/api/auth/logout" \
|
||||
-H "Authorization: $token" > /dev/null || true
|
||||
|
||||
echo "🎉 Alist 同步完成"
|
||||
|
||||
- name: Summary
|
||||
run: |
|
||||
echo "同步任务已完成!"
|
||||
echo "请检查 Alist 中的文件是否正确上传。"
|
||||
echo "如果遇到问题,请检查以下配置:"
|
||||
echo "1. ALIST_URL - Alist 服务器地址"
|
||||
echo "2. ALIST_USERNAME - Alist 登录账号"
|
||||
echo "3. ALIST_PASSWORD - Alist 登录密码"
|
||||
echo "4. GITHUB_TOKEN - GitHub 访问令牌"
|
||||
160
.github/workflows/uploadpan.yml
vendored
Normal file
@@ -0,0 +1,160 @@
|
||||
name: Sync Existing Releases to WebDAV
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag_name:
|
||||
description: '要同步的特定标签(如 v1.0.0),留空则同步所有版本'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
sync-releases-to-webdav:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y curl
|
||||
|
||||
- name: Get all releases
|
||||
id: get-releases
|
||||
run: |
|
||||
response=$(curl -s \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
"https://api.github.com/repos/${{ github.repository }}/releases")
|
||||
echo "releases_json=$(echo "$response" | jq -c '.')" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Sync releases to WebDAV
|
||||
run: |
|
||||
# 读取输入参数
|
||||
SPECIFIC_TAG="${{ github.event.inputs.tag_name }}"
|
||||
RELEASES_JSON='${{ steps.get-releases.outputs.releases_json }}'
|
||||
|
||||
echo "开始同步 releases..."
|
||||
echo "特定标签: ${SPECIFIC_TAG:-所有版本}"
|
||||
echo "WebDAV 根路径: ${{ secrets.WEBDAV_BASE_URL }}/yd/ceru"
|
||||
|
||||
# 处理每个 release
|
||||
releases_count=$(echo "$RELEASES_JSON" | jq '. | length')
|
||||
echo "找到 $releases_count 个 releases"
|
||||
|
||||
for i in $(seq 0 $(($releases_count - 1))); do
|
||||
release=$(echo "$RELEASES_JSON" | jq -c ".[$i]")
|
||||
tag_name=$(echo "$release" | jq -r '.tag_name')
|
||||
release_id=$(echo "$release" | jq -r '.id')
|
||||
|
||||
if [ -n "$SPECIFIC_TAG" ] && [ "$tag_name" != "$SPECIFIC_TAG" ]; then
|
||||
echo "跳过 $tag_name,不是指定的标签 $SPECIFIC_TAG"
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "正在处理版本: $tag_name (ID: $release_id)"
|
||||
|
||||
# 获取该release的所有资源文件
|
||||
assets_json=$(curl -s \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
"https://api.github.com/repos/${{ github.repository }}/releases/$release_id/assets")
|
||||
|
||||
assets_count=$(echo "$assets_json" | jq '. | length')
|
||||
echo "找到 $assets_count 个资源文件"
|
||||
|
||||
# 处理每个asset
|
||||
for j in $(seq 0 $(($assets_count - 1))); do
|
||||
asset=$(echo "$assets_json" | jq -c ".[$j]")
|
||||
asset_name=$(echo "$asset" | jq -r '.name')
|
||||
asset_url=$(echo "$asset" | jq -r '.url')
|
||||
asset_size=$(echo "$asset" | jq -r '.size')
|
||||
|
||||
echo "下载资源: $asset_name (大小: $asset_size bytes)"
|
||||
|
||||
# 下载资源文件
|
||||
safe_filename="./temp_download"
|
||||
|
||||
if ! curl -sL -o "$safe_filename" \
|
||||
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/octet-stream" \
|
||||
"$asset_url"; then
|
||||
echo "❌ 下载失败: $asset_name"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ -f "$safe_filename" ]; then
|
||||
actual_size=$(wc -c < "$safe_filename")
|
||||
if [ "$actual_size" -ne "$asset_size" ]; then
|
||||
echo "❌ 文件大小不匹配: $asset_name (期望: $asset_size, 实际: $actual_size)"
|
||||
rm -f "$safe_filename"
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "上传到 WebDAV: $asset_name"
|
||||
|
||||
# 构建远程路径
|
||||
remote_path="/yd/ceru/$tag_name/$asset_name"
|
||||
full_url="${{ secrets.WEBDAV_BASE_URL }}$remote_path"
|
||||
|
||||
echo "完整路径: $full_url"
|
||||
|
||||
# 使用 WebDAV PUT 方法上传文件
|
||||
if curl -s -f -X PUT \
|
||||
-u "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" \
|
||||
-T "$safe_filename" \
|
||||
"$full_url"; then
|
||||
|
||||
echo "✅ WebDAV 上传成功: $asset_name"
|
||||
|
||||
# 验证文件是否存在
|
||||
echo "验证文件是否存在..."
|
||||
sleep 2
|
||||
|
||||
if curl -s -f -u "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" \
|
||||
-X PROPFIND \
|
||||
-H "Depth: 0" \
|
||||
"$full_url" > /dev/null 2>&1; then
|
||||
echo "✅ 文件确认存在: $asset_name"
|
||||
else
|
||||
echo "⚠️ 文件验证失败,但上传可能成功"
|
||||
fi
|
||||
|
||||
else
|
||||
echo "❌ WebDAV 上传失败: $asset_name"
|
||||
echo "尝试创建目录后重新上传..."
|
||||
|
||||
# 尝试先创建目录
|
||||
dir_path="/yd/ceru/$tag_name"
|
||||
dir_url="${{ secrets.WEBDAV_BASE_URL }}$dir_path"
|
||||
|
||||
if curl -s -f -X MKCOL \
|
||||
-u "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" \
|
||||
"$dir_url"; then
|
||||
echo "✅ 目录创建成功: $dir_path"
|
||||
|
||||
# 重新尝试上传文件
|
||||
if curl -s -f -X PUT \
|
||||
-u "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" \
|
||||
-T "$safe_filename" \
|
||||
"$full_url"; then
|
||||
echo "✅ 重新上传成功: $asset_name"
|
||||
else
|
||||
echo "❌ 重新上传失败: $asset_name"
|
||||
fi
|
||||
else
|
||||
echo "❌ 目录创建失败: $dir_path"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 安全删除临时文件
|
||||
rm -f "$safe_filename"
|
||||
echo "----------------------------------------"
|
||||
else
|
||||
echo "❌ 文件不存在: $safe_filename"
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
echo "🎉 WebDAV 同步完成"
|
||||
9
.gitignore
vendored
@@ -10,3 +10,12 @@ build
|
||||
/download/
|
||||
/plugin/
|
||||
/plugins/
|
||||
temp
|
||||
temp/log.txt
|
||||
/.kiro/
|
||||
/.vscode/
|
||||
/.codebuddy/
|
||||
/.idea/
|
||||
docs/.vitepress/dist
|
||||
docs/.vitepress/cache
|
||||
yarn.lock
|
||||
@@ -1,22 +0,0 @@
|
||||
# 语言设置
|
||||
|
||||
## 对话语言
|
||||
- **主要语言**: 中文(简体中文)
|
||||
- 与用户对话时请使用中文回复
|
||||
- 代码注释和文档也应该使用中文
|
||||
- 变量名和函数名仍使用英文(遵循编程规范)
|
||||
|
||||
## 代码规范
|
||||
- 代码本身使用英文命名
|
||||
- 注释使用中文说明
|
||||
- 错误信息和用户界面文本使用中文
|
||||
- README和文档文件使用中文编写
|
||||
|
||||
## 示例
|
||||
```typescript
|
||||
// 播放音乐的函数
|
||||
function playMusic(songId: string): void {
|
||||
// 开始播放指定的歌曲
|
||||
console.log('正在播放音乐...')
|
||||
}
|
||||
```
|
||||
@@ -1,16 +0,0 @@
|
||||
# Product Overview
|
||||
|
||||
**Ceru Music** is a free music application built as an Electron desktop app. It provides a cross-platform music experience for Windows, macOS, and Linux users.
|
||||
|
||||
## Key Features
|
||||
- Desktop music player application
|
||||
- Cross-platform compatibility (Windows, macOS, Linux)
|
||||
- Modern UI built with Vue.js and TDesign components
|
||||
- Auto-updating capabilities via electron-updater
|
||||
|
||||
## Target Platforms
|
||||
- Windows (primary build target)
|
||||
- macOS
|
||||
- Linux
|
||||
|
||||
The application follows Electron's multi-process architecture with separate main, renderer, and preload processes for security and performance.
|
||||
@@ -1,55 +0,0 @@
|
||||
# Project Structure
|
||||
|
||||
## Root Level Organization
|
||||
```
|
||||
├── src/ # Source code
|
||||
├── resources/ # App resources (icons, etc.)
|
||||
├── build/ # Build artifacts
|
||||
├── out/ # Compiled output
|
||||
└── node_modules/ # Dependencies
|
||||
```
|
||||
|
||||
## Source Code Architecture (`src/`)
|
||||
|
||||
### Electron Multi-Process Structure
|
||||
```
|
||||
src/
|
||||
├── main/ # Main process (Node.js)
|
||||
│ └── index.ts # Entry point for main process
|
||||
├── preload/ # Preload scripts (security bridge)
|
||||
│ ├── index.ts # Preload script implementation
|
||||
│ └── index.d.ts # Type definitions
|
||||
└── renderer/ # Renderer process (Vue app)
|
||||
├── src/ # Vue application source
|
||||
├── index.html # HTML entry point
|
||||
├── auto-imports.d.ts # Auto-generated import types
|
||||
└── components.d.ts # Auto-generated component types
|
||||
```
|
||||
|
||||
## Configuration Files
|
||||
|
||||
### TypeScript Configuration
|
||||
- `tsconfig.json`: Root config with project references
|
||||
- `tsconfig.node.json`: Node.js/Electron main process config
|
||||
- `tsconfig.web.json`: Web/renderer process config
|
||||
|
||||
### Build & Development
|
||||
- `electron.vite.config.ts`: Vite configuration for Electron
|
||||
- `electron-builder.yml`: App packaging configuration
|
||||
- `package.json`: Dependencies and scripts
|
||||
|
||||
### Code Quality
|
||||
- `eslint.config.mjs`: ESLint configuration (flat config)
|
||||
- `.prettierrc.yaml`: Prettier formatting rules
|
||||
- `.editorconfig`: Editor configuration
|
||||
|
||||
## Key Conventions
|
||||
- **Renderer alias**: Use `@renderer/*` for renderer source imports
|
||||
- **Auto-imports**: TDesign components and Vue composables are auto-imported
|
||||
- **Process separation**: Maintain clear boundaries between main, preload, and renderer
|
||||
- **TypeScript**: All source files should use TypeScript (.ts/.vue)
|
||||
|
||||
## File Naming
|
||||
- Use kebab-case for component files
|
||||
- Use camelCase for TypeScript files
|
||||
- Vue components should be multi-word (ESLint enforced, but disabled)
|
||||
@@ -1,52 +0,0 @@
|
||||
# Technology Stack
|
||||
|
||||
## Core Technologies
|
||||
- **Electron**: Desktop app framework (v37.2.3)
|
||||
- **Vue 3**: Frontend framework with Composition API (v3.5.17)
|
||||
- **TypeScript**: Primary language for type safety
|
||||
- **Vite**: Build tool and dev server via electron-vite
|
||||
- **PNPM**: Package manager (preferred over npm/yarn)
|
||||
|
||||
## UI Framework
|
||||
- **TDesign Vue Next**: Primary UI component library (v1.15.2)
|
||||
- **SCSS**: Styling preprocessor
|
||||
- **Auto-import**: Automatic component and composable imports
|
||||
|
||||
## State Management & Routing
|
||||
- **Pinia**: State management (v3.0.3)
|
||||
- **Vue Router**: Client-side routing (v4.5.1)
|
||||
|
||||
## Development Tools
|
||||
- **ESLint**: Code linting with Electron Toolkit configs
|
||||
- **Prettier**: Code formatting
|
||||
- **Vue TSC**: Vue TypeScript checking
|
||||
|
||||
## Common Commands
|
||||
|
||||
### Development
|
||||
```bash
|
||||
pnpm dev # Start development server
|
||||
pnpm start # Preview built app
|
||||
```
|
||||
|
||||
### Code Quality
|
||||
```bash
|
||||
pnpm lint # Run ESLint
|
||||
pnpm format # Format code with Prettier
|
||||
pnpm typecheck # Run TypeScript checks
|
||||
```
|
||||
|
||||
### Building
|
||||
```bash
|
||||
pnpm build # Build for current platform
|
||||
pnpm build:win # Build for Windows
|
||||
pnpm build:mac # Build for macOS
|
||||
pnpm build:linux # Build for Linux
|
||||
pnpm build:unpack # Build without packaging
|
||||
```
|
||||
|
||||
## Build System
|
||||
- **electron-vite**: Vite-based build system for Electron
|
||||
- **electron-builder**: Application packaging and distribution
|
||||
- Separate TypeScript configs for Node.js and web contexts
|
||||
- Auto-updating via electron-updater
|
||||
@@ -2,4 +2,4 @@ singleQuote: true
|
||||
semi: false
|
||||
printWidth: 100
|
||||
trailingComma: none
|
||||
endOfLine: "auto"
|
||||
endOfLine: 'auto'
|
||||
|
||||
3
.vscode/extensions.json
vendored
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"recommendations": ["dbaeumer.vscode-eslint"]
|
||||
}
|
||||
39
.vscode/launch.json
vendored
@@ -1,39 +0,0 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Debug Main Process",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceRoot}",
|
||||
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite",
|
||||
"windows": {
|
||||
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd"
|
||||
},
|
||||
"runtimeArgs": ["--sourcemap"],
|
||||
"env": {
|
||||
"REMOTE_DEBUGGING_PORT": "9222"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Debug Renderer Process",
|
||||
"port": 9222,
|
||||
"request": "attach",
|
||||
"type": "chrome",
|
||||
"webRoot": "${workspaceFolder}/src/renderer",
|
||||
"timeout": 60000,
|
||||
"presentation": {
|
||||
"hidden": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"compounds": [
|
||||
{
|
||||
"name": "Debug All",
|
||||
"configurations": ["Debug Main Process", "Debug Renderer Process"],
|
||||
"presentation": {
|
||||
"order": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
12
.vscode/settings.json
vendored
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "vscode.typescript-language-features"
|
||||
},
|
||||
"[javascript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "vscode.json-language-features"
|
||||
},
|
||||
"editor.fontSize": 14
|
||||
}
|
||||
217
LICENSE
@@ -1,21 +1,204 @@
|
||||
MIT License
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
Copyright (c) 2025 时迁酱
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright (c) 2025 时迁酱
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
394
README.md
@@ -1,10 +1,16 @@
|
||||
# Ceru Music
|
||||
# Ceru Music(澜音)
|
||||
|
||||
一个跨平台的音乐播放器应用,支持多来源音乐数据获取与播放。
|
||||
一个跨平台的音乐播放器应用,支持基于合规插件获取公开音乐信息与播放功能。
|
||||
|
||||
## 项目简介
|
||||
|
||||
Ceru Music 是基于 Electron 和 Vue 开发的跨平台桌面音乐播放器,支持从多个音乐平台获取歌曲信息并播放。该项目结合了现代前端技术和桌面应用开发,提供了流畅的用户体验和灵活的音乐数据源支持。
|
||||
Ceru Music 是基于 Electron 和 Vue 开发的跨平台桌面音乐播放器工具,**仅提供插件运行框架与播放功能**,不直接存储、提供任何音乐源文件。用户需通过自行选择、安装合规插件获取音乐相关数据,项目旨在为开发者提供桌面应用技术实践与学习案例,为用户提供合规的音乐播放工具框架。
|
||||
|
||||
<img src="assets/image-20250827175023917.png" alt="image-20250827175023917" style="zoom: 33%;" /><img src="assets/image-20250827175109430.png" alt="image-20250827175109430" style="zoom:33%;" />
|
||||
|
||||
## Star History
|
||||
|
||||
[](https://www.star-history.com/#timeshiftsauce/CeruMusic&Date)
|
||||
|
||||
## 技术栈
|
||||
|
||||
@@ -13,79 +19,415 @@ Ceru Music 是基于 Electron 和 Vue 开发的跨平台桌面音乐播放器,
|
||||
- **TypeScript**:增强代码可维护性和类型安全
|
||||
- **Pinia**:状态管理工具
|
||||
- **Vite**:快速的前端构建工具
|
||||
- **Meting API**:作为备用音乐数据源
|
||||
- **CeruPlugins**:音乐插件运行环境(仅提供框架,不包含默认插件)
|
||||
- **AMLL**:音乐生态辅助模块(仅提供功能接口,不关联具体音乐数据源)
|
||||
|
||||
## 项目结构
|
||||
|
||||
```ast
|
||||
CeruMuisc/
|
||||
├── .github/
|
||||
│ └── workflows/
|
||||
│ ├── auto-sync-release.yml
|
||||
│ ├── deploydocs.yml
|
||||
│ ├── main.yml
|
||||
│ ├── sync-releases-to-webdav.yml
|
||||
│ └── uploadpan.yml
|
||||
├── scripts/
|
||||
│ ├── auth-test.js
|
||||
│ ├── genAst.js
|
||||
│ └── test-alist.js
|
||||
├── src/
|
||||
│ ├── common/
|
||||
│ │ ├── types/
|
||||
│ │ │ ├── playList.ts
|
||||
│ │ │ └── songList.ts
|
||||
│ │ ├── utils/
|
||||
│ │ │ ├── lyricUtils/
|
||||
│ │ │ │ ├── kg.js
|
||||
│ │ │ │ └── util.ts
|
||||
│ │ │ ├── common.ts
|
||||
│ │ │ ├── nodejs.ts
|
||||
│ │ │ └── renderer.ts
|
||||
│ │ └── index.ts
|
||||
│ ├── main/
|
||||
│ │ ├── events/
|
||||
│ │ │ ├── ai.ts
|
||||
│ │ │ ├── autoUpdate.ts
|
||||
│ │ │ ├── directorySettings.ts
|
||||
│ │ │ ├── musicCache.ts
|
||||
│ │ │ └── songList.ts
|
||||
│ │ ├── services/
|
||||
│ │ │ ├── music/
|
||||
│ │ │ │ ├── index.ts
|
||||
│ │ │ │ ├── net-ease-service.ts
|
||||
│ │ │ │ └── service-base.ts
|
||||
│ │ │ ├── musicCache/
|
||||
│ │ │ │ └── index.ts
|
||||
│ │ │ ├── musicSdk/
|
||||
│ │ │ │ ├── index.ts
|
||||
│ │ │ │ ├── service.ts
|
||||
│ │ │ │ └── type.ts
|
||||
│ │ │ ├── plugin/
|
||||
│ │ │ │ ├── manager/
|
||||
│ │ │ │ │ ├── CeruMusicPluginHost.ts
|
||||
│ │ │ │ │ └── converter-event-driven.ts
|
||||
│ │ │ │ ├── index.ts
|
||||
│ │ │ │ └── logger.ts
|
||||
│ │ │ ├── songList/
|
||||
│ │ │ │ ├── ManageSongList.ts
|
||||
│ │ │ │ └── PlayListSongs.ts
|
||||
│ │ │ └── ai-service.ts
|
||||
│ │ ├── utils/
|
||||
│ │ │ ├── musicSdk/
|
||||
│ │ │ │ ├── kg/
|
||||
│ │ │ │ │ ├── temp/
|
||||
│ │ │ │ │ │ ├── musicSearch-new.js
|
||||
│ │ │ │ │ │ └── songList-new.js
|
||||
│ │ │ │ │ ├── vendors/
|
||||
│ │ │ │ │ │ └── infSign.min.js
|
||||
│ │ │ │ │ ├── album.js
|
||||
│ │ │ │ │ ├── api-test.js
|
||||
│ │ │ │ │ ├── comment.js
|
||||
│ │ │ │ │ ├── hotSearch.js
|
||||
│ │ │ │ │ ├── index.js
|
||||
│ │ │ │ │ ├── leaderboard.js
|
||||
│ │ │ │ │ ├── lyric.js
|
||||
│ │ │ │ │ ├── musicInfo.js
|
||||
│ │ │ │ │ ├── musicSearch.js
|
||||
│ │ │ │ │ ├── pic.js
|
||||
│ │ │ │ │ ├── singer.js
|
||||
│ │ │ │ │ ├── songList.js
|
||||
│ │ │ │ │ ├── tipSearch.js
|
||||
│ │ │ │ │ └── util.js
|
||||
│ │ │ │ ├── kw/
|
||||
│ │ │ │ │ ├── album.js
|
||||
│ │ │ │ │ ├── api-temp.js
|
||||
│ │ │ │ │ ├── api-test.js
|
||||
│ │ │ │ │ ├── comment.js
|
||||
│ │ │ │ │ ├── hotSearch.js
|
||||
│ │ │ │ │ ├── index.js
|
||||
│ │ │ │ │ ├── kwdecode.ts
|
||||
│ │ │ │ │ ├── leaderboard.js
|
||||
│ │ │ │ │ ├── lyric.js
|
||||
│ │ │ │ │ ├── musicSearch.js
|
||||
│ │ │ │ │ ├── pic.js
|
||||
│ │ │ │ │ ├── songList.js
|
||||
│ │ │ │ │ ├── tipSearch.js
|
||||
│ │ │ │ │ └── util.js
|
||||
│ │ │ │ ├── mg/
|
||||
│ │ │ │ │ ├── temp/
|
||||
│ │ │ │ │ │ └── leaderboard-old.js
|
||||
│ │ │ │ │ ├── utils/
|
||||
│ │ │ │ │ │ ├── index.js
|
||||
│ │ │ │ │ │ └── mrc.js
|
||||
│ │ │ │ │ ├── album.js
|
||||
│ │ │ │ │ ├── api-test.js
|
||||
│ │ │ │ │ ├── comment.js
|
||||
│ │ │ │ │ ├── hotSearch.js
|
||||
│ │ │ │ │ ├── index.js
|
||||
│ │ │ │ │ ├── leaderboard.js
|
||||
│ │ │ │ │ ├── lyric.js
|
||||
│ │ │ │ │ ├── musicInfo.js
|
||||
│ │ │ │ │ ├── musicSearch.js
|
||||
│ │ │ │ │ ├── pic.js
|
||||
│ │ │ │ │ ├── songId.js
|
||||
│ │ │ │ │ ├── songList.js
|
||||
│ │ │ │ │ └── tipSearch.js
|
||||
│ │ │ │ ├── tx/
|
||||
│ │ │ │ │ ├── api-test.js
|
||||
│ │ │ │ │ ├── comment.js
|
||||
│ │ │ │ │ ├── hotSearch.js
|
||||
│ │ │ │ │ ├── index.js
|
||||
│ │ │ │ │ ├── leaderboard.js
|
||||
│ │ │ │ │ ├── lyric.js
|
||||
│ │ │ │ │ ├── musicInfo.js
|
||||
│ │ │ │ │ ├── musicSearch.js
|
||||
│ │ │ │ │ ├── singer.js
|
||||
│ │ │ │ │ ├── songList.js
|
||||
│ │ │ │ │ └── tipSearch.js
|
||||
│ │ │ │ ├── wy/
|
||||
│ │ │ │ │ ├── utils/
|
||||
│ │ │ │ │ │ ├── crypto.js
|
||||
│ │ │ │ │ │ └── index.js
|
||||
│ │ │ │ │ ├── api-test.js
|
||||
│ │ │ │ │ ├── comment.js
|
||||
│ │ │ │ │ ├── hotSearch.js
|
||||
│ │ │ │ │ ├── index.js
|
||||
│ │ │ │ │ ├── leaderboard.js
|
||||
│ │ │ │ │ ├── lyric.js
|
||||
│ │ │ │ │ ├── musicDetail.js
|
||||
│ │ │ │ │ ├── musicInfo.js
|
||||
│ │ │ │ │ ├── musicSearch.js
|
||||
│ │ │ │ │ ├── singer.js
|
||||
│ │ │ │ │ ├── songList.js
|
||||
│ │ │ │ │ └── tipSearch.js
|
||||
│ │ │ │ ├── api-source-info.ts
|
||||
│ │ │ │ ├── index.js
|
||||
│ │ │ │ ├── options.js
|
||||
│ │ │ │ └── utils.js
|
||||
│ │ │ ├── array.ts
|
||||
│ │ │ ├── index.ts
|
||||
│ │ │ ├── object.ts
|
||||
│ │ │ ├── path.ts
|
||||
│ │ │ ├── request.js
|
||||
│ │ │ └── utils.ts
|
||||
│ │ ├── autoUpdate.ts
|
||||
│ │ └── index.ts
|
||||
│ ├── preload/
|
||||
│ │ ├── index.d.ts
|
||||
│ │ └── index.ts
|
||||
│ ├── renderer/
|
||||
│ │ ├── public/
|
||||
│ │ │ ├── default-cover.png
|
||||
│ │ │ ├── head.jpg
|
||||
│ │ │ ├── logo.svg
|
||||
│ │ │ ├── star.png
|
||||
│ │ │ └── wldss.png
|
||||
│ │ ├── src/
|
||||
│ │ │ ├── api/
|
||||
│ │ │ │ └── songList.ts
|
||||
│ │ │ ├── components/
|
||||
│ │ │ │ ├── AI/
|
||||
│ │ │ │ │ └── FloatBall.vue
|
||||
│ │ │ │ ├── Music/
|
||||
│ │ │ │ │ └── SongVirtualList.vue
|
||||
│ │ │ │ ├── Play/
|
||||
│ │ │ │ │ ├── AudioVisualizer.vue
|
||||
│ │ │ │ │ ├── FullPlay.vue
|
||||
│ │ │ │ │ ├── GlobalAudio.vue
|
||||
│ │ │ │ │ ├── PlaylistActions.vue
|
||||
│ │ │ │ │ ├── PlaylistDrawer.vue
|
||||
│ │ │ │ │ ├── PlayMusic.vue
|
||||
│ │ │ │ │ └── ShaderBackground.vue
|
||||
│ │ │ │ ├── Search/
|
||||
│ │ │ │ │ └── SearchComponent.vue
|
||||
│ │ │ │ ├── Settings/
|
||||
│ │ │ │ │ ├── AIFloatBallSettings.vue
|
||||
│ │ │ │ │ ├── DirectorySettings.vue
|
||||
│ │ │ │ │ ├── MusicCache.vue
|
||||
│ │ │ │ │ ├── PlaylistSettings.vue
|
||||
│ │ │ │ │ └── UpdateSettings.vue
|
||||
│ │ │ │ ├── ThemeSelector.vue
|
||||
│ │ │ │ ├── TitleBarControls.vue
|
||||
│ │ │ │ ├── UpdateExample.vue
|
||||
│ │ │ │ ├── UpdateProgress.vue
|
||||
│ │ │ │ └── Versions.vue
|
||||
│ │ │ ├── composables/
|
||||
│ │ │ │ └── useAutoUpdate.ts
|
||||
│ │ │ ├── layout/
|
||||
│ │ │ │ └── index.vue
|
||||
│ │ │ ├── router/
|
||||
│ │ │ │ └── index.ts
|
||||
│ │ │ ├── services/
|
||||
│ │ │ │ ├── music/
|
||||
│ │ │ │ │ ├── index.ts
|
||||
│ │ │ │ │ └── service-base.ts
|
||||
│ │ │ │ └── autoUpdateService.ts
|
||||
│ │ │ ├── store/
|
||||
│ │ │ │ ├── ControlAudio.ts
|
||||
│ │ │ │ ├── LocalUserDetail.ts
|
||||
│ │ │ │ ├── search.ts
|
||||
│ │ │ │ └── Settings.ts
|
||||
│ │ │ ├── types/
|
||||
│ │ │ │ ├── audio.ts
|
||||
│ │ │ │ ├── Sources.ts
|
||||
│ │ │ │ └── userInfo.ts
|
||||
│ │ │ ├── utils/
|
||||
│ │ │ │ ├── audio/
|
||||
│ │ │ │ │ ├── audioManager.ts
|
||||
│ │ │ │ │ ├── download.ts
|
||||
│ │ │ │ │ ├── useSmtc.ts
|
||||
│ │ │ │ │ └── volume.ts
|
||||
│ │ │ │ ├── color/
|
||||
│ │ │ │ │ ├── colorExtractor.ts
|
||||
│ │ │ │ │ └── contrastColor.ts
|
||||
│ │ │ │ └── playlist/
|
||||
│ │ │ │ ├── playlistExportImport.ts
|
||||
│ │ │ │ └── playlistManager.ts
|
||||
│ │ │ ├── views/
|
||||
│ │ │ │ ├── home/
|
||||
│ │ │ │ │ └── index.vue
|
||||
│ │ │ │ ├── music/
|
||||
│ │ │ │ │ ├── find.vue
|
||||
│ │ │ │ │ ├── list.vue
|
||||
│ │ │ │ │ ├── local.vue
|
||||
│ │ │ │ │ ├── recent.vue
|
||||
│ │ │ │ │ └── search.vue
|
||||
│ │ │ │ ├── settings/
|
||||
│ │ │ │ │ ├── index.vue
|
||||
│ │ │ │ │ └── plugins.vue
|
||||
│ │ │ │ └── welcome/
|
||||
│ │ │ │ └── index.vue
|
||||
│ │ │ ├── App.vue
|
||||
│ │ │ ├── env.d.ts
|
||||
│ │ │ └── main.ts
|
||||
│ │ ├── auto-imports.d.ts
|
||||
│ │ ├── components.d.ts
|
||||
│ │ └── index.html
|
||||
│ └── types/
|
||||
│ ├── musicCache.ts
|
||||
│ └── songList.ts
|
||||
├── website/
|
||||
│ ├── CeruUse.html
|
||||
│ ├── design.html
|
||||
│ ├── index.html
|
||||
│ ├── pluginDev.html
|
||||
│ ├── script.js
|
||||
│ └── styles.css
|
||||
├── electron-builder.yml
|
||||
├── electron.vite.config.ts
|
||||
├── eslint.config.js
|
||||
├── LICENSE
|
||||
├── package-lock.json
|
||||
├── package.json
|
||||
├── qodana.sarif.json
|
||||
├── qodana.yaml
|
||||
├── README.md
|
||||
├── tsconfig.json
|
||||
├── tsconfig.node.json
|
||||
├── tsconfig.web.json
|
||||
└── yarn.lock
|
||||
```
|
||||
|
||||
## 主要功能
|
||||
|
||||
- 支持从多个音乐平台搜索和播放歌曲
|
||||
- 获取歌词和专辑信息
|
||||
- 提供插件加载与管理功能,支持通过合规插件获取公开音乐信息
|
||||
- 支持通过插件获取歌词、专辑封面等公开元数据
|
||||
- 支持虚拟滚动列表,优化大量数据渲染性能
|
||||
- 本地数据存储与播放列表管理
|
||||
- 本地播放列表管理(仅存储用户手动创建的列表结构,不包含音乐文件)
|
||||
- **提示**:本地数据仅保存在用户设备本地,未进行云端备份,用户需自行备份以防止数据丢失
|
||||
- 精美的用户界面与动画效果
|
||||
- **插件生态框架**(插件需用户自行获取并确保合规性)
|
||||
|
||||
## 安装与使用
|
||||
|
||||
### 推荐开发环境
|
||||
|
||||
- **IDE**: VS Code 或 WebStorm
|
||||
- **Node.js 版本**: 推荐使用最新稳定版
|
||||
- **包管理器**: pnpm
|
||||
- **Node.js 版本**: 22 及以上
|
||||
- **包管理器**: **yarn**
|
||||
|
||||
### 项目设置
|
||||
|
||||
1. 安装依赖:
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
yarn install
|
||||
```
|
||||
|
||||
2. 启动开发服务器:
|
||||
|
||||
```bash
|
||||
pnpm dev
|
||||
yarn dev
|
||||
```
|
||||
|
||||
3. 构建应用:
|
||||
|
||||
```bash
|
||||
pnpm build
|
||||
yarn build
|
||||
```
|
||||
|
||||
### 平台构建指令
|
||||
|
||||
- **Windows**:
|
||||
- Windows
|
||||
|
||||
```bash
|
||||
pnpm build:win
|
||||
yarn build:win
|
||||
```
|
||||
|
||||
- **macOS**:
|
||||
- macOS
|
||||
|
||||
```bash
|
||||
pnpm build:mac
|
||||
yarn build:mac
|
||||
```
|
||||
|
||||
- **Linux**:
|
||||
- Linux
|
||||
|
||||
```bash
|
||||
pnpm build:linux
|
||||
yarn build:linux
|
||||
```
|
||||
|
||||
> 提示:构建后的应用仅包含播放器框架,需用户自行配置合规插件方可获取音乐数据。
|
||||
|
||||
## 文档与资源
|
||||
|
||||
- [API 接口文档](docs/api.md):详细说明了支持的音乐平台和请求格式。
|
||||
- [产品设计文档](docs/design.md):涵盖项目架构、核心功能设计和开发规范。
|
||||
- [产品设计文档](https://www.doubao.com/thread/docs/design.md):涵盖项目架构、核心功能设计和开发规范(不含任何音乐数据源信息)。
|
||||
- [插件开发文档](https://www.doubao.com/thread/docs/CeruMusic插件开发文档.md):仅提供插件开发技术规范,**明确要求插件开发者需遵守数据来源平台的用户协议与版权法**,禁止开发、传播获取非公开数据的插件。
|
||||
|
||||
## 开源许可
|
||||
|
||||
本项目遵循 MIT 许可协议。详情请参阅 [LICENSE](LICENSE) 文件。
|
||||
本项目源代码遵循 **Apache License 2.0**,仅授权用户对项目框架进行学习、修改与二次开发,不包含任何音乐数据相关授权。详情请参阅 [LICENSE](./LICENSE) 文件,使用前请务必阅读许可条款。
|
||||
|
||||
## 贡献指南
|
||||
|
||||
欢迎贡献代码和反馈建议!请遵循 [Git 提交规范](docs/design.md#git提交规范) 并确保代码符合项目风格指南。
|
||||
欢迎开发者贡献代码与反馈建议,贡献内容需符合以下要求:
|
||||
|
||||
## 更新日志
|
||||
|
||||
请参阅 [更新日志](docs/api.md#更新日志) 了解最新功能和改进。
|
||||
1. 仅涉及播放器框架功能优化、bug 修复、文档完善,不包含任何音乐数据源相关代码。
|
||||
2. 遵循 [Git 提交规范](https://www.doubao.com/thread/docs/design.md#git提交规范) 并确保代码符合项目风格指南。
|
||||
3. 贡献的代码需无第三方版权纠纷,且不违反开源许可协议。
|
||||
|
||||
## 联系方式
|
||||
|
||||
如有问题或合作意向,请通过 Gitee 私信联系项目维护者。
|
||||
如有技术问题或合作意向(仅限技术交流),请通过 Gitee 私信联系项目维护者。
|
||||
|
||||
## 项目开发者
|
||||
|
||||
- **时迁酱**:产品总体设计与开发
|
||||
|
||||
<img src="assets/head.jpg" alt="head.jpg (940×940)" style="zoom:15%;" />
|
||||
|
||||
- **无聊的霜霜**:首页设计&Ai助手
|
||||
|
||||
<img src="assets/image-20250827181604432.png" alt="image-20250827181604432" style="zoom:25%;" />
|
||||
|
||||
- **Star**:**插件管理**相关功能&部分接口封装
|
||||
|
||||
<img src="assets/image-20250827181535681.png" alt="image-20250827181535681" style="zoom:25%;" />
|
||||
|
||||
**Tips**: 排名不分先后
|
||||
|
||||
# 法律声明与免责条款
|
||||
|
||||
**重要提示:使用本项目前,请务必仔细阅读本条款,使用本项目即视为你已充分理解并同意本条款全部内容。**
|
||||
|
||||
### 一、定义约定
|
||||
|
||||
- “Apache License 2.0”:指 Ceru Music(澜音)桌面播放器框架及源代码,不包含任何第三方插件或音乐数据。
|
||||
- “**用户**”:指下载、安装、使用本项目的个人或组织。
|
||||
- “**合规插件**”:指符合数据来源平台用户协议、不侵犯第三方版权、不获取非公开数据的插件。
|
||||
- “**版权内容**”:指包括但不限于音乐文件、歌词、专辑封面、艺人信息等受著作权法保护的内容。
|
||||
|
||||
### 二、数据与内容责任
|
||||
|
||||
1. 本项目**不直接获取、存储、传输任何音乐数据或版权内容**,仅提供插件运行框架。用户通过插件获取的所有数据,其合法性、准确性由插件提供者及用户**自行负责**,本项目不承担任何责任。
|
||||
2. 若用户使用的插件存在获取非公开数据、侵犯第三方版权等违规行为,相关法律责任由用户及插件提供者承担,与本项目无关。
|
||||
3. 本项目使用的字体、图片等素材,均来自开源社区或已获得合法授权,若存在侵权请联系项目维护者立即移除,本项目将积极配合处理。
|
||||
|
||||
### 三、版权合规要求
|
||||
|
||||
1. 用户承诺:使用本项目时,仅通过合规插件获取音乐相关信息,且获取、使用版权内容的行为符合**《中华人民共和国著作权法》**及相关法律法规,不侵犯**任何第三方**合法权益。
|
||||
2. 用户需知晓:任何未经授权下载、传播、使用受版权保护的音乐文件的行为,均可能构成侵权,需自行承担法律后果。
|
||||
3. 本项目倡导 “尊重版权、支持正版”,提醒用户通过官方音乐平台获取授权音乐服务。
|
||||
|
||||
### 四、免责声明
|
||||
|
||||
1. 因用户使用非合规插件、违反法律法规或第三方协议导致的任何法律责任(包括但不限于侵权赔偿、行政处罚),均由用户自行承担,本项目不承担任何直接、间接、连带或衍生责任。
|
||||
2. 因本项目框架本身的 **bug** 导致的用户设备故障、数据丢失,本项目仅承担在合理范围内的技术修复责任,不承担由此产生的间接损失(如商誉损失、业务中断损失等)。
|
||||
3. 本项目为开源学习项目,不提供商业服务,对用户使用本项目的效果不做任何明示或暗示的保证。
|
||||
|
||||
### 五、使用限制
|
||||
|
||||
1. 本项目仅允许用于**非商业、纯技术学习目的**,禁止用于任何商业运营、盈利活动,禁止修改后用于侵犯第三方权益的场景。
|
||||
2. 禁止在违反当地法律法规、本声明或第三方协议的前提下使用本项目,若用户所在地区禁止此类工具的使用,应立即停止使用。
|
||||
3. 禁止将本项目源代码或构建后的应用,与违规插件捆绑传播,禁止利用本项目从事任何违法违规活动。
|
||||
|
||||
### 六、其他
|
||||
|
||||
1. 本声明的效力、解释及适用,均适用中华人民共和国法律(不含港澳台地区法律)。
|
||||
2. 若用户与本项目维护者就本声明产生争议,应首先通过友好协商解决;协商不成的,任何一方均有权向本项目维护者所在地有管辖权的人民法院提起诉讼。
|
||||
|
||||
## 赞助
|
||||
|
||||
若您认可本项目的技术价值,欢迎通过以下方式支持开发者(仅用于项目技术维护与迭代):
|
||||
<img src="assets/image-20250827175356006.png" alt="赞助方式1" style="zoom:33%;" /><img src="assets/image-20250827175547444.png" alt="赞助方式2" style="zoom: 33%;" />
|
||||
|
||||
BIN
assets/head.jpg
Normal file
|
After Width: | Height: | Size: 202 KiB |
BIN
assets/image-20250827175023917.png
Normal file
|
After Width: | Height: | Size: 719 KiB |
BIN
assets/image-20250827175109430.png
Normal file
|
After Width: | Height: | Size: 981 KiB |
BIN
assets/image-20250827175356006.png
Normal file
|
After Width: | Height: | Size: 167 KiB |
BIN
assets/image-20250827175547444.png
Normal file
|
After Width: | Height: | Size: 290 KiB |
BIN
assets/image-20250827181535681.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
assets/image-20250827181604432.png
Normal file
|
After Width: | Height: | Size: 528 KiB |
BIN
assets/image-20250827181634134.png
Normal file
|
After Width: | Height: | Size: 528 KiB |
@@ -1,3 +0,0 @@
|
||||
provider: generic
|
||||
url: https://example.com/auto-updates
|
||||
updaterCacheDirName: ceru-music-updater
|
||||
84
docs/.vitepress/config.mts
Normal file
@@ -0,0 +1,84 @@
|
||||
import { defineConfig } from 'vitepress'
|
||||
import note from 'markdown-it-footnote'
|
||||
|
||||
export default defineConfig({
|
||||
lang: 'zh-CN',
|
||||
title: 'Ceru Music',
|
||||
base: '/',
|
||||
description:
|
||||
'Ceru Music 是基于 Electron 和 Vue 开发的跨平台桌面音乐播放器工具,一个跨平台的音乐播放器应用,支持基于合规插件获取公开音乐信息与播放功能。',
|
||||
markdown: {
|
||||
config(md) {
|
||||
md.use(note)
|
||||
}
|
||||
},
|
||||
themeConfig: {
|
||||
returnToTopLabel: '返回顶部',
|
||||
// https://vitepress.dev/reference/default-theme-config
|
||||
logo: '/logo.svg',
|
||||
nav: [
|
||||
{ text: '首页', link: '/' },
|
||||
{ text: '使用文档', link: '/guide/' }
|
||||
],
|
||||
|
||||
sidebar: [
|
||||
{
|
||||
text: 'CeruMusic',
|
||||
items: [
|
||||
{ text: '安装教程', link: '/guide/' },
|
||||
{
|
||||
text: '使用教程',
|
||||
items: [{ text: '音乐播放列表', link: '/guide/used/playList' }]
|
||||
},
|
||||
{ text: '软件设计文档', link: '/guide/design' },
|
||||
{ text: '更新日志', link: '/guide/updateLog' },
|
||||
{ text: '更新计划', link: '/guide/update' }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: '澜音&插件',
|
||||
items: [
|
||||
{ text: '插件类使用', link: '/guide/CeruMusicPluginHost' },
|
||||
{ text: '澜音插件开发文档(重点)', link: '/guide/CeruMusicPluginDev' }
|
||||
]
|
||||
},{
|
||||
text: '鸣谢名单',
|
||||
link: '/guide/sponsorship'
|
||||
}
|
||||
],
|
||||
|
||||
socialLinks: [
|
||||
{ icon: 'github', link: 'https://github.com/timeshiftsauce/CeruMusic' },
|
||||
{ icon: 'gitee', link: 'https://gitee.com/sqjcode/CeruMuisc' },
|
||||
{ icon: 'qq', link: 'https://qm.qq.com/q/IDpQnbGd06' },
|
||||
{ icon: 'beatsbydre', link: 'https://shiqianjiang.cn' },
|
||||
{ icon: 'bilibili', link: 'https://space.bilibili.com/696709986' }
|
||||
],
|
||||
footer: {
|
||||
message: 'Released under the Apache License 2.0 License.',
|
||||
copyright: `Copyright © 2025-${new Date().getFullYear()} 时迁酱`
|
||||
},
|
||||
editLink: {
|
||||
pattern: 'https://github.com/timeshiftsauce/CeruMusic/edit/main/docs/:path'
|
||||
},
|
||||
search: {
|
||||
provider: 'local'
|
||||
},
|
||||
outline: {
|
||||
level: [2, 4],
|
||||
label: '文章导航'
|
||||
},
|
||||
docFooter: {
|
||||
next: '下一篇',
|
||||
prev: '上一篇'
|
||||
},
|
||||
lastUpdatedText: '上次更新'
|
||||
},
|
||||
sitemap: {
|
||||
hostname: 'https://ceru.docs.shiqianjiang.cn'
|
||||
},
|
||||
lastUpdated: true,
|
||||
head: [['link', { rel: 'icon', href: '/logo.svg' }]]
|
||||
})
|
||||
console.log(process.env.BASE_URL_DOCS)
|
||||
// Smooth scrolling functions
|
||||
80
docs/.vitepress/theme/MyLayout.vue
Normal file
@@ -0,0 +1,80 @@
|
||||
<script setup>
|
||||
import { useRouter, useData } from 'vitepress'
|
||||
import { toggleDark } from './dark'
|
||||
import DefaultTheme from 'vitepress/theme'
|
||||
import { watch, ref } from 'vue'
|
||||
|
||||
const { route } = useRouter()
|
||||
const isTransitioning = ref(false)
|
||||
const { Layout } = DefaultTheme
|
||||
const { isDark } = useData()
|
||||
|
||||
toggleDark(isDark)
|
||||
watch(
|
||||
() => route.path,
|
||||
() => {
|
||||
isTransitioning.value = true
|
||||
// 动画结束后重置状态
|
||||
setTimeout(() => {
|
||||
isTransitioning.value = false
|
||||
}, 500) // 500ms 要和 CSS 动画时间匹配
|
||||
}
|
||||
)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Layout> </Layout>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
/* .shade {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
background-color: rgb(255, 255, 255);
|
||||
z-index: 100;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
transition: transform 0.5s ease-in-out;
|
||||
}
|
||||
|
||||
.shade-active {
|
||||
opacity: 0;
|
||||
animation: shadeAnimation 0.5s ease-in-out;
|
||||
}
|
||||
|
||||
@keyframes shadeAnimation {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
50% {
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
transform: translateY(100vh);
|
||||
}
|
||||
} */
|
||||
#VPContent.vp-doc > div {
|
||||
animation:
|
||||
rises 1s,
|
||||
looming 0.6s;
|
||||
}
|
||||
@keyframes rises {
|
||||
0% {
|
||||
transform: translateY(50px);
|
||||
}
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
@keyframes looming {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
21
docs/.vitepress/theme/dark.css
Normal file
@@ -0,0 +1,21 @@
|
||||
::view-transition-old(*) {
|
||||
animation: none;
|
||||
}
|
||||
|
||||
::view-transition-new(*) {
|
||||
animation: globalDark 0.5s ease-in;
|
||||
}
|
||||
|
||||
@keyframes globalDark {
|
||||
from {
|
||||
clip-path: circle(0% at var(--darkX) var(--darkY));
|
||||
}
|
||||
|
||||
to {
|
||||
clip-path: circle(100% at var(--darkX) var(--darkY));
|
||||
}
|
||||
}
|
||||
|
||||
.dark img {
|
||||
filter: brightness(0.8);
|
||||
}
|
||||
26
docs/.vitepress/theme/dark.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import { nextTick, provide } from 'vue'
|
||||
// 判断是否能使用 startViewTransition
|
||||
const enableTransitions = () => {
|
||||
return (
|
||||
'startViewTransition' in document &&
|
||||
window.matchMedia('(prefers-reduced-motion: no-preference)').matches
|
||||
)
|
||||
}
|
||||
// 切换动画
|
||||
export const toggleDark = (isDark: any) => {
|
||||
provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => {
|
||||
//如果不支持动效直接切换
|
||||
if (!enableTransitions()) {
|
||||
isDark.value = !isDark.value
|
||||
return
|
||||
}
|
||||
document.documentElement.style.setProperty('--darkX', x + 'px')
|
||||
document.documentElement.style.setProperty('--darkY', y + 'px')
|
||||
// 原生的视图转换动画 https://developer.mozilla.org/zh-CN/docs/Web/API/Document/startViewTransition
|
||||
// pnpm add -D @types/dom-view-transitions 解决 document.startViewTransition 类型错误的问题
|
||||
await document.startViewTransition(async () => {
|
||||
isDark.value = !isDark.value
|
||||
await nextTick()
|
||||
}).ready
|
||||
})
|
||||
}
|
||||
13
docs/.vitepress/theme/index.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import DefaultTheme from 'vitepress/theme'
|
||||
import './style.scss'
|
||||
import './dark.css'
|
||||
import MyLayout from './MyLayout.vue'
|
||||
// history.scrollRestoration = 'manual'
|
||||
|
||||
export default {
|
||||
extends: DefaultTheme,
|
||||
Layout: MyLayout,
|
||||
enhanceApp({ app, router, siteData }) {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
BIN
docs/.vitepress/theme/phycat/Cascadia-Code-Regular.ttf
Normal file
BIN
docs/.vitepress/theme/phycat/HarmonyOS_Sans_SC_Bold.woff
Normal file
BIN
docs/.vitepress/theme/phycat/HarmonyOS_Sans_SC_Regular.woff
Normal file
1176
docs/.vitepress/theme/phycat/phycat.dark.css
Normal file
1213
docs/.vitepress/theme/phycat/phycat.light.css
Normal file
287
docs/.vitepress/theme/style.scss
Normal file
@@ -0,0 +1,287 @@
|
||||
@import url(./phycat/phycat.light.css);
|
||||
@import url(./phycat/phycat.dark.css);
|
||||
/**
|
||||
* Customize default theme styling by overriding CSS variables:
|
||||
* https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css
|
||||
*/
|
||||
|
||||
/**
|
||||
* Colors
|
||||
*
|
||||
* Each colors have exact same color scale system with 3 levels of solid
|
||||
* colors with different brightness, and 1 soft color.
|
||||
*
|
||||
* - `XXX-1`: The most solid color used mainly for colored text. It must
|
||||
* satisfy the contrast ratio against when used on top of `XXX-soft`.
|
||||
*
|
||||
* - `XXX-2`: The color used mainly for hover state of the button.
|
||||
*
|
||||
* - `XXX-3`: The color for solid background, such as bg color of the button.
|
||||
* It must satisfy the contrast ratio with pure white (#ffffff) text on
|
||||
* top of it.
|
||||
*
|
||||
* - `XXX-soft`: The color used for subtle background such as custom container
|
||||
* or badges. It must satisfy the contrast ratio when putting `XXX-1` colors
|
||||
* on top of it.
|
||||
*
|
||||
* The soft color must be semi transparent alpha channel. This is crucial
|
||||
* because it allows adding multiple "soft" colors on top of each other
|
||||
* to create an accent, such as when having inline code block inside
|
||||
* custom containers.
|
||||
*
|
||||
* - `default`: The color used purely for subtle indication without any
|
||||
* special meanings attached to it such as bg color for menu hover state.
|
||||
*
|
||||
* - `brand`: Used for primary brand colors, such as link text, button with
|
||||
* brand theme, etc.
|
||||
*
|
||||
* - `tip`: Used to indicate useful information. The default theme uses the
|
||||
* brand color for this by default.
|
||||
*
|
||||
* - `warning`: Used to indicate warning to the users. Used in custom
|
||||
* container, badges, etc.
|
||||
*
|
||||
* - `danger`: Used to show error, or dangerous message to the users. Used
|
||||
* in custom container, badges, etc.
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
html.dark #app {
|
||||
--vp-nav-bg-color: #000000a7 !important;
|
||||
}
|
||||
.VPNavBar:not(.VPNavBar.top) {
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
:root {
|
||||
--vp-c-indigo-1: #14a5c2;
|
||||
--vp-c-indigo-2: #21b1ce;
|
||||
--vp-c-indigo-3: #4fcbe4;
|
||||
--vp-nav-bg-color: #ffffffa7;
|
||||
--vp-c-default-1: var(--vp-c-gray-1);
|
||||
--vp-c-default-2: var(--vp-c-gray-2);
|
||||
--vp-c-default-3: var(--vp-c-gray-3);
|
||||
--vp-c-default-soft: var(--vp-c-gray-soft);
|
||||
|
||||
--vp-c-brand-1: var(--vp-c-indigo-1);
|
||||
--vp-c-brand-2: var(--vp-c-indigo-2);
|
||||
--vp-c-brand-3: var(--vp-c-indigo-3);
|
||||
--vp-c-brand-soft: var(--vp-c-indigo-soft);
|
||||
|
||||
--vp-c-tip-1: var(--vp-c-brand-1);
|
||||
--vp-c-tip-2: var(--vp-c-brand-2);
|
||||
--vp-c-tip-3: var(--vp-c-brand-3);
|
||||
--vp-c-tip-soft: var(--vp-c-brand-soft);
|
||||
|
||||
--vp-c-warning-1: var(--vp-c-yellow-1);
|
||||
--vp-c-warning-2: var(--vp-c-yellow-2);
|
||||
--vp-c-warning-3: var(--vp-c-yellow-3);
|
||||
--vp-c-warning-soft: var(--vp-c-yellow-soft);
|
||||
|
||||
--vp-c-danger-1: var(--vp-c-red-1);
|
||||
--vp-c-danger-2: var(--vp-c-red-2);
|
||||
--vp-c-danger-3: var(--vp-c-red-3);
|
||||
--vp-c-danger-soft: var(--vp-c-red-soft);
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Button
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
:root {
|
||||
--vp-button-brand-border: transparent;
|
||||
--vp-button-brand-text: var(--vp-c-white);
|
||||
--vp-button-brand-bg: var(--vp-c-brand-3);
|
||||
--vp-button-brand-hover-border: transparent;
|
||||
--vp-button-brand-hover-text: var(--vp-c-white);
|
||||
--vp-button-brand-hover-bg: var(--vp-c-brand-2);
|
||||
--vp-button-brand-active-border: transparent;
|
||||
--vp-button-brand-active-text: var(--vp-c-white);
|
||||
--vp-button-brand-active-bg: var(--vp-c-brand-1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Home
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
:root {
|
||||
--vp-home-hero-name-color: transparent;
|
||||
--vp-home-hero-name-background: -webkit-linear-gradient(120deg, #5dd6cc 30%, #b8f1cc);
|
||||
|
||||
--vp-home-hero-image-background-image: linear-gradient(-45deg, #b8f1cf 50%, #47caff 50%);
|
||||
--vp-home-hero-image-filter: blur(44px);
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
:root {
|
||||
--vp-home-hero-image-filter: blur(56px);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 960px) {
|
||||
:root {
|
||||
--vp-home-hero-image-filter: blur(68px);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Custom Block
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
:root {
|
||||
--vp-custom-block-tip-border: transparent;
|
||||
--vp-custom-block-tip-text: var(--vp-c-text-1);
|
||||
--vp-custom-block-tip-bg: var(--vp-c-brand-soft);
|
||||
--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);
|
||||
}
|
||||
/**
|
||||
* Component: Algolia
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
.DocSearch {
|
||||
--docsearch-primary-color: var(--vp-c-brand-1) !important;
|
||||
}
|
||||
|
||||
:root {
|
||||
/* 标题后小图标,借鉴自思源笔记主题——Savor */
|
||||
--h1-r-graphic: url("data:image/svg+xml;utf8,<svg fill='rgba(74, 200, 141, 0.5)' height='24' viewBox='0 0 32 32' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M4.8 29.714v0c-1.371 0-2.514-1.143-2.514-2.514v0c0-1.371 1.143-2.514 2.514-2.514v0c1.371 0 2.514 1.143 2.514 2.514v0c0.114 1.371-1.029 2.514-2.514 2.514z'/></svg>")
|
||||
no-repeat center;
|
||||
--h2-r-graphic: url("data:image/svg+xml;utf8,<svg fill='rgba(74, 200, 141, 0.5)' height='24' viewBox='0 0 32 32' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M11.429 25.143c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM4.571 18.286c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286z'/></svg>")
|
||||
no-repeat center;
|
||||
--h3-r-graphic: url("data:image/svg+xml;utf8,<svg fill='rgba(74, 200, 141, 0.5)' height='28' viewBox='0 0 32 32' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M4.571 25.143c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM4.571 18.286c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM11.429 25.143c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286z'/></svg>")
|
||||
no-repeat center;
|
||||
--h4-r-graphic: url("data:image/svg+xml;utf8,<svg fill='rgba(74, 200, 141, 0.5)' height='24' viewBox='0 0 32 32' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M4.571 25.143c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM4.571 18.286c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM11.429 25.143c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM11.429 22.857c1.257 0 2.286-1.029 2.286-2.286s-1.029-2.286-2.286-2.286-2.286 1.029-2.286 2.286 1.029 2.286 2.286 2.286z'/></svg>")
|
||||
no-repeat center;
|
||||
--h5-r-graphic: url("data:image/svg+xml;utf8,<svg fill='rgba(74, 200, 141, 0.5)' height='24' viewBox='0 0 32 32' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M4.571 18.286c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM11.429 22.857c1.257 0 2.286-1.029 2.286-2.286s-1.029-2.286-2.286-2.286-2.286 1.029-2.286 2.286 1.029 2.286 2.286 2.286zM4.571 25.143c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM11.429 25.143c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM4.571 11.429c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286z'/></svg>")
|
||||
no-repeat center;
|
||||
--h6-r-graphic: url("data:image/svg+xml;utf8,<svg fill='rgba(74, 200, 141, 0.5)' height='24' viewBox='0 0 32 32' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M4.571 25.143c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM4.571 18.286c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM4.571 11.429c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM11.429 18.286c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM11.429 25.143c-1.257 0-2.286 1.029-2.286 2.286s1.029 2.286 2.286 2.286 2.286-1.029 2.286-2.286-1.029-2.286-2.286-2.286zM11.429 16c1.257 0 2.286-1.029 2.286-2.286s-1.029-2.286-2.286-2.286-2.286 1.029-2.286 2.286 1.029 2.286 2.286 2.286z'/></svg>")
|
||||
no-repeat center;
|
||||
|
||||
/* 是否开启网格背景?1 是;0 否 */
|
||||
--bg-grid: 1;
|
||||
|
||||
/* 已完成的代办事项是否显示删除线?1 是;0 否 */
|
||||
--check-line: 1;
|
||||
|
||||
/* 自动编号格式设置 无需自动编号可全部注释掉或部分注释掉*/
|
||||
// --autonum-h1: counter(h1) ". ";
|
||||
// --autonum-h2: counter(h1) "." counter(h2) ". ";
|
||||
// --autonum-h3: counter(h1) "." counter(h2) "." counter(h3) ". ";
|
||||
// --autonum-h4: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) ". ";
|
||||
// --autonum-h5: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) ". ";
|
||||
// --autonum-h6: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) "." counter(h6) ". ";
|
||||
|
||||
/* 下面是文章内Toc目录自动编号,与上面一样即可 */
|
||||
// --autonum-h1toc: counter(h1toc) ". ";
|
||||
// --autonum-h2toc: counter(h1toc) "." counter(h2toc) ". ";
|
||||
// --autonum-h3toc: counter(h1toc) "." counter(h2toc) "." counter(h3toc) ". ";
|
||||
// --autonum-h4toc: counter(h1toc) "." counter(h2toc) "." counter(h3toc) "." counter(h4toc) ". ";
|
||||
// --autonum-h5toc: counter(h1toc) "." counter(h2toc) "." counter(h3toc) "." counter(h4toc) "." counter(h5toc) ". ";
|
||||
// --autonum-h6toc: counter(h1toc) "." counter(h2toc) "." counter(h3toc) "." counter(h4toc) "." counter(h5toc) "." counter(h6toc) ". ";
|
||||
|
||||
/* 主题颜色 */
|
||||
|
||||
--head-title-color: #3db8bf;
|
||||
/* 标题主色 */
|
||||
--head-title-h2-color: #fff;
|
||||
--head-title-h2-background: linear-gradient(to right, #3db8d3, #80f7c4);
|
||||
/* 二级标题主色,因为二级标题是背景色的,所以单独设置 */
|
||||
|
||||
--element-color: #3db8bf;
|
||||
/* 元素主色 */
|
||||
--element-color-deep: #089ba3;
|
||||
/* 元素深色 */
|
||||
--element-color-shallow: #7aeaf0;
|
||||
/* 元素浅色 */
|
||||
--element-color-so-shallow: #7aeaf077;
|
||||
/* 元素很浅色 */
|
||||
--element-color-soo-shallow: #7aeaf018;
|
||||
/* 元素非常浅色 */
|
||||
|
||||
--element-color-linecode: #089ba3;
|
||||
/* 行内代码文字色 */
|
||||
--element-color-linecode-background: #7aeaf018;
|
||||
/* 行内代码背景色 */
|
||||
|
||||
/* 程序本体UI */
|
||||
--appui-color: #3db8bf;
|
||||
/* 程序UI主题色 */
|
||||
--appui-color-icon: #3db8bf;
|
||||
/* 程序UI图标颜色 */
|
||||
--appui-color-text: #333;
|
||||
/* 程序UI文字色 */
|
||||
--primary-color: #3db8bf;
|
||||
}
|
||||
* {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
/**
|
||||
* 黑暗模式切换动画
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
#VPContent .vp-doc > div {
|
||||
animation:
|
||||
rises 1s,
|
||||
looming 1s;
|
||||
}
|
||||
|
||||
@keyframes rises {
|
||||
0% {
|
||||
transform: translateY(50px);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes looming {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.3;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.vp-doc li div[class*='language-'] {
|
||||
margin: 12px;
|
||||
}
|
||||
html.dark .vp-doc div[class*='language-'],
|
||||
html.dark .vp-doc div[class*='language-'] pre {
|
||||
background-color: #222222;
|
||||
}
|
||||
html .vp-doc div[class*='language-'],
|
||||
html .vp-doc div[class*='language-'] pre {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
#app div[class^='language'] {
|
||||
border-radius: 1em;
|
||||
overflow: hidden;
|
||||
padding: 0.4em;
|
||||
}
|
||||
|
||||
.vp-doc {
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
p {
|
||||
margin-top: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
}
|
||||
// .VPDoc,
|
||||
// .VPDoc .container > .content {
|
||||
// padding: 0 !important;
|
||||
// }
|
||||
.vp-doc li {
|
||||
position: relative;
|
||||
}
|
||||
.VPDoc.has-aside .content-container {
|
||||
max-width: none !important;
|
||||
}
|
||||
@@ -1,381 +0,0 @@
|
||||
# CeruMusic 插件开发文档
|
||||
|
||||
## 概述
|
||||
|
||||
本文档介绍如何为 CeruMusic 开发音乐源插件。CeruMusic 插件是运行在沙箱环境中的 JavaScript 模块,用于从各种音乐平台获取音乐资源。
|
||||
|
||||
## 插件结构
|
||||
|
||||
### 基本结构
|
||||
|
||||
每个 CeruMusic 插件必须导出以下三个核心组件:
|
||||
|
||||
```javascript
|
||||
module.exports = {
|
||||
pluginInfo, // 插件信息
|
||||
sources, // 支持的音源
|
||||
musicUrl // 获取音乐链接的函数
|
||||
}
|
||||
```
|
||||
|
||||
# 完整示例
|
||||
|
||||
```javascript
|
||||
/**
|
||||
* 示例音乐插件
|
||||
* @author 开发者名称
|
||||
* @version 1.0.0
|
||||
*/
|
||||
|
||||
// 1. 插件信息
|
||||
const pluginInfo = {
|
||||
name: '示例音源插件',
|
||||
version: '1.0.0',
|
||||
author: '开发者名称',
|
||||
description: '这是一个示例音乐源插件'
|
||||
}
|
||||
|
||||
// 2. 支持的音源配置
|
||||
const sources = {
|
||||
demo: {
|
||||
name: '示例音源',
|
||||
type: 'music',
|
||||
qualitys: ['128k', '320k', 'flac']
|
||||
},
|
||||
demo2: {
|
||||
name: '示例音源2',
|
||||
type: 'music',
|
||||
qualitys: ['128k', '320k']
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 获取音乐URL的核心函数
|
||||
async function musicUrl(source, musicInfo, quality) {
|
||||
// 从 cerumusic 对象获取 API
|
||||
const { request, env, version } = cerumusic
|
||||
|
||||
// 构建请求参数
|
||||
const songId = musicInfo.hash ?? musicInfo.songmid
|
||||
const apiUrl = `https://api.example.com/music/${source}/${songId}/${quality}`
|
||||
|
||||
console.log(`[${pluginInfo.name}] 请求音乐链接: ${apiUrl}`)
|
||||
|
||||
// 发起网络请求
|
||||
const { body, statusCode } = await request(apiUrl, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'User-Agent': `cerumusic-${env}/${version}`
|
||||
}
|
||||
})
|
||||
|
||||
// 处理响应
|
||||
if (statusCode !== 200 || body.code !== 200) {
|
||||
const errorMessage = body.msg || `接口错误 (HTTP: ${statusCode})`
|
||||
console.error(`[${pluginInfo.name}] Error: ${errorMessage}`)
|
||||
throw new Error(errorMessage)
|
||||
}
|
||||
|
||||
console.log(`[${pluginInfo.name}] 获取成功: ${body.url}`)
|
||||
return body.url
|
||||
}
|
||||
|
||||
// 4. 可选:获取封面图片
|
||||
async function getPic(source, musicInfo) {
|
||||
const { request } = cerumusic
|
||||
const songId = musicInfo.hash ?? musicInfo.songmid
|
||||
|
||||
const { body } = await request(`https://api.example.com/pic/${source}/${songId}`)
|
||||
return body.picUrl
|
||||
}
|
||||
|
||||
// 5. 可选:获取歌词
|
||||
async function getLyric(source, musicInfo) {
|
||||
const { request } = cerumusic
|
||||
const songId = musicInfo.hash ?? musicInfo.songmid
|
||||
|
||||
const { body } = await request(`https://api.example.com/lyric/${source}/${songId}`)
|
||||
return body.lyric
|
||||
}
|
||||
|
||||
// 导出插件
|
||||
module.exports = {
|
||||
pluginInfo,
|
||||
sources,
|
||||
musicUrl,
|
||||
getPic, // 可选
|
||||
getLyric // 可选
|
||||
}
|
||||
```
|
||||
|
||||
## 详细说明
|
||||
|
||||
### 1. pluginInfo 对象
|
||||
|
||||
插件的基本信息,必须包含以下字段:
|
||||
|
||||
```javascript
|
||||
const pluginInfo = {
|
||||
name: '插件名称', // 必需:插件显示名称
|
||||
version: '1.0.0', // 必需:版本号
|
||||
author: '作者名', // 必需:作者信息
|
||||
description: '插件描述' // 必需:功能描述
|
||||
}
|
||||
```
|
||||
|
||||
### 2. sources 对象
|
||||
|
||||
定义插件支持的音源,键为音源标识,值为音源配置:
|
||||
|
||||
```javascript
|
||||
const sources = {
|
||||
// 音源标识(用于API调用)
|
||||
source_id: {
|
||||
name: '音源显示名称', // 必需:用户看到的名称
|
||||
type: 'music', // 必需:固定为 'music'
|
||||
qualitys: [
|
||||
// 必需:支持的音质列表
|
||||
'128k', // 标准音质
|
||||
'320k', // 高音质
|
||||
'flac', // 无损音质
|
||||
'flac24bit', // 24位无损
|
||||
'hires' // 高解析度
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. musicUrl 函数
|
||||
|
||||
获取音乐播放链接的核心函数:
|
||||
|
||||
```javascript
|
||||
async function musicUrl(source, musicInfo, quality) {
|
||||
// source: 音源标识(sources 对象的键)
|
||||
// musicInfo: 歌曲信息对象
|
||||
// quality: 请求的音质
|
||||
// 返回: Promise<string> - 音乐播放链接
|
||||
}
|
||||
```
|
||||
|
||||
#### musicInfo 对象结构
|
||||
|
||||
```javascript
|
||||
const musicInfo = {
|
||||
songmid: '歌曲ID', // 歌曲标识符
|
||||
hash: '歌曲哈希', // 备用标识符
|
||||
title: '歌曲标题', // 歌曲名称
|
||||
artist: '艺术家', // 演唱者
|
||||
album: '专辑名' // 专辑信息
|
||||
// ... 其他可能的字段
|
||||
}
|
||||
```
|
||||
|
||||
## 可用 API
|
||||
|
||||
### cerumusic 对象
|
||||
|
||||
插件运行时可以访问 `cerumusic` 全局对象:
|
||||
|
||||
```javascript
|
||||
const { request, env, version, utils } = cerumusic
|
||||
```
|
||||
|
||||
#### request 函数
|
||||
|
||||
用于发起 HTTP 请求:
|
||||
|
||||
```javascript
|
||||
// Promise 模式
|
||||
const response = await request(url, options)
|
||||
|
||||
// Callback 模式
|
||||
request(url, options, (error, response) => {
|
||||
if (error) {
|
||||
console.error('请求失败:', error)
|
||||
return
|
||||
}
|
||||
console.log('响应:', response)
|
||||
})
|
||||
```
|
||||
|
||||
**参数说明:**
|
||||
|
||||
- `url` (string): 请求地址
|
||||
- `options` (Object): 请求选项
|
||||
- `method`: HTTP 方法 ('GET', 'POST', 等)
|
||||
- `headers`: 请求头对象
|
||||
- `body`: 请求体(POST 请求时)
|
||||
|
||||
**响应格式:**
|
||||
|
||||
```javascript
|
||||
{
|
||||
body: {}, // 解析后的响应体
|
||||
statusCode: 200, // HTTP 状态码
|
||||
headers: {} // 响应头
|
||||
}
|
||||
```
|
||||
|
||||
#### utils 对象
|
||||
|
||||
提供实用工具函数:
|
||||
|
||||
```javascript
|
||||
const { utils } = cerumusic
|
||||
|
||||
// Buffer 操作
|
||||
const buffer = utils.buffer.from('hello', 'utf8')
|
||||
const string = utils.buffer.bufToString(buffer, 'utf8')
|
||||
```
|
||||
|
||||
## 错误处理
|
||||
|
||||
### 最佳实践
|
||||
|
||||
1. **总是检查 API 响应状态**
|
||||
|
||||
```javascript
|
||||
if (statusCode !== 200 || body.code !== 200) {
|
||||
throw new Error(`请求失败: ${body.msg || '未知错误'}`)
|
||||
}
|
||||
```
|
||||
|
||||
2. **提供有意义的错误信息**
|
||||
|
||||
```javascript
|
||||
console.error(`[${pluginInfo.name}] Error: ${errorMessage}`)
|
||||
throw new Error(errorMessage)
|
||||
```
|
||||
|
||||
3. **处理网络异常**
|
||||
```javascript
|
||||
try {
|
||||
const response = await request(url, options)
|
||||
// 处理响应
|
||||
} catch (error) {
|
||||
console.error(`[${pluginInfo.name}] 网络请求失败:`, error.message)
|
||||
throw new Error(`网络错误: ${error.message}`)
|
||||
}
|
||||
```
|
||||
|
||||
### 常见错误类型
|
||||
|
||||
- **网络错误**: 无法连接到 API 服务器
|
||||
- **认证错误**: API 密钥无效或过期
|
||||
- **参数错误**: 请求参数格式不正确
|
||||
- **资源不存在**: 请求的歌曲不存在
|
||||
- **限流错误**: 请求过于频繁
|
||||
|
||||
## 事件驱动插件
|
||||
|
||||
对于使用 `lx.on(EVENT_NAMES.request)` 模式的插件,可以使用转换器:
|
||||
|
||||
```javascript
|
||||
// 使用转换器转换事件驱动插件
|
||||
node converter-event-driven.js input-plugin.js output-plugin.js
|
||||
```
|
||||
|
||||
转换后的插件将兼容 CeruMusicPluginHost。
|
||||
|
||||
## 调试技巧
|
||||
|
||||
### 1. 使用 console.log
|
||||
|
||||
```javascript
|
||||
console.log(`[${pluginInfo.name}] 调试信息:`, data)
|
||||
console.error(`[${pluginInfo.name}] 错误:`, error)
|
||||
```
|
||||
|
||||
### 2. 检查请求和响应
|
||||
|
||||
```javascript
|
||||
console.log('请求URL:', url)
|
||||
console.log('请求选项:', options)
|
||||
console.log('响应状态:', statusCode)
|
||||
console.log('响应内容:', body)
|
||||
```
|
||||
|
||||
### 3. 测试插件
|
||||
|
||||
创建测试文件:
|
||||
|
||||
```javascript
|
||||
const CeruMusicPluginHost = require('./CeruMusicPluginHost')
|
||||
|
||||
async function testPlugin() {
|
||||
const host = new CeruMusicPluginHost()
|
||||
await host.loadPlugin('./my-plugin.js')
|
||||
|
||||
const musicInfo = {
|
||||
songmid: 'test123',
|
||||
title: '测试歌曲'
|
||||
}
|
||||
|
||||
try {
|
||||
const url = await host.getMusicUrl('demo', musicInfo, '320k')
|
||||
console.log('成功获取URL:', url)
|
||||
} catch (error) {
|
||||
console.error('测试失败:', error.message)
|
||||
}
|
||||
}
|
||||
|
||||
testPlugin()
|
||||
```
|
||||
|
||||
## 发布和分发
|
||||
|
||||
### 文件结构
|
||||
|
||||
```
|
||||
my-plugin/
|
||||
├── plugin.js # 主插件文件
|
||||
├── package.json # 包信息(可选)
|
||||
├── README.md # 说明文档
|
||||
└── test.js # 测试文件(可选)
|
||||
```
|
||||
|
||||
### 版本管理
|
||||
|
||||
遵循语义化版本规范:
|
||||
|
||||
- `1.0.0` - 主版本.次版本.修订版本
|
||||
- 主版本:不兼容的 API 修改
|
||||
- 次版本:向下兼容的功能性新增
|
||||
- 修订版本:向下兼容的问题修正
|
||||
|
||||
## 示例插件
|
||||
|
||||
查看项目中的示例:
|
||||
|
||||
- `example-plugin.js` - 基础插件示例
|
||||
- `plugin.js` - 事件驱动插件示例
|
||||
- `fm.js` - 复杂插件示例
|
||||
|
||||
## 常见问题
|
||||
|
||||
**Q: 如何处理需要登录的 API?**
|
||||
|
||||
A: 在请求头中添加认证信息,或使用 Cookie。
|
||||
|
||||
**Q: 如何处理加密的 API 响应?**
|
||||
|
||||
A: 在插件中实现解密逻辑,使用 `utils` 对象提供的工具函数。
|
||||
|
||||
**Q: 插件可以访问文件系统吗?**
|
||||
|
||||
A: 不可以,插件运行在受限的沙箱环境中,无法直接访问文件系统。
|
||||
|
||||
**Q: 如何优化插件性能?**
|
||||
|
||||
A: 减少不必要的网络请求,使用适当的缓存策略,避免阻塞操作。
|
||||
|
||||
## 贡献指南
|
||||
|
||||
1. Fork 项目仓库
|
||||
2. 创建功能分支
|
||||
3. 编写插件代码和测试
|
||||
4. 提交 Pull Request
|
||||
5. 等待代码审查
|
||||
|
||||
欢迎贡献新的音源插件!
|
||||
BIN
docs/assets/3f50d3b838287b4bf1523d0f955fdf37.png
Normal file
|
After Width: | Height: | Size: 173 KiB |
BIN
docs/assets/head.jpg
Normal file
|
After Width: | Height: | Size: 202 KiB |
BIN
docs/assets/image-20250826214921963.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
docs/assets/image-20250826215101522.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
docs/assets/image-20250826215206862.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
docs/assets/image-20250826215251525.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
docs/assets/image-20250826221438856.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
docs/assets/image-20250826221517247.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
docs/assets/image-20250827175023917.png
Normal file
|
After Width: | Height: | Size: 719 KiB |
BIN
docs/assets/image-20250827175109430.png
Normal file
|
After Width: | Height: | Size: 981 KiB |
BIN
docs/assets/image-20250827175356006.png
Normal file
|
After Width: | Height: | Size: 167 KiB |
BIN
docs/assets/image-20250827175547444.png
Normal file
|
After Width: | Height: | Size: 290 KiB |
BIN
docs/assets/image-20250827181535681.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
docs/assets/image-20250827181604432.png
Normal file
|
After Width: | Height: | Size: 528 KiB |
BIN
docs/assets/image-20250827181634134.png
Normal file
|
After Width: | Height: | Size: 528 KiB |
10
docs/assets/logo.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<svg width="1200" height="1200" viewBox="0 0 1200 1200" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="1200" height="1200" rx="379" fill="white"/>
|
||||
<path d="M957.362 204.197C728.535 260.695 763.039 192.264 634.41 175.368C451.817 151.501 504.125 315.925 504.125 315.925L630.545 673.497C591.211 654.805 544.287 643.928 494.188 643.928C353.275 643.928 239 729.467 239 834.964C239 940.567 353.137 1026 494.188 1026C635.1 1026 749.375 940.461 749.375 834.964C749.375 832.218 749.237 829.473 749.099 826.727C749.513 825.988 749.789 825.143 750.065 824.087C757.932 789.449 634.272 348.345 634.272 348.345C634.272 348.345 764.971 401.886 860.89 351.936C971.163 294.699 964.953 202.402 957.362 204.197Z" fill="url(#paint0_linear_4_16)" stroke="#29293A" stroke-opacity="0.23"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_4_16" x1="678.412" y1="-1151.29" x2="796.511" y2="832.071" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.572115" stop-color="#B8F1ED"/>
|
||||
<stop offset="0.9999" stop-color="#B8F1CC"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -1,225 +0,0 @@
|
||||
# 音频发布-订阅模式使用指南
|
||||
|
||||
## 概述
|
||||
|
||||
这个改进的发布-订阅模式解决了原有实现中无法单个删除订阅者的问题。新的实现提供了以下特性:
|
||||
|
||||
- ✅ 支持单个订阅者的精确取消
|
||||
- ✅ 自动生成唯一订阅ID
|
||||
- ✅ 类型安全的事件系统
|
||||
- ✅ 错误处理和日志记录
|
||||
- ✅ 内存泄漏防护
|
||||
|
||||
## 核心特性
|
||||
|
||||
### 1. 精确的订阅管理
|
||||
|
||||
每个订阅都会返回一个取消订阅函数,调用该函数即可精确取消对应的订阅:
|
||||
|
||||
```typescript
|
||||
// 订阅事件
|
||||
const unsubscribe = audioStore.subscribe('ended', () => {
|
||||
console.log('音频播放结束')
|
||||
})
|
||||
|
||||
// 取消订阅
|
||||
unsubscribe()
|
||||
```
|
||||
|
||||
### 2. 支持的事件类型
|
||||
|
||||
- `ended`: 音频播放结束
|
||||
- `seeked`: 音频拖拽完成
|
||||
- `timeupdate`: 音频时间更新
|
||||
- `play`: 音频开始播放
|
||||
- `pause`: 音频暂停播放
|
||||
|
||||
### 3. 类型安全
|
||||
|
||||
所有的事件类型和回调函数都有完整的TypeScript类型定义,确保编译时类型检查。
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 基础订阅
|
||||
|
||||
```typescript
|
||||
import { ControlAudioStore } from '@renderer/store/ControlAudio'
|
||||
|
||||
const audioStore = ControlAudioStore()
|
||||
|
||||
// 订阅播放结束事件
|
||||
const unsubscribeEnded = audioStore.subscribe('ended', () => {
|
||||
console.log('音频播放结束了')
|
||||
})
|
||||
|
||||
// 订阅时间更新事件
|
||||
const unsubscribeTimeUpdate = audioStore.subscribe('timeupdate', () => {
|
||||
console.log('当前时间:', audioStore.Audio.currentTime)
|
||||
})
|
||||
```
|
||||
|
||||
### 在Vue组件中使用
|
||||
|
||||
```vue
|
||||
<script setup lang="ts">
|
||||
import { inject, onMounted, onUnmounted } from 'vue'
|
||||
import type { AudioSubscribeMethod, UnsubscribeFunction } from '@renderer/types/audio'
|
||||
|
||||
// 注入订阅方法
|
||||
const audioSubscribe = inject<AudioSubscribeMethod>('audioSubscribe')
|
||||
|
||||
// 存储取消订阅函数
|
||||
const unsubscribeFunctions: UnsubscribeFunction[] = []
|
||||
|
||||
onMounted(() => {
|
||||
if (!audioSubscribe) return
|
||||
|
||||
// 订阅多个事件
|
||||
unsubscribeFunctions.push(
|
||||
audioSubscribe('play', () => console.log('开始播放')),
|
||||
audioSubscribe('pause', () => console.log('暂停播放')),
|
||||
audioSubscribe('ended', () => console.log('播放结束'))
|
||||
)
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
// 组件卸载时取消所有订阅
|
||||
unsubscribeFunctions.forEach((unsubscribe) => unsubscribe())
|
||||
})
|
||||
</script>
|
||||
```
|
||||
|
||||
### 条件订阅和取消
|
||||
|
||||
```typescript
|
||||
let endedUnsubscribe: UnsubscribeFunction | null = null
|
||||
|
||||
// 条件订阅
|
||||
const subscribeToEnded = () => {
|
||||
if (!endedUnsubscribe) {
|
||||
endedUnsubscribe = audioStore.subscribe('ended', handleAudioEnded)
|
||||
}
|
||||
}
|
||||
|
||||
// 条件取消订阅
|
||||
const unsubscribeFromEnded = () => {
|
||||
if (endedUnsubscribe) {
|
||||
endedUnsubscribe()
|
||||
endedUnsubscribe = null
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 高级功能
|
||||
|
||||
### 批量管理订阅
|
||||
|
||||
```typescript
|
||||
// 清空特定事件的所有订阅者
|
||||
audioStore.clearEventSubscribers('ended')
|
||||
|
||||
// 清空所有事件的所有订阅者
|
||||
audioStore.clearAllSubscribers()
|
||||
```
|
||||
|
||||
### 错误处理
|
||||
|
||||
系统内置了错误处理机制,如果某个回调函数执行出错,不会影响其他订阅者:
|
||||
|
||||
```typescript
|
||||
audioStore.subscribe('ended', () => {
|
||||
throw new Error('这个错误不会影响其他订阅者')
|
||||
})
|
||||
|
||||
audioStore.subscribe('ended', () => {
|
||||
console.log('这个回调仍然会正常执行')
|
||||
})
|
||||
```
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 及时清理订阅
|
||||
|
||||
```typescript
|
||||
// ✅ 好的做法:组件卸载时清理
|
||||
onUnmounted(() => {
|
||||
unsubscribeFunctions.forEach((unsubscribe) => unsubscribe())
|
||||
})
|
||||
|
||||
// ❌ 不好的做法:忘记清理,可能导致内存泄漏
|
||||
```
|
||||
|
||||
### 2. 使用数组管理多个订阅
|
||||
|
||||
```typescript
|
||||
// ✅ 好的做法:统一管理
|
||||
const unsubscribeFunctions: UnsubscribeFunction[] = []
|
||||
|
||||
unsubscribeFunctions.push(
|
||||
audioStore.subscribe('play', handlePlay),
|
||||
audioStore.subscribe('pause', handlePause)
|
||||
)
|
||||
|
||||
// 统一清理
|
||||
unsubscribeFunctions.forEach((fn) => fn())
|
||||
```
|
||||
|
||||
### 3. 避免在高频事件中执行重操作
|
||||
|
||||
```typescript
|
||||
// ❌ 不好的做法:在timeupdate中执行重操作
|
||||
audioStore.subscribe('timeupdate', () => {
|
||||
// 这会每秒执行多次,影响性能
|
||||
updateComplexUI()
|
||||
})
|
||||
|
||||
// ✅ 好的做法:使用节流或防抖
|
||||
let lastUpdate = 0
|
||||
audioStore.subscribe('timeupdate', () => {
|
||||
const now = Date.now()
|
||||
if (now - lastUpdate > 100) {
|
||||
// 限制更新频率
|
||||
updateUI()
|
||||
lastUpdate = now
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
## 迁移指南
|
||||
|
||||
### 从旧版本迁移
|
||||
|
||||
旧版本:
|
||||
|
||||
```typescript
|
||||
// 旧的实现方式
|
||||
provide('setAudioEnd', setEndCallback)
|
||||
|
||||
function setEndCallback(fn: Function): void {
|
||||
endCallback.push(fn)
|
||||
}
|
||||
```
|
||||
|
||||
新版本:
|
||||
|
||||
```typescript
|
||||
// 新的实现方式
|
||||
provide('audioSubscribe', audioStore.subscribe)
|
||||
|
||||
// 使用时
|
||||
const unsubscribe = audioSubscribe('ended', () => {
|
||||
// 处理播放结束
|
||||
})
|
||||
|
||||
// 可以精确取消
|
||||
unsubscribe()
|
||||
```
|
||||
|
||||
## 性能优化
|
||||
|
||||
1. **避免重复订阅**:在订阅前检查是否已经订阅
|
||||
2. **及时取消订阅**:组件卸载或不再需要时立即取消
|
||||
3. **合理使用事件**:避免在高频事件中执行重操作
|
||||
4. **批量操作**:需要清理多个订阅时使用批量清理方法
|
||||
|
||||
这个改进的发布-订阅模式为Ceru Music应用提供了更加灵活和可靠的音频事件管理机制。
|
||||
681
docs/guide/CeruMusicPluginDev.md
Normal file
@@ -0,0 +1,681 @@
|
||||
# CeruMusic 插件开发指南
|
||||
|
||||
## 概述
|
||||
|
||||
CeruMusic 支持两种类型的插件:
|
||||
|
||||
1. **CeruMusic 原生插件**:基于 CeruMusic API 的插件格式
|
||||
2. **LX 兼容插件**:兼容 LX Music 的事件驱动插件格式
|
||||
|
||||
本文档将详细介绍如何开发这两种类型的插件。
|
||||
|
||||
## 文件要求
|
||||
|
||||
- **编码格式**:UTF-8
|
||||
- **编程语言**:JavaScript (支持 ES6+ 语法)
|
||||
- **文件扩展名**:`.js`
|
||||
|
||||
## 插件信息注释
|
||||
|
||||
所有插件文件的开头必须包含以下注释格式:
|
||||
|
||||
```javascript
|
||||
/**
|
||||
* @name 插件名称
|
||||
* @description 插件描述
|
||||
* @version 1.0.0
|
||||
* @author 作者名称
|
||||
* @homepage https://example.com
|
||||
*/
|
||||
```
|
||||
|
||||
### 注释字段说明
|
||||
|
||||
- `@name`:插件名称,建议不超过 24 个字符
|
||||
- `@description`:插件描述,建议不超过 36 个字符(可选)
|
||||
- `@version`:版本号(可选)
|
||||
- `@author`:作者名称(可选)
|
||||
- `@homepage`:主页地址(可选)
|
||||
|
||||
---
|
||||
|
||||
## CeruMusic 原生插件开发
|
||||
|
||||
首先 `澜音` 插件是面向 方法的 这意味着你直接导出方法即可为播放器提供音源
|
||||
|
||||
### 基本结构
|
||||
|
||||
```javascript
|
||||
/**
|
||||
* @name 示例音乐源
|
||||
* @description CeruMusic 原生插件示例
|
||||
* @version 1.0.0
|
||||
* @author CeruMusic Team
|
||||
*/
|
||||
|
||||
// 插件信息
|
||||
const pluginInfo = {
|
||||
name: "示例音乐源",
|
||||
version: "1.0.0",
|
||||
author: "CeruMusic Team",
|
||||
description: "这是一个示例插件"
|
||||
};
|
||||
|
||||
// 支持的音源配置
|
||||
const sources = {
|
||||
kw:{
|
||||
name: "酷我音乐",
|
||||
qualities: ['128k', '320k', 'flac', 'flac24bit']
|
||||
},
|
||||
tx:{
|
||||
name: "QQ音乐",
|
||||
qualities: ['128k', '320k', 'flac']
|
||||
}
|
||||
};
|
||||
|
||||
// 获取音乐链接的主要方法
|
||||
async function musicUrl(source, musicInfo, quality) {
|
||||
try {
|
||||
// 使用 cerumusic API 发送 HTTP 请求
|
||||
const result = await cerumusic.request('https://api.example.com/music', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
...你的其他参数 可以 是密钥或者其他...
|
||||
},
|
||||
body: JSON.stringify({
|
||||
id: musicInfo.id,
|
||||
quality: quality
|
||||
})
|
||||
});
|
||||
|
||||
if (result.statusCode === 200 && result.body.url) {
|
||||
return result.body.url;
|
||||
} else {
|
||||
throw new Error('获取音乐链接失败');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取音乐链接时发生错误:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// 获取歌曲封面(可选)
|
||||
async function getPic(source, musicInfo) {
|
||||
try {
|
||||
const result = await cerumusic.request(`https://api.example.com/pic/${musicInfo.id}`);
|
||||
return result.body.picUrl;
|
||||
} catch (error) {
|
||||
throw new Error('获取封面失败: ' + error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// 获取歌词(可选)
|
||||
async function getLyric(source, musicInfo) {
|
||||
try {
|
||||
const result = await cerumusic.request(`https://api.example.com/lyric/${musicInfo.id}`);
|
||||
return result.body.lyric;
|
||||
} catch (error) {
|
||||
throw new Error('获取歌词失败: ' + error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// 导出插件
|
||||
module.exports = {
|
||||
pluginInfo,
|
||||
sources,
|
||||
musicUrl,
|
||||
getPic, // 可选
|
||||
getLyric // 可选
|
||||
};
|
||||
```
|
||||
|
||||
> #### PS:
|
||||
>
|
||||
> - `sources key` 取值
|
||||
> - wy 网易云音乐 |
|
||||
> - tx QQ音乐 |
|
||||
> - kg 酷狗音乐 |
|
||||
> - mg 咪咕音乐 |
|
||||
> - kw 酷我音乐
|
||||
>
|
||||
> - 导出
|
||||
>
|
||||
> ```javascript
|
||||
> module.exports = {
|
||||
> sources // 你的音源支持
|
||||
> }
|
||||
> ```
|
||||
>
|
||||
> - 支持的音质 ` sources.qualities: ['128k', '320k', 'flac']`
|
||||
> - `128k`: 128kbps
|
||||
> - `320k`: 320kbps
|
||||
> - `flac`: FLAC 无损
|
||||
> - `flac24bit`: 24bit FLAC
|
||||
> - `hires`: Hi-Res 高解析度
|
||||
> - `atmos`: 杜比全景声
|
||||
> - `master`: 母带音质
|
||||
|
||||
### CeruMusic API 参考
|
||||
|
||||
#### cerumusic.request(url, options)
|
||||
|
||||
HTTP 请求方法,返回 Promise。
|
||||
|
||||
**参数:**
|
||||
|
||||
- `url` (string): 请求地址
|
||||
- `options` (object): 请求选项
|
||||
- `method`: 请求方法 (GET, POST, PUT, DELETE 等)
|
||||
- `headers`: 请求头对象
|
||||
- `body`: 请求体
|
||||
- `timeout`: 超时时间(毫秒)
|
||||
|
||||
**返回值:**
|
||||
|
||||
```javascript
|
||||
{
|
||||
statusCode: 200,
|
||||
headers: {...},
|
||||
body: {...} // 自动解析的响应体
|
||||
}
|
||||
```
|
||||
|
||||
#### cerumusic.utils
|
||||
|
||||
工具方法集合:
|
||||
|
||||
```javascript
|
||||
// Buffer 操作
|
||||
cerumusic.utils.buffer.from(data, encoding)
|
||||
cerumusic.utils.buffer.bufToString(buffer, encoding)
|
||||
|
||||
// 加密工具
|
||||
cerumusic.utils.crypto.md5(str)
|
||||
cerumusic.utils.crypto.randomBytes(size)
|
||||
cerumusic.utils.crypto.aesEncrypt(data, mode, key, iv)
|
||||
cerumusic.utils.crypto.rsaEncrypt(data, key)
|
||||
```
|
||||
|
||||
#### cerumusic.NoticeCenter(type, data)
|
||||
|
||||
发送通知到用户界面:
|
||||
|
||||
```javascript
|
||||
cerumusic.NoticeCenter('info', {
|
||||
title: '通知标题',
|
||||
content: '通知内容',
|
||||
url: 'https://example.com', // 可选 当通知为update 版本跟新可传
|
||||
version: '版本号', // 当通知为update 版本跟新可传
|
||||
pluginInfo: {
|
||||
name: '插件名称',
|
||||
type: 'cr' // 固定唯一标识
|
||||
} // 当通知为update 版本跟新可传
|
||||
})
|
||||
```
|
||||
|
||||
**通知类型:**
|
||||
|
||||
- `'info'`: 信息通知
|
||||
- `'success'`: 成功通知
|
||||
- `'warn'`: 警告通知
|
||||
- `'error'`: 错误通知
|
||||
- `'update'`: 更新通知
|
||||
|
||||
---
|
||||
|
||||
## LX 兼容插件开发 引用于落雪官网改编
|
||||
|
||||
CeruMusic 完全兼容 LX Music 的插件格式,支持事件驱动的开发模式。
|
||||
|
||||
### 基本结构
|
||||
|
||||
```javascript
|
||||
/**
|
||||
* @name 测试音乐源
|
||||
* @description 我只是一个测试音乐源哦
|
||||
* @version 1.0.0
|
||||
* @author xxx
|
||||
* @homepage http://xxx
|
||||
*/
|
||||
|
||||
const { EVENT_NAMES, request, on, send } = globalThis.lx
|
||||
|
||||
// 音质配置
|
||||
const qualitys = {
|
||||
kw: {
|
||||
'128k': '128',
|
||||
'320k': '320',
|
||||
flac: 'flac',
|
||||
flac24bit: 'flac24bit'
|
||||
},
|
||||
local: {}
|
||||
}
|
||||
|
||||
// HTTP 请求封装
|
||||
const httpRequest = (url, options) =>
|
||||
new Promise((resolve, reject) => {
|
||||
request(url, options, (err, resp) => {
|
||||
if (err) return reject(err)
|
||||
resolve(resp.body)
|
||||
})
|
||||
})
|
||||
|
||||
// API 实现
|
||||
const apis = {
|
||||
kw: {
|
||||
musicUrl({ songmid }, quality) {
|
||||
return httpRequest('http://xxx').then((data) => {
|
||||
return data.url
|
||||
})
|
||||
}
|
||||
},
|
||||
local: {
|
||||
musicUrl(info) {
|
||||
return httpRequest('http://xxx').then((data) => {
|
||||
return data.url
|
||||
})
|
||||
},
|
||||
pic(info) {
|
||||
return httpRequest('http://xxx').then((data) => {
|
||||
return data.url
|
||||
})
|
||||
},
|
||||
lyric(info) {
|
||||
return httpRequest('http://xxx').then((data) => {
|
||||
return {
|
||||
lyric: '...', // 歌曲歌词
|
||||
tlyric: '...', // 翻译歌词,没有可为 null
|
||||
rlyric: '...', // 罗马音歌词,没有可为 null
|
||||
lxlyric: '...' // lx 逐字歌词,没有可为 null
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 注册 API 请求事件
|
||||
on(EVENT_NAMES.request, ({ source, action, info }) => {
|
||||
switch (action) {
|
||||
case 'musicUrl':
|
||||
return apis[source].musicUrl(info.musicInfo, qualitys[source][info.type])
|
||||
case 'lyric':
|
||||
return apis[source].lyric(info.musicInfo)
|
||||
case 'pic':
|
||||
return apis[source].pic(info.musicInfo)
|
||||
}
|
||||
})
|
||||
|
||||
// 发送初始化完成事件
|
||||
send(EVENT_NAMES.inited, {
|
||||
openDevTools: false, // 是否打开开发者工具
|
||||
sources: {
|
||||
kw: {
|
||||
name: '酷我音乐',
|
||||
type: 'music',
|
||||
actions: ['musicUrl'],
|
||||
qualitys: ['128k', '320k', 'flac', 'flac24bit']
|
||||
},
|
||||
local: {
|
||||
name: '本地音乐',
|
||||
type: 'music',
|
||||
actions: ['musicUrl', 'lyric', 'pic'],
|
||||
qualitys: []
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### LX API 参考
|
||||
|
||||
#### globalThis.lx.EVENT_NAMES
|
||||
|
||||
事件名称常量:
|
||||
|
||||
- `inited`: 初始化完成事件
|
||||
- `request`: API 请求事件
|
||||
- `updateAlert`: 更新提示事件
|
||||
|
||||
#### globalThis.lx.on(eventName, handler)
|
||||
|
||||
注册事件监听器:
|
||||
|
||||
```javascript
|
||||
lx.on(lx.EVENT_NAMES.request, ({ source, action, info }) => {
|
||||
// 必须返回 Promise
|
||||
return Promise.resolve(result)
|
||||
})
|
||||
```
|
||||
|
||||
#### globalThis.lx.send(eventName, data)
|
||||
|
||||
发送事件:
|
||||
|
||||
```javascript
|
||||
// 发送初始化事件
|
||||
lx.send(lx.EVENT_NAMES.inited, {
|
||||
openDevTools: false,
|
||||
sources: {...}
|
||||
});
|
||||
|
||||
// 发送更新提示
|
||||
lx.send(lx.EVENT_NAMES.updateAlert, {
|
||||
log: '更新日志\n修复了一些问题',
|
||||
updateUrl: 'https://example.com/update'
|
||||
});
|
||||
```
|
||||
|
||||
#### globalThis.lx.request(url, options, callback)
|
||||
|
||||
HTTP 请求方法:
|
||||
|
||||
```javascript
|
||||
lx.request(
|
||||
'https://api.example.com',
|
||||
{
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(data),
|
||||
timeout: 10000
|
||||
},
|
||||
(err, resp) => {
|
||||
if (err) {
|
||||
console.error('请求失败:', err)
|
||||
return
|
||||
}
|
||||
console.log('响应:', resp.body)
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
#### globalThis.lx.utils
|
||||
|
||||
工具方法:
|
||||
|
||||
```javascript
|
||||
// Buffer 操作
|
||||
lx.utils.buffer.from(data, encoding)
|
||||
lx.utils.buffer.bufToString(buffer, encoding)
|
||||
|
||||
// 加密工具
|
||||
lx.utils.crypto.md5(str)
|
||||
lx.utils.crypto.aesEncrypt(buffer, mode, key, iv)
|
||||
lx.utils.crypto.randomBytes(size)
|
||||
lx.utils.crypto.rsaEncrypt(buffer, key)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 音源配置
|
||||
|
||||
### 支持的音源 ID
|
||||
|
||||
- `kw`: 酷我音乐
|
||||
- `kg`: 酷狗音乐
|
||||
- `tx`: QQ音乐
|
||||
- `wy`: 网易云音乐
|
||||
- `mg`: 咪咕音乐
|
||||
- `local`: 本地音乐
|
||||
|
||||
### 支持的音质
|
||||
|
||||
- `128k`: 128kbps
|
||||
- `320k`: 320kbps
|
||||
- `flac`: FLAC 无损
|
||||
- `flac24bit`: 24bit FLAC
|
||||
- `hires`: Hi-Res 高解析度
|
||||
- `atmos`: 杜比全景声
|
||||
- `master`: 母带音质
|
||||
|
||||
---
|
||||
|
||||
## 错误处理
|
||||
|
||||
### 最佳实践
|
||||
|
||||
```javascript
|
||||
async function musicUrl(source, musicInfo, quality) {
|
||||
try {
|
||||
// 参数验证
|
||||
if (!musicInfo || !musicInfo.id) {
|
||||
throw new Error('音乐信息不完整')
|
||||
}
|
||||
|
||||
// API 调用
|
||||
const result = await cerumusic.request(url, options)
|
||||
|
||||
// 结果验证
|
||||
if (!result || result.statusCode !== 200) {
|
||||
throw new Error(`API 请求失败: ${result?.statusCode || 'Unknown'}`)
|
||||
}
|
||||
|
||||
if (!result.body || !result.body.url) {
|
||||
throw new Error('返回数据格式错误')
|
||||
}
|
||||
|
||||
return result.body.url
|
||||
} catch (error) {
|
||||
// 记录错误日志
|
||||
console.error(`[${source}] 获取音乐链接失败:`, error.message)
|
||||
|
||||
// 重新抛出错误供上层处理
|
||||
throw new Error(`获取 ${source} 音乐链接失败: ${error.message}`)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 常见错误类型
|
||||
|
||||
1. **网络错误**: 请求超时、连接失败
|
||||
2. **API 错误**: 接口返回错误状态码
|
||||
3. **数据错误**: 返回数据格式不正确
|
||||
4. **参数错误**: 传入参数不完整或格式错误
|
||||
|
||||
---
|
||||
|
||||
## 调试技巧
|
||||
|
||||
### 1. 使用 console.log
|
||||
|
||||
```javascript
|
||||
console.log('[插件名] 调试信息:', data)
|
||||
console.warn('[插件名] 警告信息:', warning)
|
||||
console.error('[插件名] 错误信息:', error)
|
||||
```
|
||||
|
||||
### 2. LX 插件开发者工具
|
||||
|
||||
```javascript
|
||||
send(EVENT_NAMES.inited, {
|
||||
openDevTools: true, // 开启开发者工具
|
||||
sources: {...}
|
||||
});
|
||||
```
|
||||
|
||||
### 3. 错误捕获
|
||||
|
||||
```javascript
|
||||
process.on('unhandledRejection', (reason, promise) => {
|
||||
console.error('未处理的 Promise 拒绝:', reason)
|
||||
})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 1. 请求缓存
|
||||
|
||||
```javascript
|
||||
const cache = new Map()
|
||||
|
||||
async function getCachedData(key, fetcher, ttl = 300000) {
|
||||
const cached = cache.get(key)
|
||||
if (cached && Date.now() - cached.timestamp < ttl) {
|
||||
return cached.data
|
||||
}
|
||||
|
||||
const data = await fetcher()
|
||||
cache.set(key, { data, timestamp: Date.now() })
|
||||
return data
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 请求超时控制
|
||||
|
||||
```javascript
|
||||
const result = await cerumusic.request(url, {
|
||||
timeout: 10000 // 10秒超时
|
||||
})
|
||||
```
|
||||
|
||||
### 3. 并发控制
|
||||
|
||||
```javascript
|
||||
// 限制并发请求数量
|
||||
const semaphore = new Semaphore(3) // 最多3个并发请求
|
||||
|
||||
async function limitedRequest(url, options) {
|
||||
await semaphore.acquire()
|
||||
try {
|
||||
return await cerumusic.request(url, options)
|
||||
} finally {
|
||||
semaphore.release()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 安全注意事项
|
||||
|
||||
### 1. 输入验证
|
||||
|
||||
```javascript
|
||||
function validateMusicInfo(musicInfo) {
|
||||
if (!musicInfo || typeof musicInfo !== 'object') {
|
||||
throw new Error('音乐信息格式错误')
|
||||
}
|
||||
|
||||
if (!musicInfo.id || typeof musicInfo.id !== 'string') {
|
||||
throw new Error('音乐 ID 无效')
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
```
|
||||
|
||||
### 2. URL 验证
|
||||
|
||||
```javascript
|
||||
function isValidUrl(url) {
|
||||
try {
|
||||
const urlObj = new URL(url)
|
||||
return urlObj.protocol === 'http:' || urlObj.protocol === 'https:'
|
||||
} catch {
|
||||
return false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 敏感信息保护
|
||||
|
||||
```javascript
|
||||
// 不要在日志中输出敏感信息
|
||||
console.log('请求参数:', {
|
||||
...params,
|
||||
token: '***', // 隐藏敏感信息
|
||||
password: '***'
|
||||
})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 插件发布
|
||||
|
||||
### 1. 代码检查清单
|
||||
|
||||
- [ ] 插件信息注释完整
|
||||
- [ ] 错误处理完善
|
||||
- [ ] 性能优化合理
|
||||
- [ ] 安全验证到位
|
||||
- [ ] 测试覆盖充分
|
||||
|
||||
### 2. 测试建议
|
||||
|
||||
```javascript
|
||||
// 单元测试示例
|
||||
async function testMusicUrl() {
|
||||
const testMusicInfo = {
|
||||
id: 'test123',
|
||||
name: '测试歌曲',
|
||||
artist: '测试歌手'
|
||||
}
|
||||
|
||||
try {
|
||||
const url = await musicUrl('kw', testMusicInfo, '320k')
|
||||
console.log('测试通过:', url)
|
||||
} catch (error) {
|
||||
console.error('测试失败:', error)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 版本管理
|
||||
|
||||
使用语义化版本号:
|
||||
|
||||
- `1.0.0`: 主版本.次版本.修订版本
|
||||
- 主版本:不兼容的 API 修改
|
||||
- 次版本:向下兼容的功能性新增
|
||||
- 修订版本:向下兼容的问题修正
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 插件加载失败怎么办?
|
||||
|
||||
A: 检查以下几点:
|
||||
|
||||
1. 文件编码是否为 UTF-8
|
||||
2. 插件信息注释格式是否正确
|
||||
3. JavaScript 语法是否有错误
|
||||
4. 是否正确导出了必需的方法
|
||||
|
||||
### Q: 如何处理跨域请求?
|
||||
|
||||
A: CeruMusic 的请求方法不受浏览器跨域限制,可以直接请求任何域名的 API。
|
||||
|
||||
### Q: 插件如何更新?
|
||||
|
||||
A: 使用 `cerumusic.NoticeCenter` 事件通知用户更新:
|
||||
|
||||
```javascript
|
||||
cerumusic.NoticeCenter('update', {
|
||||
title: '新版本更新',
|
||||
content: 'xxxx',
|
||||
version: 'v1.0.3',
|
||||
url: 'https://shiqianjiang.cn',
|
||||
pluginInfo: {
|
||||
type: 'cr'
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### Q: 如何调试插件?
|
||||
|
||||
A:
|
||||
|
||||
1. 使用 `console.log` 输出调试信息 可在设置—>插件管理—>日志 查看调试
|
||||
2. LX 插件可以设置 `openDevTools: true` 打开开发者工具
|
||||
3. 查看 CeruMusic 的插件日志
|
||||
|
||||
---
|
||||
|
||||
## 技术支持
|
||||
|
||||
如有问题或建议,请通过以下方式联系:
|
||||
|
||||
- GitHub Issues: [CeruMusic Issues](https://github.com/timeshiftsauce/CeruMusic/issues)
|
||||
- Blog (最好登录,否则需要审核): [CeruMusic Blog](https://shiqianjiang.cn/blog/4966904626407280640)
|
||||
@@ -1,3 +1,7 @@
|
||||
---
|
||||
layout: doc
|
||||
---
|
||||
|
||||
# CeruMusicPluginHost 使用文档
|
||||
|
||||
## 概述
|
||||
@@ -109,9 +113,7 @@ try {
|
||||
|
||||
### 构造函数
|
||||
|
||||
```javascript
|
||||
new CeruMusicPluginHost(pluginCode?)
|
||||
```
|
||||
`new CeruMusicPluginHost(pluginCode)`
|
||||
|
||||
**参数:**
|
||||
|
||||
@@ -125,9 +127,9 @@ new CeruMusicPluginHost(pluginCode?)
|
||||
|
||||
**参数:**
|
||||
|
||||
- `pluginPath` (string): 插件文件路径
|
||||
`pluginPath` (string): 插件文件路径
|
||||
|
||||
**返回:** Promise<Object> - 插件导出的对象
|
||||
**返回:** `Promise<Object>` - 插件导出的对象
|
||||
|
||||
#### getPluginInfo()
|
||||
|
||||
@@ -151,7 +153,7 @@ new CeruMusicPluginHost(pluginCode?)
|
||||
- `musicInfo` (Object): 歌曲信息对象
|
||||
- `quality` (string): 音质标识
|
||||
|
||||
**返回:** Promise<string> - 音乐播放链接
|
||||
**返回:** `Promise<string>` - 音乐播放链接
|
||||
|
||||
#### getPic(source, musicInfo)
|
||||
|
||||
@@ -162,7 +164,7 @@ new CeruMusicPluginHost(pluginCode?)
|
||||
- `source` (string): 音源标识
|
||||
- `musicInfo` (Object): 歌曲信息对象
|
||||
|
||||
**返回:** Promise<string> - 封面链接
|
||||
**返回:** `Promise<string>` - 封面链接
|
||||
|
||||
#### getLyric(source, musicInfo)
|
||||
|
||||
@@ -173,7 +175,7 @@ new CeruMusicPluginHost(pluginCode?)
|
||||
- `source` (string): 音源标识
|
||||
- `musicInfo` (Object): 歌曲信息对象
|
||||
|
||||
**返回:** Promise<string> - 歌词内容
|
||||
**返回:** `Promise<string>` - 歌词内容
|
||||
|
||||
## 插件环境
|
||||
|
||||
0
docs/guide/analyze.md
Normal file
BIN
docs/guide/assets/image-20250921130607735.png
Normal file
|
After Width: | Height: | Size: 606 KiB |
BIN
docs/guide/assets/image-20250926225425123.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
@@ -11,7 +11,7 @@ Ceru Music 是一个基于 Electron + Vue 3 的跨平台桌面音乐播放器,
|
||||
- **前端框架**: Vue 3 + TypeScript + Composition API
|
||||
- **桌面框架**: Electron (v37.2.3)
|
||||
- **UI组件库**: TDesign Vue Next (v1.15.2)
|
||||
- 
|
||||
- 
|
||||
- **状态管理**: Pinia (v3.0.3)
|
||||
- **路由管理**: Vue Router (v4.5.1)
|
||||
- **构建工具**: Vite + electron-vite
|
||||
@@ -397,7 +397,7 @@ export const useAppStore = defineStore('app', {
|
||||
|
||||
### 欢迎页面设计
|
||||
|
||||

|
||||

|
||||
|
||||
```vue
|
||||
<template>
|
||||
@@ -456,7 +456,7 @@ function skipWelcome() {
|
||||
|
||||
##### 界面UI参考
|
||||
|
||||
下载安装使用
|
||||
|
||||
### Window 安装
|
||||
|
||||
由于没有证书原因 **`Window`** 平台可能会出现安装包体误报**危险**。请放心我们的软件都是**开源**在 `Github` 自动化打包的。**具体安装步骤如下**
|
||||
|
||||
<img src="../assets/image-20250826214921963.png" alt="image-20250826214921963" style="zoom: 50%;" />如果出现类似图例效果请先点击 **右侧 三个点**
|
||||
|
||||
<img src="../assets/image-20250826215101522.png" alt="image-20250826215101522" style="zoom:50%;" />**点击保留**
|
||||
|
||||
<img src="../assets/image-20250826215206862.png" alt="image-20250826215206862" style="zoom:50%;" />**点击下拉按钮**
|
||||
|
||||
<img src="../assets/image-20250826215251525.png" alt="image-20250826215251525" style="zoom:50%;" />**任然保留**就可以双击打开安装到此教程结束
|
||||
|
||||
### Mac OS 系统下载安装
|
||||
|
||||
由于同样没有**签名**的原因mac的护栏也会拦截提示安装包损坏
|
||||
|
||||
<img src="../assets/3f50d3b838287b4bf1523d0f955fdf37.png" alt="3f50d3b838287b4bf1523d0f955fdf37" style="zoom:50%;" />请不用担心这是典型的签名问题
|
||||
|
||||
适用于 macOS 14 Sonoma 及以上版本。
|
||||
|
||||
注意:由于我们不提供经过签名的程序包体,因此在安装后首次运行可能会出现 “**澜音** 已损坏” 之类的提示,此时只需打开终端,输入命令
|
||||
|
||||
```bash
|
||||
sudo xattr -r -d com.apple.quarantine /Applications/澜音.app
|
||||
```
|
||||
|
||||
并回车,输入密码再次回车,重新尝试启动程序即可
|
||||
|
||||
_要是还有问题可自行在搜索引擎查询由于 。`apple`官方证书需要99刀的价格实在无能为力见谅_ 如果你有能力成为`澜音`的赞助者可联系
|
||||
|
||||
- QQ:`2115295703`
|
||||
- 微信:`cl_wj0623`
|
||||
|
||||
### 插件安装
|
||||
|
||||
首次进入应用需要在软件右上角设置导入**音源**才能使用可查询`Ceru插件`**(目前生态欠缺)** 或现成的**落雪**插件导入使用
|
||||
|
||||
###### 导入完成点击使用
|
||||
8
docs/guide/sponsorship.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# 赞助名单
|
||||
|
||||
## 鸣谢
|
||||
|
||||
| 昵称 | 赞助金额 |
|
||||
| :------------------------: | :------: |
|
||||
| **群友**:可惜情绪落泪零碎 | 6.66 |
|
||||
|
||||
15
docs/guide/update.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# 我的-更新计划-欢迎issue
|
||||
|
||||
- [ ] 搜索框可以弄对应的音乐源的排行榜 搜索联想
|
||||
- [ ] 导航上面这几个按钮可以稍微优化一下
|
||||
- [ ] 大熊好暖: 09-21 12:52:25 在搜索歌曲出来后 大熊好暖: 09-21 12:52:34 一般都是双击播放 大熊好暖: 09-21 12:54:16 这个是双击加入播放列表 可以优化 或者可以把这个双击做一个选项,让人选择
|
||||
- [ ] 播放页 样式模板选择 歌词背景律动很有沉浸感,但是黑胶唱片的专辑样式不是很喜欢,希望增加一个选项如图二一样只有圆形专辑封面
|
||||
- [x] 点击搜索框的 源图标实现快速切换
|
||||
- [ ] ai功能完善
|
||||
- [ ] 支持歌词隐藏
|
||||
- [x] 兼容多平台歌单导入
|
||||
- [x] 软件能不能记住上次打开的窗口大小,每次都要手动拉
|
||||
- [x] 歌单右键菜单
|
||||
- [x] 播放列表滚动条适配
|
||||
- [ ] 暗色主题
|
||||
- [x] 歌单页支持修改封面
|
||||
62
docs/guide/updateLog.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# 澜音版本更新日志
|
||||
|
||||
## 日志
|
||||
|
||||
- ###### 2025-9-26 (v1.3.8)
|
||||
|
||||
1. 写入歌曲tag信息
|
||||
2. 歌曲下载 选择音质
|
||||
3. 歌单 头部自动压缩
|
||||
|
||||
- ###### 2025-9-25 (v1.3.7)
|
||||
|
||||
1. 歌单
|
||||
- 新增右键移除歌曲
|
||||
- local 页歌单右键操作
|
||||
- 歌单页支持修改封面
|
||||
2. debug:右键菜单二级菜单位置决策
|
||||
|
||||
- ###### 2025-9-22 (v1.3.6)
|
||||
|
||||
1. 歌单列表可以右键操作
|
||||
- 播放
|
||||
- 下载
|
||||
- 添加到歌单
|
||||
- 添加到播放列表
|
||||
2. 播放列表滚动条
|
||||
3. 搜索页切换源重新加载
|
||||
|
||||
- ###### 2025-9-22 (v1.3.5)
|
||||
|
||||
1. 软件启动位置 宽高记忆 限制软件最大宽高
|
||||
2. debug: 修复歌曲音质支持短缺问题
|
||||
|
||||
- ###### 2025-9-21 (v1.3.4)
|
||||
1. 紧急修复QQ音乐歌词失效问题
|
||||
|
||||
- ###### 2025-9-21(v1.3.3)
|
||||
1. 兼容多平台歌单导入
|
||||
2. 点击搜索框的 源图标实现快速切换
|
||||
3. debug: fix:列表删除按钮冒泡
|
||||
|
||||
- ###### 2025-9-17 **(v1.3.2)**
|
||||
1. 目录结构调整
|
||||
|
||||
2. **支持插件更新提示**
|
||||
|
||||
**洛雪** 插件请手动重装适配
|
||||
|
||||
3. **debug**
|
||||
- SMTC 问题
|
||||
|
||||
- 歌曲缓存播放多次请求和多次缓存问题
|
||||
|
||||
- ###### 2025-9-17 **(v1.3.1)**
|
||||
1. **设置功能页**
|
||||
- 缓存路径支持自定义
|
||||
- 下载路径支持自定义
|
||||
2. **debug**
|
||||
- 播放页面唱针可以拖动问题
|
||||
- 播放按钮加载中 因为自动下一曲 导致动画变形问题
|
||||
- **SMTC** 功能 系统显示**未知应用**问题
|
||||
- 播放页歌词**字体粗细**偶现丢失问题
|
||||
BIN
docs/guide/used/assets/image-20250916132204465.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
docs/guide/used/assets/image-20250916132248046.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
docs/guide/used/assets/image-20250916133531421.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
docs/guide/used/assets/image-20250916134406714.png
Normal file
|
After Width: | Height: | Size: 249 KiB |
BIN
docs/guide/used/assets/image-20250916134511291.png
Normal file
|
After Width: | Height: | Size: 255 KiB |
BIN
docs/guide/used/assets/image-20250916134615679.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
docs/guide/used/assets/image-20250916134820742.png
Normal file
|
After Width: | Height: | Size: 449 KiB |
26
docs/guide/used/playList.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# 音乐播放列表-机制分析
|
||||
|
||||
## 基础使用
|
||||
|
||||
1. 默认情况下,播放 **「搜索」「歌单」** 双击中的歌曲时,会自动将该歌曲添加到 **「列表」** 中的末尾后并不会播放,这与手动将歌曲添加到 **「列表」** 等价,亦或是通过点击歌曲前面小三角播放<img src="./assets/image-20250916132248046.png" alt="image-20250916132248046" style="float:right" />可以添加到歌曲开头也可进行该歌曲添加到 **「列表」** 中的开头并播放。歌曲会按照你选择的播放顺序进行播放。
|
||||
2. 对于 **「列表」** 歌曲的顺序可通过展开长按 **1.5s** 后可以进行拖拽排序,歌曲排序实时保存到本地 **LocalStorage**<img src="./assets/image-20250916133531421.png" alt="image-20250916133531421" style="zoom: 20%;" />
|
||||
|
||||
## 歌曲列表的导出和分享
|
||||
|
||||
3. 可进入设置
|
||||
|
||||

|
||||
|
||||
点击 **[播放列表]** =>
|
||||
|
||||

|
||||
|
||||
即可操作你想要的功能
|
||||
|
||||
4. 播放列表还可以导出为歌单
|
||||
|
||||

|
||||
|
||||
歌单将自动选取第一首 **有效封面**[^1] 为歌单
|
||||
|
||||
[^1]: url正确的歌曲封面
|
||||
203
docs/index.md
Normal file
@@ -0,0 +1,203 @@
|
||||
---
|
||||
# https://vitepress.dev/reference/default-theme-home-page
|
||||
layout: home
|
||||
|
||||
hero:
|
||||
name: 'Ceru Music'
|
||||
text: '澜音 播放器'
|
||||
tagline: 澜音是一个跨平台的音乐播放器应用,支持基于合规插件获取公开音乐信息与播放功能。
|
||||
image:
|
||||
src: '/logo.svg'
|
||||
actions:
|
||||
- theme: brand
|
||||
text: 下载应用
|
||||
link: https://ceru.shiqianjiang.cn/#download
|
||||
target: _blank
|
||||
- theme: alt
|
||||
text: 使用文档
|
||||
link: /guide/
|
||||
|
||||
features:
|
||||
- title: 多平台支持
|
||||
icon: 🚀
|
||||
details: 支持网易云音乐、QQ音乐等多个平台,搜索
|
||||
- title: 跨平台支持
|
||||
icon: 🪟
|
||||
details: 原生桌面应用,支持 Windows、macOS、Linux 三大操作系统
|
||||
- title: 歌词显示
|
||||
icon: 🎼
|
||||
details: 实时歌词显示,支持专辑信息获取,让音乐体验更丰富
|
||||
- title: 优雅界面
|
||||
icon: 💻
|
||||
details: 现代化设计语言,流畅动画效果,为你带来愉悦的视觉体验
|
||||
- title: 代码开源
|
||||
details: 代码完全开源,供给大家使用开发
|
||||
icon: 👐
|
||||
link: https://github.com/timeshiftsauce/CeruMusic
|
||||
---
|
||||
|
||||
<div style="margin-top:4rem"></div>
|
||||
|
||||
# Ceru Music(澜音)
|
||||
|
||||
一个跨平台的音乐播放器应用,支持基于合规插件获取公开音乐信息与播放功能。
|
||||
|
||||
## 项目简介
|
||||
|
||||
Ceru Music 是基于 Electron 和 Vue 开发的跨平台桌面音乐播放器工具,**仅提供插件运行框架与播放功能**,不直接存储、提供任何音乐源文件。用户需通过自行选择、安装合规插件获取音乐相关数据,项目旨在为开发者提供桌面应用技术实践与学习案例,为用户提供合规的音乐播放工具框架。
|
||||
|
||||
<img src="./assets/image-20250827175023917.png" alt="image-20250827175023917" style="zoom: 33%;" /><img src="./assets/image-20250827175109430.png" alt="image-20250827175109430" style="zoom:33%;" />
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **Electron**:用于构建跨平台桌面应用
|
||||
- **Vue 3**:前端框架,提供响应式 UI
|
||||
- **TypeScript**:增强代码可维护性和类型安全
|
||||
- **Pinia**:状态管理工具
|
||||
- **Vite**:快速的前端构建工具
|
||||
- **CeruPlugins**:音乐插件运行环境(仅提供框架,不包含默认插件)
|
||||
- **AMLL**:音乐生态辅助模块
|
||||
|
||||
## 主要功能
|
||||
|
||||
- 提供插件加载与管理功能,支持通过合规插件获取公开音乐信息
|
||||
- 支持通过插件获取歌词、专辑封面等公开元数据
|
||||
- 支持虚拟滚动列表,优化大量数据渲染性能
|
||||
- 本地播放列表管理(仅存储用户手动创建的列表结构,不包含音乐文件)
|
||||
- **提示**:本地数据仅保存在用户设备本地,未进行云端备份,用户需自行备份以防止数据丢失
|
||||
- 精美的用户界面与动画效果
|
||||
- **插件生态框架**(插件需用户自行获取并确保合规性)
|
||||
|
||||
## 安装与使用
|
||||
|
||||
### 推荐开发环境
|
||||
|
||||
- **IDE**: VS Code 或 WebStorm
|
||||
- **Node.js 版本**: 22 及以上
|
||||
- **包管理器**: **yarn**
|
||||
|
||||
### 项目设置
|
||||
|
||||
1. 安装依赖:
|
||||
|
||||
```bash
|
||||
yarn install
|
||||
```
|
||||
|
||||
2. 启动开发服务器:
|
||||
|
||||
```bash
|
||||
yarn dev
|
||||
```
|
||||
|
||||
3. 构建应用:
|
||||
|
||||
```bash
|
||||
yarn build
|
||||
```
|
||||
|
||||
### 平台构建指令
|
||||
|
||||
- Windows
|
||||
|
||||
```bash
|
||||
yarn build:win
|
||||
```
|
||||
|
||||
- macOS
|
||||
|
||||
```bash
|
||||
yarn build:mac
|
||||
```
|
||||
|
||||
- Linux
|
||||
|
||||
```bash
|
||||
yarn build:linux
|
||||
```
|
||||
|
||||
> 提示:构建后的应用仅包含播放器框架,需用户自行配置合规插件方可获取音乐数据。
|
||||
|
||||
## 文档与资源
|
||||
|
||||
- [产品设计文档](./guide/design):涵盖项目架构、核心功能设计和开发规范(不含任何音乐数据源信息)。
|
||||
- [插件开发文档](./guide/CeruMusicPluginDev):仅提供插件开发技术规范,**明确要求插件开发者需遵守数据来源平台的用户协议与版权法**,禁止开发、传播获取非公开数据的插件。
|
||||
|
||||
## 开源许可
|
||||
|
||||
本项目源代码遵循 **Apache License 2.0**,仅授权用户对项目框架进行学习、修改与二次开发,不包含任何音乐数据相关授权。详情请参阅 [LICENSE](https://github.com/timeshiftsauce/CeruMusic/blob/main/LICENSE) 文件,使用前请务必阅读许可条款。
|
||||
|
||||
## 贡献指南
|
||||
|
||||
欢迎开发者贡献代码与反馈建议,贡献内容需符合以下要求:
|
||||
|
||||
1. 仅涉及播放器框架功能优化、bug 修复、文档完善,不包含任何音乐数据源相关代码。
|
||||
2. 遵循 [Git 提交规范](./guide/design#git提交规范) 并确保代码符合项目风格指南。
|
||||
3. 贡献的代码需无第三方版权纠纷,且不违反开源许可协议。
|
||||
|
||||
## 联系方式
|
||||
|
||||
如有技术问题或合作意向(仅限技术交流),请通过 Gitee 私信联系项目维护者。
|
||||
|
||||
## 项目开发者
|
||||
|
||||
- **时迁酱**:产品总体设计与开发
|
||||
|
||||
<img src="./assets/head.jpg" alt="head.jpg (940×940)" style="zoom:15%;" />
|
||||
|
||||
- **无聊的霜霜**:首页设计&Ai助手
|
||||
|
||||
<img src="./assets/image-20250827181604432.png" alt="image-20250827181604432" style="zoom:25%;" />
|
||||
|
||||
- **Star**:**插件管理**相关功能&部分接口封装
|
||||
|
||||
<img src="./assets/image-20250827181535681.png" alt="image-20250827181535681" style="zoom:25%;" />
|
||||
|
||||
**Tips**: 排名不分先后
|
||||
|
||||
# 法律声明与免责条款
|
||||
|
||||
**重要提示:使用本项目前,请务必仔细阅读本条款,使用本项目即视为你已充分理解并同意本条款全部内容。**
|
||||
|
||||
### 一、定义约定
|
||||
|
||||
- “Apache License 2.0”:指 Ceru Music(澜音)桌面播放器框架及源代码,不包含任何第三方插件或音乐数据。
|
||||
- “**用户**”:指下载、安装、使用本项目的个人或组织。
|
||||
- “**合规插件**”:指符合数据来源平台用户协议、不侵犯第三方版权、不获取非公开数据的插件。
|
||||
- “**版权内容**”:指包括但不限于音乐文件、歌词、专辑封面、艺人信息等受著作权法保护的内容。
|
||||
|
||||
### 二、数据与内容责任
|
||||
|
||||
1. 本项目**不直接获取、存储、传输任何音乐数据或版权内容**,仅提供插件运行框架。用户通过插件获取的所有数据,其合法性、准确性由插件提供者及用户**自行负责**,本项目不承担任何责任。
|
||||
2. 若用户使用的插件存在获取非公开数据、侵犯第三方版权等违规行为,相关法律责任由用户及插件提供者承担,与本项目无关。
|
||||
3. 本项目使用的字体、图片等素材,均来自开源社区或已获得合法授权,若存在侵权请联系项目维护者立即移除,本项目将积极配合处理。
|
||||
|
||||
### 三、版权合规要求
|
||||
|
||||
1. 用户承诺:使用本项目时,仅通过合规插件获取音乐相关信息,且获取、使用版权内容的行为符合**《中华人民共和国著作权法》**及相关法律法规,不侵犯**任何第三方**合法权益。
|
||||
2. 用户需知晓:任何未经授权下载、传播、使用受版权保护的音乐文件的行为,均可能构成侵权,需自行承担法律后果。
|
||||
3. 本项目倡导 “尊重版权、支持正版”,提醒用户通过官方音乐平台获取授权音乐服务。
|
||||
|
||||
### 四、免责声明
|
||||
|
||||
1. 因用户使用非合规插件、违反法律法规或第三方协议导致的任何法律责任(包括但不限于侵权赔偿、行政处罚),均由用户自行承担,本项目不承担任何直接、间接、连带或衍生责任。
|
||||
2. 因本项目框架本身的 **bug** 导致的用户设备故障、数据丢失,本项目仅承担在合理范围内的技术修复责任,不承担由此产生的间接损失(如商誉损失、业务中断损失等)。
|
||||
3. 本项目为开源学习项目,不提供商业服务,对用户使用本项目的效果不做任何明示或暗示的保证。
|
||||
|
||||
### 五、使用限制
|
||||
|
||||
1. 本项目仅允许用于**非商业、纯技术学习目的**,禁止用于任何商业运营、盈利活动,禁止修改后用于侵犯第三方权益的场景。
|
||||
2. 禁止在违反当地法律法规、本声明或第三方协议的前提下使用本项目,若用户所在地区禁止此类工具的使用,应立即停止使用。
|
||||
3. 禁止将本项目源代码或构建后的应用,与违规插件捆绑传播,禁止利用本项目从事任何违法违规活动。
|
||||
|
||||
### 六、其他
|
||||
|
||||
1. 本声明的效力、解释及适用,均适用中华人民共和国法律(不含港澳台地区法律)。
|
||||
2. 若用户与本项目维护者就本声明产生争议,应首先通过友好协商解决;协商不成的,任何一方均有权向本项目维护者所在地有管辖权的人民法院提起诉讼。
|
||||
|
||||
## 赞助
|
||||
|
||||
若您认可本项目的技术价值,欢迎通过以下方式支持开发者(仅用于项目技术维护与迭代):
|
||||
<img src="./assets/image-20250827175356006.png" alt="赞助方式1" style="zoom:33%;" /><img src="./assets/image-20250827175547444.png" alt="赞助方式2" style="zoom: 33%;" />
|
||||
|
||||
---
|
||||
84
docs/plugin-notice-test.js
Normal file
@@ -0,0 +1,84 @@
|
||||
// 测试插件通知功能的示例插件
|
||||
// 这个文件可以用来测试 NoticeCenter 功能
|
||||
|
||||
const pluginInfo = {
|
||||
name: '测试通知插件',
|
||||
version: '1.0.0',
|
||||
author: 'CeruMusic Team',
|
||||
description: '用于测试插件通知功能的示例插件',
|
||||
type: 'cr'
|
||||
}
|
||||
|
||||
const sources = [
|
||||
{
|
||||
name: 'test',
|
||||
qualities: ['128k', '320k']
|
||||
}
|
||||
]
|
||||
|
||||
// 模拟音乐URL获取函数
|
||||
async function musicUrl(source, musicInfo, quality) {
|
||||
console.log('测试插件:获取音乐URL')
|
||||
|
||||
// 测试不同类型的通知
|
||||
setTimeout(() => {
|
||||
// 测试信息通知
|
||||
this.cerumusic.NoticeCenter('info', {
|
||||
title: '信息通知',
|
||||
message: '这是一个信息通知测试',
|
||||
content: '插件正在正常工作'
|
||||
})
|
||||
}, 1000)
|
||||
|
||||
setTimeout(() => {
|
||||
// 测试警告通知
|
||||
this.cerumusic.NoticeCenter('warning', {
|
||||
title: '警告通知',
|
||||
message: '这是一个警告通知测试',
|
||||
content: '请注意某些设置'
|
||||
})
|
||||
}, 2000)
|
||||
|
||||
setTimeout(() => {
|
||||
// 测试成功通知
|
||||
this.cerumusic.NoticeCenter('success', {
|
||||
title: '成功通知',
|
||||
message: '操作已成功完成',
|
||||
content: '音乐URL获取成功'
|
||||
})
|
||||
}, 3000)
|
||||
|
||||
setTimeout(() => {
|
||||
// 测试更新通知
|
||||
this.cerumusic.NoticeCenter('update', {
|
||||
title: '插件更新',
|
||||
message: '发现新版本 v2.0.0,是否立即更新?',
|
||||
url: 'https://example.com/plugin-update.js',
|
||||
version: '2.0.0',
|
||||
pluginInfo: {
|
||||
name: '测试通知插件',
|
||||
type: 'cr',
|
||||
forcedUpdate: false
|
||||
}
|
||||
})
|
||||
}, 4000)
|
||||
|
||||
setTimeout(() => {
|
||||
// 测试错误通知
|
||||
this.cerumusic.NoticeCenter('error', {
|
||||
title: '错误通知',
|
||||
message: '这是一个错误通知测试',
|
||||
error: '模拟的错误信息'
|
||||
})
|
||||
}, 5000)
|
||||
|
||||
// 返回一个测试URL
|
||||
return 'https://example.com/test-music.mp3'
|
||||
}
|
||||
|
||||
// 导出插件
|
||||
module.exports = {
|
||||
pluginInfo,
|
||||
sources,
|
||||
musicUrl
|
||||
}
|
||||
216
docs/plugin-notice-usage.md
Normal file
@@ -0,0 +1,216 @@
|
||||
# 插件通知系统使用说明
|
||||
|
||||
## 概述
|
||||
|
||||
CeruMusic 插件通知系统允许插件向用户显示各种类型的通知对话框,包括信息、警告、错误、成功和更新通知。
|
||||
|
||||
## 功能特性
|
||||
|
||||
### 🎯 支持的通知类型
|
||||
|
||||
1. **信息通知 (info)** - 显示一般信息
|
||||
2. **警告通知 (warning)** - 显示警告信息
|
||||
3. **错误通知 (error)** - 显示错误信息
|
||||
4. **成功通知 (success)** - 显示成功信息
|
||||
5. **更新通知 (update)** - 显示插件更新信息,支持一键更新
|
||||
|
||||
### 🎨 界面特性
|
||||
|
||||
- 使用 TDesign 组件库,界面美观统一
|
||||
- 支持深色主题适配
|
||||
- 响应式设计,移动端友好
|
||||
- 不同通知类型有对应的图标和颜色
|
||||
|
||||
### ⚡ 技术特性
|
||||
|
||||
- 基于 Electron IPC 通信
|
||||
- TypeScript 类型安全
|
||||
- 异步操作支持
|
||||
- 错误处理完善
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 在插件中调用通知
|
||||
|
||||
```javascript
|
||||
// 基本用法
|
||||
this.cerumusic.NoticeCenter(type, data)
|
||||
|
||||
// 信息通知
|
||||
this.cerumusic.NoticeCenter('info', {
|
||||
title: '插件信息',
|
||||
message: '这是一条信息通知',
|
||||
content: '详细的信息内容'
|
||||
})
|
||||
|
||||
// 警告通知
|
||||
this.cerumusic.NoticeCenter('warning', {
|
||||
title: '注意',
|
||||
message: '这是一条警告信息',
|
||||
content: '请检查相关设置'
|
||||
})
|
||||
|
||||
// 错误通知
|
||||
this.cerumusic.NoticeCenter('error', {
|
||||
title: '错误',
|
||||
message: '操作失败',
|
||||
error: '具体的错误信息'
|
||||
})
|
||||
|
||||
// 成功通知
|
||||
this.cerumusic.NoticeCenter('success', {
|
||||
title: '成功',
|
||||
message: '操作已成功完成'
|
||||
})
|
||||
|
||||
// 更新通知(特殊)
|
||||
this.cerumusic.NoticeCenter('update', {
|
||||
title: '插件更新',
|
||||
message: '发现新版本,是否立即更新?',
|
||||
url: 'https://example.com/plugin-update.js',
|
||||
version: '2.0.0',
|
||||
pluginInfo: {
|
||||
name: '插件名称',
|
||||
type: 'cr', // 'cr' 或 'lx'
|
||||
forcedUpdate: false
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### 参数说明
|
||||
|
||||
#### 通用参数 (data 对象)
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
| ------- | ------ | ---- | ------------------------------ |
|
||||
| title | string | 否 | 通知标题,不提供时使用默认标题 |
|
||||
| message | string | 否 | 通知消息内容 |
|
||||
| content | string | 否 | 详细内容(与 message 二选一) |
|
||||
|
||||
#### 更新通知特有参数
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
| ----------------------- | ------------ | ---- | ---------------- |
|
||||
| url | string | 是 | 插件更新下载链接 |
|
||||
| version | string | 否 | 新版本号 |
|
||||
| pluginInfo.name | string | 否 | 插件名称 |
|
||||
| pluginInfo.type | 'cr' \| 'lx' | 否 | 插件类型 |
|
||||
| pluginInfo.forcedUpdate | boolean | 否 | 是否强制更新 |
|
||||
|
||||
#### 错误通知特有参数
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
| ----- | ------ | ---- | ------------ |
|
||||
| error | string | 否 | 具体错误信息 |
|
||||
|
||||
## 实现原理
|
||||
|
||||
### 架构图
|
||||
|
||||
```
|
||||
插件代码
|
||||
↓ (调用 NoticeCenter)
|
||||
CeruMusicPluginHost
|
||||
↓ (sendPluginNotice)
|
||||
pluginNotice.ts (主进程)
|
||||
↓ (IPC 通信)
|
||||
PluginNoticeDialog.vue (渲染进程)
|
||||
↓ (显示对话框)
|
||||
用户界面
|
||||
```
|
||||
|
||||
### 文件结构
|
||||
|
||||
```
|
||||
src/
|
||||
├── main/
|
||||
│ ├── events/
|
||||
│ │ └── pluginNotice.ts # 主进程通知处理
|
||||
│ └── services/plugin/manager/
|
||||
│ └── CeruMusicPluginHost.ts # 插件主机
|
||||
├── renderer/src/
|
||||
│ ├── components/
|
||||
│ │ └── PluginNoticeDialog.vue # 通知对话框组件
|
||||
│ └── App.vue # 主应用(注册组件)
|
||||
└── preload/
|
||||
└── index.ts # IPC API 定义
|
||||
```
|
||||
|
||||
## 测试
|
||||
|
||||
### 使用测试插件
|
||||
|
||||
1. 将 `docs/plugin-notice-test.js` 作为插件加载
|
||||
2. 调用插件的 `musicUrl` 方法
|
||||
3. 观察不同类型的通知是否正确显示
|
||||
|
||||
### 测试场景
|
||||
|
||||
- [x] 信息通知显示
|
||||
- [x] 警告通知显示
|
||||
- [x] 错误通知显示
|
||||
- [x] 成功通知显示
|
||||
- [x] 更新通知显示(带更新按钮)
|
||||
- [x] 更新按钮功能
|
||||
- [x] 对话框关闭功能
|
||||
- [x] 响应式布局
|
||||
- [x] 深色主题适配
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **URL 验证**: 更新通知的 URL 必须是有效的 HTTP/HTTPS 链接
|
||||
2. **错误处理**: 所有通知操作都有完善的错误处理机制
|
||||
3. **性能考虑**: 避免频繁发送通知,可能影响用户体验
|
||||
4. **类型安全**: 使用 TypeScript 确保参数类型正确
|
||||
|
||||
## 扩展功能
|
||||
|
||||
### 未来可能的增强
|
||||
|
||||
- [ ] 通知历史记录
|
||||
- [ ] 通知优先级系统
|
||||
- [ ] 批量通知管理
|
||||
- [ ] 自定义通知样式
|
||||
- [ ] 通知声音提醒
|
||||
- [ ] 通知位置自定义
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **通知不显示**
|
||||
- 检查主窗口是否存在
|
||||
- 确认 IPC 通信是否正常
|
||||
- 查看控制台错误信息
|
||||
|
||||
2. **更新按钮无响应**
|
||||
- 确认更新 URL 是否有效
|
||||
- 检查网络连接
|
||||
- 查看主进程日志
|
||||
|
||||
3. **样式显示异常**
|
||||
- 确认 TDesign 组件库已正确加载
|
||||
- 检查 CSS 样式是否冲突
|
||||
- 验证主题配置
|
||||
|
||||
### 调试方法
|
||||
|
||||
```javascript
|
||||
// 在插件中添加调试日志
|
||||
console.log('[Plugin] 发送通知:', type, data)
|
||||
|
||||
// 在渲染进程中监听通知
|
||||
window.api.on('plugin-notice', (_, notice) => {
|
||||
console.log('[Renderer] 收到通知:', notice)
|
||||
})
|
||||
```
|
||||
|
||||
## 更新日志
|
||||
|
||||
### v1.0.0 (2025-09-20)
|
||||
|
||||
- ✨ 初始版本发布
|
||||
- ✨ 支持 5 种通知类型
|
||||
- ✨ 完整的 TypeScript 类型定义
|
||||
- ✨ 响应式设计和深色主题支持
|
||||
- ✨ 完善的错误处理机制
|
||||
10
docs/public/logo.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<svg width="1200" height="1200" viewBox="0 0 1200 1200" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="1200" height="1200" rx="379" fill="white"/>
|
||||
<path d="M957.362 204.197C728.535 260.695 763.039 192.264 634.41 175.368C451.817 151.501 504.125 315.925 504.125 315.925L630.545 673.497C591.211 654.805 544.287 643.928 494.188 643.928C353.275 643.928 239 729.467 239 834.964C239 940.567 353.137 1026 494.188 1026C635.1 1026 749.375 940.461 749.375 834.964C749.375 832.218 749.237 829.473 749.099 826.727C749.513 825.988 749.789 825.143 750.065 824.087C757.932 789.449 634.272 348.345 634.272 348.345C634.272 348.345 764.971 401.886 860.89 351.936C971.163 294.699 964.953 202.402 957.362 204.197Z" fill="url(#paint0_linear_4_16)" stroke="#29293A" stroke-opacity="0.23"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_4_16" x1="678.412" y1="-1151.29" x2="796.511" y2="832.071" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.572115" stop-color="#B8F1ED"/>
|
||||
<stop offset="0.9999" stop-color="#B8F1CC"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
444
docs/songlist-api.md
Normal file
@@ -0,0 +1,444 @@
|
||||
# 歌单管理 API 文档
|
||||
|
||||
本文档介绍了 CeruMusic 中歌单管理功能的使用方法,包括后端服务类和前端 API 接口。
|
||||
|
||||
## 概述
|
||||
|
||||
歌单管理系统提供了完整的歌单和歌曲管理功能,包括:
|
||||
|
||||
- 📁 **歌单管理**:创建、删除、编辑、搜索歌单
|
||||
- 🎵 **歌曲管理**:添加、移除、搜索歌单中的歌曲
|
||||
- 📊 **统计分析**:获取歌单和歌曲的统计信息
|
||||
- 🔧 **数据维护**:验证和修复歌单数据完整性
|
||||
- ⚡ **批量操作**:支持批量删除和批量移除操作
|
||||
|
||||
## 架构设计
|
||||
|
||||
```
|
||||
前端 (Renderer Process)
|
||||
├── src/renderer/src/api/songList.ts # 前端 API 封装
|
||||
├── src/renderer/src/examples/songListUsage.ts # 使用示例
|
||||
└── src/types/songList.ts # TypeScript 类型定义
|
||||
|
||||
主进程 (Main Process)
|
||||
├── src/main/events/songList.ts # IPC 事件处理
|
||||
├── src/main/services/songList/ManageSongList.ts # 歌单管理服务
|
||||
└── src/main/services/songList/PlayListSongs.ts # 歌曲管理基类
|
||||
```
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 前端使用
|
||||
|
||||
```typescript
|
||||
import songListAPI from '@/api/songList'
|
||||
|
||||
// 创建歌单
|
||||
const result = await songListAPI.create('我的收藏', '我最喜欢的歌曲')
|
||||
if (result.success) {
|
||||
console.log('歌单创建成功,ID:', result.data?.id)
|
||||
}
|
||||
|
||||
// 获取所有歌单
|
||||
const playlists = await songListAPI.getAll()
|
||||
if (playlists.success) {
|
||||
console.log('歌单列表:', playlists.data)
|
||||
}
|
||||
|
||||
// 添加歌曲到歌单
|
||||
const songs = [
|
||||
/* 歌曲数据 */
|
||||
]
|
||||
await songListAPI.addSongs(playlistId, songs)
|
||||
```
|
||||
|
||||
### 2. 类型安全
|
||||
|
||||
所有 API 都提供了完整的 TypeScript 类型支持:
|
||||
|
||||
```typescript
|
||||
import type { IPCResponse, SongListStatistics } from '@/types/songList'
|
||||
|
||||
const stats: IPCResponse<SongListStatistics> = await songListAPI.getStatistics()
|
||||
```
|
||||
|
||||
## API 参考
|
||||
|
||||
### 歌单管理
|
||||
|
||||
#### `create(name, description?, source?)`
|
||||
|
||||
创建新歌单
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.create('我的收藏', '描述', 'local')
|
||||
// 返回: { success: boolean, data?: { id: string }, error?: string }
|
||||
```
|
||||
|
||||
#### `getAll()`
|
||||
|
||||
获取所有歌单
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.getAll()
|
||||
// 返回: { success: boolean, data?: SongList[], error?: string }
|
||||
```
|
||||
|
||||
#### `getById(hashId)`
|
||||
|
||||
根据ID获取歌单
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.getById('playlist-id')
|
||||
// 返回: { success: boolean, data?: SongList | null, error?: string }
|
||||
```
|
||||
|
||||
#### `delete(hashId)`
|
||||
|
||||
删除歌单
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.delete('playlist-id')
|
||||
// 返回: { success: boolean, error?: string }
|
||||
```
|
||||
|
||||
#### `batchDelete(hashIds)`
|
||||
|
||||
批量删除歌单
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.batchDelete(['id1', 'id2'])
|
||||
// 返回: { success: boolean, data?: { success: string[], failed: string[] } }
|
||||
```
|
||||
|
||||
#### `edit(hashId, updates)`
|
||||
|
||||
编辑歌单信息
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.edit('playlist-id', {
|
||||
name: '新名称',
|
||||
description: '新描述'
|
||||
})
|
||||
```
|
||||
|
||||
#### `search(keyword, source?)`
|
||||
|
||||
搜索歌单
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.search('关键词', 'local')
|
||||
// 返回: { success: boolean, data?: SongList[], error?: string }
|
||||
```
|
||||
|
||||
### 歌曲管理
|
||||
|
||||
#### `addSongs(hashId, songs)`
|
||||
|
||||
添加歌曲到歌单
|
||||
|
||||
```typescript
|
||||
const songs: Songs[] = [
|
||||
/* 歌曲数据 */
|
||||
]
|
||||
const result = await songListAPI.addSongs('playlist-id', songs)
|
||||
```
|
||||
|
||||
#### `removeSong(hashId, songmid)`
|
||||
|
||||
移除单首歌曲
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.removeSong('playlist-id', 'song-id')
|
||||
// 返回: { success: boolean, data?: boolean, error?: string }
|
||||
```
|
||||
|
||||
#### `removeSongs(hashId, songmids)`
|
||||
|
||||
批量移除歌曲
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.removeSongs('playlist-id', ['song1', 'song2'])
|
||||
// 返回: { success: boolean, data?: { removed: number, notFound: number } }
|
||||
```
|
||||
|
||||
#### `getSongs(hashId)`
|
||||
|
||||
获取歌单中的歌曲
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.getSongs('playlist-id')
|
||||
// 返回: { success: boolean, data?: readonly Songs[], error?: string }
|
||||
```
|
||||
|
||||
#### `searchSongs(hashId, keyword)`
|
||||
|
||||
搜索歌单中的歌曲
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.searchSongs('playlist-id', '关键词')
|
||||
// 返回: { success: boolean, data?: Songs[], error?: string }
|
||||
```
|
||||
|
||||
### 统计信息
|
||||
|
||||
#### `getStatistics()`
|
||||
|
||||
获取歌单统计信息
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.getStatistics()
|
||||
// 返回: {
|
||||
// success: boolean,
|
||||
// data?: {
|
||||
// total: number,
|
||||
// bySource: Record<string, number>,
|
||||
// lastUpdated: string
|
||||
// }
|
||||
// }
|
||||
```
|
||||
|
||||
#### `getSongStatistics(hashId)`
|
||||
|
||||
获取歌单歌曲统计信息
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.getSongStatistics('playlist-id')
|
||||
// 返回: {
|
||||
// success: boolean,
|
||||
// data?: {
|
||||
// total: number,
|
||||
// bySinger: Record<string, number>,
|
||||
// byAlbum: Record<string, number>,
|
||||
// lastModified: string
|
||||
// }
|
||||
// }
|
||||
```
|
||||
|
||||
### 数据维护
|
||||
|
||||
#### `validateIntegrity(hashId)`
|
||||
|
||||
验证歌单数据完整性
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.validateIntegrity('playlist-id')
|
||||
// 返回: { success: boolean, data?: { isValid: boolean, issues: string[] } }
|
||||
```
|
||||
|
||||
#### `repairData(hashId)`
|
||||
|
||||
修复歌单数据
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.repairData('playlist-id')
|
||||
// 返回: { success: boolean, data?: { fixed: boolean, changes: string[] } }
|
||||
```
|
||||
|
||||
### 便捷方法
|
||||
|
||||
#### `getPlaylistDetail(hashId)`
|
||||
|
||||
获取歌单详细信息(包含歌曲列表)
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.getPlaylistDetail('playlist-id')
|
||||
// 返回: {
|
||||
// playlist: SongList | null,
|
||||
// songs: readonly Songs[],
|
||||
// success: boolean,
|
||||
// error?: string
|
||||
// }
|
||||
```
|
||||
|
||||
#### `checkAndRepair(hashId)`
|
||||
|
||||
检查并修复歌单数据
|
||||
|
||||
```typescript
|
||||
const result = await songListAPI.checkAndRepair('playlist-id')
|
||||
// 返回: {
|
||||
// needsRepair: boolean,
|
||||
// repairResult?: RepairResult,
|
||||
// success: boolean,
|
||||
// error?: string
|
||||
// }
|
||||
```
|
||||
|
||||
## 错误处理
|
||||
|
||||
所有 API 都返回统一的响应格式:
|
||||
|
||||
```typescript
|
||||
interface IPCResponse<T = any> {
|
||||
success: boolean // 操作是否成功
|
||||
data?: T // 返回的数据
|
||||
error?: string // 错误信息
|
||||
message?: string // 附加消息
|
||||
code?: string // 错误码
|
||||
}
|
||||
```
|
||||
|
||||
### 错误码说明
|
||||
|
||||
| 错误码 | 说明 |
|
||||
| -------------------- | ------------ |
|
||||
| `INVALID_HASH_ID` | 无效的歌单ID |
|
||||
| `PLAYLIST_NOT_FOUND` | 歌单不存在 |
|
||||
| `EMPTY_NAME` | 歌单名称为空 |
|
||||
| `CREATE_FAILED` | 创建失败 |
|
||||
| `DELETE_FAILED` | 删除失败 |
|
||||
| `EDIT_FAILED` | 编辑失败 |
|
||||
| `READ_FAILED` | 读取失败 |
|
||||
| `WRITE_FAILED` | 写入失败 |
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 完整的歌单管理流程
|
||||
|
||||
```typescript
|
||||
import songListAPI from '@/api/songList'
|
||||
|
||||
async function managePlaylist() {
|
||||
try {
|
||||
// 1. 创建歌单
|
||||
const createResult = await songListAPI.create('我的收藏', '我最喜欢的歌曲')
|
||||
if (!createResult.success) {
|
||||
throw new Error(createResult.error)
|
||||
}
|
||||
|
||||
const playlistId = createResult.data!.id
|
||||
|
||||
// 2. 添加歌曲
|
||||
const songs = [
|
||||
{
|
||||
songmid: 'song1',
|
||||
name: '歌曲1',
|
||||
singer: '歌手1',
|
||||
albumName: '专辑1',
|
||||
albumId: 'album1',
|
||||
duration: 240,
|
||||
source: 'local'
|
||||
}
|
||||
]
|
||||
|
||||
await songListAPI.addSongs(playlistId, songs)
|
||||
|
||||
// 3. 获取歌单详情
|
||||
const detail = await songListAPI.getPlaylistDetail(playlistId)
|
||||
console.log('歌单信息:', detail.playlist)
|
||||
console.log('歌曲列表:', detail.songs)
|
||||
|
||||
// 4. 搜索歌曲
|
||||
const searchResult = await songListAPI.searchSongs(playlistId, '歌曲')
|
||||
console.log('搜索结果:', searchResult.data)
|
||||
|
||||
// 5. 获取统计信息
|
||||
const stats = await songListAPI.getSongStatistics(playlistId)
|
||||
console.log('统计信息:', stats.data)
|
||||
} catch (error) {
|
||||
console.error('操作失败:', error)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### React 组件中的使用
|
||||
|
||||
```typescript
|
||||
import React, { useState, useEffect } from 'react'
|
||||
import songListAPI from '@/api/songList'
|
||||
import type { SongList } from '@common/types/songList'
|
||||
|
||||
const PlaylistManager: React.FC = () => {
|
||||
const [playlists, setPlaylists] = useState<SongList[]>([])
|
||||
const [loading, setLoading] = useState(false)
|
||||
|
||||
// 加载歌单列表
|
||||
const loadPlaylists = async () => {
|
||||
setLoading(true)
|
||||
try {
|
||||
const result = await songListAPI.getAll()
|
||||
if (result.success) {
|
||||
setPlaylists(result.data || [])
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载歌单失败:', error)
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
}
|
||||
|
||||
// 创建新歌单
|
||||
const createPlaylist = async (name: string) => {
|
||||
const result = await songListAPI.create(name)
|
||||
if (result.success) {
|
||||
await loadPlaylists() // 重新加载列表
|
||||
}
|
||||
}
|
||||
|
||||
// 删除歌单
|
||||
const deletePlaylist = async (id: string) => {
|
||||
const result = await songListAPI.safeDelete(id, async () => {
|
||||
return confirm('确定要删除这个歌单吗?')
|
||||
})
|
||||
|
||||
if (result.success) {
|
||||
await loadPlaylists() // 重新加载列表
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
loadPlaylists()
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div>
|
||||
{loading ? (
|
||||
<div>加载中...</div>
|
||||
) : (
|
||||
<div>
|
||||
{playlists.map(playlist => (
|
||||
<div key={playlist.id}>
|
||||
<h3>{playlist.name}</h3>
|
||||
<p>{playlist.description}</p>
|
||||
<button onClick={() => deletePlaylist(playlist.id)}>
|
||||
删除
|
||||
</button>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
## 性能优化建议
|
||||
|
||||
1. **批量操作**:使用 `batchDelete` 和 `removeSongs` 进行批量操作
|
||||
2. **数据缓存**:在前端适当缓存歌单列表,避免频繁请求
|
||||
3. **懒加载**:歌曲列表可以按需加载,不必一次性加载所有数据
|
||||
4. **错误恢复**:使用 `checkAndRepair` 定期检查数据完整性
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 所有 API 都是异步的,需要使用 `await` 或 `.then()`
|
||||
2. 歌单 ID (`hashId`) 是唯一标识符,不要与数组索引混淆
|
||||
3. 歌曲 ID (`songmid`) 可能是字符串或数字类型
|
||||
4. 删除操作是不可逆的,建议使用 `safeDelete` 方法
|
||||
5. 大量数据操作时注意性能影响
|
||||
|
||||
## 更新日志
|
||||
|
||||
### v1.0.0 (2024-01-10)
|
||||
|
||||
- ✨ 初始版本发布
|
||||
- ✨ 完整的歌单管理功能
|
||||
- ✨ 批量操作支持
|
||||
- ✨ 数据完整性检查
|
||||
- ✨ TypeScript 类型支持
|
||||
- ✨ 详细的使用文档和示例
|
||||
|
||||
---
|
||||
|
||||
如有问题或建议,请提交 Issue 或 Pull Request。
|
||||
@@ -12,6 +12,7 @@ files:
|
||||
- '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}'
|
||||
asarUnpack:
|
||||
- resources/**
|
||||
- node_modules/ffmpeg-static/**
|
||||
win:
|
||||
executableName: ceru-music
|
||||
icon: 'resources/icons/icon.ico'
|
||||
@@ -19,6 +20,7 @@ win:
|
||||
- target: nsis
|
||||
arch:
|
||||
- x64
|
||||
- ia32
|
||||
# 简化版本信息设置,避免rcedit错误
|
||||
fileAssociations:
|
||||
- ext: cerumusic
|
||||
@@ -30,7 +32,7 @@ win:
|
||||
# 或者使用证书存储
|
||||
# certificateSubjectName: "Your Company Name"
|
||||
nsis:
|
||||
artifactName: ${name}-${version}-setup.${ext}
|
||||
artifactName: ${name}-${version}-${arch}-setup.${ext}
|
||||
shortcutName: ${productName}
|
||||
uninstallDisplayName: ${productName}
|
||||
createDesktopShortcut: always
|
||||
@@ -40,16 +42,17 @@ nsis:
|
||||
allowToChangeInstallationDirectory: true
|
||||
allowElevation: true
|
||||
mac:
|
||||
icon: 'resources/icons/icon.icns'
|
||||
entitlementsInherit: build/entitlements.mac.plist
|
||||
extendInfo:
|
||||
- NSCameraUsageDescription: Application requests access to the device's camera.
|
||||
- NSMicrophoneUsageDescription: Application requests access to the device's microphone.
|
||||
- NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder.
|
||||
- NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder.
|
||||
- NSDocumentsFolderUsageDescription: 需要访问文档文件夹来保存和打开您创建的文件。
|
||||
- NSDownloadsFolderUsageDescription: 需要访问下载文件夹来管理您下载的内容。
|
||||
notarize: false
|
||||
dmg:
|
||||
artifactName: ${name}-${version}.${ext}
|
||||
title: ${productName}
|
||||
linux:
|
||||
icon: 'resources/icons'
|
||||
target:
|
||||
- AppImage
|
||||
- snap
|
||||
@@ -61,6 +64,6 @@ appImage:
|
||||
npmRebuild: false
|
||||
publish:
|
||||
provider: generic
|
||||
url: https://example.com/auto-updates
|
||||
url: https://update.ceru.shiqianjiang.cn
|
||||
electronDownload:
|
||||
mirror: https://npmmirror.com/mirrors/electron/
|
||||
|
||||
@@ -36,14 +36,16 @@ export default defineConfig({
|
||||
TDesignResolver({
|
||||
library: 'vue-next'
|
||||
})
|
||||
]
|
||||
],
|
||||
dts: true
|
||||
}),
|
||||
Components({
|
||||
resolvers: [
|
||||
TDesignResolver({
|
||||
library: 'vue-next'
|
||||
})
|
||||
]
|
||||
],
|
||||
dts: true
|
||||
})
|
||||
],
|
||||
base: './',
|
||||
|
||||
235
eslint.config.js
Normal file
@@ -0,0 +1,235 @@
|
||||
import js from '@eslint/js'
|
||||
import tseslint from 'typescript-eslint'
|
||||
import vue from 'eslint-plugin-vue'
|
||||
import prettier from '@electron-toolkit/eslint-config-prettier'
|
||||
|
||||
export default [
|
||||
// 基础 JavaScript 推荐配置
|
||||
js.configs.recommended,
|
||||
|
||||
// TypeScript 推荐配置
|
||||
...tseslint.configs.recommended,
|
||||
|
||||
// Vue 3 推荐配置
|
||||
...vue.configs['flat/recommended'],
|
||||
|
||||
// 忽略的文件和目录
|
||||
{
|
||||
ignores: [
|
||||
'**/node_modules/**',
|
||||
'**/dist/**',
|
||||
'**/out/**',
|
||||
'**/build/**',
|
||||
'**/.vitepress/**',
|
||||
'**/docs/**',
|
||||
'**/website/**',
|
||||
'**/coverage/**',
|
||||
'**/*.min.js',
|
||||
'**/auto-imports.d.ts',
|
||||
'**/components.d.ts',
|
||||
'src/preload/index.d.ts', // 忽略类型定义文件
|
||||
'src/renderer/src/assets/icon_font/**', // 忽略第三方图标字体文件
|
||||
'src/main/utils/musicSdk/**', // 忽略第三方音乐 SDK
|
||||
'src/main/utils/request.js', // 忽略第三方请求库
|
||||
'scripts/**', // 忽略脚本文件
|
||||
'src/common/utils/lyricUtils/**' // 忽略第三方歌词工具
|
||||
]
|
||||
},
|
||||
|
||||
// 全局配置
|
||||
{
|
||||
files: ['**/*.{js,ts,vue}'],
|
||||
languageOptions: {
|
||||
ecmaVersion: 'latest',
|
||||
sourceType: 'module'
|
||||
},
|
||||
rules: {
|
||||
// 代码质量 (放宽规则)
|
||||
'no-unused-vars': 'off', // 由 TypeScript 处理
|
||||
'no-undef': 'off', // 由 TypeScript 处理
|
||||
'prefer-const': 'warn', // 降级为警告
|
||||
'no-var': 'warn', // 降级为警告
|
||||
'no-duplicate-imports': 'off', // 允许重复导入
|
||||
'no-useless-return': 'off',
|
||||
'no-useless-concat': 'off',
|
||||
'no-useless-escape': 'off',
|
||||
'no-unreachable': 'warn',
|
||||
'no-debugger': 'off',
|
||||
|
||||
// 代码风格 (大幅放宽)
|
||||
eqeqeq: 'off', // 允许 == 和 ===
|
||||
curly: 'off', // 允许不使用大括号
|
||||
'brace-style': 'off',
|
||||
'comma-dangle': 'off',
|
||||
quotes: 'off',
|
||||
semi: 'off',
|
||||
indent: 'off',
|
||||
'object-curly-spacing': 'off',
|
||||
'array-bracket-spacing': 'off',
|
||||
'space-before-function-paren': 'off',
|
||||
|
||||
// 最佳实践 (放宽)
|
||||
'no-eval': 'warn',
|
||||
'no-implied-eval': 'warn',
|
||||
'no-new-func': 'warn',
|
||||
'no-alert': 'off',
|
||||
'no-empty': 'off', // 允许空块
|
||||
'no-extra-boolean-cast': 'off',
|
||||
'no-extra-semi': 'off',
|
||||
'no-irregular-whitespace': 'off',
|
||||
'no-multiple-empty-lines': 'off',
|
||||
'no-trailing-spaces': 'off',
|
||||
'eol-last': 'off',
|
||||
'no-fallthrough': 'off', // 允许 switch case 穿透
|
||||
'no-case-declarations': 'off', // 允许 case 中声明变量
|
||||
'no-empty-pattern': 'off', // 允许空对象模式
|
||||
'no-prototype-builtins': 'off', // 允许直接调用 hasOwnProperty
|
||||
'no-self-assign': 'off', // 允许自赋值
|
||||
'no-async-promise-executor': 'off' // 允许异步 Promise 执行器
|
||||
}
|
||||
},
|
||||
|
||||
// 主进程 TypeScript 配置
|
||||
{
|
||||
files: ['src/main/**/*.ts', 'src/preload/**/*.ts', 'src/common/**/*.ts', 'src/types/**/*.ts'],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
project: './tsconfig.node.json',
|
||||
tsconfigRootDir: process.cwd()
|
||||
}
|
||||
},
|
||||
rules: {
|
||||
// TypeScript 特定规则 (大幅放宽)
|
||||
'@typescript-eslint/no-unused-vars': 'off', // 完全关闭未使用变量检查
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||
'@typescript-eslint/no-var-requires': 'off', // 允许 require
|
||||
'@typescript-eslint/ban-ts-comment': 'off', // 允许 @ts-ignore
|
||||
'@typescript-eslint/no-empty-function': 'off', // 允许空函数
|
||||
'@typescript-eslint/no-inferrable-types': 'off',
|
||||
'@typescript-eslint/no-unused-expressions': 'off', // 允许未使用的表达式
|
||||
'@typescript-eslint/no-require-imports': 'off', // 允许 require 导入
|
||||
'@typescript-eslint/no-unsafe-function-type': 'off', // 允许 Function 类型
|
||||
'@typescript-eslint/prefer-as-const': 'off' // 允许字面量类型
|
||||
}
|
||||
},
|
||||
|
||||
// 渲染进程 TypeScript 配置
|
||||
{
|
||||
files: ['src/renderer/**/*.ts'],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
project: './tsconfig.web.json',
|
||||
tsconfigRootDir: process.cwd()
|
||||
}
|
||||
},
|
||||
rules: {
|
||||
// TypeScript 特定规则 (大幅放宽)
|
||||
'@typescript-eslint/no-unused-vars': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||
'@typescript-eslint/no-var-requires': 'off',
|
||||
'@typescript-eslint/ban-ts-comment': 'off',
|
||||
'@typescript-eslint/no-empty-function': 'off',
|
||||
'@typescript-eslint/no-inferrable-types': 'off',
|
||||
'@typescript-eslint/no-unused-expressions': 'off',
|
||||
'@typescript-eslint/no-require-imports': 'off',
|
||||
'@typescript-eslint/no-unsafe-function-type': 'off',
|
||||
'@typescript-eslint/prefer-as-const': 'off'
|
||||
}
|
||||
},
|
||||
|
||||
// Vue 特定配置
|
||||
{
|
||||
files: ['src/renderer/**/*.vue'],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
parser: '@typescript-eslint/parser',
|
||||
extraFileExtensions: ['.vue']
|
||||
}
|
||||
},
|
||||
rules: {
|
||||
// Vue 特定规则 (大幅放宽)
|
||||
'vue/multi-word-component-names': 'off',
|
||||
'vue/no-v-html': 'off', // 允许 v-html
|
||||
'vue/require-default-prop': 'off',
|
||||
'vue/require-explicit-emits': 'off', // 不强制显式 emits
|
||||
'vue/component-definition-name-casing': 'off',
|
||||
'vue/component-name-in-template-casing': 'off',
|
||||
'vue/custom-event-name-casing': 'off', // 允许任意事件命名
|
||||
'vue/define-macros-order': 'off',
|
||||
'vue/html-self-closing': 'off',
|
||||
'vue/max-attributes-per-line': 'off',
|
||||
'vue/singleline-html-element-content-newline': 'off',
|
||||
'vue/multiline-html-element-content-newline': 'off',
|
||||
'vue/no-side-effects-in-computed-properties': 'off', // 允许计算属性中的副作用
|
||||
'vue/no-required-prop-with-default': 'off', // 允许带默认值的必需属性
|
||||
|
||||
// TypeScript 在 Vue 中的规则 (放宽)
|
||||
'@typescript-eslint/no-unused-vars': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-unsafe-function-type': 'off'
|
||||
}
|
||||
},
|
||||
|
||||
// 主进程文件配置 (Node.js 环境)
|
||||
{
|
||||
files: [
|
||||
'src/main/**/*.{ts,js}',
|
||||
'src/preload/**/*.{ts,js}',
|
||||
'electron.vite.config.*',
|
||||
'scripts/**/*.{js,ts}'
|
||||
],
|
||||
languageOptions: {
|
||||
globals: {
|
||||
__dirname: 'readonly',
|
||||
__filename: 'readonly',
|
||||
Buffer: 'readonly',
|
||||
process: 'readonly',
|
||||
global: 'readonly'
|
||||
}
|
||||
},
|
||||
rules: {
|
||||
// Node.js 特定规则 (放宽)
|
||||
'no-console': 'off',
|
||||
'no-process-exit': 'off' // 允许 process.exit()
|
||||
}
|
||||
},
|
||||
|
||||
// 渲染进程文件配置 (浏览器环境)
|
||||
{
|
||||
files: ['src/renderer/**/*.{ts,js,vue}'],
|
||||
languageOptions: {
|
||||
globals: {
|
||||
window: 'readonly',
|
||||
document: 'readonly',
|
||||
navigator: 'readonly',
|
||||
console: 'readonly',
|
||||
setTimeout: 'readonly',
|
||||
clearTimeout: 'readonly',
|
||||
setInterval: 'readonly',
|
||||
clearInterval: 'readonly'
|
||||
}
|
||||
},
|
||||
rules: {
|
||||
// 浏览器环境特定规则
|
||||
'no-console': 'off'
|
||||
}
|
||||
},
|
||||
|
||||
// 配置文件特殊规则
|
||||
{
|
||||
files: ['*.config.{js,ts}', 'vite.config.*', 'electron.vite.config.*'],
|
||||
rules: {
|
||||
'no-console': 'off',
|
||||
'@typescript-eslint/no-var-requires': 'off'
|
||||
}
|
||||
},
|
||||
|
||||
// Prettier 配置 (必须放在最后)
|
||||
prettier
|
||||
]
|
||||
@@ -1,98 +0,0 @@
|
||||
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,
|
||||
parser: '@babel/eslint-parser',
|
||||
}
|
||||
|
||||
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'],
|
||||
},
|
||||
}
|
||||
5228
package-lock.json
generated
43
package.json
@@ -1,28 +1,32 @@
|
||||
{
|
||||
"name": "ceru-music",
|
||||
"version": "1.0.0",
|
||||
"version": "1.3.9",
|
||||
"description": "一款简洁优雅的音乐播放器",
|
||||
"main": "./out/main/index.js",
|
||||
"author": "sqj,wldss,star",
|
||||
"license": "MIT",
|
||||
"homepage": "https://electron-vite.org",
|
||||
"license": "Apache-2.0",
|
||||
"homepage": "https://ceru.docs.shiqianjiang.cn",
|
||||
"scripts": {
|
||||
"format": "prettier --write .",
|
||||
"lint": "eslint --cache . --fix",
|
||||
"lint": "eslint --cache . --fix && yarn typecheck",
|
||||
"typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
|
||||
"typecheck:web": "vue-tsc --noEmit -p tsconfig.web.json --composite false",
|
||||
"typecheck": "pnpm run typecheck:node && pnpm run typecheck:web",
|
||||
"typecheck": "yarn run typecheck:node && yarn run typecheck:web",
|
||||
"start": "electron-vite preview",
|
||||
"dev": "electron-vite dev --watch",
|
||||
"build": "pnpm run typecheck && electron-vite build",
|
||||
"build": "yarn run typecheck && electron-vite build",
|
||||
"onlybuild": "electron-vite build && electron-builder --win --x64",
|
||||
"postinstall": "electron-builder install-app-deps",
|
||||
"build:unpack": "pnpm run build && electron-builder --dir",
|
||||
"build:win": "pnpm run build && electron-builder --win --x64 --config",
|
||||
"build:mac": "pnpm run build && electron-builder --mac",
|
||||
"build:linux": "pnpm run build && electron-builder --linux",
|
||||
"build:deps": "electron-builder install-app-deps && pnpm run build && electron-builder --win --x64 --config",
|
||||
"buildico": "electron-icon-builder --input=./resources/logo.png --output=resources --flatten"
|
||||
"build:unpack": "yarn run build && electron-builder --dir",
|
||||
"build:win": "yarn run build && electron-builder --win --config --publish never",
|
||||
"build:win32": "yarn run build && electron-builder --win --ia32 --config --publish never",
|
||||
"build:mac": "yarn run build && electron-builder --mac --config --publish never",
|
||||
"build:linux": "yarn run build && electron-builder --linux --config --publish never",
|
||||
"build:deps": "electron-builder install-app-deps && yarn run build && electron-builder --win --x64 --config",
|
||||
"buildico": "electron-icon-builder --input=./resources/logo.png --output=resources --flatten",
|
||||
"docs:dev": "vitepress dev docs",
|
||||
"docs:build": "vitepress build docs",
|
||||
"docs:preview": "vitepress preview docs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@applemusic-like-lyrics/lyric": "^0.2.4",
|
||||
@@ -40,22 +44,31 @@
|
||||
"@pixi/filter-bulge-pinch": "^5.1.1",
|
||||
"@pixi/filter-color-matrix": "^7.4.3",
|
||||
"@pixi/sprite": "^7.4.3",
|
||||
"@types/fluent-ffmpeg": "^2.1.27",
|
||||
"@types/needle": "^3.3.0",
|
||||
"NeteaseCloudMusicApi": "^4.27.0",
|
||||
"animate.css": "^4.1.1",
|
||||
"axios": "^1.11.0",
|
||||
"color-extraction": "^1.0.8",
|
||||
"crypto-js": "^4.2.0",
|
||||
"dompurify": "^3.2.6",
|
||||
"electron-log": "^5.4.3",
|
||||
"electron-updater": "^6.3.9",
|
||||
"ffmpeg-static": "^5.2.0",
|
||||
"fluent-ffmpeg": "^2.1.3",
|
||||
"hpagent": "^1.2.0",
|
||||
"iconv-lite": "^0.7.0",
|
||||
"jss": "^10.10.0",
|
||||
"jss-preset-default": "^10.10.0",
|
||||
"lodash": "^4.17.21",
|
||||
"markdown-it-footnote": "^4.0.0",
|
||||
"marked": "^16.1.2",
|
||||
"mitt": "^3.0.1",
|
||||
"needle": "^3.3.1",
|
||||
"node-fetch": "2",
|
||||
"node-id3": "^0.2.9",
|
||||
"pinia": "^3.0.3",
|
||||
"tdesign-icons-vue-next": "^0.4.1",
|
||||
"tdesign-vue-next": "^1.15.2",
|
||||
"vue-router": "^4.5.1",
|
||||
"zlib": "^1.0.5"
|
||||
@@ -68,10 +81,11 @@
|
||||
"@electron-toolkit/tsconfig": "^1.0.1",
|
||||
"@tdesign-vue-next/auto-import-resolver": "^0.1.1",
|
||||
"@types/crypto-js": "^4.2.2",
|
||||
"@types/markdown-it-footnote": "^3.0.4",
|
||||
"@types/node": "^22.16.5",
|
||||
"@types/node-fetch": "^2.6.13",
|
||||
"@vitejs/plugin-vue": "^6.0.0",
|
||||
"electron": "^37.3.1",
|
||||
"electron": "^38.1.0",
|
||||
"electron-builder": "^25.1.8",
|
||||
"electron-icon-builder": "^2.0.1",
|
||||
"electron-vite": "^4.0.0",
|
||||
@@ -88,7 +102,8 @@
|
||||
"vite-plugin-top-level-await": "^1.6.0",
|
||||
"vite-plugin-vue-devtools": "^8.0.0",
|
||||
"vite-plugin-wasm": "^3.5.0",
|
||||
"vue": "^3.5.17",
|
||||
"vitepress": "^1.6.4",
|
||||
"vue": "^3.5.21",
|
||||
"vue-eslint-parser": "^10.2.0",
|
||||
"vue-tsc": "^3.0.3"
|
||||
}
|
||||
|
||||
@@ -1,145 +0,0 @@
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/2645500113"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/2645500113"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
error "[ceru 音乐插件] 请求失败: 歌曲不存在"
|
||||
error "[ceru 音乐插件] Error: 歌曲不存在"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: {\"status\":true,\"song_data\":{\"id\":2645500113,\"name\":\"跳楼机\",\"artist\":\"LBI利比\",\"album\":\"跳楼机\",\"pic_id\":\"109951170507596121\",\"url_id\":2645500113,\"lyric_id\":2645500113,\"source\":\"netease\",\"lyric\":\"[00:00.00] 作..."log "[ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/2645500113"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/2645500113"
|
||||
log "[ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/2645500113"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/2645500113"
|
||||
log "[ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/1135545898"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/1135545898"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/1139605559"
|
||||
log "[ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/1139605559"
|
||||
log "[ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/2149456401"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/2149456401"
|
||||
log "[ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/2003594562"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/2003594562"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: ..."
|
||||
error "[ceru 音乐插件] Error: 歌曲不存在"
|
||||
error "[ceru 音乐插件] 请求失败: 歌曲不存在"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: ..."
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[ceru 音乐插件] Error: 歌曲不存在"
|
||||
error "[ceru 音乐插件] 请求失败: 歌曲不存在"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: {\"status\":true,\"song_data\":{\"id\":2645500113,\"name\":\"跳楼机\",\"artist\":\"LBI利比\",\"album\":\"跳楼机\",\"pic_id\":\"109951170507596121\",\"url_id\":2645500113,\"lyric_id\":2645500113,\"source\":\"netease\",\"lyric\":\"[00:00.00] 作..."
|
||||
error "[ceru 音乐插件] Error: 歌曲不存在"
|
||||
error "[ceru 音乐插件] 请求失败: 歌曲不存在"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: {\"status\":true,\"song_data\":{\"id\":2645500113,\"name\":\"跳楼机\",\"artist\":\"LBI利比\",\"album\":\"跳楼机\",\"pic_id\":\"109951170507596121\",\"url_id\":2645500113,\"lyric_id\":2645500113,\"source\":\"netease\",\"lyric\":\"[00:00.00] 作..."
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[ceru 音乐插件] Error: 歌曲不存在"
|
||||
error "[ceru 音乐插件] 请求失败: 歌曲不存在"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: {\"status\":true,\"song_data\":{\"id\":2149456401,\"name\":\"alone.\",\"artist\":\"DLSS\",\"album\":\"alone.\",\"pic_id\":\"109951169530908047\",\"url_id\":2149456401,\"lyric_id\":2149456401,\"source\":\"netease\",\"lyric\":\"[00:00...."
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[ceru 音乐插件] Error: 歌曲不存在"
|
||||
error "[ceru 音乐插件] 请求失败: 歌曲不存在"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: {\"status\":true,\"song_data\":{\"id\":2003594562,\"name\":\"天晴\",\"artist\":\"是二智呀\",\"album\":\"天晴\",\"pic_id\":\"109951168114308737\",\"url_id\":2003594562,\"lyric_id\":2003594562,\"source\":\"netease\",\"lyric\":\"[00:00.06]作词:陈澈..."
|
||||
error "[ceru 音乐插件] Error: 歌曲不存在"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[ceru 音乐插件] 请求失败: 歌曲不存在"
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/2645500113"
|
||||
log "[ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/2645500113"
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/2645500113"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/2645500113"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/254574
|
||||
log [CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/254574
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"status":true,"song_data":{"id":254574,"name":"后来","artist":"刘若英","album":"我等你","pic_id":"109951163351825356","url_id":254574,"lyric_id":254574,"source":"netease","lyric":"[00:00.000] 作词 : 施人诚\n[00:01.000] 作曲 : 玉城千春\n[00:02.000] 编曲 : 王继康\n[00:03.000] 制作人 : 光良\n[00:12.571]后来 我总算学会了如何去爱\n[00:19.303]可惜你 早已远去 消失在人海\n[00:25.238]后来 终于在眼泪中明白\n[00:32.064]有些人 一旦错过就不在\n[00:39.800]栀子花 白花瓣\n[00:46.027]落在我蓝色百褶裙上\n[00:51.763]爱你 你轻声说\n[00:58.844]我低下头 闻见一阵芬芳\n[01:05.371]那个永恒的夜晚\n[01:09.341]十七岁仲夏\n[01:12.104]你吻我的那个夜晚\n[01:18.232]让我往后的时光\n[01:21.749]每当有感叹\n[01:24.862]总想起当天的星光\n[01:30.992]那时候的爱情\n[01:37.422]为什么就能那样简单\n[01:42.493]而又是为什么 人年少时\n[01:50.179]一定要让深爱的人受伤\n[01:56.301]在这相似的深夜里\n[02:00.566]你是否一样 也在静静追悔感伤\n[02:09.350]如果当时我们能\n[02:13.015]不那么倔强\n[02:16.079]现在也 不那么遗憾\n[02:21.053]你都如何回忆我\n[02:24.014]带着笑或是很沉默\n[02:27.231]这些年来\n[02:28.837]有没有人能让你不寂寞\n[02:33.455]后来 我总算学会了如何去爱\n[02:40.238]可惜你 早已远去 消失在人海\n[02:46.318]后来 终于在眼泪中明白\n[02:53.042]有些人 一旦错过就不在\n[03:25.379]你都如何回忆我\n[03:28.132]带着笑或是很沉默\n[03:31.296]这些年来\n[03:32.953]有没有人能让你不寂寞\n[03:37.523]后来\n[03:39.530]我总算学会了如何去爱\n[03:44.301]可惜你 早已远去 消失在人海\n[03:50.174]后来 终于在眼泪中明白\n[03:57.104]有些人 一旦错过就不在\n[04:03.136]后来 我总算学会了如何去爱\n[02:59.120]\n[04:09.965]可惜你 早已远去 消失在人海\n[04:15.937]后来 终于在眼泪中明白\n[04:22.771]有些人 一旦错过就不在\n[04:29.598]永远不会再重来\n[04:35.510]有一个男孩爱着那个女孩\n[05:02.681]录音工程师 : 周建平 & Peter Chong (MAL)\n[05:03.781]混音工程师 : 王晋溢\n[05:04.881]录音室 : 捷奏 & Synchrosound (MAL)\n[05:05.981]混音室 : 白金录音室\n[05:06.111]吉他 : Jamie Wilson\n[05:07.222]和声编写 : 光良\n[05:08.333]和声 : 梁静茹\n[05:09.444]OP : Victor Music Publishing Co., Ltd.\n[05:10.555]ISRC TW-A45-99-62502\n","pic":"https://p3.music.126.net/eBF7bHnJYBUfOFrJ_7SUfw==/109951163351825356.jpg?param=300y300","url":"https://m701.music.126.net/20250822145154/db9d934a5c833fe5bbe68e21bfd4720f/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/14783185971/f717/93d1/d743/037c337c4123b835758717a3e2e9286b.mp3","size":13658950,"br":320}}
|
||||
log [ceru 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/254574
|
||||
log [CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/254574
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"status":true,"song_data":{"id":254574,"name":"后来","artist":"刘若英","album":"我等你","pic_id":"109951163351825356","url_id":254574,"lyric_id":254574,"source":"netease","lyric":"[00:00.000] 作词 : 施人诚\n[00:01.000] 作曲 : 玉城千春\n[00:02.000] 编曲 : 王继康\n[00:03.000] 制作人 : 光良\n[00:12.571]后来 我总算学会了如何去爱\n[00:19.303]可惜你 早已远去 消失在人海\n[00:25.238]后来 终于在眼泪中明白\n[00:32.064]有些人 一旦错过就不在\n[00:39.800]栀子花 白花瓣\n[00:46.027]落在我蓝色百褶裙上\n[00:51.763]爱你 你轻声说\n[00:58.844]我低下头 闻见一阵芬芳\n[01:05.371]那个永恒的夜晚\n[01:09.341]十七岁仲夏\n[01:12.104]你吻我的那个夜晚\n[01:18.232]让我往后的时光\n[01:21.749]每当有感叹\n[01:24.862]总想起当天的星光\n[01:30.992]那时候的爱情\n[01:37.422]为什么就能那样简单\n[01:42.493]而又是为什么 人年少时\n[01:50.179]一定要让深爱的人受伤\n[01:56.301]在这相似的深夜里\n[02:00.566]你是否一样 也在静静追悔感伤\n[02:09.350]如果当时我们能\n[02:13.015]不那么倔强\n[02:16.079]现在也 不那么遗憾\n[02:21.053]你都如何回忆我\n[02:24.014]带着笑或是很沉默\n[02:27.231]这些年来\n[02:28.837]有没有人能让你不寂寞\n[02:33.455]后来 我总算学会了如何去爱\n[02:40.238]可惜你 早已远去 消失在人海\n[02:46.318]后来 终于在眼泪中明白\n[02:53.042]有些人 一旦错过就不在\n[03:25.379]你都如何回忆我\n[03:28.132]带着笑或是很沉默\n[03:31.296]这些年来\n[03:32.953]有没有人能让你不寂寞\n[03:37.523]后来\n[03:39.530]我总算学会了如何去爱\n[03:44.301]可惜你 早已远去 消失在人海\n[03:50.174]后来 终于在眼泪中明白\n[03:57.104]有些人 一旦错过就不在\n[04:03.136]后来 我总算学会了如何去爱\n[02:59.120]\n[04:09.965]可惜你 早已远去 消失在人海\n[04:15.937]后来 终于在眼泪中明白\n[04:22.771]有些人 一旦错过就不在\n[04:29.598]永远不会再重来\n[04:35.510]有一个男孩爱着那个女孩\n[05:02.681]录音工程师 : 周建平 & Peter Chong (MAL)\n[05:03.781]混音工程师 : 王晋溢\n[05:04.881]录音室 : 捷奏 & Synchrosound (MAL)\n[05:05.981]混音室 : 白金录音室\n[05:06.111]吉他 : Jamie Wilson\n[05:07.222]和声编写 : 光良\n[05:08.333]和声 : 梁静茹\n[05:09.444]OP : Victor Music Publishing Co., Ltd.\n[05:10.555]ISRC TW-A45-99-62502\n","pic":"https://p3.music.126.net/eBF7bHnJYBUfOFrJ_7SUfw==/109951163351825356.jpg?param=300y300","url":"https://m701.music.126.net/20250822145155/4f1e01f33ad960791480b07624819f2a/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/14783185971/f717/93d1/d743/037c337c4123b835758717a3e2e9286b.mp3","size":13658950,"br":320}}
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
log [CeruMusic] Plugin "ceru 音乐插件" loaded successfully.
|
||||
@@ -1,100 +0,0 @@
|
||||
log [CeruMusic] Plugin "未知插件" loaded successfully.log [插件] 注册事件监听器: request
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/urlinfo/1.0.0
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 请求响应状态: 503
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [插件] 音源注册完成: kw,wy,mg,tx,kg
|
||||
log [插件] 发送事件: inited [object Object]
|
||||
error [CeruMusic] Request failed: Expected JSON response but got: text/html
|
||||
log [CeruMusic] 响应不是JSON格式,内容: <html>
|
||||
<head><title>503 Service Temporarily Unavailable</title></head>
|
||||
<body>
|
||||
<center><h1>503 Service Temporarily Unavailable</h1></center>
|
||||
<hr><center>nginx/1.26.1</center>
|
||||
</body>
|
||||
</html>
|
||||
...
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/254574/320k
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件] 使用事件驱动方式获取 kw 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/kw/2061973302/320k
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
@@ -1,28 +0,0 @@
|
||||
log "[CeruMusic] Plugin \"LiHouse 音乐插件\" loaded successfully."log "[LiHouse 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/1135545898"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/1135545898"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/2149456401"
|
||||
log "[LiHouse 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/2149456401"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/2003594562"
|
||||
log "[LiHouse 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/2003594562"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: ..."
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[LiHouse 音乐插件] 请求失败: 歌曲不存在"
|
||||
error "[LiHouse 音乐插件] Error: 歌曲不存在"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: {\"status\":true,\"song_data\":{\"id\":2149456401,\"name\":\"alone.\",\"artist\":\"DLSS\",\"album\":\"alone.\",\"pic_id\":\"109951169530908047\",\"url_id\":2149456401,\"lyric_id\":2149456401,\"source\":\"netease\",\"lyric\":\"[00:00...."
|
||||
error "[LiHouse 音乐插件] Error: 歌曲不存在"
|
||||
error "[LiHouse 音乐插件] 请求失败: 歌曲不存在"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[LiHouse 音乐插件] 请求失败: 歌曲不存在"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: {\"status\":true,\"song_data\":{\"id\":2003594562,\"name\":\"天晴\",\"artist\":\"是二智呀\",\"album\":\"天晴\",\"pic_id\":\"109951168114308737\",\"url_id\":2003594562,\"lyric_id\":2003594562,\"source\":\"netease\",\"lyric\":\"[00:00.06]作词:陈澈..."
|
||||
error "[LiHouse 音乐插件] Error: 歌曲不存在"
|
||||
log "[CeruMusic] 发起请求: https://www.lihouse.xyz/coco_widget/music_resource/id/2149456401"
|
||||
log "[LiHouse 音乐插件] 请求音乐链接: https://www.lihouse.xyz/coco_widget/music_resource/id/2149456401"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 响应不是JSON格式,内容: {\"status\":true,\"song_data\":{\"id\":2149456401,\"name\":\"alone.\",\"artist\":\"DLSS\",\"album\":\"alone.\",\"pic_id\":\"109951169530908047\",\"url_id\":2149456401,\"lyric_id\":2149456401,\"source\":\"netease\",\"lyric\":\"[00:00...."
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[LiHouse 音乐插件] Error: 歌曲不存在"
|
||||
error "[LiHouse 音乐插件] 请求失败: 歌曲不存在"
|
||||
@@ -1,200 +0,0 @@
|
||||
end
|
||||
log handleGetMusicUrl(kg_178240, hires) failed: Key失效/鉴权失败
|
||||
log [ikun音源] 使用事件驱动方式获取 kw 音源链接
|
||||
start Handle Action(musicUrl)
|
||||
log musicInfo {"name":"后来","singer":"刘若英","source":"kw","songmid":"96765035","albumId":"13825074","interval":"05:09","albumName":"2020 刘若英陪你 献上录音专辑","lrc":null,"img":"http://img1.kwcdn.kuwo.cn/star/albumcover/500/s4s68/34/3776980601.jpg","otherSource":null,"types":[{"type":"128k","size":"4.72Mb"},{"type":"320k","size":"11.80Mb"},{"type":"flac","size":"60.23Mb"},{"type":"flac24bit","size":"60.23Mb"}],"_types":{"flac24bit":{"size":"60.23MB"},"flac":{"size":"60.23MB"},"320k":{"size":"11.80MB"},"128k":{"size":"4.72MB"}},"typeUrl":{},"url":"http://cu.sycdn.kuwo.cn/226d5ab974a1d2ca5b5643e2354e7696/68a73db3/resource/s2/87/81/730236710.flac"}
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/url?source=kw&songId=96765035&quality=hires
|
||||
log quality hires
|
||||
log source kw
|
||||
log --- start --- https://api.ikunshare.com/url?source=kw&songId=96765035&quality=hires
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log API Response: {"body":{"code":200,"message":"成功","url":"http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac","info":{"id":"96765035","name":"后来","album":"2020 刘若英陪你 献上录音专辑","artist":"刘若英"},"ekey":null,"cache":false,"quality":{"target":"无损音质 24Bit","result":"无损音质 24Bit"},"expire":{"ExpireAt":"2025-08-22 12:15:35","canExpire":true},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:30:35 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["583"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.12571569811552763"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","url":"http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac","info":{"id":"96765035","name":"后来","album":"2020 刘若英陪你 献上录音专辑","artist":"刘若英"},"ekey":null,"cache":false,"quality":{"target":"无损音质 24Bit","result":"无损音质 24Bit"},"expire":{"ExpireAt":"2025-08-22 12:15:35","canExpire":true},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
end
|
||||
log handleGetMusicUrl(kw_96765035, hires) success, URL: http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac
|
||||
log [ikun音源] Got URL: http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flaclog 提取到的 MUSIC_QUALITY 字符串: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 解析后的 MUSIC_QUALITY 数据: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 提取的音源配置: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [ikun音源 by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]}}}
|
||||
log [ikun音源 by Ceru插件] 音源注册完成: ["kw","wy","mg"]
|
||||
log [ikun音源 by Ceru插件] 注册事件监听器: request
|
||||
log [ikun音源 by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [CeruMusic] Plugin "ikun音源" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log --- start --- https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log API Response: {"body":{"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:32:16 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["370"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.0007874071598052979"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
log checkUpdate success
|
||||
log [ikun音源 by Ceru插件] 发送事件: updateAlert {"log":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"}
|
||||
log [ikun音源] 使用事件驱动方式获取 kw 音源链接
|
||||
start Handle Action(musicUrl)
|
||||
log quality hires
|
||||
log musicInfo {"name":"后来","singer":"刘若英","source":"kw","songmid":"96765035","albumId":"13825074","interval":"05:09","albumName":"2020 刘若英陪你 献上录音专辑","lrc":null,"img":"http://img1.kwcdn.kuwo.cn/star/albumcover/500/s4s68/34/3776980601.jpg","otherSource":null,"types":[{"type":"128k","size":"4.72Mb"},{"type":"320k","size":"11.80Mb"},{"type":"flac","size":"60.23Mb"},{"type":"flac24bit","size":"60.23Mb"}],"_types":{"flac24bit":{"size":"60.23MB"},"flac":{"size":"60.23MB"},"320k":{"size":"11.80MB"},"128k":{"size":"4.72MB"}},"typeUrl":{},"url":"http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac"}
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/url?source=kw&songId=96765035&quality=hires
|
||||
log source kw
|
||||
log --- start --- https://api.ikunshare.com/url?source=kw&songId=96765035&quality=hires
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","url":"http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac","info":{"id":"96765035","name":"后来","album":"2020 刘若英陪你 献上录音专辑","artist":"刘若英"},"ekey":null,"cache":true,"quality":{"target":"无损音质 24Bit","result":"无损音质 24Bit"},"expire":{"ExpireAt":"2025-08-22 12:15:35","canExpire":true},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log API Response: {"body":{"code":200,"message":"成功","url":"http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac","info":{"id":"96765035","name":"后来","album":"2020 刘若英陪你 献上录音专辑","artist":"刘若英"},"ekey":null,"cache":true,"quality":{"target":"无损音质 24Bit","result":"无损音质 24Bit"},"expire":{"ExpireAt":"2025-08-22 12:15:35","canExpire":true},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:32:17 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["582"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.0030085640028119087"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
end
|
||||
log handleGetMusicUrl(kw_96765035, hires) success, URL: http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac
|
||||
log [ikun音源] Got URL: http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac
|
||||
log 提取到的 MUSIC_QUALITY 字符串: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 解析后的 MUSIC_QUALITY 数据: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log [ikun音源 by Ceru插件] 注册事件监听器: request
|
||||
log 提取的音源配置: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log --- start --- https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [ikun音源 by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]}}}
|
||||
log [ikun音源 by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [ikun音源 by Ceru插件] 音源注册完成: ["kw","wy","mg"]
|
||||
log [CeruMusic] Plugin "ikun音源" loaded successfully.
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log API Response: {"body":{"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:32:58 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["370"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.0008850144222378731"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
log checkUpdate success
|
||||
log [ikun音源 by Ceru插件] 发送事件: updateAlert {"log":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"}
|
||||
log [ikun音源] 使用事件驱动方式获取 kw 音源链接
|
||||
error [ikun音源] Error: args.map is not a function
|
||||
log 提取到的 MUSIC_QUALITY 字符串: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 解析后的 MUSIC_QUALITY 数据: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 提取的音源配置: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [ikun音源 by Ceru插件] 注册事件监听器: request
|
||||
log --- start --- https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [ikun音源 by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]}}}
|
||||
log [ikun音源 by Ceru插件] 音源注册完成: ["kw","wy","mg"]
|
||||
log [ikun音源 by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "ikun音源" loaded successfully.
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log API Response: {"body":{"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:33:02 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["370"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.0008127372711896896"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
log checkUpdate success
|
||||
log [ikun音源 by Ceru插件] 发送事件: updateAlert {"log":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"}
|
||||
log [ikun音源] 使用事件驱动方式获取 kw 音源链接
|
||||
error [ikun音源] Error: args.map is not a function
|
||||
log 提取到的 MUSIC_QUALITY 字符串: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 解析后的 MUSIC_QUALITY 数据: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 提取的音源配置: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [ikun音源 by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]}}}
|
||||
log [ikun音源 by Ceru插件] 音源注册完成: ["kw","wy","mg"]
|
||||
log [ikun音源 by Ceru插件] 注册事件监听器: request
|
||||
log --- start --- https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [ikun音源 by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "ikun音源" loaded successfully.
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log API Response: {"body":{"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:33:30 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["370"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.0008348245173692703"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
log [ikun音源 by Ceru插件] 发送事件: updateAlert {"log":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"}
|
||||
log checkUpdate success
|
||||
log [ikun音源] 使用事件驱动方式获取 kw 音源链接
|
||||
error [ikun音源] Error: args.map is not a function
|
||||
log 提取到的 MUSIC_QUALITY 字符串: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 解析后的 MUSIC_QUALITY 数据: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 提取的音源配置: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [ikun音源 by Ceru插件] 注册事件监听器: request
|
||||
log --- start --- https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [ikun音源 by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]}}}
|
||||
log [ikun音源 by Ceru插件] 音源注册完成: ["kw","wy","mg"]
|
||||
log [ikun音源 by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "ikun音源" loaded successfully.
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log API Response: {"body":{"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:34:27 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["370"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.0008898386731743813"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
log checkUpdate success
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log [ikun音源 by Ceru插件] 发送事件: updateAlert {"log":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"}
|
||||
log [ikun音源] 使用事件驱动方式获取 kw 音源链接
|
||||
error [ikun音源] Error: args.map is not a functionlog [ikun音源] 使用事件驱动方式获取 kw 音源链接
|
||||
error [ikun音源] Error: args.map is not a function
|
||||
error [ikun音源] Error: args.map is not a function
|
||||
log [ikun音源] 使用事件驱动方式获取 kg 音源链接
|
||||
log [ikun音源] 使用事件驱动方式获取 kg 音源链接
|
||||
error [ikun音源] Error: args.map is not a function
|
||||
log 提取到的 MUSIC_QUALITY 字符串: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 解析后的 MUSIC_QUALITY 数据: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 提取的音源配置: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [ikun音源 by Ceru插件] 注册事件监听器: request
|
||||
log [ikun音源 by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]}}}
|
||||
log --- start --- https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [ikun音源 by Ceru插件] 音源注册完成: ["kw","wy","mg"]
|
||||
log [ikun音源 by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "ikun音源" loaded successfully.
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log API Response: {"body":{"code":200,"message":"成功","data":{"updateMsg":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:35:51 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["370"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.0008251480758190155"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
log [ikun音源 by Ceru插件] 发送事件: updateAlert {"log":"⚠️ 重要更新\n更新地址:\nhttps://api.ikunshare.com/script\n日志:\n更换域名\nQQ群: https://qm.qq.com/q/okMS3ubs0E","updateUrl":"https://api.ikunshare.com/script"}
|
||||
log checkUpdate success
|
||||
log [ikun音源] 使用事件驱动方式获取 kg 音源链接
|
||||
log quality hires
|
||||
start groupStart--------- Handle Action(musicUrl)
|
||||
log musicInfo {"singer":"周杰伦","name":"半岛铁盒","albumName":"八度空间","albumId":"961807","songmid":178240,"source":"kg","interval":"05:19","_interval":319,"img":"http://imge.kugou.com/stdmusic/480/20250221/20250221180703846658.jpg","lrc":null,"otherSource":null,"hash":"67BA8A4A0681F2078BC423CB13B904B7","types":[{"type":"128k","size":"4.88 MB","hash":"67BA8A4A0681F2078BC423CB13B904B7"},{"type":"320k","size":"12.19 MB","hash":"68DEA6329FB28534271943B3F97599DC"},{"type":"flac","size":"34.93 MB","hash":"9F0F140F8A9C3A0E639A9BF8680E80E9"},{"type":"flac24bit","size":"61.72 MB","hash":"2CCC7683F50BE90A0C407D6FF0F973D9"}],"_types":{"128k":{"size":"4.88 MB","hash":"67BA8A4A0681F2078BC423CB13B904B7"},"320k":{"size":"12.19 MB","hash":"68DEA6329FB28534271943B3F97599DC"},"flac":{"size":"34.93 MB","hash":"9F0F140F8A9C3A0E639A9BF8680E80E9"},"flac24bit":{"size":"61.72 MB","hash":"2CCC7683F50BE90A0C407D6FF0F973D9"}},"typeUrl":{}}
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/url?source=kg&songId=67BA8A4A0681F2078BC423CB13B904B7&quality=hires
|
||||
log --- start --- https://api.ikunshare.com/url?source=kg&songId=67BA8A4A0681F2078BC423CB13B904B7&quality=hires
|
||||
log source kg
|
||||
log [CeruMusic] 请求响应状态: 403
|
||||
log API Response: {"body":{"code":403,"message":"你还没给我上供","yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":403,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:35:51 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["138"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.00015995558351278305"]}}
|
||||
log [CeruMusic] 请求响应内容: {"code":403,"message":"你还没给我上供","yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log handleGetMusicUrl(kg_178240, hires) failed: Key失效/鉴权失败
|
||||
error [ikun音源] Error: Key失效/鉴权失败
|
||||
end log [ikun音源] 使用事件驱动方式获取 kg 音源链接
|
||||
start groupStart--------- Handle Action(musicUrl)
|
||||
log source kg
|
||||
log musicInfo {"singer":"周杰伦","name":"半岛铁盒","albumName":"八度空间","albumId":"961807","songmid":178240,"source":"kg","interval":"05:19","_interval":319,"img":"http://imge.kugou.com/stdmusic/480/20250221/20250221180703846658.jpg","lrc":null,"otherSource":null,"hash":"67BA8A4A0681F2078BC423CB13B904B7","types":[{"type":"128k","size":"4.88 MB","hash":"67BA8A4A0681F2078BC423CB13B904B7"},{"type":"320k","size":"12.19 MB","hash":"68DEA6329FB28534271943B3F97599DC"},{"type":"flac","size":"34.93 MB","hash":"9F0F140F8A9C3A0E639A9BF8680E80E9"},{"type":"flac24bit","size":"61.72 MB","hash":"2CCC7683F50BE90A0C407D6FF0F973D9"}],"_types":{"128k":{"size":"4.88 MB","hash":"67BA8A4A0681F2078BC423CB13B904B7"},"320k":{"size":"12.19 MB","hash":"68DEA6329FB28534271943B3F97599DC"},"flac":{"size":"34.93 MB","hash":"9F0F140F8A9C3A0E639A9BF8680E80E9"},"flac24bit":{"size":"61.72 MB","hash":"2CCC7683F50BE90A0C407D6FF0F973D9"}},"typeUrl":{}}
|
||||
log --- start --- https://api.ikunshare.com/url?source=kg&songId=67BA8A4A0681F2078BC423CB13B904B7&quality=hires
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/url?source=kg&songId=67BA8A4A0681F2078BC423CB13B904B7&quality=hires
|
||||
log quality hires
|
||||
log [CeruMusic] 请求响应状态: 403
|
||||
log API Response: {"body":{"code":403,"message":"你还没给我上供","yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":403,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:36:55 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["138"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["8.029583841562271e-05"]}}
|
||||
log handleGetMusicUrl(kg_178240, hires) failed: Key失效/鉴权失败
|
||||
error [ikun音源] Error: Key失效/鉴权失败
|
||||
end
|
||||
log [CeruMusic] 请求响应内容: {"code":403,"message":"你还没给我上供","yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log [ikun音源] 使用事件驱动方式获取 kw 音源链接
|
||||
log source kw
|
||||
log musicInfo {"name":"后来","singer":"刘若英","source":"kw","songmid":"96765035","albumId":"13825074","interval":"05:09","albumName":"2020 刘若英陪你 献上录音专辑","lrc":null,"img":"http://img1.kwcdn.kuwo.cn/star/albumcover/500/s4s68/34/3776980601.jpg","otherSource":null,"types":[{"type":"128k","size":"4.72Mb"},{"type":"320k","size":"11.80Mb"},{"type":"flac","size":"60.23Mb"},{"type":"flac24bit","size":"60.23Mb"}],"_types":{"flac24bit":{"size":"60.23MB"},"flac":{"size":"60.23MB"},"320k":{"size":"11.80MB"},"128k":{"size":"4.72MB"}},"typeUrl":{},"url":"http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac"}
|
||||
log --- start --- https://api.ikunshare.com/url?source=kw&songId=96765035&quality=hires
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/url?source=kw&songId=96765035&quality=hires
|
||||
log quality hires
|
||||
start groupStart--------- Handle Action(musicUrl)
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","url":"http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac","info":{"id":"96765035","name":"后来","album":"2020 刘若英陪你 献上录音专辑","artist":"刘若英"},"ekey":null,"cache":true,"quality":{"target":"无损音质 24Bit","result":"无损音质 24Bit"},"expire":{"ExpireAt":"2025-08-22 12:15:35","canExpire":true},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log API Response: {"body":{"code":200,"message":"成功","url":"http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac","info":{"id":"96765035","name":"后来","album":"2020 刘若英陪你 献上录音专辑","artist":"刘若英"},"ekey":null,"cache":true,"quality":{"target":"无损音质 24Bit","result":"无损音质 24Bit"},"expire":{"ExpireAt":"2025-08-22 12:15:35","canExpire":true},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:36:56 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["582"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.002598297782242298"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
log handleGetMusicUrl(kw_96765035, hires) success, URL: http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac
|
||||
end
|
||||
log [ikun音源] Got URL: http://cu.sycdn.kuwo.cn/f9678d8cdc643bcd8ff61bc61099540d/68a7e45b/resource/s2/87/81/730236710.flac
|
||||
log [ikun音源] 使用事件驱动方式获取 mg 音源链接
|
||||
log source mg
|
||||
start groupStart--------- Handle Action(musicUrl)
|
||||
log musicInfo {"singer":"音阙诗听","name":"红昭愿 (伴奏)","albumName":"诗","albumId":"1140686463","songmid":"1135545898","copyrightId":"69069801208","source":"mg","interval":"02:53","img":"http://d.musicapp.migu.cn/data/oss/resource/00/4g/u6/5fa3dbc0f6584fa88ba2c073f52d7330.webp","lrc":null,"lrcUrl":"https://d.musicapp.migu.cn/data/oss/resource/00/4s/oi/6972a559ab2d4162b649ac12646c9678","types":[{"type":"128k","size":"2.62 MB"},{"type":"320k","size":"6.56 MB"}],"_types":{"128k":{"size":"2.62 MB"},"320k":{"size":"6.56 MB"}},"typeUrl":{},"url":"http://freetyst.nf.migu.cn/public/product9th/product47/2025/03/1216/2025%E5%B9%B401%E6%9C%8820%E6%97%A514%E7%82%B940%E5%88%86%E7%B4%A7%E6%80%A5%E5%86%85%E5%AE%B9%E5%87%86%E5%85%A5%E6%88%90%E9%83%BD%E8%B0%A6%E4%BF%AE%E6%88%90%E6%9C%AC502%E9%A6%96015401/%E6%A0%87%E6%B8%85%E9%AB%98%E6%B8%85/MP3_128_16_Stero/69069801208160124.mp3"}
|
||||
log quality hires
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/url?source=mg&songId=1135545898&quality=hires
|
||||
log --- start --- https://api.ikunshare.com/url?source=mg&songId=1135545898&quality=hires
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","url":"http://freetyst.nf.migu.cn/public/product9th/product47/2025/03/1216/2025%E5%B9%B401%E6%9C%8820%E6%97%A514%E7%82%B940%E5%88%86%E7%B4%A7%E6%80%A5%E5%86%85%E5%AE%B9%E5%87%86%E5%85%A5%E6%88%90%E9%83%BD%E8%B0%A6%E4%BF%AE%E6%88%90%E6%9C%AC502%E9%A6%96015401/%E6%A0%87%E6%B8%85%E9%AB%98%E6%B8%85/MP3_128_16_Stero/69069801208160124.mp3","info":{"id":"1135545898","name":"红昭愿 (伴奏)","album":"诗","artist":"音阙诗听"},"ekey":"","cache":true,"quality":{"target":"无损音质 24Bit","result":"无损音质 24Bit"},"expire":{"ExpireAt":null,"canExpire":false},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log API Response: {"body":{"code":200,"message":"成功","url":"http://freetyst.nf.migu.cn/public/product9th/product47/2025/03/1216/2025%E5%B9%B401%E6%9C%8820%E6%97%A514%E7%82%B940%E5%88%86%E7%B4%A7%E6%80%A5%E5%86%85%E5%AE%B9%E5%87%86%E5%85%A5%E6%88%90%E9%83%BD%E8%B0%A6%E4%BF%AE%E6%88%90%E6%9C%AC502%E9%A6%96015401/%E6%A0%87%E6%B8%85%E9%AB%98%E6%B8%85/MP3_128_16_Stero/69069801208160124.mp3","info":{"id":"1135545898","name":"红昭愿 (伴奏)","album":"诗","artist":"音阙诗听"},"ekey":"","cache":true,"quality":{"target":"无损音质 24Bit","result":"无损音质 24Bit"},"expire":{"ExpireAt":null,"canExpire":false},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:37:05 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["761"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.004381708800792694"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
end
|
||||
log [ikun音源] Got URL: http://freetyst.nf.migu.cn/public/product9th/product47/2025/03/1216/2025%E5%B9%B401%E6%9C%8820%E6%97%A514%E7%82%B940%E5%88%86%E7%B4%A7%E6%80%A5%E5%86%85%E5%AE%B9%E5%87%86%E5%85%A5%E6%88%90%E9%83%BD%E8%B0%A6%E4%BF%AE%E6%88%90%E6%9C%AC502%E9%A6%96015401/%E6%A0%87%E6%B8%85%E9%AB%98%E6%B8%85/MP3_128_16_Stero/69069801208160124.mp3
|
||||
log handleGetMusicUrl(mg_1135545898, hires) success, URL: http://freetyst.nf.migu.cn/public/product9th/product47/2025/03/1216/2025%E5%B9%B401%E6%9C%8820%E6%97%A514%E7%82%B940%E5%88%86%E7%B4%A7%E6%80%A5%E5%86%85%E5%AE%B9%E5%87%86%E5%85%A5%E6%88%90%E9%83%BD%E8%B0%A6%E4%BF%AE%E6%88%90%E6%9C%AC502%E9%A6%96015401/%E6%A0%87%E6%B8%85%E9%AB%98%E6%B8%85/MP3_128_16_Stero/69069801208160124.mp3
|
||||
log [ikun音源] 使用事件驱动方式获取 wy 音源链接
|
||||
start groupStart--------- Handle Action(musicUrl)
|
||||
log musicInfo {"singer":"DLSS","name":"alone.","albumName":"alone.","albumId":193463408,"source":"wy","interval":"02:25","songmid":2149456401,"img":"http://p2.music.126.net/I-pKOLxJENNTkZp1nbY2VA==/109951169530908047.jpg","lrc":null,"types":[{"type":"128k","size":"2.21 MB"},{"type":"320k","size":"5.54 MB"},{"type":"flac","size":"16.91 MB"},{"type":"flac24bit","size":"30.14 MB"}],"_types":{"flac24bit":{"size":"30.14 MB"},"flac":{"size":"16.91 MB"},"320k":{"size":"5.54 MB"},"128k":{"size":"2.21 MB"}},"typeUrl":{},"url":"http://m701.music.126.net/20250822111746/88562bac7e992f3433e465b0d8b57883/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/35506990299/de4f/d537/7094/a86a0c894b20f627e58f4e037d4c395d.flac"}
|
||||
log source wy
|
||||
log --- start --- https://api.ikunshare.com/url?source=wy&songId=2149456401&quality=hires
|
||||
log quality hires
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/url?source=wy&songId=2149456401&quality=hires
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","url":"http://m701.music.126.net/20250822120208/2d51054583249a7c26ad5fb98b6cd10c/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/35506990299/de4f/d537/7094/a86a0c894b20f627e58f4e037d4c395d.flac","info":{"id":"2149456401","name":"无","album":"无","artist":"无"},"ekey":"","cache":false,"quality":{"target":"无损音质 24Bit","result":"无损音质 24Bit"},"expire":{"ExpireAt":"2025-08-22 11:46:08","canExpire":true},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log API Response: {"body":{"code":200,"message":"成功","url":"http://m701.music.126.net/20250822120208/2d51054583249a7c26ad5fb98b6cd10c/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/35506990299/de4f/d537/7094/a86a0c894b20f627e58f4e037d4c395d.flac","info":{"id":"2149456401","name":"无","album":"无","artist":"无"},"ekey":"","cache":false,"quality":{"target":"无损音质 24Bit","result":"无损音质 24Bit"},"expire":{"ExpireAt":"2025-08-22 11:46:08","canExpire":true},"yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:37:08 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["573"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.05814129579812288"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
log handleGetMusicUrl(wy_2149456401, hires) success, URL: http://m701.music.126.net/20250822120208/2d51054583249a7c26ad5fb98b6cd10c/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/35506990299/de4f/d537/7094/a86a0c894b20f627e58f4e037d4c395d.flac
|
||||
end
|
||||
log [ikun音源] Got URL: http://m701.music.126.net/20250822120208/2d51054583249a7c26ad5fb98b6cd10c/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/35506990299/de4f/d537/7094/a86a0c894b20f627e58f4e037d4c395d.flac
|
||||
@@ -1,611 +0,0 @@
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 wy 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://api.cenguigui.cn/api/netease/music_v1.php?id=2149456401&type=json&level=standard"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
log "[聚合API接口 (by lerd)] Got URL: https://m801.music.126.net/20250822114001/b2afa538a9bd71a275090423ddb61b8b/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/35506991358/9262/9bfa/0e3d/8c4de2e46cb45b5913ac027c12634562.mp3?vuutv=W9gkRY5/Xlj5zcDzyIP7t0xycVF+bFPqM0yESnLJxymoNNC8Qe5OOEOlRo53aqLkZnFkBT8oxO2ITbyyaDwgkp+EtrWk+EReVTFmLEMt874=&cdntag=bWFyaz1vc193ZWIscXVhbGl0eV9zdGFuZGFyZA"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[CeruMusic] 请求响应状态: 200"log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 wy 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://api.cenguigui.cn/api/netease/music_v1.php?id=2149456401&type=json&level=standard"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
log "[聚合API接口 (by lerd)] Got URL: https://m701.music.126.net/20250822114056/2d8aa51da3c2074cb50a36f4bf348786/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/35506991358/9262/9bfa/0e3d/8c4de2e46cb45b5913ac027c12634562.mp3?vuutv=AsMvTRDjrKksRSVj9wEKkCeAiu88u1zgQsfaYBeFQEw2J4cS1rQojrSdnZMXbu7OdwCJztt32zRefQ6ptoNL0+xYMJarqVgOT1jJWCTrJgc=&cdntag=bWFyaz1vc193ZWIscXVhbGl0eV9zdGFuZGFyZA"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]"
|
||||
log "[聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mg"
|
||||
log "[CeruMusic] 事件驱动插件初始化成功"
|
||||
log "[CeruMusic] Plugin \"聚合API接口 (by lerd)\" loaded successfully."
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
log "[聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接"
|
||||
log "[CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128"
|
||||
log "[CeruMusic] 请求响应状态: 200"
|
||||
log "[CeruMusic] 请求响应内容: [object Object]"
|
||||
error "[聚合API接口 (by lerd)] Error: get url error"log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接
|
||||
log [CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":-2,"msg":"酷狗hash解析暂未公开开放,如需请付费使用或购买源码使用"}
|
||||
error [聚合API接口 (by lerd)] Error: get url error
|
||||
log [聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接
|
||||
log [CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":-2,"msg":"酷狗hash解析暂未公开开放,如需请付费使用或购买源码使用"}
|
||||
error [聚合API接口 (by lerd)] Error: get url errorlog [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接
|
||||
log [CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":-2,"msg":"酷狗hash解析暂未公开开放,如需请付费使用或购买源码使用"}
|
||||
error [聚合API接口 (by lerd)] Error: get url error
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd)] 使用事件驱动方式获取 kg 音源链接
|
||||
log [CeruMusic] 发起请求: https://www.hhlqilongzhu.cn/api/dg_kugouSQ.php?type=json&hash=67BA8A4A0681F2078BC423CB13B904B7&quality=128
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":-2,"msg":"酷狗hash解析暂未公开开放,如需请付费使用或购买源码使用"}
|
||||
error [聚合API接口 (by lerd)] Error: get url error
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: request
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"tx":{"name":"tx","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kg":{"name":"kg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit"]},"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["320k","flac"]}}}
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac"]},"kg":{"name":"酷狗音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"tx":{"name":"QQ音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["320k","flac"]}}
|
||||
log [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.
|
||||
log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: ["tx","wy","kg","kw","mg"]
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
@@ -1,83 +0,0 @@
|
||||
log [未知插件 by Ceru插件] 注册事件监听器: request
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/urlinfo/1.0.0
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "未知插件" loaded successfully.
|
||||
log [CeruMusic] 请求响应状态: 503
|
||||
log [CeruMusic] 响应不是JSON格式,内容: <html>
|
||||
<head><title>503 Service Temporarily Unavailable</title></head>
|
||||
<body>
|
||||
<center><h1>503 Service Temporarily Unavailable</h1></center>
|
||||
<hr><center>nginx/1.26.1</center>
|
||||
</body>
|
||||
</html>
|
||||
...
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [CeruMusic] Request failed: Expected JSON response but got: text/html
|
||||
log [未知插件 by Ceru插件] 发送事件: inited [object Object]
|
||||
log [未知插件 by Ceru插件] 动态音源信息已更新: [object Object]
|
||||
log [未知插件 by Ceru插件] 音源注册完成: kw,wy,mg,tx,kglog [未知插件] 使用事件驱动方式获取 tx 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/tx/1895330088/master
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [未知插件] 使用事件驱动方式获取 tx 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/tx/38576323/master
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件] 使用事件驱动方式获取 tx 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/tx/1808492017/master
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件] 使用事件驱动方式获取 tx 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/tx/502043537/master
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件] 使用事件驱动方式获取 tx 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/tx/1887139866/master
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件] 使用事件驱动方式获取 tx 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/tx/1365898499/master
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件] 使用事件驱动方式获取 tx 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/tx/1363948882/master
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
log [未知插件 by Ceru插件] 注册事件监听器: request
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/urlinfo/1.0.0
|
||||
log [CeruMusic] Plugin "未知插件" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] 请求响应状态: 503
|
||||
log [CeruMusic] 响应不是JSON格式,内容: <html>
|
||||
<head><title>503 Service Temporarily Unavailable</title></head>
|
||||
<body>
|
||||
<center><h1>503 Service Temporarily Unavailable</h1></center>
|
||||
<hr><center>nginx/1.26.1</center>
|
||||
</body>
|
||||
</html>
|
||||
...
|
||||
log [未知插件 by Ceru插件] 发送事件: inited [object Object]
|
||||
error [CeruMusic] Request failed: Expected JSON response but got: text/html
|
||||
log [未知插件 by Ceru插件] 动态音源信息已更新: [object Object]
|
||||
log [未知插件 by Ceru插件] 音源注册完成: kw,wy,mg,tx,kg
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log [未知插件] 使用事件驱动方式获取 tx 音源链接
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/url/tx/1363948882/master
|
||||
log [CeruMusic] 请求响应状态: 404
|
||||
log [CeruMusic] 响应不是JSON格式,内容: Not Found...
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [未知插件] Error: Expected JSON response but got: text/plain; charset=utf-8
|
||||
@@ -1,52 +0,0 @@
|
||||
log [CeruMusic] Plugin "ikun音源" loaded successfully.log [聚合API接口 (by lerd) by Ceru插件] 注册事件监听器: requestlog [聚合API接口 (by lerd) by Ceru插件] 发送事件: inited [object Object]log [聚合API接口 (by lerd) by Ceru插件] 动态音源信息已更新: [object Object]log [聚合API接口 (by lerd) by Ceru插件] 音源注册完成: tx,wy,kg,kw,mglog [CeruMusic] Plugin "聚合API接口 (by lerd)" loaded successfully.log [CeruMusic] 事件驱动插件初始化成功log [未知插件 by Ceru插件] 注册事件监听器: request
|
||||
log [CeruMusic] 发起请求: http://flower.tempmusics.tk/v1/urlinfo/1.0.0
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] Plugin "未知插件" loaded successfully.
|
||||
log [CeruMusic] 请求响应状态: 503
|
||||
log [CeruMusic] 响应不是JSON格式,内容: <html>
|
||||
<head><title>503 Service Temporarily Unavailable</title></head>
|
||||
<body>
|
||||
<center><h1>503 Service Temporarily Unavailable</h1></center>
|
||||
<hr><center>nginx/1.26.1</center>
|
||||
</body>
|
||||
</html>
|
||||
...
|
||||
log [未知插件 by Ceru插件] 发送事件: inited [object Object]
|
||||
log [未知插件 by Ceru插件] 音源注册完成: kw,wy,mg,tx,kg
|
||||
log [未知插件 by Ceru插件] 动态音源信息已更新: [object Object]
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
error [CeruMusic] Request failed: Expected JSON response but got: text/html
|
||||
log [CeruMusic] Plugin "未知插件" loaded successfully.
|
||||
log 提取到的 MUSIC_QUALITY 字符串: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 提取的音源配置: [object Object]
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log 解析后的 MUSIC_QUALITY 数据: [object Object]
|
||||
log --- start --- https://api.ikunshare.com/script?key=&checkUpdate=6c72d109ed7db5cf037b3bbf1dfccb53
|
||||
log [ikun音源 by Ceru插件] 注册事件监听器: request
|
||||
log [ikun音源 by Ceru插件] 发送事件: inited [object Object]
|
||||
log [ikun音源 by Ceru插件] 动态音源信息已更新: [object Object]
|
||||
log [CeruMusic] Plugin "ikun音源" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [ikun音源 by Ceru插件] 音源注册完成: kw,wy,mg
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: [object Object]
|
||||
log checkUpdate success
|
||||
log API Response: [object Object]
|
||||
log [ikun音源 by Ceru插件] 发送事件: updateAlert [object Object]
|
||||
log "[CeruMusic] Plugin \"LiHouse 音乐插件\" loaded successfully."
|
||||
log "[CeruMusic] Plugin \"ceru 音乐插件\" loaded successfully."
|
||||
log 解析后的 MUSIC_QUALITY 数据: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 提取到的 MUSIC_QUALITY 字符串: {"kw":["128k","320k","flac","flac24bit","hires"],"wy":["128k","320k","flac","flac24bit","hires","atmos","master"],"mg":["128k","320k","flac","flac24bit","hires"]}
|
||||
log 提取的音源配置: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log --- start --- https://api.ikunshare.com/script?key=&checkUpdate=5917eb1e565bf906fb0433bb1a3b00b5
|
||||
log [ikun音源 by Ceru插件] 注册事件监听器: request
|
||||
log [CeruMusic] 发起请求: https://api.ikunshare.com/script?key=&checkUpdate=5917eb1e565bf906fb0433bb1a3b00b5
|
||||
log [ikun音源 by Ceru插件] 发送事件: inited {"status":true,"openDevTools":false,"sources":{"kw":{"name":"kw","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"wy","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"mg","type":"music","actions":["musicUrl"],"qualitys":["128k","320k","flac","flac24bit","hires"]}}}
|
||||
log [ikun音源 by Ceru插件] 音源注册完成: ["kw","wy","mg"]
|
||||
log [ikun音源 by Ceru插件] 动态音源信息已更新: {"kw":{"name":"酷我音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]},"wy":{"name":"网易云音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires","atmos","master"]},"mg":{"name":"咪咕音乐","type":"music","qualitys":["128k","320k","flac","flac24bit","hires"]}}
|
||||
log [CeruMusic] Plugin "ikun音源" loaded successfully.
|
||||
log [CeruMusic] 事件驱动插件初始化成功
|
||||
log [CeruMusic] 请求响应状态: 200
|
||||
log [CeruMusic] 请求响应内容: {"code":200,"message":"成功","yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}}
|
||||
log API Response: {"body":{"code":200,"message":"成功","yourinfo":{"ip":"183.251.97.29","ua":"lx-music-nodejs/1.0.0"}},"statusCode":200,"headers":{"server":["openresty"],"date":["Fri, 22 Aug 2025 03:44:41 GMT"],"content-type":["application/json; charset=utf-8"],"content-length":["108"],"connection":["keep-alive"],"access-control-allow-origin":["*"],"x-process-time":["0.0007938602939248085"],"cache-control":["no-cache"],"alt-svc":["h3=\":443\"; ma=2592000"]}}
|
||||
log checkUpdate success
|
||||
@@ -1,75 +0,0 @@
|
||||
/**
|
||||
* LiHouse 音乐插件
|
||||
* @author CodeBuddy
|
||||
* @version 1.0.0
|
||||
*/
|
||||
|
||||
// 基础 URL
|
||||
const baseTwoUrl = 'https://www.lihouse.xyz/coco_widget';
|
||||
|
||||
// 1. 插件信息
|
||||
const pluginInfo = {
|
||||
name: 'ceru 音乐插件',
|
||||
version: '1.0.0',
|
||||
author: '时迁酱',
|
||||
description: '提供 网易云 音乐资源的访问'
|
||||
}
|
||||
|
||||
// 2. 支持的音源配置
|
||||
const sources = {
|
||||
wy: {
|
||||
name: '网易云',
|
||||
type: 'music',
|
||||
qualitys: ['320k'] // 假设支持这些音质
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 获取音乐URL的核心函数
|
||||
async function musicUrl(source, musicInfo, quality) {
|
||||
// 从 cerumusic 对象获取 API
|
||||
const { request, env, version } = cerumusic
|
||||
|
||||
// 构建请求参数
|
||||
const songId = musicInfo.songmid || musicInfo.hash;
|
||||
if (!songId) {
|
||||
throw new Error('无效的歌曲ID');
|
||||
}
|
||||
|
||||
const apiUrl = `${baseTwoUrl}/music_resource/id/${songId}`;
|
||||
|
||||
console.log(`[${pluginInfo.name}] 请求音乐链接: ${apiUrl}`);
|
||||
|
||||
try {
|
||||
// 发起网络请求
|
||||
const { body, statusCode } = await request(apiUrl, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'User-Agent': `cerumusic-${env}/${version}`
|
||||
}
|
||||
});
|
||||
|
||||
// 处理响应
|
||||
if (statusCode !== 200 || !body.status) {
|
||||
const errorMessage = body.message || '歌曲不存在';
|
||||
console.error(`[${pluginInfo.name}] Error: ${errorMessage}`);
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
|
||||
// 根据请求的音质选择对应的链接
|
||||
// 假设 song_data 中包含不同音质的链接
|
||||
const songData = body.song_data;
|
||||
return songData.url
|
||||
|
||||
throw new Error('无效的响应格式');
|
||||
} catch (error) {
|
||||
console.error(`[${pluginInfo.name}] 请求失败:`, error.message);
|
||||
throw new Error(`获取音乐链接失败: ${error.message}`);
|
||||
}
|
||||
}
|
||||
// 导出插件
|
||||
module.exports = {
|
||||
pluginInfo,
|
||||
sources,
|
||||
musicUrl,
|
||||
}
|
||||
@@ -1,284 +0,0 @@
|
||||
/**
|
||||
* 由 CeruMusic 插件转换器转换 - @author sqj
|
||||
* @name ikun音源
|
||||
* @author ikunshare
|
||||
* @version v14
|
||||
* @description 反馈群951962664
|
||||
*/
|
||||
|
||||
const pluginInfo = {
|
||||
name: "ikun音源",
|
||||
version: "v14",
|
||||
author: "ikunshare",
|
||||
description: "反馈群951962664"
|
||||
};
|
||||
|
||||
// 原始插件代码
|
||||
const originalPluginCode = "/*!\n * @name ikun音源\n * @description 反馈群951962664\n * @version v14\n * @author ikunshare\n */\n\nconst DEV_ENABLE = false\nconst UPDATE_ENABLE = true\nconst API_URL = \"https://api.ikunshare.com\"\nconst API_KEY = ``\nconst MUSIC_QUALITY = JSON.parse('{\"kw\":[\"128k\",\"320k\",\"flac\",\"flac24bit\",\"hires\"],\"wy\":[\"128k\",\"320k\",\"flac\",\"flac24bit\",\"hires\",\"atmos\",\"master\"],\"mg\":[\"128k\",\"320k\",\"flac\",\"flac24bit\",\"hires\"]}');\nconst MUSIC_SOURCE = Object.keys(MUSIC_QUALITY);\n\nconst { EVENT_NAMES, request, on, send, utils, env, version } = globalThis.lx;\n\nconst SCRIPT_MD5 = \"5917eb1e565bf906fb0433bb1a3b00b5\";\n\nconst httpFetch = (url, options = { method: \"GET\" }) => {\n return new Promise((resolve, reject) => {\n console.log(\"--- start --- \" + url);\n request(url, options, (err, resp) => {\n if (err) return reject(err);\n console.log(\"API Response: \", resp);\n resolve(resp);\n });\n });\n};\n\nconst handleGetMusicUrl = async (source, musicInfo, quality) => {\n const songId = musicInfo.hash ?? musicInfo.songmid;\n const request = await httpFetch(\n `${API_URL}/url?source=${source}&songId=${songId}&quality=${quality}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"User-Agent\": `${\n env ? `lx-music-${env}/${version}` : `lx-music-request/${version}`\n }`,\n \"X-Request-Key\": API_KEY,\n },\n follow_max: 5,\n }\n );\n const { body } = request;\n if (!body || isNaN(Number(body.code))) throw new Error(\"unknow error\");\n if (env != \"mobile\") console.groupEnd();\n switch (body.code) {\n case 200:\n console.log(\n `handleGetMusicUrl(${source}_${musicInfo.songmid}, ${quality}) success, URL: ${body.url}`\n );\n return body.url;\n case 403:\n console.log(\n `handleGetMusicUrl(${source}_${musicInfo.songmid}, ${quality}) failed: Key失效/鉴权失败`\n );\n throw new Error(\"Key失效/鉴权失败\");\n case 500:\n console.log(\n `handleGetMusicUrl(${source}_${musicInfo.songmid}, ${quality}) failed, ${body.msg}`\n );\n throw new Error(`获取URL失败, ${body.msg ?? \"未知错误\"}`);\n case 429:\n console.log(\n `handleGetMusicUrl(${source}_${musicInfo.songmid}, ${quality}) failed, 请求过于频繁,请休息一下吧`\n );\n throw new Error(\"请求过速\");\n default:\n console.log(\n `handleGetMusicUrl(${source}_${\n musicInfo.songmid\n }, ${quality}) failed, ${body.msg ? body.msg : \"未知错误\"}`\n );\n throw new Error(body.msg ?? \"未知错误\");\n }\n};\n\nconst checkUpdate = async () => {\n const request = await httpFetch(\n `${API_URL}/script?key=${API_KEY}&checkUpdate=${SCRIPT_MD5}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"User-Agent\": `${\n env ? `lx-music-${env}/${version}` : `lx-music-request/${version}`\n }`,\n },\n }\n );\n const { body } = request;\n\n if (!body || body.code !== 200) console.log(\"checkUpdate failed\");\n else {\n console.log(\"checkUpdate success\");\n if (body.data != null) {\n globalThis.lx.send(lx.EVENT_NAMES.updateAlert, {\n log: body.data.updateMsg,\n updateUrl: body.data.updateUrl,\n });\n }\n }\n};\n\nconst musicSources = {};\nMUSIC_SOURCE.forEach((item) => {\n musicSources[item] = {\n name: item,\n type: \"music\",\n actions: [\"musicUrl\"],\n qualitys: MUSIC_QUALITY[item],\n };\n});\n\non(EVENT_NAMES.request, ({ action, source, info }) => {\n switch (action) {\n case \"musicUrl\":\n if (env != \"mobile\") {\n console.group(`Handle Action(musicUrl)`);\n console.log(\"source\", source);\n console.log(\"quality\", info.type);\n console.log(\"musicInfo\", info.musicInfo);\n } else {\n console.log(`Handle Action(musicUrl)`);\n console.log(\"source\", source);\n console.log(\"quality\", info.type);\n console.log(\"musicInfo\", info.musicInfo);\n }\n return handleGetMusicUrl(source, info.musicInfo, info.type)\n .then((data) => Promise.resolve(data))\n .catch((err) => Promise.reject(err));\n default:\n console.error(`action(${action}) not support`);\n return Promise.reject(\"action not support\");\n }\n});\n\nif (UPDATE_ENABLE) checkUpdate();\n\nsend(EVENT_NAMES.inited, {\n status: true,\n openDevTools: DEV_ENABLE,\n sources: musicSources,\n});\n";
|
||||
|
||||
// 音源信息将通过插件的 send 调用动态获取
|
||||
let sources = {};
|
||||
|
||||
function getSourceName(sourceId) {
|
||||
const nameMap = {
|
||||
'kw': '酷我音乐',
|
||||
'kg': '酷狗音乐',
|
||||
'tx': 'QQ音乐',
|
||||
'wy': '网易云音乐',
|
||||
'mg': '咪咕音乐'
|
||||
};
|
||||
return nameMap[sourceId] || sourceId.toUpperCase() + '音乐';
|
||||
}
|
||||
|
||||
// 提取默认音源配置作为备用
|
||||
function extractDefaultSources() {
|
||||
// 尝试从 MUSIC_QUALITY 常量中提取音源信息
|
||||
const qualityMatch = originalPluginCode.match(/const\s+MUSIC_QUALITY\s*=\s*JSON\.parse\(([^)]+)\)/);
|
||||
if (qualityMatch) {
|
||||
try {
|
||||
// 处理字符串,移除外层引号并正确解析
|
||||
let qualityStr = qualityMatch[1].trim();
|
||||
if (qualityStr.startsWith("'") && qualityStr.endsWith("'")) {
|
||||
qualityStr = qualityStr.slice(1, -1);
|
||||
} else if (qualityStr.startsWith('"') && qualityStr.endsWith('"')) {
|
||||
qualityStr = qualityStr.slice(1, -1);
|
||||
}
|
||||
|
||||
console.log('提取到的 MUSIC_QUALITY 字符串:', qualityStr);
|
||||
const qualityData = JSON.parse(qualityStr);
|
||||
console.log('解析后的 MUSIC_QUALITY 数据:', qualityData);
|
||||
|
||||
const extractedSources = {};
|
||||
Object.keys(qualityData).forEach(sourceId => {
|
||||
extractedSources[sourceId] = {
|
||||
name: getSourceName(sourceId),
|
||||
type: 'music',
|
||||
qualitys: qualityData[sourceId] || ['128k', '320k']
|
||||
};
|
||||
});
|
||||
|
||||
console.log('提取的音源配置:', extractedSources);
|
||||
return extractedSources;
|
||||
} catch (e) {
|
||||
console.log('解析 MUSIC_QUALITY 失败:', e.message);
|
||||
}
|
||||
}
|
||||
|
||||
// 默认音源配置
|
||||
return {
|
||||
kw: { name: "酷我音乐", type: "music", qualitys: ['128k', '320k', 'flac', 'flac24bit', 'hires', 'atmos', 'master'] },
|
||||
kg: { name: "酷狗音乐", type: "music", qualitys: ['128k', '320k', 'flac', 'flac24bit', 'hires', 'atmos', 'master'] },
|
||||
tx: { name: "QQ音乐", type: "music", qualitys: ['128k', '320k', 'flac', 'flac24bit', 'hires', 'atmos', 'master'] },
|
||||
wy: { name: "网易云音乐", type: "music", qualitys: ['128k', '320k', 'flac', 'flac24bit', 'hires', 'atmos', 'master'] },
|
||||
mg: { name: "咪咕音乐", type: "music", qualitys: ['128k', '320k', 'flac', 'flac24bit', 'hires', 'atmos', 'master'] }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 初始化默认音源
|
||||
sources = extractDefaultSources();
|
||||
|
||||
// 插件状态
|
||||
let isInitialized = false;
|
||||
let pluginSources = {};
|
||||
let requestHandler = null;
|
||||
initializePlugin()
|
||||
function initializePlugin() {
|
||||
if (isInitialized) return;
|
||||
|
||||
const { request, utils } = cerumusic;
|
||||
|
||||
// 创建完整的 lx 模拟环境
|
||||
const mockLx = {
|
||||
EVENT_NAMES: {
|
||||
request: 'request',
|
||||
inited: 'inited',
|
||||
updateAlert: 'updateAlert'
|
||||
},
|
||||
on: (event, handler) => {
|
||||
console.log(`[ikun音源 by Ceru插件] 注册事件监听器: ${event}`);
|
||||
if (event === 'request') {
|
||||
requestHandler = handler;
|
||||
}
|
||||
},
|
||||
send: (event, data) => {
|
||||
console.log(`[ikun音源 by Ceru插件] 发送事件: ${event}`, data);
|
||||
if (event === 'inited' && data.sources) {
|
||||
// 动态更新音源信息,保持原始的音质配置
|
||||
pluginSources = data.sources;
|
||||
|
||||
// 将插件发送的音源信息转换为正确格式并同步到导出的 sources
|
||||
Object.keys(pluginSources).forEach(sourceId => {
|
||||
const sourceInfo = pluginSources[sourceId];
|
||||
|
||||
// 保留原始音质配置,如果存在的话
|
||||
const originalQualitys = sources[sourceId] && sources[sourceId].qualitys;
|
||||
|
||||
sources[sourceId] = {
|
||||
name: getSourceName(sourceId),
|
||||
type: sourceInfo.type || 'music',
|
||||
// 优先使用插件发送的音质配置,其次使用原始解析的配置,最后使用默认配置
|
||||
qualitys: sourceInfo.qualitys || originalQualitys || ['128k', '320k']
|
||||
};
|
||||
});
|
||||
|
||||
console.log('[ikun音源 by Ceru插件] 音源注册完成:', Object.keys(pluginSources));
|
||||
console.log('[ikun音源 by Ceru插件] 动态音源信息已更新:', sources);
|
||||
}
|
||||
},
|
||||
request: request,
|
||||
utils: {
|
||||
buffer: utils.buffer,
|
||||
crypto: {
|
||||
aesEncrypt: (data, mode, key, iv) => {
|
||||
// 简化的 AES 加密实现
|
||||
try {
|
||||
return utils.crypto ? utils.crypto.aesEncrypt(data, mode, key, iv) : data;
|
||||
} catch (e) {
|
||||
return data;
|
||||
}
|
||||
},
|
||||
md5: (str) => {
|
||||
try {
|
||||
return utils.crypto ? utils.crypto.md5(str) : str;
|
||||
} catch (e) {
|
||||
return str;
|
||||
}
|
||||
},
|
||||
randomBytes: (size) => {
|
||||
try {
|
||||
return utils.crypto ? utils.crypto.randomBytes(size) : Buffer.alloc(size);
|
||||
} catch (e) {
|
||||
return Buffer.alloc(size);
|
||||
}
|
||||
},
|
||||
rsaEncrypt: (data, key) => {
|
||||
try {
|
||||
return utils.crypto ? utils.crypto.rsaEncrypt(data, key) : data;
|
||||
} catch (e) {
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
version: '1.0.0',
|
||||
currentScriptInfo: {
|
||||
rawScript: originalPluginCode,
|
||||
name: 'ikun音源',
|
||||
version: 'v14',
|
||||
author: 'ikunshare',
|
||||
description: '反馈群951962664'
|
||||
},
|
||||
env: 'nodejs' // 添加环境信息
|
||||
};
|
||||
|
||||
// 创建全局环境
|
||||
const globalThis = {
|
||||
lx: mockLx
|
||||
};
|
||||
|
||||
// 创建沙箱环境
|
||||
const sandbox = {
|
||||
globalThis: globalThis,
|
||||
lx: mockLx,
|
||||
console: console,
|
||||
setTimeout: setTimeout,
|
||||
clearTimeout: clearTimeout,
|
||||
setInterval: setInterval,
|
||||
clearInterval: clearInterval,
|
||||
Buffer: Buffer,
|
||||
JSON: JSON,
|
||||
require: () => ({}),
|
||||
module: { exports: {} },
|
||||
exports: {},
|
||||
process: { env: { NODE_ENV: 'production' } }
|
||||
};
|
||||
|
||||
try {
|
||||
// 使用 Function 构造器执行插件代码
|
||||
const pluginFunction = new Function(
|
||||
'globalThis', 'lx', 'console', 'setTimeout', 'clearTimeout',
|
||||
'setInterval', 'clearInterval', 'Buffer', 'JSON', 'require',
|
||||
'module', 'exports', 'process',
|
||||
originalPluginCode
|
||||
);
|
||||
|
||||
pluginFunction(
|
||||
globalThis, mockLx, console, setTimeout, clearTimeout,
|
||||
setInterval, clearInterval, Buffer, JSON, () => ({}),
|
||||
{ exports: {} }, {}, { env: { NODE_ENV: 'production' } }
|
||||
);
|
||||
|
||||
isInitialized = true;
|
||||
console.log(`[CeruMusic] 事件驱动插件初始化成功`);
|
||||
} catch (error) {
|
||||
console.log(`[CeruMusic] 插件初始化完成: ${error.message}`);
|
||||
isInitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
async function musicUrl(source, musicInfo, quality) {
|
||||
// 确保插件已初始化
|
||||
initializePlugin();
|
||||
|
||||
// 等待一小段时间让插件完全初始化
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
|
||||
if (!requestHandler) {
|
||||
const errorMessage = '插件请求处理器未初始化';
|
||||
console.error(`[${pluginInfo.name}] Error: ${errorMessage}`);
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
|
||||
console.log(`[${pluginInfo.name}] 使用事件驱动方式获取 ${source} 音源链接`);
|
||||
|
||||
try {
|
||||
// 调用插件的请求处理器
|
||||
const result = await requestHandler({
|
||||
source: source,
|
||||
action: 'musicUrl',
|
||||
info: {
|
||||
musicInfo: musicInfo,
|
||||
type: quality
|
||||
}
|
||||
});
|
||||
|
||||
// 检查结果是否有效
|
||||
if (!result) {
|
||||
const errorMessage = `获取 ${source} 音源链接失败: 返回结果为空`;
|
||||
console.error(`[${pluginInfo.name}] Error: ${errorMessage}`);
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
|
||||
// 如果结果是对象且包含错误信息
|
||||
if (typeof result === 'object' && result.error) {
|
||||
const errorMessage = result.error || `获取 ${source} 音源链接失败`;
|
||||
console.error(`[${pluginInfo.name}] Error: ${errorMessage}`);
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
|
||||
// 如果结果是对象且包含状态码
|
||||
if (typeof result === 'object' && result.code && result.code !== 200) {
|
||||
const errorMessage = result.msg || `接口错误 (Code: ${result.code})`;
|
||||
console.error(`[${pluginInfo.name}] Error: ${errorMessage}`);
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
|
||||
console.log(`[${pluginInfo.name}] Got URL: ${typeof result === 'string' ? result : result.url || result}`);
|
||||
return result;
|
||||
} catch (error) {
|
||||
// 确保错误信息格式与 example-plugin.js 一致
|
||||
const errorMessage = error.message || `获取 ${source} 音源链接时发生未知错误`;
|
||||
console.error(`[${pluginInfo.name}] Error: ${errorMessage}`);
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
pluginInfo,
|
||||
sources,
|
||||
musicUrl
|
||||
};
|
||||