Mistoj Sándortól kaptunk egy PHP szkriptet, amivel egyszerre több MIDI fájlt lehet MP3 formátumra konvertálni... Annak ellenére, hogy a program PHP-alapú igazából az oldal témájába nem igazán fér bele, mivel nem túl sok köze van a webfejlesztéshez, kitesszük, mert egy hasznos program, és sokmindent jól lehet vele példázni...
#!/usr/bin/php
<?php
######################################
# UHU LINUX 1.2
#
######################################
# *.MID ->> *.WAV ->>> *.MP3 formátumra alakítás
#
# Másold a konvertállandó *.mid fajlokat egy mappába és másold bele a scriptet
# A script jogosultságára és a sajátodéra figyelj.
# kimeneti fájlnevek megegyeznek a mid fajl nevével + kiterjesztés (wav; mp3)
#
######################################
# A convertáláshoz szükséges a timidity csomag /van neki grafikus felülete is/
# :: timidity apt-get install timidity
# http://timidity.sourceforge.net/
# LAME csomag: apt-get install lame
# http://lame.sourceforge.net/
# PHP legyen felteltpítve, valamint a system vagy exec függvény is legyen elérhetõ
# Amit élles környezetben nem javaslok.
#
######################################
# ha nincs PHP akkor kozolba írd be ezeket:
# fájl nevek: $kimenet.wav - kimenet neve; $bemenet.mid a bemenet neve
# timidity -Ow -o $kimenet.wav $bemenet.mid
# lame -q 9 -V 9 $kimenet.wav $bemenet.mp3
#
###############################################
#tovabbi infók: man timidity; man lame
#egy vagon beállításuk van ezek egy aránylag türhetõ eredményt produkálnak
#
######################################
#system vagy exec függvény teszt
if (function_exists('system'))
{
$sfugveny=TRUE;
}elseif (function_exsits('exec'))
{
$sfugveny=FALSE;
}else
{
print "\nA mûvelet nem hajtható végre, hiányoznak a rendszer függvények system vagy exec!" ;
exit;
}
//--------------------------------------------------------
#mid fajlok beolvasása a tárgy mappából
if ($a =opendir("./"))
{
while (($fajl=readdir($a))!== false)
{
if ( is_file ($fajl) && strstr($fajl,".mid"))
{
print "A Regisztrál *.mid fájlok: $fajl\n" ;
$midfajlok[]=$fajl ; // mid fajlok listaja a midfajlok valtozoban
}
}
}
//--------------------------------------------------------
#A lényegirészek, ha vannak *.mid fajlok a mappában
if (isset($midfajlok)){
print "\nA türelem rózsát terem ..... zzZZzzz...\n\n" ;
for ($i=0; $i<sizeof($midfajlok); $i++)
{
#nevek kialakitasa $i* = input; $o*=output
$imidfajl= $midfajlok[$i];
$owavfajl= ereg_replace(".mid",".wav", $imidfajl);
$omp3fajl= ereg_replace(".mid",".mp3", $imidfajl);
#mid 2 wav
print ":: kovertálás " . $imidfajl. " ->> ". $owavfajl. "\n";
if ( $sfugveny)
{
print system ("timidity -Ow -o $owavfajl $imidfajl" );
}else
{
print exec ("timidity -Ow -o $owavfajl $imidfajl" );
}
#wav 2 mp3
print ":: kovertálás " . $iwavfajl . " ->> ". $omp3fajl ."\n";
if ( $sfugveny)
{
print system ("lame -q 9 -V 9 $owavfajl $omp3fajl" );
}else
{
print exec ("lame -q 9 -V 9 $owavfajl $omp3fajl" );
}
print "($i.) Munkamenet - $imidifajl - kovertálás kész!\n" ;
}
print "\nVégeztünk!\n";
//--------------------------------------------------------
#ende nincsnek *.mid fajlok a mappában
}else
{
print "\nhelyezed el a tárgy mappába a *.mid fajlokat és indítsd újra a scriptet!\n" ;
exit;
}
?>
Mint ahogy az a kommentekből olvasható a szkript elsősorban Linux rendszerek alá készült, azonban a szükséges programoknak van Windows-os verziója is, így ezen az op.rendszeren is futtathatóak. Mivel a kommentezett sorokban elég részletesen le van írva a program használata, így most ezt nem részletezném, inkább bemutatnék néhány érdekességet a szkriptel kapcsolataban. Már az első sorban (#!/usr/bin/php) találunk valamit, amit nem túl gyakran látunk PHP kódokban. Ne tévesszen meg senkit, ez nem egy "ittfelejtett" komment (nem is a <?PHP tagon belül van), hanem ez a sor mutatja meg, hogy hol található a PHP feldolgozó. Ez a CGI futtatható állományként telepített PHP esetében fontos. Érdemes a php.net kapcsolódó oldalán elolvasni a 4. eset : PHP feldolgozó a web könyvtárfán kívül című leírást. A következő dolog, amin megakad az ember szeme az ez a sor:
#system vagy exec függvény teszt
Mi az a System() és a Exec() függvény? Ezen függvények segítségével külső programokat futtathatunk le. Mivel ez egy hatalmas veszély-forrás a legtöbb (ingyenes) webszolgáltató (de majdnem mindenki, akinek a webszervere látható a "net felől") kapásból letiltja. Ezt a függvényt rengeteg dologra használhatjuk: például ha van egy játékszerverünk, akkor pillanatok alatt lehet írni egy olyan szkriptet, ami egy HTTP Base felhasználó-ellenőrzés után megnézi, hogy fut-e a szerver, ha igen leállítja, ha nem, akkor elindítja. Természetesen ez csak egy példa volt, még másik millió felhasználási területe lehet ezen függvénynek... A szkripteket általában változtatás nélkül közöljük le, jelen esetben is így volt, de azért két dologra szeretném felhívni a figyelmet:
if (isset($midfajlok)){
Ez az ellenőrzés ebben a szkriptben bőven elég, mivel - amennyiben módosítás nélkül futtatjuk - nem valószínű, hogy a $midifajlok változó be lesz állítva ha nincsenek midi fileok a könyvtárban, de élesben futó programnál érdemes ellenőrizni, hogy valóban tömb az értéke (például egy függvény visszatérési értéke egy tömb vagy false is lehet), különben egy rakás hibaüzenetet kapunk a következő ciklusban, ahol végig tömbként kezeljük az adott változót. (Vagy másik megoldás, hogy az array() függvénnyel létrehozunk egy üres tömböt, és nem for() hanem foreach() ciklusban nézzük végig az elemeit...)
$owavfajl= ereg_replace(".mid",".wav", $imidfajl);
$omp3fajl= ereg_replace(".mid",".mp3", $imidfajl);
Ez a két sor két problémát is felvet: az egyik, hogy az ereg_* függvények viszonylag lassúak, ami sok filenál (több ezer) már látványos lassulást eredményez. Amennyiben nem használunk reguláris kifejezést előnyősebb az str_replace() függvény használata. Ezen kívül a ".mid" kiterjesztés lehetne ".MiD" is és a fenti kód ebben az esetben lazán felülírná az eredeti midi fájlunkat az új mp3-al fájllal. Erre megoldás PHP 5 környezeben az str_ireplace() függvény, PHP 4 alatt meg vagy az eregi_replace(), vagy a preg_replace() függvény. (Azért ez utóbbihoz hozzátartozik, hogy a jelen szkriptben az strstr() függvény alkalmazása miatt ez a probléma nem fordulhat elő) Természetesen a fentebbi bekezdésben taglaltak ellenére is remek szkriptet kaptunk, de ha már ismertető leírásnak készül ez a cikk, gondoltam leírom az ilyen egyszerű, mégis sok fejtörést okozható buktatókat.
Harder
Profil