воскресенье, 19 сентября 2010 г.

Google images + stardict sound + anki

И так не сказать что все прошло гладко :) ОДнаждый меня забанил гугл, после того как я в 26 потоков началу него выпрашивать картинки, поэтому пришлось немного переписать скрипт.
Работает следующим образом. У меня 14 тыщ звуковых файлов. я их смотрю и отправляю запрос вида
http://www.google.com/images?....

Ну и после этого мне возвращается несколько картинок, я беру всего 3, их склеиваю в одно изображение и приписываю перевод который мне дает stardict (тоже узкое место, из за того что куча словарей и иногда получается билеберда)
и на выходе получаем следующее
например на заброс backbone получается такая вот карточка

ball

call


если все ок, то звуковой файл кладется рядышком, и переход на следующую итерацию, если вдруг гугл нас банит - то ни одно изображение до нас не доходит и программа завершается.
скрипт для запуска
#!/bin/bashls
TERM=xterm
export TERM
THREADS=3
TIMEOUT=5s

for FOLDER in /usr/share/stardict/sounds/Sound_En/*;
do
bash ../ganki.sh "$FOLDER" &
while [ "`jobs -p|wc -l`" -ge $THREADS ];
do
sleep $TIMEOUT
done
done



все чем он занимается это запускает основной в несколько потоков (тут можно настроить timeout с которым он опрашивает сколько потоков в текущий момент крутится и количество тредов), также обратите внимание что он запускает (это 2й основной скрипт) и по чему идет цикл (это рутовая директория аудиофайлов в которой 26 дирикторий с английскими буковками, внутри которых аудиофайлы с словами на эту букву)


#!/bin/bash
# Great thanks image download function creator http://www.krazyworks.com/wget-google-image-collector/
TMP_FILE=g.src.tmp
IMAGE_COUNT=3
SIZE="large"


FONT="/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf"

ROOT_FOLDER=$1;
OUT_DIR=$(echo $ROOT_FOLDER|sed "s/.*\///g")

if [ ! -d "$OUT_DIR" ]
then
mkdir $OUT_DIR
fi

for SOUND_FILE in $ROOT_FOLDER/*;
do
cp $SOUND_FILE $OUT_DIR;
KEYWORD=`echo ${SOUND_FILE/*\//}|sed "s/.ogg//g"`;
echo $OUT_DIR:$KEYWORD;
CAPTION=$(sdcv -n $KEYWORD|grep -A 10 Ru|egrep '^ *[1-3]\)'|head -n 2|sed "s/^ *[0-9].//g"|tr "\n" ", ")
if [ -z "$CAPTION" ];
then
CAPTION=$(sdcv -u 'LingvoUniversal (En-Ru)' $KEYWORD|tail -n 2|tr "\n" ", ")
fi
CAPTION=$(echo $CAPTION|sed 's/[\,]* *$//g');





# download images from google
i=0
URL="http://images.google.com/images?q=${KEYWORD}&svnum=100&hl=en&lr=&safe=off&sa=G&imgsz=${SIZE}"
wget -q -U Mozilla -O "${OUT_DIR}/results_${i}.txt" "$URL" -e robots=off

cat "${OUT_DIR}/results_${i}.txt" | sed 's/href/\n/g' | grep imgurl | grep imgrefurl | sed 's/imgurl=/@/g' | sed 's/&imgrefurl/@/g' | awk -F'@' '{print $2}' > "${OUT_DIR}/image_urls.txt"
results=$(cat "${OUT_DIR}/results_${i}.txt" | sed 's/border/\n/g' | fgrep '&start=' | fgrep -v '&start=0' | uniq | fgrep '
' | wc -l | awk '{print $1}')

i=1
while [ $i -lt $results ]
do
(( START = i * 20 ))
URL="http://images.google.com/images?q=${KEYWORD}&svnum=100&hl=en&lr=&safe=off&sa=G&imgsz=${SIZE}&start=${START}"
wget -q -U Mozilla -O "${OUT_DIR}/results_${i}.txt" "$URL" -e robots=off
cat "${OUT_DIR}/results_${i}.txt" | sed 's/href/\n/g' | grep imgurl | grep imgrefurl | sed 's/imgurl=/@/g' | sed 's/&imgrefurl/@/g' | awk -F'@' '{print $2}' >> "${OUT_DIR}/image_urls.txt"
(( i = i + 1 ))
done


find "$OUT_DIR" -type f -name "results_*.txt" -exec rm {} \;
cat "${OUT_DIR}/image_urls.txt" | fgrep '.jpg' | head -n ${IMAGE_COUNT} > /tmp/google_image_collector_${KEYWORD}.tmp
mv /tmp/google_image_collector_${KEYWORD}.tmp "${OUT_DIR}/image_urls.txt"

if [ -f "${OUT_DIR}/image_urls.txt" ]
then
clear
COUNT=$(cat "${OUT_DIR}/image_urls.txt" | wc -l | awk '{print $1}')
#echo "Found $COUNT images matching $KEYWORD"
if [ $COUNT -eq 0 ];
then
echo $OUT_DIR:"gooogle probably block me"
exit 0;
fi
j=1
cat "${OUT_DIR}/image_urls.txt" | while read LINE
do
wget -q -U Mozilla -nd -t 1 -T 5 -O "${OUT_DIR}/${KEYWORD}_${j}.jpg" "$LINE" -e robots=off

convert -resize '200x200' "${OUT_DIR}/${KEYWORD}_${j}.jpg" "${OUT_DIR}/${KEYWORD}_${j}.jpg"
(( j = j + 1 ))

done
fi


convert -size 640x260 gradient: "${OUT_DIR}/grad.jpg"
for ii in `seq 1 3`;
do
composite -compose Copy -geometry +$((10*(ii)+200*(ii-1)))+10 "${OUT_DIR}/${KEYWORD}_$ii.jpg" "${OUT_DIR}/grad.jpg" "${OUT_DIR}/grad.jpg"
rm "${OUT_DIR}/${KEYWORD}_$ii.jpg"
done

convert -background none -fill white -font $FONT -pointsize 18 -size 620x80 -gravity South caption:"$CAPTION" "${OUT_DIR}/caption.gif"
composite -gravity South "${OUT_DIR}/caption.gif" "${OUT_DIR}/grad.jpg" "${OUT_DIR}/$KEYWORD.jpg"
rm "${OUT_DIR}/grad.jpg"
rm "${OUT_DIR}/caption.gif"

done

exit 0


работает это следующим образом - создаете эти 2 скрипта в одной дириктории, у меня это ganki_root.sh и ganki.sh а также дирикторию (у меня это ganki)
далее
cd ganki
chmod a+x ../ganki_root.sh
../ganki_root.sh


ну а потом, уже когда карточки будут готовы, или гугл пошлет :), можно воспользоватся вот этой инструкцией
Медиа дека для Anki и создать деку для ганки (по аналогии)
хотя наверно даже большого скрипта писать не надо и достаточно из консоли написать один for и создать нужный файл (если вдруг понадобится, то напишу как :)
Вобще наверно логичнее не писать перевод в карточку, а добавлять текстом в деку.. (это так.. для разнообразия и практики с imagemagic)


большой респект человеку написавшим сей скрипт и сэкономившему мне кучу времени с работой google.com/images

2 комментария:

Offoffoff комментирует...

Гениально же. Почему нет воссторженных комментариев поклонников блога? Это же надо такое придумать.
P.S. "ОДнаждый меня забанил гугл, после того как я в 26 потоков началу него выпрашивать картинки" Жжжжошь. Я думал это идиома. А оказывается такое бывает.

NiCloAy комментирует...

Пасиба OffOffOff.
Народ больше интересуется соседней веткой - где я рассказываю как эти картинки задействовать в деке для анки.
Все направленно на быстрейшее заучивание слов :).. Ну а этот скрипт менее полезен.. хотя как пример вполне ничего.
Вобще для anki перевод лучше добавлять текстом в карточку чем в картинку.