@ziplayer/plugin 0.0.3 → 0.0.5
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 +180 -179
- package/dist/SoundCloudPlugin.d.ts.map +1 -1
- package/dist/SoundCloudPlugin.js +20 -9
- package/dist/SoundCloudPlugin.js.map +1 -1
- package/dist/TTSPlugin.d.ts.map +1 -1
- package/dist/TTSPlugin.js +4 -1
- package/dist/TTSPlugin.js.map +1 -1
- package/dist/YouTubePlugin.d.ts +2 -0
- package/dist/YouTubePlugin.d.ts.map +1 -1
- package/dist/YouTubePlugin.js +80 -86
- package/dist/YouTubePlugin.js.map +1 -1
- package/package.json +4 -4
- package/src/SoundCloudPlugin.ts +20 -8
- package/src/TTSPlugin.ts +4 -1
- package/src/YouTubePlugin.ts +131 -94
package/README.md
CHANGED
|
@@ -1,179 +1,180 @@
|
|
|
1
|
-
<img width="
|
|
2
|
-
|
|
3
|
-
# @ziplayer/plugin
|
|
4
|
-
|
|
5
|
-
Official plugin bundle for ZiPlayer. It ships a set of ready‑to‑use source plugins you can register on your `PlayerManager`:
|
|
6
|
-
|
|
7
|
-
- YouTubePlugin: search + stream YouTube videos and playlists
|
|
8
|
-
- SoundCloudPlugin: search + stream SoundCloud tracks and sets
|
|
9
|
-
- SpotifyPlugin: resolve tracks/albums/playlists, stream via fallbacks
|
|
10
|
-
- TTSPlugin: Text‑to‑Speech playback from simple `tts:` queries
|
|
11
|
-
|
|
12
|
-
ZiPlayer is an audio player built on top of `@discordjs/voice` and `discord.js`. This package provides sources; the core player
|
|
13
|
-
lives in `ziplayer`.
|
|
14
|
-
|
|
15
|
-
## Installation
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
npm install @ziplayer/plugin ziplayer @discordjs/voice discord.js
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
The TTS plugin uses a lightweight Google TTS wrapper and HTTP fetches:
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
npm install @zibot/zitts axios
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Quick Start
|
|
28
|
-
|
|
29
|
-
```ts
|
|
30
|
-
import { PlayerManager } from "ziplayer";
|
|
31
|
-
import { YouTubePlugin, SoundCloudPlugin, SpotifyPlugin, TTSPlugin } from "@ziplayer/plugin";
|
|
32
|
-
|
|
33
|
-
const manager = new PlayerManager({
|
|
34
|
-
plugins: [
|
|
35
|
-
// Order matters: put more specific handlers first (e.g., TTS)
|
|
36
|
-
new TTSPlugin({ defaultLang: "en" }),
|
|
37
|
-
new YouTubePlugin(),
|
|
38
|
-
new SoundCloudPlugin(),
|
|
39
|
-
new SpotifyPlugin(),
|
|
40
|
-
],
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
// Create and connect a player (discord.js VoiceChannel instance)
|
|
44
|
-
const player = manager.create(guildId, { userdata: { channel: textChannel } });
|
|
45
|
-
await player.connect(voiceChannel);
|
|
46
|
-
|
|
47
|
-
// Search & play
|
|
48
|
-
await player.play("never gonna give you up", requestedBy);
|
|
49
|
-
|
|
50
|
-
// Play a playlist URL directly
|
|
51
|
-
await player.play("https://www.youtube.com/playlist?list=...", requestedBy);
|
|
52
|
-
|
|
53
|
-
// Speak with TTS
|
|
54
|
-
await player.play("tts:en:Hello there!", requestedBy);
|
|
55
|
-
|
|
56
|
-
// Handle events via the manager
|
|
57
|
-
manager.on("trackStart", (plr, track) => {
|
|
58
|
-
plr.userdata?.channel?.send?.(`Now playing: ${track.title}`);
|
|
59
|
-
});
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## Included Plugins
|
|
63
|
-
|
|
64
|
-
### YouTubePlugin
|
|
65
|
-
|
|
66
|
-
- Resolves YouTube videos and playlists.
|
|
67
|
-
- Uses `youtubei.js` under the hood.
|
|
68
|
-
|
|
69
|
-
```ts
|
|
70
|
-
import { YouTubePlugin } from "@ziplayer/plugin";
|
|
71
|
-
const youtube = new YouTubePlugin();
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### SoundCloudPlugin
|
|
75
|
-
|
|
76
|
-
- Resolves tracks and sets. You may further tune streaming by combining with other plugins that provide fallbacks.
|
|
77
|
-
|
|
78
|
-
```ts
|
|
79
|
-
import { SoundCloudPlugin } from "@ziplayer/plugin";
|
|
80
|
-
const sc = new SoundCloudPlugin();
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### SpotifyPlugin
|
|
84
|
-
|
|
85
|
-
- Resolves track/album/playlist metadata from Spotify.
|
|
86
|
-
- Streaming typically uses fallback sources (e.g., YouTube) discovered by your plugin set.
|
|
87
|
-
|
|
88
|
-
```ts
|
|
89
|
-
import { SpotifyPlugin } from "@ziplayer/plugin";
|
|
90
|
-
const sp = new SpotifyPlugin();
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### TTSPlugin (Text‑to‑Speech)
|
|
94
|
-
|
|
95
|
-
- Plays spoken audio from text using a lightweight Google TTS wrapper.
|
|
96
|
-
- Supported query formats:
|
|
97
|
-
- `tts: <text>`
|
|
98
|
-
- `tts:<lang>:<text>` (e.g., `tts:vi:xin chao`)
|
|
99
|
-
- `tts:<lang>:1:<text>` (set `slow = true`, `0` = normal)
|
|
100
|
-
|
|
101
|
-
```ts
|
|
102
|
-
import { TTSPlugin } from "@ziplayer/plugin";
|
|
103
|
-
const tts = new TTSPlugin({ defaultLang: "en", slow: false });
|
|
104
|
-
await player.play("tts:en:1:good morning", requestedBy);
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
Note: Please comply with the service’s terms and provide your own quotas. The wrapper is intended for lightweight usage and may
|
|
108
|
-
change without notice.
|
|
109
|
-
|
|
110
|
-
Advanced: custom TTS provider
|
|
111
|
-
|
|
112
|
-
You can override audio generation by passing a `createStream` function. It receives the text and context and can return a Node
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
-
|
|
169
|
-
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
-
|
|
175
|
-
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
1
|
+
<img width="1175" height="305" alt="logo" src="https://github.com/user-attachments/assets/d4db4892-9c3d-4314-9228-701629555380" />
|
|
2
|
+
|
|
3
|
+
# @ziplayer/plugin
|
|
4
|
+
|
|
5
|
+
Official plugin bundle for ZiPlayer. It ships a set of ready‑to‑use source plugins you can register on your `PlayerManager`:
|
|
6
|
+
|
|
7
|
+
- YouTubePlugin: search + stream YouTube videos and playlists
|
|
8
|
+
- SoundCloudPlugin: search + stream SoundCloud tracks and sets
|
|
9
|
+
- SpotifyPlugin: resolve tracks/albums/playlists, stream via fallbacks
|
|
10
|
+
- TTSPlugin: Text‑to‑Speech playback from simple `tts:` queries
|
|
11
|
+
|
|
12
|
+
ZiPlayer is an audio player built on top of `@discordjs/voice` and `discord.js`. This package provides sources; the core player
|
|
13
|
+
lives in `ziplayer`.
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @ziplayer/plugin ziplayer @discordjs/voice discord.js
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The TTS plugin uses a lightweight Google TTS wrapper and HTTP fetches:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install @zibot/zitts axios
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { PlayerManager } from "ziplayer";
|
|
31
|
+
import { YouTubePlugin, SoundCloudPlugin, SpotifyPlugin, TTSPlugin } from "@ziplayer/plugin";
|
|
32
|
+
|
|
33
|
+
const manager = new PlayerManager({
|
|
34
|
+
plugins: [
|
|
35
|
+
// Order matters: put more specific handlers first (e.g., TTS)
|
|
36
|
+
new TTSPlugin({ defaultLang: "en" }),
|
|
37
|
+
new YouTubePlugin(),
|
|
38
|
+
new SoundCloudPlugin(),
|
|
39
|
+
new SpotifyPlugin(),
|
|
40
|
+
],
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Create and connect a player (discord.js VoiceChannel instance)
|
|
44
|
+
const player = manager.create(guildId, { userdata: { channel: textChannel } });
|
|
45
|
+
await player.connect(voiceChannel);
|
|
46
|
+
|
|
47
|
+
// Search & play
|
|
48
|
+
await player.play("never gonna give you up", requestedBy);
|
|
49
|
+
|
|
50
|
+
// Play a playlist URL directly
|
|
51
|
+
await player.play("https://www.youtube.com/playlist?list=...", requestedBy);
|
|
52
|
+
|
|
53
|
+
// Speak with TTS
|
|
54
|
+
await player.play("tts:en:Hello there!", requestedBy);
|
|
55
|
+
|
|
56
|
+
// Handle events via the manager
|
|
57
|
+
manager.on("trackStart", (plr, track) => {
|
|
58
|
+
plr.userdata?.channel?.send?.(`Now playing: ${track.title}`);
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Included Plugins
|
|
63
|
+
|
|
64
|
+
### YouTubePlugin
|
|
65
|
+
|
|
66
|
+
- Resolves YouTube videos and playlists.
|
|
67
|
+
- Uses `youtubei.js` under the hood.
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
import { YouTubePlugin } from "@ziplayer/plugin";
|
|
71
|
+
const youtube = new YouTubePlugin();
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### SoundCloudPlugin
|
|
75
|
+
|
|
76
|
+
- Resolves tracks and sets. You may further tune streaming by combining with other plugins that provide fallbacks.
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
import { SoundCloudPlugin } from "@ziplayer/plugin";
|
|
80
|
+
const sc = new SoundCloudPlugin();
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### SpotifyPlugin
|
|
84
|
+
|
|
85
|
+
- Resolves track/album/playlist metadata from Spotify.
|
|
86
|
+
- Streaming typically uses fallback sources (e.g., YouTube) discovered by your plugin set.
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
import { SpotifyPlugin } from "@ziplayer/plugin";
|
|
90
|
+
const sp = new SpotifyPlugin();
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### TTSPlugin (Text‑to‑Speech)
|
|
94
|
+
|
|
95
|
+
- Plays spoken audio from text using a lightweight Google TTS wrapper.
|
|
96
|
+
- Supported query formats:
|
|
97
|
+
- `tts: <text>`
|
|
98
|
+
- `tts:<lang>:<text>` (e.g., `tts:vi:xin chao`)
|
|
99
|
+
- `tts:<lang>:1:<text>` (set `slow = true`, `0` = normal)
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
import { TTSPlugin } from "@ziplayer/plugin";
|
|
103
|
+
const tts = new TTSPlugin({ defaultLang: "en", slow: false });
|
|
104
|
+
await player.play("tts:en:1:good morning", requestedBy);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Note: Please comply with the service’s terms and provide your own quotas. The wrapper is intended for lightweight usage and may
|
|
108
|
+
change without notice.
|
|
109
|
+
|
|
110
|
+
Advanced: custom TTS provider
|
|
111
|
+
|
|
112
|
+
You can override audio generation by passing a `createStream` function. It receives the text and context and can return a Node
|
|
113
|
+
`Readable`, an HTTP(S) URL string, or a `Buffer`.
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
const tts = new TTSPlugin({
|
|
117
|
+
defaultLang: "vi",
|
|
118
|
+
async createStream(text, ctx) {
|
|
119
|
+
// Example: integrate with Azure, CAMB.AI, etc.
|
|
120
|
+
// Return a URL and the plugin will stream it
|
|
121
|
+
const url = await myTTSService(text, { lang: ctx?.lang, slow: ctx?.slow });
|
|
122
|
+
return url; // or Readable / Buffer
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Writing Your Own Plugin
|
|
128
|
+
|
|
129
|
+
Plugins implement the `BasePlugin` contract from `ziplayer`:
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
import { BasePlugin, Track, SearchResult, StreamInfo } from "ziplayer";
|
|
133
|
+
|
|
134
|
+
export class MyPlugin extends BasePlugin {
|
|
135
|
+
name = "myplugin";
|
|
136
|
+
version = "1.0.0";
|
|
137
|
+
|
|
138
|
+
canHandle(query: string): boolean {
|
|
139
|
+
// Return true if this plugin can handle a given query/URL
|
|
140
|
+
return query.includes("mysite.com");
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async search(query: string, requestedBy: string): Promise<SearchResult> {
|
|
144
|
+
// Return one or more tracks for the query
|
|
145
|
+
return {
|
|
146
|
+
tracks: [
|
|
147
|
+
{
|
|
148
|
+
id: "abc",
|
|
149
|
+
title: "My Track",
|
|
150
|
+
url: "https://mysite.com/track/abc",
|
|
151
|
+
duration: 180,
|
|
152
|
+
requestedBy,
|
|
153
|
+
source: this.name,
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async getStream(track: Track): Promise<StreamInfo> {
|
|
160
|
+
// Return a Node Readable stream and an input type
|
|
161
|
+
return { stream, type: "arbitrary" };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Tips
|
|
167
|
+
|
|
168
|
+
- Keep network calls bounded; ZiPlayer applies timeouts to extractor operations.
|
|
169
|
+
- For sources that require indirection (like Spotify), consider a `getFallback` strategy via other plugins.
|
|
170
|
+
- Use `track.metadata` for any source‑specific fields you want to carry along.
|
|
171
|
+
|
|
172
|
+
## Requirements
|
|
173
|
+
|
|
174
|
+
- Node.js 18+
|
|
175
|
+
- `discord.js` 14 and `@discordjs/voice` 0.19+
|
|
176
|
+
- For TTS: `@zibot/zitts` and `axios`
|
|
177
|
+
|
|
178
|
+
## License
|
|
179
|
+
|
|
180
|
+
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoundCloudPlugin.d.ts","sourceRoot":"","sources":["../src/SoundCloudPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAgBvE,qBAAa,gBAAiB,SAAQ,UAAU;IAC/C,IAAI,SAAgB;IACpB,OAAO,SAAW;IAClB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,KAAK,CAAgB;;YAOf,IAAI;IAKlB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"SoundCloudPlugin.d.ts","sourceRoot":"","sources":["../src/SoundCloudPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAgBvE,qBAAa,gBAAiB,SAAQ,UAAU;IAC/C,IAAI,SAAgB;IACpB,OAAO,SAAW;IAClB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,KAAK,CAAgB;;YAOf,IAAI;IAKlB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAgBjC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAgFjE,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;IAmB5C,gBAAgB,CACrB,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAA;KAAO,GAC/D,OAAO,CAAC,KAAK,EAAE,CAAC;IAiCb,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;IAS9C,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;CAsBzE"}
|
package/dist/SoundCloudPlugin.js
CHANGED
|
@@ -4,7 +4,7 @@ exports.SoundCloudPlugin = void 0;
|
|
|
4
4
|
const ziplayer_1 = require("ziplayer");
|
|
5
5
|
const SoundCloud = require("@zibot/scdl");
|
|
6
6
|
const url_1 = require("url");
|
|
7
|
-
const ALLOWED_SOUNDCLOUD_HOSTS = ["soundcloud.com", "www.soundcloud.com"];
|
|
7
|
+
const ALLOWED_SOUNDCLOUD_HOSTS = ["soundcloud.com", "www.soundcloud.com", "m.soundcloud.com"];
|
|
8
8
|
function isValidSoundCloudHost(maybeUrl) {
|
|
9
9
|
try {
|
|
10
10
|
const parsed = new url_1.URL(maybeUrl);
|
|
@@ -28,24 +28,35 @@ class SoundCloudPlugin extends ziplayer_1.BasePlugin {
|
|
|
28
28
|
}
|
|
29
29
|
canHandle(query) {
|
|
30
30
|
const q = (query || "").trim().toLowerCase();
|
|
31
|
-
|
|
32
|
-
if (
|
|
31
|
+
const isUrl = q.startsWith("http://") || q.startsWith("https://");
|
|
32
|
+
if (isUrl) {
|
|
33
33
|
return isValidSoundCloudHost(query);
|
|
34
34
|
}
|
|
35
|
-
// Avoid intercepting explicit patterns for other extractors
|
|
35
|
+
// Avoid intercepting explicit patterns for other extractors
|
|
36
36
|
if (q.startsWith("tts:") || q.startsWith("say "))
|
|
37
37
|
return false;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
if (q.startsWith("spotify:") || q.includes("open.spotify.com"))
|
|
39
|
+
return false;
|
|
40
|
+
if (q.includes("youtube"))
|
|
41
|
+
return false;
|
|
42
|
+
// Treat remaining non-URL free text as searchable
|
|
43
|
+
return true;
|
|
43
44
|
}
|
|
44
45
|
validate(url) {
|
|
45
46
|
return isValidSoundCloudHost(url);
|
|
46
47
|
}
|
|
47
48
|
async search(query, requestedBy) {
|
|
48
49
|
await this.ready;
|
|
50
|
+
// If the query is a URL but not a SoundCloud URL, do not handle it here
|
|
51
|
+
// This prevents hijacking e.g. YouTube/Spotify links as free-text searches.
|
|
52
|
+
try {
|
|
53
|
+
const q = (query || "").trim().toLowerCase();
|
|
54
|
+
const isUrl = q.startsWith("http://") || q.startsWith("https://");
|
|
55
|
+
if (isUrl && !this.validate(query)) {
|
|
56
|
+
return { tracks: [] };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch { }
|
|
49
60
|
try {
|
|
50
61
|
if (isValidSoundCloudHost(query)) {
|
|
51
62
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoundCloudPlugin.js","sourceRoot":"","sources":["../src/SoundCloudPlugin.ts"],"names":[],"mappings":";;;AAAA,uCAAuE;AAEvE,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC1C,6BAA0B;AAE1B,MAAM,wBAAwB,GAAG,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"SoundCloudPlugin.js","sourceRoot":"","sources":["../src/SoundCloudPlugin.ts"],"names":[],"mappings":"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"}
|
package/dist/TTSPlugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TTSPlugin.d.ts","sourceRoot":"","sources":["../src/TTSPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,WAAW,gBAAgB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,KAElD,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC,GACpE,QAAQ,GACR,MAAM,GACN,GAAG,GACH,MAAM,GACN,UAAU,GACV,WAAW,CAAC;CACf;AAQD,qBAAa,SAAU,SAAQ,UAAU;IACxC,IAAI,SAAS;IACb,OAAO,SAAW;IAClB,OAAO,CAAC,IAAI,CAA0F;gBAE1F,IAAI,CAAC,EAAE,gBAAgB;IASnC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAM3B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBjE,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"TTSPlugin.d.ts","sourceRoot":"","sources":["../src/TTSPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,WAAW,gBAAgB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,KAElD,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC,GACpE,QAAQ,GACR,MAAM,GACN,GAAG,GACH,MAAM,GACN,UAAU,GACV,WAAW,CAAC;CACf;AAQD,qBAAa,SAAU,SAAQ,UAAU;IACxC,IAAI,SAAS;IACb,OAAO,SAAW;IAClB,OAAO,CAAC,IAAI,CAA0F;gBAE1F,IAAI,CAAC,EAAE,gBAAgB;IASnC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAM3B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBjE,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;YAsEpC,UAAU;IAgBxB,OAAO,CAAC,UAAU;IAiDlB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;CAYrB"}
|
package/dist/TTSPlugin.js
CHANGED
|
@@ -82,7 +82,10 @@ class TTSPlugin extends ziplayer_1.BasePlugin {
|
|
|
82
82
|
const urlStr = o.url.toString();
|
|
83
83
|
try {
|
|
84
84
|
type =
|
|
85
|
-
normType(o.type) ||
|
|
85
|
+
normType(o.type) ||
|
|
86
|
+
(urlStr.endsWith(".webm") ? "webm/opus"
|
|
87
|
+
: urlStr.endsWith(".ogg") ? "ogg/opus"
|
|
88
|
+
: undefined);
|
|
86
89
|
const res = await axios_1.default.get(urlStr, { responseType: "stream" });
|
|
87
90
|
stream = res.data;
|
|
88
91
|
metadata = o.metadata;
|
package/dist/TTSPlugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TTSPlugin.js","sourceRoot":"","sources":["../src/TTSPlugin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TTSPlugin.js","sourceRoot":"","sources":["../src/TTSPlugin.ts"],"names":[],"mappings":";;;;;;AAAA,uCAAuE;AACvE,mCAAkC;AAClC,wCAA0C;AAC1C,kDAA0B;AAmC1B,MAAa,SAAU,SAAQ,qBAAU;IAKxC,YAAY,IAAuB;QAClC,KAAK,EAAE,CAAC;QALT,SAAI,GAAG,KAAK,CAAC;QACb,YAAO,GAAG,OAAO,CAAC;QAKjB,IAAI,CAAC,IAAI,GAAG;YACX,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,IAAI;YACtC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI;YAClB,YAAY,EAAE,IAAI,EAAE,YAAY;SAChC,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa;QACtB,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,WAAmB;QAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,MAAM,GAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,QAAQ,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzG,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhF,MAAM,KAAK,GAAU;YACpB,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACjE,KAAK;YACL,GAAG;YACH,QAAQ,EAAE,gBAAgB;YAC1B,WAAW;YACX,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;SACzB,CAAC;QAEF,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAY;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAEtC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YAC5E,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9F,IAAI,IAAoC,CAAC;YACzC,IAAI,QAAyC,CAAC;YAC9C,IAAI,MAAM,GAAoB,IAAI,CAAC;YAEnC,MAAM,QAAQ,GAAG,CAAC,CAAO,EAAkC,EAAE;gBAC5D,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,OAAO,SAAS,CAAC;gBAClD,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAAE,OAAO,WAAW,CAAC;gBACjE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAAE,OAAO,UAAU,CAAC;gBAC/D,OAAO,SAAS,CAAC;YAClB,CAAC,CAAC;YAEF,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACpC,yFAAyF;gBACzF,IACC,GAAG,YAAY,iBAAQ;oBACvB,GAAG,YAAY,MAAM;oBACrB,GAAG,YAAY,UAAU;oBACzB,GAAG,YAAY,WAAW;oBAC1B,GAAG,YAAY,GAAG,EACjB,CAAC;oBACF,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAU,CAAC,CAAC;gBAC5C,CAAC;qBAAM,IAAK,GAAW,CAAC,MAAM,EAAE,CAAC;oBAChC,MAAM,CAAC,GAAG,GAAU,CAAC;oBACrB,MAAM,GAAG,CAAC,CAAC,MAAkB,CAAC;oBAC9B,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACxB,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;gBACvB,CAAC;qBAAM,IAAK,GAAW,CAAC,GAAG,EAAE,CAAC;oBAC7B,MAAM,CAAC,GAAG,GAAU,CAAC;oBACrB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;oBAChC,IAAI,CAAC;wBACJ,IAAI;4BACH,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;gCAChB,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW;oCACvC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU;wCACtC,CAAC,CAAC,SAAS,CAAC,CAAC;wBACd,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;wBAChE,MAAM,GAAG,GAAG,CAAC,IAA2B,CAAC;wBACzC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;oBACvB,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACZ,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;oBACzD,CAAC;gBACF,CAAC;YACF,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAU,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,WAAW,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QACrG,CAAC;QAED,MAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAK,CAAC,GAAG,CAAc,CAAC,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5G,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,iBAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACvC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;IACzE,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,GAAgE;QACxF,IAAI,GAAG,YAAY,iBAAQ;YAAE,OAAO,GAAG,CAAC;QACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACtD,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC7D,OAAO,GAAG,CAAC,IAA2B,CAAC;YACxC,CAAC;YACD,OAAO,iBAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,GAAG,YAAY,MAAM;YAAE,OAAO,iBAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,IAAI,GAAG,YAAY,UAAU;YAAE,OAAO,iBAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,GAAG,YAAY,WAAW;YAAE,OAAO,iBAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC9D,CAAC;IAEO,UAAU,CAAC,KAAa;QAC/B,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEvE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAE1B,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,aAAa;YACb,4CAA4C;YAC5C,wBAAwB;YACxB,8DAA8D;YAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;gBACrB,IAAI,GAAG,IAAI,CAAC;YACb,CAAC;iBAAM,CAAC;gBACP,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC3B,IAAI,GAAG,SAAS,CAAC;oBACjB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACpC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;wBACtB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;wBAChE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACnD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;4BACrD,IAAI,GAAG,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,MAAM,CAAC;4BACjD,IAAI,GAAG,SAAS,CAAC;wBAClB,CAAC;6BAAM,CAAC;4BACP,IAAI,GAAG,IAAI,CAAC;wBACb,CAAC;oBACF,CAAC;yBAAM,CAAC;wBACP,IAAI,GAAG,IAAI,CAAC;oBACb,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,IAAI,GAAG,IAAI,CAAC;gBACb,CAAC;YACF,CAAC;QACF,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAEO,YAAY,CAAC,GAAc;QAClC,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,OAAO,SAAS,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEO,aAAa,CAAC,KAAY;QACjC,MAAM,IAAI,GAAI,KAAK,CAAC,QAAgB,EAAE,GAA4B,CAAC;QACnE,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;YACpD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvF,CAAC;IACF,CAAC;CACD;AAnMD,8BAmMC"}
|
package/dist/YouTubePlugin.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export declare class YouTubePlugin extends BasePlugin {
|
|
|
7
7
|
private ready;
|
|
8
8
|
constructor();
|
|
9
9
|
private init;
|
|
10
|
+
private buildTrack;
|
|
10
11
|
canHandle(query: string): boolean;
|
|
11
12
|
validate(url: string): boolean;
|
|
12
13
|
search(query: string, requestedBy: string): Promise<SearchResult>;
|
|
@@ -19,6 +20,7 @@ export declare class YouTubePlugin extends BasePlugin {
|
|
|
19
20
|
}): Promise<Track[]>;
|
|
20
21
|
getFallback(track: Track): Promise<StreamInfo>;
|
|
21
22
|
private extractVideoId;
|
|
23
|
+
private isMixListId;
|
|
22
24
|
private extractListId;
|
|
23
25
|
}
|
|
24
26
|
//# sourceMappingURL=YouTubePlugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YouTubePlugin.d.ts","sourceRoot":"","sources":["../src/YouTubePlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIvE,qBAAa,aAAc,SAAQ,UAAU;IAC5C,IAAI,SAAa;IACjB,OAAO,SAAW;IAElB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,KAAK,CAAgB;;YAOf,IAAI;
|
|
1
|
+
{"version":3,"file":"YouTubePlugin.d.ts","sourceRoot":"","sources":["../src/YouTubePlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIvE,qBAAa,aAAc,SAAQ,UAAU;IAC5C,IAAI,SAAa;IACjB,OAAO,SAAW;IAElB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,KAAK,CAAgB;;YAOf,IAAI;IAelB,OAAO,CAAC,UAAU;IA0ElB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAsBjC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAUxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkEjE,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IA+BnE,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;IA8D5C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAA;KAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAoBvH,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;IAWpD,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;CAQrB"}
|
package/dist/YouTubePlugin.js
CHANGED
|
@@ -22,6 +22,33 @@ class YouTubePlugin extends ziplayer_1.BasePlugin {
|
|
|
22
22
|
});
|
|
23
23
|
youtubei_js_1.Log.setLevel(0);
|
|
24
24
|
}
|
|
25
|
+
// Build a Track from various YouTube object shapes (search item, playlist item, watch_next feed, basic_info, info)
|
|
26
|
+
buildTrack(raw, requestedBy, extra) {
|
|
27
|
+
const pickFirst = (...vals) => vals.find((v) => v !== undefined && v !== null && v !== "");
|
|
28
|
+
// Try to resolve from multiple common shapes
|
|
29
|
+
const id = pickFirst(raw?.id, raw?.video_id, raw?.videoId, raw?.content_id, raw?.identifier, raw?.basic_info?.id, raw?.basic_info?.video_id, raw?.basic_info?.videoId, raw?.basic_info?.content_id);
|
|
30
|
+
const title = pickFirst(raw?.metadata?.title?.text, raw?.title?.text, raw?.title, raw?.headline, raw?.basic_info?.title, "Unknown title");
|
|
31
|
+
const durationValue = pickFirst(raw?.length_seconds, raw?.duration?.seconds, raw?.duration?.text, raw?.duration, raw?.length_text, raw?.basic_info?.duration);
|
|
32
|
+
const duration = Number(toSeconds(durationValue)) || 0;
|
|
33
|
+
const thumb = pickFirst(raw?.thumbnails?.[0]?.url, raw?.thumbnail?.[0]?.url, raw?.thumbnail?.url, raw?.thumbnail?.thumbnails?.[0]?.url, raw?.content_image?.image?.[0]?.url, raw?.basic_info?.thumbnail?.[0]?.url, raw?.basic_info?.thumbnail?.[raw?.basic_info?.thumbnail?.length - 1]?.url, raw?.thumbnails?.[raw?.thumbnails?.length - 1]?.url);
|
|
34
|
+
const author = pickFirst(raw?.author?.name, raw?.author, raw?.channel?.name, raw?.owner?.name, raw?.basic_info?.author);
|
|
35
|
+
const views = pickFirst(raw?.view_count, raw?.views, raw?.short_view_count, raw?.stats?.view_count, raw?.basic_info?.view_count);
|
|
36
|
+
const url = pickFirst(raw?.url, id ? `https://www.youtube.com/watch?v=${id}` : undefined);
|
|
37
|
+
return {
|
|
38
|
+
id: String(id),
|
|
39
|
+
title: String(title),
|
|
40
|
+
url: String(url),
|
|
41
|
+
duration,
|
|
42
|
+
thumbnail: thumb,
|
|
43
|
+
requestedBy,
|
|
44
|
+
source: this.name,
|
|
45
|
+
metadata: {
|
|
46
|
+
author,
|
|
47
|
+
views,
|
|
48
|
+
...(extra?.playlist ? { playlist: extra.playlist } : {}),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
25
52
|
canHandle(query) {
|
|
26
53
|
const q = (query || "").trim().toLowerCase();
|
|
27
54
|
const isUrl = q.startsWith("http://") || q.startsWith("https://");
|
|
@@ -48,7 +75,7 @@ class YouTubePlugin extends ziplayer_1.BasePlugin {
|
|
|
48
75
|
validate(url) {
|
|
49
76
|
try {
|
|
50
77
|
const parsed = new URL(url);
|
|
51
|
-
const allowedHosts = ["youtube.com", "www.youtube.com", "music.youtube.com", "youtu.be", "www.youtu.be"];
|
|
78
|
+
const allowedHosts = ["youtube.com", "www.youtube.com", "music.youtube.com", "youtu.be", "www.youtu.be", "m.youtube.com"];
|
|
52
79
|
return allowedHosts.includes(parsed.hostname.toLowerCase());
|
|
53
80
|
}
|
|
54
81
|
catch (e) {
|
|
@@ -60,27 +87,32 @@ class YouTubePlugin extends ziplayer_1.BasePlugin {
|
|
|
60
87
|
if (this.validate(query)) {
|
|
61
88
|
const listId = this.extractListId(query);
|
|
62
89
|
if (listId) {
|
|
90
|
+
if (this.isMixListId(listId)) {
|
|
91
|
+
const anchorVideoId = this.extractVideoId(query);
|
|
92
|
+
if (anchorVideoId) {
|
|
93
|
+
try {
|
|
94
|
+
const info = await this.searchClient.getInfo(anchorVideoId);
|
|
95
|
+
const feed = info?.watch_next_feed || [];
|
|
96
|
+
const tracks = feed
|
|
97
|
+
.filter((tr) => tr?.content_type === "VIDEO")
|
|
98
|
+
.map((v) => this.buildTrack(v, requestedBy, { playlist: listId }));
|
|
99
|
+
const { basic_info } = info;
|
|
100
|
+
const currTrack = this.buildTrack(basic_info, requestedBy);
|
|
101
|
+
tracks.unshift(currTrack);
|
|
102
|
+
return {
|
|
103
|
+
tracks,
|
|
104
|
+
playlist: { name: "YouTube Mix", url: query, thumbnail: tracks[0]?.thumbnail },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// ignore and fall back to normal playlist handling below
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
63
112
|
try {
|
|
64
|
-
const playlist = await this.
|
|
113
|
+
const playlist = await this.searchClient.getPlaylist(listId);
|
|
65
114
|
const videos = playlist?.videos || playlist?.items || [];
|
|
66
|
-
const tracks = videos.map((v) => {
|
|
67
|
-
const id = v.id || v.video_id || v.videoId;
|
|
68
|
-
const title = v.title?.text ?? v.title;
|
|
69
|
-
const duration = toSeconds(v.duration?.text ?? v.duration);
|
|
70
|
-
const thumb = v.thumbnails?.[0]?.url || v.thumbnail?.url;
|
|
71
|
-
const author = v.author?.name ?? v.channel?.name;
|
|
72
|
-
const views = v.view_count ?? v.views;
|
|
73
|
-
return {
|
|
74
|
-
id: String(id),
|
|
75
|
-
title,
|
|
76
|
-
url: `https://www.youtube.com/watch?v=${id}`,
|
|
77
|
-
duration: Number(duration) || 0,
|
|
78
|
-
thumbnail: thumb,
|
|
79
|
-
requestedBy,
|
|
80
|
-
source: this.name,
|
|
81
|
-
metadata: { author, views, playlist: listId },
|
|
82
|
-
};
|
|
83
|
-
});
|
|
115
|
+
const tracks = videos.map((v) => this.buildTrack(v, requestedBy, { playlist: listId }));
|
|
84
116
|
return {
|
|
85
117
|
tracks,
|
|
86
118
|
playlist: {
|
|
@@ -99,20 +131,7 @@ class YouTubePlugin extends ziplayer_1.BasePlugin {
|
|
|
99
131
|
if (!videoId)
|
|
100
132
|
throw new Error("Invalid YouTube URL");
|
|
101
133
|
const info = await this.client.getBasicInfo(videoId);
|
|
102
|
-
const
|
|
103
|
-
const track = {
|
|
104
|
-
id: videoId,
|
|
105
|
-
title: basic.title ?? info.title ?? "Unknown title",
|
|
106
|
-
url: `https://www.youtube.com/watch?v=${videoId}`,
|
|
107
|
-
duration: toSeconds(basic.duration ?? info.duration) ?? 0,
|
|
108
|
-
thumbnail: basic.thumbnail?.[0]?.url || basic.thumbnail?.[basic.thumbnail?.length - 1]?.url || info.thumbnails?.[0]?.url,
|
|
109
|
-
requestedBy,
|
|
110
|
-
source: this.name,
|
|
111
|
-
metadata: {
|
|
112
|
-
author: basic.author ?? info.author?.name,
|
|
113
|
-
views: info.basic_info?.view_count ?? info.view_count,
|
|
114
|
-
},
|
|
115
|
-
};
|
|
134
|
+
const track = this.buildTrack(info, requestedBy);
|
|
116
135
|
return { tracks: [track] };
|
|
117
136
|
}
|
|
118
137
|
// Text search → return up to 10 video tracks
|
|
@@ -120,25 +139,7 @@ class YouTubePlugin extends ziplayer_1.BasePlugin {
|
|
|
120
139
|
type: "video",
|
|
121
140
|
});
|
|
122
141
|
const items = res?.items || res?.videos || res?.results || [];
|
|
123
|
-
const tracks = items.slice(0, 10).map((v) =>
|
|
124
|
-
const id = v.id || v.video_id || v.videoId || v.identifier;
|
|
125
|
-
const title = v.title?.text ?? v.title ?? v.headline ?? "Unknown title";
|
|
126
|
-
const duration = toSeconds(v.duration?.text ?? v.duration?.seconds ?? v.duration ?? v.length_text);
|
|
127
|
-
const thumbnail = v.thumbnails?.[0]?.url || v.thumbnail?.url || v.thumbnail?.thumbnails?.[0]?.url;
|
|
128
|
-
const author = v.author?.name ?? v.channel?.name ?? v.owner?.name;
|
|
129
|
-
const views = v.view_count ?? v.views ?? v.short_view_count ?? v.stats?.view_count;
|
|
130
|
-
const track = {
|
|
131
|
-
id: String(id),
|
|
132
|
-
title,
|
|
133
|
-
url: `https://www.youtube.com/watch?v=${id}`,
|
|
134
|
-
duration: Number(duration) || 0,
|
|
135
|
-
thumbnail,
|
|
136
|
-
requestedBy,
|
|
137
|
-
source: this.name,
|
|
138
|
-
metadata: { author, views },
|
|
139
|
-
};
|
|
140
|
-
return track;
|
|
141
|
-
});
|
|
142
|
+
const tracks = items.slice(0, 10).map((v) => this.buildTrack(v, requestedBy));
|
|
142
143
|
return { tracks };
|
|
143
144
|
}
|
|
144
145
|
async extractPlaylist(url, requestedBy) {
|
|
@@ -147,30 +148,27 @@ class YouTubePlugin extends ziplayer_1.BasePlugin {
|
|
|
147
148
|
if (!listId)
|
|
148
149
|
return [];
|
|
149
150
|
try {
|
|
151
|
+
// Attempt to handle dynamic Mix playlists via watch_next feed
|
|
152
|
+
if (this.isMixListId(listId)) {
|
|
153
|
+
const anchorVideoId = this.extractVideoId(url);
|
|
154
|
+
if (anchorVideoId) {
|
|
155
|
+
try {
|
|
156
|
+
const info = await this.searchClient.getInfo(anchorVideoId);
|
|
157
|
+
const feed = info?.watch_next_feed || [];
|
|
158
|
+
return feed
|
|
159
|
+
.filter((tr) => tr?.content_type === "VIDEO")
|
|
160
|
+
.map((v) => this.buildTrack(v, requestedBy, { playlist: listId }));
|
|
161
|
+
}
|
|
162
|
+
catch { }
|
|
163
|
+
}
|
|
164
|
+
}
|
|
150
165
|
const playlist = await this.client.getPlaylist(listId);
|
|
151
166
|
const videos = playlist?.videos || playlist?.items || [];
|
|
152
167
|
return videos.map((v) => {
|
|
153
|
-
|
|
154
|
-
const title = v.title?.text ?? v.title;
|
|
155
|
-
const duration = toSeconds(v.duration?.text ?? v.duration);
|
|
156
|
-
const thumb = v.thumbnails?.[0]?.url || v.thumbnail?.url;
|
|
157
|
-
const author = v.author?.name ?? v.channel?.name;
|
|
158
|
-
const views = v.view_count ?? v.views;
|
|
159
|
-
const track = {
|
|
160
|
-
id: String(id),
|
|
161
|
-
title,
|
|
162
|
-
url: `https://www.youtube.com/watch?v=${id}`,
|
|
163
|
-
duration: Number(duration) || 0,
|
|
164
|
-
thumbnail: thumb,
|
|
165
|
-
requestedBy,
|
|
166
|
-
source: this.name,
|
|
167
|
-
metadata: { author, views, playlist: listId },
|
|
168
|
-
};
|
|
169
|
-
return track;
|
|
168
|
+
return this.buildTrack(v, requestedBy, { playlist: listId }); //ack;
|
|
170
169
|
});
|
|
171
170
|
}
|
|
172
171
|
catch {
|
|
173
|
-
// If playlist fetch fails, return empty to keep optional contract intact
|
|
174
172
|
return [];
|
|
175
173
|
}
|
|
176
174
|
}
|
|
@@ -235,25 +233,17 @@ class YouTubePlugin extends ziplayer_1.BasePlugin {
|
|
|
235
233
|
async getRelatedTracks(trackURL, opts = {}) {
|
|
236
234
|
await this.ready;
|
|
237
235
|
const videoId = this.extractVideoId(trackURL);
|
|
236
|
+
if (!videoId) {
|
|
237
|
+
// If the last track URL is not a direct video URL (e.g., playlist URL),
|
|
238
|
+
// we cannot fetch related videos reliably.
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
238
241
|
const info = await await this.searchClient.getInfo(videoId);
|
|
239
242
|
const related = info?.watch_next_feed || [];
|
|
240
243
|
const offset = opts.offset ?? 0;
|
|
241
244
|
const limit = opts.limit ?? 5;
|
|
242
|
-
const relatedfilter = related.filter((tr) => !(opts?.history ?? []).some((t) => t.url === tr.url));
|
|
243
|
-
return relatedfilter.slice(offset, offset + limit).map((v) =>
|
|
244
|
-
const id = v.id || v.video_id || v.videoId || v.content_id;
|
|
245
|
-
const videometa = v?.metadata;
|
|
246
|
-
return {
|
|
247
|
-
id: String(id),
|
|
248
|
-
title: videometa.title.text ?? "Unknown title",
|
|
249
|
-
url: `https://www.youtube.com/watch?v=${id}`,
|
|
250
|
-
duration: Number(v.length_seconds || toSeconds(v.duration)) || 0,
|
|
251
|
-
thumbnail: v.thumbnails?.[0]?.url || v.thumbnail?.url || v.content_image?.image?.[0]?.url,
|
|
252
|
-
requestedBy: "auto",
|
|
253
|
-
source: this.name,
|
|
254
|
-
metadata: { author: v.author, views: v.view_count },
|
|
255
|
-
};
|
|
256
|
-
});
|
|
245
|
+
const relatedfilter = related.filter((tr) => tr.content_type === "VIDEO" && !(opts?.history ?? []).some((t) => t.url === tr.url));
|
|
246
|
+
return relatedfilter.slice(offset, offset + limit).map((v) => this.buildTrack(v, "auto"));
|
|
257
247
|
}
|
|
258
248
|
async getFallback(track) {
|
|
259
249
|
try {
|
|
@@ -291,6 +281,10 @@ class YouTubePlugin extends ziplayer_1.BasePlugin {
|
|
|
291
281
|
return null;
|
|
292
282
|
}
|
|
293
283
|
}
|
|
284
|
+
isMixListId(listId) {
|
|
285
|
+
// YouTube dynamic mixes typically start with 'RD'
|
|
286
|
+
return typeof listId === "string" && listId.toUpperCase().startsWith("RD");
|
|
287
|
+
}
|
|
294
288
|
extractListId(input) {
|
|
295
289
|
try {
|
|
296
290
|
const u = new URL(input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YouTubePlugin.js","sourceRoot":"","sources":["../src/YouTubePlugin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"YouTubePlugin.js","sourceRoot":"","sources":["../src/YouTubePlugin.ts"],"names":[],"mappings":";;;AAAA,uCAAuE;AAEvE,6CAA6C;AAE7C,MAAa,aAAc,SAAQ,qBAAU;IAQ5C;QACC,KAAK,EAAE,CAAC;QART,SAAI,GAAG,SAAS,CAAC;QACjB,YAAO,GAAG,OAAO,CAAC;QAQjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,IAAI;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,uBAAS,CAAC,MAAM,CAAC;YACpC,WAAW,EAAE,SAAS;YACtB,eAAe,EAAE,KAAK;SACf,CAAC,CAAC;QAEV,qEAAqE;QACrE,IAAI,CAAC,YAAY,GAAG,MAAM,uBAAS,CAAC,MAAM,CAAC;YAC1C,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;SACf,CAAC,CAAC;QACV,iBAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,mHAAmH;IAC3G,UAAU,CAAC,GAAQ,EAAE,WAAmB,EAAE,KAA6B;QAC9E,MAAM,SAAS,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAElG,6CAA6C;QAC7C,MAAM,EAAE,GAAG,SAAS,CACnB,GAAG,EAAE,EAAE,EACP,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,UAAU,EAAE,EAAE,EACnB,GAAG,EAAE,UAAU,EAAE,QAAQ,EACzB,GAAG,EAAE,UAAU,EAAE,OAAO,EACxB,GAAG,EAAE,UAAU,EAAE,UAAU,CAC3B,CAAC;QAEF,MAAM,KAAK,GAAG,SAAS,CACtB,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAC1B,GAAG,EAAE,KAAK,EAAE,IAAI,EAChB,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,UAAU,EAAE,KAAK,EACtB,eAAe,CACf,CAAC;QAEF,MAAM,aAAa,GAAG,SAAS,CAC9B,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,QAAQ,EAAE,OAAO,EACtB,GAAG,EAAE,QAAQ,EAAE,IAAI,EACnB,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,UAAU,EAAE,QAAQ,CACzB,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC;QAEvD,MAAM,KAAK,GAAG,SAAS,CACtB,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EACzB,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EACxB,GAAG,EAAE,SAAS,EAAE,GAAG,EACnB,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EACpC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EACnC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EACpC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,EACzE,GAAG,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,CACnD,CAAC;QAEF,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAExH,MAAM,KAAK,GAAG,SAAS,CACtB,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,KAAK,EAAE,UAAU,EACtB,GAAG,EAAE,UAAU,EAAE,UAAU,CAC3B,CAAC;QAEF,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE1F,OAAO;YACN,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YACd,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;YACpB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;YAChB,QAAQ;YACR,SAAS,EAAE,KAAK;YAChB,WAAW;YACX,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,QAAQ,EAAE;gBACT,MAAM;gBACN,KAAK;gBACL,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD;SACQ,CAAC;IACZ,CAAC;IAED,SAAS,CAAC,KAAa;QACtB,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE,CAAC;YACX,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC9B,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;gBACzG,OAAO,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/D,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7E,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,0DAA0D;QAC1D,OAAO,IAAI,CAAC;IACb,CAAC;IAED,QAAQ,CAAC,GAAW;QACnB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;YAC1H,OAAO,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,WAAmB;QAC9C,MAAM,IAAI,CAAC,KAAK,CAAC;QAEjB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBACZ,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;oBACjD,IAAI,aAAa,EAAE,CAAC;wBACnB,IAAI,CAAC;4BACJ,MAAM,IAAI,GAAQ,MAAO,IAAI,CAAC,YAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;4BAC1E,MAAM,IAAI,GAAU,IAAI,EAAE,eAAe,IAAI,EAAE,CAAC;4BAChD,MAAM,MAAM,GAAY,IAAI;iCAC1B,MAAM,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,OAAO,CAAC;iCACjD,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;4BACzE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;4BAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;4BAC3D,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;4BAC1B,OAAO;gCACN,MAAM;gCACN,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE;6BAC9E,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACR,yDAAyD;wBAC1D,CAAC;oBACF,CAAC;gBACF,CAAC;gBACD,IAAI,CAAC;oBACJ,MAAM,QAAQ,GAAQ,MAAO,IAAI,CAAC,YAAoB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAC3E,MAAM,MAAM,GAAU,QAAQ,EAAE,MAAM,IAAI,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;oBAChE,MAAM,MAAM,GAAY,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;oBAEtG,OAAO;wBACN,MAAM;wBACN,QAAQ,EAAE;4BACT,IAAI,EAAE,QAAQ,EAAE,KAAK,IAAI,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,YAAY,MAAM,EAAE;4BAC1E,GAAG,EAAE,KAAK;4BACV,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,QAAQ,EAAE,SAAS,EAAE,GAAG;yBACrE;qBACD,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACR,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC7E,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACpD,CAAC;YACF,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAErD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACjD,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,CAAC;QAED,6CAA6C;QAC7C,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE;YACtD,IAAI,EAAE,OAAc;SACpB,CAAC,CAAC;QACH,MAAM,KAAK,GAAU,GAAG,EAAE,KAAK,IAAI,GAAG,EAAE,MAAM,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC;QAErE,MAAM,MAAM,GAAY,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;QAE5F,OAAO,EAAE,MAAM,EAAE,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAW,EAAE,WAAmB;QACrD,MAAM,IAAI,CAAC,KAAK,CAAC;QAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEvB,IAAI,CAAC;YACJ,8DAA8D;YAC9D,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;gBAC/C,IAAI,aAAa,EAAE,CAAC;oBACnB,IAAI,CAAC;wBACJ,MAAM,IAAI,GAAQ,MAAO,IAAI,CAAC,YAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;wBAC1E,MAAM,IAAI,GAAU,IAAI,EAAE,eAAe,IAAI,EAAE,CAAC;wBAChD,OAAO,IAAI;6BACT,MAAM,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,OAAO,CAAC;6BACjD,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC1E,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACX,CAAC;YACF,CAAC;YAED,MAAM,QAAQ,GAAQ,MAAO,IAAI,CAAC,MAAc,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACrE,MAAM,MAAM,GAAU,QAAQ,EAAE,MAAM,IAAI,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;gBAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;YACrE,CAAC,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAY;QAC3B,MAAM,IAAI,CAAC,KAAK,CAAC;QAEjB,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAEtD,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAE7C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAQ,MAAO,IAAI,CAAC,MAAc,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAC3D,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,MAAM;aACf,CAAC,CAAC;YACH,OAAO;gBACN,MAAM;gBACN,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACxB,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACjB,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAQ,MAAO,IAAI,CAAC,MAAc,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAE9D,sCAAsC;gBACtC,IAAI,MAAM,GAAQ,IAAI,EAAE,YAAY,EAAE,CAAC;oBACtC,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,MAAM;iBACf,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;oBACtC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;oBAClF,SAAS,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;oBACxE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBACvB,CAAC;gBAED,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAE1D,IAAI,GAAG,GAAuB,SAAS,CAAC;gBACxC,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;oBAC3C,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAE,IAAI,CAAC,MAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC5D,CAAC;gBACD,IAAI,CAAC,GAAG;oBAAE,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;gBAE3B,IAAI,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBACtD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBAE7B,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;gBACvC,CAAC;gBAED,OAAO;oBACN,MAAM,EAAE,GAAG,CAAC,IAAW;oBACvB,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE;wBACT,GAAG,KAAK,CAAC,QAAQ;wBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,IAAI,EAAE,MAAM,CAAC,SAAS;qBACtB;iBACD,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;YAC7E,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,OAA+D,EAAE;QACzG,MAAM,IAAI,CAAC,KAAK,CAAC;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,wEAAwE;YACxE,2CAA2C;YAC3C,OAAO,EAAE,CAAC;QACX,CAAC;QACD,MAAM,IAAI,GAAQ,MAAM,MAAO,IAAI,CAAC,YAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAU,IAAI,EAAE,eAAe,IAAI,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAE9B,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CACnC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAChG,CAAC;QAEF,OAAO,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAChG,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAY;QAC7B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACvD,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;IACF,CAAC;IAEO,cAAc,CAAC,KAAa;QACnC,IAAI,CAAC;YACJ,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,MAAM,iBAAiB,GAAG,CAAC,UAAU,CAAC,CAAC;YACvC,MAAM,gBAAgB,GAAG,CAAC,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,CAAC,CAAC;YAClG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5C,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACzD,CAAC;YACD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,4BAA4B;gBAC5B,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,OAAO,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC;gBACxB,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;oBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACrE,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;oBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAEO,WAAW,CAAC,MAAc;QACjC,kDAAkD;QAClD,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAEO,aAAa,CAAC,KAAa;QAClC,IAAI,CAAC;YACJ,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;CACD;AAtWD,sCAsWC;AACD,SAAS,SAAS,CAAC,CAAM;IACxB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC3B,oBAAoB;QACpB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,OAAQ,CAAS,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAQ,CAAS,CAAC,OAAO,CAAC;QACtE,IAAI,OAAQ,CAAS,CAAC,YAAY,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,KAAK,CAAE,CAAS,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ziplayer/plugin",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "A modular Discord voice player with plugin system",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ZiPlayer",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"player",
|
|
11
11
|
"voice"
|
|
12
12
|
],
|
|
13
|
-
"homepage": "https://
|
|
13
|
+
"homepage": "https://player.ziji.world",
|
|
14
14
|
"bugs": {
|
|
15
15
|
"url": "https://github.com/ZiProject/ZiPlayer/issues"
|
|
16
16
|
},
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@zibot/scdl": "^0.0.5",
|
|
32
32
|
"@zibot/zitts": "^0.0.3",
|
|
33
|
-
"axios": "^1.
|
|
33
|
+
"axios": "^1.12.2",
|
|
34
34
|
"youtubei.js": "^15.0.1",
|
|
35
|
-
"ziplayer": "^0.0.
|
|
35
|
+
"ziplayer": "^0.0.6"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^20.0.0",
|
package/src/SoundCloudPlugin.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { BasePlugin, Track, SearchResult, StreamInfo } from "ziplayer";
|
|
|
3
3
|
const SoundCloud = require("@zibot/scdl");
|
|
4
4
|
import { URL } from "url";
|
|
5
5
|
|
|
6
|
-
const ALLOWED_SOUNDCLOUD_HOSTS = ["soundcloud.com", "www.soundcloud.com"];
|
|
6
|
+
const ALLOWED_SOUNDCLOUD_HOSTS = ["soundcloud.com", "www.soundcloud.com", "m.soundcloud.com"];
|
|
7
7
|
|
|
8
8
|
function isValidSoundCloudHost(maybeUrl: string): boolean {
|
|
9
9
|
try {
|
|
@@ -32,16 +32,18 @@ export class SoundCloudPlugin extends BasePlugin {
|
|
|
32
32
|
|
|
33
33
|
canHandle(query: string): boolean {
|
|
34
34
|
const q = (query || "").trim().toLowerCase();
|
|
35
|
-
|
|
36
|
-
if (
|
|
35
|
+
const isUrl = q.startsWith("http://") || q.startsWith("https://");
|
|
36
|
+
if (isUrl) {
|
|
37
37
|
return isValidSoundCloudHost(query);
|
|
38
38
|
}
|
|
39
|
-
|
|
39
|
+
|
|
40
|
+
// Avoid intercepting explicit patterns for other extractors
|
|
40
41
|
if (q.startsWith("tts:") || q.startsWith("say ")) return false;
|
|
41
|
-
|
|
42
|
-
if (q.includes("
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
if (q.startsWith("spotify:") || q.includes("open.spotify.com")) return false;
|
|
43
|
+
if (q.includes("youtube")) return false;
|
|
44
|
+
|
|
45
|
+
// Treat remaining non-URL free text as searchable
|
|
46
|
+
return true;
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
validate(url: string): boolean {
|
|
@@ -51,6 +53,16 @@ export class SoundCloudPlugin extends BasePlugin {
|
|
|
51
53
|
async search(query: string, requestedBy: string): Promise<SearchResult> {
|
|
52
54
|
await this.ready;
|
|
53
55
|
|
|
56
|
+
// If the query is a URL but not a SoundCloud URL, do not handle it here
|
|
57
|
+
// This prevents hijacking e.g. YouTube/Spotify links as free-text searches.
|
|
58
|
+
try {
|
|
59
|
+
const q = (query || "").trim().toLowerCase();
|
|
60
|
+
const isUrl = q.startsWith("http://") || q.startsWith("https://");
|
|
61
|
+
if (isUrl && !this.validate(query)) {
|
|
62
|
+
return { tracks: [] };
|
|
63
|
+
}
|
|
64
|
+
} catch {}
|
|
65
|
+
|
|
54
66
|
try {
|
|
55
67
|
if (isValidSoundCloudHost(query)) {
|
|
56
68
|
try {
|
package/src/TTSPlugin.ts
CHANGED
|
@@ -116,7 +116,10 @@ export class TTSPlugin extends BasePlugin {
|
|
|
116
116
|
const urlStr = o.url.toString();
|
|
117
117
|
try {
|
|
118
118
|
type =
|
|
119
|
-
normType(o.type) ||
|
|
119
|
+
normType(o.type) ||
|
|
120
|
+
(urlStr.endsWith(".webm") ? "webm/opus"
|
|
121
|
+
: urlStr.endsWith(".ogg") ? "ogg/opus"
|
|
122
|
+
: undefined);
|
|
120
123
|
const res = await axios.get(urlStr, { responseType: "stream" });
|
|
121
124
|
stream = res.data as unknown as Readable;
|
|
122
125
|
metadata = o.metadata;
|
package/src/YouTubePlugin.ts
CHANGED
|
@@ -29,6 +29,81 @@ export class YouTubePlugin extends BasePlugin {
|
|
|
29
29
|
Log.setLevel(0);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
// Build a Track from various YouTube object shapes (search item, playlist item, watch_next feed, basic_info, info)
|
|
33
|
+
private buildTrack(raw: any, requestedBy: string, extra?: { playlist?: string }): Track {
|
|
34
|
+
const pickFirst = (...vals: any[]) => vals.find((v) => v !== undefined && v !== null && v !== "");
|
|
35
|
+
|
|
36
|
+
// Try to resolve from multiple common shapes
|
|
37
|
+
const id = pickFirst(
|
|
38
|
+
raw?.id,
|
|
39
|
+
raw?.video_id,
|
|
40
|
+
raw?.videoId,
|
|
41
|
+
raw?.content_id,
|
|
42
|
+
raw?.identifier,
|
|
43
|
+
raw?.basic_info?.id,
|
|
44
|
+
raw?.basic_info?.video_id,
|
|
45
|
+
raw?.basic_info?.videoId,
|
|
46
|
+
raw?.basic_info?.content_id,
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const title = pickFirst(
|
|
50
|
+
raw?.metadata?.title?.text,
|
|
51
|
+
raw?.title?.text,
|
|
52
|
+
raw?.title,
|
|
53
|
+
raw?.headline,
|
|
54
|
+
raw?.basic_info?.title,
|
|
55
|
+
"Unknown title",
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
const durationValue = pickFirst(
|
|
59
|
+
raw?.length_seconds,
|
|
60
|
+
raw?.duration?.seconds,
|
|
61
|
+
raw?.duration?.text,
|
|
62
|
+
raw?.duration,
|
|
63
|
+
raw?.length_text,
|
|
64
|
+
raw?.basic_info?.duration,
|
|
65
|
+
);
|
|
66
|
+
const duration = Number(toSeconds(durationValue)) || 0;
|
|
67
|
+
|
|
68
|
+
const thumb = pickFirst(
|
|
69
|
+
raw?.thumbnails?.[0]?.url,
|
|
70
|
+
raw?.thumbnail?.[0]?.url,
|
|
71
|
+
raw?.thumbnail?.url,
|
|
72
|
+
raw?.thumbnail?.thumbnails?.[0]?.url,
|
|
73
|
+
raw?.content_image?.image?.[0]?.url,
|
|
74
|
+
raw?.basic_info?.thumbnail?.[0]?.url,
|
|
75
|
+
raw?.basic_info?.thumbnail?.[raw?.basic_info?.thumbnail?.length - 1]?.url,
|
|
76
|
+
raw?.thumbnails?.[raw?.thumbnails?.length - 1]?.url,
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
const author = pickFirst(raw?.author?.name, raw?.author, raw?.channel?.name, raw?.owner?.name, raw?.basic_info?.author);
|
|
80
|
+
|
|
81
|
+
const views = pickFirst(
|
|
82
|
+
raw?.view_count,
|
|
83
|
+
raw?.views,
|
|
84
|
+
raw?.short_view_count,
|
|
85
|
+
raw?.stats?.view_count,
|
|
86
|
+
raw?.basic_info?.view_count,
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
const url = pickFirst(raw?.url, id ? `https://www.youtube.com/watch?v=${id}` : undefined);
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
id: String(id),
|
|
93
|
+
title: String(title),
|
|
94
|
+
url: String(url),
|
|
95
|
+
duration,
|
|
96
|
+
thumbnail: thumb,
|
|
97
|
+
requestedBy,
|
|
98
|
+
source: this.name,
|
|
99
|
+
metadata: {
|
|
100
|
+
author,
|
|
101
|
+
views,
|
|
102
|
+
...(extra?.playlist ? { playlist: extra.playlist } : {}),
|
|
103
|
+
},
|
|
104
|
+
} as Track;
|
|
105
|
+
}
|
|
106
|
+
|
|
32
107
|
canHandle(query: string): boolean {
|
|
33
108
|
const q = (query || "").trim().toLowerCase();
|
|
34
109
|
const isUrl = q.startsWith("http://") || q.startsWith("https://");
|
|
@@ -54,7 +129,7 @@ export class YouTubePlugin extends BasePlugin {
|
|
|
54
129
|
validate(url: string): boolean {
|
|
55
130
|
try {
|
|
56
131
|
const parsed = new URL(url);
|
|
57
|
-
const allowedHosts = ["youtube.com", "www.youtube.com", "music.youtube.com", "youtu.be", "www.youtu.be"];
|
|
132
|
+
const allowedHosts = ["youtube.com", "www.youtube.com", "music.youtube.com", "youtu.be", "www.youtu.be", "m.youtube.com"];
|
|
58
133
|
return allowedHosts.includes(parsed.hostname.toLowerCase());
|
|
59
134
|
} catch (e) {
|
|
60
135
|
return false;
|
|
@@ -67,29 +142,32 @@ export class YouTubePlugin extends BasePlugin {
|
|
|
67
142
|
if (this.validate(query)) {
|
|
68
143
|
const listId = this.extractListId(query);
|
|
69
144
|
if (listId) {
|
|
145
|
+
if (this.isMixListId(listId)) {
|
|
146
|
+
const anchorVideoId = this.extractVideoId(query);
|
|
147
|
+
if (anchorVideoId) {
|
|
148
|
+
try {
|
|
149
|
+
const info: any = await (this.searchClient as any).getInfo(anchorVideoId);
|
|
150
|
+
const feed: any[] = info?.watch_next_feed || [];
|
|
151
|
+
const tracks: Track[] = feed
|
|
152
|
+
.filter((tr: any) => tr?.content_type === "VIDEO")
|
|
153
|
+
.map((v: any) => this.buildTrack(v, requestedBy, { playlist: listId }));
|
|
154
|
+
const { basic_info } = info;
|
|
155
|
+
|
|
156
|
+
const currTrack = this.buildTrack(basic_info, requestedBy);
|
|
157
|
+
tracks.unshift(currTrack);
|
|
158
|
+
return {
|
|
159
|
+
tracks,
|
|
160
|
+
playlist: { name: "YouTube Mix", url: query, thumbnail: tracks[0]?.thumbnail },
|
|
161
|
+
};
|
|
162
|
+
} catch {
|
|
163
|
+
// ignore and fall back to normal playlist handling below
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
70
167
|
try {
|
|
71
|
-
const playlist: any = await (this.
|
|
168
|
+
const playlist: any = await (this.searchClient as any).getPlaylist(listId);
|
|
72
169
|
const videos: any[] = playlist?.videos || playlist?.items || [];
|
|
73
|
-
|
|
74
|
-
const tracks: Track[] = videos.map((v: any) => {
|
|
75
|
-
const id = v.id || v.video_id || v.videoId;
|
|
76
|
-
const title = v.title?.text ?? v.title;
|
|
77
|
-
const duration = toSeconds(v.duration?.text ?? v.duration);
|
|
78
|
-
const thumb = v.thumbnails?.[0]?.url || v.thumbnail?.url;
|
|
79
|
-
const author = v.author?.name ?? v.channel?.name;
|
|
80
|
-
const views = v.view_count ?? v.views;
|
|
81
|
-
|
|
82
|
-
return {
|
|
83
|
-
id: String(id),
|
|
84
|
-
title,
|
|
85
|
-
url: `https://www.youtube.com/watch?v=${id}`,
|
|
86
|
-
duration: Number(duration) || 0,
|
|
87
|
-
thumbnail: thumb,
|
|
88
|
-
requestedBy,
|
|
89
|
-
source: this.name,
|
|
90
|
-
metadata: { author, views, playlist: listId },
|
|
91
|
-
} as Track;
|
|
92
|
-
});
|
|
170
|
+
const tracks: Track[] = videos.map((v: any) => this.buildTrack(v, requestedBy, { playlist: listId }));
|
|
93
171
|
|
|
94
172
|
return {
|
|
95
173
|
tracks,
|
|
@@ -109,23 +187,7 @@ export class YouTubePlugin extends BasePlugin {
|
|
|
109
187
|
if (!videoId) throw new Error("Invalid YouTube URL");
|
|
110
188
|
|
|
111
189
|
const info = await this.client.getBasicInfo(videoId);
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
const track: Track = {
|
|
115
|
-
id: videoId,
|
|
116
|
-
title: basic.title ?? (info as any).title ?? "Unknown title",
|
|
117
|
-
url: `https://www.youtube.com/watch?v=${videoId}`,
|
|
118
|
-
duration: toSeconds(basic.duration ?? (info as any).duration) ?? 0,
|
|
119
|
-
thumbnail:
|
|
120
|
-
basic.thumbnail?.[0]?.url || basic.thumbnail?.[basic.thumbnail?.length - 1]?.url || (info as any).thumbnails?.[0]?.url,
|
|
121
|
-
requestedBy,
|
|
122
|
-
source: this.name,
|
|
123
|
-
metadata: {
|
|
124
|
-
author: basic.author ?? (info as any).author?.name,
|
|
125
|
-
views: (info as any).basic_info?.view_count ?? (info as any).view_count,
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
|
|
190
|
+
const track = this.buildTrack(info, requestedBy);
|
|
129
191
|
return { tracks: [track] };
|
|
130
192
|
}
|
|
131
193
|
|
|
@@ -135,26 +197,7 @@ export class YouTubePlugin extends BasePlugin {
|
|
|
135
197
|
});
|
|
136
198
|
const items: any[] = res?.items || res?.videos || res?.results || [];
|
|
137
199
|
|
|
138
|
-
const tracks: Track[] = items.slice(0, 10).map((v: any) =>
|
|
139
|
-
const id = v.id || v.video_id || v.videoId || v.identifier;
|
|
140
|
-
const title = v.title?.text ?? v.title ?? v.headline ?? "Unknown title";
|
|
141
|
-
const duration = toSeconds(v.duration?.text ?? v.duration?.seconds ?? v.duration ?? v.length_text);
|
|
142
|
-
const thumbnail = v.thumbnails?.[0]?.url || v.thumbnail?.url || v.thumbnail?.thumbnails?.[0]?.url;
|
|
143
|
-
const author = v.author?.name ?? v.channel?.name ?? v.owner?.name;
|
|
144
|
-
const views = v.view_count ?? v.views ?? v.short_view_count ?? v.stats?.view_count;
|
|
145
|
-
|
|
146
|
-
const track: Track = {
|
|
147
|
-
id: String(id),
|
|
148
|
-
title,
|
|
149
|
-
url: `https://www.youtube.com/watch?v=${id}`,
|
|
150
|
-
duration: Number(duration) || 0,
|
|
151
|
-
thumbnail,
|
|
152
|
-
requestedBy,
|
|
153
|
-
source: this.name,
|
|
154
|
-
metadata: { author, views },
|
|
155
|
-
};
|
|
156
|
-
return track;
|
|
157
|
-
});
|
|
200
|
+
const tracks: Track[] = items.slice(0, 10).map((v: any) => this.buildTrack(v, requestedBy));
|
|
158
201
|
|
|
159
202
|
return { tracks };
|
|
160
203
|
}
|
|
@@ -166,31 +209,26 @@ export class YouTubePlugin extends BasePlugin {
|
|
|
166
209
|
if (!listId) return [];
|
|
167
210
|
|
|
168
211
|
try {
|
|
212
|
+
// Attempt to handle dynamic Mix playlists via watch_next feed
|
|
213
|
+
if (this.isMixListId(listId)) {
|
|
214
|
+
const anchorVideoId = this.extractVideoId(url);
|
|
215
|
+
if (anchorVideoId) {
|
|
216
|
+
try {
|
|
217
|
+
const info: any = await (this.searchClient as any).getInfo(anchorVideoId);
|
|
218
|
+
const feed: any[] = info?.watch_next_feed || [];
|
|
219
|
+
return feed
|
|
220
|
+
.filter((tr: any) => tr?.content_type === "VIDEO")
|
|
221
|
+
.map((v: any) => this.buildTrack(v, requestedBy, { playlist: listId }));
|
|
222
|
+
} catch {}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
169
226
|
const playlist: any = await (this.client as any).getPlaylist(listId);
|
|
170
227
|
const videos: any[] = playlist?.videos || playlist?.items || [];
|
|
171
|
-
|
|
172
228
|
return videos.map((v: any) => {
|
|
173
|
-
|
|
174
|
-
const title = v.title?.text ?? v.title;
|
|
175
|
-
const duration = toSeconds(v.duration?.text ?? v.duration);
|
|
176
|
-
const thumb = v.thumbnails?.[0]?.url || v.thumbnail?.url;
|
|
177
|
-
const author = v.author?.name ?? v.channel?.name;
|
|
178
|
-
const views = v.view_count ?? v.views;
|
|
179
|
-
|
|
180
|
-
const track: Track = {
|
|
181
|
-
id: String(id),
|
|
182
|
-
title,
|
|
183
|
-
url: `https://www.youtube.com/watch?v=${id}`,
|
|
184
|
-
duration: Number(duration) || 0,
|
|
185
|
-
thumbnail: thumb,
|
|
186
|
-
requestedBy,
|
|
187
|
-
source: this.name,
|
|
188
|
-
metadata: { author, views, playlist: listId },
|
|
189
|
-
};
|
|
190
|
-
return track;
|
|
229
|
+
return this.buildTrack(v, requestedBy, { playlist: listId }); //ack;
|
|
191
230
|
});
|
|
192
231
|
} catch {
|
|
193
|
-
// If playlist fetch fails, return empty to keep optional contract intact
|
|
194
232
|
return [];
|
|
195
233
|
}
|
|
196
234
|
}
|
|
@@ -260,27 +298,21 @@ export class YouTubePlugin extends BasePlugin {
|
|
|
260
298
|
async getRelatedTracks(trackURL: string, opts: { limit?: number; offset?: number; history?: Track[] } = {}): Promise<Track[]> {
|
|
261
299
|
await this.ready;
|
|
262
300
|
const videoId = this.extractVideoId(trackURL);
|
|
301
|
+
if (!videoId) {
|
|
302
|
+
// If the last track URL is not a direct video URL (e.g., playlist URL),
|
|
303
|
+
// we cannot fetch related videos reliably.
|
|
304
|
+
return [];
|
|
305
|
+
}
|
|
263
306
|
const info: any = await await (this.searchClient as any).getInfo(videoId);
|
|
264
307
|
const related: any[] = info?.watch_next_feed || [];
|
|
265
308
|
const offset = opts.offset ?? 0;
|
|
266
309
|
const limit = opts.limit ?? 5;
|
|
267
310
|
|
|
268
|
-
const relatedfilter = related.filter(
|
|
311
|
+
const relatedfilter = related.filter(
|
|
312
|
+
(tr: any) => tr.content_type === "VIDEO" && !(opts?.history ?? []).some((t) => t.url === tr.url),
|
|
313
|
+
);
|
|
269
314
|
|
|
270
|
-
return relatedfilter.slice(offset, offset + limit).map((v: any) =>
|
|
271
|
-
const id = v.id || v.video_id || v.videoId || v.content_id;
|
|
272
|
-
const videometa = v?.metadata;
|
|
273
|
-
return {
|
|
274
|
-
id: String(id),
|
|
275
|
-
title: videometa.title.text ?? "Unknown title",
|
|
276
|
-
url: `https://www.youtube.com/watch?v=${id}`,
|
|
277
|
-
duration: Number(v.length_seconds || toSeconds(v.duration)) || 0,
|
|
278
|
-
thumbnail: v.thumbnails?.[0]?.url || v.thumbnail?.url || v.content_image?.image?.[0]?.url,
|
|
279
|
-
requestedBy: "auto",
|
|
280
|
-
source: this.name,
|
|
281
|
-
metadata: { author: v.author, views: v.view_count },
|
|
282
|
-
} as Track;
|
|
283
|
-
});
|
|
315
|
+
return relatedfilter.slice(offset, offset + limit).map((v: any) => this.buildTrack(v, "auto"));
|
|
284
316
|
}
|
|
285
317
|
|
|
286
318
|
async getFallback(track: Track): Promise<StreamInfo> {
|
|
@@ -315,6 +347,11 @@ export class YouTubePlugin extends BasePlugin {
|
|
|
315
347
|
}
|
|
316
348
|
}
|
|
317
349
|
|
|
350
|
+
private isMixListId(listId: string): boolean {
|
|
351
|
+
// YouTube dynamic mixes typically start with 'RD'
|
|
352
|
+
return typeof listId === "string" && listId.toUpperCase().startsWith("RD");
|
|
353
|
+
}
|
|
354
|
+
|
|
318
355
|
private extractListId(input: string): string | null {
|
|
319
356
|
try {
|
|
320
357
|
const u = new URL(input);
|