Сообщений: 26 Откуда: Челябинск Зарегистрирован: 08 Апреля 2009, 22:51:04 Сказали спасибо 7 раз Статус: offline
ICQ статус
Опубликовано 12 Апреля 2009, 19:02:11
Все ID3 теги (ID3 tag) хранятся в последних 128-ми байтах mp3 файла. Это означает, что их можно читать без специальных компонентов. Распределение информации следующее:
Byte 1-3 = ID 'TAG'
Byte 4-33 = Title
Byte 34-63 = Artist
Byte 64-93 = Album
Byte 94-97 = Year
Byte 98-127 = Comment
Byte 128 = Genre
Ну вот, а дальше, я думаю, всё зависит от возможностей сервера
-------------------- Чё правда это я написал??? О_о
Сообщений: 26 Откуда: Челябинск Зарегистрирован: 08 Апреля 2009, 22:51:04 Сказали спасибо 7 раз Статус: offline
ICQ статус
Опубликовано 12 Апреля 2009, 20:36:23
Не, не напряжённо. Я испытывал.///
Я только наводку дал. ТЕперь додумывать осталось, как это в последние 128 байт записывать. Ну, первую функцию это так. для общего сведения дал. Работать надо со второй.
-------------------- Чё правда это я написал??? О_о
var $file_name=''; //full path to the file
//the sugestion is that this path should be a
//relative path
var $tags; //array with ID3 tags extracted from the file
var $last_error_num=0; //keep the number of the last error ocurred
var $tags_count = 0; // the number of elements at the tags array
/*********************/
/**private functions**/
/*********************/
function hex2bin($data) {
//thankz for the one who wrote this function
//If iknew your name I would say it here
$len = strlen($data);
for($i=0;$i<$len;$i+=2) {
$newdata .= pack("C",hexdec(substr($data,$i,2)));
}
return $newdata;
}
function extractTags($text,&$tags){
$size = -1;//inicializando diferente de zero para não sair do while
while ((strlen($text) != 0) and ($size != 0)){
//while there are tags to read and they have a meaning
//while existem tags a serem tratadas e essas tags tem conteudo
$ID = substr($text,0,4);
$aux = substr($text,4,4);
$aux = bin2hex($aux);
$size = $this->get_frame_size($aux);
$flags = substr($text,8,2);
$info = substr($text,11,$size-1);
if ($size != 0){
$tags[$ID] = $info;
$this->tags_count++;
}
$text = substr($text,10+$size,strlen($text));
}
}
function ID3($file_name){
$this->file_name = $file_name;
$this->last_error_num = 0;
}
/**Read the file and put the TAGS
content on $this->tags array**/
function getInfo(){
if ($this->file_name != ''){
$mp3 = @fopen($this->file_name,"r");
$header = @fread($mp3,10);
if (!$header) {
$this->last_error_num = 2;
return false;
die();
}
if (substr($header,0,3) != "ID3"){
$this->last_error_num = 3;
return false;
die();
}
$header = bin2hex($header);
$version = base_convert(substr($header,6,2),16,10).".".base_convert(substr($header,8,2),16,10);
$flags = base_convert(substr($header,10,2),16,2);
$flags = str_pad($flags,8,0,STR_PAD_LEFT);
if ($flags[7] == 1){
//echo('with Unsynchronisation<br>');
}
if ($flags[6] == 1){
//echo('with Extended header<br>');
}
if ($flags[5] == 1){//Esperimental tag
$this->last_error_num = 4;
return false;
die();
}
$total = $this->get_frame_size(substr($header,12,8));
$text = @fread($mp3,$total);
fclose($mp3);
$this->extractTags($text,$this->tags);
}
else{
$this->last_error_num = 1;//file not set
return false;
die();
}
return true;
}
/*************
* PUBLIC
* Functions to get information
* from the ID3 tag
**************/
function getArtist(){
if (array_key_exists('TPE1',$this->tags)){
return $this->tags['TPE1'];
}else{
$this->last_error_num = 5;
return false;
}
}
function getTrack(){
if (array_key_exists('TRCK',$this->tags)){
return $this->tags['TRCK'];
}else{
$this->last_error_num = 5;
return false;
}
}
function getTitle(){
if (array_key_exists('TIT2',$this->tags)){
return $this->tags['TIT2'];
}else{
$this->last_error_num = 5;
return false;
}
}
function getAlbum(){
if (array_key_exists('TALB',$this->tags)){
return $this->tags['TALB'];
}else{
$this->last_error_num = 5;
return false;
}
}
function getYear(){
if (array_key_exists('TYER',$this->tags)){
return $this->tags['TYER'];
}else{
$this->last_error_num = 5;
return false;
}
}
function getGender(){
if (array_key_exists('TCON',$this->tags)){
return $this->tags['TCON'];
}else{
$this->last_error_num = 5;
return false;
}
}
}
?>
-------------------- Чё правда это я написал??? О_о