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

Harder

Profil