(* 
   OCaml script that queries the JSON interface of Yahoo! Image Search,
   and displays the results (not very nicely, but you can improve this part).

   What you need to compile this program:
   - json-wheel
   - json-static
   - netclient

   1) Compile

     ocamlfind ocamlopt -o yahoo yahoo.ml -linkpkg \
        -package json-static,netclient -syntax camlp4o

   2) Run

     ./yahoo "Nelson Mandela"


   For more info on JSON and Yahoo! web services, go to
     http://developer.yahoo.com/common/json.html
*)

open Printf

type json search_results =
    < result_set "ResultSet": 
      < total_results_available "totalResultsAvailable": string;
        total_results_returned "totalResultsReturned": int;
        first_result_position "firstResultPosition": int;
        result "Result": item list > >

and item =
    < title "Title": string;
      summary "Summary": string;
      url "Url": string;
      click_url "ClickUrl": string;
      referer_url "RefererUrl": string;
      file_size "FileSize": int;
      file_format "FileFormat": string option;
      height "Height": string;
      width "Width": string;
      thumbnail "Thumbnail": thumbnail >

and thumbnail =
    < url "Url": string;
      height "Height": string;
      width "Width": string >


let query_url query =
  "http://api.search.yahoo.com/ImageSearchService/V1/imageSearch?\
   appid=YahooDemo&query=" ^ 
  Netencoding.Url.encode query  ^ "&output=json"

let search query =
  let url = query_url query in
  printf "From %s\n%!" url;
  let j=
    (Json_io.json_of_string
       (Http_client.Convenience.http_get url))
  in
  printf "Got the following JSON data:\n%s\n%!"
    (Json_io.string_of_json ~compact:false j);
    
  search_results_of_json j


let display obj =
  let x = obj#result_set in
  let start = x#first_result_position in
  printf "Showing results %i-%i of %s\n" 
    start (start + x#total_results_returned - 1) x#total_results_available;
  List.iter 
    (fun x -> printf "  %s\n" x#url)
    x#result

let _ =
  match Sys.argv with
      [| _; q |] -> display (search q)
    | _ -> failwith "Usage: yahoo \"your search query\""