@students-dev/audify-js 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
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","fs"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export namespace LOOP_MODES {
2
+ let OFF: string;
3
+ let TRACK: string;
4
+ let QUEUE: string;
5
+ }
6
+ export namespace REPEAT_MODES { }
7
+ export namespace FILTER_TYPES {
8
+ let BASSBOOST: string;
9
+ let TREBLEBOOST: string;
10
+ let NIGHTCORE: string;
11
+ let VAPORWAVE: string;
12
+ let ROTATE_8D: string;
13
+ let PITCH: string;
14
+ let SPEED: string;
15
+ let REVERB: string;
16
+ }
17
+ export namespace EVENTS {
18
+ let READY: string;
19
+ let PLAY: string;
20
+ let PAUSE: string;
21
+ let STOP: string;
22
+ let ERROR: string;
23
+ let QUEUE_EMPTY: string;
24
+ let TRACK_START: string;
25
+ let TRACK_END: string;
26
+ let FILTER_APPLIED: string;
27
+ let TRACK_ADD: string;
28
+ let TRACK_REMOVE: string;
29
+ let SHUFFLE: string;
30
+ let CLEAR: string;
31
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Main audio engine class
3
+ */
4
+ export class AudioEngine {
5
+ constructor(options?: {});
6
+ options: {};
7
+ audioContext: any;
8
+ player: Player;
9
+ filters: Filters;
10
+ queue: Queue;
11
+ eventBus: EventBus;
12
+ isReady: boolean;
13
+ /**
14
+ * Initialize the audio engine
15
+ */
16
+ initialize(): Promise<void>;
17
+ /**
18
+ * Play track or resume playback
19
+ * @param {Track|string} track - Track to play or track identifier
20
+ */
21
+ play(track: Track | string): Promise<void>;
22
+ /**
23
+ * Pause playback
24
+ */
25
+ pause(): void;
26
+ /**
27
+ * Stop playback
28
+ */
29
+ stop(): void;
30
+ /**
31
+ * Seek to position
32
+ * @param {number} time - Time in seconds
33
+ */
34
+ seek(time: number): void;
35
+ /**
36
+ * Set volume
37
+ * @param {number} volume - Volume level (0-1)
38
+ */
39
+ setVolume(volume: number): void;
40
+ /**
41
+ * Add track(s) to queue
42
+ * @param {Track|Track[]|string|string[]} tracks - Track(s) to add
43
+ */
44
+ add(tracks: Track | Track[] | string | string[]): void;
45
+ /**
46
+ * Remove track from queue
47
+ * @param {number|string} identifier - Track index or ID
48
+ */
49
+ remove(identifier: number | string): import("../index.js").Track;
50
+ /**
51
+ * Skip to next track
52
+ */
53
+ next(): void;
54
+ /**
55
+ * Go to previous track
56
+ */
57
+ previous(): void;
58
+ /**
59
+ * Shuffle queue
60
+ */
61
+ shuffle(): void;
62
+ /**
63
+ * Clear queue
64
+ */
65
+ clear(): void;
66
+ /**
67
+ * Jump to track in queue
68
+ * @param {number} index - Track index
69
+ */
70
+ jump(index: number): void;
71
+ /**
72
+ * Apply audio filter
73
+ * @param {string} type - Filter type
74
+ * @param {Object} options - Filter options
75
+ */
76
+ applyFilter(type: string, options: any): void;
77
+ /**
78
+ * Remove audio filter
79
+ * @param {string} type - Filter type
80
+ */
81
+ removeFilter(type: string): void;
82
+ /**
83
+ * Set loop mode
84
+ * @param {string} mode - Loop mode
85
+ */
86
+ setLoopMode(mode: string): void;
87
+ /**
88
+ * Get current state
89
+ * @returns {Object} Engine state
90
+ */
91
+ getState(): any;
92
+ /**
93
+ * Destroy the engine
94
+ */
95
+ destroy(): void;
96
+ }
97
+ import { Player } from './Player.js';
98
+ import { Filters } from './Filters.js';
99
+ import { Queue } from '../queue/Queue.js';
100
+ import { EventBus } from '../events/EventBus.js';
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Audio filters and effects
3
+ */
4
+ export class Filters {
5
+ constructor(audioContext: any);
6
+ audioContext: any;
7
+ filters: Map<any, any>;
8
+ enabled: Set<any>;
9
+ /**
10
+ * Apply filter
11
+ * @param {string} type - Filter type
12
+ * @param {Object} options - Filter options
13
+ */
14
+ apply(type: string, options?: any): void;
15
+ /**
16
+ * Remove filter
17
+ * @param {string} type - Filter type
18
+ */
19
+ remove(type: string): void;
20
+ /**
21
+ * Clear all filters
22
+ */
23
+ clear(): void;
24
+ /**
25
+ * Check if filter is enabled
26
+ * @param {string} type - Filter type
27
+ * @returns {boolean} Is enabled
28
+ */
29
+ isEnabled(type: string): boolean;
30
+ /**
31
+ * Get enabled filters
32
+ * @returns {Set} Enabled filter types
33
+ */
34
+ getEnabled(): Set<any>;
35
+ applyBassBoost(options?: {}): void;
36
+ applyNightcore(options?: {}): void;
37
+ applyVaporwave(options?: {}): void;
38
+ apply8DRotate(options?: {}): void;
39
+ applyPitch(options?: {}): void;
40
+ applySpeed(options?: {}): void;
41
+ applyReverb(options?: {}): void;
42
+ /**
43
+ * Connect filters to audio node
44
+ * @param {AudioNode} input - Input node
45
+ * @param {AudioNode} output - Output node
46
+ */
47
+ connect(input: AudioNode, output: AudioNode): void;
48
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Audio player with playback controls
3
+ */
4
+ export class Player {
5
+ constructor(audioEngine: any);
6
+ audioEngine: any;
7
+ audioContext: any;
8
+ source: any;
9
+ isPlaying: boolean;
10
+ currentTime: number;
11
+ duration: number;
12
+ volume: number;
13
+ loopMode: string;
14
+ eventBus: EventBus;
15
+ /**
16
+ * Play audio
17
+ * @param {Track} track - Track to play
18
+ */
19
+ play(track: Track): Promise<void>;
20
+ /**
21
+ * Pause playback
22
+ */
23
+ pause(): void;
24
+ /**
25
+ * Resume playback
26
+ */
27
+ resume(): void;
28
+ /**
29
+ * Stop playback
30
+ */
31
+ stop(): void;
32
+ /**
33
+ * Seek to position
34
+ * @param {number} time - Time in seconds
35
+ */
36
+ seek(time: number): void;
37
+ /**
38
+ * Set volume
39
+ * @param {number} volume - Volume level (0-1)
40
+ */
41
+ setVolume(volume: number): void;
42
+ /**
43
+ * Set loop mode
44
+ * @param {string} mode - Loop mode
45
+ */
46
+ setLoopMode(mode: string): void;
47
+ /**
48
+ * Load track into player
49
+ * @param {Track} track - Track to load
50
+ */
51
+ loadTrack(track: Track): Promise<void>;
52
+ /**
53
+ * Handle track end based on loop mode
54
+ */
55
+ handleTrackEnd(): void;
56
+ /**
57
+ * Get current playback state
58
+ * @returns {Object} State object
59
+ */
60
+ getState(): any;
61
+ }
62
+ import { EventBus } from '../events/EventBus.js';
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Simple event emitter for handling events
3
+ */
4
+ export class EventBus {
5
+ events: {};
6
+ /**
7
+ * Register an event listener
8
+ * @param {string} event - Event name
9
+ * @param {Function} callback - Callback function
10
+ */
11
+ on(event: string, callback: Function): void;
12
+ /**
13
+ * Remove an event listener
14
+ * @param {string} event - Event name
15
+ * @param {Function} callback - Callback function
16
+ */
17
+ off(event: string, callback: Function): void;
18
+ /**
19
+ * Emit an event
20
+ * @param {string} event - Event name
21
+ * @param {*} data - Data to pass to listeners
22
+ */
23
+ emit(event: string, data: any): void;
24
+ /**
25
+ * Remove all listeners for an event
26
+ * @param {string} event - Event name
27
+ */
28
+ removeAllListeners(event: string): void;
29
+ /**
30
+ * Get all listeners for an event
31
+ * @param {string} event - Event name
32
+ * @returns {Function[]} Array of listeners
33
+ */
34
+ listeners(event: string): Function[];
35
+ }
@@ -0,0 +1,13 @@
1
+ export { AudioEngine } from "./engine/AudioEngine.js";
2
+ export { Queue } from "./queue/Queue.js";
3
+ export { Track } from "./queue/Track.js";
4
+ export { PluginManager } from "./plugins/PluginManager.js";
5
+ export { EventBus } from "./events/EventBus.js";
6
+ export { Logger } from "./utils/Logger.js";
7
+ export { TimeUtils } from "./utils/Time.js";
8
+ export { MetadataUtils } from "./utils/Metadata.js";
9
+ export { ProbeUtils } from "./utils/Probe.js";
10
+ export { YouTubeProvider } from "./providers/YouTubeProvider.js";
11
+ export { SoundCloudProvider } from "./providers/SoundCloudProvider.js";
12
+ export { LocalProvider } from "./providers/LocalProvider.js";
13
+ export * from "./constants/Modes.js";
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Base plugin class
3
+ */
4
+ export class Plugin {
5
+ constructor(name: any, version?: string);
6
+ name: any;
7
+ version: string;
8
+ enabled: boolean;
9
+ loaded: boolean;
10
+ /**
11
+ * Called when plugin is loaded
12
+ * @param {AudioEngine} engine - Audio engine instance
13
+ */
14
+ onLoad(engine: AudioEngine): void;
15
+ engine: AudioEngine;
16
+ /**
17
+ * Called when plugin is enabled
18
+ */
19
+ onEnable(): void;
20
+ /**
21
+ * Called when plugin is disabled
22
+ */
23
+ onDisable(): void;
24
+ /**
25
+ * Hook called before play
26
+ * @param {Track} track - Track being played
27
+ */
28
+ beforePlay(track: Track): void;
29
+ /**
30
+ * Hook called after play
31
+ * @param {Track} track - Track being played
32
+ */
33
+ afterPlay(track: Track): void;
34
+ /**
35
+ * Hook called when track ends
36
+ * @param {Track} track - Track that ended
37
+ */
38
+ trackEnd(track: Track): void;
39
+ /**
40
+ * Hook called when queue updates
41
+ * @param {Queue} queue - Updated queue
42
+ */
43
+ queueUpdate(queue: Queue): void;
44
+ /**
45
+ * Get plugin info
46
+ * @returns {Object} Plugin information
47
+ */
48
+ getInfo(): any;
49
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Plugin manager for loading and managing plugins
3
+ */
4
+ export class PluginManager {
5
+ constructor(audioEngine: any);
6
+ engine: any;
7
+ plugins: Map<any, any>;
8
+ /**
9
+ * Load a plugin
10
+ * @param {Plugin} plugin - Plugin instance
11
+ */
12
+ load(plugin: Plugin): void;
13
+ /**
14
+ * Enable a plugin
15
+ * @param {string} name - Plugin name
16
+ */
17
+ enable(name: string): void;
18
+ /**
19
+ * Disable a plugin
20
+ * @param {string} name - Plugin name
21
+ */
22
+ disable(name: string): void;
23
+ /**
24
+ * Unload a plugin
25
+ * @param {string} name - Plugin name
26
+ */
27
+ unload(name: string): void;
28
+ /**
29
+ * Get plugin by name
30
+ * @param {string} name - Plugin name
31
+ * @returns {Plugin|null} Plugin instance
32
+ */
33
+ get(name: string): Plugin | null;
34
+ /**
35
+ * Get all plugins
36
+ * @returns {Map} Map of plugins
37
+ */
38
+ getAll(): Map<any, any>;
39
+ /**
40
+ * Get enabled plugins
41
+ * @returns {Plugin[]} Array of enabled plugins
42
+ */
43
+ getEnabled(): Plugin[];
44
+ /**
45
+ * Call hook on all enabled plugins
46
+ * @param {string} hook - Hook name
47
+ * @param {...*} args - Arguments to pass
48
+ */
49
+ callHook(hook: string, ...args: any[]): void;
50
+ }
51
+ import { Plugin } from './Plugin.js';
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Local file provider for Node.js
3
+ */
4
+ export class LocalProvider {
5
+ /**
6
+ * Check if path is a valid local audio file
7
+ * @param {string} path - File path
8
+ * @returns {boolean} Is valid audio file
9
+ */
10
+ static isValidPath(path: string): boolean;
11
+ /**
12
+ * Get track info from local file
13
+ * @param {string} path - File path
14
+ * @returns {Promise<Object>} Track info
15
+ */
16
+ static getInfo(path: string): Promise<any>;
17
+ /**
18
+ * Check if file exists
19
+ * @param {string} path - File path
20
+ * @returns {Promise<boolean>} File exists
21
+ */
22
+ static exists(path: string): Promise<boolean>;
23
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * SoundCloud provider for basic info fetching
3
+ */
4
+ export class SoundCloudProvider {
5
+ /**
6
+ * Check if URL is a valid SoundCloud URL
7
+ * @param {string} url - URL to check
8
+ * @returns {boolean} Is valid SoundCloud URL
9
+ */
10
+ static isValidUrl(url: string): boolean;
11
+ /**
12
+ * Get basic track info from SoundCloud URL
13
+ * @param {string} url - SoundCloud URL
14
+ * @returns {Promise<Object>} Track info
15
+ */
16
+ static getInfo(url: string): Promise<any>;
17
+ /**
18
+ * Get stream URL (not implemented without dependencies)
19
+ * @param {string} url - SoundCloud URL
20
+ * @returns {Promise<string>} Stream URL
21
+ */
22
+ static getStreamUrl(url: string): Promise<string>;
23
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * YouTube provider for basic info fetching
3
+ */
4
+ export class YouTubeProvider {
5
+ /**
6
+ * Check if URL is a valid YouTube URL
7
+ * @param {string} url - URL to check
8
+ * @returns {boolean} Is valid YouTube URL
9
+ */
10
+ static isValidUrl(url: string): boolean;
11
+ /**
12
+ * Extract video ID from YouTube URL
13
+ * @param {string} url - YouTube URL
14
+ * @returns {string|null} Video ID
15
+ */
16
+ static extractVideoId(url: string): string | null;
17
+ /**
18
+ * Get basic track info from YouTube URL
19
+ * @param {string} url - YouTube URL
20
+ * @returns {Promise<Object>} Track info
21
+ */
22
+ static getInfo(url: string): Promise<any>;
23
+ /**
24
+ * Get stream URL (not implemented without dependencies)
25
+ * @param {string} url - YouTube URL
26
+ * @returns {Promise<string>} Stream URL
27
+ */
28
+ static getStreamUrl(url: string): Promise<string>;
29
+ }