JSFiddle - React, Tailwind, and code Playground
HTML
<form id="meta">
<div><input type="file" id="files" name="file"></div>
<div><input type="text" id="title" name="title"></div>
<div><input type="text" id="artist" name="artist"></div>
<div><input type="text" id="album" name="album"></div>
<div><input type="text" id="year" name="year"></div>
</form>
CSS
input {width:300px;}
form div {margin-bottom:5px;}
JavaScript
var BinaryBuffer=function(buffer){
this.buffer=buffer;
this.length=buffer.length;
};
BinaryBuffer.prototype={
// Функция возвращающая часть данных
slice:function(offset,length){
var buffer=new ArrayBuffer(length);
for(var i=offset,j=0;i<this.length && j<length;i++,j++){
buffer[j]=this.buffer[i];
}
return new BinaryBuffer(buffer);
},
// Возвращаем определенный байт
byteAt:function(i){
return this.buffer[i]&0xFF;
},
// Возращаем ASCII символ
charAt:function(i){
var code=this.byteAt(i);
if(code==0)return "?";
if(code<32)return "?";
return String.fromCharCode(code);
},
// Возращаем ASCII строку
stringAt:function(offset,length){
var str=[];
for(var i=offset,j=0;i<offset+length;i++,j++) {
str[j]=this.charAt(i);
}
return str.join("");
},
// Возращаем ASCII для всего массива данных
toString:function(){
return this.stringAt(0,this.length);
}
};
var ID3v2=function(){
// Cюда будем сохранять ошибки
this.errors=[];
// Версия тега
this.version='Unknown';
// Флаги тега
this.flags={
isUnSynchronisation:false,
hasExtendedHeader:false,
isExperimental:false,
hasFooter:false
};
// Размер тега в байтах. Размер не включает 10 байт заголовка и 10 байт футера (при наличии его)
this.size=0;
// Фреймы тега
this.frames={};
};
ID3v2.prototype.readFromFile=function(file,callback){
// Проверим на всякий случай второй параметр
if(!(callback instanceof Function)){
callback=function(target){};
}
var self=this,
// нам понадобится FileReader
reader=new FileReader;
// Расшифруем Synchsafe - в данном виде хранятся размеры тега размеры фрейма, подробнее в интернете, например, в Вики
// http://en.wikipedia.org/wiki/Synchsafe
function UnSynchsafeInt(buffer){
...