@ziplayer/plugin 0.1.0 → 0.1.2

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.
@@ -0,0 +1,579 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.YTSRPlugin = void 0;
37
+ const ziplayer_1 = require("ziplayer");
38
+ const youtube_sr_1 = __importStar(require("youtube-sr"));
39
+ /**
40
+ * Plugin YTSR để tìm kiếm nâng cao trên YouTube mà không cần tạo stream.
41
+ *
42
+ * Plugin này cung cấp các tính năng tìm kiếm nâng cao cho YouTube bao gồm:
43
+ * - Tìm kiếm video với nhiều tùy chọn lọc
44
+ * - Tìm kiếm playlist và channel
45
+ * - Hỗ trợ các loại tìm kiếm khác nhau (video, playlist, channel)
46
+ * - Không tạo stream, chỉ trả về metadata
47
+ *
48
+ * @example
49
+ * const ytsrPlugin = new YTSRPlugin();
50
+ *
51
+ * // Tìm kiếm video
52
+ * const videoResult = await ytsrPlugin.search("Never Gonna Give You Up", "user123");
53
+ *
54
+ * // Tìm kiếm playlist
55
+ * const playlistResult = await ytsrPlugin.searchPlaylist("chill music playlist", "user123");
56
+ *
57
+ * // Tìm kiếm channel
58
+ * const channelResult = await ytsrPlugin.searchChannel("PewDiePie", "user123");
59
+ *
60
+ * @since 1.0.0
61
+ */
62
+ class YTSRPlugin extends ziplayer_1.BasePlugin {
63
+ /**
64
+ * Tạo một instance mới của YTSRPlugin.
65
+ *
66
+ * Plugin này không cần khởi tạo bất kỳ client nào vì sử dụng youtube-sr
67
+ * để tìm kiếm thông tin từ YouTube.
68
+ *
69
+ * @example
70
+ * const plugin = new YTSRPlugin();
71
+ * // Plugin sẵn sàng sử dụng ngay lập tức
72
+ */
73
+ constructor() {
74
+ super();
75
+ this.name = "ytsr";
76
+ this.version = "1.0.0";
77
+ }
78
+ /**
79
+ * Xác định xem plugin có thể xử lý query này không.
80
+ *
81
+ * @param query - Query tìm kiếm hoặc URL để kiểm tra
82
+ * @returns `true` nếu plugin có thể xử lý query, `false` nếu không
83
+ *
84
+ * @example
85
+ * plugin.canHandle("Never Gonna Give You Up"); // true
86
+ * plugin.canHandle("https://www.youtube.com/watch?v=dQw4w9WgXcQ"); // true
87
+ * plugin.canHandle("spotify:track:123"); // false
88
+ */
89
+ canHandle(query) {
90
+ const q = (query || "").trim().toLowerCase();
91
+ // Tránh xử lý các pattern rõ ràng cho các extractor khác
92
+ if (q.startsWith("tts:") || q.startsWith("say "))
93
+ return false;
94
+ if (q.startsWith("spotify:") || q.includes("open.spotify.com"))
95
+ return false;
96
+ if (q.includes("soundcloud"))
97
+ return false;
98
+ // Xử lý URL YouTube
99
+ if (q.startsWith("http://") || q.startsWith("https://")) {
100
+ try {
101
+ const parsed = new URL(query);
102
+ const allowedHosts = ["youtube.com", "www.youtube.com", "music.youtube.com", "youtu.be", "www.youtu.be"];
103
+ return allowedHosts.includes(parsed.hostname.toLowerCase());
104
+ }
105
+ catch (e) {
106
+ return false;
107
+ }
108
+ }
109
+ // Xử lý tất cả text khác như tìm kiếm YouTube
110
+ return true;
111
+ }
112
+ /**
113
+ * Xác thực xem URL có phải là URL YouTube hợp lệ không.
114
+ *
115
+ * @param url - URL để xác thực
116
+ * @returns `true` nếu URL hợp lệ, `false` nếu không
117
+ *
118
+ * @example
119
+ * plugin.validate("https://www.youtube.com/watch?v=dQw4w9WgXcQ"); // true
120
+ * plugin.validate("https://youtu.be/dQw4w9WgXcQ"); // true
121
+ * plugin.validate("https://spotify.com/track/123"); // false
122
+ */
123
+ validate(url) {
124
+ try {
125
+ const parsed = new URL(url);
126
+ const allowedHosts = ["youtube.com", "www.youtube.com", "music.youtube.com", "youtu.be", "www.youtu.be", "m.youtube.com"];
127
+ return allowedHosts.includes(parsed.hostname.toLowerCase());
128
+ }
129
+ catch (e) {
130
+ return false;
131
+ }
132
+ }
133
+ /**
134
+ * Tìm kiếm video trên YouTube với các tùy chọn nâng cao.
135
+ *
136
+ * @param query - Query tìm kiếm
137
+ * @param requestedBy - ID của user yêu cầu tìm kiếm
138
+ * @param options - Tùy chọn tìm kiếm nâng cao
139
+ * @param options.limit - Số lượng kết quả tối đa (mặc định: 10)
140
+ * @param options.type - Loại tìm kiếm: "video", "playlist", "channel", "all" (mặc định: "video")
141
+ * @param options.duration - Lọc theo thời lượng: "short", "medium", "long", "all" (mặc định: "all")
142
+ * @param options.sortBy - Sắp xếp theo: "relevance", "uploadDate", "viewCount", "rating" (mặc định: "relevance")
143
+ * @param options.uploadDate - Lọc theo ngày upload: "hour", "today", "week", "month", "year", "all" (mặc định: "all")
144
+ * @returns SearchResult chứa các track được tìm thấy
145
+ *
146
+ * @example
147
+ * // Tìm kiếm video cơ bản
148
+ * const result = await plugin.search("Never Gonna Give You Up", "user123");
149
+ *
150
+ * // Tìm kiếm với tùy chọn nâng cao
151
+ * const advancedResult = await plugin.search("chill music", "user123", {
152
+ * limit: 5,
153
+ * duration: "medium",
154
+ * sortBy: "viewCount",
155
+ * uploadDate: "month"
156
+ * });
157
+ */
158
+ async search(query, requestedBy, options = {}) {
159
+ const { limit = 10, type = "video", duration = "all", sortBy = "relevance", uploadDate = "all" } = options;
160
+ try {
161
+ // Nếu là URL YouTube, xử lý như video đơn lẻ hoặc playlist Mix
162
+ if (this.validate(query)) {
163
+ const listId = this.extractListId(query);
164
+ if (listId && this.isMixListId(listId)) {
165
+ // Xử lý playlist Mix (RD)
166
+ return await this.handleMixPlaylistInternal(query, requestedBy, limit);
167
+ }
168
+ const videoId = this.extractVideoId(query);
169
+ if (videoId) {
170
+ const video = await this.getVideoByIdInternal(videoId);
171
+ if (video) {
172
+ return {
173
+ tracks: [this.buildTrackFromVideo(video, requestedBy)],
174
+ };
175
+ }
176
+ }
177
+ }
178
+ // Tìm kiếm với youtube-sr
179
+ const searchOptions = {
180
+ limit,
181
+ type: type === "all" ? "all" : type,
182
+ safeSearch: false,
183
+ };
184
+ // Thêm các filter nâng cao
185
+ if (duration !== "all") {
186
+ searchOptions.duration = duration;
187
+ }
188
+ if (sortBy !== "relevance") {
189
+ searchOptions.sortBy = sortBy;
190
+ }
191
+ if (uploadDate !== "all") {
192
+ searchOptions.uploadDate = uploadDate;
193
+ }
194
+ const results = await youtube_sr_1.default.search(query, searchOptions);
195
+ const tracks = [];
196
+ // Xử lý kết quả dựa trên loại tìm kiếm
197
+ if (type === "video" || type === "all") {
198
+ const videos = results.filter((item) => item instanceof youtube_sr_1.Video);
199
+ tracks.push(...videos.slice(0, limit).map((video) => this.buildTrackFromVideo(video, requestedBy)));
200
+ }
201
+ if (type === "playlist" || type === "all") {
202
+ const playlists = results.filter((item) => item instanceof youtube_sr_1.Playlist);
203
+ // Chuyển đổi playlist thành tracks
204
+ playlists.slice(0, Math.floor(limit / 2)).forEach((playlist) => {
205
+ tracks.push(this.buildTrackFromPlaylist(playlist, requestedBy));
206
+ });
207
+ }
208
+ if (type === "channel" || type === "all") {
209
+ const channels = results.filter((item) => item instanceof youtube_sr_1.Channel);
210
+ // Chuyển đổi channel thành tracks (lấy video mới nhất)
211
+ channels.slice(0, Math.floor(limit / 3)).forEach((channel) => {
212
+ tracks.push(this.buildTrackFromChannel(channel, requestedBy));
213
+ });
214
+ }
215
+ return { tracks: tracks.slice(0, limit) };
216
+ }
217
+ catch (error) {
218
+ throw new Error(`YTSR search failed: ${error?.message || error}`);
219
+ }
220
+ }
221
+ /**
222
+ * Tìm kiếm playlist trên YouTube.
223
+ *
224
+ * @param query - Query tìm kiếm playlist
225
+ * @param requestedBy - ID của user yêu cầu tìm kiếm
226
+ * @param limit - Số lượng playlist tối đa (mặc định: 5)
227
+ * @returns SearchResult chứa các playlist được tìm thấy
228
+ *
229
+ * @example
230
+ * const playlists = await plugin.searchPlaylist("chill music playlist", "user123", 3);
231
+ * console.log(`Tìm thấy ${playlists.tracks.length} playlist`);
232
+ */
233
+ async searchPlaylist(query, requestedBy, limit = 5) {
234
+ return this.search(query, requestedBy, { type: "playlist", limit });
235
+ }
236
+ /**
237
+ * Tìm kiếm channel trên YouTube.
238
+ *
239
+ * @param query - Query tìm kiếm channel
240
+ * @param requestedBy - ID của user yêu cầu tìm kiếm
241
+ * @param limit - Số lượng channel tối đa (mặc định: 5)
242
+ * @returns SearchResult chứa các channel được tìm thấy
243
+ *
244
+ * @example
245
+ * const channels = await plugin.searchChannel("PewDiePie", "user123", 3);
246
+ * console.log(`Tìm thấy ${channels.tracks.length} channel`);
247
+ */
248
+ async searchChannel(query, requestedBy, limit = 5) {
249
+ return this.search(query, requestedBy, { type: "channel", limit });
250
+ }
251
+ /**
252
+ * Tìm kiếm video theo ID cụ thể.
253
+ *
254
+ * @param videoId - ID của video YouTube
255
+ * @param requestedBy - ID của user yêu cầu
256
+ * @returns Track object của video
257
+ *
258
+ * @example
259
+ * const video = await plugin.getVideoById("dQw4w9WgXcQ", "user123");
260
+ * console.log(video.title);
261
+ */
262
+ async getVideoById(videoId, requestedBy) {
263
+ try {
264
+ const video = await this.getVideoByIdInternal(videoId);
265
+ return video ? this.buildTrackFromVideo(video, requestedBy) : null;
266
+ }
267
+ catch (error) {
268
+ throw new Error(`Failed to get video by ID: ${error?.message || error}`);
269
+ }
270
+ }
271
+ /**
272
+ * Lấy thông tin chi tiết của video từ ID.
273
+ *
274
+ * @param videoId - ID của video YouTube
275
+ * @returns Video object hoặc null nếu không tìm thấy
276
+ */
277
+ async getVideoByIdInternal(videoId) {
278
+ try {
279
+ const results = await youtube_sr_1.default.search(`https://www.youtube.com/watch?v=${videoId}`, { limit: 1, type: "video" });
280
+ const video = results.find((item) => item instanceof youtube_sr_1.Video);
281
+ return video || null;
282
+ }
283
+ catch {
284
+ return null;
285
+ }
286
+ }
287
+ /**
288
+ * Xây dựng Track object từ Video object của youtube-sr.
289
+ *
290
+ * @param video - Video object từ youtube-sr
291
+ * @param requestedBy - ID của user yêu cầu
292
+ * @returns Track object
293
+ */
294
+ buildTrackFromVideo(video, requestedBy) {
295
+ // Xử lý duration một cách an toàn
296
+ let duration = 0;
297
+ if (video.duration) {
298
+ if (typeof video.duration === "number") {
299
+ duration = video.duration;
300
+ }
301
+ else if (typeof video.duration === "object" && video.duration !== null) {
302
+ // Nếu duration là object, thử lấy seconds
303
+ duration = video.duration?.seconds || video.duration?.totalSeconds || 0;
304
+ }
305
+ }
306
+ // youtube-sr trả về duration theo milliseconds, chuyển thành seconds
307
+ if (duration > 0) {
308
+ // Nếu duration lớn hơn 1000, có thể là milliseconds
309
+ if (duration > 1000) {
310
+ duration = Math.floor(duration / 1000);
311
+ }
312
+ }
313
+ return {
314
+ id: video.id,
315
+ title: video.title,
316
+ url: video.url,
317
+ duration: Math.max(0, duration), // Đảm bảo duration không âm
318
+ thumbnail: video.thumbnail?.url || video.thumbnails?.[0]?.url,
319
+ requestedBy,
320
+ source: this.name,
321
+ metadata: {
322
+ author: video.channel?.name,
323
+ views: video.views,
324
+ description: video.description,
325
+ publishedAt: video.uploadedAt,
326
+ channelUrl: video.channel?.url,
327
+ channelId: video.channel?.id,
328
+ },
329
+ };
330
+ }
331
+ /**
332
+ * Xây dựng Track object từ Playlist object của youtube-sr.
333
+ *
334
+ * @param playlist - Playlist object từ youtube-sr
335
+ * @param requestedBy - ID của user yêu cầu
336
+ * @returns Track object
337
+ */
338
+ buildTrackFromPlaylist(playlist, requestedBy) {
339
+ return {
340
+ id: playlist.id,
341
+ title: playlist.title,
342
+ url: playlist.url,
343
+ duration: 0, // Playlist không có duration cố định
344
+ thumbnail: playlist.thumbnail?.url || playlist.thumbnails?.[0]?.url,
345
+ requestedBy,
346
+ source: this.name,
347
+ metadata: {
348
+ author: playlist.channel?.name,
349
+ views: playlist.views,
350
+ description: playlist.description,
351
+ publishedAt: playlist.uploadedAt,
352
+ channelUrl: playlist.channel?.url,
353
+ channelId: playlist.channel?.id,
354
+ videoCount: playlist.videoCount,
355
+ type: "playlist",
356
+ },
357
+ };
358
+ }
359
+ /**
360
+ * Xây dựng Track object từ Channel object của youtube-sr.
361
+ *
362
+ * @param channel - Channel object từ youtube-sr
363
+ * @param requestedBy - ID của user yêu cầu
364
+ * @returns Track object
365
+ */
366
+ buildTrackFromChannel(channel, requestedBy) {
367
+ return {
368
+ id: channel.id,
369
+ title: channel.name,
370
+ url: channel.url,
371
+ duration: 0, // Channel không có duration
372
+ thumbnail: channel.thumbnail?.url || channel.thumbnails?.[0]?.url,
373
+ requestedBy,
374
+ source: this.name,
375
+ metadata: {
376
+ author: channel.name,
377
+ views: channel.subscribers,
378
+ description: channel.description,
379
+ publishedAt: channel.joinedAt,
380
+ channelUrl: channel.url,
381
+ channelId: channel.id,
382
+ subscriberCount: channel.subscribers,
383
+ type: "channel",
384
+ },
385
+ };
386
+ }
387
+ /**
388
+ * Xử lý playlist Mix (RD) của YouTube (internal).
389
+ *
390
+ * @param url - URL của playlist Mix
391
+ * @param requestedBy - ID của user yêu cầu
392
+ * @param limit - Số lượng track tối đa
393
+ * @returns SearchResult chứa các track từ Mix
394
+ */
395
+ async handleMixPlaylistInternal(url, requestedBy, limit) {
396
+ try {
397
+ const videoId = this.extractVideoId(url);
398
+ if (!videoId) {
399
+ throw new Error("Không thể trích xuất video ID từ URL Mix");
400
+ }
401
+ // Lấy thông tin video gốc
402
+ const anchorVideo = await this.getVideoByIdInternal(videoId);
403
+ if (!anchorVideo) {
404
+ throw new Error("Không thể lấy thông tin video gốc");
405
+ }
406
+ // Tìm kiếm các video liên quan để tạo Mix
407
+ const searchQuery = `${anchorVideo.title} ${anchorVideo.channel?.name || ""}`;
408
+ const searchResult = await this.search(searchQuery, requestedBy, {
409
+ limit: limit + 5, // Lấy thêm để có thể lọc
410
+ type: "video",
411
+ });
412
+ // Lọc và sắp xếp kết quả để tạo Mix
413
+ const mixTracks = searchResult.tracks
414
+ .filter((track) => track.id !== videoId) // Loại bỏ video gốc
415
+ .slice(0, limit);
416
+ // Thêm video gốc vào đầu Mix
417
+ const anchorTrack = this.buildTrackFromVideo(anchorVideo, requestedBy);
418
+ mixTracks.unshift(anchorTrack);
419
+ return {
420
+ tracks: mixTracks.slice(0, limit),
421
+ playlist: {
422
+ name: `YouTube Mix - ${anchorVideo.title}`,
423
+ url: url,
424
+ thumbnail: anchorVideo.thumbnail?.url || anchorVideo.thumbnails?.[0]?.url,
425
+ },
426
+ };
427
+ }
428
+ catch (error) {
429
+ throw new Error(`Failed to handle Mix playlist: ${error?.message || error}`);
430
+ }
431
+ }
432
+ /**
433
+ * Kiểm tra xem listId có phải là Mix playlist không.
434
+ *
435
+ * @param listId - ID của playlist
436
+ * @returns true nếu là Mix playlist
437
+ */
438
+ isMixListId(listId) {
439
+ // YouTube Mix playlists thường bắt đầu với 'RD'
440
+ return typeof listId === "string" && listId.toUpperCase().startsWith("RD");
441
+ }
442
+ /**
443
+ * Trích xuất playlist ID từ URL YouTube.
444
+ *
445
+ * @param input - URL chứa playlist ID
446
+ * @returns Playlist ID hoặc null nếu không tìm thấy
447
+ */
448
+ extractListId(input) {
449
+ try {
450
+ const u = new URL(input);
451
+ return u.searchParams.get("list");
452
+ }
453
+ catch {
454
+ return null;
455
+ }
456
+ }
457
+ /**
458
+ * Trích xuất video ID từ URL YouTube.
459
+ *
460
+ * @param input - URL hoặc string chứa video ID
461
+ * @returns Video ID hoặc null nếu không tìm thấy
462
+ */
463
+ extractVideoId(input) {
464
+ try {
465
+ const u = new URL(input);
466
+ const allowedShortHosts = ["youtu.be"];
467
+ const allowedLongHosts = ["youtube.com", "www.youtube.com", "music.youtube.com", "m.youtube.com"];
468
+ if (allowedShortHosts.includes(u.hostname)) {
469
+ return u.pathname.split("/").filter(Boolean)[0] || null;
470
+ }
471
+ if (allowedLongHosts.includes(u.hostname)) {
472
+ // watch?v=, shorts/, embed/
473
+ if (u.searchParams.get("v"))
474
+ return u.searchParams.get("v");
475
+ const path = u.pathname;
476
+ if (path.startsWith("/shorts/"))
477
+ return path.replace("/shorts/", "");
478
+ if (path.startsWith("/embed/"))
479
+ return path.replace("/embed/", "");
480
+ }
481
+ return null;
482
+ }
483
+ catch {
484
+ return null;
485
+ }
486
+ }
487
+ /**
488
+ * Plugin này không hỗ trợ tạo stream, chỉ dành cho tìm kiếm metadata.
489
+ *
490
+ * @param track - Track object
491
+ * @throws Error vì plugin này không hỗ trợ streaming
492
+ */
493
+ async getStream(track) {
494
+ throw new Error("YTSRPlugin không hỗ trợ streaming. Plugin này chỉ dành cho tìm kiếm metadata.");
495
+ }
496
+ /**
497
+ * Xử lý playlist Mix (RD) của YouTube.
498
+ *
499
+ * @param mixUrl - URL của playlist Mix YouTube
500
+ * @param requestedBy - ID của user yêu cầu
501
+ * @param limit - Số lượng track tối đa (mặc định: 10)
502
+ * @returns SearchResult chứa các track từ Mix playlist
503
+ *
504
+ * @example
505
+ * const mixResult = await plugin.handleMixPlaylist(
506
+ * "https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDMWGnHCaqxdU&start_radio=1",
507
+ * "user123",
508
+ * 15
509
+ * );
510
+ * console.log(`Mix playlist: ${mixResult.playlist?.name}`);
511
+ * console.log(`Tìm thấy ${mixResult.tracks.length} track trong Mix`);
512
+ */
513
+ async handleMixPlaylist(mixUrl, requestedBy, limit = 10) {
514
+ return this.handleMixPlaylistInternal(mixUrl, requestedBy, limit);
515
+ }
516
+ /**
517
+ * Lấy các video liên quan cho một video YouTube cụ thể.
518
+ *
519
+ * @param trackURL - URL của video YouTube để lấy video liên quan
520
+ * @param opts - Tùy chọn cho việc lọc và giới hạn kết quả
521
+ * @param opts.limit - Số lượng video liên quan tối đa (mặc định: 5)
522
+ * @param opts.offset - Số lượng video bỏ qua từ đầu (mặc định: 0)
523
+ * @param opts.history - Mảng các track để loại trừ khỏi kết quả
524
+ * @returns Mảng các Track object liên quan
525
+ *
526
+ * @example
527
+ * const related = await plugin.getRelatedTracks(
528
+ * "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
529
+ * { limit: 3, history: [currentTrack] }
530
+ * );
531
+ * console.log(`Tìm thấy ${related.length} video liên quan`);
532
+ */
533
+ async getRelatedTracks(trackURL, opts = {}) {
534
+ const { limit = 5, offset = 0, history = [] } = opts;
535
+ try {
536
+ const videoId = this.extractVideoId(trackURL);
537
+ if (!videoId) {
538
+ throw new Error("Không thể trích xuất video ID từ URL");
539
+ }
540
+ // Tìm kiếm video liên quan bằng cách tìm kiếm với title của video hiện tại
541
+ const currentVideo = await this.getVideoByIdInternal(videoId);
542
+ if (!currentVideo) {
543
+ throw new Error("Không thể lấy thông tin video hiện tại");
544
+ }
545
+ // Tìm kiếm các video liên quan dựa trên title và channel
546
+ const searchQuery = `${currentVideo.title} ${currentVideo.channel?.name || ""}`;
547
+ const searchResult = await this.search(searchQuery, "auto", {
548
+ limit: limit + offset + history.length,
549
+ type: "video",
550
+ });
551
+ // Lọc ra video hiện tại và các video trong history
552
+ const filteredTracks = searchResult.tracks.filter((track) => {
553
+ // Loại bỏ video hiện tại
554
+ if (track.id === videoId)
555
+ return false;
556
+ // Loại bỏ các video trong history
557
+ if (history.some((h) => h.id === track.id || h.url === track.url))
558
+ return false;
559
+ return true;
560
+ });
561
+ // Áp dụng offset và limit
562
+ return filteredTracks.slice(offset, offset + limit);
563
+ }
564
+ catch (error) {
565
+ throw new Error(`Failed to get related tracks: ${error?.message || error}`);
566
+ }
567
+ }
568
+ /**
569
+ * Plugin này không hỗ trợ fallback stream.
570
+ *
571
+ * @param track - Track object
572
+ * @throws Error vì plugin này không hỗ trợ streaming
573
+ */
574
+ async getFallback(track) {
575
+ throw new Error("YTSRPlugin không hỗ trợ fallback streaming. Plugin này chỉ dành cho tìm kiếm metadata.");
576
+ }
577
+ }
578
+ exports.YTSRPlugin = YTSRPlugin;
579
+ //# sourceMappingURL=YTSRPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YTSRPlugin.js","sourceRoot":"","sources":["../src/YTSRPlugin.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -80,4 +80,20 @@ export { SpotifyPlugin } from "./SpotifyPlugin";
80
80
  * const result = await ttsPlugin.search("tts:Hello world", "user123");
