PHP Classes

File: flacTags.php

Recommend this page to a friend!
  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: 15 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;
  }
}