ID3 tag kiolvasása mp3 fájlból

ID3 tag kiolvasása mp3 fájlból

Hozzászólások

Tisztelt Kollégák!
Megvalósulni látszik egy régi álmom: CSAK Bash scriptezéssel kiolvasni az ID3 tag-eket, és a szabványos kimenetre, esetleg fájlba küldeni.
Ha valakit érdekel, itt a forrás:

#!/bin/bash
stripout() {
echo "------------------------------------------------------------------------------------"
echo " $strip"
echo "------------------------------------------------------------------------------------"

cat -A "$strip" | grep -A1 TIT2 | head -c 500 | sed s/"TIT3"/"\n"/g | sed s/[^a-zA-Z0-9\\t" "\':,-\.]/"<>"/g |\
sed s/ID3[\<\>]*/""/g | sed s/"TENC<>"/"\n\n\n"/g | grep -m1 TIT2 | sed s/"<>"*[A-Z]*"<>"*/""/g | \
sed s/[\<\>GvC]*TIT2[\<\>]*/"\nTitle:\t\t"/g | \
sed s/TPE1[\<\>]*/"\nArtist:\t\t"/g | \
sed s/TALB[\<\>]*/"\nAlbum:\t\t"/g | \
sed s/TRCK[\<\>]*/"\nTrack:\t\t"/g | \
sed s/TYER[\<\>]*/"\nYear:\t\t"/g | \
sed s/TCOP[\<\>]*/"\nCopyright:\t"/g | \
sed s/TOPE[\<\>]*/"\nPerformer:\t"/g | \
sed s/TCOM[\<\>]*/"\nComment:\t"/g | \
sed s/TCON[\<\>]*C*/"\nStyle:\t\t"/g | \
sed s/COMM[\<\>]*/"\nComment:\t"/g | \
sed s/TORY[\<\>]*[a-zA-Z0-9]*/""/g | sed s/[0-9][0-9][0-9][0-9]/"\\0\n"/g
echo "------------------------------------------------------------------------------------"

}
oldstrip() {
echo "------------------------------------------------------------------------------------"
echo " $strip"
echo "------------------------------------------------------------------------------------"

cat -A "$strip" | tail -c 526 | sed s/"TAG"/"\n"/g | tac | sed s/[^a-zA-Z0-9\\t" "\':,-\.]/" "/g | sed s/" "/"\n"/g | uniq -u | head -n4 | \
sed s/[0-9][0-9][0-9][0-9]/"\\0\n"/g
echo "------------------------------------------------------------------------------------"

}
oldstyle="no";
while getopts ":o" kapcs
do
case "$kapcs" in
"o") oldstyle="yes";;
esac
done
if [ $oldstyle = "no" ]
then
if [ $1 ]
then
strip=$1;
stripout;
exit 0;
fi
fi
if [ $2 ]
then
if [ "$oldstyle" = "yes" ]
then
strip=$2;
oldstrip;
else
stripout;
fi
exit 0
fi

if [ !$1 ]
then
for i in `ls *.[mM][pP]3 | sed s/" "/"~~~"/g`
do
i=`echo $i | sed s/"~~~"/" "/g`
strip=$i;

if [ "$oldstyle" = "yes" ]
then
oldstrip;
elif [ "$oldstyle" = "no" ]
then
stripout;
fi
done
#echo "------------------------------------------------------------------------------------"
fi
exit 0

Indítás: script_neve [mp3-fajl] # ilyenkor kiírja a v2-es ID3 tag-eket.
script_neve -o [mp3-fajl] # kiírja az "old style" tag-eket.
HA elmarad az mp3-fajl argumentum, akkor a könyvtáron rekurzív módon halad végig.

Még nem tökéletes, a "magyar" karaktereket nem igazán kezeli, ha tud valaki segíteni a fejlesztésben, megköszönném.

Egyelőre még csak nézegetem a kódot, de pár dolgot megemlítenék:

a) ha a "cat -A" heleyett a "cat -tev" formát használnád, akkor nem csak GNU-s cat-tal menne (nekem neten meg kellett keresni, hogy mi a franc a cat -A opciója - /me nem nagyon használ Linux -, míg a cat -teve forma már 20 évvel ezelőtti UNIX-okban is ismert volt, és az a mai napig)
b) sztem olcsóbb (azaz sokkal kevesebb processzt használsz), ha nem
sed egyikparancs | sed másikparancs | sed harmadikparancs
formát használsz, hanem
sed -e egyikparancs -e másikparancs -e harmadikparancs
alakot.
Majd ha már jobban kiveséztem, és látom hogyan működik, lehet, hogy jövök.

További anyázások, mert még mindig nem egészen látom át:
ha az egész sed parancsot raknád idézőjelek közé, és nem csak mindig a veszélyesnek itélt részt, akkor sokkal átláthatóbb lenne a dolog. Ha meg ráadásul nem idézőjelet, hanem aposztrófot használnál, pláne - meg lehetne spórolni egy rakat repjelet (gy.k: backslash -t)
Ja, hibák:
a) getopt -tal ugyan ellenőrzöd az opciókat, de sehol nem dobod el őket (azaz a
while getopts ; do ... ; done
után kéne lennie egy
shift $(( OPTIND - 1 ))
parancsnak is, és könnyebb lenne a paraméterek feldolgozása.)
b) a [ !$1 ] szerinted mit kéne teszteljen? Ugyanis a [ egysztring ] opció ellenjavallt, helyette a [ -n egysztring ] az ajánlott, ha pedig az ellentettjét akarod tesztelni, akkor [ -z egysztring ] formát érdemes követni.

huh, indent nelkul ezigy eleg gazos :wink:

Na, én elindítottam, azért tettem ide fel, hogy ha valaki tudja folytatni, segítsen. :)