81
81
  */
82
82
  export { TTSPlugin } from "./TTSPlugin";
83
+ /**
84
+ * YTSR plugin for advanced YouTube search without streaming.
85
+ *
86
+ * Provides comprehensive YouTube search functionality including:
87
+ * - Advanced video search with filters (duration, upload date, sort by)
88
+ * - Playlist and channel search
89
+ * - Multiple search types (video, playlist, channel, all)
90
+ * - Metadata extraction without streaming
91
+ * - Support for YouTube URLs
92
+ *
93
+ * @example
94
+ * const ytsrPlugin = new YTSRPlugin();
95
+ * const result = await ytsrPlugin.search("Never Gonna Give You Up", "user123");
96
+ * const playlistResult = await ytsrPlugin.searchPlaylist("chill music", "user123");
97
+ */
98
+ export { YTSRPlugin } from "./YTSRPlugin";
83
99
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@
20
20
  * @since 1.0.0
21
21
  */
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.TTSPlugin = exports.SpotifyPlugin = exports.SoundCloudPlugin = exports.YouTubePlugin = void 0;
23
+ exports.YTSRPlugin = exports.TTSPlugin = exports.SpotifyPlugin = exports.SoundCloudPlugin = exports.YouTubePlugin = void 0;
24
24
  /**
25
25
  * YouTube plugin for handling YouTube videos, playlists, and search.
26
26
  *
@@ -87,4 +87,21 @@ Object.defineProperty(exports, "SpotifyPlugin", { enumerable: true, get: functio
87
87
  */
