Pubblicato il Pubblicato in Applicazioni, Playlist

Play List Seconda Parte.

In questa seconda parte affrontiamo l’inserimento vero e proprio dei titoli nella relativa tabella e le due funzioni a completamento della fase di scan delle periferiche, ovvero le funzioni basedati(), trovatipo() e duratagetit3().

 

L’inserimento nel DB dei titoli

Adesso tocca all’inserimento dei titoli nella relativa tabella del DB. Nella funzione c’e’ anche il controllo della preesistenza del titolo. QuindiInserimento Titoli fa un check. Il controllo può essere sul titolo e (and) sulla dimensione oppure se la variabile crc è settata ad “on” (o comunque non vuota), solo sul crc del file. Il calcolo del crc del file richiede tempo, per cui è un’operazione che va valutata attentamente prima di sceglierla anche se è più affidabile. Se non trova il titolo nella tabella, secondo i criteri precedenti, allora lo inserisce. Questo modo permette di aggiungere i nuovi titoli velocemente, una volta popolata la tabella.

//////////////////// basedati() ///////////////////////////////////////////////////
// funzione di inserimento titoli
// $titolo
// $dimensione
// $durata
// $data
// $crc
// tutti gli argomenti sono auto esplicativi
function basedati($titolo, $percorso, $dimensione, $durata, $data, $crc=""){
        // variabili globali per passare informazioni che verranno utilizzate
        // come informazioni all'utente
	global $duplicati;
	global $originali;
	global $inseriti;

        // apertura del DB e controllo di connessione  
        // al DB (databse, utente, password, host)	
	require "config.php";           

	// se la variabile $crc non e' definita, imposto la variabile $where per procedere
        // con la ricerca per titolo e dimensione del file
        if($crc == "") $where = 'titolo="' .  $titolo . '" AND dimensione="' . $dimensione . '"';

        // se la variabile $crc è definita, imposto la variabile $where per la ricerca del crc
        if($crc != "") $where = 'crc="' .  $crc . '"';

	/* retrieve all rows from titoli */
	$query = 'SELECT id, titolo, percorso, dimensione, data FROM titoli WHERE ' . $where;
	$trovato = false;
	$dup = false;
		
	if ($result = $mysqli->query($query)) {
                // non sarebbe necessario utilizzare un ciclo, ma mi da certezza
                // sul reperimento delle informazioni
		while ($row = $result->fetch_row()) {
                        // il titolo è stato trovato
			$trovato = true;
			if($percorso != $row[2]){
                                // ma l'ulteriore controllo di percorso fa si che 
                                // possa segnalare un duplicato anche se si trova 
                                // in altro posto
				$dup = true;
				$originali[]= $row[0];
			}
		}
		/* libero il result set */
		$result->close();
	}

	if ($trovato && $dup){
			
                // quindi se duplicato, popolo il vettore $duplicati 
                // con i dati del file e reimposto il flag $dup a falso
		$duplicati[] = $percorso . "/" . $titolo . "|" . $dimensione . "|" . $data . "|" . $crc;
		$dup = false;
						
	}
	
	// se il check è andato a vuoto, allora procede all'inserimento del titolo
	if (!$trovato){
		
		// abbina il tipo di estensione al genere in archivio
                // il richiamo di questa funzione serve ad abbinare 
                // il tipo (meglio il genere) di file in relazione alla 
                // sua estensione prelevandolo dalla tabella genere
                // il percorso non è necessario, ma è un retaggio di 
                // alcuni test e visto che non inficia lo lascio 
                // la fino al prossimo debug
		$tipo = trovatipo($percorso . "/" . $titolo);
	
                // E' tipico dei file mediali di avere una durata,  
                // che non ha senso per file di altro genere infatti 
                // darebbe "N(on)/D(isponibile)", per cui, per i file mediali, 
                // uso una libreria (getID3() che funziona) per calcolarne la durata 
                // certo e' uno "spreco" l'utilizzo di una libreria del genere 
                // per il solo calcolo della durata, ma non ho trovato altro in giro. 
		if($durata == "on") $durat = duratagetid3($percorso . "/" . $titolo); else $durat = "N/D";
	
		// stringa SQL per l'inserimento
		$query = "INSERT INTO titoli (titolo, percorso, dimensione, data, crc, durata, tipo) 
                          VALUES (?,?,?,?,?,?,?)";
                // Prepara il comando SQL per l'inserimento
		$stmt = $mysqli->prepare($query);

                // abbina le variabili da usare nel comando SQL al rispettivo tipo
		$stmt->bind_param("sssssss", $val1, $val2, $val3, $val4, $val5, $val6, $val7);

		// assegnazione dei valori alle variabili da iscrivere nel database
		$val1 = $titolo;
		$val2 = $percorso;
		$val3 = $dimensione;
		$val4 = $data;
		$val5 = $crc;
		$val6 = $durat; // durata del file
		$val7 = $tipo;  // genere di file in funzione della sua estensione

		// Esegue la query, quindi inserisce il record
		$stmt->execute();

		// chiude lo statment 
		$stmt->close();
			
	        // la variabile globale viene incrementata ad ogni inserimento
                // la sua funzione è solo informativa
		$inseriti++;
	
	}
	
	/* chiude connessione al DB */
	$mysqli->close();	
	
	return true;
}

 

