Photos search example: Flickcurl Flickr API Manual

## Photos search example

Example 1. `search-photos.c`: Search for my interesting photos with a given tag and print the resulting photo IDs

    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <errno.h>

    #include <flickcurl.h>

    static const char* program;

    static const char*
    my_basename(const char *name)
    {
      char *p;
      if((p = strrchr(name, '/')))
        name = p+1;
      else if((p = strrchr(name, '\\')))
        name = p+1;

      return name;
    }

    static void
    my_message_handler(void *user_data, const char *message)
    {
      fprintf(stderr, "%s: ERROR: %s\n", program, message);
    }

    static const char* config_filename = ".flickcurl.conf";
    static const char* config_section = "flickr";

    int
    main(int argc, char *argv[])
    {
      flickcurl *fc = NULL;
      int rc = 0;
      const char* home;
      char config_path[1024];
      char* tag = NULL;
      flickcurl_photos_list_params list_params;
      flickcurl_search_params params;
      flickcurl_photos_list* photos_list = NULL;
      int i;

      program = my_basename(argv[0]);

      flickcurl_init();

      home = getenv("HOME");
      if(home)
        sprintf(config_path, "%s/%s", home, config_filename);
      else
        strcpy(config_path, config_filename);

      if(argc != 2) {
        fprintf(stderr, "%s: No tag given\n"
                        "Try `%s -h for more information.\n", program, program);
        rc = 1;
        goto tidy;
      }

      if(!strcmp(argv[1], "-h")) {
        printf("%s - search for my interesting photos about a tag\n"
               "Usage: %s TAG\n\n", program, program);

        fputs("Flickcurl home page: ", stdout);
        puts(flickcurl_home_url_string);
        puts(flickcurl_copyright_string);
        fputs("License: ", stdout);
        puts(flickcurl_license_string);
        rc = 1;
        goto tidy;
      }

      tag = argv[1];

      /* Initialise the Flickcurl library */
      fc = flickcurl_new();
      if(!fc) {
        rc = 1;
        goto tidy;
      }

      flickcurl_set_error_handler(fc, my_message_handler, NULL);

      if(!access((const char*)config_path, R_OK)) {
        if(flickcurl_config_read_ini(fc, config_path, config_section,
                                     fc, flickcurl_config_var_handler)) {
          fprintf(stderr, "%s: Failed to read config filename %s: %s\n",
                  program, config_path, strerror(errno));
          rc = 1;
          goto tidy;
        }
      }

      /* Initialise the search parameters themselves
       *  user_id: "me" - Search only photos of the calling user.
       *  sort: "interestingness-desc" - return results with most interesting first
       *  tag: TAG - search for photos about the TAG given on the command line
       */
      flickcurl_search_params_init(&params);
      /* these strings are shared and not strdup()ed since they are stored
       * in 'params" on the stack */
      params.user_id = (char*)"me";
      params.sort = (char*)"interestingness-desc";
      params.tags = tag;

      /* Initialise the search result (list) parameters:
       *   per_page: 10 - ten results per-page
       *   page: 1 - return 1 page
       *   extras: "original_format" - want the returned photos to have the
       *      original secret and format fields.
       */
      flickcurl_photos_list_params_init(&list_params);
      list_params.per_page = 10;
      list_params.page = 1;
      /* this string is shared and not strdup()ed since it is stored
       * in 'list_params" on the stack */
      list_params.extras = "original_format";

      photos_list = flickcurl_photos_search_params(fc, &params, &list_params);
      if(!photos_list)
        goto tidy;

      fprintf(stderr, "%s: Search returned %d photos\n",
              program, photos_list->photos_count);

      for(i = 0; i < photos_list->photos_count; ++i)
        printf("  Result #%d has ID %s\n", i, photos_list->photos[i]->id);

     tidy:
      if(photos_list)
        flickcurl_free_photos_list(photos_list);

      if(fc)
        flickcurl_free(fc);

      flickcurl_finish();

      return(rc);
    }

Compile it like this:

    $ gcc -o search-photos search-photos.c `pkg-config flickcurl --cflags --libs`

and assuming the flickcurl API configuration has already been created in `~/.flickcurl.conf`, run the program like this:

    $ ./search-photos kitten
    search-photos: Search returned 2 photos
      Result #0 has ID 1234567890
      Result #1 has ID 2345678901

Your kitten results may vary.