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
Այսքանը։ Հիմա արդեն մնում է ստացված էջերը միացնել իրար ու կազմել ամբողջական գրքի ֆայլը։

2 comments:

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

    ReplyDelete
  2. Հրաշալի է, շնորհակալութիւն։

    Ահա այսպէս հնարաւոր է կպցնել իրար եւ մէկ PDF ստանալ․

    $ cd T-001
    $ convert -verbose *․jpg +compress T-001.pdf

    Միայն առաջին էջի հետ խնդիր կայ․ բոլոր էջերը ունեն 300x300 խտութիւն, իսկ առաջին էջի համար այդ յատկութիւնը նշած չէ՝

    $ identify -verbose 001.jpg | grep -i resolution
    $ identify -verbose 002.jpg | grep -i resolution
    Resolution: 300x300
    exif:ResolutionUnit: 2
    exif:XResolution: 300/1
    exif:YResolution: 300/1
    $

    Արդիւնքում ստացուած PDF֊ում առաջին էջը միւսներից էապէս աւելի մեծ է ստացուում, ինչպէս այստեղ․ ահա առաջին տաս էջը․

    https://metax.leviathan.am:7071/db/get?id=ab4cc821-3269-4bf0-9209-7c026b1c2431#fc58dd5d-fd69-437e-9be8-e919036d8793

    Շտկելու համար կարելի է PDF փոխակերպումից առաջ այսպէս անել․
    $ mv 001.jpg orig_001.jpg
    $ convert -resample 300x300 -resize "789x1200+0+0" orig_001.jpg 001.jpg

    այստեղ հաշուի ենք առել որ երկրաչափութիւնը բոլոր էջերի 789x1200 է․
    $ identify -verbose orig_001.jpg | grep -i geometry
    Geometry: 789x1200+0+0
    Page geometry: 789x1200+0+0

    Սրանից յետոյ փոխակերպումը PDF֊ի աւելի յաջող է ստացուում։

    $ mv orig_001.jpg ..
    $ convert -verbose *․jpg +compress T-001.pdf

    Ահա առաջին տաս էջը․

    https://metax.leviathan.am:7071/db/get?id=ab4cc821-3269-4bf0-9209-7c026b1c2431#d794aef9-dfab-476c-af59-92f1b2bbe5dd

    Վերոնշեալ երկու հրահանգները՝ convert եւ identify՝ imagemagic փաթեթից են։
    Փորձն արուել է Raspbian 9.1 ՕՀ֊ում։

    ReplyDelete