Регистрация    Забыли пароль?        Правила форума    FAQ (читать перед созданием новой темы)
Имя   Пароль  запомнить
  
Просмотр темы
Вернуться на сайт: PHP-Fusion SF Russian Support Site

Форум поддержки PHP-Fusion SF | PHP-Fusion SF - Моды/Плагины | Плагины/Plugins
# 1 Тема: Редактор тегов в mp3 файле.
droid21
Пользователь

Avatar пользователя



Местный

Сообщений: 26
Откуда: Оренбург
Зарегистрирован: 14 Февраля 2009, 09:27:53
Сказали спасибо 0 раз
Статус: offline
ICQ статус 418200582
Опубликовано 15 Марта 2009, 20:53:01
Можно ли сделать плагин для редактирования тегов в mp3 файле для php-fusion.
 
^ наверх ^ 418200582 www.mp3set.ru
# 2  
pozitiv
SF Team

Avatar пользователя

паZитифф

SF Support Team

Почетный SF

Сообщений: 1676
Откуда: Киев
Зарегистрирован: 18 Ноября 2007, 18:49:13
Сказали спасибо 148 раз
Статус: offline
ICQ статус 3902393
Опубликовано 16 Марта 2009, 15:13:10
а на пхп такое вообще возможно?


--------------------
wmz - Z226856101527
wmr - R513979829437

Все вопросы задавать на форуме. На вопросы заданные в приват или асю неотвечаю!
^ наверх ^ 3902393 http://nekto.me
# 3  
SNELS
Пользователь

Avatar пользователя

Metalcoder

Местный

Сообщений: 26
Откуда: Челябинск
Зарегистрирован: 08 Апреля 2009, 22:51:04
Сказали спасибо 7 раз
Статус: offline
ICQ статус 237706
Опубликовано 12 Апреля 2009, 18:55:36
Хм, ну вот вам информация для размышления

