My shell scripts #5 - Google dictionary API (word definitions)

This two-file google dictionary API, which returns a full definition of a given word in all its forms (noun, adjective, verb, abbreviation, ...), along with a direct link to an mp3 file containing the word spoken by a google text-to-speech api (and a lot of other useful informations).
This script is divided into two separate scripts (shell and PHP) only because it is quite hard to parse JSON strings with line-oriented text processors (sed, grep, ...you get the idea). First, the shell script gets the actual data from google, does some filtering and substitution to make it easier for the following PHP script, which then iterates through the parsed JSON string and outputs the data you want (and also adds some colour).
Don't forget to change the names and paths accordingly to suit your environment and needs.

The shell script:
#!/bin/ash
lang="en"
if [ "$1" = "-" ]
then
  read word
else
  word="$*"
  word=`echo $word | sed 's/\ /\+/g'`
fi
if [ ! -n "$word" ]
then
  echo Specify a word to lookup in glossary.
  echo Usage:
  echo "  dict word"
  echo "use - (dash) if reading word from stdin"
  exit 1
else
  wget -qO - "http://www.google.com/dictionary/json?callback=dict_api.callbacks.id100&q=$word&sl=$lang&tl=$lang&restrict=pr,de&client=te" \
  | sed 's/dict_api\.callbacks.id100.//' \
  | sed 's/\,\"webDefinitions.*//' \
  | sed 's/\\x3cem\\x3e//g' \
  | sed 's/\\x3c\/em\\x3e//g' \
  | sed "s/\\\x27/\'/g" \
  | php-cli /opt/scripts/gloss-json.php
fi
exit 0
And the PHP one:
    $fd = fopen("php://stdin", "r");
    $json = "";
    while (!feof($fd)) {
        $json .= fread($fd, 1024);
    }
    $json = $json.'}';
    //var_dump(json_decode($json));
    $json = json_decode($json);
    $word = $json->query;
    $primaries = count($json->primaries);
    if ($primaries == 0) echo "Sorry, no match.\n";
    for ($i = 0; $i < $primaries; $i++) {
        echo "\033[1;36m" , $json->primaries[$i]->terms[0]->text , " | ", $json->primaries[$i]->terms[0]->labels[0]->text ,
             "  ";
        if ($json->primaries[$i]->terms[1]->type == "phonetic") echo $json->primaries[$i]->terms[1]->text;
        echo "\033[0m\n";
        $cnt = 1;
        for ($j = 0; $j < count($json->primaries[$i]->entries); $j++) {
            if ($json->primaries[$i]->entries[$j]->type == "related") {
                for ($l = 0; $l < count($json->primaries[$i]->entries[$j]->terms); $l++) {
                    echo "\033[0;36m" , $json->primaries[$i]->entries[$j]->terms[$l]->text , "\033[0m ";
                    echo $json->primaries[$i]->entries[$j]->terms[$l]->labels[0]->text , "; ";
                }
                echo "\n";
            }
            if ($json->primaries[$i]->entries[$j]->type == "meaning") {
                echo "  " , $cnt , ") " , $json->primaries[$i]->entries[$j]->terms[0]->text , "\n";
                for ($k = 0; $k < count($json->primaries[$i]->entries[$j]->entries); $k++) {
                    echo "    * " , $json->primaries[$i]->entries[$j]->entries[$k]->terms[0]->text , "\n";
                }
                $cnt++;
            }
        }
    }
?>

No comments:

Post a Comment