Curcy version 0.1
[curcy.git] / curcy-update
1 #!/usr/bin/env bash
2 #
3 # This script builds a file, usually /var/share/currencies where each line as the syntax
4 # <3 letter international currency code>=<decimal value>
5 # All the lines do have the same value
6 # Exemple:
7 # GBP=1.4758
8 # USD=
9 # means than $ = £ 1.4758
10 #
11 # You are free to copy / modify / redistribute / resell that file, just keep the author name.
12 # Author: Jean-Michel Vourgère <jmv_deb@nirgal.com>
13
14 set -e
15
16 target_file=/var/share/currencies
17 REFERENCE="EUR"
18 unset verbose
19 unset aggressive
20
21 curlcmd="curl --user-agent curcy -s -S"
22
23 function usage() {
24     #echo $'\n' $@ $'\n'
25     echo "Usage: curcy-update [options]"
26     echo "  -v|--verbose        Display informational messages"
27     echo "  -l|--listonly       Just list the supported currencies"
28     echo "  --aggressive        Don't sleep between server requests"
29     echo "  --target=<filename>  Set target filename. Defaults to /var/share/currencies"
30 }
31
32 function parsearg() {
33     _OPT="${1%=?*}"
34     _VAL="${1#?*=}"
35 }
36
37 for arg in "$@"; do
38     parsearg $arg
39
40     case $_OPT in
41     -v|--verbose)
42         verbose=1
43         continue
44     ;;
45     -l|--listonly)
46         listonly=1
47         continue
48     ;;
49     --aggressive)
50         echo "Setting aggressive"
51         aggressive=1
52         continue
53     ;;
54     -h|--help)
55         usage 
56         exit 0
57     ;;
58     --target)
59         target_file=$_VAL
60         continue
61     ;;
62     *)
63         echo "Unknown option $_OPT"
64         exit 22
65     ;;
66     esac
67 done
68
69 # get list of curencies
70 currencies=`$curlcmd "http://finance.yahoo.com/currency/convert?amt=1&from=${REFERENCE}&to=${REFERENCE}" \
71     | grep yfnc_tabledata1 \
72     | sed -e "s/<select name=\"from\">\(.*\)<\/select>.*<select.*/\1/g" \
73     | sed -e "s/selected //g" \
74     | sed -e "s/<option value=\"/\n/g" \
75     | grep -v script \
76     | cut -d \" -f 1`
77
78 if [ -n "$listonly" -o "$verbose" ]; then
79     echo "Supported currencies:"
80     for c in $currencies; do
81         echo -n $c$' '
82     done
83     echo
84     if [ -n "$listonly" ]; then
85         exit 0
86     fi
87 fi
88
89 [ -f $target_file.new ] && rm -r $target_file.new
90 for c in $currencies; do
91     # google doesn't do many currencies; yahoo is better in that regard
92     #equiv=`curl -s -S "http://finance.google.com/finance?q=${c}${REFERENCE}&hl=en" \
93     #    | grep -E "&nbsp;1&nbsp;${c}&nbsp;=<b>&nbsp;[0-9]+\.[0-9]+&nbsp;${REFERENCE}&nbsp;</b>" \
94     #    | sed -e "s/^&nbsp;1&nbsp;${c}&nbsp;=<b>&nbsp;\(.*\)&nbsp;${REFERENCE}&nbsp;<\/b>/\1/g"`
95
96     # http://finance.google.com/robots.txt allows /currency
97
98     equiv=`$curlcmd "http://finance.yahoo.com/currency/convert?amt=1&from=${c}&to=${REFERENCE}" \
99         | grep yfnc_tabledata1 \
100         | sed -e "s/.*<\/b>.*<b>\(.*\)<\/b>.*/\1/g"`
101     
102     if [ -n "$verbose" ]; then
103         echo 1 $c = $equiv $REFERENCE
104     fi
105     echo $c=$equiv>> $target_file.new
106
107     if [ -z "$aggressive" ]; then
108         # be nice with server: wait 1 to 2 minutes
109         sleep $(( 60 + $RANDOM % 60 ))
110     fi
111 done
112
113 mv $target_file.new $target_file