88
88
  var TTSPlugin_1 = require("./TTSPlugin");
89
89
  Object.defineProperty(exports, "TTSPlugin", { enumerable: true, get: function () { return TTSPlugin_1.TTSPlugin; } });
90
+ /**
91
+ * YTSR plugin for advanced YouTube search without streaming.
92
+ *
93
+ * Provides comprehensive YouTube search functionality including:
94
+ * - Advanced video search with filters (duration, upload date, sort by)
95
+ * - Playlist and channel search
96
+ * - Multiple search types (video, playlist, channel, all)
97
+ * - Metadata extraction without streaming
98
+ * - Support for YouTube URLs
99
+ *
100
+ * @example
101
+ * const ytsrPlugin = new YTSRPlugin();
102
+ * const result = await ytsrPlugin.search("Never Gonna Give You Up", "user123");
103
+ * const playlistResult = await ytsrPlugin.searchPlaylist("chill music", "user123");
104
+ */
105
+ var YTSRPlugin_1 = require("./YTSRPlugin");
106
+ Object.defineProperty(exports, "YTSRPlugin", { enumerable: true, get: function () { return YTSRPlugin_1.YTSRPlugin; } });
90
107
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH;;;;;;;;;;;;;GAaG;AACH,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AAEtB;;;;;;;;;;;;;GAaG;AACH,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AAEzB;;;;;;;;;;;;;;;GAeG;AACH,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AAEtB;;;;;;;;;;;;;GAaG;AACH,yCAAwC;AAA/B,sGAAA,SAAS,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH;;;;;;;;;;;;;GAaG;AACH,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AAEtB;;;;;;;;;;;;;GAaG;AACH,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AAEzB;;;;;;;;;;;;;;;GAeG;AACH,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AAEtB;;;;;;;;;;;;;GAaG;AACH,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAElB;;;;;;;;;;;;;;GAcG;AACH,2CAA0C;AAAjC,wGAAA,UAAU,OAAA"}