Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: makak 10 Dubna 2011, 18:47:46

Název: pomoc s príkazom - mp3 bitrate
Přispěvatel: makak 10 Dubna 2011, 18:47:46
Nazdar.

Chcel by som zbúchať nejaký skript, ktorý by mi do textového súboru vypísal názvy všetkých albumov (aj interpretov), ktoré majú nižší bitrate ako 256kbps, prípadne ak nie sú v mp3, tak ich vypíše povedzme s hviezdičkou pred názvom.

Na bitrate mám je jeden tool - exiftool, ktorý mi vypíše pri vstupe "exiftool -AudioBitrate nazov_pesnicky.mp3" výstup v tvare "Audio Bitrate : XXX kbps".

Čiže potrebujem prejsť rekurzívne všetky priečinky, z každého zobrať náhodne jeden súbor (alebo prvý súbor), spustiť na ňom exiftool -AudioBitrate, nejak z neho dostať hodnotu bitratu, porovnať či je menšia ako 256, a ak je, vypísať cestu k súboru vzhľadom na priečinok s hudbou, prípadne ak nedá žiadnu hodnotu, tak vypísať cestu a pred ňu hviezdičku.

Pomôže mi niekto ?
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 10 Dubna 2011, 20:46:12
tohle ti vypíše všechny empétrojky ve složce Hudba s tokem menším než 256K, stačí ?
Kód: [Vybrat]
IFS="\n"
find Hudba/ -iname *.mp3 | while read i; do [ `exiftool -p '$AudioBitrate' "$i"` -lt 256000 ] && echo "$i"; done
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: daysleeper 10 Dubna 2011, 21:23:44
mensi problem  ;)
Kód: [Vybrat]
$ find Hudba/ -iname *.mp3 | while read i; do [ `exiftool -p '$AudioBitrate' "$i"` -lt 256000 ] && echo "$i"; done

find: paths must precede expression: sms2.mp3
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: makak 10 Dubna 2011, 21:42:00
Mne zas píše

