search.c

The search.c example shows how you can use search functions. It is part of the spshell program

#include <string.h>

#include "spshell.h"
#include "cmd.h"


static void print_album(sp_album *album)
{
    printf("  Album \"%s\" (%d)\n",
           sp_album_name(album),
           sp_album_year(album));
}

static void print_artist(sp_artist *artist)
{
    printf("  Artist \"%s\"\n", sp_artist_name(artist));
}

static void print_search(sp_search *search)
{
    int i;

    printf("Query          : %s\n", sp_search_query(search));
    printf("Did you mean   : %s\n", sp_search_did_you_mean(search));
    printf("Tracks in total: %d\n", sp_search_total_tracks(search));
    puts("");

    for (i = 0; i < sp_search_num_tracks(search); ++i)
        print_track(sp_search_track(search, i));

    puts("");

    for (i = 0; i < sp_search_num_albums(search); ++i)
        print_album(sp_search_album(search, i));

    puts("");

    for (i = 0; i < sp_search_num_artists(search); ++i)
        print_artist(sp_search_artist(search, i));

    puts("");
}

static void search_complete(sp_search *search, void *userdata)
{
    if (sp_search_error(search) == SP_ERROR_OK)
        print_search(search);
    else
        fprintf(stderr, "Failed to search: %s\n",
                sp_error_message(sp_search_error(search)));

    sp_search_release(search);
    cmd_done();
}



static void search_usage(void)
{
    fprintf(stderr, "Usage: search <query>\n");
}


int cmd_search(int argc, char **argv)
{
    char query[1024];
    int i;

    if (argc < 2) {
        search_usage();
        return -1;
    }

    query[0] = 0;
    for(i = 1; i < argc; i++)
        snprintf(query + strlen(query), sizeof(query) - strlen(query), "%s%s",
             i == 1 ? "" : " ", argv[i]);

    sp_search_create(g_session, query, 0, 100, 0, 100, 0, 100, &search_complete, NULL);
    return 0;
}


int cmd_whatsnew(int argc, char **argv)
{
    sp_search_create(g_session, "tag:new", 0, 0, 0, 250, 0, 0, &search_complete, NULL);
    return 0;
}



struct {
    const char *name;
    sp_radio_genre id;
} radiogenres[] = {
    { "AltPopRock",     SP_RADIO_GENRE_ALT_POP_ROCK },
    { "Blues",          SP_RADIO_GENRE_BLUES        },
    { "Country",        SP_RADIO_GENRE_COUNTRY      },
    { "Disco",          SP_RADIO_GENRE_DISCO        },
    { "Funk",           SP_RADIO_GENRE_FUNK         },
    { "Hardrock",       SP_RADIO_GENRE_HARD_ROCK    },
    { "HeavyMetal",     SP_RADIO_GENRE_HEAVY_METAL  },
    { "Rap",            SP_RADIO_GENRE_RAP          },
    { "House",          SP_RADIO_GENRE_HOUSE        },
    { "Jazz",           SP_RADIO_GENRE_JAZZ         },
    { "NewWave",        SP_RADIO_GENRE_NEW_WAVE     },
    { "RnB",            SP_RADIO_GENRE_RNB          },
    { "Pop",            SP_RADIO_GENRE_POP          },
    { "Punk",           SP_RADIO_GENRE_PUNK         },
    { "Reggae",         SP_RADIO_GENRE_REGGAE       },
    { "PopRock",        SP_RADIO_GENRE_POP_ROCK     },
    { "Soul",           SP_RADIO_GENRE_SOUL         },
    { "Techno",         SP_RADIO_GENRE_TECHNO       },
};



static void radio_usage(void)
{
    int i;
    fprintf(stderr, "Usage: radio <startyear> <stopyear> [<genre> ...]\n");
    fprintf(stderr, "  Genres:\n");
    for(i = 0; i < sizeof(radiogenres) / sizeof(radiogenres[0]); i++)
        fprintf(stderr, "\t%s\n", radiogenres[i].name);
}

int cmd_radio(int argc, char **argv)
{
    sp_radio_genre mask = 0;
    int i, j;

    if (argc < 3) {
        radio_usage();
        return -1;
    }

    for(i = 3; i < argc; i++)
        for(j = 0; j < sizeof(radiogenres) / sizeof(radiogenres[0]); j++)
            if (!strcasecmp(radiogenres[j].name, argv[i]))
                mask |= radiogenres[j].id;

    sp_radio_search_create(g_session, atoi(argv[1]), atoi(argv[2]), mask, &search_complete, NULL);
    return 0;
}

Generated on Mon Oct 31 2011 15:32:45.
Copyright © 2006–2009 Spotify Ltd