diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f5fa79c --- /dev/null +++ b/.gitignore @@ -0,0 +1,78 @@ +my-env.sh + +# Node +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# Dependency directories +node_modules/ +jspm_packages/ + + +# Python +__pycache__/ +*.py[cod] +*$py.class + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9e63aad --- /dev/null +++ b/LICENSE @@ -0,0 +1,11 @@ +Copyright 2020 Dolby Laboratories + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1cc91a8 --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ + +# Dolby.io Media Processing API Samples + +This repository contains a collection of samples for how to make +API calls or create simple media workflows. + +Check the language specific README files for additional instructions. + +* [python/README.md](python/README.md) +* [javascript/README.md](javascript/README.md) +* [cURL/README.md](curl/README.md) + +## API Key + +If you don't have a developer account please visit the website and sign up to +get an API Key. + +https://dolby.io + +## Environment Variables + +Most of these samples expect you to define environment variables so +that you don't have to put your API Key into source code. To make this +easier we've included an example `bash` script to initialize these +variables. This is optional and just provided as a convenience. You can +edit the samples to meet your needs. + +Recommended Workflow + +1. Copy "env.sh" to "my-env.sh" +2. Replace variable with your API Key +3. Execute ". my-env.sh" to initialize these variables into your environment + +If you are not using a `bash` shell you'll need to change this to be correct +for your working environment. + +# Terms and Contributing + +See the [LICENSE](LICENSE) for details on terms of use as well as broader +terms from Dolby.io. If you find any issues please create an issue in the +GitHub repository. If you fork or want to contribute please contact us +at support@dolby.io so that we can get a contributor agreement in place. Please +reference this repository. + diff --git a/curl/README.md b/curl/README.md new file mode 100644 index 0000000..9a5fcc3 --- /dev/null +++ b/curl/README.md @@ -0,0 +1,11 @@ + +# cURL + +cURL is a command line utility for making HTTP calls. + +Useful resources: + +- https://curl.haxx.se/docs/ + +The samples are for BASH when used with Mac OSX, Linux, or Windows PowerShell. You'll need to make some adjustments to quoting rules when using Windows Command Prompt. + diff --git a/curl/api-calls/media_analyze_get.sh b/curl/api-calls/media_analyze_get.sh new file mode 100755 index 0000000..47a048a --- /dev/null +++ b/curl/api-calls/media_analyze_get.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +curl -X GET "https://api.dolby.com/media/analyze?job_id=$DOLBYIO_JOB_ID" \ + --header "x-api-key: $DOLBYIO_API_KEY" diff --git a/curl/api-calls/media_analyze_post.sh b/curl/api-calls/media_analyze_post.sh new file mode 100755 index 0000000..860676b --- /dev/null +++ b/curl/api-calls/media_analyze_post.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +curl -X POST "https://api.dolby.com/media/analyze" \ + --header "x-api-key: $DOLBYIO_API_KEY" \ + --data '{ + "input": "dlb://in/example.mp3" + }' diff --git a/curl/api-calls/media_enhance_get.sh b/curl/api-calls/media_enhance_get.sh new file mode 100755 index 0000000..8f36437 --- /dev/null +++ b/curl/api-calls/media_enhance_get.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +curl -X GET "https://api.dolby.com/media/enhance?job_id=$DOLBYIO_JOB_ID" \ + --header "x-api-key: $DOLBYIO_API_KEY" diff --git a/curl/api-calls/media_enhance_post.sh b/curl/api-calls/media_enhance_post.sh new file mode 100755 index 0000000..67eb969 --- /dev/null +++ b/curl/api-calls/media_enhance_post.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +curl -X POST "https://api.dolby.com/media/analyze" \ + --header "x-api-key: $DOLBYIO_API_KEY" \ + --data '{ + "input": "dlb://in/example.mp3", + "output": "dlb://out/example-enhanced.mp3" + }' diff --git a/env.sh b/env.sh new file mode 100644 index 0000000..23d8511 --- /dev/null +++ b/env.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Environment variables are a convenient way to keep your +# API key secret and out of your code. + +# Instructions: +# 1. Copy this file to "my-env.sh" +# 2. Execute ". my-env.sh" to initialize these into your environment +# 3. Use other samples that will reference these variables + +export DOLBYIO_API_KEY='Dolby-io-api-key-goes-here' + +export INPUT_MEDIA_LOCAL_PATH=plane.mp3 +export OUTPUT_MEDIA_LOCAL_PATH=plane_enhanced.mp3 diff --git a/javascript/README.md b/javascript/README.md new file mode 100644 index 0000000..376461f --- /dev/null +++ b/javascript/README.md @@ -0,0 +1,18 @@ + +# JavaScript + +To run the Python samples you need to install a Node.js environment and install +the libraries referenced in package.json + +You may find these resources helpful: + +* https://docs.npmjs.com/downloading-and-installing-node-js-and-npm + +Run `npm install` to get dependencies installed into your local environment +to use these scripts. + + +## API Calls + +This is a collection of short snippets that demonstrate get and post calls +to each Media Processing API. diff --git a/javascript/api-calls/media_analyze_get.js b/javascript/api-calls/media_analyze_get.js new file mode 100755 index 0000000..f26c094 --- /dev/null +++ b/javascript/api-calls/media_analyze_get.js @@ -0,0 +1,25 @@ +#!/usr/bin/env node + +const axios = require('axios').default; + +const config = { + method: 'get', + url: 'https://api.dolby.com/media/analyze', + headers: { + 'x-api-key': process.env.DOLBYIO_API_KEY, + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + params: { + job_id: process.env.DOLBYIO_JOB_ID + } +}; + +axios(config) + .then(function (response) { + console.log(JSON.stringify(response.data, null, 4)); + }) + .catch(function (error) { + console.log(error); + }); + diff --git a/javascript/api-calls/media_analyze_post.js b/javascript/api-calls/media_analyze_post.js new file mode 100755 index 0000000..63214d5 --- /dev/null +++ b/javascript/api-calls/media_analyze_post.js @@ -0,0 +1,25 @@ +#!/usr/bin/env node + +const axios = require('axios').default; + +const config = { + method: 'post', + url: 'https://api.dolby.com/media/analyze', + headers: { + 'x-api-key': process.env.DOLBYIO_API_KEY, + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + data: { + input: 'dlb://in/example.mp3' + } +}; + +axios(config) + .then(function (response) { + console.log(response.data.job_id); + }) + .catch(function (error) { + console.log(error); + }); + diff --git a/javascript/api-calls/media_enhance_get.js b/javascript/api-calls/media_enhance_get.js new file mode 100755 index 0000000..556a42c --- /dev/null +++ b/javascript/api-calls/media_enhance_get.js @@ -0,0 +1,25 @@ +#!/usr/bin/env node + +const axios = require('axios').default; + +const config = { + method: 'get', + url: 'https://api.dolby.com/media/enhance', + headers: { + 'x-api-key': process.env.DOLBYIO_API_KEY, + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + params: { + job_id: process.env.DOLBYIO_JOB_ID + } +}; + +axios(config) + .then(function (response) { + console.log(JSON.stringify(response.data, null, 4)); + }) + .catch(function (error) { + console.log(error); + }); + diff --git a/javascript/api-calls/media_enhance_post.js b/javascript/api-calls/media_enhance_post.js new file mode 100755 index 0000000..c3bf956 --- /dev/null +++ b/javascript/api-calls/media_enhance_post.js @@ -0,0 +1,26 @@ +#!/usr/bin/env node + +const axios = require('axios').default; + +const config = { + method: 'post', + url: 'https://api.dolby.com/media/enhance', + headers: { + 'x-api-key': process.env.DOLBYIO_API_KEY, + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + data: { + input: 'dlb://in/example.mp3', + output: 'dlb://out/example-enhanced.mp3' + } +}; + +axios(config) + .then(function (response) { + console.log(response.data.job_id); + }) + .catch(function (error) { + console.log(error); + }); + diff --git a/javascript/api-calls/media_input_post.js b/javascript/api-calls/media_input_post.js new file mode 100755 index 0000000..2205c04 --- /dev/null +++ b/javascript/api-calls/media_input_post.js @@ -0,0 +1,42 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const axios = require('axios').default; + +const file_path = process.env.INPUT_MEDIA_LOCAL_PATH; + +const config = { + method: 'post', + url: 'https://api.dolby.com/media/input', + headers: { + 'x-api-key': process.env.DOLBYIO_API_KEY, + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + data: { + url: 'dlb://in/example.mp3' + } +}; + +axios(config) + .then(function (response) { + const upload_config = { + method: 'put', + url: response.data.url, + data: fs.createReadStream(file_path), + headers: { + 'Content-Type': 'application/octet-stream', + 'Content-Length': fs.statSync(file_path).size + } + }; + axios(upload_config) + .then(function () { + console.log("File uploaded") + }) + .catch(function (error) { + console.log(error); + }); + }) + .catch(function (error) { + console.log(error); + }); diff --git a/javascript/api-calls/media_output_get.js b/javascript/api-calls/media_output_get.js new file mode 100755 index 0000000..84ef2d1 --- /dev/null +++ b/javascript/api-calls/media_output_get.js @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const axios = require('axios').default; + +const output_path = process.env.OUTPUT_MEDIA_LOCAL_PATH; + +const config = { + method: 'get', + url: 'https://api.dolby.com/media/output', + headers: { + 'x-api-key': process.env.DOLBYIO_API_KEY, + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + responseType: 'stream', + params: { + url: 'dlb://out/example-enhanced.mp3' + } +}; + +axios(config) + .then(function (response) { + response.data.pipe(fs.createWriteStream(output_path)); + response.data.on('error', function (error) { + console.log(error); + }); + response.data.on('end', function () { + console.log('File downloaded!'); + }); + }) + .catch(function (error) { + console.log(error); + }); diff --git a/javascript/package-lock.json b/javascript/package-lock.json new file mode 100644 index 0000000..b30f1eb --- /dev/null +++ b/javascript/package-lock.json @@ -0,0 +1,587 @@ +{ + "name": "js", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@sindresorhus/is": { + "version": "2.1.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/@sindresorhus/is/-/is-2.1.1.tgz", + "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==" + }, + "@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" + }, + "@types/keyv": { + "version": "3.1.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "13.13.5", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/@types/node/-/node-13.13.5.tgz", + "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==" + }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" + } + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "axios": { + "version": "0.19.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "cacheable-lookup": { + "version": "4.3.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/cacheable-lookup/-/cacheable-lookup-4.3.0.tgz", + "integrity": "sha512-PTUoCeIjj2awloqyVRUL33SjquU1Qv5xuDalYY8WAzd9NnUMUivZnGsOzVsMfg2YuMsWXaXkd/hjnsVoWc/3YA==" + }, + "cacheable-request": { + "version": "7.0.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decompress-response": { + "version": "5.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "requires": { + "mimic-response": "^2.0.0" + }, + "dependencies": { + "mimic-response": { + "version": "2.1.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + } + } + }, + "defer-to-connect": { + "version": "2.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "got": { + "version": "11.1.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/got/-/got-11.1.2.tgz", + "integrity": "sha512-ywWJU8STgxsWaPRC61HgqNYGboJFgkVNNbga+C4xJR67cySTskU8XehWWRMnWCtDmmaYU5SVoMAXP+SuY4pNsA==", + "requires": { + "@sindresorhus/is": "^2.1.1", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^4.3.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", + "get-stream": "^5.1.0", + "http2-wrapper": "^1.0.0-beta.4.5", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http2-wrapper": { + "version": "1.0.0-beta.4.5", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/http2-wrapper/-/http2-wrapper-1.0.0-beta.4.5.tgz", + "integrity": "sha512-hRoAcIg26mAenbhZH4yQKpHzdbjHGM2a8JCtGJUIwFtqP82IeuMcmJwXHD6eFkILxDp0AyvaRMNrnV4aSaq9pg==", + "requires": { + "quick-lru": "^5.0.0", + "resolve-alpn": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keyv": { + "version": "4.0.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/keyv/-/keyv-4.0.1.tgz", + "integrity": "sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw==", + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-cancelable": { + "version": "2.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "quick-lru": { + "version": "5.1.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/quick-lru/-/quick-lru-5.1.0.tgz", + "integrity": "sha512-WjAKQ9ORzvqjLijJXiXWqc3Gcs1ivoxCj6KJmEjoWBE6OtHwuaDLSAUqGHALUiid7A1KqGqsSHZs8prxF5xxAQ==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "resolve-alpn": { + "version": "1.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/resolve-alpn/-/resolve-alpn-1.0.0.tgz", + "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==" + }, + "responselike": { + "version": "2.0.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://stg-gke-eu.voxeet.net/nexus/repository/npm-group/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/javascript/package.json b/javascript/package.json new file mode 100644 index 0000000..248a6a5 --- /dev/null +++ b/javascript/package.json @@ -0,0 +1,16 @@ +{ + "name": "Dolby.io", + "version": "1.0.0", + "description": "", + "main": "", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "support@dolby.io", + "license": "BSD", + "dependencies": { + "axios": "^0.19.2", + "got": "^11.1.2", + "request": "^2.88.2" + } +} diff --git a/python/README.md b/python/README.md new file mode 100644 index 0000000..ee959e5 --- /dev/null +++ b/python/README.md @@ -0,0 +1,38 @@ + +# Python + +To run the Python samples you need to install a Python 3 environment and install the +libraries referenced in requirements.txt. + +You may find these resources helpful: + +* https://docs.python-guide.org/starting/installation/ + +## Workflows + +### media_analyze.py + +This workflow script: + +- uses /media/input to upload a local file +- uses /media/analyze to print results of analyzing media to STDOUT + +It uses just the default parameters so requires modification to +use other settings found in the documentation. + +### media_enhance.py + +This workflow script: + +- uses /media/input to upload a local file +- uses /media/enhance to process your media +- uses /media/output to download the resulting media to local filesystem + +It uses just the default parameters so requires modification to +use other settings found in the documentation. + +## API Calls + +This is a collection of short snippets that demonstrate get and post calls +to each Media Processing API. + diff --git a/python/api-calls/media_analyze_get.py b/python/api-calls/media_analyze_get.py new file mode 100755 index 0000000..1ddd640 --- /dev/null +++ b/python/api-calls/media_analyze_get.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +import os +import requests +from pprint import pprint + +job_id = os.environ["DOLBYIO_JOB_ID"] + +url = "https://api.dolby.com/media/analyze" +headers = { + "x-api-key": os.environ["DOLBYIO_API_KEY"], + "Content-Type": "application/json", + "Accept": "application/json", +} + +params = { + "job_id": job_id, +} + +response = requests.get(url, params=params, headers=headers) +response.raise_for_status() +pprint(response.json()) diff --git a/python/api-calls/media_analyze_post.py b/python/api-calls/media_analyze_post.py new file mode 100755 index 0000000..81724ad --- /dev/null +++ b/python/api-calls/media_analyze_post.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +import os +import requests + +url = "https://api.dolby.com/media/analyze" +headers = { + "x-api-key": os.environ["DOLBYIO_API_KEY"], + "Content-Type": "application/json", + "Accept": "application/json", +} + +body = { + "input": os.environ["DOLBYIO_INPUT"], +} + +response = requests.post(url, json=body, headers=headers) +response.raise_for_status() +print(response.json()["job_id"]) diff --git a/python/api-calls/media_enhance_get.py b/python/api-calls/media_enhance_get.py new file mode 100755 index 0000000..d361b20 --- /dev/null +++ b/python/api-calls/media_enhance_get.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +import os +import requests +from pprint import pprint + +job_id = os.environ["DOLBYIO_JOB_ID"] + +url = "https://api.dolby.com/media/enhance" +headers = { + "x-api-key": os.environ["DOLBYIO_API_KEY"], + "Content-Type": "application/json", + "Accept": "application/json", +} + +params = { + "job_id": job_id, +} + +response = requests.get(url, params=params, headers=headers) +response.raise_for_status() +pprint(response.json()) diff --git a/python/api-calls/media_enhance_post.py b/python/api-calls/media_enhance_post.py new file mode 100755 index 0000000..933e33b --- /dev/null +++ b/python/api-calls/media_enhance_post.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +import os +import requests + +url = "https://api.dolby.com/media/enhance" +headers = { + "x-api-key": os.environ["DOLBYIO_API_KEY"], + "Content-Type": "application/json", + "Accept": "application/json", +} + +body = { + "input": os.environ["DOLBYIO_INPUT"], + "output": "dlb://out/example-enhanced.mp3", +} + +response = requests.post(url, json=body, headers=headers) +response.raise_for_status() +print(response.json()["job_id"]) diff --git a/python/api-calls/media_input_post.py b/python/api-calls/media_input_post.py new file mode 100755 index 0000000..5fd7879 --- /dev/null +++ b/python/api-calls/media_input_post.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import os +import requests + +input_path = os.environ["INPUT_MEDIA_LOCAL_PATH"] + +url = "https://api.dolby.com/media/input" +headers = { + "x-api-key": os.environ["DOLBYIO_API_KEY"], + "Content-Type": "application/json", + "Accept": "application/json", +} + +body = { + "url": "dlb://in/example.mp3", +} + +response = requests.post(url, json=body, headers=headers) +response.raise_for_status() +data = response.json() +presigned_url = data["url"] +print("Uploading {0} to {1}".format(input_path, presigned_url)) +with open(input_path, "rb") as input_file: + requests.put(presigned_url, data=input_file) diff --git a/python/api-calls/media_output_get.py b/python/api-calls/media_output_get.py new file mode 100755 index 0000000..c89f8ae --- /dev/null +++ b/python/api-calls/media_output_get.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import os +import shutil +import requests + +output_path = os.environ["OUTPUT_MEDIA_LOCAL_PATH"] + +url = "https://api.dolby.com/media/output" +headers = { + "x-api-key": os.environ["DOLBYIO_API_KEY"], + "Content-Type": "application/json", + "Accept": "application/json", +} + +args = { + "url": "dlb://out/example-enhanced.mp3", +} + +with requests.get(url, params=args, headers=headers, stream=True) as response: + response.raise_for_status() + response.raw.decode_content = True + print("Downloading from {0} into {1}".format(response.url, output_path)) + with open(output_path, "wb") as output_file: + shutil.copyfileobj(response.raw, output_file) diff --git a/python/requirements.txt b/python/requirements.txt new file mode 100644 index 0000000..acf2800 --- /dev/null +++ b/python/requirements.txt @@ -0,0 +1,4 @@ +# You need the following libraries in order to use these samples. +# You can get them by running: +# pip install -r requirements.txt +requests diff --git a/python/workflows/media_analyze.py b/python/workflows/media_analyze.py new file mode 100755 index 0000000..e1e64f9 --- /dev/null +++ b/python/workflows/media_analyze.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python + +""" + +This sample demonstrates a media workflow implemented as a command line script. Given +a media file passed in on the command line the script will upload it to Dolby.io and +then analyze it to print out useful information. + +# Example Usage + +You will need to have a Python 3 runtime environment along with dependencies mentioned in +requirements.txt installed. You pass the input file as an option to the command. + + $ python media_analyze.py wow_30s.mp3 --key + Uploaded file to location: dlb://in/analyze + Job running with job_id: 6900019a-7523-49bf-b999-9f3213630ad2 + . + . + { + "path": "/media/analyze", + "progress": 100, + "result": { + "audio": { + "bandwidth": 7235, + "clipping": { + "first_event": 0, + "num_events": 0 + }, + ... + } + +If you don't want to provide your `--key` on each run you can also set it to be an environment +variable called `DOLBYIO_API_KEY`. You'll need to use a command appropriate for your computer's +shell environment. For example, in `bash` this would look like: + + $ export DOLBYIO_API_KEY="your-dolby-api-key" + +# Customization + +There are some additional parameters you can use with the APIs to customize how it +operates. Review the API reference and change the `body` dictionary in the code +below. + +For example, you could change it to: + + body = { + 'input': input_url, + 'content': { + 'type': 'podcast' + }, + 'loudness': { + 'profile': 'service_spotify' + } + } + +# Need Help + +Visit https://support.dolby.io and create a ticket. + +""" + +import os +import time +import json +import logging +import argparse +import requests + + +class App: + def __init__(self): + self.parser = argparse.ArgumentParser(description="sample dolby.io app for analyzing media file") + self.parser.add_argument("input_file", help="local file path for an input file") + self.parser.add_argument("--info", help="INFO debugging output", action="store_true") + self.parser.add_argument("--debug", help="DEBUG output", action="store_true") + self.parser.add_argument("--key", help="Dolby.io Media Processingn API Key", default="") + self.parser.add_argument("--wait", help="Seconds to wait in between status checks", default=5) + + self.args = self.parser.parse_args() + + if self.args.info: + logging.basicConfig(level=logging.INFO) + + if self.args.debug: + logging.basicConfig(level=logging.DEBUG) + + self.args.key = self.args.key or os.environ.get("DOLBYIO_API_KEY") + if not self.args.key: + raise ValueError("Use --key or set environment variable DOLBYIO_API_KEY") + + def _get_url(self, path): + return "https://api.dolby.com/" + path + + def _get_headers(self): + return { + "x-api-key": self.args.key, + "Content-Type": "application/json", + "Accept": "application/json", + } + + def post_media_input(self, input_path, name): + url = self._get_url("/media/input") + headers = self._get_headers() + body = { + "url": name, + } + response = requests.post(url, json=body, headers=headers) + response.raise_for_status() + data = response.json() + presigned_url = data["url"] + logging.info("Uploading {0} to {1}".format(input_path, presigned_url)) + with open(input_path, "rb") as input_file: + requests.put(presigned_url, data=input_file) + + def post_media_analyze(self, input_url): + url = self._get_url("/media/analyze") + headers = self._get_headers() + # **CUSTOMIZATION** + # If you want to change the behavior of the analyze process you + # can add parameters found in the API reference to this body. + # https://dolby.io/developers/media-processing/api-reference/analyze + body = {"input": input_url} + + response = requests.post(url, json=body, headers=headers) + response.raise_for_status() + return response.json()["job_id"] + + def get_media_analyze(self, job_id): + url = self._get_url("/media/analyze") + headers = self._get_headers() + params = {"job_id": job_id} + + response = requests.get(url, params=params, headers=headers) + response.raise_for_status() + data = response.json() + if data["status"] not in {"Pending", "Running"}: + return data + # Keep on retrying untill job is complete + logging.debug(data["status"]) + print(".") + time.sleep(self.args.wait) + return self.get_media_analyze(job_id) + + def main(self): + # First we upload the input file to /media/input + dlb_in = "dlb://in/analyze" + print("Uploading file to location: {}".format(dlb_in)) + self.post_media_input(self.args.input_file, dlb_in) + print("Uploaded file to location: {}".format(dlb_in)) + + # Next, we start /media/analyze to begin analysis + job_id = self.post_media_analyze(dlb_in) + print("Job running with job_id: {}".format(job_id)) + + # We need to check for results of the analysis and display results + # to the terminal. + results = self.get_media_analyze(job_id) + print(json.dumps(results, indent=4, sort_keys=True)) + + +if __name__ == "__main__": + App().main() diff --git a/python/workflows/media_enhance.py b/python/workflows/media_enhance.py new file mode 100755 index 0000000..779f11b --- /dev/null +++ b/python/workflows/media_enhance.py @@ -0,0 +1,188 @@ +#!/usr/bin/env python + +""" + +This sample demonstrates a media workflow implemented as a command line script. Given +a media file passed in on the command line the script will upload it to Dolby.io +then enhance it and download the result to disk. + +# Example Usage + +You will need to have a Python 3 runtime environment along with dependencies mentioned in +requirements.txt installed. You pass the input and output file as options to the command. + + $ python media_enhance.py wow_30s.mp3 wow_30s_enhanced.mp3 --key + Uploaded file to location: dlb://in/enhance + Job running with job_id: 36cd9bec-1ab2-4717-b5b7-178ec257e9a6 + . + . + . + . + . + . + Job complete: { + "path": "/media/enhance", + "progress": 100, + "result": {}, + "status": "Success" + } + Downloading file from location: dlb://out/enhance + File created: wow_enhanced.mp3 + +If you don't want to provide your `--key` on each run you can also set it to be an environment +variable called `DOLBYIO_API_KEY`. You'll need to use a command appropriate for your computer's +shell environment. For example, in `bash` this would look like: + + $ export DOLBYIO_API_KEY="your-dolby-api-key" + +# Customization + +There are some additional parameters you can use with the APIs to customize how it +operates. Review the API reference and change the `body` dictionary in the code +below. + +For example, you could change it to: + + body = { + 'input': input_url, + 'output': output_url, + 'content': { + 'type': 'podcast' + }, + 'audio': { + 'noise': { + 'reduction': { + 'amount': 'max' + } + } + } + } + +# Need Help + +Visit https://support.dolby.io and create a ticket. + +""" + +import os +import time +import json +import shutil +import logging +import argparse +import requests + + +class App: + def __init__(self): + self.parser = argparse.ArgumentParser(description="sample dolby.io app for enhancing media file") + self.parser.add_argument("input_file", help="local file path for an input file") + self.parser.add_argument("output_file", help="local file path for writing output file") + self.parser.add_argument("--info", help="INFO debugging output", action="store_true") + self.parser.add_argument("--debug", help="DEBUG output", action="store_true") + self.parser.add_argument("--key", help="Dolby.io Media Processingn API Key", default="") + self.parser.add_argument("--wait", help="Seconds to wait in between status checks", default=6) + + self.args = self.parser.parse_args() + + if self.args.info: + logging.basicConfig(level=logging.INFO) + + if self.args.debug: + logging.basicConfig(level=logging.DEBUG) + + self.args.key = self.args.key or os.environ.get("DOLBYIO_API_KEY") + if not self.args.key: + raise ValueError("Use --key or set environment variable DOLBYIO_API_KEY") + + def _get_url(self, path): + return "https://api.dolby.com/" + path + + def _get_headers(self): + return { + "x-api-key": self.args.key, + "Content-Type": "application/json", + "Accept": "application/json", + } + + def post_media_input(self, input_path, name): + url = self._get_url("/media/input") + headers = self._get_headers() + body = { + "url": name, + } + response = requests.post(url, json=body, headers=headers) + response.raise_for_status() + data = response.json() + presigned_url = data["url"] + logging.info("Uploading {0} to {1}".format(input_path, presigned_url)) + with open(input_path, "rb") as input_file: + requests.put(presigned_url, data=input_file) + + def post_media_enhance(self, input_url, output_url): + url = self._get_url("/media/enhance") + headers = self._get_headers() + # Customization + # + # If you want to change the behavior of the enhance process you + # can add parameters found in the API reference to this body. + # https://dolby.io/developers/media-processing/api-reference/enhance + body = {"input": input_url, "output": output_url} + + response = requests.post(url, json=body, headers=headers) + response.raise_for_status() + return response.json()["job_id"] + + def get_media_enhance(self, job_id): + url = self._get_url("/media/enhance") + headers = self._get_headers() + params = {"job_id": job_id} + + response = requests.get(url, params=params, headers=headers) + response.raise_for_status() + data = response.json() + if data["status"] not in {"Pending", "Running"}: + return data + # Keep on retrying untill job is complete + logging.debug(data["status"]) + print(".") + time.sleep(self.args.wait) + return self.get_media_enhance(job_id) + + def get_media_output(self, dlb_out, output_path): + url = self._get_url("/media/output") + headers = self._get_headers() + params = {"url": dlb_out} + + with requests.get(url, params=params, headers=headers, stream=True) as response: + response.raise_for_status() + response.raw.decode_content = True + logging.info("Downloading from {0} into {1}".format(response.url, output_path)) + with open(output_path, "wb") as output_file: + shutil.copyfileobj(response.raw, output_file) + + def main(self): + # First we upload the input file to /media/input + dlb_in = "dlb://in/enhance" + print("Uploading file to location: {}".format(dlb_in)) + self.post_media_input(self.args.input_file, dlb_in) + print("Uploaded file to location: {}".format(dlb_in)) + + # Next, we start /media/enhance to begin enhancing + dlb_out = "dlb://out/enhance" + job_id = self.post_media_enhance(dlb_in, dlb_out) + print("Job running with job_id: {}".format(job_id)) + + # We need to check for results of the enhance process and display results + # to the terminal. + results = self.get_media_enhance(job_id) + print("Job complete: {}".format(json.dumps(results, indent=4, sort_keys=True))) + + # When complete, we can download the result and save it locally + print("Downloading file from location: {}".format(dlb_out)) + self.get_media_output(dlb_out, self.args.output_file) + print("File available: {}".format(self.args.output_file)) + + +if __name__ == "__main__": + App().main()