Completamento della fase di scan delle periferiche.

La funzione trovatipo risolve il genere di file in relazione alla sua estensione, la quale è precedentemente stabilita nell’inserimento delle estensioni in tabella. Per generi intendo qualcosa del genere: video, audio, documenti, foto e via così dicendo.

//////////////////// trovatipo() /////////////////////////////////////////////////////
// funzione di ricerca genere in funzione dell'estensione del file
// negli nella tabella genere
// $file è il nome del file (chiaramente incluso di estensione). 
// E' irrilevante presenza del percorso
function trovatipo($file){
	
	$est = "";
	$trovato = false;
	
         // estrapola l'estensione del file
	$ext = strtolower(substr($file, strrpos($file,'.', 0)+1,(strlen($file) - strrpos($file,'.', 0))));	
		
	// richiama file apertura e controllo database
	require "config.php";      

	// query per la ricerca dell'estensione
	$query = "SELECT genere FROM ext WHERE lower(tipo) = '" . $ext . "'";
		
	// esegue ricerca sul database
	if ($result = $mysqli->query($query)) {
		while ($row = $result->fetch_row()) {
			// l'ha trovata e la ripone in $est
			$trovato = true;
			$est = $row[0];
		}
		/* libera il result set */
		$result->close();
	}	
		
        /* chiude il collegamento cool DB */	
	$mysqli->close();
	
	// se trova l'estensione nell'archivio, allora la ritorna se no, 
	// ritorna 0 ovvero non definito
	if($trovato) return $est; else return 0;
	
}

 

Calcolo della durata di titolo mediale.

/////////////////// duratagetid3() /////////////////////////////
// Calcola la durata del file mediale
// $file è il nome del file incluso di percorso
// il file deve essere reperibile sul disco, diversamente
// la classe getID3 non puo' calcolare correttamente 
// la durata
function duratagetid3($file){

	// richiama la classe da istanziare getid3()
        // per chiarimenti sulla getid3() vi rimando 
        // al sito dello sviluppatore: http://www.getid3.org/
	require_once('lib/getid3/getid3.php');	

         // istanzia il nuovo oggetto
	$getID3 = new getID3;

        // dal metodo analyze tira fuori il vettore 
        // con i dati di base del file mediale
        // e popola il vettore $ThisFileInfo
	$ThisFileInfo = $getID3->analyze($file);
	
        // Se l'indice 'playtime_strig' è imposata, ne ritorna il valore
        // diversamente ritorno "N/D" ovvero non determinato
	if(isset($ThisFileInfo['playtime_string'])) {
           return $ThisFileInfo['playtime_string']; 
        } else { 
           return "N/D"; 
        }
}

Play List Seconda parte termina qui. Nella terza parte inizieremo ad affrontare l’argomento interfaccia di gestione.

N.B.: il codice scritto in questo articolo, in quello precedente e nei successivi, non ha la pretesa di essere un codice “pulito”. Alcune righe possono risultare ridondanti, ma considerate che l’applicazione è ancora in sviluppo e non ripulita dalle ridondanze e dalle righe di debug e da quelle righe solo scritte perché “funzionano” nonostante tutto. Fatalità della programmazione? O ignoranza del programmatore? La seconda per quanto mi riguarda. L’ho scritto da qualche parte in questo sito che non sono un programmatore ne professionista ne puro. Il vostro contributo potrebbe aiutare anche gli altri oltre che me, quindi è benvenuto!

Prima Parte | Seconda Parte | Terza Parte | Quarta Parte | Quinta Parte | Sesta Parte | Settima Parte | Ottava Parte | Nona Parte

Rispondi