@music-metadata/s3
Advanced tools
Comparing version 0.5.1 to 0.6.0
import * as S3 from 'aws-sdk/clients/s3'; | ||
import { AWSError, Request } from 'aws-sdk'; | ||
import { IOptions, IAudioMetadata } from 'music-metadata/lib/type'; | ||
import { IS3Options } from '@tokenizer/s3'; | ||
export { IPicture, IAudioMetadata, IOptions, ITag, INativeTagDict } from 'music-metadata/lib/type'; | ||
interface IS3Options extends IOptions { | ||
/** | ||
* Flag to disable chunked transfer, use conventional HTTPS stream instead | ||
*/ | ||
disableChunked?: boolean; | ||
interface IMMS3Options extends IOptions, IS3Options { | ||
} | ||
export declare class MMS3Client { | ||
private s3; | ||
constructor(s3: S3); | ||
/** | ||
* Do a ranged request, this method will be called by streaming-http-token-reader | ||
* @param objRequest | ||
* @param range | ||
*/ | ||
getRangedRequest(objRequest: S3.Types.GetObjectRequest, range: number[]): Request<S3.Types.GetObjectOutput, AWSError>; | ||
/** | ||
* Retrieve metadata from Amazon S3 object | ||
* @param objRequest S3 object request | ||
* @param options music-metadata options | ||
*/ | ||
parseS3Object(objRequest: S3.Types.GetObjectRequest, options?: IS3Options): Promise<IAudioMetadata>; | ||
} | ||
/** | ||
* Retrieve metadata from Amazon S3 object | ||
* @param objRequest S3 object request | ||
* @param options music-metadata options | ||
* @return Metadata | ||
*/ | ||
export declare function parseS3Object(s3: S3, objRequest: S3.Types.GetObjectRequest, options?: IMMS3Options): Promise<IAudioMetadata>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const core_1 = require("music-metadata/lib/core"); | ||
const range_1 = require("@tokenizer/range"); | ||
const s3_1 = require("@tokenizer/s3"); | ||
const mm = require("music-metadata/lib/core"); | ||
/** | ||
* Use S3-client to execute actual HTTP-requests. | ||
* Retrieve metadata from Amazon S3 object | ||
* @param objRequest S3 object request | ||
* @param options music-metadata options | ||
* @return Metadata | ||
*/ | ||
class S3Request { | ||
constructor(s3client, objRequest) { | ||
this.s3client = s3client; | ||
this.objRequest = objRequest; | ||
} | ||
async getResponse(method, range) { | ||
return this.s3client.getRangedRequest(this.objRequest, range).promise().then(data => { | ||
return { | ||
contentLength: data.ContentLength, | ||
contentType: data.ContentType, | ||
contentRange: range_1.parseContentRange(data.ContentRange), | ||
arrayBuffer: async () => { | ||
return data.Body; | ||
} | ||
}; | ||
}); | ||
} | ||
async function parseS3Object(s3, objRequest, options) { | ||
const s3Tokenizer = await s3_1.makeTokenizer(s3, objRequest, options); | ||
return mm.parseFromTokenizer(s3Tokenizer, options); | ||
} | ||
class MMS3Client { | ||
constructor(s3) { | ||
this.s3 = s3; | ||
} | ||
/** | ||
* Do a ranged request, this method will be called by streaming-http-token-reader | ||
* @param objRequest | ||
* @param range | ||
*/ | ||
getRangedRequest(objRequest, range) { | ||
const rangedRequest = Object.assign({}, objRequest); // Copy request | ||
rangedRequest.Range = `bytes=${range[0]}-${range[1]}`; | ||
return this.s3.getObject(rangedRequest); | ||
} | ||
/** | ||
* Retrieve metadata from Amazon S3 object | ||
* @param objRequest S3 object request | ||
* @param options music-metadata options | ||
*/ | ||
async parseS3Object(objRequest, options) { | ||
if (options && options.disableChunked) { | ||
const info = await this.getRangedRequest(objRequest, [0, 0]).promise(); | ||
const stream = this.s3 | ||
.getObject(objRequest) | ||
.createReadStream(); | ||
return core_1.parseStream(stream, info.ContentType, options); | ||
} | ||
else { | ||
const s3Request = new S3Request(this, objRequest); | ||
const rangeRequestTokenizer = new range_1.RangeRequestTokenizer(s3Request, { | ||
avoidHeadRequests: true | ||
}); | ||
await rangeRequestTokenizer.init(); | ||
return core_1.parseFromTokenizer(rangeRequestTokenizer, rangeRequestTokenizer.contentType, options); | ||
} | ||
} | ||
} | ||
exports.MMS3Client = MMS3Client; | ||
exports.parseS3Object = parseS3Object; | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@music-metadata/s3", | ||
"version": "0.5.1", | ||
"version": "0.6.0", | ||
"description": "Extension for music-metadata to read metadata from audio files on Amazon S3 storage", | ||
@@ -45,7 +45,7 @@ "main": "lib/index.js", | ||
"dependencies": { | ||
"@tokenizer/range": "^0.1.0", | ||
"music-metadata": "^5.3.1" | ||
"@tokenizer/s3": "^0.1.1", | ||
"music-metadata": "^6.0.1" | ||
}, | ||
"devDependencies": { | ||
"aws-sdk": "^2.528.0", | ||
"aws-sdk": "^2.596.0", | ||
"chai": "^4.2.0", | ||
@@ -55,4 +55,4 @@ "del-cli": "^3.0.0", | ||
"tslint": "^5.20.1", | ||
"typescript": "^3.6.4" | ||
"typescript": "^3.7.4" | ||
} | ||
} |
@@ -7,2 +7,3 @@ [![Build Status](https://travis-ci.org/Borewit/music-metadata-s3.svg?branch=master)](https://travis-ci.org/Borewit/music-metadata-s3) | ||
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/Borewit/music-metadata-s3.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Borewit/music-metadata-s3/context:javascript) | ||
[![DeepScan grade](https://deepscan.io/api/teams/5165/projects/8528/branches/103408/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=5165&pid=8528&bid=103408) | ||
@@ -13,4 +14,5 @@ # @music-metadata/s3 | ||
The magic of this module is, it is able to extract the metadata from your audio files, without downloading and parsing the entire file. | ||
Using [@tokenizer/range](https://github.com/Borewit/tokenizer-range), it partial downloads the files, just accessing the chunks holding the metadata. | ||
This module is integrating [@tokenizer/s3](https://github.com/Borewit/tokenizer-s3), for reading from the S3 cloud, and using [music-metadata](https://github.com/Borewit/music-metadata) to parse the audio file. | ||
## Installation | ||
@@ -25,3 +27,3 @@ ```shell script | ||
```js | ||
const { MMS3Client } = require('@music-metadata/s3'); | ||
const { parseS3Object } = require('@music-metadata/s3'); | ||
const S3 = require('aws-sdk/clients/s3'); | ||
@@ -32,7 +34,6 @@ | ||
const s3 = new S3(); | ||
const mmS3client = new MMS3Client(s3); // Pass S3 client to music-metadata-S3-client | ||
console.log('Parsing...'); | ||
try { | ||
const data = await mmS3client.parseS3Object({ | ||
const data = await parseS3Object(s3, { | ||
Bucket: 'your-bucket', | ||
@@ -51,3 +52,3 @@ Key: 'My audio files/01 - My audio track.flac' | ||
```js | ||
const { MMS3Client } = require('@music-metadata/s3'); | ||
const { parseS3Object } = require('@music-metadata/s3'); | ||
const S3 = require('aws-sdk/clients/s3'); | ||
@@ -58,7 +59,6 @@ | ||
const s3 = new S3(); | ||
const mmS3client = new MMS3Client(s3); // Pass S3 client to music-metadata-S3-client | ||
console.log('Parsing...'); | ||
try { | ||
const data = await mmS3client.parseS3Object({ | ||
const data = await parseS3Object(s3, { | ||
Bucket: 'your-bucket', | ||
@@ -84,1 +84,5 @@ Key: 'My audio files/01 - My audio track.flac' | ||
Other options are inherited from [music-metadata](https://github.com/Borewit/music-metadata#options) | ||
## Dependency graph | ||
![dependency graph](https://i.imgur.com/j9JFnfZ.png) |
82
5966
28
+ Added@tokenizer/s3@^0.1.1
+ Added@tokenizer/range@0.3.3(transitive)
+ Added@tokenizer/s3@0.1.3(transitive)
+ Added@tokenizer/token@0.3.0(transitive)
+ Addedfile-type@14.7.1(transitive)
+ Addedis-typedarray@1.0.0(transitive)
+ Addedmusic-metadata@6.4.0(transitive)
+ Addedpeek-readable@4.1.0(transitive)
+ Addedreadable-web-to-node-stream@2.0.0(transitive)
+ Addedstrtok3@6.3.0(transitive)
+ Addedtypedarray-to-buffer@3.1.5(transitive)
- Removed@tokenizer/range@^0.1.0
- Removed@tokenizer/range@0.1.1(transitive)
- Removedfile-type@12.4.2(transitive)
- Removedmusic-metadata@5.4.3(transitive)
- Removedstrtok3@3.1.74.1.1(transitive)
- Removedthen-read-stream@2.0.83.0.1(transitive)
Updatedmusic-metadata@^6.0.1