import { Soundcloud, SoundcloudTrack, SoundcloudPlaylist } from 'soundcloud.ts';
import { ExtractorPlugin, ResolveOptions, Song, Playlist } from 'distube';

declare enum SearchType {
    Track = "track",
    Playlist = "playlist"
}
interface SoundCloudPluginOptions {
    clientId?: string;
    oauthToken?: string;
}
declare class SoundCloudPlugin extends ExtractorPlugin {
    soundcloud: Soundcloud;
    constructor(options?: SoundCloudPluginOptions);
    search<T>(query: string, type?: SearchType.Track, limit?: number, options?: ResolveOptions<T>): Promise<Song<T>[]>;
    search<T>(query: string, type: SearchType.Playlist, limit?: number, options?: ResolveOptions<T>): Promise<Playlist<T>[]>;
    search<T>(query: string, type?: SearchType, limit?: number, options?: ResolveOptions<T>): Promise<Song<T>[] | Playlist<T>[]>;
    validate(url: string): boolean;
    resolve<T>(url: string, options: ResolveOptions<T>): Promise<SoundCloudPlaylist<T> | SoundCloudSong<T>>;
    getRelatedSongs(song: SoundCloudSong<undefined>): Promise<SoundCloudSong<unknown>[]>;
    getStreamURL<T>(song: SoundCloudSong<T>): Promise<string>;
    searchSong<T>(query: string, options: ResolveOptions<T>): Promise<Song<T>>;
}
declare class SoundCloudSong<T> extends Song<T> {
    constructor(plugin: SoundCloudPlugin, info: SoundcloudTrack, options?: ResolveOptions<T>);
}
declare class SoundCloudPlaylist<T> extends Playlist<T> {
    constructor(plugin: SoundCloudPlugin, info: SoundcloudPlaylist, options?: ResolveOptions<T>);
}

export { SearchType, SoundCloudPlugin, type SoundCloudPluginOptions, SoundCloudPlugin as default };