$file='downloads/file.mp3';
function readframe($file) {
if (! ($f = fopen($file, 'rb')) ) die("Unable to open " . $file);
$res['filesize'] = filesize($file);
do {
while (fread($f,1) != Chr(255)) { // Find the first frame
if (feof($f)) die( "No mpeg frame found") ;
}
fseek($f, ftell($f) - 1);
$frameoffset = ftell($f);
$r = fread($f, 4);
$bits = sprintf("%'08b%'08b%'08b%'08b", ord($r{0}), ord($r{1}), ord($r{2}), ord($r{3}));

}

while (!$bits[8] and !$bits[9] and !$bits[10]);

if ($bits[11] == 0) {

if (($bits[24] == 1) && ($bits[25] == 1)) {
$vbroffset = 9; // MPEG 2.5 Mono
} else {
$vbroffset = 17; // MPEG 2.5 Stereo

}

} else if ($bits[12] == 0) {

if (($bits[24] == 1) && ($bits[25] == 1)) {

$vbroffset = 9; // MPEG 2 Mono
} else {

$vbroffset = 17; // MPEG 2 Stereo

}
} else {

if (($bits[24] == 1) && ($bits[25] == 1)) {

$vbroffset = 17; // MPEG 1 Mono

} else {
$vbroffset = 32; // MPEG 1 Stereo
}
}
fseek($f, ftell($f) + $vbroffset);

$r = fread($f, 4);

switch ($r) {
case 'Xing':
$res['encoding_type'] = 'VBR';
case 'VBRI':
default:
if ($vbroffset != 32) {

fseek($f, ftell($f) + 32 - $vbroffset);

$r = fread($f, 4);

if ($r != 'VBRI') {
$res['encoding_type'] = 'CBR';
break;
}
} else {
$res['encoding_type'] = 'CBR';
break;

}

$res['encoding_type'] = 'VBR';
}

fclose($f);

if ($bits[11] == 0) {
$res['mpeg_ver'] = "2.5";
$bitrates = array(
'1' => array(0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0),
'2' => array(0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0),
'3' => array(0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0),
);
} else if ($bits[12] == 0) {
$res['mpeg_ver'] = "2";
$bitrates = array(
'1' => array(0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0),
'2' => array(0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0),
'3' => array(0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0),
);
} else {
$res['mpeg_ver'] = "1";
$bitrates = array(
'1' => array(0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0),
'2' => array(0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0),
'3' => array(0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0),
);
}

$layer = array(
array(0,3),
array(2,1),
);
$res['layer'] = $layer[$bits[13]][$bits[14]];
if ($bits[15] == 0) {
$res['crc'] = true;
}

$bitrate = 0;
if ($bits[16] == 1) $bitrate += 8;
if ($bits[17] == 1) $bitrate += 4;
if ($bits[18] == 1) $bitrate += 2;
if ($bits[19] == 1) $bitrate += 1;
$res['bitrate'] = $bitrates[$res['layer']][$bitrate];

$frequency = array(
'1' => array(
'0' => array(44100, 48000),
'1' => array(32000, 0),
),
'2' => array(
'0' => array(22050, 24000),
'1' => array(16000, 0),
),
'2.5' => array(
'0' => array(11025, 12000),
'1' => array(8000, 0),
),
);
$res['frequency'] = $frequency[$res['mpeg_ver']][$bits[20]][$bits[21]];

$mode = array(
array('Stereo', 'Joint Stereo'),
array('Dual Channel', 'Mono'),
);
$res['mode'] = $mode[$bits[24]][$bits[25]];
$samplesperframe = array(
'1' => array(
'1' => 384,
'2' => 1152,
'3' => 1152
),
'2' => array(
'1' => 384,
'2' => 1152,
'3' => 576
),
'2.5' => array(
'1' => 384,
'2' => 1152,
'3' => 576
),
);
$res['samples_per_frame'] = $samplesperframe[$res['mpeg_ver']][$res['layer']];
if ($res['encoding_type'] != 'VBR') {
if ($res['bitrate'] == 0) {
$s = -1;
} else {
$s = ((8*filesize($file))/1000) / $res['bitrate'];
}
$res['length'] = sprintf('%02d:%02d',floor($s/60),floor($s-(floor($s/60)*60)));
$res['lengthh'] = sprintf('%02d:%02d:%02d',floor($s/3600),floor($s/60),floor($s-(floor($s/60)*60)));
$res['lengths'] = (int)$s;
$res['samples'] = ceil($res['lengths'] * $res['frequency']);
if(0 != $res['samples_per_frame']) {
$res['frames'] = ceil($res['samples'] / $res['samples_per_frame']);
} else {
$res['frames'] = 0;
}
$res['musicsize'] = ceil($res['lengths'] * $res['bitrate'] * 1000 / 8);
} else {
$res['samples'] = $res['samples_per_frame'] * $res['frames'];
$s = $res['samples'] / $res['frequency'];
$res['length'] = sprintf('%02d:%02d',floor($s/60),floor($s-(floor($s/60)*60)));
$res['lengthh'] = sprintf('%02d:%02d:%02d',floor($s/3600),floor($s/60),floor($s-(floor($s/60)*60)));
$res['lengths'] = (int)$s;
$res['bitrate'] = (int)(($res['musicsize'] / $s) * 8 / 1000);
}
return $res;
}
$info = readframe($file);




Ну, собственно, это таким образом выводится всякая шляпа из мп3

Результат работы скрипта:

Array ( [filesize] => 1369759 [encoding_type] => CBR [mpeg_ver] => 1 [layer] => 3 [bitrate] => 192 [frequency] => 44100 [mode] => Stereo [samples_per_frame] => 1152 [length] => 00:57 [lengthh] => 00:00:57 [lengths] => 57 [samples] => 2513700 [frames] => 2183 [musicsize] => 1368000 )



[Изменил(а) SNELS, 12 Апреля 2009, 18:58:01]

