Sunday, April 7, 2013

Bash: Հայկական ժողովրդական հեքիաթներ

Վերջերս հայտնաբերեցի մի հղում՝ http://serials.flib.sci.am/openreader/, որը տանում է ՀՀ ԳԱԱ ինչ-որ բաժնի կողմից սկանավորված գրքերի բավականին մեծ պաշարի։ Ցուցակում ինձ հետաքրքրեցին «Հայկական Ժողովրդական Հեքիաթներ»-ի ակադեմիական հրատարակության 15 հատորները։ Դես ու դեն քչփորելուց հետո պարզեցի, որ չեմ կարողանալու հատորները ներբեռնել ամբողջական ֆայլի տեսքով։ Միակ տարբերակը մնում էր էջ առ էջ ներբեռնելը։ Հետո պարզեցի, որ ամեն մի գրքի համար առանձնացված է մի պանակ, իսկ այդ պանակում գրքի էջերը եռանիշ թվերով համարակալված JPG ֆայլեր են։ Օրինակ, առաջին հատորի էջերի պանակը հետևյալն է․
http://serials.flib.sci.am/openreader/jox_heqiatner_1/book/
Մյուս հատորների համար պարզապես 1-15 միջակայքում փոխվում է «jox_heqiatner_» պանակի համարը։

Գրեցի մի սկրիպտ, որի արգումենտում պետք է տալ, թե որ հատորն եմ ուզում ներբեռնել և այն կստեղծի առանձին պանակ ու դրա մեջ կներբեռնի տրված հատորի էջերի բոլոր JPG ֆայլերը։ Սկրիպտի սկզբում նախ ստուգում եմ, որ տրված լինի միայն մեկ արգումենտ և այդ արգումենտը լինի ամբողջ թիվ։
#!/bin/bash

if [[ $# -ne 1 ]]
then 
  echo Enter book number, an integer between 1 and 15.
  exit 1
fi

if ! [[ $1 =~ ^[0-9]+$ ]]
then
  echo Argument is not an integer.
  exit 2
fi
Հետո ձևավորում եմ երկու հասցե՝ bookurl - էջերի հասցեն, և destdir - ներբեռնված ֆայլերի հասցեն։ Եթե արդեն գոյություն ունի destdir պանակը, ապա այն ջնջում եմ ու ստեղծում եմ նորը։
bookurl="http://serials.flib.sci.am/openreader/jox_heqiatner_$1/book/"
destdir=$(pwd)$(printf "/T-%.3d/" $1)

rm -rf ${destdir}
mkdir ${destdir}
Էջերը հերթականությամբ ներբեռնելու համար page փոփոխականը արժեքավորում եմ 1 սկզբնական արժեքով․ այն ցույց է տալու հերթական էջը։ Հետո կազմակերպում եմ անվերջ ցիկլ, որի մարմնում wget ծրագրով բեռնում եմ հերթական ֆայլը։ Ցիկլի կատարում ընդհատվում է այն ժամանակ, երբ wget ծրագիրը չի կարողանում բեռնել ֆայլը և վերադարձնում է զրոյից տարբեր ավարտի կոդ։
page=1
while true
do
  # էջի համարը դարձնել եռանի
  num=$(printf "%.3d.jpg" ${page})
  # բեռնել հերթական էջը
  wget -q ${bookurl}${num} -O ${destdir}${num}
  # ստուգել wget-ի ավարտի կոդը
  if [[ $? -ne 0 ]]
  then
    # ընդհատել ցիկլը
    echo Done
    # ջնջել զրոյական ֆայլը
    rm -rf ${destdir}${num}
    break
  fi
  echo -n ${page} ' '
  # հաշվել հաջորդ էջի համարը
  page=$(expr ${page} + 1)
done
Այսքանը։ Հիմա արդեն մնում է ստացված էջերը միացնել իրար ու կազմել ամբողջական գրքի ֆայլը։

1 comment:

  1. Լավն էր, շնորհակալություն կիսվելու համար

    ReplyDelete