@students-dev/audify-js 1.0.0 → 1.0.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.
- package/LICENSE +21 -0
- package/README.md +93 -310
- package/dist/AudioEngine.js +232 -0
- package/dist/cjs/index.js +1497 -1392
- package/dist/cjs/index.js.map +1 -1
- package/dist/constants/index.js +35 -0
- package/dist/engine/Filters.js +137 -0
- package/dist/engine/MockAudioContext.js +53 -0
- package/dist/engine/Player.js +209 -0
- package/dist/esm/index.js +1490 -1389
- package/dist/esm/index.js.map +1 -1
- package/dist/events/EventBus.js +61 -0
- package/dist/index.js +18 -0
- package/dist/interfaces/index.js +1 -0
- package/dist/plugins/Plugin.js +27 -0
- package/dist/plugins/PluginManager.js +106 -0
- package/dist/providers/LavalinkProvider.js +81 -0
- package/dist/providers/LocalProvider.js +70 -0
- package/dist/providers/ProviderRegistry.js +20 -0
- package/dist/providers/SpotifyProvider.js +59 -0
- package/dist/providers/YouTubeProvider.js +48 -0
- package/dist/queue/Queue.js +186 -0
- package/dist/queue/Track.js +54 -0
- package/dist/types/AudioEngine.d.ts +107 -0
- package/dist/types/constants/index.d.ts +39 -0
- package/dist/types/engine/AudioEngine.d.ts +44 -1
- package/dist/types/engine/Filters.d.ts +25 -24
- package/dist/types/engine/MockAudioContext.d.ts +43 -0
- package/dist/types/engine/Player.d.ts +25 -21
- package/dist/types/events/EventBus.d.ts +17 -15
- package/dist/types/index.d.ts +17 -13
- package/dist/types/interfaces/index.d.ts +31 -0
- package/dist/types/plugins/Plugin.d.ts +11 -43
- package/dist/types/plugins/PluginManager.d.ts +19 -19
- package/dist/types/providers/LavalinkProvider.d.ts +17 -0
- package/dist/types/providers/LocalProvider.d.ts +11 -22
- package/dist/types/providers/ProviderRegistry.d.ts +10 -0
- package/dist/types/providers/SpotifyProvider.d.ts +14 -0
- package/dist/types/providers/YouTubeProvider.d.ts +11 -28
- package/dist/types/queue/Queue.d.ts +28 -22
- package/dist/types/queue/Track.d.ts +18 -16
- package/dist/types/utils/Logger.d.ts +12 -16
- package/dist/types/utils/Metadata.d.ts +16 -15
- package/dist/types/utils/Probe.d.ts +7 -7
- package/dist/types/utils/Time.d.ts +9 -9
- package/dist/utils/Logger.js +59 -0
- package/dist/utils/Metadata.js +90 -0
- package/dist/utils/Probe.js +59 -0
- package/dist/utils/Time.js +54 -0
- package/package.json +19 -9
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/constants/Modes.js","../../src/events/EventBus.js","../../src/engine/Player.js","../../src/engine/Filters.js","../../src/utils/Metadata.js","../../src/queue/Track.js","../../src/queue/Queue.js","../../src/engine/AudioEngine.js","../../src/plugins/Plugin.js","../../src/plugins/PluginManager.js","../../src/utils/Logger.js","../../src/utils/Time.js","../../src/utils/Probe.js","../../src/providers/YouTubeProvider.js","../../src/providers/SoundCloudProvider.js","../../src/providers/LocalProvider.js"],"sourcesContent":["/**\n * Loop modes for playback\n */\nexport const LOOP_MODES = {\n OFF: 'off',\n TRACK: 'track',\n QUEUE: 'queue'\n};\n\n/**\n * Repeat modes (alias for loop modes)\n */\nexport const REPEAT_MODES = LOOP_MODES;\n\n/**\n * Filter types\n */\nexport const FILTER_TYPES = {\n BASSBOOST: 'bassboost',\n TREBLEBOOST: 'trebleboost',\n NIGHTCORE: 'nightcore',\n VAPORWAVE: 'vaporwave',\n ROTATE_8D: '8d',\n PITCH: 'pitch',\n SPEED: 'speed',\n REVERB: 'reverb'\n};\n\n/**\n * Event types\n */\nexport const EVENTS = {\n READY: 'ready',\n PLAY: 'play',\n PAUSE: 'pause',\n STOP: 'stop',\n ERROR: 'error',\n QUEUE_EMPTY: 'queueEmpty',\n TRACK_START: 'trackStart',\n TRACK_END: 'trackEnd',\n FILTER_APPLIED: 'filterApplied',\n TRACK_ADD: 'trackAdd',\n TRACK_REMOVE: 'trackRemove',\n SHUFFLE: 'shuffle',\n CLEAR: 'clear'\n};","/**\n * Simple event emitter for handling events\n */\nexport class EventBus {\n constructor() {\n this.events = {};\n }\n\n /**\n * Register an event listener\n * @param {string} event - Event name\n * @param {Function} callback - Callback function\n */\n on(event, callback) {\n if (!this.events[event]) {\n this.events[event] = [];\n }\n this.events[event].push(callback);\n }\n\n /**\n * Remove an event listener\n * @param {string} event - Event name\n * @param {Function} callback - Callback function\n */\n off(event, callback) {\n if (!this.events[event]) return;\n this.events[event] = this.events[event].filter(cb => cb !== callback);\n }\n\n /**\n * Emit an event\n * @param {string} event - Event name\n * @param {*} data - Data to pass to listeners\n */\n emit(event, data) {\n if (!this.events[event]) return;\n this.events[event].forEach(callback => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n\n /**\n * Remove all listeners for an event\n * @param {string} event - Event name\n */\n removeAllListeners(event) {\n delete this.events[event];\n }\n\n /**\n * Get all listeners for an event\n * @param {string} event - Event name\n * @returns {Function[]} Array of listeners\n */\n listeners(event) {\n return this.events[event] || [];\n }\n}","import { LOOP_MODES, EVENTS } from '../constants/Modes.js';\nimport { EventBus } from '../events/EventBus.js';\n\n/**\n * Audio player with playback controls\n */\nexport class Player {\n constructor(audioEngine) {\n this.audioEngine = audioEngine;\n this.audioContext = audioEngine.audioContext;\n this.source = null;\n this.isPlaying = false;\n this.currentTime = 0;\n this.duration = 0;\n this.volume = 1;\n this.loopMode = LOOP_MODES.OFF;\n this.eventBus = new EventBus();\n }\n\n /**\n * Play audio\n * @param {Track} track - Track to play\n */\n async play(track) {\n if (!track) return;\n\n try {\n await this.loadTrack(track);\n this.source.start(0);\n this.isPlaying = true;\n this.eventBus.emit(EVENTS.PLAY, track);\n this.eventBus.emit(EVENTS.TRACK_START, track);\n } catch (error) {\n this.eventBus.emit(EVENTS.ERROR, error);\n }\n }\n\n /**\n * Pause playback\n */\n pause() {\n if (this.source && this.isPlaying) {\n this.source.stop();\n this.isPlaying = false;\n this.eventBus.emit(EVENTS.PAUSE);\n }\n }\n\n /**\n * Resume playback\n */\n resume() {\n if (!this.isPlaying && this.source) {\n // Would need to recreate source for resume\n this.eventBus.emit(EVENTS.PLAY);\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.source) {\n this.source.stop();\n this.source = null;\n this.isPlaying = false;\n this.currentTime = 0;\n this.eventBus.emit(EVENTS.STOP);\n }\n }\n\n /**\n * Seek to position\n * @param {number} time - Time in seconds\n */\n seek(time) {\n // In Web Audio API, seeking requires buffer manipulation\n this.currentTime = Math.max(0, Math.min(time, this.duration));\n }\n\n /**\n * Set volume\n * @param {number} volume - Volume level (0-1)\n */\n setVolume(volume) {\n this.volume = Math.max(0, Math.min(1, volume));\n // Apply to gain node if exists\n }\n\n /**\n * Set loop mode\n * @param {string} mode - Loop mode\n */\n setLoopMode(mode) {\n this.loopMode = mode;\n }\n\n /**\n * Load track into player\n * @param {Track} track - Track to load\n */\n async loadTrack(track) {\n if (!this.audioContext) throw new Error('AudioContext not available');\n\n const response = await fetch(track.url);\n const arrayBuffer = await response.arrayBuffer();\n const audioBuffer = await this.audioContext.decodeAudioData(arrayBuffer);\n\n this.source = this.audioContext.createBufferSource();\n this.source.buffer = audioBuffer;\n this.duration = audioBuffer.duration;\n\n // Connect through filters\n this.audioEngine.filters.connect(this.source, this.audioContext.destination);\n\n // Handle end of track\n this.source.onended = () => {\n this.isPlaying = false;\n this.eventBus.emit(EVENTS.TRACK_END, track);\n this.handleTrackEnd();\n };\n }\n\n /**\n * Handle track end based on loop mode\n */\n handleTrackEnd() {\n switch (this.loopMode) {\n case LOOP_MODES.TRACK:\n // Replay current track\n break;\n case LOOP_MODES.QUEUE:\n // Play next in queue\n this.audioEngine.queue.getNext();\n break;\n case LOOP_MODES.OFF:\n default:\n // Stop or play next\n break;\n }\n }\n\n /**\n * Get current playback state\n * @returns {Object} State object\n */\n getState() {\n return {\n isPlaying: this.isPlaying,\n currentTime: this.currentTime,\n duration: this.duration,\n volume: this.volume,\n loopMode: this.loopMode\n };\n }\n}","import { FILTER_TYPES } from '../constants/Modes.js';\n\n/**\n * Audio filters and effects\n */\nexport class Filters {\n constructor(audioContext) {\n this.audioContext = audioContext;\n this.filters = new Map();\n this.enabled = new Set();\n }\n\n /**\n * Apply filter\n * @param {string} type - Filter type\n * @param {Object} options - Filter options\n */\n apply(type, options = {}) {\n if (!this.audioContext) return;\n\n switch (type) {\n case FILTER_TYPES.BASSBOOST:\n this.applyBassBoost(options);\n break;\n case FILTER_TYPES.NIGHTCORE:\n this.applyNightcore(options);\n break;\n case FILTER_TYPES.VAPORWAVE:\n this.applyVaporwave(options);\n break;\n case FILTER_TYPES.ROTATE_8D:\n this.apply8DRotate(options);\n break;\n case FILTER_TYPES.PITCH:\n this.applyPitch(options);\n break;\n case FILTER_TYPES.SPEED:\n this.applySpeed(options);\n break;\n case FILTER_TYPES.REVERB:\n this.applyReverb(options);\n break;\n }\n\n this.enabled.add(type);\n }\n\n /**\n * Remove filter\n * @param {string} type - Filter type\n */\n remove(type) {\n if (this.filters.has(type)) {\n const filter = this.filters.get(type);\n filter.disconnect();\n this.filters.delete(type);\n this.enabled.delete(type);\n }\n }\n\n /**\n * Clear all filters\n */\n clear() {\n this.filters.forEach(filter => filter.disconnect());\n this.filters.clear();\n this.enabled.clear();\n }\n\n /**\n * Check if filter is enabled\n * @param {string} type - Filter type\n * @returns {boolean} Is enabled\n */\n isEnabled(type) {\n return this.enabled.has(type);\n }\n\n /**\n * Get enabled filters\n * @returns {Set} Enabled filter types\n */\n getEnabled() {\n return new Set(this.enabled);\n }\n\n // Filter implementations\n applyBassBoost(options = {}) {\n const gain = options.gain || 1.5;\n const filter = this.audioContext.createBiquadFilter();\n filter.type = 'lowshelf';\n filter.frequency.value = 200;\n filter.gain.value = gain * 10;\n this.filters.set(FILTER_TYPES.BASSBOOST, filter);\n }\n\n applyNightcore(options = {}) {\n const rate = options.rate || 1.2;\n // Nightcore is pitch + speed up\n this.applyPitch({ pitch: rate });\n this.applySpeed({ speed: rate });\n }\n\n applyVaporwave(options = {}) {\n const rate = options.rate || 0.8;\n this.applyPitch({ pitch: rate });\n this.applySpeed({ speed: rate });\n }\n\n apply8DRotate(options = {}) {\n // 8D audio effect using panner\n const panner = this.audioContext.createPanner();\n panner.panningModel = 'HRTF';\n // Would need to animate the position for rotation\n this.filters.set(FILTER_TYPES.ROTATE_8D, panner);\n }\n\n applyPitch(options = {}) {\n const pitch = options.pitch || 1;\n // In Web Audio API, pitch shifting requires AudioWorklet or external library\n // For simplicity, we'll use a basic implementation\n console.warn('Pitch shifting requires AudioWorklet in modern browsers');\n }\n\n applySpeed(options = {}) {\n const speed = options.speed || 1;\n // Speed change affects playback rate\n // This would be handled in the player\n console.log(`Speed filter applied: ${speed}x`);\n }\n\n applyReverb(options = {}) {\n const convolver = this.audioContext.createConvolver();\n // Would need an impulse response for reverb\n // For simplicity, create a basic reverb\n this.filters.set(FILTER_TYPES.REVERB, convolver);\n }\n\n /**\n * Connect filters to audio node\n * @param {AudioNode} input - Input node\n * @param {AudioNode} output - Output node\n */\n connect(input, output) {\n let currentNode = input;\n\n this.filters.forEach(filter => {\n currentNode.connect(filter);\n currentNode = filter;\n });\n\n currentNode.connect(output);\n }\n}","/**\n * Metadata parsing utilities\n */\nexport class MetadataUtils {\n /**\n * Extract basic metadata from URL or file path\n * @param {string} source - URL or file path\n * @returns {Object} Metadata object\n */\n static extract(source) {\n if (!source) return {};\n\n const metadata = {\n title: this.extractTitle(source),\n artist: null,\n duration: null,\n thumbnail: null\n };\n\n // For YouTube URLs\n if (source.includes('youtube.com') || source.includes('youtu.be')) {\n return this.extractYouTubeMetadata(source);\n }\n\n // For SoundCloud URLs\n if (source.includes('soundcloud.com')) {\n return this.extractSoundCloudMetadata(source);\n }\n\n // For local files\n if (!source.startsWith('http')) {\n return this.extractFileMetadata(source);\n }\n\n return metadata;\n }\n\n /**\n * Extract title from source\n * @param {string} source - Source string\n * @returns {string} Extracted title\n */\n static extractTitle(source) {\n if (!source) return 'Unknown Track';\n\n // Try to extract from URL query params\n try {\n const url = new URL(source);\n const title = url.searchParams.get('title') || url.searchParams.get('name');\n if (title) return decodeURIComponent(title);\n } catch {}\n\n // Extract from file path\n const parts = source.split('/').pop().split('\\\\').pop();\n if (parts) {\n return parts.replace(/\\.[^/.]+$/, ''); // Remove extension\n }\n\n return 'Unknown Track';\n }\n\n /**\n * Extract YouTube metadata (basic)\n * @param {string} url - YouTube URL\n * @returns {Object} Metadata\n */\n static extractYouTubeMetadata(url) {\n // Basic extraction, in real implementation would fetch from API\n return {\n title: 'YouTube Track',\n artist: null,\n duration: null,\n thumbnail: null,\n source: 'youtube'\n };\n }\n\n /**\n * Extract SoundCloud metadata (basic)\n * @param {string} url - SoundCloud URL\n * @returns {Object} Metadata\n */\n static extractSoundCloudMetadata(url) {\n // Basic extraction\n return {\n title: 'SoundCloud Track',\n artist: null,\n duration: null,\n thumbnail: null,\n source: 'soundcloud'\n };\n }\n\n /**\n * Extract file metadata (basic)\n * @param {string} path - File path\n * @returns {Object} Metadata\n */\n static extractFileMetadata(path) {\n const title = this.extractTitle(path);\n return {\n title,\n artist: null,\n duration: null,\n thumbnail: null,\n source: 'local'\n };\n }\n}","import { MetadataUtils } from '../utils/Metadata.js';\n\n/**\n * Represents an audio track\n */\nexport class Track {\n /**\n * @param {string} url - Track URL or file path\n * @param {Object} options - Additional options\n */\n constructor(url, options = {}) {\n this.url = url;\n this.title = options.title || MetadataUtils.extract(url).title;\n this.artist = options.artist || null;\n this.duration = options.duration || null;\n this.thumbnail = options.thumbnail || null;\n this.metadata = options.metadata || {};\n this.id = options.id || Math.random().toString(36).substr(2, 9);\n }\n\n /**\n * Get track info\n * @returns {Object} Track information\n */\n getInfo() {\n return {\n id: this.id,\n url: this.url,\n title: this.title,\n artist: this.artist,\n duration: this.duration,\n thumbnail: this.thumbnail,\n metadata: this.metadata\n };\n }\n\n /**\n * Update track metadata\n * @param {Object} metadata - New metadata\n */\n updateMetadata(metadata) {\n Object.assign(this.metadata, metadata);\n }\n\n /**\n * Check if track is valid\n * @returns {boolean} Is valid\n */\n isValid() {\n return !!(this.url && this.title);\n }\n}","import { Track } from './Track.js';\nimport { EventBus } from '../events/EventBus.js';\nimport { EVENTS } from '../constants/Modes.js';\n\n/**\n * Audio queue management\n */\nexport class Queue {\n constructor() {\n this.tracks = [];\n this.currentIndex = -1;\n this.eventBus = new EventBus();\n }\n\n /**\n * Add track(s) to queue\n * @param {Track|Track[]|string|string[]} tracks - Track(s) to add\n * @param {number} position - Position to insert (optional)\n */\n add(tracks, position) {\n const trackArray = Array.isArray(tracks) ? tracks : [tracks];\n\n const processedTracks = trackArray.map(track => {\n if (typeof track === 'string') {\n return new Track(track);\n }\n return track instanceof Track ? track : new Track(track.url, track);\n });\n\n if (position !== undefined && position >= 0 && position <= this.tracks.length) {\n this.tracks.splice(position, 0, ...processedTracks);\n } else {\n this.tracks.push(...processedTracks);\n }\n\n processedTracks.forEach(track => {\n this.eventBus.emit(EVENTS.TRACK_ADD, track);\n });\n }\n\n /**\n * Remove track from queue\n * @param {number|string} identifier - Track index or ID\n * @returns {Track|null} Removed track\n */\n remove(identifier) {\n let index;\n if (typeof identifier === 'number') {\n index = identifier;\n } else {\n index = this.tracks.findIndex(track => track.id === identifier);\n }\n\n if (index < 0 || index >= this.tracks.length) return null;\n\n const removed = this.tracks.splice(index, 1)[0];\n\n if (this.currentIndex > index) {\n this.currentIndex--;\n } else if (this.currentIndex === index) {\n this.currentIndex = -1;\n }\n\n this.eventBus.emit(EVENTS.TRACK_REMOVE, removed);\n return removed;\n }\n\n /**\n * Shuffle the queue\n */\n shuffle() {\n if (this.tracks.length <= 1) return;\n\n // Fisher-Yates shuffle\n for (let i = this.tracks.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [this.tracks[i], this.tracks[j]] = [this.tracks[j], this.tracks[i]];\n }\n\n this.currentIndex = -1;\n this.eventBus.emit(EVENTS.SHUFFLE, this.tracks);\n }\n\n /**\n * Clear the queue\n */\n clear() {\n this.tracks = [];\n this.currentIndex = -1;\n this.eventBus.emit(EVENTS.CLEAR);\n }\n\n /**\n * Jump to specific track\n * @param {number} index - Track index\n * @returns {Track|null} Track at index\n */\n jump(index) {\n if (index < 0 || index >= this.tracks.length) return null;\n this.currentIndex = index;\n return this.tracks[index];\n }\n\n /**\n * Get current track\n * @returns {Track|null} Current track\n */\n getCurrent() {\n return this.currentIndex >= 0 ? this.tracks[this.currentIndex] : null;\n }\n\n /**\n * Get next track\n * @returns {Track|null} Next track\n */\n getNext() {\n if (this.tracks.length === 0) return null;\n this.currentIndex = (this.currentIndex + 1) % this.tracks.length;\n return this.tracks[this.currentIndex];\n }\n\n /**\n * Get previous track\n * @returns {Track|null} Previous track\n */\n getPrevious() {\n if (this.tracks.length === 0) return null;\n this.currentIndex = this.currentIndex <= 0 ? this.tracks.length - 1 : this.currentIndex - 1;\n return this.tracks[this.currentIndex];\n }\n\n /**\n * Get all tracks\n * @returns {Track[]} Array of tracks\n */\n getTracks() {\n return [...this.tracks];\n }\n\n /**\n * Get queue size\n * @returns {number} Number of tracks\n */\n size() {\n return this.tracks.length;\n }\n\n /**\n * Check if queue is empty\n * @returns {boolean} Is empty\n */\n isEmpty() {\n return this.tracks.length === 0;\n }\n\n /**\n * Get track at index\n * @param {number} index - Track index\n * @returns {Track|null} Track at index\n */\n getTrack(index) {\n return index >= 0 && index < this.tracks.length ? this.tracks[index] : null;\n }\n}","import { Player } from './Player.js';\nimport { Filters } from './Filters.js';\nimport { Queue } from '../queue/Queue.js';\nimport { EventBus } from '../events/EventBus.js';\nimport { EVENTS } from '../constants/Modes.js';\n\n/**\n * Main audio engine class\n */\nexport class AudioEngine {\n constructor(options = {}) {\n this.options = options;\n this.audioContext = null;\n this.player = null;\n this.filters = null;\n this.queue = new Queue();\n this.eventBus = new EventBus();\n this.isReady = false;\n\n this.initialize();\n }\n\n /**\n * Initialize the audio engine\n */\n async initialize() {\n try {\n // Create AudioContext\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n\n // Create components\n this.filters = new Filters(this.audioContext);\n this.player = new Player(this);\n\n // Connect event buses\n this.queue.eventBus.on(EVENTS.TRACK_ADD, (track) => this.eventBus.emit(EVENTS.TRACK_ADD, track));\n this.queue.eventBus.on(EVENTS.TRACK_REMOVE, (track) => this.eventBus.emit(EVENTS.TRACK_REMOVE, track));\n this.player.eventBus.on(EVENTS.PLAY, (data) => this.eventBus.emit(EVENTS.PLAY, data));\n this.player.eventBus.on(EVENTS.PAUSE, () => this.eventBus.emit(EVENTS.PAUSE));\n this.player.eventBus.on(EVENTS.STOP, () => this.eventBus.emit(EVENTS.STOP));\n this.player.eventBus.on(EVENTS.ERROR, (error) => this.eventBus.emit(EVENTS.ERROR, error));\n this.player.eventBus.on(EVENTS.TRACK_START, (track) => this.eventBus.emit(EVENTS.TRACK_START, track));\n this.player.eventBus.on(EVENTS.TRACK_END, (track) => this.eventBus.emit(EVENTS.TRACK_END, track));\n\n this.isReady = true;\n this.eventBus.emit(EVENTS.READY);\n } catch (error) {\n this.eventBus.emit(EVENTS.ERROR, error);\n }\n }\n\n /**\n * Play track or resume playback\n * @param {Track|string} track - Track to play or track identifier\n */\n async play(track) {\n if (!this.isReady) return;\n\n if (track) {\n const trackObj = typeof track === 'string' ? this.queue.getCurrent() : track;\n await this.player.play(trackObj);\n } else {\n this.player.resume();\n }\n }\n\n /**\n * Pause playback\n */\n pause() {\n this.player.pause();\n }\n\n /**\n * Stop playback\n */\n stop() {\n this.player.stop();\n }\n\n /**\n * Seek to position\n * @param {number} time - Time in seconds\n */\n seek(time) {\n this.player.seek(time);\n }\n\n /**\n * Set volume\n * @param {number} volume - Volume level (0-1)\n */\n setVolume(volume) {\n this.player.setVolume(volume);\n }\n\n /**\n * Add track(s) to queue\n * @param {Track|Track[]|string|string[]} tracks - Track(s) to add\n */\n add(tracks) {\n this.queue.add(tracks);\n }\n\n /**\n * Remove track from queue\n * @param {number|string} identifier - Track index or ID\n */\n remove(identifier) {\n return this.queue.remove(identifier);\n }\n\n /**\n * Skip to next track\n */\n next() {\n const nextTrack = this.queue.getNext();\n if (nextTrack) {\n this.play(nextTrack);\n }\n }\n\n /**\n * Go to previous track\n */\n previous() {\n const prevTrack = this.queue.getPrevious();\n if (prevTrack) {\n this.play(prevTrack);\n }\n }\n\n /**\n * Shuffle queue\n */\n shuffle() {\n this.queue.shuffle();\n }\n\n /**\n * Clear queue\n */\n clear() {\n this.queue.clear();\n }\n\n /**\n * Jump to track in queue\n * @param {number} index - Track index\n */\n jump(index) {\n const track = this.queue.jump(index);\n if (track) {\n this.play(track);\n }\n }\n\n /**\n * Apply audio filter\n * @param {string} type - Filter type\n * @param {Object} options - Filter options\n */\n applyFilter(type, options) {\n this.filters.apply(type, options);\n this.eventBus.emit(EVENTS.FILTER_APPLIED, { type, options });\n }\n\n /**\n * Remove audio filter\n * @param {string} type - Filter type\n */\n removeFilter(type) {\n this.filters.remove(type);\n }\n\n /**\n * Set loop mode\n * @param {string} mode - Loop mode\n */\n setLoopMode(mode) {\n this.player.setLoopMode(mode);\n }\n\n /**\n * Get current state\n * @returns {Object} Engine state\n */\n getState() {\n return {\n isReady: this.isReady,\n isPlaying: this.player ? this.player.isPlaying : false,\n currentTrack: this.queue.getCurrent(),\n queue: this.queue.getTracks(),\n volume: this.player ? this.player.volume : 1,\n loopMode: this.player ? this.player.loopMode : LOOP_MODES.OFF,\n filters: this.filters ? this.filters.getEnabled() : new Set()\n };\n }\n\n /**\n * Destroy the engine\n */\n destroy() {\n if (this.audioContext) {\n this.audioContext.close();\n }\n this.filters.clear();\n this.player.stop();\n }\n}","/**\n * Base plugin class\n */\nexport class Plugin {\n constructor(name, version = '1.0.0') {\n this.name = name;\n this.version = version;\n this.enabled = false;\n this.loaded = false;\n }\n\n /**\n * Called when plugin is loaded\n * @param {AudioEngine} engine - Audio engine instance\n */\n onLoad(engine) {\n this.engine = engine;\n this.loaded = true;\n }\n\n /**\n * Called when plugin is enabled\n */\n onEnable() {\n this.enabled = true;\n }\n\n /**\n * Called when plugin is disabled\n */\n onDisable() {\n this.enabled = false;\n }\n\n /**\n * Hook called before play\n * @param {Track} track - Track being played\n */\n beforePlay(track) {\n // Override in subclass\n }\n\n /**\n * Hook called after play\n * @param {Track} track - Track being played\n */\n afterPlay(track) {\n // Override in subclass\n }\n\n /**\n * Hook called when track ends\n * @param {Track} track - Track that ended\n */\n trackEnd(track) {\n // Override in subclass\n }\n\n /**\n * Hook called when queue updates\n * @param {Queue} queue - Updated queue\n */\n queueUpdate(queue) {\n // Override in subclass\n }\n\n /**\n * Get plugin info\n * @returns {Object} Plugin information\n */\n getInfo() {\n return {\n name: this.name,\n version: this.version,\n enabled: this.enabled,\n loaded: this.loaded\n };\n }\n}","import { Plugin } from './Plugin.js';\n\n/**\n * Plugin manager for loading and managing plugins\n */\nexport class PluginManager {\n constructor(audioEngine) {\n this.engine = audioEngine;\n this.plugins = new Map();\n }\n\n /**\n * Load a plugin\n * @param {Plugin} plugin - Plugin instance\n */\n load(plugin) {\n if (!(plugin instanceof Plugin)) {\n throw new Error('Invalid plugin instance');\n }\n\n plugin.onLoad(this.engine);\n this.plugins.set(plugin.name, plugin);\n }\n\n /**\n * Enable a plugin\n * @param {string} name - Plugin name\n */\n enable(name) {\n const plugin = this.plugins.get(name);\n if (plugin && !plugin.enabled) {\n plugin.onEnable();\n }\n }\n\n /**\n * Disable a plugin\n * @param {string} name - Plugin name\n */\n disable(name) {\n const plugin = this.plugins.get(name);\n if (plugin && plugin.enabled) {\n plugin.onDisable();\n }\n }\n\n /**\n * Unload a plugin\n * @param {string} name - Plugin name\n */\n unload(name) {\n const plugin = this.plugins.get(name);\n if (plugin) {\n if (plugin.enabled) {\n plugin.onDisable();\n }\n this.plugins.delete(name);\n }\n }\n\n /**\n * Get plugin by name\n * @param {string} name - Plugin name\n * @returns {Plugin|null} Plugin instance\n */\n get(name) {\n return this.plugins.get(name) || null;\n }\n\n /**\n * Get all plugins\n * @returns {Map} Map of plugins\n */\n getAll() {\n return new Map(this.plugins);\n }\n\n /**\n * Get enabled plugins\n * @returns {Plugin[]} Array of enabled plugins\n */\n getEnabled() {\n return Array.from(this.plugins.values()).filter(plugin => plugin.enabled);\n }\n\n /**\n * Call hook on all enabled plugins\n * @param {string} hook - Hook name\n * @param {...*} args - Arguments to pass\n */\n callHook(hook, ...args) {\n this.getEnabled().forEach(plugin => {\n if (typeof plugin[hook] === 'function') {\n try {\n plugin[hook](...args);\n } catch (error) {\n console.error(`Error in plugin ${plugin.name} hook ${hook}:`, error);\n }\n }\n });\n }\n}","/**\n * Logger utility with different levels\n */\nexport class Logger {\n constructor(level = 'info') {\n this.levels = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3\n };\n this.currentLevel = this.levels[level] || this.levels.info;\n }\n\n /**\n * Set log level\n * @param {string} level - Log level (debug, info, warn, error)\n */\n setLevel(level) {\n this.currentLevel = this.levels[level] || this.levels.info;\n }\n\n /**\n * Debug log\n * @param {...*} args - Arguments to log\n */\n debug(...args) {\n if (this.currentLevel <= this.levels.debug) {\n console.debug('[DEBUG]', ...args);\n }\n }\n\n /**\n * Info log\n * @param {...*} args - Arguments to log\n */\n info(...args) {\n if (this.currentLevel <= this.levels.info) {\n console.info('[INFO]', ...args);\n }\n }\n\n /**\n * Warning log\n * @param {...*} args - Arguments to log\n */\n warn(...args) {\n if (this.currentLevel <= this.levels.warn) {\n console.warn('[WARN]', ...args);\n }\n }\n\n /**\n * Error log\n * @param {...*} args - Arguments to log\n */\n error(...args) {\n if (this.currentLevel <= this.levels.error) {\n console.error('[ERROR]', ...args);\n }\n }\n}\n\n// Default logger instance\nexport const logger = new Logger();","/**\n * Time formatting utilities\n */\nexport class TimeUtils {\n /**\n * Format seconds to MM:SS or HH:MM:SS\n * @param {number} seconds - Time in seconds\n * @returns {string} Formatted time string\n */\n static format(seconds) {\n if (!Number.isFinite(seconds) || seconds < 0) return '00:00';\n\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n }\n\n /**\n * Parse time string to seconds\n * @param {string} timeStr - Time string like \"1:23\" or \"01:23:45\"\n * @returns {number} Time in seconds\n */\n static parse(timeStr) {\n if (!timeStr || typeof timeStr !== 'string') return 0;\n\n const parts = timeStr.split(':').map(Number);\n if (parts.length === 2) {\n return parts[0] * 60 + parts[1];\n } else if (parts.length === 3) {\n return parts[0] * 3600 + parts[1] * 60 + parts[2];\n }\n return 0;\n }\n\n /**\n * Get current timestamp in milliseconds\n * @returns {number} Current time\n */\n static now() {\n return Date.now();\n }\n\n /**\n * Calculate duration between two timestamps\n * @param {number} start - Start time\n * @param {number} end - End time\n * @returns {number} Duration in milliseconds\n */\n static duration(start, end) {\n return end - start;\n }\n}","/**\n * Audio probing utilities\n */\nexport class ProbeUtils {\n /**\n * Probe audio file/stream for basic info\n * @param {string|Buffer|ReadableStream} source - Audio source\n * @returns {Promise<Object>} Probe result\n */\n static async probe(source) {\n // In a real implementation, this would use ffprobe or similar\n // For now, return basic mock data\n return {\n duration: null, // seconds\n format: null, // e.g., 'mp3', 'wav'\n bitrate: null, // kbps\n sampleRate: null, // Hz\n channels: null // 1 or 2\n };\n }\n\n /**\n * Check if source is a valid audio URL\n * @param {string} url - URL to check\n * @returns {boolean} Is valid audio URL\n */\n static isValidAudioUrl(url) {\n if (!url || typeof url !== 'string') return false;\n\n try {\n const parsed = new URL(url);\n const audioExtensions = ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a'];\n const path = parsed.pathname.toLowerCase();\n\n return audioExtensions.some(ext => path.endsWith(ext)) ||\n url.includes('youtube.com') ||\n url.includes('youtu.be') ||\n url.includes('soundcloud.com');\n } catch {\n return false;\n }\n }\n\n /**\n * Get audio format from URL or buffer\n * @param {string|Buffer} source - Audio source\n * @returns {string|null} Audio format\n */\n static getFormat(source) {\n if (typeof source === 'string') {\n const extensions = ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a'];\n for (const ext of extensions) {\n if (source.toLowerCase().includes(`.${ext}`)) {\n return ext;\n }\n }\n }\n // For buffer, would need to check headers\n return null;\n }\n}","/**\n * YouTube provider for basic info fetching\n */\nexport class YouTubeProvider {\n /**\n * Check if URL is a valid YouTube URL\n * @param {string} url - URL to check\n * @returns {boolean} Is valid YouTube URL\n */\n static isValidUrl(url) {\n return url.includes('youtube.com/watch') || url.includes('youtu.be/');\n }\n\n /**\n * Extract video ID from YouTube URL\n * @param {string} url - YouTube URL\n * @returns {string|null} Video ID\n */\n static extractVideoId(url) {\n try {\n const urlObj = new URL(url);\n if (urlObj.hostname === 'youtu.be') {\n return urlObj.pathname.slice(1);\n }\n return urlObj.searchParams.get('v');\n } catch {\n return null;\n }\n }\n\n /**\n * Get basic track info from YouTube URL\n * @param {string} url - YouTube URL\n * @returns {Promise<Object>} Track info\n */\n static async getInfo(url) {\n const videoId = this.extractVideoId(url);\n if (!videoId) {\n throw new Error('Invalid YouTube URL');\n }\n\n // In a real implementation, this would call YouTube API\n // For now, return mock data\n return {\n title: `YouTube Video ${videoId}`,\n artist: null,\n duration: null,\n thumbnail: `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`,\n url: url,\n source: 'youtube',\n videoId: videoId\n };\n }\n\n /**\n * Get stream URL (not implemented without dependencies)\n * @param {string} url - YouTube URL\n * @returns {Promise<string>} Stream URL\n */\n static async getStreamUrl(url) {\n // Would require ytdl-core or similar\n throw new Error('Stream URL extraction requires additional dependencies');\n }\n}","/**\n * SoundCloud provider for basic info fetching\n */\nexport class SoundCloudProvider {\n /**\n * Check if URL is a valid SoundCloud URL\n * @param {string} url - URL to check\n * @returns {boolean} Is valid SoundCloud URL\n */\n static isValidUrl(url) {\n return url.includes('soundcloud.com/');\n }\n\n /**\n * Get basic track info from SoundCloud URL\n * @param {string} url - SoundCloud URL\n * @returns {Promise<Object>} Track info\n */\n static async getInfo(url) {\n // In a real implementation, this would call SoundCloud API\n // For now, return mock data\n return {\n title: 'SoundCloud Track',\n artist: null,\n duration: null,\n thumbnail: null,\n url: url,\n source: 'soundcloud'\n };\n }\n\n /**\n * Get stream URL (not implemented without dependencies)\n * @param {string} url - SoundCloud URL\n * @returns {Promise<string>} Stream URL\n */\n static async getStreamUrl(url) {\n // Would require soundcloud-scraper or similar\n throw new Error('Stream URL extraction requires additional dependencies');\n }\n}","import { promises as fs } from 'fs';\nimport { extname } from 'path';\n\n/**\n * Local file provider for Node.js\n */\nexport class LocalProvider {\n /**\n * Check if path is a valid local audio file\n * @param {string} path - File path\n * @returns {boolean} Is valid audio file\n */\n static isValidPath(path) {\n const audioExtensions = ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a'];\n return audioExtensions.includes(extname(path).toLowerCase());\n }\n\n /**\n * Get track info from local file\n * @param {string} path - File path\n * @returns {Promise<Object>} Track info\n */\n static async getInfo(path) {\n try {\n const stats = await fs.stat(path);\n if (!stats.isFile()) {\n throw new Error('Path is not a file');\n }\n\n return {\n title: path.split('/').pop().replace(extname(path), ''),\n artist: null,\n duration: null, // Would need audio parsing library\n thumbnail: null,\n url: `file://${path}`,\n source: 'local',\n size: stats.size,\n modified: stats.mtime\n };\n } catch (error) {\n throw new Error(`Failed to get file info: ${error.message}`);\n }\n }\n\n /**\n * Check if file exists\n * @param {string} path - File path\n * @returns {Promise<boolean>} File exists\n */\n static async exists(path) {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n }\n}"],"names":["LOOP_MODES","path","extname","fs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/constants/index.ts","../../src/events/EventBus.ts","../../src/engine/MockAudioContext.ts","../../src/engine/Player.ts","../../src/engine/Filters.ts","../../src/utils/Metadata.ts","../../src/queue/Track.ts","../../src/queue/Queue.ts","../../src/providers/ProviderRegistry.ts","../../src/providers/LocalProvider.ts","../../src/providers/YouTubeProvider.ts","../../src/providers/SpotifyProvider.ts","../../src/providers/LavalinkProvider.ts","../../src/plugins/PluginManager.ts","../../src/AudioEngine.ts","../../src/plugins/Plugin.ts","../../src/utils/Logger.ts","../../src/utils/Time.ts"],"sourcesContent":["export const EVENTS = {\n READY: 'ready',\n ERROR: 'error',\n PLAY: 'play',\n PAUSE: 'pause',\n STOP: 'stop',\n TRACK_START: 'trackStart',\n TRACK_END: 'trackEnd',\n TRACK_ADD: 'trackAdd',\n TRACK_REMOVE: 'trackRemove',\n QUEUE_UPDATE: 'queueUpdate',\n FILTER_APPLIED: 'filterApplied',\n VOLUME_CHANGE: 'volumeChange',\n SEEK: 'seek'\n} as const;\n\nexport type EventType = typeof EVENTS[keyof typeof EVENTS];\n\nexport const LOOP_MODES = {\n OFF: 'off',\n TRACK: 'track',\n QUEUE: 'queue'\n} as const;\n\nexport type LoopMode = typeof LOOP_MODES[keyof typeof LOOP_MODES];\n\nexport const PLAYER_STATES = {\n IDLE: 'idle',\n PLAYING: 'playing',\n PAUSED: 'paused',\n BUFFERING: 'buffering'\n} as const;\n\nexport type PlayerState = typeof PLAYER_STATES[keyof typeof PLAYER_STATES];\n\nexport const FILTER_TYPES = {\n BASSBOOST: 'bassboost',\n NIGHTCORE: 'nightcore',\n VAPORWAVE: 'vaporwave',\n ROTATE_8D: '8d',\n PITCH: 'pitch',\n SPEED: 'speed',\n REVERB: 'reverb'\n} as const;\n\nexport type FilterType = typeof FILTER_TYPES[keyof typeof FILTER_TYPES];\n","export type Listener = (data?: any) => void;\n\n/**\n * Simple event emitter for handling events\n */\nexport class EventBus {\n private events: Record<string, Listener[]>;\n\n constructor() {\n this.events = {};\n }\n\n /**\n * Register an event listener\n * @param event - Event name\n * @param callback - Callback function\n */\n on(event: string, callback: Listener): void {\n if (!this.events[event]) {\n this.events[event] = [];\n }\n this.events[event].push(callback);\n }\n\n /**\n * Remove an event listener\n * @param event - Event name\n * @param callback - Callback function\n */\n off(event: string, callback: Listener): void {\n if (!this.events[event]) return;\n this.events[event] = this.events[event].filter(cb => cb !== callback);\n }\n\n /**\n * Emit an event\n * @param event - Event name\n * @param data - Data to pass to listeners\n */\n emit(event: string, data?: any): void {\n if (!this.events[event]) return;\n this.events[event].forEach(callback => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n\n /**\n * Remove all listeners for an event\n * @param event - Event name\n */\n removeAllListeners(event: string): void {\n delete this.events[event];\n }\n\n /**\n * Get all listeners for an event\n * @param event - Event name\n * @returns Array of listeners\n */\n listeners(event: string): Listener[] {\n return this.events[event] || [];\n }\n}\n","export class MockAudioContext {\n state: string = 'running';\n currentTime: number = 0;\n private startTime: number = Date.now();\n\n constructor() {\n this.updateTime();\n }\n\n private updateTime() {\n if (this.state === 'running') {\n const diff = (Date.now() - this.startTime) / 1000;\n this.currentTime = diff;\n }\n // Simulate clock\n if (typeof setTimeout !== 'undefined') {\n setTimeout(() => this.updateTime(), 100);\n }\n }\n\n createGain() { return { connect: () => {}, gain: { value: 0 } }; }\n createBiquadFilter() { return { connect: () => {}, frequency: { value: 0 }, gain: { value: 0 } }; }\n createPanner() { return { connect: () => {} }; }\n createConvolver() { return { connect: () => {} }; }\n \n createBufferSource() { \n return new MockAudioBufferSource(this);\n }\n \n async decodeAudioData(buffer: ArrayBuffer): Promise<any> {\n return { duration: 5 }; // Mock 5 seconds duration\n }\n\n suspend() { this.state = 'suspended'; }\n resume() { this.state = 'running'; this.startTime = Date.now() - (this.currentTime * 1000); }\n close() { this.state = 'closed'; }\n}\n\nclass MockAudioBufferSource {\n buffer: any = null;\n onended: (() => void) | null = null;\n private context: MockAudioContext;\n\n constructor(context: MockAudioContext) {\n this.context = context;\n }\n\n connect() {}\n \n start(when: number = 0, offset: number = 0) {\n // Simulate playback duration\n const duration = this.buffer ? this.buffer.duration : 0;\n setTimeout(() => {\n if (this.onended) this.onended();\n }, duration * 1000); // Speed up for tests? No, keep real time or fast? \n // 5 seconds mock duration might be too long for quick examples.\n // Let's make it 1 second for examples unless buffer says otherwise.\n }\n\n stop() {\n if (this.onended) this.onended();\n }\n}\n","import { LOOP_MODES, EVENTS, LoopMode } from '../constants';\nimport { EventBus } from '../events/EventBus';\nimport { ITrack } from '../interfaces';\nimport { AudioEngine } from '../AudioEngine';\nimport { MockAudioContext } from './MockAudioContext';\n\n/**\n * Audio player with playback controls\n */\nexport class Player {\n private audioEngine: AudioEngine;\n // @ts-ignore\n public audioContext: AudioContext;\n private source: AudioBufferSourceNode | null;\n public isPlaying: boolean;\n public currentTime: number;\n public duration: number;\n public volume: number;\n public loopMode: LoopMode;\n public eventBus: EventBus;\n\n constructor(audioEngine: AudioEngine) {\n this.audioEngine = audioEngine;\n \n let AudioContextClass: any;\n if (typeof window !== 'undefined') {\n AudioContextClass = window.AudioContext || (window as any).webkitAudioContext;\n } else {\n AudioContextClass = (global as any).AudioContext;\n }\n\n if (AudioContextClass) {\n this.audioContext = new AudioContextClass();\n } else {\n this.audioContext = new MockAudioContext() as unknown as AudioContext;\n }\n\n this.source = null;\n this.isPlaying = false;\n this.currentTime = 0;\n this.duration = 0;\n this.volume = 1;\n this.loopMode = LOOP_MODES.OFF;\n this.eventBus = new EventBus();\n }\n\n /**\n * Play audio track\n * @param track - Track to play\n */\n async play(track: ITrack): Promise<void> {\n if (!track) return;\n\n // Reset state\n this.stop();\n\n try {\n this.eventBus.emit(EVENTS.PLAY, track);\n \n // Check providers via registry\n const provider = this.audioEngine.getProvider(track.source || 'local');\n if (provider) {\n await provider.play(track);\n } else {\n // Fallback to direct URL playback if no specific provider found\n await this.playStream(track);\n }\n \n this.eventBus.emit(EVENTS.TRACK_START, track);\n } catch (error) {\n console.error(error);\n this.eventBus.emit(EVENTS.ERROR, error);\n }\n }\n\n /**\n * Play audio from URL/Stream directly\n * This is called by Providers or as fallback\n * @param track - Track object with URL\n */\n async playStream(track: ITrack): Promise<void> {\n if (!this.audioContext) throw new Error('AudioContext not available');\n\n // If already playing, stop\n if (this.source) {\n this.source.stop();\n }\n\n try {\n // Fetch audio data\n // For Node.js (Mock), we might fail to fetch if it's a real URL\n // If MockAudioContext is used, we probably want to skip fetch?\n // Or Mock fetch? \n \n // In Node environment, fetch is global in recent versions (v18+)\n // But if we are mocking, we can't really \"decode\" the buffer from a remote stream easily without logic.\n // My MockAudioContext.decodeAudioData returns a mock buffer.\n \n let audioBuffer;\n \n // Check if real fetch is feasible\n if (this.audioContext instanceof MockAudioContext) {\n // Mock fetch behavior if needed or just create dummy buffer\n audioBuffer = await this.audioContext.decodeAudioData(new ArrayBuffer(0));\n } else {\n const response = await fetch(track.url);\n const arrayBuffer = await response.arrayBuffer();\n audioBuffer = await this.audioContext.decodeAudioData(arrayBuffer);\n }\n\n this.source = this.audioContext.createBufferSource();\n this.source.buffer = audioBuffer;\n this.duration = audioBuffer.duration;\n\n // Connect through filters\n this.audioEngine.filters.connect(this.source, this.audioContext.destination);\n\n // Handle end of track\n this.source.onended = () => {\n this.isPlaying = false;\n this.eventBus.emit(EVENTS.TRACK_END, track);\n this.handleTrackEnd();\n };\n\n this.source.start(0);\n this.isPlaying = true;\n } catch (error) {\n throw new Error(`Failed to play stream: ${error}`);\n }\n }\n\n /**\n * Pause playback\n */\n pause(): void {\n if (this.audioContext.state === 'running') {\n this.audioContext.suspend();\n this.isPlaying = false;\n this.eventBus.emit(EVENTS.PAUSE);\n }\n }\n\n /**\n * Resume playback\n */\n resume(): void {\n if (this.audioContext.state === 'suspended') {\n this.audioContext.resume();\n this.isPlaying = true;\n this.eventBus.emit(EVENTS.PLAY);\n }\n }\n\n /**\n * Stop playback\n */\n stop(): void {\n if (this.source) {\n try {\n this.source.stop();\n } catch (e) {\n // Ignore if already stopped\n }\n this.source = null;\n }\n this.isPlaying = false;\n this.currentTime = 0;\n this.eventBus.emit(EVENTS.STOP);\n }\n\n /**\n * Seek to position\n * @param time - Time in seconds\n */\n seek(time: number): void {\n if (this.source && this.isPlaying) {\n // TODO: Implement proper seek\n console.warn('Seek not fully implemented for Web Audio BufferSource');\n }\n this.currentTime = Math.max(0, Math.min(time, this.duration));\n }\n\n /**\n * Set volume\n * @param volume - Volume level (0-1)\n */\n setVolume(volume: number): void {\n this.volume = Math.max(0, Math.min(1, volume));\n }\n\n /**\n * Set loop mode\n * @param mode - Loop mode\n */\n setLoopMode(mode: LoopMode): void {\n this.loopMode = mode;\n }\n\n /**\n * Handle track end based on loop mode\n */\n private handleTrackEnd(): void {\n if (this.loopMode === LOOP_MODES.TRACK) {\n // Replay current track\n const current = this.audioEngine.queue.getCurrent();\n if (current) this.play(current);\n } else if (this.loopMode === LOOP_MODES.QUEUE) {\n // Play next in queue\n const next = this.audioEngine.queue.next(true);\n if (next) this.play(next);\n } else {\n // Loop OFF: Play next or stop\n const next = this.audioEngine.queue.next(false);\n if (next) {\n this.play(next);\n } else {\n this.stop();\n }\n }\n }\n\n /**\n * Get current playback state\n * @returns State object\n */\n getState(): any {\n return {\n isPlaying: this.isPlaying,\n currentTime: this.audioContext.currentTime,\n duration: this.duration,\n volume: this.volume,\n loopMode: this.loopMode\n };\n }\n}","import { FILTER_TYPES, FilterType } from '../constants';\n\n/**\n * Audio filters and effects\n */\nexport class Filters {\n private audioContext: AudioContext;\n private filters: Map<FilterType, AudioNode>;\n private enabled: Set<FilterType>;\n\n constructor(audioContext: AudioContext) {\n this.audioContext = audioContext;\n this.filters = new Map();\n this.enabled = new Set();\n }\n\n /**\n * Apply filter\n * @param type - Filter type\n * @param options - Filter options\n */\n apply(type: FilterType, options: any = {}): void {\n if (!this.audioContext) return;\n\n switch (type) {\n case FILTER_TYPES.BASSBOOST:\n this.applyBassBoost(options);\n break;\n case FILTER_TYPES.NIGHTCORE:\n this.applyNightcore(options);\n break;\n case FILTER_TYPES.VAPORWAVE:\n this.applyVaporwave(options);\n break;\n case FILTER_TYPES.ROTATE_8D:\n this.apply8DRotate(options);\n break;\n case FILTER_TYPES.PITCH:\n this.applyPitch(options);\n break;\n case FILTER_TYPES.SPEED:\n this.applySpeed(options);\n break;\n case FILTER_TYPES.REVERB:\n this.applyReverb(options);\n break;\n }\n\n this.enabled.add(type);\n }\n\n /**\n * Remove filter\n * @param type - Filter type\n */\n remove(type: FilterType): void {\n if (this.filters.has(type)) {\n const filter = this.filters.get(type);\n filter?.disconnect();\n this.filters.delete(type);\n this.enabled.delete(type);\n }\n }\n\n /**\n * Clear all filters\n */\n clear(): void {\n this.filters.forEach(filter => filter.disconnect());\n this.filters.clear();\n this.enabled.clear();\n }\n\n /**\n * Check if filter is enabled\n * @param type - Filter type\n * @returns Is enabled\n */\n isEnabled(type: FilterType): boolean {\n return this.enabled.has(type);\n }\n\n /**\n * Get enabled filters\n * @returns Enabled filter types\n */\n getEnabled(): Set<FilterType> {\n return new Set(this.enabled);\n }\n\n // Filter implementations\n private applyBassBoost(options: any = {}): void {\n const gain = options.gain || 1.5;\n const filter = this.audioContext.createBiquadFilter();\n filter.type = 'lowshelf';\n filter.frequency.value = 200;\n filter.gain.value = gain * 10;\n this.filters.set(FILTER_TYPES.BASSBOOST, filter);\n }\n\n private applyNightcore(options: any = {}): void {\n const rate = options.rate || 1.2;\n // Nightcore is pitch + speed up\n this.applyPitch({ pitch: rate });\n this.applySpeed({ speed: rate });\n }\n\n private applyVaporwave(options: any = {}): void {\n const rate = options.rate || 0.8;\n this.applyPitch({ pitch: rate });\n this.applySpeed({ speed: rate });\n }\n\n private apply8DRotate(options: any = {}): void {\n // 8D audio effect using panner\n const panner = this.audioContext.createPanner();\n panner.panningModel = 'HRTF';\n // Would need to animate the position for rotation\n this.filters.set(FILTER_TYPES.ROTATE_8D, panner);\n }\n\n private applyPitch(options: any = {}): void {\n const pitch = options.pitch || 1;\n // In Web Audio API, pitch shifting requires AudioWorklet or external library\n // For simplicity, we'll use a basic implementation or just log it\n // console.warn('Pitch shifting requires AudioWorklet in modern browsers');\n }\n\n private applySpeed(options: any = {}): void {\n const speed = options.speed || 1;\n // Speed change affects playback rate\n // This would be handled in the player\n // console.log(`Speed filter applied: ${speed}x`);\n }\n\n private applyReverb(options: any = {}): void {\n const convolver = this.audioContext.createConvolver();\n // Would need an impulse response for reverb\n // For simplicity, create a basic reverb\n this.filters.set(FILTER_TYPES.REVERB, convolver);\n }\n\n /**\n * Connect filters to audio node\n * @param input - Input node\n * @param output - Output node\n */\n connect(input: AudioNode, output: AudioNode): void {\n let currentNode = input;\n\n this.filters.forEach(filter => {\n currentNode.connect(filter);\n currentNode = filter;\n });\n\n currentNode.connect(output);\n }\n}\n","import { ITrack } from '../interfaces';\n\n/**\n * Metadata parsing utilities\n */\nexport class MetadataUtils {\n /**\n * Extract basic metadata from URL or file path\n * @param source - URL or file path\n * @returns Metadata object\n */\n static extract(source: string): Partial<ITrack> {\n if (!source) return {};\n\n const metadata: Partial<ITrack> = {\n title: this.extractTitle(source),\n artist: undefined,\n duration: undefined,\n thumbnail: undefined\n };\n\n // For YouTube URLs\n if (source.includes('youtube.com') || source.includes('youtu.be')) {\n return this.extractYouTubeMetadata(source);\n }\n\n // For SoundCloud URLs\n if (source.includes('soundcloud.com')) {\n return this.extractSoundCloudMetadata(source);\n }\n\n // For local files\n if (!source.startsWith('http')) {\n return this.extractFileMetadata(source);\n }\n\n return metadata;\n }\n\n /**\n * Extract title from source\n * @param source - Source string\n * @returns Extracted title\n */\n static extractTitle(source: string): string {\n if (!source) return 'Unknown Track';\n\n // Try to extract from URL query params\n try {\n const url = new URL(source);\n const title = url.searchParams.get('title') || url.searchParams.get('name');\n if (title) return decodeURIComponent(title);\n } catch {} // eslint-disable-line no-empty\n\n // Extract from file path\n const parts = source.split('/').pop()?.split('\\\\').pop();\n if (parts) {\n return parts.replace(/\\.[^/.]+$/, ''); // Remove extension\n }\n\n return 'Unknown Track';\n }\n\n /**\n * Extract YouTube metadata (basic)\n * @param url - YouTube URL\n * @returns Metadata\n */\n private static extractYouTubeMetadata(url: string): Partial<ITrack> {\n return {\n title: 'YouTube Track',\n source: 'youtube'\n };\n }\n\n /**\n * Extract SoundCloud metadata (basic)\n * @param url - SoundCloud URL\n * @returns Metadata\n */\n private static extractSoundCloudMetadata(url: string): Partial<ITrack> {\n return {\n title: 'SoundCloud Track',\n source: 'soundcloud'\n };\n }\n\n /**\n * Extract file metadata (basic)\n * @param path - File path\n * @returns Metadata\n */\n private static extractFileMetadata(path: string): Partial<ITrack> {\n const title = this.extractTitle(path);\n return {\n title,\n source: 'local'\n };\n }\n}\n","import { MetadataUtils } from '../utils/Metadata';\nimport { ITrack } from '../interfaces';\n\n/**\n * Represents an audio track\n */\nexport class Track implements ITrack {\n public id: string;\n public url: string;\n public title: string;\n public artist?: string;\n public duration?: number;\n public thumbnail?: string;\n public source?: string;\n public metadata: Record<string, any>;\n\n /**\n * @param url - Track URL or file path\n * @param options - Additional options\n */\n constructor(url: string, options: Partial<ITrack> = {}) {\n const extracted = MetadataUtils.extract(url);\n \n this.url = url;\n this.title = options.title || extracted.title || 'Unknown Title';\n this.artist = options.artist || extracted.artist;\n this.duration = options.duration || extracted.duration;\n this.thumbnail = options.thumbnail || extracted.thumbnail;\n this.source = options.source || extracted.source || 'unknown';\n this.metadata = options.metadata || {};\n this.id = options.id || Math.random().toString(36).substr(2, 9);\n }\n\n /**\n * Get track info\n * @returns Track information\n */\n getInfo(): ITrack {\n return {\n id: this.id,\n url: this.url,\n title: this.title,\n artist: this.artist,\n duration: this.duration,\n thumbnail: this.thumbnail,\n source: this.source,\n metadata: this.metadata\n };\n }\n\n /**\n * Update track metadata\n * @param metadata - New metadata\n */\n updateMetadata(metadata: Partial<ITrack>): void {\n Object.assign(this, metadata);\n if (metadata.metadata) {\n Object.assign(this.metadata, metadata.metadata);\n }\n }\n\n /**\n * Check if track is valid\n * @returns Is valid\n */\n isValid(): boolean {\n return !!(this.url && this.title);\n }\n}\n","import { Track } from './Track';\nimport { EventBus } from '../events/EventBus';\nimport { EVENTS } from '../constants';\nimport { ITrack } from '../interfaces';\n\n/**\n * Audio queue management\n */\nexport class Queue {\n private tracks: Track[];\n private currentIndex: number;\n public eventBus: EventBus;\n\n constructor() {\n this.tracks = [];\n this.currentIndex = -1;\n this.eventBus = new EventBus();\n }\n\n /**\n * Add track(s) to queue\n * @param tracks - Track(s) to add\n * @param position - Position to insert (optional)\n */\n add(tracks: Track | ITrack | (Track | ITrack)[] | string | string[], position?: number): void {\n const trackArray = Array.isArray(tracks) ? tracks : [tracks];\n\n const processedTracks = trackArray.map(track => {\n if (typeof track === 'string') {\n return new Track(track);\n }\n if (track instanceof Track) {\n return track;\n }\n // It's ITrack or similar object\n return new Track(track.url, track);\n });\n\n if (position !== undefined && position >= 0 && position <= this.tracks.length) {\n this.tracks.splice(position, 0, ...processedTracks);\n } else {\n this.tracks.push(...processedTracks);\n }\n\n processedTracks.forEach(track => {\n this.eventBus.emit(EVENTS.TRACK_ADD, track);\n });\n this.eventBus.emit(EVENTS.QUEUE_UPDATE, this.tracks);\n }\n\n /**\n * Remove track from queue\n * @param identifier - Track index or ID\n * @returns Removed track\n */\n remove(identifier: number | string): Track | null {\n let index: number;\n if (typeof identifier === 'number') {\n index = identifier;\n } else {\n index = this.tracks.findIndex(track => track.id === identifier);\n }\n\n if (index < 0 || index >= this.tracks.length) return null;\n\n const removed = this.tracks.splice(index, 1)[0];\n\n if (this.currentIndex > index) {\n this.currentIndex--;\n } else if (this.currentIndex === index) {\n this.currentIndex = -1;\n }\n\n this.eventBus.emit(EVENTS.TRACK_REMOVE, removed);\n this.eventBus.emit(EVENTS.QUEUE_UPDATE, this.tracks);\n return removed;\n }\n\n /**\n * Shuffle the queue\n */\n shuffle(): void {\n if (this.tracks.length <= 1) return;\n\n let currentTrack: Track | null = null;\n if (this.currentIndex >= 0) {\n currentTrack = this.tracks[this.currentIndex];\n }\n\n for (let i = this.tracks.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [this.tracks[i], this.tracks[j]] = [this.tracks[j], this.tracks[i]];\n }\n\n if (currentTrack) {\n this.currentIndex = this.tracks.indexOf(currentTrack);\n } else {\n this.currentIndex = -1;\n }\n\n this.eventBus.emit(EVENTS.QUEUE_UPDATE, this.tracks);\n }\n\n /**\n * Clear the queue\n */\n clear(): void {\n this.tracks = [];\n this.currentIndex = -1;\n this.eventBus.emit(EVENTS.QUEUE_UPDATE, this.tracks);\n }\n\n /**\n * Jump to specific track\n * @param index - Track index\n * @returns Track at index\n */\n jump(index: number): Track | null {\n if (index < 0 || index >= this.tracks.length) return null;\n this.currentIndex = index;\n return this.tracks[index];\n }\n\n /**\n * Get current track\n * @returns Current track\n */\n getCurrent(): Track | null {\n return this.currentIndex >= 0 ? this.tracks[this.currentIndex] : null;\n }\n\n /**\n * Get next track\n * Moves cursor forward\n * @param loop - Whether to loop back to start\n * @returns Next track\n */\n next(loop: boolean = false): Track | null {\n if (this.tracks.length === 0) return null;\n \n let nextIndex = this.currentIndex + 1;\n if (nextIndex >= this.tracks.length) {\n if (loop) {\n nextIndex = 0;\n } else {\n return null;\n }\n }\n \n this.currentIndex = nextIndex;\n return this.tracks[this.currentIndex];\n }\n\n /**\n * Get previous track\n * Moves cursor backward\n * @param loop - Whether to loop to end\n * @returns Previous track\n */\n previous(loop: boolean = false): Track | null {\n if (this.tracks.length === 0) return null;\n\n let prevIndex = this.currentIndex - 1;\n if (prevIndex < 0) {\n if (loop) {\n prevIndex = this.tracks.length - 1;\n } else {\n return null;\n }\n }\n\n this.currentIndex = prevIndex;\n return this.tracks[this.currentIndex];\n }\n\n /**\n * Get all tracks\n * @returns Array of tracks\n */\n getTracks(): Track[] {\n return [...this.tracks];\n }\n\n /**\n * Get queue size\n * @returns Number of tracks\n */\n size(): number {\n return this.tracks.length;\n }\n\n /**\n * Check if queue is empty\n * @returns Is empty\n */\n isEmpty(): boolean {\n return this.tracks.length === 0;\n }\n\n /**\n * Get track at index\n * @param index - Track index\n * @returns Track at index\n */\n getTrack(index: number): Track | null {\n return index >= 0 && index < this.tracks.length ? this.tracks[index] : null;\n }\n}","import { IProvider } from '../interfaces';\n\nexport class ProviderRegistry {\n private providers: Map<string, IProvider>;\n\n constructor() {\n this.providers = new Map();\n }\n\n register(provider: IProvider): void {\n this.providers.set(provider.name, provider);\n }\n\n unregister(name: string): void {\n this.providers.delete(name);\n }\n\n get(name: string): IProvider | undefined {\n return this.providers.get(name);\n }\n\n getAll(): IProvider[] {\n return Array.from(this.providers.values());\n }\n\n has(name: string): boolean {\n return this.providers.has(name);\n }\n}\n","import { promises as fs } from 'fs';\nimport { extname } from 'path';\nimport { IProvider, ITrack, IAudioEngine } from '../interfaces';\nimport { Track } from '../queue/Track';\n\nexport class LocalProvider implements IProvider {\n name = 'local';\n version = '1.0.0';\n private engine: IAudioEngine | null = null;\n\n async initialize(engine: IAudioEngine): Promise<void> {\n this.engine = engine;\n }\n\n async resolve(path: string): Promise<ITrack | ITrack[]> {\n if (!await this.exists(path)) {\n throw new Error('File not found');\n }\n\n // Node.js specific checks\n const stats = await fs.stat(path);\n if (!stats.isFile()) {\n throw new Error('Path is not a file');\n }\n\n const track = new Track(`file://${path}`, {\n title: path.split('/').pop()?.replace(extname(path), '') || 'Unknown',\n source: 'local',\n metadata: {\n size: stats.size,\n modified: stats.mtime\n }\n });\n\n return track;\n }\n\n async play(track: ITrack): Promise<void> {\n if (!this.engine) throw new Error('Provider not initialized');\n // For local files, we assume the player can handle file:// URLs or we might need to read it into a buffer here?\n // The previous Player implementation used fetch(url). fetch supports file:// in some envs but not all.\n // However, given the hybrid nature, we'll assume the engine's player handles the URL.\n \n // Actually, Player.ts uses fetch(). fetch('file://...') might fail in Node if not polyfilled or configured.\n // But let's stick to the architecture: Provider calls engine.player.load(track).\n // Wait, AudioEngine.ts in JS called `player.play(track)`.\n // So the Provider.play just needs to confirm it CAN play or do setup?\n // If AudioEngine delegates to Provider, then Provider MUST do the work.\n \n // \"AudioEngine calls provider.play(track)\" -> Provider must make sound happen.\n // So LocalProvider should call this.engine.player.play(track).\n \n // BUT checking for infinite loop: Engine calls Provider.play -> Provider calls Engine.player.play?\n // Engine needs to know NOT to call Provider again.\n // Engine.play(track) -> check provider -> provider.play(track)\n // Provider.play(track) -> engine.player.loadSource(track.url) -> source.start()\n \n // We need to expose `loadSource` or similar on engine/player.\n // For now, I'll assume engine.player has low-level methods.\n \n // Let's assume the Player has a `playStream(url)` method.\n // I'll type cast engine.player for now.\n \n await (this.engine.player as any).playStream(track); \n }\n\n async stop(): Promise<void> {\n // Local provider doesn't manage state separate from engine\n }\n\n destroy(): void {\n // No cleanup needed\n }\n\n private async exists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { IProvider, ITrack, IAudioEngine } from '../interfaces';\nimport { Track } from '../queue/Track';\n\nexport class YouTubeProvider implements IProvider {\n name = 'youtube';\n version = '1.0.0';\n private engine: IAudioEngine | null = null;\n\n async initialize(engine: IAudioEngine): Promise<void> {\n this.engine = engine;\n }\n\n async resolve(query: string): Promise<ITrack | ITrack[]> {\n if (query.includes('youtube.com') || query.includes('youtu.be')) {\n const videoId = this.extractVideoId(query);\n if (!videoId) throw new Error('Invalid YouTube URL');\n\n return new Track(query, {\n title: `YouTube Video ${videoId}`,\n thumbnail: `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`,\n source: 'youtube',\n metadata: { videoId }\n });\n }\n \n // Search not implemented in this mock\n throw new Error('Search not implemented');\n }\n\n async play(track: ITrack): Promise<void> {\n if (!this.engine) throw new Error('Provider not initialized');\n \n // In a real app, resolve stream URL here (e.g. ytdl-core)\n // const streamUrl = await ytdl(track.url);\n // await this.engine.player.playStream(streamUrl);\n \n throw new Error('Stream URL extraction requires additional dependencies (ytdl-core)');\n }\n\n async stop(): Promise<void> {}\n\n destroy(): void {}\n\n private extractVideoId(url: string): string | null {\n try {\n const urlObj = new URL(url);\n if (urlObj.hostname === 'youtu.be') {\n return urlObj.pathname.slice(1);\n }\n return urlObj.searchParams.get('v');\n } catch {\n return null;\n }\n }\n}\n","import { IProvider, ITrack, IAudioEngine } from '../interfaces';\nimport { Track } from '../queue/Track';\nimport SpotifyWebApi from 'spotify-web-api-node';\n\nexport class SpotifyProvider implements IProvider {\n name = 'spotify';\n version = '1.0.0';\n private engine: IAudioEngine | null = null;\n private spotifyApi: SpotifyWebApi;\n\n constructor(options: any = {}) {\n this.spotifyApi = new SpotifyWebApi({\n clientId: options.clientId,\n clientSecret: options.clientSecret,\n redirectUri: options.redirectUri,\n accessToken: options.accessToken,\n refreshToken: options.refreshToken\n });\n }\n\n async initialize(engine: IAudioEngine): Promise<void> {\n this.engine = engine;\n }\n\n async resolve(query: string): Promise<ITrack | ITrack[]> {\n // Check if query is ID or URL or Search\n if (query.includes('spotify.com/track/')) {\n const id = query.split('track/')[1].split('?')[0];\n const data = await this.spotifyApi.getTrack(id);\n return this._formatTrack(data.body);\n }\n\n // Default to search\n const data = await this.spotifyApi.searchTracks(query);\n return data.body.tracks?.items.map(t => this._formatTrack(t)) || [];\n }\n\n async play(track: ITrack): Promise<void> {\n if (!this.engine) throw new Error('Provider not initialized');\n \n // Spotify playback usually requires Web SDK or resolving to another source\n // Here we can throw or try to resolve if Preview URL is available\n \n if (track.metadata.preview_url) {\n await (this.engine.player as any).playStream({ ...track, url: track.metadata.preview_url });\n } else {\n throw new Error('Spotify full playback not supported in this provider version (preview only)');\n }\n }\n\n async stop(): Promise<void> {}\n\n destroy(): void {}\n\n private _formatTrack(spotifyTrack: any): Track {\n return new Track(spotifyTrack.external_urls.spotify, {\n id: spotifyTrack.id,\n title: spotifyTrack.name,\n artist: spotifyTrack.artists.map((a: any) => a.name).join(', '),\n duration: Math.floor(spotifyTrack.duration_ms / 1000),\n thumbnail: spotifyTrack.album.images[0]?.url,\n source: 'spotify',\n metadata: {\n spotifyId: spotifyTrack.id,\n preview_url: spotifyTrack.preview_url,\n popularity: spotifyTrack.popularity\n }\n });\n }\n}\n","import { IProvider, ITrack, IAudioEngine } from '../interfaces';\nimport { Track } from '../queue/Track';\nimport { LavalinkManager } from 'lavalink-client';\n\nexport class LavalinkProvider implements IProvider {\n name = 'lavalink';\n version = '1.0.0';\n private engine: IAudioEngine | null = null;\n private manager: LavalinkManager | null = null;\n private node: any = null;\n private options: any;\n\n constructor(options: any = {}) {\n this.options = options;\n }\n\n async initialize(engine: IAudioEngine): Promise<void> {\n this.engine = engine;\n this.manager = new LavalinkManager({\n nodes: [{\n host: this.options.host || 'localhost',\n port: this.options.port || 2333,\n // @ts-ignore\n password: this.options.password || 'youshallnotpass',\n secure: this.options.secure || false,\n id: 'main'\n }],\n sendToShard: (guildId: string, payload: any) => {\n // Mock\n }\n });\n // @ts-ignore\n if (this.manager.connect) await this.manager.connect();\n // @ts-ignore\n this.node = this.manager.nodes ? this.manager.nodes.get('main') : (this.manager as any).node; \n }\n\n async resolve(identifier: string): Promise<ITrack | ITrack[]> {\n if (!this.node) throw new Error('Lavalink not connected');\n\n const result = await this.node.rest.loadTracks(identifier);\n\n if (result.loadType === 'TRACK_LOADED') {\n return this._formatTrack(result.tracks[0]);\n } else if (result.loadType === 'PLAYLIST_LOADED' || result.loadType === 'SEARCH_RESULT') {\n return result.tracks.map((t: any) => this._formatTrack(t));\n }\n \n return [];\n }\n\n async play(track: ITrack): Promise<void> {\n throw new Error('Lavalink play() requires guild/channel context. Use createPlayer() directly.');\n }\n\n createPlayer(guildId: string, channelId: string) {\n if (!this.manager) throw new Error('Not initialized');\n return this.manager.createPlayer({\n guildId,\n voiceChannelId: channelId\n });\n }\n\n async stop(): Promise<void> {\n // Stop all?\n }\n\n destroy(): void {\n if (this.manager) {\n // @ts-ignore\n if (this.manager.destroy) this.manager.destroy();\n }\n }\n\n private _formatTrack(lavalinkTrack: any): Track {\n const info = lavalinkTrack.info;\n return new Track(info.uri, {\n id: lavalinkTrack.track,\n title: info.title,\n artist: info.author,\n duration: Math.floor(info.length / 1000),\n thumbnail: info.artworkUrl,\n source: 'lavalink',\n metadata: {\n lavalinkTrack: lavalinkTrack.track,\n identifier: info.identifier\n }\n });\n }\n}","import { IPlugin, IAudioEngine } from '../interfaces';\n\n/**\n * Plugin manager for loading and managing plugins\n */\nexport class PluginManager {\n private engine: IAudioEngine;\n private plugins: Map<string, IPlugin>;\n\n constructor(engine: IAudioEngine) {\n this.engine = engine;\n this.plugins = new Map();\n }\n\n /**\n * Load a plugin\n * @param plugin - Plugin instance\n */\n load(plugin: IPlugin): void {\n if (!plugin || typeof plugin.onLoad !== 'function') {\n throw new Error('Invalid plugin instance');\n }\n\n try {\n plugin.onLoad(this.engine);\n this.plugins.set(plugin.name, plugin);\n } catch (error) {\n console.error(`Failed to load plugin ${plugin.name}:`, error);\n }\n }\n\n /**\n * Enable a plugin\n * @param name - Plugin name\n */\n enable(name: string): void {\n const plugin = this.plugins.get(name);\n if (plugin && !plugin.onEnable) return; // Should have onEnable from interface\n \n // Check if we track enabled state in plugin interface?\n // Interface has onEnable methods.\n // Plugin implementations usually track their own state or we assume onEnable does it.\n \n // Check if plugin object has 'enabled' property (generic check)\n if (plugin && (plugin as any).enabled === false) {\n plugin.onEnable();\n }\n }\n\n /**\n * Disable a plugin\n * @param name - Plugin name\n */\n disable(name: string): void {\n const plugin = this.plugins.get(name);\n if (plugin) {\n plugin.onDisable();\n }\n }\n\n /**\n * Unload a plugin\n * @param name - Plugin name\n */\n unload(name: string): void {\n const plugin = this.plugins.get(name);\n if (plugin) {\n plugin.onUnload();\n this.plugins.delete(name);\n }\n }\n\n /**\n * Get plugin by name\n * @param name - Plugin name\n * @returns Plugin instance\n */\n get(name: string): IPlugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * Get all plugins\n * @returns Map of plugins\n */\n getAll(): Map<string, IPlugin> {\n return new Map(this.plugins);\n }\n\n /**\n * Get enabled plugins\n * @returns Array of enabled plugins\n */\n getEnabled(): IPlugin[] {\n // We assume plugins that are loaded are potential candidates, \n // but the IPlugin interface doesn't enforce an 'enabled' property reading.\n // However, the Base Plugin class does.\n // We'll filter by checking 'enabled' property if it exists, or assume true?\n // Safer to check property.\n return Array.from(this.plugins.values()).filter(plugin => (plugin as any).enabled === true);\n }\n\n /**\n * Call hook on all enabled plugins\n * @param hook - Hook name\n * @param args - Arguments to pass\n */\n callHook(hook: string, ...args: any[]): void {\n this.getEnabled().forEach(plugin => {\n if (typeof (plugin as any)[hook] === 'function') {\n try {\n (plugin as any)[hook](...args);\n } catch (error) {\n console.error(`Error in plugin ${plugin.name} hook ${hook}:`, error);\n }\n }\n });\n }\n}\n","import { Player } from './engine/Player';\nimport { Filters } from './engine/Filters';\nimport { Queue } from './queue/Queue';\nimport { Track } from './queue/Track';\nimport { EventBus } from './events/EventBus';\nimport { ProviderRegistry } from './providers/ProviderRegistry';\nimport { LocalProvider } from './providers/LocalProvider';\nimport { YouTubeProvider } from './providers/YouTubeProvider';\nimport { SpotifyProvider } from './providers/SpotifyProvider';\nimport { LavalinkProvider } from './providers/LavalinkProvider';\nimport { PluginManager } from './plugins/PluginManager';\nimport { EVENTS, LOOP_MODES, LoopMode } from './constants';\nimport { IAudioEngine, IProvider, ITrack } from './interfaces';\n\n/**\n * Main audio engine class\n */\nexport class AudioEngine implements IAudioEngine {\n public options: any;\n public player: Player;\n public filters: Filters;\n public queue: Queue;\n public eventBus: EventBus;\n public providers: ProviderRegistry;\n public plugins: PluginManager;\n public isReady: boolean;\n\n constructor(options: any = {}) {\n this.options = options;\n this.queue = new Queue();\n this.eventBus = new EventBus();\n this.providers = new ProviderRegistry();\n this.isReady = false;\n\n this.player = new Player(this);\n // @ts-ignore - Accessing private audioContext from player for filters\n this.filters = new Filters(this.player.audioContext);\n this.plugins = new PluginManager(this);\n \n this.initialize();\n }\n\n /**\n * Initialize the audio engine\n */\n async initialize() {\n try {\n // Connect event buses\n this.queue.eventBus.on(EVENTS.TRACK_ADD, (track) => this.eventBus.emit(EVENTS.TRACK_ADD, track));\n this.queue.eventBus.on(EVENTS.TRACK_REMOVE, (track) => this.eventBus.emit(EVENTS.TRACK_REMOVE, track));\n this.queue.eventBus.on(EVENTS.QUEUE_UPDATE, (tracks) => {\n this.eventBus.emit(EVENTS.QUEUE_UPDATE, tracks);\n this.plugins.callHook('queueUpdate', this.queue);\n });\n \n this.player.eventBus.on(EVENTS.PLAY, (data) => this.eventBus.emit(EVENTS.PLAY, data));\n this.player.eventBus.on(EVENTS.PAUSE, () => this.eventBus.emit(EVENTS.PAUSE));\n this.player.eventBus.on(EVENTS.STOP, () => this.eventBus.emit(EVENTS.STOP));\n this.player.eventBus.on(EVENTS.ERROR, (error) => this.eventBus.emit(EVENTS.ERROR, error));\n this.player.eventBus.on(EVENTS.TRACK_START, (track) => {\n this.eventBus.emit(EVENTS.TRACK_START, track);\n this.plugins.callHook('afterPlay', track); // afterPlay usually means playback started\n });\n this.player.eventBus.on(EVENTS.TRACK_END, (track) => {\n this.eventBus.emit(EVENTS.TRACK_END, track);\n this.plugins.callHook('trackEnd', track);\n });\n\n // Register default providers\n await this.registerProvider(new LocalProvider());\n await this.registerProvider(new YouTubeProvider());\n \n if (this.options.spotify) {\n await this.registerProvider(new SpotifyProvider(this.options.spotify));\n }\n \n if (this.options.lavalink) {\n await this.registerProvider(new LavalinkProvider(this.options.lavalink));\n }\n\n this.isReady = true;\n this.eventBus.emit(EVENTS.READY);\n } catch (error) {\n this.eventBus.emit(EVENTS.ERROR, error);\n }\n }\n\n async registerProvider(provider: IProvider): Promise<void> {\n await provider.initialize(this);\n this.providers.register(provider);\n }\n\n getProvider(name: string): IProvider | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Play track or resume playback\n * @param track - Track to play or track identifier\n */\n async play(track?: ITrack | string): Promise<void> {\n if (!this.isReady) return;\n\n if (track) {\n let trackObj: ITrack | null = null;\n if (typeof track === 'string') {\n trackObj = new Track(track);\n this.queue.add(trackObj as any);\n } else {\n trackObj = track;\n }\n\n this.plugins.callHook('beforePlay', trackObj);\n await this.player.play(trackObj);\n } else {\n this.player.resume();\n }\n }\n\n /**\n * Pause playback\n */\n pause(): void {\n this.player.pause();\n }\n\n /**\n * Stop playback\n */\n stop(): void {\n this.player.stop();\n }\n\n /**\n * Seek to position\n * @param time - Time in seconds\n */\n seek(time: number): void {\n this.player.seek(time);\n }\n\n /**\n * Set volume\n * @param volume - Volume level (0-1)\n */\n setVolume(volume: number): void {\n this.player.setVolume(volume);\n }\n\n /**\n * Add track(s) to queue\n * @param tracks - Track(s) to add\n */\n add(tracks: ITrack | ITrack[] | string | string[]): void {\n this.queue.add(tracks as any);\n }\n\n /**\n * Remove track from queue\n * @param identifier - Track index or ID\n */\n remove(identifier: number | string): ITrack | null {\n return this.queue.remove(identifier);\n }\n\n /**\n * Skip to next track\n */\n next(): void {\n const nextTrack = this.queue.next(false);\n if (nextTrack) {\n this.play(nextTrack);\n } else {\n this.stop();\n }\n }\n\n /**\n * Go to previous track\n */\n previous(): void {\n const prevTrack = this.queue.previous(false);\n if (prevTrack) {\n this.play(prevTrack);\n }\n }\n\n /**\n * Shuffle queue\n */\n shuffle(): void {\n this.queue.shuffle();\n }\n\n /**\n * Clear queue\n */\n clear(): void {\n this.queue.clear();\n }\n\n /**\n * Jump to track in queue\n * @param index - Track index\n */\n jump(index: number): void {\n const track = this.queue.jump(index);\n if (track) {\n this.play(track);\n }\n }\n\n /**\n * Apply audio filter\n * @param type - Filter type\n * @param options - Filter options\n */\n applyFilter(type: any, options: any): void {\n this.filters.apply(type, options);\n this.eventBus.emit(EVENTS.FILTER_APPLIED, { type, options });\n }\n\n /**\n * Remove audio filter\n * @param type - Filter type\n */\n removeFilter(type: any): void {\n this.filters.remove(type);\n }\n\n /**\n * Set loop mode\n * @param mode - Loop mode\n */\n setLoopMode(mode: LoopMode): void {\n this.player.setLoopMode(mode);\n }\n\n /**\n * Get current state\n * @returns Engine state\n */\n getState(): any {\n return {\n isReady: this.isReady,\n ...this.player.getState(),\n currentTrack: this.queue.getCurrent(),\n queue: this.queue.getTracks(),\n filters: this.filters.getEnabled()\n };\n }\n\n /**\n * Destroy the engine\n */\n destroy(): void {\n this.filters.clear();\n this.player.stop();\n this.providers.getAll().forEach(p => p.destroy());\n this.plugins.getAll().forEach(p => p.onUnload());\n // @ts-ignore\n if (this.player.audioContext && this.player.audioContext.state !== 'closed') {\n // @ts-ignore\n this.player.audioContext.close();\n }\n }\n}","import { IPlugin, IAudioEngine } from '../interfaces';\n\nexport abstract class Plugin implements IPlugin {\n name: string;\n version: string;\n enabled: boolean = false;\n loaded: boolean = false;\n protected engine?: IAudioEngine;\n\n constructor(name: string, version: string = '1.0.0') {\n this.name = name;\n this.version = version;\n }\n\n onLoad(engine: IAudioEngine): void {\n this.engine = engine;\n this.loaded = true;\n }\n \n onUnload(): void {\n this.loaded = false;\n this.engine = undefined;\n }\n\n onEnable(): void {\n this.enabled = true;\n }\n\n onDisable(): void {\n this.enabled = false;\n }\n \n // Optional Hooks used by PluginManager.callHook\n beforePlay(track: any): void {}\n afterPlay(track: any): void {}\n trackEnd(track: any): void {}\n queueUpdate(queue: any): void {}\n}\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/**\n * Logger utility with different levels\n */\nexport class Logger {\n private levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3\n };\n private currentLevel: number;\n\n constructor(level: LogLevel = 'info') {\n this.currentLevel = this.levels[level];\n }\n\n /**\n * Set log level\n * @param level - Log level (debug, info, warn, error)\n */\n setLevel(level: LogLevel): void {\n this.currentLevel = this.levels[level] || this.levels.info;\n }\n\n /**\n * Debug log\n * @param args - Arguments to log\n */\n debug(...args: any[]): void {\n if (this.currentLevel <= this.levels.debug) {\n console.debug('[DEBUG]', ...args);\n }\n }\n\n /**\n * Info log\n * @param args - Arguments to log\n */\n info(...args: any[]): void {\n if (this.currentLevel <= this.levels.info) {\n console.info('[INFO]', ...args);\n }\n }\n\n /**\n * Warning log\n * @param args - Arguments to log\n */\n warn(...args: any[]): void {\n if (this.currentLevel <= this.levels.warn) {\n console.warn('[WARN]', ...args);\n }\n }\n\n /**\n * Error log\n * @param args - Arguments to log\n */\n error(...args: any[]): void {\n if (this.currentLevel <= this.levels.error) {\n console.error('[ERROR]', ...args);\n }\n }\n}\n\n// Default logger instance\nexport const logger = new Logger();\n","/**\n * Time formatting utilities\n */\nexport class TimeUtils {\n /**\n * Format seconds to MM:SS or HH:MM:SS\n * @param seconds - Time in seconds\n * @returns Formatted time string\n */\n static format(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return '00:00';\n\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n }\n\n /**\n * Parse time string to seconds\n * @param timeStr - Time string like \"1:23\" or \"01:23:45\"\n * @returns Time in seconds\n */\n static parse(timeStr: string): number {\n if (!timeStr) return 0;\n\n const parts = timeStr.split(':').map(Number);\n if (parts.length === 2) {\n return parts[0] * 60 + parts[1];\n } else if (parts.length === 3) {\n return parts[0] * 3600 + parts[1] * 60 + parts[2];\n }\n return 0;\n }\n\n /**\n * Get current timestamp in milliseconds\n * @returns Current time\n */\n static now(): number {\n return Date.now();\n }\n\n /**\n * Calculate duration between two timestamps\n * @param start - Start time\n * @param end - End time\n * @returns Duration in milliseconds\n */\n static duration(start: number, end: number): number {\n return end - start;\n }\n}\n"],"names":["path","fs","extname","LavalinkManager"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const EVENTS = {
|
|
2
|
+
READY: 'ready',
|
|
3
|
+
ERROR: 'error',
|
|
4
|
+
PLAY: 'play',
|
|
5
|
+
PAUSE: 'pause',
|
|
6
|
+
STOP: 'stop',
|
|
7
|
+
TRACK_START: 'trackStart',
|
|
8
|
+
TRACK_END: 'trackEnd',
|
|
9
|
+
TRACK_ADD: 'trackAdd',
|
|
10
|
+
TRACK_REMOVE: 'trackRemove',
|
|
11
|
+
QUEUE_UPDATE: 'queueUpdate',
|
|
12
|
+
FILTER_APPLIED: 'filterApplied',
|
|
13
|
+
VOLUME_CHANGE: 'volumeChange',
|
|
14
|
+
SEEK: 'seek'
|
|
15
|
+
};
|
|
16
|
+
export const LOOP_MODES = {
|
|
17
|
+
OFF: 'off',
|
|
18
|
+
TRACK: 'track',
|
|
19
|
+
QUEUE: 'queue'
|
|
20
|
+
};
|
|
21
|
+
export const PLAYER_STATES = {
|
|
22
|
+
IDLE: 'idle',
|
|
23
|
+
PLAYING: 'playing',
|
|
24
|
+
PAUSED: 'paused',
|
|
25
|
+
BUFFERING: 'buffering'
|
|
26
|
+
};
|
|
27
|
+
export const FILTER_TYPES = {
|
|
28
|
+
BASSBOOST: 'bassboost',
|
|
29
|
+
NIGHTCORE: 'nightcore',
|
|
30
|
+
VAPORWAVE: 'vaporwave',
|
|
31
|
+
ROTATE_8D: '8d',
|
|
32
|
+
PITCH: 'pitch',
|
|
33
|
+
SPEED: 'speed',
|
|
34
|
+
REVERB: 'reverb'
|
|
35
|
+
};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { FILTER_TYPES } from '../constants';
|
|
2
|
+
/**
|
|
3
|
+
* Audio filters and effects
|
|
4
|
+
*/
|
|
5
|
+
export class Filters {
|
|
6
|
+
constructor(audioContext) {
|
|
7
|
+
this.audioContext = audioContext;
|
|
8
|
+
this.filters = new Map();
|
|
9
|
+
this.enabled = new Set();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Apply filter
|
|
13
|
+
* @param type - Filter type
|
|
14
|
+
* @param options - Filter options
|
|
15
|
+
*/
|
|
16
|
+
apply(type, options = {}) {
|
|
17
|
+
if (!this.audioContext)
|
|
18
|
+
return;
|
|
19
|
+
switch (type) {
|
|
20
|
+
case FILTER_TYPES.BASSBOOST:
|
|
21
|
+
this.applyBassBoost(options);
|
|
22
|
+
break;
|
|
23
|
+
case FILTER_TYPES.NIGHTCORE:
|
|
24
|
+
this.applyNightcore(options);
|
|
25
|
+
break;
|
|
26
|
+
case FILTER_TYPES.VAPORWAVE:
|
|
27
|
+
this.applyVaporwave(options);
|
|
28
|
+
break;
|
|
29
|
+
case FILTER_TYPES.ROTATE_8D:
|
|
30
|
+
this.apply8DRotate(options);
|
|
31
|
+
break;
|
|
32
|
+
case FILTER_TYPES.PITCH:
|
|
33
|
+
this.applyPitch(options);
|
|
34
|
+
break;
|
|
35
|
+
case FILTER_TYPES.SPEED:
|
|
36
|
+
this.applySpeed(options);
|
|
37
|
+
break;
|
|
38
|
+
case FILTER_TYPES.REVERB:
|
|
39
|
+
this.applyReverb(options);
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
this.enabled.add(type);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Remove filter
|
|
46
|
+
* @param type - Filter type
|
|
47
|
+
*/
|
|
48
|
+
remove(type) {
|
|
49
|
+
if (this.filters.has(type)) {
|
|
50
|
+
const filter = this.filters.get(type);
|
|
51
|
+
filter?.disconnect();
|
|
52
|
+
this.filters.delete(type);
|
|
53
|
+
this.enabled.delete(type);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Clear all filters
|
|
58
|
+
*/
|
|
59
|
+
clear() {
|
|
60
|
+
this.filters.forEach(filter => filter.disconnect());
|
|
61
|
+
this.filters.clear();
|
|
62
|
+
this.enabled.clear();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if filter is enabled
|
|
66
|
+
* @param type - Filter type
|
|
67
|
+
* @returns Is enabled
|
|
68
|
+
*/
|
|
69
|
+
isEnabled(type) {
|
|
70
|
+
return this.enabled.has(type);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get enabled filters
|
|
74
|
+
* @returns Enabled filter types
|
|
75
|
+
*/
|
|
76
|
+
getEnabled() {
|
|
77
|
+
return new Set(this.enabled);
|
|
78
|
+
}
|
|
79
|
+
// Filter implementations
|
|
80
|
+
applyBassBoost(options = {}) {
|
|
81
|
+
const gain = options.gain || 1.5;
|
|
82
|
+
const filter = this.audioContext.createBiquadFilter();
|
|
83
|
+
filter.type = 'lowshelf';
|
|
84
|
+
filter.frequency.value = 200;
|
|
85
|
+
filter.gain.value = gain * 10;
|
|
86
|
+
this.filters.set(FILTER_TYPES.BASSBOOST, filter);
|
|
87
|
+
}
|
|
88
|
+
applyNightcore(options = {}) {
|
|
89
|
+
const rate = options.rate || 1.2;
|
|
90
|
+
// Nightcore is pitch + speed up
|
|
91
|
+
this.applyPitch({ pitch: rate });
|
|
92
|
+
this.applySpeed({ speed: rate });
|
|
93
|
+
}
|
|
94
|
+
applyVaporwave(options = {}) {
|
|
95
|
+
const rate = options.rate || 0.8;
|
|
96
|
+
this.applyPitch({ pitch: rate });
|
|
97
|
+
this.applySpeed({ speed: rate });
|
|
98
|
+
}
|
|
99
|
+
apply8DRotate(options = {}) {
|
|
100
|
+
// 8D audio effect using panner
|
|
101
|
+
const panner = this.audioContext.createPanner();
|
|
102
|
+
panner.panningModel = 'HRTF';
|
|
103
|
+
// Would need to animate the position for rotation
|
|
104
|
+
this.filters.set(FILTER_TYPES.ROTATE_8D, panner);
|
|
105
|
+
}
|
|
106
|
+
applyPitch(options = {}) {
|
|
107
|
+
const pitch = options.pitch || 1;
|
|
108
|
+
// In Web Audio API, pitch shifting requires AudioWorklet or external library
|
|
109
|
+
// For simplicity, we'll use a basic implementation or just log it
|
|
110
|
+
// console.warn('Pitch shifting requires AudioWorklet in modern browsers');
|
|
111
|
+
}
|
|
112
|
+
applySpeed(options = {}) {
|
|
113
|
+
const speed = options.speed || 1;
|
|
114
|
+
// Speed change affects playback rate
|
|
115
|
+
// This would be handled in the player
|
|
116
|
+
// console.log(`Speed filter applied: ${speed}x`);
|
|
117
|
+
}
|
|
118
|
+
applyReverb(options = {}) {
|
|
119
|
+
const convolver = this.audioContext.createConvolver();
|
|
120
|
+
// Would need an impulse response for reverb
|
|
121
|
+
// For simplicity, create a basic reverb
|
|
122
|
+
this.filters.set(FILTER_TYPES.REVERB, convolver);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Connect filters to audio node
|
|
126
|
+
* @param input - Input node
|
|
127
|
+
* @param output - Output node
|
|
128
|
+
*/
|
|
129
|
+
connect(input, output) {
|
|
130
|
+
let currentNode = input;
|
|
131
|
+
this.filters.forEach(filter => {
|
|
132
|
+
currentNode.connect(filter);
|
|
133
|
+
currentNode = filter;
|
|
134
|
+
});
|
|
135
|
+
currentNode.connect(output);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export class MockAudioContext {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.state = 'running';
|
|
4
|
+
this.currentTime = 0;
|
|
5
|
+
this.startTime = Date.now();
|
|
6
|
+
this.updateTime();
|
|
7
|
+
}
|
|
8
|
+
updateTime() {
|
|
9
|
+
if (this.state === 'running') {
|
|
10
|
+
const diff = (Date.now() - this.startTime) / 1000;
|
|
11
|
+
this.currentTime = diff;
|
|
12
|
+
}
|
|
13
|
+
// Simulate clock
|
|
14
|
+
if (typeof setTimeout !== 'undefined') {
|
|
15
|
+
setTimeout(() => this.updateTime(), 100);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
createGain() { return { connect: () => { }, gain: { value: 0 } }; }
|
|
19
|
+
createBiquadFilter() { return { connect: () => { }, frequency: { value: 0 }, gain: { value: 0 } }; }
|
|
20
|
+
createPanner() { return { connect: () => { } }; }
|
|
21
|
+
createConvolver() { return { connect: () => { } }; }
|
|
22
|
+
createBufferSource() {
|
|
23
|
+
return new MockAudioBufferSource(this);
|
|
24
|
+
}
|
|
25
|
+
async decodeAudioData(buffer) {
|
|
26
|
+
return { duration: 5 }; // Mock 5 seconds duration
|
|
27
|
+
}
|
|
28
|
+
suspend() { this.state = 'suspended'; }
|
|
29
|
+
resume() { this.state = 'running'; this.startTime = Date.now() - (this.currentTime * 1000); }
|
|
30
|
+
close() { this.state = 'closed'; }
|
|
31
|
+
}
|
|
32
|
+
class MockAudioBufferSource {
|
|
33
|
+
constructor(context) {
|
|
34
|
+
this.buffer = null;
|
|
35
|
+
this.onended = null;
|
|
36
|
+
this.context = context;
|
|
37
|
+
}
|
|
38
|
+
connect() { }
|
|
39
|
+
start(when = 0, offset = 0) {
|
|
40
|
+
// Simulate playback duration
|
|
41
|
+
const duration = this.buffer ? this.buffer.duration : 0;
|
|
42
|
+
setTimeout(() => {
|
|
43
|
+
if (this.onended)
|
|
44
|
+
this.onended();
|
|
45
|
+
}, duration * 1000); // Speed up for tests? No, keep real time or fast?
|
|
46
|
+
// 5 seconds mock duration might be too long for quick examples.
|
|
47
|
+
// Let's make it 1 second for examples unless buffer says otherwise.
|
|
48
|
+
}
|
|
49
|
+
stop() {
|
|
50
|
+
if (this.onended)
|
|
51
|
+
this.onended();
|
|
52
|
+
}
|
|
53
|
+
}
|