Muzikos failų tikrinimas

2013 Lapkričio 23 d  •  Remigijus Jarmalavičius  •  Atviras kodas

Jau esu rašęs straipsnį apie
savo nekuklią muzikos galeriją. Tai štai dar vienas! Šį kartą bėda
kitokia. Po praėjusio straipsnio jau turiu švarią galeriją - be jokių
pasikartojančių dainų. Deja, ne visa muzika yra klausoma - dažnai tenka
paspausti mygtuką „kita daina“.

Kad to nebūtų, nusprendžiau pasirašyti labai paprastą programėlę su
bash, kuri paleistų visas dainas po vieną einamąjame kataloge. Dainų
grojimo metu galėčiau nuspręsti dainos likimą: jeigu išklausau ją iki
galo - vadinasi daina patinka ir šalinti jos nereikia. Priešingu atveju

  • keliauja į šiukšlių dėžę.

Nepasakosiu kaip ją pasirašyti, nes kiekvienas turintis šią bėdą ją
spręstu kitaip. Štai mano variantas:

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in ./*
do
    if [ -f "$f" ]
    then
        mplayer -really-quiet "$f"
        if [ $? -eq 0 ]
        then
            echo "OK"
        else
            mv "$f" ~/Muzika/Trash/
            echo "Moved to ~/Muzika/Trash/$f"
        fi
    fi
done
IFS=$SAVEIFS

Jeigu nuspręsite pasinaudoti šia programėle tai verta išsiaiškinti ką ir
kaip ji daro.

Pirmiausiai į akį kris $IFS kintamasis. Jeigu mėginsite tiesiog naudoti
sintaksę for file in $(ls) tai susidursite su bėda, kad kiekvienas
žodis bus traktuojamas kaip failas. Taip yra dėl šio magiško
Internal File Separator kintamojo bash kalboje. Labai sunku paaiškinti
šį kintamąjį (bent jau man), čia Jums padės šie
atsakymai
.

Kaip matote, muziką leidžiame per mplayer programą. Galima leisti per
bet kurią, kuri tik pagrojus dainai grąžina teisingą rezultatą: 0 - kai
daina pagrota, 1 - kai įvyko klaida ją grojant (pvz. klausytojas
nutraukė grojimą). O aš mplayer myliu už tai, kad:

  • Galiu neišklausęs dainos paspausti ENTER klavišą - komandos
    rezultatas bus 0.
  • Galiu išklausyti visą dainą - komandas rezultatas bus 0.
  • Galiu nutraukti dainą paspaudęs CTRL+C - komandos rezultatas bus 1.

Pagal vėliau esančią sąlygą (išraiška $? reiškia buvusios komandos
išeities rezultatą - 1 (vienetą) arba 0 (nulį)) galiu nuspręsti grojamo
failo likimą. Kodėl netrinu failų? Nes kas būtų jeigu pašalinčiau jį
netyčia?

Šio paprasto skriptuko pagalba perėjau per visą muziką ir pasišalinau ko
nereikia. Tikiuosi kam nors tai bus naudinga.