Задать вопрос
@linuxnb

Как изменить ID3 у MP3 файла на Кириллицу?

Всем привет, помогите разобраться

Есть код, идеально работает для латиницы, но кириллица сыпет кодировку(((

(Dll не могу установить, ну вот так, давно бы установил, но не могу (предлагать нет смысла))

force_download('101.mp3','Исполнитель - Композиция');


function tagSize($size_to_convert) {
    $result = 0;
    $mask = 0x7F;
    for ($i = 0; $i < 4; ++$i) {
        $temp = ($size_to_convert >> 7 * $i) & $mask;
        $result |= ($temp << 8 * $i);
    }
        
    return $result + 10;
}
 
 
function force_download($file, $name) {
    if (!file_exists($file)) die("Файл не найден!");
    if (fopen($file, 'r') && ob_get_level()) {
        ob_end_clean();
    }
    // $name должна быть в формате "Исполнитель - Композиция"
    list($artist, $title) = explode(' - ', $name);
    $comment = 'site.ru';
    
    $tpe1 = pack('A4Nx3A*', 'TPE1', strlen($artist)+1, $artist);
    $tit2 = pack('A4Nx3A*', 'TIT2', strlen($title)+1, $title);
    $comm = pack('A4Nx7A*', 'COMM', strlen($comment)+5, $comment);
    
    $idlength = strlen($tpe1.$tit2.$comm."\0");
    $id3 = pack('A3vxN', 'ID3', 0x3, tagSize($idlength));
    $length = filesize($file) + $idlength + 10;
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$name.'.mp3');
    header('Content-Length:'.$length);
    print $id3.$tit2.$tpe1.$comm."\0".file_get_contents($file);
    exit;
}
  • Вопрос задан
  • 156 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 2
@Snewer
force_download('101.mp3','Исполнитель - Композиция');

function tagSize($size_to_convert) {
    $result = 0;
    $mask = 0x7F;
    for ($i = 0; $i < 4; ++$i) {
        $temp = ($size_to_convert >> 7 * $i) & $mask;
        $result |= ($temp << 8 * $i);
    }
        
    return $result + 10;
}
 
 
function force_download($file, $name) {
    if (!file_exists($file)) die("Файл не найден!");
    if (fopen($file, 'r') && ob_get_level()) {
        ob_end_clean();
    }
    // $name должна быть в формате "Исполнитель - Композиция"
    list($artist, $title) = explode(' - ', $name);
    $comment = 'site.ru';
    
	$artist = mb_convert_encoding($artist, 'cp1251', 'utf-8');
	$title = mb_convert_encoding($title, 'cp1251', 'utf-8');
	$comment = mb_convert_encoding($comment, 'cp1251', 'utf-8');
	
    $tpe1 = pack('A4Nx3A*', 'TPE1', strlen($artist)+1, $artist);
    $tit2 = pack('A4Nx3A*', 'TIT2', strlen($title)+1, $title);
    $comm = pack('A4Nx7A*', 'COMM', strlen($comment)+5, $comment);
    
    $idlength = strlen($tpe1.$tit2.$comm."\0");
    $id3 = pack('A3vxN', 'ID3', 0x3, tagSize($idlength));
    $length = filesize($file) + $idlength + 10;
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$name.'.mp3');
    header('Content-Length:'.$length);
    print $id3.$tit2.$tpe1.$comm."\0".file_get_contents($file);
    exit;
}
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вы сами указали, что строки заданы в кодировке ISO-8859-1. 'x3' в pack - это два нулевых байта флагов и нулевой байт кодировки.
Для русских символов в ID3v2.3 используется кодировка Unicode-16 с BOM и двумя завершающими нулевыми байтами, в байте кодировки надо указать 1.
id3.org/id3v2.3.0
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы