15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)'use strict';
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu/**
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * Protocol + host parts of extension URL.
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @type {string}
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @const
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu */
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvar FILE_MANAGER_HOST = 'chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj';
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuimportScripts(
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    FILE_MANAGER_HOST + '/foreground/js/metadata/function_sequence.js');
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuimportScripts(
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    FILE_MANAGER_HOST + '/foreground/js/metadata/function_parallel.js');
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function Id3Parser(parent) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MetadataParser.call(this, parent, 'id3', /\.(mp3)$/i);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.prototype = {__proto__: MetadataParser.prototype};
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads synchsafe integer.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 'SynchSafe' term is taken from id3 documentation.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {ByteReader} reader Reader to use.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {number} length Rytes to read.
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {number} Synchsafe value.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.readSynchSafe_ = function(reader, length) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var rv = 0;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (length) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 4:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = reader.readScalar(1, false) << 21;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 3:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv |= reader.readScalar(1, false) << 14;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 2:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv |= reader.readScalar(1, false) << 7;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv |= reader.readScalar(1, false);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rv;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads 3bytes integer.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {ByteReader} reader Reader to use.
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {number} Uint24 value.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.readUInt24_ = function(reader) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader.readScalar(2, false) << 16 | reader.readScalar(1, false);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads string from reader with specified encoding
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {ByteReader} reader Reader to use.
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {number} encoding String encoding.
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {number} size Maximum string size. Actual result may be shorter.
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {string} String value.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.prototype.readString_ = function(reader, encoding, size) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (encoding) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case Id3Parser.v2.ENCODING.ISO_8859_1:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return reader.readNullTerminatedString(size);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case Id3Parser.v2.ENCODING.UTF_16:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return reader.readNullTerminatedStringUTF16(true, size);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case Id3Parser.v2.ENCODING.UTF_16BE:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return reader.readNullTerminatedStringUTF16(false, size);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case Id3Parser.v2.ENCODING.UTF_8:
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO: implement UTF_8.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.log('UTF8 encoding not supported, used ISO_8859_1 instead');
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return reader.readNullTerminatedString(size);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.log('Unsupported encoding in ID3 tag: ' + encoding);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return '';
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads text frame from reader.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {ByteReader} reader Reader to use.
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {number} majorVersion Major id3 version to use.
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {Object} frame Frame so store data at.
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {number} end Frame end position in reader.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.prototype.readTextFrame_ = function(reader,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              majorVersion,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              frame,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              end) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.encoding = reader.readScalar(1, false, end);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.value = this.readString_(reader, frame.encoding, end - reader.tell());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads user defined text frame from reader.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {ByteReader} reader Reader to use.
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {number} majorVersion Major id3 version to use.
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {Object} frame Frame so store data at.
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {number} end Frame end position in reader.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.prototype.readUserDefinedTextFrame_ = function(reader,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         majorVersion,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         frame,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         end) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.encoding = reader.readScalar(1, false, end);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.description = this.readString_(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reader,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.encoding,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end - reader.tell());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.value = this.readString_(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reader,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.encoding,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end - reader.tell());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {ByteReader} reader Reader to use.
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {number} majorVersion Major id3 version to use.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Object} frame Frame so store data at.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {number} end Frame end position in reader.
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.prototype.readPIC_ = function(reader, majorVersion, frame, end) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.encoding = reader.readScalar(1, false, end);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.format = reader.readNullTerminatedString(3, end - reader.tell());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.pictureType = reader.readScalar(1, false, end);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.description = this.readString_(reader,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       frame.encoding,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       end - reader.tell());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame.format == '-->') {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame.imageUrl = reader.readNullTerminatedString(end - reader.tell());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame.imageUrl = reader.readImage(end - reader.tell());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {ByteReader} reader Reader to use.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {number} majorVersion Major id3 version to use.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Object} frame Frame so store data at.
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {number} end Frame end position in reader.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.prototype.readAPIC_ = function(reader, majorVersion, frame, end) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.vlog('Extracting picture');
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.encoding = reader.readScalar(1, false, end);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.mime = reader.readNullTerminatedString(end - reader.tell());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.pictureType = reader.readScalar(1, false, end);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame.description = this.readString_(
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reader,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.encoding,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end - reader.tell());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame.mime == '-->') {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame.imageUrl = reader.readNullTerminatedString(end - reader.tell());
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame.imageUrl = reader.readImage(end - reader.tell());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads string from reader with specified encoding
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {ByteReader} reader Reader to use.
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {number} majorVersion Major id3 version to use.
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {Object} Frame read.
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.prototype.readFrame_ = function(reader, majorVersion) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reader.eof())
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return null;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var frame = {};
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reader.pushSeek(reader.tell(), ByteReader.SEEK_BEG);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var position = reader.tell();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.name = (majorVersion == 2) ? reader.readNullTerminatedString(3) :
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     reader.readNullTerminatedString(4);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame.name == '')
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return null;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.vlog('Found frame ' + (frame.name) + ' at position ' + position);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (majorVersion) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 2:
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.size = Id3Parser.readUInt24_(reader);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.headerSize = 6;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 3:
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.size = reader.readScalar(4, false);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.headerSize = 10;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.flags = reader.readScalar(2, false);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 4:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.size = Id3Parser.readSynchSafe_(reader, 4);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.headerSize = 10;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame.flags = reader.readScalar(2, false);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.vlog('Found frame [' + frame.name + '] with size [' + frame.size + ']');
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Id3Parser.v2.HANDLERS[frame.name]) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Id3Parser.v2.HANDLERS[frame.name].call(
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reader,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        majorVersion,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        frame,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reader.tell() + frame.size);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (frame.name.charAt(0) == 'T' || frame.name.charAt(0) == 'W') {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.readTextFrame_(
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reader,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        majorVersion,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        frame,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reader.tell() + frame.size);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reader.popSeek();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reader.seek(frame.size + frame.headerSize, ByteReader.SEEK_CUR);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return frame;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {File} file File object to parse.
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {Object} metadata Metadata object of the file.
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {function(Object)} callback Success callback.
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {function(etring)} onError Error callback.
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Id3Parser.prototype.parse = function(file, metadata, callback, onError) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var self = this;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.log('Starting id3 parser for ' + file.name);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var id3v1Parser = new FunctionSequence(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'id3v1parser',
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /**
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Reads last 128 bytes of file in bytebuffer,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * which passes further.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * In last 128 bytes should be placed ID3v1 tag if available.
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         * @param {File} file File which bytes to read.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        function readTail(file) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          util.readFileBytes(file, file.size - 128, file.size,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              this.nextStep, this.onError, this);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /**
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Attempts to extract ID3v1 tag from 128 bytes long ByteBuffer
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         * @param {File} file File which tags are being extracted. Could be used
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         *     for logging purposes.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * @param {ByteReader} reader ByteReader of 128 bytes.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        function extractId3v1(file, reader) {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (reader.readString(3) == 'TAG') {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            this.logger.vlog('id3v1 found');
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var id3v1 = metadata.id3v1 = {};
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var title = reader.readNullTerminatedString(30).trim();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (title.length > 0) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              metadata.title = title;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            reader.seek(3 + 30, ByteReader.SEEK_BEG);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var artist = reader.readNullTerminatedString(30).trim();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (artist.length > 0) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              metadata.artist = artist;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            reader.seek(3 + 30 + 30, ByteReader.SEEK_BEG);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var album = reader.readNullTerminatedString(30).trim();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (album.length > 0) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              metadata.album = album;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.nextStep();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ],
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      this);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var id3v2Parser = new FunctionSequence(
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'id3v2parser',
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        function readHead(file) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          util.readFileBytes(file, 0, 10, this.nextStep, this.onError,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              this);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /**
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Check if passed array of 10 bytes contains ID3 header.
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         * @param {File} file File to check and continue reading if ID3
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         *     metadata found.
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         * @param {ByteReader} reader Reader to fill with stream bytes.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        function checkId3v2(file, reader) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (reader.readString(3) == 'ID3') {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            this.logger.vlog('id3v2 found');
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var id3v2 = metadata.id3v2 = {};
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            id3v2.major = reader.readScalar(1, false);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            id3v2.minor = reader.readScalar(1, false);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            id3v2.flags = reader.readScalar(1, false);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            id3v2.size = Id3Parser.readSynchSafe_(reader, 4);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            util.readFileBytes(file, 10, 10 + id3v2.size, this.nextStep,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                this.onError, this);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            this.finish();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /**
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Extracts all ID3v2 frames from given bytebuffer.
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         * @param {File} file File being parsed.
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         * @param {ByteReader} reader Reader to use for metadata extraction.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        function extractFrames(file, reader) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var id3v2 = metadata.id3v2;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if ((id3v2.major > 2) &&
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              (id3v2.flags & Id3Parser.v2.FLAG_EXTENDED_HEADER != 0)) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Skip extended header if found
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (id3v2.major == 3) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              reader.seek(reader.readScalar(4, false) - 4);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (id3v2.major == 4) {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              reader.seek(Id3Parser.readSynchSafe_(reader, 4) - 4);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var frame;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while (frame = self.readFrame_(reader, id3v2.major)) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            metadata.id3v2[frame.name] = frame;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.nextStep();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /**
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Adds 'description' object to metadata.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * 'description' used to unify different parsers and make
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * metadata parser-aware.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Description is array if value-type pairs. Type should be used
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * to properly format value before displaying to user.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        function prepareDescription() {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var id3v2 = metadata.id3v2;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (id3v2['APIC'])
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            metadata.thumbnailURL = id3v2['APIC'].imageUrl;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          else if (id3v2['PIC'])
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            metadata.thumbnailURL = id3v2['PIC'].imageUrl;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          metadata.description = [];
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for (var key in id3v2) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (typeof(Id3Parser.v2.MAPPERS[key]) != 'undefined' &&
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                id3v2[key].value.trim().length > 0) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              metadata.description.push({
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                key: Id3Parser.v2.MAPPERS[key],
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                value: id3v2[key].value.trim()
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              });
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          function extract(propName, tags) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (var i = 1; i != arguments.length; i++) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var tag = id3v2[arguments[i]];
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if (tag && tag.value) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                metadata[propName] = tag.value;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extract('album', 'TALB', 'TAL');
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extract('title', 'TIT2', 'TT2');
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extract('artist', 'TPE1', 'TP1');
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          metadata.description.sort(function(a, b) {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return Id3Parser.METADATA_ORDER.indexOf(a.key) -
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   Id3Parser.METADATA_ORDER.indexOf(b.key);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          });
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.nextStep();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ],
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      this);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var metadataParser = new FunctionParallel(
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'mp3metadataParser',
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [id3v1Parser, id3v2Parser],
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      function() {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        callback.call(null, metadata);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      onError);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id3v1Parser.setCallback(metadataParser.nextStep);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id3v2Parser.setCallback(metadataParser.nextStep);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id3v1Parser.setFailureCallback(metadataParser.onError);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id3v2Parser.setFailureCallback(metadataParser.onError);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.vlog('Passed argument : ' + file);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  metadataParser.start(file);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Metadata order to use for metadata generation
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @type {Array.<string>}
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @const
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.METADATA_ORDER = [
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_TITLE',
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_LEAD_PERFORMER',
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_YEAR',
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_ALBUM',
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_TRACK_NUMBER',
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_BPM',
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_COMPOSER',
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_DATE',
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_PLAYLIST_DELAY',
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_LYRICIST',
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_FILE_TYPE',
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_TIME',
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_LENGTH',
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_FILE_OWNER',
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_BAND',
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_COPYRIGHT',
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_OFFICIAL_AUDIO_FILE_WEBPAGE',
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_OFFICIAL_ARTIST',
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_OFFICIAL_AUDIO_SOURCE_WEBPAGE',
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ID3_PUBLISHERS_OFFICIAL_WEBPAGE'
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)];
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Id3v1 constants.
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @type {Object.<*>}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.v1 = {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Genres list as described in id3 documentation. We aren't going to
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * localize this list, because at least in Russian (and I think most
4774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * other languages), translation exists at least for 10% and most time
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * translation would degrade to transliteration.
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GENRES: [
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Blues',
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Classic Rock',
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Country',
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Dance',
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Disco',
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Funk',
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Grunge',
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Hip-Hop',
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Jazz',
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Metal',
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'New Age',
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Oldies',
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Other',
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Pop',
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'R&B',
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Rap',
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Reggae',
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Rock',
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Techno',
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Industrial',
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Alternative',
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Ska',
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Death Metal',
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Pranks',
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Soundtrack',
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Euro-Techno',
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Ambient',
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Trip-Hop',
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Vocal',
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Jazz+Funk',
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Fusion',
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Trance',
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Classical',
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Instrumental',
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Acid',
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'House',
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Game',
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Sound Clip',
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Gospel',
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Noise',
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'AlternRock',
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Bass',
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Soul',
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Punk',
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Space',
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Meditative',
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Instrumental Pop',
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Instrumental Rock',
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Ethnic',
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Gothic',
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Darkwave',
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Techno-Industrial',
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Electronic',
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Pop-Folk',
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Eurodance',
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Dream',
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Southern Rock',
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Comedy',
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Cult',
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Gangsta',
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Top 40',
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Christian Rap',
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Pop/Funk',
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Jungle',
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Native American',
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Cabaret',
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'New Wave',
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Psychadelic',
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Rave',
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Showtunes',
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Trailer',
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Lo-Fi',
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Tribal',
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Acid Punk',
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Acid Jazz',
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Polka',
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Retro',
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Musical',
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Rock & Roll',
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Hard Rock',
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Folk',
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Folk-Rock',
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'National Folk',
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Swing',
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Fast Fusion',
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Bebob',
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Latin',
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Revival',
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Celtic',
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Bluegrass',
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Avantgarde',
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Gothic Rock',
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Progressive Rock',
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Psychedelic Rock',
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Symphonic Rock',
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Slow Rock',
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Big Band',
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Chorus',
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Easy Listening',
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Acoustic',
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Humour',
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Speech',
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Chanson',
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Opera',
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Chamber Music',
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Sonata',
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Symphony',
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Booty Bass',
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Primus',
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Porn Groove',
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Satire',
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Slow Jam',
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Club',
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Tango',
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Samba',
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Folklore',
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Ballad',
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Power Ballad',
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Rhythmic Soul',
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Freestyle',
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Duet',
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Punk Rock',
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Drum Solo',
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'A capella',
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Euro-House',
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Dance Hall',
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Goa',
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Drum & Bass',
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Club-House',
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Hardcore',
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Terror',
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Indie',
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'BritPop',
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Negerpunk',
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Polsk Punk',
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Beat',
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Christian Gangsta Rap',
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Heavy Metal',
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Black Metal',
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Crossover',
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Contemporary Christian',
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Christian Rock',
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Merengue',
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Salsa',
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Thrash Metal',
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Anime',
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Jpop',
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'Synthpop'
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ]
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Id3v2 constants.
6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @type {Object.<*>}
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Id3Parser.v2 = {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAG_EXTENDED_HEADER: 1 << 5,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ENCODING: {
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * ISO-8859-1 [ISO-8859-1]. Terminated with $00.
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @const
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {number}
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ISO_8859_1: 0,
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * [UTF-16] encoded Unicode [UNICODE] with BOM. All
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * strings in the same frame SHALL have the same byteorder.
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Terminated with $00 00.
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @const
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {number}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UTF_16: 1,
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * UTF-16BE [UTF-16] encoded Unicode [UNICODE] without BOM.
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Terminated with $00 00.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @const
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {number}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UTF_16BE: 2,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * UTF-8 [UTF-8] encoded Unicode [UNICODE]. Terminated with $00.
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @const
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {number}
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UTF_8: 3
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLERS: {
6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //User defined text information frame
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TXX: Id3Parser.prototype.readUserDefinedTextFrame_,
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //User defined URL link frame
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WXX: Id3Parser.prototype.readUserDefinedTextFrame_,
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //User defined text information frame
6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TXXX: Id3Parser.prototype.readUserDefinedTextFrame_,
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //User defined URL link frame
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WXXX: Id3Parser.prototype.readUserDefinedTextFrame_,
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //User attached image
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PIC: Id3Parser.prototype.readPIC_,
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //User attached image
6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    APIC: Id3Parser.prototype.readAPIC_
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAPPERS: {
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TALB: 'ID3_ALBUM',
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TBPM: 'ID3_BPM',
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TCOM: 'ID3_COMPOSER',
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TDAT: 'ID3_DATE',
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TDLY: 'ID3_PLAYLIST_DELAY',
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEXT: 'ID3_LYRICIST',
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TFLT: 'ID3_FILE_TYPE',
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TIME: 'ID3_TIME',
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TIT2: 'ID3_TITLE',
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TLEN: 'ID3_LENGTH',
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TOWN: 'ID3_FILE_OWNER',
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TPE1: 'ID3_LEAD_PERFORMER',
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TPE2: 'ID3_BAND',
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRCK: 'ID3_TRACK_NUMBER',
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TYER: 'ID3_YEAR',
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WCOP: 'ID3_COPYRIGHT',
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WOAF: 'ID3_OFFICIAL_AUDIO_FILE_WEBPAGE',
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WOAR: 'ID3_OFFICIAL_ARTIST',
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WOAS: 'ID3_OFFICIAL_AUDIO_SOURCE_WEBPAGE',
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WPUB: 'ID3_PUBLISHERS_OFFICIAL_WEBPAGE'
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataDispatcher.registerParserClass(Id3Parser);
719