import { VoiceChannel, TypedEmitter, TrackMetadata } from "./types";
import EventEmitter from "events";
export interface MusicPlayerOptions {
    autoLeaveOnEmptyQueue?: boolean;
    autoLeaveOnIdleMs?: number;
}
/**
 * MusicPlayer
 *  - Manages voice connection, playback, queue, history, and loop modes
 *  - Emits events defined in MusicPlayerEvent
 */
export declare class MusicPlayer extends EventEmitter<TypedEmitter> {
    channel: VoiceChannel;
    private previousQueueOrder;
    private connection;
    private player;
    private volume;
    private queue;
    private history;
    private loopQueue;
    private loopTrack;
    private playing;
    private autoLeaveOnEmptyQueue;
    private autoLeaveOnIdleMs;
    private idleTimer;
    private shuffield;
    /**
     * @param channel   The Discord voice channel to connect to
     * @param initialVolume  Initial volume in percent (0–100)
     * @param options   Configuration options (auto-leave, idle timeout)
     */
    constructor(channel: VoiceChannel, initialVolume?: number, options?: MusicPlayerOptions);
    private startIdleTimer;
    /**
     * Search Google and scrape lyrics snippets.
     * Returns the lyrics or null if not found.
     *
     * @param title   Song title
     * @param artist  Optional artist name, for more accurate search
     */
    searchLyrics(title: string, artist?: string): Promise<string | null>;
    private clearIdleTimer;
    /**
     * Connect to the voice channel if not already connected.
     * Waits until the connection is READY or emits an error.
     */
    private ensureConnection;
    search(query: string): Promise<string>;
    private createStreamFromScdl;
    private createStreamFromYtdl;
    private createStreamFromPlayDl;
    private fetchMetadata;
    private playUrl;
    /**
     * Play a song by query or URL.
     * If already playing, adds to queue and emits a queueAdd event.
     * Otherwise, starts immediate playback via playUrl().
     *
     * @param input  YouTube URL or search query (e.g. “Coldplay Yellow”)
     */
    play(input: string): Promise<void>;
    pause(): void;
    resume(): void;
    setVolume(percent: number): void;
    /**
     * Handle when the player becomes idle.
     * - If loopTrack is on, replay current track
     * - Else if queue has items, play next
     * - Otherwise, emit finish and optionally disconnect
     */
    private onIdle;
    skip(): void;
    /**
     * Jump to the previous track.
     * Pops current and last URLs from history, re-queues the current,
     * and starts playback of the previous one.
     */
    previous(): Promise<void>;
    /**
     * Shuffle the queue randomly.
     * Saves the current queue order so you can undo.
     */
    shuffle(): void;
    /**
     * Restore the queue to its previous order,
     * excluding any tracks that have already been played.
     */
    undoShuffle(): void;
    toggleLoopQueue(): void;
    isLoopQueue(): boolean;
    toggleLoopTrack(): void;
    isLoopTrack(): boolean;
    disconnect(): void;
    stop(noLeave?: boolean): void;
    getQueue(): TrackMetadata[];
    getVolume(): number;
    isPlaying(): boolean;
    isPaused(): boolean;
    isShuffiled(): boolean;
    private createError;
}
/**
 * @copyright
 * Code by Sobhan-SRZA (mr.sinre) | https://github.com/Sobhan-SRZA
 * Developed for Persian Caesar | https://github.com/Persian-Caesar | https://dsc.gg/persian-caesar
 *
 * If you encounter any issues or need assistance with this code,
 * please make sure to credit "Persian Caesar" in your documentation or communications.
 */ 