Kód: [Vybrat]
bash: [: too many arguments
A všetky mp3ky keď mi vypíše, to mi moc nepomôže. Mal by som iba pár stoviek názvov súborov v tvare "XX - nazov_pesnicky.mp3" a zas by som musel hľadať na ktorom albume to bolo, a tak.
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: daysleeper 10 Dubna 2011, 22:22:18
mozna
Kód: [Vybrat]
find ~/Hudba -type d | while read dir; do find "$dir" -maxdepth 1 -type f -iname '*.mp3' | ( read F && { br=`file "$F" | grep -Eo '[0-9]+\ kbps' | sed 's:\ kbps::'`; [[ $br -lt 256 ]] && echo "$F - $br"; } || echo "$dir - no music here"); doneje pouzito jen "file", zmen si na exiftool pokud potreba
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 10 Dubna 2011, 22:25:02
ok, najde všechny složky ve složce Hudba, ve kterých je alespoň jedna empétrojka  s tokem menším než 256K
Kód: [Vybrat]
IFS="\n"
find Hudba/ -iname *.mp3 | while read i; do [ `exiftool -p '$AudioBitrate' "$i"` -lt 256000 ] && dirname "$i"; done | sort -u
(jen to nějakejch pár minut trvá no)

teď už jenom vymyslet proč mi to jede a vám ne :D
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: makak 11 Dubna 2011, 00:40:40
Tipujem to na inú verziu programu. Tebe možno vypľuje ten príkaz iba integer, mne to hádže v tvare "XXX kbps".

Tomu nasvedčuje aj chyba, ktorú mi vypisuje :
Kód: [Vybrat]
bash: [: 320 kbps: integer expression expected
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 11 Dubna 2011, 17:05:03
Takže máš asi Ubuntu 10.04 nebo starší. No než abysme se s tím plácali bude nejjednodužší když si prostě nainstaluješ verzi z mavericka (http://packages.ubuntu.com/maverick/libimage-exiftool-perl).
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: makak 11 Dubna 2011, 18:10:39
Nope, mám Mavericka, exiftool dokonca novší ako to čo si postoval (nie 8.15-1, ale 8.54). Neinštaloval som to z repo, ale sťahoval z ich stránky.
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: GR!nCh 11 Dubna 2011, 19:35:52
Posílám script, který jsem pro tuto činnost taky někdy napsal a přenechávám volně k inspiraci. Výsledek otvírám v OOo Calc pro větší přehlednost.
Kód: [Vybrat]
#!/bin/bash
#
# Projde rekurzivne vsechny soubory a adresare v aktualnim adresari.
# U kazde mp3ky vypise:
#
# bitrate;soubor;cislo;nazev;umelec;album;rok;zanr
#

rec_bitrate()
{
  cd "$1"
  for x in *; do
    if [ -d "$x" ]; then #je-li prvek adresare adresar
      echo "$x" #tisk nazvu adresare
      ( rec_bitrate "$x" ) #rekurzivni pruchod adresarovou strukturou
    elif [ `echo ${x##*.} | tr [:upper:] [:lower:]` = mp3 ]; then
      #prevod pripony soubouru na lowcase a porovnani s "mp3"
      echo -n "$x;" #tisk nazvu souboru bez eneteru
      enconv <<< `mp3info -p "%n;%t;%a;%l;%y;%g;%r" "$x"`
    fi #tisk ID3 tagu a bitrate prekodovani
  done
  echo #volny radek za kazdym albem
}

rec_bitrate .
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 11 Dubna 2011, 20:41:00
tak sem zkusil tu novou verzi, vypadalo by to s ní takhle
Kód: [Vybrat]
IFS="\n"
find Hudba/ -iname *.mp3 | while read i; do [ `exiftool -p '$AudioBitrate' "$i" | cut -d " " -f 1` -lt 256 ] && dirname "$i"; done | sort -u
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: makak 11 Dubna 2011, 23:14:42
Wow, si pán. Díky moc. Zdá sa že to funguje. Pridal som na koniec ">> file.txt" a spravilo mi to 29kb (760 riadkový) súbor :D

Len škoda že tomu celkom nerozumiem.

Predpokladám že to čo je medzi "do" a "done" sa robí pre všetky súbory. Neviem čo tam robia tie hranaté zátvorky, tie `` znaky a && (to sú tie veci ktoré sa ťažko gúglia).

Chcel by som to možno tak upraviť, aby mi to za názov súboru vypísalo aj bitrate (prípadne môže byť aj tak, že vypíše všetky, ale dá tam ten bitrate - z toho by som si ja už vedel vyfiltrovať 320kbps, a tak.
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 12 Dubna 2011, 00:13:15
lehčí bylo upravit to co psal daysleeper
Kód: [Vybrat]
#!/bin/sh

IFS="\n"

find Hudba/ -type d | while read dir; do
file="`find "$dir" -maxdepth 1 -iname *.mp3 2> /dev/null | head -n1`"
[ -e "$file" ] && bitrate=`exiftool -p '$AudioBitrate' "$file" | cut -d " " -f 1`
[ -e "$file" ] && [ $bitrate -lt 256 ] && echo "$dir"\; $bitrate
done

hranaté závorky jsou ekvivalent příkazu test (http://www.abclinuxu.cz/clanky/unixove-nastroje-15-basename-dirname-test-read#test), pokud je podmínka splněna vrátí nulu
co je za ampersandy se vykoná pokud příkaz před nimi skončil nulou, dá se místo toho použít běžný if (http://www.abclinuxu.cz/clanky/navody/bash-iii)
`` říká aby se bral výsledek příkazu mezi nimi a ne příkaz jako text, zkus třeba echo uname -a a echo `uname -a`
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: makak 13 Dubna 2011, 10:52:31
Yay, toto je ešte lepšie. Prebehlo to oveľa rýchlejšie. Díky moc všetkým čo pomohli.

A ten tutorial čo si postol je super, určite si to raz celé prejdem.
Název: Re: pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 13 Dubna 2011, 16:09:39
Prebehlo to oveľa rýchlejšie.
Jasně. Já testoval všechny soubory a tisknul kde se nachází a pak odstranil duplicity. daysleeper testoval jenom první soubor v adresáři. Určitě máš teď těch nalezenejch alb míň.
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: MrJames 17 Února 2013, 10:56:05
Zdravím, prešiel som z windows na linux a mám problém s bitrate. Na windows som mal v Total Commander plugin, kde mi po prejdení nad mp3 súborom vypísalo bitrate. Teraz keď ho spúštam cez wine to nefunguje (je to tento http://www.totalcmd.net/plugring/wdx_media.html). Potreboval by som poradiť nejaký príkaz aby sa dala doňho vpísať cesta (napr. Domov/Hudba/Interpret/Album) a vypísalo všetky mp3 súbory spolu s bitrate. Možno sa to dá upraviť s týchto príkazov čo sú vyššie ale nemám žiadne skúsenosti s príkazmi.
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 17 Února 2013, 12:07:08
Kód: [Vybrat]
#!/bin/sh

for i in "$1"/*.mp3; do exiftool -p '$FileName - $AudioBitrate' "$i"; done
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: MrJames 17 Února 2013, 12:40:07
Ďakujem, funguje. Dalo by sa aj tak že sa tam nedá ten názov albumu ale ukončí sa len názvom interpreta? Aby vypísalo mp3ky aj z podpriečinkov?
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 17 Února 2013, 20:04:21
Kód: [Vybrat]
IFS='
'
find "$1" -iname *.mp3 | while read i; do exiftool -p '$FileName - $AudioBitrate' "$i"; done

možná tam budeš chtít vedle $FileName tagy $Title a $Album
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: MrJames 17 Února 2013, 21:58:45
Ďakujem, funguje to presne ako som chcel.  8)
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: MrJames 23 Března 2013, 14:33:28
Tak ešte jeden možno dosť podobný príkaz by som potreboval. Po zadaní cesty (s podpriečinkami) vyhľadať mp3ky a ich dĺžku sčítať. Netreba vypisovať názvy lebo mám toho dosť veľa, stačí len výsledný čas.
Neviem ako to funguje ale keď sa sťahuje nejaká aplikácia z netu tak tam píše priebeh v %. Dá sa to aj tu? Odhadom je to asi 200+ dní a to bude asi chvíľu trvať tak aby som vedel či to pracuje alebo nie.
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 23 Března 2013, 16:45:58
nainstaluj bc pokud nemáš (bash neumí desetinná čísla)
Kód: [Vybrat]
shopt -s globstar #rekurzivní vyhledávání

cd "$1"
s=0
for i in **/*.mp3; do
s=`exiftool -n -p $s+'$Duration' "$i" | bc`
done

echo $s
výsledek v sekundách
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: MrJames 23 Března 2013, 17:09:15
bc mám ... cestu treba dať namiesto $1? a zadávať mám po riadkoch alebo spolu?
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 24 Března 2013, 14:29:51
zadej to jak chceš nebo si z toho udělej skript a spouštěj
Kód: [Vybrat]
bash délka_alba.sh moje_album$1 znamená první parametr skriptu
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: MrJames 24 Března 2013, 14:41:38
nerozumiem vôbec ako to myslíš ... ten riadok čo si napísal je načo? a kde mám zadať cestu?
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 24 Března 2013, 16:31:07
Jako že by sis to uložil do souboru délka_alba.sh. Délku alba potom zjistíš
Kód: [Vybrat]
bash délka_alba.sh "Hudba/Eva a Vašek/Ančo, Ančo ty se nevdáš"
http://www.abclinuxu.cz/clanky/navody/bash-iv
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: MrJames 25 Března 2013, 22:07:17
ďakujem, funguje ... ešte by sa nedal zmeniť ten výstup na minúty, hodiny alebo dni?
alebo nedá sa v skripte tie sekundy vynásobiť popr. dopísať jednotku ako text za to?
Název: Re:pomoc s príkazom - mp3 bitrate
Přispěvatel: pacholik 25 Března 2013, 22:37:26
Na to mám hrozně rád date (co bych se s tím dělil že ^_^). Místo echo $s dej
Kód: [Vybrat]
date -ud @$s +%H:%M:%Spopř. si to naformátuj jak chceš (man date).

Parametrem -d @123 spočítáš datum 123 sekund od počátku epochy (když si zobrazíš i rok tak ti to vyplivne 1970). A -u znamená UTC.