На основе ответа ebidel можно прочитать теги id3v1, используя jDataView:
document.querySelector('input[type="file"]').onchange = function (e) {
var reader = new FileReader();
reader.onload = function (e) {
var dv = new jDataView(this.result);
// "TAG" starts at byte -128 from EOF.
// See http://en.wikipedia.org/wiki/ID3
if (dv.getString(3, dv.byteLength - 128) == 'TAG') {
var title = dv.getString(30, dv.tell());
var artist = dv.getString(30, dv.tell());
var album = dv.getString(30, dv.tell());
var year = dv.getString(4, dv.tell());
} else {
// no ID3v1 data found.
}
};
reader.readAsArrayBuffer(this.files[0]);
};
Chrome и другие браузеры теперь внедрили DataView (меня интересует только Chrome). Мне интересно, если кто-то знает, как:
- Чтение тегов с использованием встроенного DataView
- Чтение тегов id3 v2.4 (включая обложку изображения APIC)
Дело в том, что у меня нет опыта работы с бинарными файлами, и я полностью не знаю, как перейти к правильной позиции тега, или о том, что такое маленький endian и long endian (или что-то еще). Мне просто нужен пример для одного тега - скажем название, тег TIT2
, который, я надеюсь, поможет мне понять, как перейти в правильное положение и прочитать другие теги:
function readID3() {
//https://developer.mozilla.org/en-US/docs/Web/API/DataView
//and the position
//http://id3.org/id3v2.4.0-frames
//var id3={};
//id3.TIT2=new DataView(this.result,?offset?,?length?)
/*
?
var a=new DataView(this.result);
console.dir(String.fromCharCode(a.getUint8(0)));
?
*/
}
function readFile() {
var a = new FileReader();
a.onload = readID3;
a.readAsArrayBuffer(this.files[0]);
}
fileBox.addEventListener('change', readFile, false);
Вот JSFiddle.
UPDATE
Я добавил getString
, чтобы я мог прочитать первую строку и проверить, содержит ли она ID3.
Теперь мне нужно найти позицию первого тега (TIT2) и длину переменной этой строки, а также проверить, является ли она версией 2.4.
//Header
//ID3v2/file identifier "ID3"
//ID3v2 version $04 00
//ID3v2 flags (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x)
//ID3v2 size 4 * %0xxxxxxx
Возможные внешние источники:
https://developer.mozilla.org/en-US/docs/Web/API/DataView
http://id3.org/id3v2.4.0-frames
http://id3.org/id3v2.4.0-structure
http://blog.nihilogic.dk/2008/08/reading-id3-tags-with-javascript.html
http://ericbidelman.tumblr.com/post/8343485440/reading-mp3-id3-tags-in-javascript
https://github.com/aadsm/JavaScript-ID3-Reader
Я использую PHP getid3 lib в данный момент...