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…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | #!/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 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:
1 | #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:
1 | 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…)
1 2 | $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.