chore: reset version to v0.0.1, fix Kuwo cover+getUrl, strip BOM

This commit is contained in:
miao-moe
2026-06-20 13:03:45 +08:00
parent c6eeb253d0
commit 85629dd693
9 changed files with 97 additions and 40 deletions

View File

@@ -1,7 +1,7 @@
/** /**
* @name GIT音源 - Koneko * @name GIT音源 - Koneko
* @description 聚合音源插件: 纯音源无搜索+ 多API音源容灾 * @description 聚合音源插件: 纯音源无搜索+ 多API音源容灾
* @version 0.0.4 * @version 0.0.1
* @author Miao-moe * @author Miao-moe
* *
* 环境变量: * 环境变量:
@@ -112,7 +112,7 @@ function musicDetail(id) { return Promise.resolve(null) }
function musicInfo(id) { return Promise.resolve(null) } function musicInfo(id) { return Promise.resolve(null) }
var pluginInfo = { var pluginInfo = {
info: { id: 'koneko_git', name: 'GIT音源 - Koneko', version: '0.0.4', description: 'GIT音源聚合插件聚合2+API音源自动测速容灾切换' }, info: { id: 'koneko_git', name: 'GIT音源 - Koneko', version: '0.0.1', description: 'GIT音源聚合插件聚合2+API音源自动测速容灾切换' },
env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }], env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }],
ext: [], ext: [],
quality: [ quality: [

View File

@@ -1,7 +1,7 @@
/** /**
* @name QQ音乐 - Koneko * @name QQ音乐 - Koneko
* @description 聚合音源插件: 官方搜索 + 多API音源容灾 * @description 聚合音源插件: 官方搜索 + 多API音源容灾
* @version 0.0.4 * @version 0.0.1
* @author Miao-moe * @author Miao-moe
* *
* 环境变量: * 环境变量:
@@ -421,7 +421,7 @@ function musicDetail(id) { return Promise.resolve(null) }
function musicInfo(id) { return Promise.resolve(null) } function musicInfo(id) { return Promise.resolve(null) }
var pluginInfo = { var pluginInfo = {
info: { id: 'koneko_tx', name: 'QQ音乐 - Koneko', version: '0.0.4', description: 'QQ音乐聚合音源插件官方搜索+多API音源自动测速容灾切换' }, info: { id: 'koneko_tx', name: 'QQ音乐 - Koneko', version: '0.0.1', description: 'QQ音乐聚合音源插件官方搜索+多API音源自动测速容灾切换' },
env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }], env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }],
ext: [], ext: [],
quality: [ quality: [

View File

@@ -1,7 +1,7 @@
/** /**
* @name 咪咕音乐 - Koneko * @name 咪咕音乐 - Koneko
* @description 聚合音源插件: 官方搜索 + 多API音源容灾 * @description 聚合音源插件: 官方搜索 + 多API音源容灾
* @version 0.0.4 * @version 0.0.1
* @author Miao-moe * @author Miao-moe
* *
* 环境变量: * 环境变量:
@@ -284,7 +284,7 @@ function musicDetail(id) { return Promise.resolve(null) }
function musicInfo(id) { return Promise.resolve(null) } function musicInfo(id) { return Promise.resolve(null) }
var pluginInfo = { var pluginInfo = {
info: { id: 'koneko_mg', name: '咪咕音乐 - Koneko', version: '0.0.4', description: '咪咕音乐聚合音源插件,官方搜索+多API音源自动测速容灾切换' }, info: { id: 'koneko_mg', name: '咪咕音乐 - Koneko', version: '0.0.1', description: '咪咕音乐聚合音源插件,官方搜索+多API音源自动测速容灾切换' },
env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }], env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }],
ext: [], ext: [],
quality: [ quality: [

View File

@@ -1,6 +1,6 @@
# Koneko QZ Music v2/v3 插件开发文档 # Koneko QZ Music v2/v3 插件开发文档
> 版本0.0.4 | 作者:云汀(Miao-moe) | 整理日期2026-06-20 > 版本0.0.1 | 作者:云汀(Miao-moe) | 整理日期2026-06-20
--- ---
@@ -219,7 +219,7 @@ Promise.all(promises.map(function(p) {
## 五、版本管理 ## 五、版本管理
- 所有平台统一版本号 - 所有平台统一版本号
- 当前版本:`0.0.4` - 当前版本:`0.0.1`
- 文件名格式:`Koneko_{平台名}_v{版本号}.js` - 文件名格式:`Koneko_{平台名}_v{版本号}.js`
## 六、常见问题 ## 六、常见问题

View File

@@ -1,7 +1,7 @@
/** /**
* @name 网易云音乐 - Koneko * @name 网易云音乐 - Koneko
* @description 聚合音源插件: 官方搜索 + 多API音源容灾 + 完整Cookie功能 * @description 聚合音源插件: 官方搜索 + 多API音源容灾 + 完整Cookie功能
* @version 0.0.4 * @version 0.0.1
* @author Miao-moe * @author Miao-moe
* *
* 环境变量: * 环境变量:
@@ -604,7 +604,7 @@ var hotSearch = {
} }
var pluginInfo = { var pluginInfo = {
info: { id: 'koneko_wy', name: '网易云音乐 - Koneko', version: '0.0.4', description: '网易云音乐聚合音源插件,官方搜索+多API音源自动测速容灾切换支持Cookie功能' }, info: { id: 'koneko_wy', name: '网易云音乐 - Koneko', version: '0.0.1', description: '网易云音乐聚合音源插件,官方搜索+多API音源自动测速容灾切换支持Cookie功能' },
env: [ env: [
{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }, { key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' },
{ key: 'playlist_url', name: '个人主页链接', description: '网易云音乐个人主页链接,用于获取个人歌单' }, { key: 'playlist_url', name: '个人主页链接', description: '网易云音乐个人主页链接,用于获取个人歌单' },

View File

@@ -1,7 +1,7 @@
/** /**
* @name 酷我音乐 - Koneko * @name 酷我音乐 - Koneko
* @description 聚合音源插件: 官方搜索 + 多API音源容灾 * @description 聚合音源插件: 官方搜索 + 多API音源容灾
* @version 0.0.4 * @version 0.0.1
* @author Miao-moe * @author Miao-moe
* *
* 环境变量: * 环境变量:
@@ -47,6 +47,14 @@ function formatPlayTime(seconds) {
return m + ':' + (s < 10 ? '0' : '') + s return m + ':' + (s < 10 ? '0' : '') + s
} }
function safeGet(obj, keys) {
if (!obj) return ''
for (var i = 0; i < keys.length; i++) {
if (obj[keys[i]] != null) return obj[keys[i]]
}
return ''
}
var musicSearch = { var musicSearch = {
limit: 30, limit: 30,
total: 0, total: 0,
@@ -62,16 +70,26 @@ var musicSearch = {
'http://search.kuwo.cn/r.s?client=kt&all=' + encodeURIComponent(str) + '&pn=' + (page - 1) + '&rn=' + limit + '&uid=794762570&ver=kwplayer_ar_9.2.2.1&vipver=1&show_copyright_off=1&newver=1&ft=music&cluster=0&strategy=2012&encoding=utf8&rformat=json&vermerge=1&mobi=1&issubtitle=1', 'http://search.kuwo.cn/r.s?client=kt&all=' + encodeURIComponent(str) + '&pn=' + (page - 1) + '&rn=' + limit + '&uid=794762570&ver=kwplayer_ar_9.2.2.1&vipver=1&show_copyright_off=1&newver=1&ft=music&cluster=0&strategy=2012&encoding=utf8&rformat=json&vermerge=1&mobi=1&issubtitle=1',
HEADERS_COMMON HEADERS_COMMON
).then(function(result) { ).then(function(result) {
if (!result || !result.abslist || result.abslist.length === 0) { var listData = result && result.abslist
if (!listData || listData.length === 0) {
listData = result && result.data && result.data.list
}
if (!listData || listData.length === 0) {
listData = result && result.songs
}
if (!listData || listData.length === 0) {
return self.search(str, page, limit, retryNum) return self.search(str, page, limit, retryNum)
} }
var list = [] var list = []
for (var i = 0; i < result.abslist.length; i++) { for (var i = 0; i < listData.length; i++) {
var info = result.abslist[i] var info = listData[i]
var songId = (info.MUSICRID || '').replace('MUSIC_', '') var musicRid = safeGet(info, ['MUSICRID', 'musicrid', 'rid', 'id', 'songid'])
var songId = musicRid ? String(musicRid).replace('MUSIC_', '') : ''
if (!songId) continue
var qualities = {} var qualities = {}
if (info.N_MINFO) { var nmInfo = safeGet(info, ['N_MINFO', 'n_minfo', 'minfo'])
var parts = info.N_MINFO.split(';') if (nmInfo) {
var parts = String(nmInfo).split(';')
for (var j = 0; j < parts.length; j++) { for (var j = 0; j < parts.length; j++) {
var m = parts[j].match(/level:(\w+),bitrate:(\d+),format:(\w+),size:([\w.]+)/) var m = parts[j].match(/level:(\w+),bitrate:(\d+),format:(\w+),size:([\w.]+)/)
if (m) { if (m) {
@@ -84,29 +102,36 @@ var musicSearch = {
} }
} }
var picUrl = '' var picUrl = ''
if (info.ALBUMID) { var albumId = safeGet(info, ['ALBUMID', 'albumid', 'album_id', 'AlbumID'])
picUrl = 'https://img2.kuwo.cn/star/albumcover/300/' + info.ALBUMID + '.jpg' if (albumId) {
} else { picUrl = 'https://img2.kuwo.cn/star/albumcover/300/' + albumId + '.jpg'
picUrl = 'http://artistpicserver.kuwo.cn/pic.web?corp=kuwo&type=rid_pic&pictype=500&size=500&rid=' + songId
} }
var artistStr = '' if (!picUrl || picUrl === '') {
if (info.ARTIST) artistStr = info.ARTIST.replace(/&/g, '、') picUrl = 'http://artistpicserver.kuwo.cn/pic.web?corp=kuwo&type=rid_pic&pictype=500&size=500&rid=MUSIC_' + songId
var duration = parseInt(info.DURATION) }
var artistStr = safeGet(info, ['ARTIST', 'artist', 'singer', 'author'])
if (artistStr) artistStr = String(artistStr).replace(/&/g, '、')
var duration = parseInt(safeGet(info, ['DURATION', 'duration', 'Duration', 'time'])) || 0
var songName = safeGet(info, ['SONGNAME', 'songname', 'name', 'Name', 'title'])
var albumName = safeGet(info, ['ALBUM', 'album', 'Album', 'album_name'])
list.push({ list.push({
id: String(songId), id: String(songId),
name: String(info.SONGNAME || ''), name: String(songName || ''),
artists: artistStr, artists: artistStr,
source: 'kw', source: 'kw',
pic: picUrl, pic: picUrl,
mPic: picUrl, mPic: picUrl,
sPic: picUrl, sPic: picUrl,
albumName: String(info.ALBUM || ''), albumName: String(albumName || ''),
albumId: String(info.ALBUMID || ''), albumId: String(albumId || ''),
interval: isNaN(duration) ? '--/--' : formatPlayTime(duration), interval: isNaN(duration) ? '--/--' : formatPlayTime(duration),
qualities: qualities qualities: qualities
}) })
} }
self.total = parseInt(result.TOTAL) || 0 if (list.length === 0) {
return self.search(str, page, limit, retryNum)
}
self.total = parseInt(safeGet(result, ['TOTAL', 'total', 'Total'])) || list.length
self.page = page self.page = page
self.allPage = Math.ceil(self.total / limit) self.allPage = Math.ceil(self.total / limit)
return { list: list, allPage: self.allPage, limit: limit, total: self.total, source: 'kw' } return { list: list, allPage: self.allPage, limit: limit, total: self.total, source: 'kw' }
@@ -152,6 +177,7 @@ var hotSearch = {
function buildApis(songId, q) { function buildApis(songId, q) {
var br = mapBr(q) var br = mapBr(q)
var fullRid = 'MUSIC_' + songId
var apis = [] var apis = []
if (CERU_KEY) { if (CERU_KEY) {
apis.push({ apis.push({
@@ -168,6 +194,24 @@ function buildApis(songId, q) {
headers: { 'User-Agent': HEADERS_COMMON['User-Agent'], 'X-Request-Key': 'share-v3' }, headers: { 'User-Agent': HEADERS_COMMON['User-Agent'], 'X-Request-Key': 'share-v3' },
extract: function(res) { return res && res.code === 0 && res.url ? res.url : null } extract: function(res) { return res && res.code === 0 && res.url ? res.url : null }
}, },
{
name: '官方反代',
url: 'http://antiserver.kuwo.cn/anti.s?rid=' + fullRid + '&format=mp3&type=convert_url',
headers: HEADERS_COMMON,
extract: function(res) {
if (typeof res === 'string' && res.indexOf('http') === 0) return res
return null
}
},
{
name: '官方反代2',
url: 'http://antiserver.kuwo.cn/anti.s?type=convert_url&rid=' + fullRid + '&format=aac|mp3',
headers: HEADERS_COMMON,
extract: function(res) {
if (typeof res === 'string' && res.indexOf('http') === 0) return res
return null
}
},
{ {
name: '星海', name: '星海',
url: 'https://music-api.gdstudio.xyz/api.php?types=url&source=kuwo&id=' + songId + '&br=' + br, url: 'https://music-api.gdstudio.xyz/api.php?types=url&source=kuwo&id=' + songId + '&br=' + br,
@@ -288,13 +332,26 @@ var album = {
search: function(str, page, limit) { return Promise.resolve([]) } search: function(str, page, limit) { return Promise.resolve([]) }
} }
function getLyric(id) { return Promise.resolve('') } function getLyric(id) {
return httpGet('http://m.kuwo.cn/newh5app/api/music/musicLyric?musicId=' + id, HEADERS_COMMON, 8000).then(function(res) {
if (res && res.data && res.data.lrc) return { lrc: res.data.lrc }
if (res && res.lrclist) {
var lrc = ''
for (var i = 0; i < res.lrclist.length; i++) {
var t = res.lrclist[i]
lrc += '[' + t.time + ']' + (t.lineLyric || t.content || '') + '\n'
}
return { lrc: lrc }
}
return ''
}).catch(function(e) { return '' })
}
function getPic(songId) { return Promise.resolve('') } function getPic(songId) { return Promise.resolve('') }
function musicDetail(id) { return Promise.resolve(null) } function musicDetail(id) { return Promise.resolve(null) }
function musicInfo(id) { return Promise.resolve(null) } function musicInfo(id) { return Promise.resolve(null) }
var pluginInfo = { var pluginInfo = {
info: { id: 'koneko_kw', name: '酷我音乐 - Koneko', version: '0.0.4', description: '酷我音乐聚合音源插件,官方搜索+多API音源自动测速容灾切换' }, info: { id: 'koneko_kw', name: '酷我音乐 - Koneko', version: '0.0.1', description: '酷我音乐聚合音源插件,官方搜索+多API音源自动测速容灾切换' },
env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }], env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }],
ext: [], ext: [],
quality: [ quality: [

View File

@@ -1,7 +1,7 @@
/** /**
* @name 酷狗音乐 - Koneko * @name 酷狗音乐 - Koneko
* @description 聚合音源插件: 官方搜索 + 多API音源容灾 * @description 聚合音源插件: 官方搜索 + 多API音源容灾
* @version 0.0.4 * @version 0.0.1
* @author Miao-moe * @author Miao-moe
* *
* 环境变量: * 环境变量:
@@ -276,7 +276,7 @@ function musicDetail(id) { return Promise.resolve(null) }
function musicInfo(id) { return Promise.resolve(null) } function musicInfo(id) { return Promise.resolve(null) }
var pluginInfo = { var pluginInfo = {
info: { id: 'koneko_kg', name: '酷狗音乐 - Koneko', version: '0.0.4', description: '酷狗音乐聚合音源插件,官方搜索+多API音源自动测速容灾切换' }, info: { id: 'koneko_kg', name: '酷狗音乐 - Koneko', version: '0.0.1', description: '酷狗音乐聚合音源插件,官方搜索+多API音源自动测速容灾切换' },
env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }], env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥留空则跳过聆澜音源' }],
ext: [], ext: [],
quality: [ quality: [

View File

@@ -1,6 +1,6 @@
# Koneko QZ Music v2/v3 插件开发避坑指南 # Koneko QZ Music v2/v3 插件开发避坑指南
> 版本: 0.0.4 | 作者: 云汀(Miao-moe) | 目标: 支持迁移到其他 AI 继续开发 > 版本: 0.0.1 | 作者: 云汀(Miao-moe) | 目标: 支持迁移到其他 AI 继续开发
--- ---
@@ -121,7 +121,7 @@ API 调用顺序:
## 七、版本管理 ## 七、版本管理
- 所有平台统一版本号 - 所有平台统一版本号
- 当前版本:**0.0.4** - 当前版本:**0.0.1**
- 文件名格式:`Koneko_{平台名}_v{版本号}.js` - 文件名格式:`Koneko_{平台名}_v{版本号}.js`
## 八、常见报错 ## 八、常见报错

View File

@@ -6,12 +6,12 @@ QZ Music v2/v3 音源插件集合。每个插件仅包含一个平台,官方
| 文件 | 平台 | 版本 | 说明 | | 文件 | 平台 | 版本 | 说明 |
|------|------|------|------| |------|------|------|------|
| `Koneko_QQ音乐_v0.0.4.js` | QQ音乐 | 0.0.4 | 官方搜索 + 10路API音源容灾 | | `Koneko_QQ音乐_v0.0.1.js` | QQ音乐 | 0.0.1 | 官方搜索 + 10路API音源容灾 |
| `Koneko_酷狗音乐_v0.0.4.js` | 酷狗音乐 | 0.0.4 | 官方搜索 + 8路API音源容灾 | | `Koneko_酷狗音乐_v0.0.1.js` | 酷狗音乐 | 0.0.1 | 官方搜索 + 8路API音源容灾 |
| `Koneko_酷我音乐_v0.0.4.js` | 酷我音乐 | 0.0.4 | 官方搜索 + 9路API音源容灾 | | `Koneko_酷我音乐_v0.0.1.js` | 酷我音乐 | 0.0.1 | 官方搜索 + 9路API音源容灾 |
| `Koneko_网易云音乐_v0.0.4.js` | 网易云音乐 | 0.0.4 | 官方搜索 + 6路API音源容灾 + Cookie全功能 | | `Koneko_网易云音乐_v0.0.1.js` | 网易云音乐 | 0.0.1 | 官方搜索 + 6路API音源容灾 + Cookie全功能 |
| `Koneko_咪咕音乐_v0.0.4.js` | 咪咕音乐 | 0.0.4 | 官方搜索 + 8路API音源容灾 | | `Koneko_咪咕音乐_v0.0.1.js` | 咪咕音乐 | 0.0.1 | 官方搜索 + 8路API音源容灾 |
| `Koneko_GIT音源_v0.0.4.js` | GIT音源 | 0.0.4 | 纯音源 + 2路API音源容灾 | | `Koneko_GIT音源_v0.0.1.js` | GIT音源 | 0.0.1 | 纯音源 + 2路API音源容灾 |
## 环境变量 ## 环境变量