--------------------
Чё правда это я написал??? О_о
^ наверх ^ 237706
# 4  
SNELS
Пользователь

Avatar пользователя

Metalcoder

Местный

Сообщений: 26
Откуда: Челябинск
Зарегистрирован: 08 Апреля 2009, 22:51:04
Сказали спасибо 7 раз
Статус: offline
ICQ статус 237706
Опубликовано 12 Апреля 2009, 19:00:41
Вот, вывод ид3-тегов, а-ля исполнитель, альбом и тд

$f = fopen('downloads/file.mp3', 'rb');

rewind($f);

fseek($f, -128, SEEK_END);

$tmp = fread($f,128);

if ($tmp[125] == Chr(0) and $tmp[126] != Chr(0)) {

$format = 'a3TAG/a30NAME/a30ARTISTS/a30ALBUM/a4YEAR/a28COMMENT/x1/C1TRACK/C1GENRENO';

} else {

$format = 'a3TAG/a30NAME/a30ARTISTS/a30ALBUM/a4YEAR/a30COMMENT/C1GENRENO';

}

$id3tag = unpack($format, $tmp);



Результат работы скрипта:

Array ( [TAG] => TAG [NAME] => test [ARTISTS] => oz [ALBUM] => [YEAR] => 2007 [COMMENT] => [GENRENO] => 0 )



--------------------
Чё правда это я написал??? О_о
^ наверх ^ 237706
# 5  
SNELS
Пользователь

Avatar пользователя

Metalcoder

Местный

Сообщений: 26
Откуда: Челябинск
Зарегистрирован: 08 Апреля 2009, 22:51:04
Сказали спасибо 7 раз
Статус: offline
ICQ статус 237706
Опубликовано 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



Ну вот, а дальше, я думаю, всё зависит от возможностей сервера smiley


--------------------
Чё правда это я написал??? О_о
^ наверх ^ 237706
# 6  
Psc
SF Team

Avatar пользователя

Psc

SF Support Team

Почетный SF

Сообщений: 2515
Откуда: As is
Зарегистрирован: 10 Ноября 2007, 13:15:07
Сказали спасибо 353 раз
Статус: offline
Опубликовано 12 Апреля 2009, 20:17:29
А нас просили редакторствовать ващета... Обломал ага? smiley

Да и читать я думаю будет напряжно для серва, если реалтайм.


--------------------
Retired
^ наверх ^
# 7  
SNELS
Пользователь

Avatar пользователя

Metalcoder

Местный

Сообщений: 26
Откуда: Челябинск
Зарегистрирован: 08 Апреля 2009, 22:51:04
Сказали спасибо 7 раз
Статус: offline
ICQ статус 237706
Опубликовано 12 Апреля 2009, 20:36:23
Не, не напряжённо. Я испытывал.///
Я только наводку дал. ТЕперь додумывать осталось, как это в последние 128 байт записывать. Ну, первую функцию это так. для общего сведения дал. Работать надо со второй.


--------------------
Чё правда это я написал??? О_о
^ наверх ^ 237706
# 8  
SNELS
Пользователь

Avatar пользователя

Metalcoder

Местный

