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\""