Login   Register  
PHP Classes
elePHPant
Icontem

File: flacTags.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Lorenzo Simionato  >  FLAC Tags  >  flacTags.php  >  Download  
File: flacTags.php
Role: Class source
Content type: text/plain
Description: The flacTags class
Class: FLAC Tags
Retrieve metadata from FLAC audio files
Author: By
Last change: Avoid issuing php notices
Date: 6 years ago
Size: 4,112 bytes
 

Contents

Class file image Download
<?php
/**
* Copyright (c) 2008 - Lorenzo Simionato
* All rights reserved.   This program and the accompanying materials
* are made available under the terms of the
* GNU General Public License (GPL) Version 2, June 1991,
* which accompanies this distribution, and is available at:
* http://www.opensource.org/licenses/gpl-license.php
*
*
* flacTags:
* A simple class that parses FLAC files.
* It can retrive easily the Vorbis Comment Data Block
* So you can get infos like Title, Author, Album, Comments...
* from any .flac file
*
*
* Date: October 2008
* Version: 0.2.1
* Author: Lorenzo Simionato
* Email: lorenzo [AT] simionato [dot] org
**/

class flacTags {

  var 
$file_name;    // File name
  
var $v_string;     // Vendor string
  
var $comments;     // Comments array
  
var $errorMessage// Error message

  // CONSTRUCTOR
  
function flacTags($inputfile) {
    
$this->file_name $inputfile;
    
$this->errorMessage="";
    
$this->v_string="";
    
$this->comments=null;
  }

  
// READ THE FILE
  // return false if an error occured
  
function readTags() {
    
$file fopen($this->file_name"rb");
    if(
$file == false) {
      
$this->errorMessage="Error opening file";
      return 
false;
    }

    
// Check if is a FLAC file
    
if(fread($file,4)!="fLaC") {
      
$this->errorMessage="Not valid FLAC file";
      return 
false;
    }

    
// Search for the VORBIS_COMMENT BLOCK
    
$found=false;
    
$last=false;
    while(!
$found && !$last) {
      
$block=fread($file,1); //get block header
      
if($block==false) {
        
$this->errorMessage="Not valid FLAC file";
        return 
false;
      }
      
$block=ord($block);

      if(
$block 128)  // if first bit=1, this is the last block
        
$last=true;
      
$block=$block 127// get last 7 bits

      
if($block==4// if 4, this is the vorbis comment block
        
$found=true;

      
$sizes=fread($file,3); //get size of the block
      
$size=ord($sizes[0]) << 16;
      
$size+=ord($sizes[1]) << 8;
      
$size+=ord($sizes[2]);

      if(!
$found)
        
fseek($file,$size,SEEK_CUR);
    }

    if(!
$found) {
      
$this->errorMessage="Vorbis comment not found";
      return 
false;
    }

    
//Retrive vorbis block 

    //get vendor string size
    
$vsize=fread($file,4);
    
$vsize=$this->convert($vsize);

    
$vstr=fread($file,$vsize);
    if(
$vstr==false) {
      
$this->errorMessage="Not valid FLAC file";
      return 
false;
    }
    
$this->v_string=$vstr;

    
//get numbers of comments
    
$csize=fread($file,4);
    
$csize=$this->convert($csize);

    
//read comments
    
for($i=0;$i<$csize;$i++) {
      
//get comment length
      
$cosize=fread($file,4);
      
$cosize=$this->convert($cosize);

      
//get comment value
      
$comment=fread($file,$cosize);
      
$pos=strpos($comment,"=");
      if(
$pos==false) {
        
$this->errorMessage="Not valid FLAC file";
        return 
false;
      }

      
$field=substr($comment,0,$pos);
      
$value=substr($comment,$pos+1);

      if(!isset(
$this->comments[$field]))
        
$this->comments[$field]=$value;
      else if(
is_array($this->comments[$field]))
        
$this->comments[$field][count($this->comments[$field])]=$value;
      else {
        
$temp=$this->comments[$field];
        
$this->comments[$field]=array();
        
$this->comments[$field][0]=$temp;
        
$this->comments[$field][1]=$value;
      }
    }

    
fclose($file);
    return 
true;
  }

  
// get a comment
  
function getComment($name) {
    return 
$this->comments[$name];
  }

  
// get an array with all comments
  
function getAllComments() {
    return 
$this->comments;
  }

  
// get the vendor string
  
function getVendorString() {
    return 
$this->v_string;
  }

  
// get the error message
  
function getError() {
    return 
$this->errorMessage;
  }

  
// Internal function
  
function convert($s) {
    
$size=ord($s[0]);
    
$size+=ord($s[1]) << 8;
    
$size+=ord($s[2]) << 16;
    
$size+=ord($s[3]) << 24;
    return 
$size;
  }
}