Сообщений: 26
Откуда: Челябинск
Зарегистрирован: 08 Апреля 2009, 22:51:04
Сказали спасибо 7 раз
Статус: offline
ICQ статус 237706
Опубликовано 12 Апреля 2009, 20:52:03
Вот класс для чтения и написания ид3 - тегов
<?php
/***********************************************************
* Class: ID3
* Version: 1.0
* Date: Janeiro 2004
* Author: Tadeu F. Oliveira
* Contact: tadeu_fo@yahoo.com.br
* Use: Extract ID3 Tag information from mp3 files
***********************************************************
Exemple

require('error.inc.php');
$nome_arq = 'Blind Guardian - Bright Eyes.mp3';
$myId3 = new ID3($nome_arq);
if ($myId3->getInfo()){
echo('<HTML>');
echo('<a href= "'.$nome_arq.'">Clique para baixar: </a><br>');
echo('<table border=1>
<tr>
<td><strong>Artista</strong></td>
<td><strong>Titulo</strong></font></div></td>
<td><strong>Trilha</strong></font></div></td>
<td><strong>Album/Ano</strong></font></div></td>
<td><strong>Gênero</strong></font></div></td>
<td><strong>Comentários</strong></font></div></td>
</tr>
<tr>
<td>'. $myId3->getArtist() . ' </td>
<td>'. $myId3->getTitle() . ' </td>
<td>'. $myId3->getTrack() . ' </td>
<td>'. $myId3->getAlbum() . '/'.$myId3->getYear().' </td>
<td>'. $myId3->getGender() . ' </td>
<td>'. $myId3->tags['COMM']. ' </td>
</tr>
</table>');
echo('</HTML>');
}else{
echo($errors[$myId3->last_error_num]);
}

*/


class ID3{

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 get_frame_size($fourBytes){
$tamanho[0] = str_pad(base_convert(substr($fourBytes,0,2),16,2),7,0,STR_PAD_LEFT);
$tamanho[1] = str_pad(base_convert(substr($fourBytes,2,2),16,2),7,0,STR_PAD_LEFT);
$tamanho[2] = str_pad(base_convert(substr($fourBytes,4,2),16,2),7,0,STR_PAD_LEFT);
$tamanho[3] = str_pad(base_convert(substr($fourBytes,6,2),16,2),7,0,STR_PAD_LEFT);
$total = $tamanho[0].$tamanho[1].$tamanho[2].$tamanho[3];
$tamanho[0] = substr($total,0,8);
$tamanho[1] = substr($total,8,8);
$tamanho[2] = substr($total,16,8);
$tamanho[3] = substr($total,24,8);
$total = $tamanho[0].$tamanho[1].$tamanho[2].$tamanho[3];
$total = base_convert($total,2,10);
return $total;
}

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));
}
}

/********************/
/**public functions**/
/********************/
/**Constructor**/

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;
}
}

}
?>


--------------------
Чё правда это я написал??? О_о
^ наверх ^ 237706
# 9  
SNELS
Пользователь

Avatar пользователя

Metalcoder

Местный

Сообщений: 26
Откуда: Челябинск
Зарегистрирован: 08 Апреля 2009, 22:51:04
Сказали спасибо 7 раз
Статус: offline
ICQ статус 237706
Опубликовано 15 Апреля 2009, 16:31:20
<?php
require_once 'MP3/Id.php';

// создаем объект, читаем данные
$id3 = &new MP3_Id();
$result = $id3->read('../data/Little-Big-Man.mp3');
// Ошибка "Tag not found" игнорируется
if (PEAR::isError($result) && $result->getCode() !== PEAR_MP3_ID_TNF) {
die($result->getMessage() . "\n");
}

// Определяем информацию
$id3->setTag('name', 'Neuer Titel');
$id3->setTag('artists', 'Andere Band');
$id3->setTag('album', 'Schlagertraum #3');
$id3->setTag('year', 1984);
$id3->setTag('comment', 'Volksmusikal. Hochgenuss');
$id3->setTag('genre', 'Folk');
$id3->setTag('track', 5);

// Записываем информацию в тег
$result = $id3->write();
if (PEAR::isError($result)) {
die($result->getMessage() . "\n");
}

echo "Тег успешно записан.! \n";
?>

Прикрепленные файлы
Для просмотра вложения зарегистрируйтесь


[Изменил(а) SNELS, 15 Апреля 2009, 16:32:43]

--------------------
Чё правда это я написал??? О_о
^ наверх ^ 237706
Перейти на форум:


105,555,192 уникальных посетителей
сейчас: 24 Ноября 2024, 08:25:55
Генерация страницы: 0.23 сек.

Original size:47 кб.
GZipped size: 11 кб.
Compression:77%