mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-02 04:52:50 +08:00
feat: expose vip flag on Song for trial-only detection
Add optional vip?: boolean to the Song interface so downstream clients (e.g. PowerfulTS) can mark copyright-restricted songs that non-VIP users can only play as a trial fragment, before playback starts. - provider.ts: add optional vip?: boolean (backward compatible) - netease.ts: extract mapNeteaseSongs() pure fn; map fee to vip (1=VIP, 4=album-only). fee=8 (free low-quality) is excluded because it plays in full, just at lower quality. - qq.ts: mapQqSongs() maps pay.payplay/paytrackprice to vip (one fix covers all callers); getDailyRecommendSongs inline mapping too. - tests: vip mapping assertions for netease fee (1/4=vip, 0/8=free) and qq pay fields.
This commit is contained in:
1 parent
06aaec4ba5
commit
7b2bd0ea6a
5 files changed
+62
-59
No files matched your search
@@ -1,5 +1,5 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { parseLyrics, mapNeteaseAlbums } from "./netease.js";
|
||||
import { parseLyrics, mapNeteaseAlbums, mapNeteaseSongs } from "./netease.js";
|
||||
|
||||
describe("NetEase adapter", () => {
|
||||
it("parses LRC format lyrics", () => {
|
||||
@@ -56,4 +56,25 @@ describe("NetEase adapter", () => {
|
||||
expect(mapNeteaseAlbums(null as any)).toEqual([]);
|
||||
expect(mapNeteaseAlbums(undefined as any)).toEqual([]);
|
||||
});
|
||||
|
||||
it("mapNeteaseSongs maps fee to vip flag (1/4 = vip, 0/8 = free)", () => {
|
||||
const raw = [
|
||||
{ id: 1, name: "VIP", ar: [{ name: "A" }], al: { name: "Al", picUrl: "p" }, dt: 180000, fee: 1 },
|
||||
{ id: 2, name: "Album-only", ar: [], al: { name: "Al", picUrl: "" }, dt: 0, fee: 4 },
|
||||
{ id: 3, name: "Free", ar: [], al: {}, dt: 0, fee: 0 },
|
||||
{ id: 4, name: "Free low-quality", ar: [], al: {}, dt: 0, fee: 8 },
|
||||
];
|
||||
const out = mapNeteaseSongs(raw);
|
||||
expect(out[0].vip).toBe(true);
|
||||
expect(out[1].vip).toBe(true);
|
||||
expect(out[2].vip).toBe(false);
|
||||
expect(out[3].vip).toBe(false); // fee=8 plays in full (low quality), NOT vip
|
||||
});
|
||||
|
||||
it("mapNeteaseSongs accepts artists/album/duration aliases (personal_fm shape)", () => {
|
||||
const out = mapNeteaseSongs([
|
||||
{ id: 9, name: "FM", artists: [{ name: "B" }], album: { name: "Al2", picUrl: "p2" }, duration: 200000, fee: 0 },
|
||||
]);
|
||||
expect(out[0]).toMatchObject({ artist: "B", album: "Al2", coverUrl: "p2", vip: false });
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user