@zhin.js/plugin-music 1.1.0 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -27
- package/commands/cookie/delete/{[source].js → [source]/index.js} +4 -4
- package/commands/cookie/delete/{[source].ts → [source]/index.ts} +5 -5
- package/commands/cookie/get/{[source].js → [source]/index.js} +4 -4
- package/commands/cookie/get/{[source].ts → [source]/index.ts} +5 -5
- package/commands/cookie/set/{[source].js → [source]/index.js} +4 -4
- package/commands/cookie/set/{[source].ts → [source]/index.ts} +5 -5
- package/commands/cookie/{status.js → status/index.js} +4 -4
- package/commands/cookie/{status.ts → status/index.ts} +5 -5
- package/commands/login/{[platform].js → [platform]/index.js} +10 -8
- package/commands/login/{[platform].ts → [platform]/index.ts} +10 -12
- package/commands//347/202/271/346/255/214/{[keyword].js → [keyword]/index.js} +7 -6
- package/commands//347/202/271/346/255/214/{[keyword].ts → [keyword]/index.ts} +8 -7
- package/components/{share-music.js → share-music/index.js} +4 -4
- package/components/{share-music.ts → share-music/index.ts} +5 -5
- package/lib/credential-store.d.ts +10 -7
- package/lib/credential-store.d.ts.map +1 -1
- package/lib/credential-store.js +44 -70
- package/lib/credential-store.js.map +1 -1
- package/lib/index.d.ts +5 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -4
- package/lib/index.js.map +1 -1
- package/lib/login/index.d.ts +18 -11
- package/lib/login/index.d.ts.map +1 -1
- package/lib/login/index.js +103 -79
- package/lib/login/index.js.map +1 -1
- package/lib/music-lib.d.ts +3 -2
- package/lib/music-lib.d.ts.map +1 -1
- package/lib/music-lib.js +4 -5
- package/lib/music-lib.js.map +1 -1
- package/lib/runtime.d.ts +12 -0
- package/lib/runtime.d.ts.map +1 -0
- package/lib/runtime.js +3 -0
- package/lib/runtime.js.map +1 -0
- package/lib/session.d.ts +10 -4
- package/lib/session.d.ts.map +1 -1
- package/lib/session.js +33 -21
- package/lib/session.js.map +1 -1
- package/lib/sources/index.d.ts +2 -1
- package/lib/sources/index.d.ts.map +1 -1
- package/lib/sources/index.js +8 -6
- package/lib/sources/index.js.map +1 -1
- package/lib/sources/kugou.d.ts.map +1 -1
- package/lib/sources/kugou.js +16 -1
- package/lib/sources/kugou.js.map +1 -1
- package/lib/sources/netease.d.ts +3 -0
- package/lib/sources/netease.d.ts.map +1 -1
- package/lib/sources/netease.js +5 -2
- package/lib/sources/netease.js.map +1 -1
- package/lib/sources/qq.d.ts +3 -0
- package/lib/sources/qq.d.ts.map +1 -1
- package/lib/sources/qq.js +6 -3
- package/lib/sources/qq.js.map +1 -1
- package/middlewares/{music-selection.js → music-selection/index.js} +9 -7
- package/middlewares/{music-selection.ts → music-selection/index.ts} +13 -7
- package/package.json +16 -11
- package/plugin.js +23 -9
- package/{agent/skills/music.md → skills/music/SKILL.md} +2 -2
- package/{tools/music-search.js → skills/music/tools/music-search/index.js} +4 -3
- package/{tools/music-search.ts → skills/music/tools/music-search/index.ts} +11 -5
- package/{tools/music-share.js → skills/music/tools/music-share/index.js} +4 -3
- package/{tools/music-share.ts → skills/music/tools/music-share/index.ts} +6 -4
- package/src/credential-store.ts +43 -87
- package/src/index.ts +8 -16
- package/src/login/index.ts +111 -92
- package/src/music-lib.ts +5 -4
- package/src/runtime.ts +17 -0
- package/src/session.ts +38 -21
- package/src/sources/index.ts +9 -6
- package/src/sources/kugou.ts +15 -1
- package/src/sources/netease.ts +8 -2
- package/src/sources/qq.ts +9 -3
package/lib/session.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
const SEARCH_TIMEOUT_MS = 3 * 60 * 1000;
|
|
2
|
-
const pendingSessions = new Map();
|
|
3
2
|
export function sessionKey(endpointId, conversationId, senderId) {
|
|
4
3
|
return `${endpointId}:${conversationId}:${senderId}`;
|
|
5
4
|
}
|
|
@@ -12,28 +11,41 @@ export function resolveMessageIds(input) {
|
|
|
12
11
|
return null;
|
|
13
12
|
return { endpointId, conversationId, senderId };
|
|
14
13
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
pendingSessions.delete(key);
|
|
24
|
-
return undefined;
|
|
14
|
+
/** Generation-owned pending music selections. */
|
|
15
|
+
export class MusicSearchSessions {
|
|
16
|
+
#pending = new Map();
|
|
17
|
+
#timeoutMs;
|
|
18
|
+
#now;
|
|
19
|
+
constructor(timeoutMs = SEARCH_TIMEOUT_MS, now = Date.now) {
|
|
20
|
+
this.#timeoutMs = timeoutMs;
|
|
21
|
+
this.#now = now;
|
|
25
22
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
23
|
+
set(key, search) {
|
|
24
|
+
this.#pending.set(key, search);
|
|
25
|
+
}
|
|
26
|
+
get(key) {
|
|
27
|
+
const session = this.#pending.get(key);
|
|
28
|
+
if (!session)
|
|
29
|
+
return undefined;
|
|
30
|
+
if (this.#now() - session.timestamp > this.#timeoutMs) {
|
|
31
|
+
this.#pending.delete(key);
|
|
32
|
+
return undefined;
|
|
36
33
|
}
|
|
34
|
+
return session;
|
|
35
|
+
}
|
|
36
|
+
delete(key) {
|
|
37
|
+
this.#pending.delete(key);
|
|
38
|
+
}
|
|
39
|
+
pruneExpired() {
|
|
40
|
+
const now = this.#now();
|
|
41
|
+
for (const [key, session] of this.#pending) {
|
|
42
|
+
if (now - session.timestamp > this.#timeoutMs) {
|
|
43
|
+
this.#pending.delete(key);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
dispose() {
|
|
48
|
+
this.#pending.clear();
|
|
37
49
|
}
|
|
38
50
|
}
|
|
39
51
|
//# sourceMappingURL=session.js.map
|
package/lib/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AASA,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC,MAAM,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AASA,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC,MAAM,UAAU,UAAU,CACxB,UAAkB,EAClB,cAAsB,EACtB,QAAgB;IAEhB,OAAO,GAAG,UAAU,IAAI,cAAc,IAAI,QAAQ,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAIjC;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,iDAAiD;AACjD,MAAM,OAAO,mBAAmB;IACrB,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC5C,UAAU,CAAS;IACnB,IAAI,CAAe;IAE5B,YACE,SAAS,GAAG,iBAAiB,EAC7B,MAAoB,IAAI,CAAC,GAAG;QAE5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,MAAqB;QACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,YAAY;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3C,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
|
package/lib/sources/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { MusicSource, MusicSearchService } from '../types.js';
|
|
2
|
-
|
|
2
|
+
import type { CredentialStore } from '../credential-store.js';
|
|
3
|
+
export declare function createMusicServices(credentials: CredentialStore): Record<MusicSource, MusicSearchService>;
|
|
3
4
|
export * from './qq.js';
|
|
4
5
|
export * from './netease.js';
|
|
5
6
|
export * from './kuwo.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAOzG;AAED,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
package/lib/sources/index.js
CHANGED
|
@@ -2,12 +2,14 @@ import { QQMusicService } from './qq.js';
|
|
|
2
2
|
import { NeteaseMusicService } from './netease.js';
|
|
3
3
|
import { KuwoMusicService } from './kuwo.js';
|
|
4
4
|
import { KugouMusicService } from './kugou.js';
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
export function createMusicServices(credentials) {
|
|
6
|
+
return {
|
|
7
|
+
qq: new QQMusicService(credentials),
|
|
8
|
+
netease: new NeteaseMusicService(credentials),
|
|
9
|
+
kuwo: new KuwoMusicService(),
|
|
10
|
+
kugou: new KugouMusicService(),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
11
13
|
export * from './qq.js';
|
|
12
14
|
export * from './netease.js';
|
|
13
15
|
export * from './kuwo.js';
|
package/lib/sources/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAI/C,MAAM,UAAU,mBAAmB,CAAC,WAA4B;IAC9D,OAAO;QACL,EAAE,EAAE,IAAI,cAAc,CAAC,WAAW,CAAC;QACnC,OAAO,EAAE,IAAI,mBAAmB,CAAC,WAAW,CAAC;QAC7C,IAAI,EAAE,IAAI,gBAAgB,EAAE;QAC5B,KAAK,EAAE,IAAI,iBAAiB,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kugou.d.ts","sourceRoot":"","sources":["../../src/sources/kugou.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"kugou.d.ts","sourceRoot":"","sources":["../../src/sources/kugou.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAyB9E,qBAAa,iBAAkB,YAAW,kBAAkB;IACpD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA6BzD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAoClD"}
|
package/lib/sources/kugou.js
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
function stripHtmlTags(input) {
|
|
2
|
+
let result = '';
|
|
3
|
+
let cursor = 0;
|
|
4
|
+
while (cursor < input.length) {
|
|
5
|
+
const start = input.indexOf('<', cursor);
|
|
6
|
+
if (start < 0)
|
|
7
|
+
return result + input.slice(cursor);
|
|
8
|
+
result += input.slice(cursor, start);
|
|
9
|
+
const end = input.indexOf('>', start + 1);
|
|
10
|
+
if (end < 0)
|
|
11
|
+
return result + input.slice(start);
|
|
12
|
+
cursor = end + 1;
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
1
16
|
export class KugouMusicService {
|
|
2
17
|
async search(keyword, limit = 10) {
|
|
3
18
|
try {
|
|
@@ -13,7 +28,7 @@ export class KugouMusicService {
|
|
|
13
28
|
return items.slice(0, limit).map((item) => ({
|
|
14
29
|
id: item.hash,
|
|
15
30
|
source: 'kugou',
|
|
16
|
-
title: item.songname
|
|
31
|
+
title: stripHtmlTags(item.songname ?? ''),
|
|
17
32
|
artist: item.singername,
|
|
18
33
|
album: item.album_name,
|
|
19
34
|
duration: item.duration,
|
package/lib/sources/kugou.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kugou.js","sourceRoot":"","sources":["../../src/sources/kugou.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,iBAAiB;IAC5B,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,KAAK,GAAG,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,gDAAgD,CAAC,CAAC;YACtE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACzC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAClC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAChD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAEtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1C,EAAE,EAAE,IAAI,CAAC,IAAI;gBACb,MAAM,EAAE,OAAgB;gBACxB,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"kugou.js","sourceRoot":"","sources":["../../src/sources/kugou.ts"],"names":[],"mappings":"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"}
|
package/lib/sources/netease.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { MusicSearchService, MusicDetail, MusicInfo } from '../types.js';
|
|
2
|
+
import type { CredentialStore } from '../credential-store.js';
|
|
2
3
|
/** 网易云音乐搜索服务 */
|
|
3
4
|
export declare class NeteaseMusicService implements MusicSearchService {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(credentials: CredentialStore);
|
|
4
7
|
search(keyword: string, limit?: number): Promise<MusicInfo[]>;
|
|
5
8
|
getCover(id: string): Promise<string | null>;
|
|
6
9
|
getDetail(id: string): Promise<MusicDetail>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"netease.d.ts","sourceRoot":"","sources":["../../src/sources/netease.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAY,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"netease.d.ts","sourceRoot":"","sources":["../../src/sources/netease.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAY,MAAM,aAAa,CAAC;AACxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,gBAAgB;AAChB,qBAAa,mBAAoB,YAAW,kBAAkB;;gBAGhD,WAAW,EAAE,eAAe;IAIlC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAwBzD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiB5C,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBjD;;;;;OAKG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA4B/C"}
|
package/lib/sources/netease.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { getCredential } from '../credential-store.js';
|
|
2
1
|
/** 网易云音乐搜索服务 */
|
|
3
2
|
export class NeteaseMusicService {
|
|
3
|
+
#credentials;
|
|
4
|
+
constructor(credentials) {
|
|
5
|
+
this.#credentials = credentials;
|
|
6
|
+
}
|
|
4
7
|
async search(keyword, limit = 10) {
|
|
5
8
|
try {
|
|
6
9
|
const searchUrl = `http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s=${encodeURIComponent(keyword)}&type=1&offset=0&total=true&limit=${limit}`;
|
|
@@ -62,7 +65,7 @@ export class NeteaseMusicService {
|
|
|
62
65
|
* @returns 音频直链 URL
|
|
63
66
|
*/
|
|
64
67
|
async getAudioUrl(id) {
|
|
65
|
-
const cookie = await
|
|
68
|
+
const cookie = await this.#credentials.get('netease', 'cookie');
|
|
66
69
|
if (cookie) {
|
|
67
70
|
try {
|
|
68
71
|
const response = await fetch(`https://music.163.com/api/song/enhance/player/url?ids=[${id}]&br=320000`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"netease.js","sourceRoot":"","sources":["../../src/sources/netease.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"netease.js","sourceRoot":"","sources":["../../src/sources/netease.ts"],"names":[],"mappings":"AAIA,gBAAgB;AAChB,MAAM,OAAO,mBAAmB;IACrB,YAAY,CAAkB;IAEvC,YAAY,WAA4B;QACtC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,KAAK,GAAG,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,6EAA6E,kBAAkB,CAAC,OAAO,CAAC,qCAAqC,KAAK,EAAE,CAAA;YAEtK,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;YAC1D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAuC,CAAA;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAA;YAEtC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACzB,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,MAAM,EAAE,SAAkB;gBAC1B,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACjD,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;gBACvB,GAAG,EAAE,mCAAmC,KAAK,CAAC,EAAE,EAAE;gBAClD,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS;gBAClD,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aACzE,CAAC,CAAC,CAAA;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAA;YACpD,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,+CAA+C,EAAE,GAAG,CAAC,CAAA;YAEzE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;YACpD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA2B,CAAA;YAE3D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;YAC5B,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAA;YAEtB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAA;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAA;YACvD,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,+CAA+C,EAAE,GAAG,CAAC,CAAA;QAEvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;QACpD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA2B,CAAA;QAE3D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAE7C,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,GAAG,EAAE,mCAAmC,IAAI,CAAC,EAAE,EAAE;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;YAChD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YACtE,KAAK,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;SAClC,CAAA;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChE,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,0DAA0D,EAAE,aAAa,EACzE;oBACE,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;iBAC5B,CACF,CAAC;gBACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAEjC,CAAC;gBACF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;gBACvC,IAAI,QAAQ;oBAAE,OAAO,QAAQ,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,wDAAwD;YAC1D,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,gCAAgC,CAAC;QAChD,MAAM,GAAG,GAAG,GAAG,MAAM,gBAAgB,EAAE,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA+C,CAAC;QAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;QAC5C,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACtD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
package/lib/sources/qq.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { MusicSearchService, MusicDetail, MusicInfo } from '../types.js';
|
|
2
|
+
import type { CredentialStore } from '../credential-store.js';
|
|
2
3
|
export declare class QQMusicService implements MusicSearchService {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(credentials: CredentialStore);
|
|
3
6
|
search(keyword: string, limit?: number): Promise<MusicInfo[]>;
|
|
4
7
|
getDetail(id: string): Promise<MusicDetail>;
|
|
5
8
|
getAudioUrl(id: string, mid?: string, mediaMid?: string): Promise<string>;
|
package/lib/sources/qq.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qq.d.ts","sourceRoot":"","sources":["../../src/sources/qq.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"qq.d.ts","sourceRoot":"","sources":["../../src/sources/qq.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAc9D,qBAAa,cAAe,YAAW,kBAAkB;;gBAG3C,WAAW,EAAE,eAAe;IAIlC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0DzD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkC3C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiDzE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAqBnD"}
|
package/lib/sources/qq.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as crypto from 'node:crypto';
|
|
2
|
-
import { getCredential } from '../credential-store.js';
|
|
3
2
|
const md5 = (text) => crypto.createHash('md5').update(text).digest('hex');
|
|
4
3
|
const MUSICU_API = 'https://u.y.qq.com/cgi-bin/musicu.fcg';
|
|
5
4
|
function getHeaders(cookie) {
|
|
@@ -10,9 +9,13 @@ function getHeaders(cookie) {
|
|
|
10
9
|
};
|
|
11
10
|
}
|
|
12
11
|
export class QQMusicService {
|
|
12
|
+
#credentials;
|
|
13
|
+
constructor(credentials) {
|
|
14
|
+
this.#credentials = credentials;
|
|
15
|
+
}
|
|
13
16
|
async search(keyword, limit = 10) {
|
|
14
17
|
try {
|
|
15
|
-
const cookie = await
|
|
18
|
+
const cookie = await this.#credentials.get('qq', 'cookie');
|
|
16
19
|
const response = await fetch(MUSICU_API, {
|
|
17
20
|
method: 'POST',
|
|
18
21
|
headers: getHeaders(cookie),
|
|
@@ -96,7 +99,7 @@ export class QQMusicService {
|
|
|
96
99
|
};
|
|
97
100
|
}
|
|
98
101
|
async getAudioUrl(id, mid, mediaMid) {
|
|
99
|
-
const cookie = await
|
|
102
|
+
const cookie = await this.#credentials.get('qq', 'cookie');
|
|
100
103
|
if (cookie) {
|
|
101
104
|
try {
|
|
102
105
|
const uin = /uin=o?(\d+)/.exec(cookie)?.[1] ?? '0';
|
package/lib/sources/qq.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qq.js","sourceRoot":"","sources":["../../src/sources/qq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"qq.js","sourceRoot":"","sources":["../../src/sources/qq.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
2
|
import { defineMiddleware } from 'zhin.js/middleware';
|
|
3
|
-
import { sessionKey, resolveMessageIds
|
|
4
|
-
import { shareMusicDetail, buildMusicShareSegment } from "
|
|
5
|
-
import { SOURCE_DISPLAY_NAME } from "
|
|
3
|
+
import { sessionKey, resolveMessageIds } from "../../lib/session.js";
|
|
4
|
+
import { shareMusicDetail, buildMusicShareSegment } from "../../lib/music-lib.js";
|
|
5
|
+
import { SOURCE_DISPLAY_NAME } from "../../lib/config.js";
|
|
6
|
+
import { musicRuntimeToken } from "../../lib/runtime.js";
|
|
6
7
|
export default defineMiddleware({
|
|
7
8
|
target: 'inbound',
|
|
8
9
|
async handle(context, next) {
|
|
@@ -17,13 +18,14 @@ export default defineMiddleware({
|
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
19
20
|
const key = sessionKey(ids.endpointId, ids.conversationId, ids.senderId);
|
|
20
|
-
const
|
|
21
|
+
const runtime = context.use(musicRuntimeToken);
|
|
22
|
+
const pending = runtime.sessions.get(key);
|
|
21
23
|
if (!pending) {
|
|
22
24
|
await next();
|
|
23
25
|
return;
|
|
24
26
|
}
|
|
25
27
|
if (raw === '取消') {
|
|
26
|
-
|
|
28
|
+
runtime.sessions.delete(key);
|
|
27
29
|
await context.input.$reply('已取消点歌');
|
|
28
30
|
return;
|
|
29
31
|
}
|
|
@@ -32,10 +34,10 @@ export default defineMiddleware({
|
|
|
32
34
|
await next();
|
|
33
35
|
return;
|
|
34
36
|
}
|
|
35
|
-
|
|
37
|
+
runtime.sessions.delete(key);
|
|
36
38
|
const selected = pending.results[num - 1];
|
|
37
39
|
const sourceName = SOURCE_DISPLAY_NAME[selected.source] ?? selected.source;
|
|
38
|
-
const detailResult = await shareMusicDetail(selected.id, selected.source);
|
|
40
|
+
const detailResult = await shareMusicDetail(runtime, selected.id, selected.source);
|
|
39
41
|
if (!detailResult.success) {
|
|
40
42
|
await context.input.$reply(`[${sourceName}] 获取"${selected.title}"播放信息失败:${detailResult.error}`);
|
|
41
43
|
return;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { defineMiddleware } from 'zhin.js/middleware';
|
|
2
2
|
import type { Message } from '@zhin.js/core/runtime';
|
|
3
|
-
import { sessionKey, resolveMessageIds
|
|
4
|
-
import { shareMusicDetail, buildMusicShareSegment } from '
|
|
5
|
-
import { SOURCE_DISPLAY_NAME } from '
|
|
3
|
+
import { sessionKey, resolveMessageIds } from '../../src/session.js';
|
|
4
|
+
import { shareMusicDetail, buildMusicShareSegment } from '../../src/music-lib.js';
|
|
5
|
+
import { SOURCE_DISPLAY_NAME } from '../../src/config.js';
|
|
6
|
+
import { musicRuntimeToken } from '../../src/runtime.js';
|
|
6
7
|
|
|
7
8
|
export default defineMiddleware<Message>({
|
|
8
9
|
target: 'inbound',
|
|
@@ -20,14 +21,15 @@ export default defineMiddleware<Message>({
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
const key = sessionKey(ids.endpointId, ids.conversationId, ids.senderId);
|
|
23
|
-
const
|
|
24
|
+
const runtime = context.use(musicRuntimeToken);
|
|
25
|
+
const pending = runtime.sessions.get(key);
|
|
24
26
|
if (!pending) {
|
|
25
27
|
await next();
|
|
26
28
|
return;
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
if (raw === '取消') {
|
|
30
|
-
|
|
32
|
+
runtime.sessions.delete(key);
|
|
31
33
|
await context.input.$reply('已取消点歌');
|
|
32
34
|
return;
|
|
33
35
|
}
|
|
@@ -38,11 +40,15 @@ export default defineMiddleware<Message>({
|
|
|
38
40
|
return;
|
|
39
41
|
}
|
|
40
42
|
|
|
41
|
-
|
|
43
|
+
runtime.sessions.delete(key);
|
|
42
44
|
const selected = pending.results[num - 1]!;
|
|
43
45
|
const sourceName = SOURCE_DISPLAY_NAME[selected.source] ?? selected.source;
|
|
44
46
|
|
|
45
|
-
const detailResult = await shareMusicDetail(
|
|
47
|
+
const detailResult = await shareMusicDetail(
|
|
48
|
+
runtime,
|
|
49
|
+
selected.id,
|
|
50
|
+
selected.source,
|
|
51
|
+
);
|
|
46
52
|
if (!detailResult.success) {
|
|
47
53
|
await context.input.$reply(
|
|
48
54
|
`[${sourceName}] 获取"${selected.title}"播放信息失败:${detailResult.error}`,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/plugin-music",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "Music search and sharing plugin for Zhin.js (Plugin Runtime)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
"commands",
|
|
20
20
|
"middlewares",
|
|
21
21
|
"components",
|
|
22
|
-
"tools",
|
|
23
22
|
"src",
|
|
24
23
|
"lib",
|
|
25
|
-
"
|
|
24
|
+
"tools",
|
|
25
|
+
"skills",
|
|
26
26
|
"README.md"
|
|
27
27
|
],
|
|
28
28
|
"keywords": [
|
|
@@ -43,20 +43,21 @@
|
|
|
43
43
|
},
|
|
44
44
|
"license": "MIT",
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@zhin.js/core": "1.1.
|
|
47
|
-
"@zhin.js/tool": "1.1.
|
|
46
|
+
"@zhin.js/core": "1.1.38",
|
|
47
|
+
"@zhin.js/tool": "1.1.2",
|
|
48
|
+
"@zhin.js/skill": "1.1.2"
|
|
48
49
|
},
|
|
49
50
|
"devDependencies": {
|
|
50
51
|
"typescript": "^6.0.3",
|
|
51
52
|
"vitest": "^4.1.10",
|
|
52
|
-
"zhin.js": "1.1.
|
|
53
|
+
"zhin.js": "1.1.3"
|
|
53
54
|
},
|
|
54
55
|
"peerDependencies": {
|
|
55
|
-
"@zhin.js/adapter-icqq": "^1.1.
|
|
56
|
-
"@zhin.js/command": "^1.1.
|
|
57
|
-
"@zhin.js/component": "^1.1.
|
|
58
|
-
"@zhin.js/middleware": "^1.1.
|
|
59
|
-
"zhin.js": "^1.1.
|
|
56
|
+
"@zhin.js/adapter-icqq": "^1.1.3",
|
|
57
|
+
"@zhin.js/command": "^1.1.2",
|
|
58
|
+
"@zhin.js/component": "^1.1.2",
|
|
59
|
+
"@zhin.js/middleware": "^1.1.2",
|
|
60
|
+
"zhin.js": "^1.1.3"
|
|
60
61
|
},
|
|
61
62
|
"peerDependenciesMeta": {
|
|
62
63
|
"@zhin.js/adapter-icqq": {
|
|
@@ -106,6 +107,10 @@
|
|
|
106
107
|
{
|
|
107
108
|
"package": "@zhin.js/tool",
|
|
108
109
|
"api": "^1.0.0"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"package": "@zhin.js/skill",
|
|
113
|
+
"api": "^1.0.0"
|
|
109
114
|
}
|
|
110
115
|
],
|
|
111
116
|
"plugins": []
|
package/plugin.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
2
|
import { definePlugin, databaseHostToken } from 'zhin.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { MusicSearchSessions } from "./lib/session.js";
|
|
4
|
+
import { QrLoginRuntime } from "./lib/login/index.js";
|
|
5
|
+
import { CredentialStore, createInMemoryCredentialDb, MUSIC_CREDENTIALS_TABLE, } from "./lib/credential-store.js";
|
|
6
|
+
import { createMusicServices } from "./lib/sources/index.js";
|
|
7
|
+
import { musicRuntimeToken } from "./lib/runtime.js";
|
|
6
8
|
function defineCredentialTable(db) {
|
|
7
9
|
db.define(MUSIC_CREDENTIALS_TABLE, {
|
|
8
10
|
source: { type: 'text', nullable: false },
|
|
@@ -17,15 +19,27 @@ export default definePlugin({
|
|
|
17
19
|
displayName: 'Music',
|
|
18
20
|
},
|
|
19
21
|
setup(context) {
|
|
20
|
-
|
|
22
|
+
const db = context.resources.has(databaseHostToken) ? (() => {
|
|
21
23
|
const host = context.resources.use(databaseHostToken);
|
|
22
24
|
defineCredentialTable(host);
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
+
return host;
|
|
26
|
+
})() : createInMemoryCredentialDb();
|
|
27
|
+
const credentials = new CredentialStore(db);
|
|
28
|
+
const runtime = Object.freeze({
|
|
29
|
+
credentials,
|
|
30
|
+
services: Object.freeze(createMusicServices(credentials)),
|
|
31
|
+
sessions: new MusicSearchSessions(),
|
|
32
|
+
logins: new QrLoginRuntime(credentials),
|
|
33
|
+
});
|
|
34
|
+
context.resources.provide(musicRuntimeToken, runtime);
|
|
25
35
|
const timer = setInterval(() => {
|
|
26
|
-
|
|
27
|
-
|
|
36
|
+
runtime.sessions.pruneExpired();
|
|
37
|
+
runtime.logins.pruneExpired();
|
|
28
38
|
}, 60_000);
|
|
29
|
-
return () =>
|
|
39
|
+
return () => {
|
|
40
|
+
clearInterval(timer);
|
|
41
|
+
runtime.sessions.dispose();
|
|
42
|
+
runtime.logins.dispose();
|
|
43
|
+
};
|
|
30
44
|
},
|
|
31
45
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
2
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
|
-
import { searchMusic } from "
|
|
3
|
+
import { searchMusic } from "../../../../lib/music-lib.js";
|
|
4
|
+
import { musicRuntimeToken } from "../../../../lib/runtime.js";
|
|
4
5
|
export default defineAgentTool({
|
|
5
6
|
description: '搜索音乐并返回结果列表(支持QQ/网易云/酷我/酷狗)',
|
|
6
7
|
inputSchema: {
|
|
@@ -16,6 +17,6 @@ export default defineAgentTool({
|
|
|
16
17
|
},
|
|
17
18
|
required: ['keyword'],
|
|
18
19
|
},
|
|
19
|
-
|
|
20
|
-
execute: ({ keyword, source, limit }) => searchMusic(String(keyword), source, typeof limit === 'number' ? limit : 5),
|
|
20
|
+
requiresApproval: 'never',
|
|
21
|
+
execute: ({ keyword, source, limit }, context) => searchMusic(context.use(musicRuntimeToken), String(keyword), source, typeof limit === 'number' ? limit : 5),
|
|
21
22
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
|
-
import { searchMusic } from '
|
|
3
|
-
import type { MusicSource } from '
|
|
2
|
+
import { searchMusic } from '../../../../src/music-lib.js';
|
|
3
|
+
import type { MusicSource } from '../../../../src/types.js';
|
|
4
|
+
import { musicRuntimeToken } from '../../../../src/runtime.js';
|
|
4
5
|
|
|
5
6
|
export default defineAgentTool<{
|
|
6
7
|
keyword: string;
|
|
@@ -21,7 +22,12 @@ export default defineAgentTool<{
|
|
|
21
22
|
},
|
|
22
23
|
required: ['keyword'],
|
|
23
24
|
},
|
|
24
|
-
|
|
25
|
-
execute: ({ keyword, source, limit }) =>
|
|
26
|
-
searchMusic(
|
|
25
|
+
requiresApproval: 'never',
|
|
26
|
+
execute: ({ keyword, source, limit }, context) =>
|
|
27
|
+
searchMusic(
|
|
28
|
+
context.use(musicRuntimeToken),
|
|
29
|
+
String(keyword),
|
|
30
|
+
source,
|
|
31
|
+
typeof limit === 'number' ? limit : 5,
|
|
32
|
+
),
|
|
27
33
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
2
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
|
-
import { shareMusicDetail } from "
|
|
3
|
+
import { shareMusicDetail } from "../../../../lib/music-lib.js";
|
|
4
|
+
import { musicRuntimeToken } from "../../../../lib/runtime.js";
|
|
4
5
|
export default defineAgentTool({
|
|
5
6
|
description: '分享指定的音乐(支持QQ/网易云/酷我/酷狗)',
|
|
6
7
|
inputSchema: {
|
|
@@ -15,6 +16,6 @@ export default defineAgentTool({
|
|
|
15
16
|
},
|
|
16
17
|
required: ['id', 'source'],
|
|
17
18
|
},
|
|
18
|
-
|
|
19
|
-
execute: ({ id, source }) => shareMusicDetail(String(id), source),
|
|
19
|
+
requiresApproval: 'never',
|
|
20
|
+
execute: ({ id, source }, context) => shareMusicDetail(context.use(musicRuntimeToken), String(id), source),
|
|
20
21
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
|
-
import { shareMusicDetail } from '
|
|
3
|
-
import type { MusicSource } from '
|
|
2
|
+
import { shareMusicDetail } from '../../../../src/music-lib.js';
|
|
3
|
+
import type { MusicSource } from '../../../../src/types.js';
|
|
4
|
+
import { musicRuntimeToken } from '../../../../src/runtime.js';
|
|
4
5
|
|
|
5
6
|
export default defineAgentTool<{
|
|
6
7
|
id: string;
|
|
@@ -19,6 +20,7 @@ export default defineAgentTool<{
|
|
|
19
20
|
},
|
|
20
21
|
required: ['id', 'source'],
|
|
21
22
|
},
|
|
22
|
-
|
|
23
|
-
execute: ({ id, source }) =>
|
|
23
|
+
requiresApproval: 'never',
|
|
24
|
+
execute: ({ id, source }, context) =>
|
|
25
|
+
shareMusicDetail(context.use(musicRuntimeToken), String(id), source),
|
|
24
26
|
});
|