streamify-audio 2.3.1 → 2.3.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.
@@ -1,195 +0,0 @@
1
- # Manager
2
-
3
- The Manager handles player creation, searching, and playlist loading.
4
-
5
- ## Creating a Manager
6
-
7
- ```javascript
8
- const Streamify = require('streamify-audio');
9
-
10
- const manager = new Streamify.Manager(client, {
11
- ytdlpPath: '/usr/local/bin/yt-dlp',
12
- ffmpegPath: '/usr/bin/ffmpeg',
13
- cookiesPath: './cookies.txt',
14
- spotify: {
15
- clientId: process.env.SPOTIFY_CLIENT_ID,
16
- clientSecret: process.env.SPOTIFY_CLIENT_SECRET
17
- }
18
- });
19
- ```
20
-
21
- See [Configuration](../configuration.md) for all options.
22
-
23
- ## Methods
24
-
25
- ### create(guildId, voiceChannelId, textChannelId)
26
-
27
- Creates or retrieves a player for a guild.
28
-
29
- ```javascript
30
- const player = await manager.create(
31
- message.guild.id,
32
- voiceChannel.id,
33
- message.channel.id
34
- );
35
- ```
36
-
37
- If a player already exists for the guild, returns the existing player. If the voice channel differs, disconnects and reconnects.
38
-
39
- ### get(guildId)
40
-
41
- Gets an existing player without creating one.
42
-
43
- ```javascript
44
- const player = manager.get(message.guild.id);
45
- if (!player) {
46
- return message.reply('No player in this server.');
47
- }
48
- ```
49
-
50
- ### destroy(guildId)
51
-
52
- Destroys a player and disconnects from voice.
53
-
54
- ```javascript
55
- manager.destroy(message.guild.id);
56
- ```
57
-
58
- ### destroyAll()
59
-
60
- Destroys all players. Useful for graceful shutdown.
61
-
62
- ```javascript
63
- process.on('SIGINT', () => {
64
- manager.destroyAll();
65
- process.exit();
66
- });
67
- ```
68
-
69
- ### search(query, options?)
70
-
71
- Searches for tracks.
72
-
73
- - `query` (string) - The search term or URL
74
- - `options` (object) - Search configuration
75
- - `source` (string) - `youtube`, `spotify`, `soundcloud`, `twitch`, `mixcloud`, `bandcamp`, `local`, `http`
76
- - `limit` (number) - Number of results (default: 10)
77
- - `type` (string) - `video`, `live`, or `all` (YouTube only)
78
- - `sort` (string) - `relevance`, `popularity`, `date`, or `rating` (YouTube only)
79
- - `artist` (string) - Filter results to only include tracks by this artist
80
-
81
- **Example:**
82
-
83
- ```javascript
84
- const result = await manager.search('lofi hip hop', {
85
- source: 'youtube',
86
- type: 'live',
87
- sort: 'popularity'
88
- });
89
-
90
- // Artist search - filters results to tracks BY the artist
91
- const artistTracks = await manager.search('Drake', {
92
- source: 'spotify',
93
- artist: 'Drake',
94
- limit: 5
95
- });
96
- ```
97
-
98
- // Result
99
- {
100
- loadType: 'search', // search, empty, error
101
- tracks: [{
102
- id: 'dQw4w9WgXcQ',
103
- title: 'Rick Astley - Never Gonna Give You Up',
104
- author: 'Rick Astley',
105
- duration: 213,
106
- thumbnail: 'https://...',
107
- uri: 'https://youtube.com/...',
108
- source: 'youtube'
109
- }]
110
- }
111
- ```
112
-
113
- ### resolve(query)
114
-
115
- Resolves a URL or falls back to search.
116
-
117
- ```javascript
118
- // URL - loads directly
119
- const result = await manager.resolve('https://youtube.com/watch?v=dQw4w9WgXcQ');
120
- // { loadType: 'track', tracks: [track] }
121
-
122
- // Search query - searches
123
- const result = await manager.resolve('never gonna give you up');
124
- // { loadType: 'search', tracks: [...] }
125
- ```
126
-
127
- ### loadPlaylist(url)
128
-
129
- Loads a playlist or album.
130
-
131
- ```javascript
132
- // YouTube playlist
133
- const result = await manager.loadPlaylist('https://youtube.com/playlist?list=PLrAXtmErZgOeiKm4sgNOknGvNjby9efdf');
134
-
135
- // Spotify playlist
136
- const result = await manager.loadPlaylist('https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M');
137
-
138
- // Spotify album
139
- const result = await manager.loadPlaylist('https://open.spotify.com/album/4LH4d3cOWNNsVw41Gqt2kv');
140
-
141
- // Result
142
- {
143
- loadType: 'playlist',
144
- playlist: {
145
- id: 'PLrAXtmErZgOeiKm4sgNOknGvNjby9efdf',
146
- title: 'My Playlist',
147
- author: 'User',
148
- thumbnail: 'https://...',
149
- source: 'youtube'
150
- },
151
- tracks: [...]
152
- }
153
- ```
154
-
155
- ### getRelated(track, limit?)
156
-
157
- Gets related tracks for autoplay.
158
-
159
- ```javascript
160
- const result = await manager.getRelated(currentTrack, 5);
161
- // { tracks: [...] }
162
- ```
163
-
164
- ### getStats()
165
-
166
- Gets manager statistics.
167
-
168
- ```javascript
169
- const stats = manager.getStats();
170
- // {
171
- // players: 5,
172
- // playingPlayers: 3,
173
- // memory: { heapUsed: 52428800, ... }
174
- // }
175
- ```
176
-
177
- ## Events
178
-
179
- ```javascript
180
- manager.on('playerCreate', (player) => {
181
- console.log(`Player created: ${player.guildId}`);
182
- });
183
-
184
- manager.on('playerDestroy', (player) => {
185
- console.log(`Player destroyed: ${player.guildId}`);
186
- });
187
- ```
188
-
189
- ## Properties
190
-
191
- ```javascript
192
- manager.players // Map<guildId, Player>
193
- manager.client // Discord.js client
194
- manager.config // Resolved configuration
195
- ```
@@ -1,263 +0,0 @@
1
- # Player
2
-
3
- The Player handles playback, filters, and voice connection for a single guild.
4
-
5
- ## Getting a Player
6
-
7
- ```javascript
8
- // Create new or get existing
9
- const player = await manager.create(guildId, voiceChannelId, textChannelId);
10
-
11
- // Get existing only
12
- const player = manager.get(guildId);
13
- ```
14
-
15
- ## Playback Methods
16
-
17
- ### play(track, options?)
18
-
19
- Plays a track immediately. If something is playing, adds to queue and skips.
20
-
21
- ```javascript
22
- const result = await manager.search('never gonna give you up');
23
- await player.play(result.tracks[0]);
24
- ```
25
-
26
- **Options:**
27
- - `startPosition` - Start playback at a specific position in milliseconds
28
- - `volume` - Set volume before playing (0-200)
29
- - `filters` - Apply filters before playing
30
- - `replace` - Replace current track without adding to queue/history
31
-
32
- ```javascript
33
- // Start playing at 30 seconds
34
- await player.play(track, { startPosition: 30000 });
35
-
36
- // Start with specific volume
37
- await player.play(track, { volume: 50 });
38
-
39
- // Start with filters applied
40
- await player.play(track, { filters: { bass: 10, nightcore: true } });
41
-
42
- // Replace current track without queueing
43
- await player.play(track, { replace: true });
44
-
45
- // Combine options
46
- await player.play(track, {
47
- startPosition: savedPositionMs,
48
- volume: savedVolume,
49
- filters: savedFilters,
50
- replace: true
51
- });
52
- ```
53
-
54
- ### pause()
55
-
56
- Pauses playback and destroys the stream to save resources.
57
-
58
- ```javascript
59
- player.pause();
60
- ```
61
-
62
- ### resume()
63
-
64
- Resumes playback by recreating the stream and seeking to the saved position.
65
-
66
- ```javascript
67
- await player.resume();
68
- ```
69
-
70
- ### skip()
71
-
72
- Skips to the next track in queue.
73
-
74
- ```javascript
75
- await player.skip();
76
- ```
77
-
78
- ### previous()
79
-
80
- Goes back to the previous track.
81
-
82
- ```javascript
83
- await player.previous();
84
- ```
85
-
86
- ### stop()
87
-
88
- Stops playback and clears the queue.
89
-
90
- ```javascript
91
- player.stop();
92
- ```
93
-
94
- ### seek(positionMs)
95
-
96
- Seeks to a position in milliseconds.
97
-
98
- ```javascript
99
- await player.seek(30000); // Seek to 30 seconds
100
- ```
101
-
102
- ## Volume
103
-
104
- ```javascript
105
- // Set volume (0-200)
106
- player.setVolume(80);
107
-
108
- // Get current volume
109
- console.log(player.volume); // 80
110
- ```
111
-
112
- ## Filters
113
-
114
- ```javascript
115
- // Set a filter
116
- await player.setFilter('bass', 10);
117
- await player.setFilter('nightcore', true);
118
-
119
- // Clear all filters
120
- await player.clearFilters();
121
-
122
- // Get current filters
123
- console.log(player.filters); // { bass: 10, nightcore: true }
124
- ```
125
-
126
- See [Filters](../filters.md) for all available filters.
127
-
128
- ## Effect Presets
129
-
130
- Effect presets are pre-configured filter combinations that stack by default.
131
-
132
- ```javascript
133
- // Apply a single preset
134
- await player.setEffectPresets(['bassboost']);
135
-
136
- // Apply multiple presets (they stack)
137
- await player.setEffectPresets(['nightcore', 'bassboost']);
138
-
139
- // Apply with custom intensity (0.1 - 1.0)
140
- await player.setEffectPresets([
141
- { name: 'nightcore', intensity: 0.8 },
142
- { name: 'bassboost', intensity: 0.5 }
143
- ]);
144
-
145
- // Replace all presets instead of stacking
146
- await player.setEffectPresets(['8d'], { replace: true });
147
-
148
- // Get active presets
149
- const active = player.getActiveEffectPresets();
150
- // [{ name: 'nightcore', intensity: 0.8 }, { name: 'bassboost', intensity: 0.5 }]
151
-
152
- // Clear all effect presets
153
- await player.clearEffectPresets();
154
-
155
- // List available presets
156
- const presets = player.getEffectPresets();
157
- // ['bassboost', 'nightcore', 'vaporwave', '8d', 'karaoke', ...]
158
- ```
159
-
160
- **Available Presets:**
161
- - `bassboost` - Boost bass frequencies
162
- - `nightcore` - Speed up with higher pitch
163
- - `vaporwave` - Slow down with lower pitch
164
- - `8d` - 8D rotating audio effect
165
- - `karaoke` - Reduce vocals
166
- - `reverb` - Add room acoustics / echo
167
- - `surround` - Virtual surround sound mapping
168
- - `boost` - General volume and clarity boost
169
- - `subboost` - Extreme sub-woofer boost
170
- - `trebleboost` - Boost treble frequencies
171
- - `deep` - Deep bass with lower pitch
172
- - `lofi` - Lo-fi aesthetic
173
- - `radio` - Radio/telephone effect
174
- - `telephone` - Old telephone effect
175
- - `soft` - Softer, quieter sound
176
- - `loud` - Louder, compressed sound
177
- - `chipmunk` - High-pitched voice
178
- - `darth` - Deep Darth Vader voice
179
- - `echo` - Echo/reverb effect
180
- - `vibrato` - Vibrato effect
181
- - `tremolo` - Tremolo effect
182
-
183
- ## Loop Modes
184
-
185
- ```javascript
186
- player.setLoop('off'); // No looping
187
- player.setLoop('track'); // Loop current track
188
- player.setLoop('queue'); // Loop entire queue
189
- ```
190
-
191
- ## Toggles
192
-
193
- ```javascript
194
- // Autoplay (play related tracks when queue ends)
195
- player.setAutoplay(true);
196
- player.setAutoplay(false);
197
-
198
- // Auto-pause (pause when channel empty)
199
- player.setAutoPause(true);
200
- player.setAutoPause(false);
201
- ```
202
-
203
- ## Connection
204
-
205
- ```javascript
206
- // Connect to voice
207
- await player.connect();
208
-
209
- // Disconnect (keeps player)
210
- player.disconnect();
211
-
212
- // Destroy player completely
213
- player.destroy();
214
- ```
215
-
216
- ## State Properties
217
-
218
- ```javascript
219
- player.connected // true if connected to voice
220
- player.playing // true if playing (not paused)
221
- player.paused // true if paused
222
- player.position // Current position in ms
223
- player.volume // Current volume (0-200)
224
- player.filters // Current filters object
225
-
226
- player.guildId // Guild ID
227
- player.voiceChannelId // Voice channel ID
228
- player.textChannelId // Text channel ID
229
-
230
- player.autoplay // { enabled, maxTracks }
231
- player.autoPause // { enabled, minUsers }
232
- player.autoLeave // { enabled, emptyDelay, inactivityTimeout }
233
- ```
234
-
235
- ## Queue Access
236
-
237
- ```javascript
238
- player.queue.current // Currently playing track
239
- player.queue.tracks // Upcoming tracks
240
- player.queue.previous // Previously played tracks
241
- ```
242
-
243
- See [Queue](./queue.md) for queue methods.
244
-
245
- ## Serialization
246
-
247
- ```javascript
248
- const json = player.toJSON();
249
- // {
250
- // guildId: '...',
251
- // voiceChannelId: '...',
252
- // connected: true,
253
- // playing: true,
254
- // paused: false,
255
- // volume: 80,
256
- // position: 45000,
257
- // filters: { bass: 10 },
258
- // queue: { current: {...}, tracks: [...] },
259
- // autoplay: { enabled: false },
260
- // autoPause: { enabled: true },
261
- // autoLeave: { enabled: true }
262
- // }
263
- ```
@@ -1,197 +0,0 @@
1
- # Queue
2
-
3
- The Queue manages tracks for a player.
4
-
5
- ## Accessing the Queue
6
-
7
- ```javascript
8
- const player = manager.get(guildId);
9
- const queue = player.queue;
10
- ```
11
-
12
- ## Properties
13
-
14
- ```javascript
15
- queue.current // Currently playing track (or null)
16
- queue.tracks // Array of upcoming tracks
17
- queue.previous // Array of previously played tracks
18
- queue.size // Number of upcoming tracks
19
- queue.isEmpty // true if no upcoming tracks
20
- queue.totalDuration // Total duration in ms (current + upcoming)
21
- queue.repeatMode // 'off', 'track', or 'queue'
22
- ```
23
-
24
- ## Adding Tracks
25
-
26
- ### add(track, position?)
27
-
28
- Add a single track.
29
-
30
- ```javascript
31
- // Add to end
32
- queue.add(track);
33
-
34
- // Add at specific position
35
- queue.add(track, 0); // Next up
36
- queue.add(track, 2); // Third in queue
37
- ```
38
-
39
- ### addMany(tracks, position?)
40
-
41
- Add multiple tracks.
42
-
43
- ```javascript
44
- // Add to end
45
- queue.addMany(tracks);
46
-
47
- // Add at position
48
- queue.addMany(tracks, 0);
49
- ```
50
-
51
- ## Removing Tracks
52
-
53
- ### remove(index)
54
-
55
- Remove a track by index.
56
-
57
- ```javascript
58
- const removed = queue.remove(0); // Remove next track
59
- console.log(removed.title);
60
- ```
61
-
62
- ### clear()
63
-
64
- Clear all upcoming tracks.
65
-
66
- ```javascript
67
- const count = queue.clear();
68
- console.log(`Cleared ${count} tracks`);
69
- ```
70
-
71
- ## Reordering
72
-
73
- ### shuffle()
74
-
75
- Randomize track order.
76
-
77
- ```javascript
78
- queue.shuffle();
79
- ```
80
-
81
- ### move(from, to)
82
-
83
- Move a track to a different position.
84
-
85
- ```javascript
86
- queue.move(5, 0); // Move track 5 to next up
87
- queue.move(0, 3); // Move next track to position 3
88
- ```
89
-
90
- ## Loop Mode
91
-
92
- ```javascript
93
- queue.setRepeatMode('off'); // No looping
94
- queue.setRepeatMode('track'); // Repeat current track
95
- queue.setRepeatMode('queue'); // Repeat entire queue
96
- ```
97
-
98
- Or use the player shorthand:
99
-
100
- ```javascript
101
- player.setLoop('queue');
102
- ```
103
-
104
- ## Internal Methods
105
-
106
- These are used internally by the Player:
107
-
108
- ### shift()
109
-
110
- Moves current to previous, gets next track as current.
111
-
112
- ```javascript
113
- const next = queue.shift(); // Returns next track or null
114
- ```
115
-
116
- ### unshift()
117
-
118
- Goes back to previous track.
119
-
120
- ```javascript
121
- const prev = queue.unshift(); // Returns previous track or null
122
- ```
123
-
124
- ### setCurrent(track)
125
-
126
- Sets the current track directly.
127
-
128
- ```javascript
129
- queue.setCurrent(track);
130
- ```
131
-
132
- ## Example: Queue Display
133
-
134
- ```javascript
135
- function displayQueue(player) {
136
- const { current, tracks } = player.queue;
137
-
138
- let text = '';
139
-
140
- if (current) {
141
- text += `**Now Playing:** ${current.title}\n\n`;
142
- }
143
-
144
- if (tracks.length > 0) {
145
- text += '**Up Next:**\n';
146
- tracks.slice(0, 10).forEach((track, i) => {
147
- text += `${i + 1}. ${track.title}\n`;
148
- });
149
- if (tracks.length > 10) {
150
- text += `... and ${tracks.length - 10} more`;
151
- }
152
- } else {
153
- text += 'Queue is empty.';
154
- }
155
-
156
- return text;
157
- }
158
- ```
159
-
160
- ## Example: Playlist Loading
161
-
162
- ```javascript
163
- async function loadPlaylist(player, url) {
164
- const result = await manager.loadPlaylist(url);
165
-
166
- if (result.loadType === 'error') {
167
- throw new Error(result.error);
168
- }
169
-
170
- const tracks = result.tracks;
171
-
172
- if (player.queue.current) {
173
- // Add all to queue
174
- player.queue.addMany(tracks);
175
- return `Added ${tracks.length} tracks to queue`;
176
- } else {
177
- // Play first, queue rest
178
- const first = tracks.shift();
179
- player.queue.addMany(tracks);
180
- await player.play(first);
181
- return `Playing **${result.playlist.title}** (${tracks.length + 1} tracks)`;
182
- }
183
- }
184
- ```
185
-
186
- ## Serialization
187
-
188
- ```javascript
189
- const json = queue.toJSON();
190
- // {
191
- // current: { id, title, ... },
192
- // tracks: [...],
193
- // previous: [...],
194
- // repeatMode: 'off',
195
- // size: 5
196
- // }
197
- ```