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++;
            }
        }
    }
?>

My shell scripts #4 - ThePirateBay.org search API

NOTE: This script is now deprecated. Continue to the new version.

A command-line interface for ThePirateBay.org! Usage is simple:
./tpb.sh [search string]
You can easily change transmission to any other torrent client (which supports adding torrents by URL via CLI). The dirty sed magic can be optimized, but it works as is, so why bother? ;) Enjoy!

tpb.sh script in action via PuTTY
The code:
#!/bin/ash
search() {
  q="$*"
  q=`echo $q | tr ' ' '+'`
  results=`wget -U Mozilla -qO - "http://thepiratebay.org/search/$q/0/7/0" \
    | egrep -o '(http\:\/\/.*\.torrent)|(Size\ .*B\,)|([[:digit:]]*)' \
    | sed 's///g' \
    | sed 's/<\/td>//g' \
    | sed 's/Size\ //g' \
    | sed 's/\&nbsp\;//g' \
    | sed 's/\,//g' \
    | sed 's!http://torrents.thepiratebay.org!!g' \
    | sed ':a;N;$!ba;s/\n/\ /g' \
    | sed 's!\ \/!\n\/!g' \
    | sed 's/MiB\ /M\ /g' \
    | sed 's/GiB\ /G\ /g' \
    | sed 's/KiB\ /K\ /g' \
    | cat`
  IFS=$'\n'
  longest=0
  for line in $results
  do
    length=`echo "$line" | awk '{print $1}' | wc -L`
    if [ $length -gt $longest ]
    then
      longest=$length
    fi
  done
  nth=0
  for line in $results
  do
    whites=""
    length=`echo $line | awk '{print $1}' | wc -L`
    nth=`echo "$nth + 1" | bc -l`
    spaces=`echo "$longest + 1 - $length" | bc -l`
    for i in `seq 1 $spaces`
    do
      whites=`echo "$whites "`
    done
    torrent=`echo $line | awk '{print $1}' | sed 's!\/[[:digit:]]*\/!!' | sed 's!\.[[:digit:]]*\.TPB\.torrent!!' | sed 's/_/\ /g'`
    size=`echo $line | awk '{print $2}'`
    size=`printf '%10s' "$size"`
    seeds=`echo $line | awk '{print $3}'`
    seeds=`printf '%5s' "$seeds"`
    peers=`echo $line | awk '{print $4}'`
    peers=`printf '%5s' "$peers"`
    if [ $nth -lt 10 ]
    then
      nth=" $nth"
    fi
    echo -e "$nth  $torrent$whites\033[1;34m$size\t\033[1;31m$seeds\t\033[1;32m$peers\033[0m"
  done
}
download() {
  echo -n "Download? "
  read num
  if [ $num -eq 0 ]
  then
    exit 1
  else
    i=0
    for line in $results
    do
      i=`echo "$i + 1" | bc -l`
      if [ $i -eq $num ]
      then
        link=`echo "$line" | awk '{print $1}'`
        echo "Downloading torrent file."
        transmission-remote -a "http://torrents.thepiratebay.org$link"
        echo "Torrent added."
        exit 0
      fi
    done
  fi
}
search $*
download
unset IFS
exit 0