Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5102)

Unified Diff: chrome/browser/resources/file_manager/js/metadata/id3_parser.js

Issue 39123003: [Files.app] Split the JavaScript files into subdirectories: common, background, and foreground (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed test failure. Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/file_manager/js/metadata/id3_parser.js
diff --git a/chrome/browser/resources/file_manager/js/metadata/id3_parser.js b/chrome/browser/resources/file_manager/js/metadata/id3_parser.js
deleted file mode 100644
index 4037d02e43e8b905bf22a05d1085ed4077a186a8..0000000000000000000000000000000000000000
--- a/chrome/browser/resources/file_manager/js/metadata/id3_parser.js
+++ /dev/null
@@ -1,708 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-'use strict';
-
-importScripts('function_sequence.js');
-importScripts('function_parallel.js');
-
-function Id3Parser(parent) {
- MetadataParser.call(this, parent, 'id3', /\.(mp3)$/i);
-}
-
-Id3Parser.prototype = {__proto__: MetadataParser.prototype};
-
-/**
- * Reads synchsafe integer.
- * 'SynchSafe' term is taken from id3 documentation.
- *
- * @param {ByteReader} reader - reader to use.
- * @param {number} length - bytes to read.
- * @return {number} // TODO(JSDOC).
- * @private
- */
-Id3Parser.readSynchSafe_ = function(reader, length) {
- var rv = 0;
-
- switch (length) {
- case 4:
- rv = reader.readScalar(1, false) << 21;
- case 3:
- rv |= reader.readScalar(1, false) << 14;
- case 2:
- rv |= reader.readScalar(1, false) << 7;
- case 1:
- rv |= reader.readScalar(1, false);
- }
-
- return rv;
-};
-
-/**
- * Reads 3bytes integer.
- *
- * @param {ByteReader} reader - reader to use.
- * @return {number} // TODO(JSDOC).
- * @private
- */
-Id3Parser.readUInt24_ = function(reader) {
- return reader.readScalar(2, false) << 16 | reader.readScalar(1, false);
-};
-
-/**
- * Reads string from reader with specified encoding
- *
- * @param {ByteReader} reader reader to use.
- * @param {number} encoding string encoding.
- * @param {number} size maximum string size. Actual result may be shorter.
- * @return {string} // TODO(JSDOC).
- * @private
- */
-Id3Parser.prototype.readString_ = function(reader, encoding, size) {
- switch (encoding) {
- case Id3Parser.v2.ENCODING.ISO_8859_1:
- return reader.readNullTerminatedString(size);
-
- case Id3Parser.v2.ENCODING.UTF_16:
- return reader.readNullTerminatedStringUTF16(true, size);
-
- case Id3Parser.v2.ENCODING.UTF_16BE:
- return reader.readNullTerminatedStringUTF16(false, size);
-
- case Id3Parser.v2.ENCODING.UTF_8:
- // TODO: implement UTF_8.
- this.log('UTF8 encoding not supported, used ISO_8859_1 instead');
- return reader.readNullTerminatedString(size);
-
- default: {
- this.log('Unsupported encoding in ID3 tag: ' + encoding);
- return '';
- }
- }
-};
-
-/**
- * Reads text frame from reader.
- *
- * @param {ByteReader} reader reader to use.
- * @param {number} majorVersion major id3 version to use.
- * @param {Object} frame frame so store data at.
- * @param {number} end frame end position in reader.
- * @private
- */
-Id3Parser.prototype.readTextFrame_ = function(reader,
- majorVersion,
- frame,
- end) {
- frame.encoding = reader.readScalar(1, false, end);
- frame.value = this.readString_(reader, frame.encoding, end - reader.tell());
-};
-
-/**
- * Reads user defined text frame from reader.
- *
- * @param {ByteReader} reader reader to use.
- * @param {number} majorVersion major id3 version to use.
- * @param {Object} frame frame so store data at.
- * @param {number} end frame end position in reader.
- * @private
- */
-Id3Parser.prototype.readUserDefinedTextFrame_ = function(reader,
- majorVersion,
- frame,
- end) {
- frame.encoding = reader.readScalar(1, false, end);
-
- frame.description = this.readString_(
- reader,
- frame.encoding,
- end - reader.tell());
-
- frame.value = this.readString_(
- reader,
- frame.encoding,
- end - reader.tell());
-};
-
-/**
- * @param {ByteReader} reader Reader to use.
- * @param {number} majorVersion Major id3 version to use.
- * @param {Object} frame Frame so store data at.
- * @param {number} end Frame end position in reader.
- * @private
- */
-Id3Parser.prototype.readPIC_ = function(reader, majorVersion, frame, end) {
- frame.encoding = reader.readScalar(1, false, end);
- frame.format = reader.readNullTerminatedString(3, end - reader.tell());
- frame.pictureType = reader.readScalar(1, false, end);
- frame.description = this.readString_(reader,
- frame.encoding,
- end - reader.tell());
-
-
- if (frame.format == '-->') {
- frame.imageUrl = reader.readNullTerminatedString(end - reader.tell());
- } else {
- frame.imageUrl = reader.readImage(end - reader.tell());
- }
-};
-
-/**
- * @param {ByteReader} reader Reader to use.
- * @param {number} majorVersion Major id3 version to use.
- * @param {Object} frame Frame so store data at.
- * @param {number} end Frame end position in reader.
- * @private
- */
-Id3Parser.prototype.readAPIC_ = function(reader, majorVersion, frame, end) {
- this.vlog('Extracting picture');
- frame.encoding = reader.readScalar(1, false, end);
- frame.mime = reader.readNullTerminatedString(end - reader.tell());
- frame.pictureType = reader.readScalar(1, false, end);
- frame.description = this.readString_(
- reader,
- frame.encoding,
- end - reader.tell());
-
- if (frame.mime == '-->') {
- frame.imageUrl = reader.readNullTerminatedString(end - reader.tell());
- } else {
- frame.imageUrl = reader.readImage(end - reader.tell());
- }
-};
-
-/**
- * Reads string from reader with specified encoding
- *
- * @param {ByteReader} reader reader to use.
- * @param {number} majorVersion // TODO(JSDOC).
- * @return {Object} frame read.
- * @private
- */
-Id3Parser.prototype.readFrame_ = function(reader, majorVersion) {
- if (reader.eof())
- return null;
-
- var frame = {};
-
- reader.pushSeek(reader.tell(), ByteReader.SEEK_BEG);
-
- var position = reader.tell();
-
- frame.name = (majorVersion == 2) ? reader.readNullTerminatedString(3) :
- reader.readNullTerminatedString(4);
-
- if (frame.name == '')
- return null;
-
- this.vlog('Found frame ' + (frame.name) + ' at position ' + position);
-
- switch (majorVersion) {
- case 2:
- frame.size = Id3Parser.readUInt24_(reader);
- frame.headerSize = 6;
- break;
- case 3:
- frame.size = reader.readScalar(4, false);
- frame.headerSize = 10;
- frame.flags = reader.readScalar(2, false);
- break;
- case 4:
- frame.size = Id3Parser.readSynchSafe_(reader, 4);
- frame.headerSize = 10;
- frame.flags = reader.readScalar(2, false);
- break;
- }
-
- this.vlog('Found frame [' + frame.name + '] with size [' + frame.size + ']');
-
- if (Id3Parser.v2.HANDLERS[frame.name]) {
- Id3Parser.v2.HANDLERS[frame.name].call(
- this,
- reader,
- majorVersion,
- frame,
- reader.tell() + frame.size);
- } else if (frame.name.charAt(0) == 'T' || frame.name.charAt(0) == 'W') {
- this.readTextFrame_(
- reader,
- majorVersion,
- frame,
- reader.tell() + frame.size);
- }
-
- reader.popSeek();
-
- reader.seek(frame.size + frame.headerSize, ByteReader.SEEK_CUR);
-
- return frame;
-};
-
-/**
- * @param {File} file // TODO(JSDOC).
- * @param {Object} metadata // TODO(JSDOC).
- * @param {function(Object)} callback // TODO(JSDOC).
- * @param {function(etring)} onError // TODO(JSDOC).
- */
-Id3Parser.prototype.parse = function(file, metadata, callback, onError) {
- var self = this;
-
- this.log('Starting id3 parser for ' + file.name);
-
- var id3v1Parser = new FunctionSequence(
- 'id3v1parser',
- [
- /**
- * Reads last 128 bytes of file in bytebuffer,
- * which passes further.
- * In last 128 bytes should be placed ID3v1 tag if available.
- * @param {File} file File which bytes to read.
- */
- function readTail(file) {
- util.readFileBytes(file, file.size - 128, file.size,
- this.nextStep, this.onError, this);
- },
-
- /**
- * Attempts to extract ID3v1 tag from 128 bytes long ByteBuffer
- * @param {File} file File which tags are being extracted. Could be used
- * for logging purposes.
- * @param {ByteReader} reader ByteReader of 128 bytes.
- */
- function extractId3v1(file, reader) {
- if (reader.readString(3) == 'TAG') {
- this.logger.vlog('id3v1 found');
- var id3v1 = metadata.id3v1 = {};
-
- var title = reader.readNullTerminatedString(30).trim();
-
- if (title.length > 0) {
- metadata.title = title;
- }
-
- reader.seek(3 + 30, ByteReader.SEEK_BEG);
-
- var artist = reader.readNullTerminatedString(30).trim();
- if (artist.length > 0) {
- metadata.artist = artist;
- }
-
- reader.seek(3 + 30 + 30, ByteReader.SEEK_BEG);
-
- var album = reader.readNullTerminatedString(30).trim();
- if (album.length > 0) {
- metadata.album = album;
- }
- }
- this.nextStep();
- }
- ],
- this
- );
-
- var id3v2Parser = new FunctionSequence(
- 'id3v2parser',
- [
- function readHead(file) {
- util.readFileBytes(file, 0, 10, this.nextStep, this.onError,
- this);
- },
-
- /**
- * Check if passed array of 10 bytes contains ID3 header.
- * @param {File} file File to check and continue reading if ID3
- * metadata found.
- * @param {ByteReader} reader Reader to fill with stream bytes.
- */
- function checkId3v2(file, reader) {
- if (reader.readString(3) == 'ID3') {
- this.logger.vlog('id3v2 found');
- var id3v2 = metadata.id3v2 = {};
- id3v2.major = reader.readScalar(1, false);
- id3v2.minor = reader.readScalar(1, false);
- id3v2.flags = reader.readScalar(1, false);
- id3v2.size = Id3Parser.readSynchSafe_(reader, 4);
-
- util.readFileBytes(file, 10, 10 + id3v2.size, this.nextStep,
- this.onError, this);
- } else {
- this.finish();
- }
- },
-
- /**
- * Extracts all ID3v2 frames from given bytebuffer.
- * @param {File} file File being parsed.
- * @param {ByteReader} reader Reader to use for metadata extraction.
- */
- function extractFrames(file, reader) {
- var id3v2 = metadata.id3v2;
-
- if ((id3v2.major > 2) &&
- (id3v2.flags & Id3Parser.v2.FLAG_EXTENDED_HEADER != 0)) {
- // Skip extended header if found
- if (id3v2.major == 3) {
- reader.seek(reader.readScalar(4, false) - 4);
- } else if (id3v2.major == 4) {
- reader.seek(Id3Parser.readSynchSafe_(reader, 4) - 4);
- }
- }
-
- var frame;
-
- while (frame = self.readFrame_(reader, id3v2.major)) {
- metadata.id3v2[frame.name] = frame;
- }
-
- this.nextStep();
- },
-
- /**
- * Adds 'description' object to metadata.
- * 'description' used to unify different parsers and make
- * metadata parser-aware.
- * Description is array if value-type pairs. Type should be used
- * to properly format value before displaying to user.
- */
- function prepareDescription() {
- var id3v2 = metadata.id3v2;
-
- if (id3v2['APIC'])
- metadata.thumbnailURL = id3v2['APIC'].imageUrl;
- else if (id3v2['PIC'])
- metadata.thumbnailURL = id3v2['PIC'].imageUrl;
-
- metadata.description = [];
-
- for (var key in id3v2) {
- if (typeof(Id3Parser.v2.MAPPERS[key]) != 'undefined' &&
- id3v2[key].value.trim().length > 0) {
- metadata.description.push({
- key: Id3Parser.v2.MAPPERS[key],
- value: id3v2[key].value.trim()
- });
- }
- }
-
- function extract(propName, tags) {
- for (var i = 1; i != arguments.length; i++) {
- var tag = id3v2[arguments[i]];
- if (tag && tag.value) {
- metadata[propName] = tag.value;
- break;
- }
- }
- }
-
- extract('album', 'TALB', 'TAL');
- extract('title', 'TIT2', 'TT2');
- extract('artist', 'TPE1', 'TP1');
-
- metadata.description.sort(function(a, b) {
- return Id3Parser.METADATA_ORDER.indexOf(a.key) -
- Id3Parser.METADATA_ORDER.indexOf(b.key);
- });
- this.nextStep();
- }
- ],
- this
- );
-
- var metadataParser = new FunctionParallel(
- 'mp3metadataParser',
- [id3v1Parser, id3v2Parser],
- this,
- function() {
- callback.call(null, metadata);
- },
- onError
- );
-
- id3v1Parser.setCallback(metadataParser.nextStep);
- id3v2Parser.setCallback(metadataParser.nextStep);
-
- id3v1Parser.setFailureCallback(metadataParser.onError);
- id3v2Parser.setFailureCallback(metadataParser.onError);
-
- this.vlog('Passed argument : ' + file);
-
- metadataParser.start(file);
-};
-
-
-/**
- * Metadata order to use for metadata generation
- */
-Id3Parser.METADATA_ORDER = [
- 'ID3_TITLE',
- 'ID3_LEAD_PERFORMER',
- 'ID3_YEAR',
- 'ID3_ALBUM',
- 'ID3_TRACK_NUMBER',
- 'ID3_BPM',
- 'ID3_COMPOSER',
- 'ID3_DATE',
- 'ID3_PLAYLIST_DELAY',
- 'ID3_LYRICIST',
- 'ID3_FILE_TYPE',
- 'ID3_TIME',
- 'ID3_LENGTH',
- 'ID3_FILE_OWNER',
- 'ID3_BAND',
- 'ID3_COPYRIGHT',
- 'ID3_OFFICIAL_AUDIO_FILE_WEBPAGE',
- 'ID3_OFFICIAL_ARTIST',
- 'ID3_OFFICIAL_AUDIO_SOURCE_WEBPAGE',
- 'ID3_PUBLISHERS_OFFICIAL_WEBPAGE'
-];
-
-
-/**
- * id3v1 constants
- */
-Id3Parser.v1 = {
- /**
- * Genres list as described in id3 documentation. We aren't going to
- * localize this list, because at least in Russian (and I think most
- * other languages), translation exists at least for 10% and most time
- * translation would degrade to transliteration.
- */
- GENRES: [
- 'Blues',
- 'Classic Rock',
- 'Country',
- 'Dance',
- 'Disco',
- 'Funk',
- 'Grunge',
- 'Hip-Hop',
- 'Jazz',
- 'Metal',
- 'New Age',
- 'Oldies',
- 'Other',
- 'Pop',
- 'R&B',
- 'Rap',
- 'Reggae',
- 'Rock',
- 'Techno',
- 'Industrial',
- 'Alternative',
- 'Ska',
- 'Death Metal',
- 'Pranks',
- 'Soundtrack',
- 'Euro-Techno',
- 'Ambient',
- 'Trip-Hop',
- 'Vocal',
- 'Jazz+Funk',
- 'Fusion',
- 'Trance',
- 'Classical',
- 'Instrumental',
- 'Acid',
- 'House',
- 'Game',
- 'Sound Clip',
- 'Gospel',
- 'Noise',
- 'AlternRock',
- 'Bass',
- 'Soul',
- 'Punk',
- 'Space',
- 'Meditative',
- 'Instrumental Pop',
- 'Instrumental Rock',
- 'Ethnic',
- 'Gothic',
- 'Darkwave',
- 'Techno-Industrial',
- 'Electronic',
- 'Pop-Folk',
- 'Eurodance',
- 'Dream',
- 'Southern Rock',
- 'Comedy',
- 'Cult',
- 'Gangsta',
- 'Top 40',
- 'Christian Rap',
- 'Pop/Funk',
- 'Jungle',
- 'Native American',
- 'Cabaret',
- 'New Wave',
- 'Psychadelic',
- 'Rave',
- 'Showtunes',
- 'Trailer',
- 'Lo-Fi',
- 'Tribal',
- 'Acid Punk',
- 'Acid Jazz',
- 'Polka',
- 'Retro',
- 'Musical',
- 'Rock & Roll',
- 'Hard Rock',
- 'Folk',
- 'Folk-Rock',
- 'National Folk',
- 'Swing',
- 'Fast Fusion',
- 'Bebob',
- 'Latin',
- 'Revival',
- 'Celtic',
- 'Bluegrass',
- 'Avantgarde',
- 'Gothic Rock',
- 'Progressive Rock',
- 'Psychedelic Rock',
- 'Symphonic Rock',
- 'Slow Rock',
- 'Big Band',
- 'Chorus',
- 'Easy Listening',
- 'Acoustic',
- 'Humour',
- 'Speech',
- 'Chanson',
- 'Opera',
- 'Chamber Music',
- 'Sonata',
- 'Symphony',
- 'Booty Bass',
- 'Primus',
- 'Porn Groove',
- 'Satire',
- 'Slow Jam',
- 'Club',
- 'Tango',
- 'Samba',
- 'Folklore',
- 'Ballad',
- 'Power Ballad',
- 'Rhythmic Soul',
- 'Freestyle',
- 'Duet',
- 'Punk Rock',
- 'Drum Solo',
- 'A capella',
- 'Euro-House',
- 'Dance Hall',
- 'Goa',
- 'Drum & Bass',
- 'Club-House',
- 'Hardcore',
- 'Terror',
- 'Indie',
- 'BritPop',
- 'Negerpunk',
- 'Polsk Punk',
- 'Beat',
- 'Christian Gangsta Rap',
- 'Heavy Metal',
- 'Black Metal',
- 'Crossover',
- 'Contemporary Christian',
- 'Christian Rock',
- 'Merengue',
- 'Salsa',
- 'Thrash Metal',
- 'Anime',
- 'Jpop',
- 'Synthpop'
- ]
-};
-
-/**
- * id3v2 constants
- */
-Id3Parser.v2 = {
- FLAG_EXTENDED_HEADER: 1 << 5,
-
- ENCODING: {
- /**
- * ISO-8859-1 [ISO-8859-1]. Terminated with $00.
- *
- * @const
- * @type {number}
- */
- ISO_8859_1: 0,
-
-
- /**
- * [UTF-16] encoded Unicode [UNICODE] with BOM. All
- * strings in the same frame SHALL have the same byteorder.
- * Terminated with $00 00.
- *
- * @const
- * @type {number}
- */
- UTF_16: 1,
-
- /**
- * UTF-16BE [UTF-16] encoded Unicode [UNICODE] without BOM.
- * Terminated with $00 00.
- *
- * @const
- * @type {number}
- */
- UTF_16BE: 2,
-
- /**
- * UTF-8 [UTF-8] encoded Unicode [UNICODE]. Terminated with $00.
- *
- * @const
- * @type {number}
- */
- UTF_8: 3
- },
- HANDLERS: {
- //User defined text information frame
- TXX: Id3Parser.prototype.readUserDefinedTextFrame_,
- //User defined URL link frame
- WXX: Id3Parser.prototype.readUserDefinedTextFrame_,
-
- //User defined text information frame
- TXXX: Id3Parser.prototype.readUserDefinedTextFrame_,
-
- //User defined URL link frame
- WXXX: Id3Parser.prototype.readUserDefinedTextFrame_,
-
- //User attached image
- PIC: Id3Parser.prototype.readPIC_,
-
- //User attached image
- APIC: Id3Parser.prototype.readAPIC_
- },
- MAPPERS: {
- TALB: 'ID3_ALBUM',
- TBPM: 'ID3_BPM',
- TCOM: 'ID3_COMPOSER',
- TDAT: 'ID3_DATE',
- TDLY: 'ID3_PLAYLIST_DELAY',
- TEXT: 'ID3_LYRICIST',
- TFLT: 'ID3_FILE_TYPE',
- TIME: 'ID3_TIME',
- TIT2: 'ID3_TITLE',
- TLEN: 'ID3_LENGTH',
- TOWN: 'ID3_FILE_OWNER',
- TPE1: 'ID3_LEAD_PERFORMER',
- TPE2: 'ID3_BAND',
- TRCK: 'ID3_TRACK_NUMBER',
- TYER: 'ID3_YEAR',
- WCOP: 'ID3_COPYRIGHT',
- WOAF: 'ID3_OFFICIAL_AUDIO_FILE_WEBPAGE',
- WOAR: 'ID3_OFFICIAL_ARTIST',
- WOAS: 'ID3_OFFICIAL_AUDIO_SOURCE_WEBPAGE',
- WPUB: 'ID3_PUBLISHERS_OFFICIAL_WEBPAGE'
- }
-};
-
-MetadataDispatcher.registerParserClass(Id3Parser);

Powered by Google App Engine
This is Rietveld 408576698