import { ApiConfig, ApiInitConfig, InitResponse, GetGenresResponse, SearchResponse, Playlist, GetTrackResponse, GetTrackSupplementResponse, GetTrackDownloadInfoResponse, GetFeedResponse, GetAccountStatusResponse, Track, TrackId, HttpClientInterface, SearchOptions, ConcreteSearchOptions, SearchAllResponse, SearchArtistsResponse, SearchTracksResponse, SearchAlbumsResponse, AlbumId, Album, AlbumWithTracks, FilledArtist, Artist, ArtistId, ArtistTracksResponse, LikedTracks } from "./types";
export default class YMApi {
    private httpClient;
    private config;
    private user;
    constructor(httpClient?: HttpClientInterface, config?: ApiConfig);
    private getAuthHeader;
    /**
     * Authentication
     */
    init(config: ApiInitConfig): Promise<InitResponse>;
    /**
     * GET: /account/status
     * Get account status for curren user
     */
    getAccountStatus(): Promise<GetAccountStatusResponse>;
    /**
     * GET: /feed
     * Get the user's feed
     */
    getFeed(): Promise<GetFeedResponse>;
    /**
     * GET: /genres
     * Get a list of music genres
     */
    getGenres(): Promise<GetGenresResponse>;
    /**
     * GET: /search
     * Search artists, tracks, albums.
     */
    search(query: string, options?: SearchOptions): Promise<SearchResponse>;
    searchArtists(query: string, options?: ConcreteSearchOptions): Promise<SearchArtistsResponse>;
    searchTracks(query: string, options?: ConcreteSearchOptions): Promise<SearchTracksResponse>;
    searchAlbums(query: string, options?: ConcreteSearchOptions): Promise<SearchAlbumsResponse>;
    searchAll(query: string, options?: ConcreteSearchOptions): Promise<SearchAllResponse>;
    /**
     * GET: /users/[user_id]/playlists/list
     * Get a user's playlists.
     */
    getUserPlaylists(user?: number | string | null): Promise<Array<Playlist>>;
    /**
     * GET: /users/[user_id]/playlists/[playlist_kind]
     * Get a playlist without tracks
     */
    getPlaylist(playlistId: number, user?: number | string | null): Promise<Playlist>;
    /**
     * GET: /users/[user_id]/playlists
     * Get an array of playlists with tracks
     */
    getPlaylists(playlists: Array<number>, user?: number | string | null, options?: {
        mixed?: boolean;
        "rich-tracks"?: boolean;
    }): Promise<Array<Playlist>>;
    /**
     * POST: /users/[user_id]/playlists/create
     * Create a new playlist
     */
    createPlaylist(name: string, options?: {
        visibility?: "public" | "private";
    }): Promise<Playlist>;
    /**
     * POST: /users/[user_id]/playlists/[playlist_kind]/delete
     * Remove a playlist
     */
    removePlaylist(playlistId: number): Promise<"ok" | string>;
    /**
     * POST: /users/[user_id]/playlists/[playlist_kind]/name
     * Change playlist name
     */
    renamePlaylist(playlistId: number, name: string): Promise<Playlist>;
    /**
     * POST: /users/[user_id]/playlists/[playlist_kind]/change-relative
     * Add tracks to the playlist
     */
    addTracksToPlaylist(playlistId: number, tracks: Array<{
        id: number;
        albumId: number;
    }>, revision: number, options?: {
        at?: number;
    }): Promise<Playlist>;
    /**
     * POST: /users/[user_id]/playlists/[playlist_kind]/change-relative
     * Remove tracks from the playlist
     */
    removeTracksFromPlaylist(playlistId: number, tracks: Array<{
        id: number;
        albumId: number;
    }>, revision: number, options?: {
        from?: number;
        to?: number;
    }): Promise<Playlist>;
    /**
     * GET: /tracks/[track_id]
     * Get an array of playlists with tracks
     */
    getTrack(trackId: TrackId): Promise<GetTrackResponse>;
    /**
     * GET: /tracks/[track_id]
     * Get single track
     */
    getSingleTrack(trackId: TrackId): Promise<Track>;
    /**
     * GET: /tracks/[track_id]/supplement
     * Get an array of playlists with tracks
     */
    getTrackSupplement(trackId: TrackId): Promise<GetTrackSupplementResponse>;
    /**
     * GET: /tracks/[track_id]/download-info
     * Get track download information
     */
    getTrackDownloadInfo(trackId: TrackId): Promise<GetTrackDownloadInfoResponse>;
    /**
     * Get track direct link
     */
    getTrackDirectLink(trackDownloadUrl: string): Promise<string>;
    /**
     * GET: /albums/[album_id]
     * Get an album
     */
    getAlbum(albumId: AlbumId, withTracks?: boolean): Promise<Album>;
    getAlbumWithTracks(albumId: AlbumId): Promise<AlbumWithTracks>;
    /**
     * GET: /albums
     * Get an albums
     */
    getAlbums(albumIds: Array<AlbumId>): Promise<Array<Album>>;
    /**
     * GET: /artists/[artist_id]
     * Get an artist
     */
    getArtist(artistId: ArtistId): Promise<FilledArtist>;
    /**
     * GET: /artists
     * Get an artists
     */
    getArtists(artistIds: Array<ArtistId>): Promise<Array<Artist>>;
    /**
     * GET: /artists/[artist_id]/tracks
     * Get tracks by artist id
     */
    getArtistTracks(artistId: ArtistId, options?: SearchOptions): Promise<ArtistTracksResponse>;
    getLikedTracks(user?: number | string | null): Promise<LikedTracks>;
}
