From 78ee2d322f639511c395856eee140377944f6b66 Mon Sep 17 00:00:00 2001 From: kfaulhaber Date: Mon, 24 Jul 2017 15:03:09 +0200 Subject: [PATCH 01/11] initial commit with version 2.0.0 of vimeo upload by chunks. --- .gitignore | 5 +- .travis.yml | 8 - README.md | 21 +- bower.json | 24 - dist/vimeo-upload.js | 744 ++++++++++++++++++++ dist/vimeo-upload.js.map | 1 + dist/vimeo-upload.min.js | 1 + index.html | 235 +++---- package.json | 30 +- src/app.ts | 159 +++++ src/config/config.ts | 22 + src/entities/chunk.ts | 11 + src/entities/header.ts | 10 + src/entities/media.ts | 14 + src/entities/request.ts | 17 + src/entities/response.ts | 15 + src/entities/ticket.ts | 13 + src/main.ts | 7 + src/routes/routes.ts | 8 + src/services/chunk/chunk.service.ts | 46 ++ src/services/event/event.service.ts | 28 + src/services/http/http.service.ts | 108 +++ src/services/media/media.service.ts | 29 + src/services/ticket/ticket.service.ts | 40 ++ src/services/timer/timer.service.ts | 22 + src/services/upload/upload.service.ts | 31 + src/services/validator/validator.service.ts | 28 + src/utils/utils.ts | 17 + style.css | 120 ++++ tsconfig.json | 11 + upload-cordova.js | 428 ----------- vimeo-upload.js | 448 ------------ webpack.config.js | 30 + 33 files changed, 1659 insertions(+), 1072 deletions(-) delete mode 100644 .travis.yml delete mode 100644 bower.json create mode 100644 dist/vimeo-upload.js create mode 100644 dist/vimeo-upload.js.map create mode 100644 dist/vimeo-upload.min.js create mode 100644 src/app.ts create mode 100644 src/config/config.ts create mode 100644 src/entities/chunk.ts create mode 100644 src/entities/header.ts create mode 100644 src/entities/media.ts create mode 100644 src/entities/request.ts create mode 100644 src/entities/response.ts create mode 100644 src/entities/ticket.ts create mode 100644 src/main.ts create mode 100644 src/routes/routes.ts create mode 100644 src/services/chunk/chunk.service.ts create mode 100644 src/services/event/event.service.ts create mode 100644 src/services/http/http.service.ts create mode 100644 src/services/media/media.service.ts create mode 100644 src/services/ticket/ticket.service.ts create mode 100644 src/services/timer/timer.service.ts create mode 100644 src/services/upload/upload.service.ts create mode 100644 src/services/validator/validator.service.ts create mode 100644 src/utils/utils.ts create mode 100644 style.css create mode 100644 tsconfig.json delete mode 100644 upload-cordova.js delete mode 100644 vimeo-upload.js create mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore index e3b4732..6ec33fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -/dist -/bower_components /node_modules -npm-debug.log +.idea +package-lock.json \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 87a9eb3..0000000 --- a/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -script: npm run deploy -language: node_js -node_js: -- '0.10' -env: - global: - - GH_REF: github.com/websemantics/vimeo-upload.git - - secure: wIZAh8a5s96MT0CsTs0y06ljBH5UpPl3s10NA1QplHafTtSubWpjE51oUQJ+kzrhB/LMVb051C2Eygmhwa1kXgjeH+shQEJmPSnCRo7p5GLnM5EO4U2M6IXu9Yre7BKL07rHXDeMl5ZlHaR52L+uLCCNAlh/XCNgMu0dlKucGGtOG0mqaoZJdcdTpM7tVtZo5jQvN7Ihe4TbscwaYYNUnaqETiQX3OKTWgmGPkrIq26/6o8St1QkQwZd22R2dwhN2hmEUPrvfWjQxk+hUuNQv8K3vhP8mPhFUuQlxo1S5sv4lvT065ekhanDvm8qju5k6yMQivVftoLMVzhzJUqZY/iyb2BHRyFGwqA3Zz5rqE4HmMRhVXITOdAjPtytAMxk9zdYsKX2NSdTacGN65pKvupeIfQV3GC+HlhpXi2ZtyFwpM42NJYUhA9gUJ92RN7hqIpS2jZdTeWTjOuRcjLxC2JNyGSgIY1tJQ9Tie5MFu5UqBoVPXpoL64I8ZKp8yrnLNW0ccqY/bZEmC+kt0Brhs4TwZLA3+Y1IZVBdeKzs2NS4J8uZbgbacDgavr7sFBkGf3XQIbOXC+hcznKY8R2ugTnAQFYi4JDARvYsyK2zh22bIhq/h5nFsmZIAb2Dft+jnZ2bFBxS1UePV9mEc9PhGEtWc/+5NDjRtBNcEA8VFs= diff --git a/README.md b/README.md index 7c6915b..231fc95 100644 --- a/README.md +++ b/README.md @@ -40,12 +40,21 @@ Include `vimeo-upload.js` in your index.html. Create a new `VimeoUpload` initialized with a Blob or File and Vimeo Access Token then call `upload()` to start the upload process. ```javascript -var uploader = new VimeoUpload({ - file: file, - token: accessToken, -}); -uploader.upload(); +var options = { + preferredUploadDuration: 30, + chunkSize: 1024*1024, + token: "TOKEN_STRING_HERE", //Required on start. + supportedFiles: ["mov", "mpeg4", "mp4", "avi", "wmv", "mpegps", "flv", "3gpp", "webm"], + name: "VIDEO_NAME", + description: "VIDEO_DESCRIPTION", + file: null, //Required on start. + upgrade_to_1080: false +} + +var uploader = new VimeoUpload(options); +uploader.start(options); + ``` Your access token need to be authorized by Vimeo. Create new Vimeo access token [here](https://developer.vimeo.com/apps). @@ -54,4 +63,4 @@ Check `index.html` for details and additional parameters you can include when in ## Credits -Sample code for uploading files directly with XHR/CORS: [cors-upload-sample](https://github.com/googledrive/cors-upload-sample) +Sample code for uploading files directly with XHR/CORS: [cors-upload-sample](https://github.com/googledrive/cors-upload-sample) \ No newline at end of file diff --git a/bower.json b/bower.json deleted file mode 100644 index 92bd079..0000000 --- a/bower.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "vimeo-upload", - "main": "vimeo-upload.js", - "version": "0.1.6", - "homepage": "https://github.com/websemantics/vimeo-upload", - "authors": [ - "Adnan Sh. Sagar, PhD. " - ], - "description": "Upload videos to your Vimeo account and update their metadata directly from a browser or a Node.js app.", - "keywords": [ - "vimeo", - "video", - "upload", - "node", - "browser" - ], - "license": "Apache 2.0", - "ignore": [ - "**/.*", - "node_modules", - "test", - "tests" - ] -} diff --git a/dist/vimeo-upload.js b/dist/vimeo-upload.js new file mode 100644 index 0000000..50c09ba --- /dev/null +++ b/dist/vimeo-upload.js @@ -0,0 +1,744 @@ +var VimeoUpload = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __webpack_require__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 10); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Created by kfaulhaber on 13/07/2017. + */ +exports.__esModule = true; +exports.DEFAULT_VALUES = { + preferredUploadDuration: 30, + chunkSize: 1024 * 1024, + token: "TOKEN_STRING_HERE", + supportedFiles: ["mov", "mpeg4", "mp4", "avi", "wmv", "mpegps", "flv", "3gpp", "webm"], + name: "", + description: "", + file: null, + upgrade_to_1080: false +}; +exports.DEFAULT_EVENTS = { + chunkprogresschanged: function (event) { return console.log("Default: Chunk Progress Update: " + event.detail + "/100"); }, + totalprogresschanged: function (event) { return console.log("Default: Total Progress Update: " + event.detail + "/100"); }, + estimatedtimechanged: function (event) { return console.log("Default: Estimated Time Update: " + event.detail); }, + estimateduploadspeedchanged: function (event) { return console.log("Default: Estimated Upload Speed Changed: " + event.detail + " mb/s"); }, + uploadaborted: function (event) { return console.log("Default: Upload aborted detected."); } +}; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var config_1 = __webpack_require__(0); +/** + * Created by kfaulhaber on 17/07/2017. + */ +var EventService = (function () { + function EventService() { + } + EventService.Add = function (eventName, callback) { + window.addEventListener(eventName, callback, false); + }; + EventService.Remove = function (eventName, callback) { + window.removeEventListener(eventName, callback, false); + }; + EventService.Dispatch = function (eventName, data) { + if (data === void 0) { data = null; } + var customEvent = new CustomEvent(eventName, { detail: data }); + window.dispatchEvent(customEvent); + }; + EventService.Exists = function (eventName) { + return config_1.DEFAULT_EVENTS.hasOwnProperty(eventName); + }; + EventService.GetDefault = function (eventName) { + return config_1.DEFAULT_EVENTS[eventName]; + }; + return EventService; +}()); +exports.EventService = EventService; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var request_1 = __webpack_require__(7); +var header_1 = __webpack_require__(5); +var response_1 = __webpack_require__(8); +var event_service_1 = __webpack_require__(1); +/** + * Created by kfaulhaber on 31/03/2017. + */ +var HttpService = (function () { + function HttpService(method, url, data, headers) { + if (data === void 0) { data = null; } + if (headers === void 0) { headers = null; } + this.request = HttpService.CreateRequest(method, url, data, headers); + } + HttpService.prototype.send = function (emitOnProgress) { + if (emitOnProgress === void 0) { emitOnProgress = false; } + return HttpService.Send(this.request, emitOnProgress); + }; + HttpService.CreateRequest = function (method, url, data, headers) { + if (data === void 0) { data = null; } + if (headers === void 0) { headers = null; } + var headerList = []; + for (var prop in headers) { + if (headers.hasOwnProperty(prop)) { + headerList.push(new header_1.Header(prop, headers[prop])); + } + } + return new request_1.Request(method, url, data, headerList); + }; + HttpService.Send = function (request, emitOnProgress) { + if (emitOnProgress === void 0) { emitOnProgress = false; } + return new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open(request.method, request.url, true); + request.headers.forEach(function (header) { return xhr.setRequestHeader(header.title, header.value); }); + window.addEventListener("uploadaborted", function () { + xhr.abort(); + }, false); + xhr.onload = function () { + var end = new Date(); + var data = null; + try { + data = JSON.parse(xhr.response); + } + catch (e) { + console.warn("Unable to parse xhr return response."); + data = xhr.response; + } + var response = new response_1.Response(xhr.status, xhr.statusText, data); + var date = new Date(null); + response.duration = end.getTime() - request.startTime; + switch (true) { + case xhr.status >= 200 && xhr.status < 300: + resolve(response); + break; + case xhr.status === 308: + response.range = xhr.getResponseHeader("Range"); + resolve(response); + break; + default: + reject(response); + } + }; + xhr.onerror = function () { + reject(new response_1.Response(xhr.status, xhr.statusText, xhr.response || null)); + }; + if (emitOnProgress) { + xhr.upload.addEventListener("progress", function (data) { + if (data.lengthComputable) { + var percent = Math.floor(data.loaded / data.total * 100); + event_service_1.EventService.Dispatch("chunkprogresschanged", percent); + } + }); + } + request.startTime = new Date().getTime(); + try { + xhr.send(request.data); + } + catch (e) { + console.error("An error occured while sending.", e); + } + }); + }; + return HttpService; +}()); +exports.HttpService = HttpService; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var ticket_service_1 = __webpack_require__(14); +var chunk_service_1 = __webpack_require__(12); +var upload_service_1 = __webpack_require__(15); +var config_1 = __webpack_require__(0); +var event_service_1 = __webpack_require__(1); +var utils_1 = __webpack_require__(17); +var validator_service_1 = __webpack_require__(16); +var media_service_1 = __webpack_require__(13); +/** + * Created by Grimbode on 12/07/2017. + */ +var App = (function () { + function App(options) { + if (options === void 0) { options = {}; } + for (var prop in options) { + if (!options.hasOwnProperty(prop)) { + continue; + } + switch (true) { + case config_1.DEFAULT_VALUES.hasOwnProperty(prop): + config_1.DEFAULT_VALUES[prop] = options[prop]; + break; + default: + console.warn("Unrecognized property: " + prop); + } + } + this.ticketService = new ticket_service_1.TicketService(config_1.DEFAULT_VALUES.token); + this.mediaService = new media_service_1.MediaService(config_1.DEFAULT_VALUES); + this.chunkService = new chunk_service_1.ChunkService(this.mediaService, config_1.DEFAULT_VALUES.preferredUploadDuration, config_1.DEFAULT_VALUES.chunkSize); + this.uploadService = new upload_service_1.UploadService(this.mediaService, this.ticketService); + this.validatorService = new validator_service_1.ValidatorService(config_1.DEFAULT_VALUES.supportedFiles); + } + App.prototype.start = function (options) { + var _this = this; + if (options === void 0) { options = {}; } + this.mediaService.setData(options); + if (options.token) { + this.ticketService.token = config_1.DEFAULT_VALUES.token = options.token; + } + //TODO: Add error if not supported. + if (!this.validatorService.isSupported(this.mediaService.media.file)) + return; + this.ticketService.open() + .then(function (response) { + console.log(response); + _this.ticketService.save(response); + _this.process(); + })["catch"](function (error) { + console.log("Error occured while generating ticket. " + error); + }); + }; + App.prototype.process = function () { + var _this = this; + console.log("Processing"); + var chunk = this.chunkService.create(); + console.log(chunk.content, chunk.contentRange); + this.uploadService.send(chunk).then(function (response) { + //TODO: Calculate the correct time. + event_service_1.EventService.Dispatch("estimatedtimechanged", response.duration); + event_service_1.EventService.Dispatch("estimateduploadspeedchanged", _this.chunkService.size / response.duration); + var seconds = utils_1.TimeUtil.TimeToSeconds(response.duration); + _this.chunkService.updateSize(seconds); + _this.check(); + })["catch"](function (error) { + console.error("Error sending chunk", error); + }); + }; + App.prototype.check = function () { + var _this = this; + this.uploadService.getRange().then(function (response) { + switch (response.status) { + case 308: + console.log("New range " + response.range); + _this.chunkService.updateOffset(response.range); + event_service_1.EventService.Dispatch("totalprogresschanged", _this.chunkService.getPercent()); + if (_this.chunkService.isDone()) { + _this.done(); + return; + } + _this.process(); + break; + case 200 || 201: + _this.ticketService.close().then(function (response) { + console.log(response); + })["catch"](function (error) { + console.log(error); + }); + break; + default: + console.warn("Unrecognized status code (" + response.status + ") for chunk range."); + } + })["catch"](function (error) { + console.error("Error getting chunk range", error); + }); + }; + //TODO: find a way to reset + App.prototype.done = function () { + this.ticketService.close().then(function (response) { + console.log("Delete success:", response); + })["catch"](function (error) { + console.warn("Delete failed:", error); + }); + }; + App.prototype.abort = function () { + event_service_1.EventService.Dispatch("uploadaborted"); + this.done(); + }; + App.On = function (eventName, callback) { + if (callback === void 0) { callback = null; } + if (!event_service_1.EventService.Exists(eventName)) + return; + if (callback === null) { + callback = event_service_1.EventService.GetDefault(eventName); + } + event_service_1.EventService.Add(eventName, callback); + }; + App.Off = function (eventName, callback) { + if (callback === void 0) { callback = null; } + if (!event_service_1.EventService.Exists(eventName)) + return; + if (callback === null) { + callback = event_service_1.EventService.GetDefault(eventName); + } + event_service_1.EventService.Remove(eventName, callback); + }; + return App; +}()); +exports.App = App; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Created by kfaulhaber on 13/07/2017. + */ +exports.__esModule = true; +var Chunk = (function () { + function Chunk(content, contentRange) { + this.content = content; + this.contentRange = contentRange; + } + return Chunk; +}()); +exports.Chunk = Chunk; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Created by kfaulhaber on 24/07/2017. + */ +exports.__esModule = true; +var Header = (function () { + function Header(title, value) { + this.title = title; + this.value = value; + } + return Header; +}()); +exports.Header = Header; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Created by kfaulhaber on 20/07/2017. + */ +exports.__esModule = true; +var Media = (function () { + //TODO: Check to see if these default values are acceptable + function Media(name, description, file, upgrade_to_1080) { + if (name === void 0) { name = ""; } + if (description === void 0) { description = ""; } + if (file === void 0) { file = null; } + if (upgrade_to_1080 === void 0) { upgrade_to_1080 = false; } + this.name = name; + this.description = description; + this.file = file; + this.upgrade_to_1080 = upgrade_to_1080; + } + return Media; +}()); +exports.Media = Media; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +/** + * Created by kfaulhaber on 17/07/2017. + */ +var Request = (function () { + function Request(method, url, data, headers) { + if (data === void 0) { data = null; } + if (headers === void 0) { headers = []; } + this.method = method; + this.url = url; + this.data = data; + this.headers = headers; + this.startTime = -1; + } + return Request; +}()); +exports.Request = Request; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Created by kfaulhaber on 20/07/2017. + */ +exports.__esModule = true; +var Response = (function () { + function Response(status, statusText, data, duration) { + if (data === void 0) { data = null; } + if (duration === void 0) { duration = null; } + this.status = status; + this.statusText = statusText; + this.data = data; + this.duration = duration; + this.range = null; + } + return Response; +}()); +exports.Response = Response; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Created by kfaulhaber on 13/07/2017. + */ +exports.__esModule = true; +var Ticket = (function () { + function Ticket(uploadLinkSecure, ticketId, uploadLink, completeUri, user) { + this.uploadLinkSecure = uploadLinkSecure; + this.ticketId = ticketId; + this.uploadLink = uploadLink; + this.completeUri = completeUri; + this.user = user; + } + return Ticket; +}()); +exports.Ticket = Ticket; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var app_1 = __webpack_require__(3); +var module; +/** + * Created by kfaulhaber on 30/06/2017. + */ +module.exports = app_1.App; + + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Created by Grimbode on 30/06/2017. + */ +exports.__esModule = true; +exports.VIMEO_ROUTES = { + DEFAULT: function (uri) { + if (uri === void 0) { uri = ""; } + return "https://api.vimeo.com" + uri; + }, + TICKET: function () { return exports.VIMEO_ROUTES.DEFAULT() + "/me/videos"; } +}; + + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var chunk_1 = __webpack_require__(4); +/** + * Created by kfaulhaber on 30/06/2017. + */ +var ChunkService = (function () { + function ChunkService(mediaService, preferredUploadDuration, size, offset) { + if (offset === void 0) { offset = 0; } + this.mediaService = mediaService; + this.preferredUploadDuration = preferredUploadDuration; + this.size = size; + this.offset = offset; + } + ChunkService.prototype.updateSize = function (uploadDuration) { + console.log(this.size, uploadDuration, this.preferredUploadDuration); + this.size = Math.floor((this.size * this.preferredUploadDuration) / uploadDuration); + }; + ChunkService.prototype.create = function () { + var end = Math.min(this.offset + this.size, this.mediaService.media.file.size); + var content = this.mediaService.media.file.slice(this.offset, end); + return new chunk_1.Chunk(content, "bytes " + this.offset + "-" + end + "/" + this.mediaService.media.file.size); + }; + ChunkService.prototype.updateOffset = function (range) { + this.offset = parseInt(range.match(/\d+/g).pop(), 10) + 1; + }; + ChunkService.prototype.getPercent = function () { + return Math.floor(this.offset / this.mediaService.media.file.size * 100); + }; + ChunkService.prototype.isDone = function () { + return this.offset >= this.mediaService.media.file.size; + }; + return ChunkService; +}()); +exports.ChunkService = ChunkService; + + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var media_1 = __webpack_require__(6); +/** + * Created by kfaulhaber on 21/07/2017. + */ +var MediaService = (function () { + function MediaService(options) { + this.options = options; + this.media = new media_1.Media(); + this.setData(options); + } + MediaService.prototype.setData = function (options) { + for (var prop in options) { + if (options.hasOwnProperty(prop) && this.media.hasOwnProperty(prop)) { + this.media[prop] = options[prop]; + } + } + if (this.media.file !== null && this.media.name === "") { + this.media.name = this.media.file.name; + } + }; + return MediaService; +}()); +exports.MediaService = MediaService; + + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var http_service_1 = __webpack_require__(2); +var ticket_1 = __webpack_require__(9); +var routes_1 = __webpack_require__(11); +/** + * Created by kfaulhaber on 30/06/2017. + */ +var TicketService = (function () { + function TicketService(token) { + this.token = token; + } + TicketService.prototype.open = function () { + return new http_service_1.HttpService("POST", routes_1.VIMEO_ROUTES.TICKET(), JSON.stringify({ type: 'streaming' }), { + Authorization: "Bearer " + this.token, + 'Content-Type': 'application/json' + }).send(); + }; + TicketService.prototype.save = function (response) { + this.ticket = new ticket_1.Ticket(response.data.upload_link_secure, response.data.ticket_id, response.data.upload_link, response.data.complete_uri, response.data.user); + }; + TicketService.prototype.close = function () { + return new http_service_1.HttpService("DELETE", routes_1.VIMEO_ROUTES.DEFAULT(this.ticket.completeUri), null, { + Authorization: "Bearer " + this.token + }).send(); + }; + return TicketService; +}()); +exports.TicketService = TicketService; + + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var http_service_1 = __webpack_require__(2); +/** + * Created by kfaulhaber on 30/06/2017. + */ +var UploadService = (function () { + function UploadService(mediaService, ticketService) { + this.mediaService = mediaService; + this.ticketService = ticketService; + } + UploadService.prototype.send = function (chunk) { + console.log(chunk.content, chunk.contentRange); + return new http_service_1.HttpService("PUT", this.ticketService.ticket.uploadLinkSecure, chunk.content, { + 'Content-Type': this.mediaService.media.file.type, + 'Content-Range': chunk.contentRange + }).send(true); + }; + UploadService.prototype.getRange = function () { + return new http_service_1.HttpService("PUT", this.ticketService.ticket.uploadLinkSecure, null, { + 'Content-Type': this.mediaService.media.file.type, + 'Content-Range': 'bytes */* ' + }).send(); + }; + return UploadService; +}()); +exports.UploadService = UploadService; + + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Created by kfaulhaber on 30/06/2017. + */ +exports.__esModule = true; +var ValidatorService = (function () { + function ValidatorService(supportedFiles) { + this.supportedFiles = supportedFiles; + } + ValidatorService.prototype.isSupported = function (file) { + var type = file.type; + if (type.indexOf('/') === -1) { + console.warn("Wrong type found (" + type + ")."); + return false; + } + var split = type.split('/'); + if (split[0] !== "video") { + console.warn("Only videos are supported, " + type + " given."); + return false; + } + return this.supportedFiles.includes(split[1]); + }; + return ValidatorService; +}()); +exports.ValidatorService = ValidatorService; + + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Created by kfaulhaber on 17/07/2017. + */ +exports.__esModule = true; +var TimeUtil = (function () { + function TimeUtil() { + } + TimeUtil.TimeToSeconds = function (time) { + return time / 1000; + }; + TimeUtil.TimeToString = function (time) { + var date = new Date(null); + date.setTime(time); + return date.toISOString().substr(11, 8); + }; + return TimeUtil; +}()); +exports.TimeUtil = TimeUtil; + + +/***/ }) +/******/ ]); +//# sourceMappingURL=vimeo-upload.js.map \ No newline at end of file diff --git a/dist/vimeo-upload.js.map b/dist/vimeo-upload.js.map new file mode 100644 index 0000000..588b0c1 --- /dev/null +++ b/dist/vimeo-upload.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap 8e58dda0338cf0606dd5","webpack:///./src/config/config.ts","webpack:///./src/services/event/event.service.ts","webpack:///./src/services/http/http.service.ts","webpack:///./src/app.ts","webpack:///./src/entities/chunk.ts","webpack:///./src/entities/header.ts","webpack:///./src/entities/media.ts","webpack:///./src/entities/request.ts","webpack:///./src/entities/response.ts","webpack:///./src/entities/ticket.ts","webpack:///./src/main.ts","webpack:///./src/routes/routes.ts","webpack:///./src/services/chunk/chunk.service.ts","webpack:///./src/services/media/media.service.ts","webpack:///./src/services/ticket/ticket.service.ts","webpack:///./src/services/upload/upload.service.ts","webpack:///./src/services/validator/validator.service.ts","webpack:///./src/utils/utils.ts"],"names":[],"mappings":"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","file":"vimeo-upload.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 10);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 8e58dda0338cf0606dd5","/**\n * Created by kfaulhaber on 13/07/2017.\n */\n\nexport const DEFAULT_VALUES = {\n preferredUploadDuration: 30,\n chunkSize: 1024*1024,\n token: \"TOKEN_STRING_HERE\",\n supportedFiles: [\"mov\", \"mpeg4\", \"mp4\", \"avi\", \"wmv\", \"mpegps\", \"flv\", \"3gpp\", \"webm\"],\n name: \"\",\n description: \"\",\n file: null,\n upgrade_to_1080: false\n};\n\nexport const DEFAULT_EVENTS = {\n chunkprogresschanged: (event: CustomEvent)=>console.log(`Default: Chunk Progress Update: ${event.detail}/100`),\n totalprogresschanged: (event: CustomEvent)=>console.log(`Default: Total Progress Update: ${event.detail}/100`),\n estimatedtimechanged: (event: CustomEvent)=>console.log(`Default: Estimated Time Update: ${event.detail}`),\n estimateduploadspeedchanged: (event: CustomEvent)=>console.log(`Default: Estimated Upload Speed Changed: ${event.detail} mb/s`),\n uploadaborted: (event: CustomEvent)=>console.log(`Default: Upload aborted detected.`)\n};\n\n\n// WEBPACK FOOTER //\n// ./src/config/config.ts","import {DEFAULT_EVENTS} from \"../../config/config\";\n/**\n * Created by kfaulhaber on 17/07/2017.\n */\n\nexport class EventService {\n\n public static Add(eventName: string, callback: any){\n window.addEventListener(eventName, callback, false);\n }\n\n public static Remove(eventName: string, callback: any){\n window.removeEventListener(eventName, callback, false);\n }\n\n public static Dispatch(eventName: string, data: any = null){\n let customEvent = new CustomEvent(eventName, {detail: data});\n window.dispatchEvent(customEvent);\n }\n\n public static Exists(eventName: string): boolean{\n return DEFAULT_EVENTS.hasOwnProperty(eventName);\n }\n\n public static GetDefault(eventName: string): any {\n return DEFAULT_EVENTS[eventName];\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/services/event/event.service.ts","import {Request} from \"../../entities/request\";\nimport {Header} from \"../../entities/header\";\nimport {Response} from \"../../entities/response\";\nimport {EventService} from \"../event/event.service\";\n/**\n * Created by kfaulhaber on 31/03/2017.\n */\n\nexport class HttpService {\n\n public request: Request;\n\n constructor(\n method: string,\n url: string,\n data: any = null,\n headers: any = null\n ){\n this.request = HttpService.CreateRequest(method, url, data, headers);\n }\n\n public send(emitOnProgress: boolean = false): Promise{\n return HttpService.Send(this.request, emitOnProgress);\n }\n\n static CreateRequest(\n method: string,\n url: string,\n data: any = null,\n headers: any = null\n ): Request {\n\n let headerList: Header[] = [];\n for(let prop in headers){\n if(headers.hasOwnProperty(prop)){\n headerList.push(new Header(prop, headers[prop]));\n }\n }\n\n return new Request(method, url, data, headerList)\n }\n\n public static Send(\n request: Request,\n emitOnProgress: boolean = false\n ): Promise{\n return new Promise((resolve: any, reject: any) => {\n let xhr = new XMLHttpRequest();\n\n xhr.open(request.method, request.url, true);\n request.headers.forEach((header: Header)=> xhr.setRequestHeader(header.title, header.value));\n\n window.addEventListener(\"uploadaborted\", ()=>{\n xhr.abort();\n }, false);\n\n xhr.onload = () => {\n let end: Date = new Date();\n\n let data = null;\n\n try{\n data = JSON.parse(xhr.response);\n }catch(e){\n console.warn(\"Unable to parse xhr return response.\");\n data = xhr.response;\n }\n\n let response = new Response(\n xhr.status,\n xhr.statusText,\n data\n );\n let date = new Date(null);\n response.duration = end.getTime() - request.startTime;\n\n switch(true){\n case xhr.status >= 200 && xhr.status < 300:\n resolve(response);\n break;\n case xhr.status === 308:\n response.range = xhr.getResponseHeader(\"Range\");\n resolve(response);\n break;\n default:\n reject(response);\n }\n };\n\n xhr.onerror = () => {\n reject(new Response(xhr.status, xhr.statusText, xhr.response || null));\n };\n\n if(emitOnProgress){\n xhr.upload.addEventListener(\"progress\", (data: ProgressEvent) => {\n if(data.lengthComputable){\n let percent = Math.floor(data.loaded/data.total * 100);\n EventService.Dispatch(\"chunkprogresschanged\", percent);\n }\n })\n }\n\n request.startTime = new Date().getTime();\n try {\n xhr.send(request.data );\n } catch(e){\n console.error(\"An error occured while sending.\", e);\n }\n\n });\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/services/http/http.service.ts","import {TicketService} from \"./services/ticket/ticket.service\";\nimport {ChunkService} from \"./services/chunk/chunk.service\";\nimport {UploadService} from \"./services/upload/upload.service\";\nimport {DEFAULT_VALUES} from \"./config/config\";\nimport {EventService} from \"./services/event/event.service\";\nimport {TimeUtil} from \"./utils/utils\";\nimport {ValidatorService} from \"./services/validator/validator.service\";\nimport {MediaService} from \"./services/media/media.service\";\nimport {Response} from \"./entities/response\";\n/**\n * Created by Grimbode on 12/07/2017.\n */\n\nexport class App {\n \n public ticketService: TicketService;\n public chunkService: ChunkService;\n public uploadService: UploadService;\n public validatorService: ValidatorService;\n public mediaService: MediaService;\n\n constructor(options: any = {}){\n\n for(let prop in options){\n if(!options.hasOwnProperty(prop)){\n continue;\n }\n switch(true){\n case DEFAULT_VALUES.hasOwnProperty(prop):\n DEFAULT_VALUES[prop] = options[prop];\n break;\n default:\n console.warn(`Unrecognized property: ${prop}`);\n }\n }\n \n this.ticketService = new TicketService(\n DEFAULT_VALUES.token\n );\n\n this.mediaService = new MediaService(\n DEFAULT_VALUES\n );\n\n this.chunkService = new ChunkService(\n this.mediaService,\n DEFAULT_VALUES.preferredUploadDuration,\n DEFAULT_VALUES.chunkSize\n );\n\n this.uploadService = new UploadService(\n this.mediaService,\n this.ticketService\n );\n\n this.validatorService = new ValidatorService(\n DEFAULT_VALUES.supportedFiles\n );\n \n\n }\n \n public start(options: any = {}){\n this.mediaService.setData(options);\n\n if(options.token){\n this.ticketService.token = DEFAULT_VALUES.token = options.token;\n }\n\n //TODO: Add error if not supported.\n\n if(!this.validatorService.isSupported(this.mediaService.media.file)) return;\n this.ticketService.open()\n .then((response: Response)=>{\n console.log(response);\n\n this.ticketService.save(response);\n this.process();\n }).catch((error)=>{\n console.log(`Error occured while generating ticket. ${error}`);\n });\n }\n\n private process(){\n console.log(\"Processing\");\n let chunk = this.chunkService.create();\n console.log(chunk.content, chunk.contentRange);\n this.uploadService.send(chunk).then((response: Response) => {\n //TODO: Calculate the correct time.\n EventService.Dispatch(\"estimatedtimechanged\", response.duration);\n EventService.Dispatch(\"estimateduploadspeedchanged\", this.chunkService.size/response.duration);\n let seconds = TimeUtil.TimeToSeconds(response.duration);\n this.chunkService.updateSize(seconds);\n this.check();\n }).catch(error=>{\n console.error(`Error sending chunk`, error);\n });\n }\n\n private check(){\n this.uploadService.getRange().then((response: Response) => {\n switch(response.status){\n case 308:\n console.log(`New range ${response.range}`);\n this.chunkService.updateOffset(response.range);\n EventService.Dispatch(\"totalprogresschanged\", this.chunkService.getPercent());\n\n if(this.chunkService.isDone()){\n this.done();\n return;\n }\n\n this.process();\n break;\n case 200 || 201:\n this.ticketService.close().then((response:any)=>{\n console.log(response);\n }).catch(error=>{\n console.log(error);\n });\n break;\n default:\n console.warn(`Unrecognized status code (${response.status}) for chunk range.`)\n }\n }).catch(error=>{\n console.error(`Error getting chunk range`, error);\n })\n }\n\n //TODO: find a way to reset\n public done(){\n this.ticketService.close().then((response: Response)=>{\n console.log(`Delete success:`, response);\n }).catch((error)=>{\n console.warn(`Delete failed:`, error);\n });\n }\n\n public abort(){\n EventService.Dispatch(\"uploadaborted\");\n this.done();\n }\n public static On(eventName: string, callback: any = null){\n if(!EventService.Exists(eventName)) return;\n if(callback === null){\n callback = EventService.GetDefault(eventName);\n }\n EventService.Add(eventName, callback);\n }\n \n public static Off(eventName: string, callback: any = null){\n if(!EventService.Exists(eventName)) return;\n if(callback === null){\n callback = EventService.GetDefault(eventName);\n }\n EventService.Remove(eventName, callback)\n }\n \n}\n\n\n// WEBPACK FOOTER //\n// ./src/app.ts","/**\n * Created by kfaulhaber on 13/07/2017.\n */\n\n\nexport class Chunk {\n constructor(\n public content: Blob,\n public contentRange: string\n ){}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/entities/chunk.ts","/**\n * Created by kfaulhaber on 24/07/2017.\n */\n\nexport class Header {\n constructor(\n public title: string,\n public value: string\n ){}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/entities/header.ts","/**\n * Created by kfaulhaber on 20/07/2017.\n */\n\nexport class Media {\n\n //TODO: Check to see if these default values are acceptable\n constructor(\n public name: string = \"\",\n public description: string = \"\",\n public file: File = null,\n public upgrade_to_1080: boolean = false\n ){}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/entities/media.ts","import {Header} from \"./header\";\n/**\n * Created by kfaulhaber on 17/07/2017.\n */\n\n\nexport class Request {\n\n public startTime: number = -1;\n\n constructor(\n public method: string,\n public url: string,\n public data: any = null,\n public headers: Header[] = []\n ){}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/entities/request.ts","/**\n * Created by kfaulhaber on 20/07/2017.\n */\n\nexport class Response {\n\n public range: string = null;\n\n constructor(\n public status: number,\n public statusText: string,\n public data: any = null,\n public duration: number = null\n ){}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/entities/response.ts","/**\n * Created by kfaulhaber on 13/07/2017.\n */\n\nexport class Ticket {\n constructor(\n public uploadLinkSecure: string,\n public ticketId: string,\n public uploadLink: string,\n public completeUri: string,\n public user: any\n ){}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/entities/ticket.ts","import {App} from \"./app\";\nvar module;\n/**\n * Created by kfaulhaber on 30/06/2017.\n */\n\nmodule.exports = App;\n\n\n// WEBPACK FOOTER //\n// ./src/main.ts","/**\n * Created by Grimbode on 30/06/2017.\n */\n\nexport const VIMEO_ROUTES = {\n DEFAULT: (uri:string = \"\")=>`https://api.vimeo.com${uri}`,\n TICKET: ()=>`${VIMEO_ROUTES.DEFAULT()}/me/videos`,\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/routes/routes.ts","import {Chunk} from \"../../entities/chunk\";\nimport {MediaService} from \"../media/media.service\";\n/**\n * Created by kfaulhaber on 30/06/2017.\n */\n\nexport class ChunkService {\n\n\n\n constructor(\n public mediaService: MediaService,\n public preferredUploadDuration:number,\n public size:number,\n public offset: number = 0\n ){}\n \n public updateSize(uploadDuration: number) {\n\n console.log(this.size, uploadDuration, this.preferredUploadDuration);\n\n this.size = Math.floor((this.size*this.preferredUploadDuration)/uploadDuration);\n }\n \n public create(): Chunk{\n let end = Math.min(this.offset + this.size, this.mediaService.media.file.size);\n let content = this.mediaService.media.file.slice(this.offset, end);\n\n return new Chunk(\n content,\n `bytes ${this.offset}-${end}/${this.mediaService.media.file.size}`\n )\n }\n \n public updateOffset(range: string){\n this.offset = parseInt(range.match(/\\d+/g).pop(), 10) + 1;\n }\n\n public getPercent(): number {\n return Math.floor(this.offset/this.mediaService.media.file.size * 100);\n }\n\n public isDone(): boolean {\n return this.offset >= this.mediaService.media.file.size;\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/services/chunk/chunk.service.ts","import {Media} from \"../../entities/media\";\n/**\n * Created by kfaulhaber on 21/07/2017.\n */\n\nexport class MediaService {\n\n public media: Media;\n\n constructor(\n public options: any\n ){\n this.media = new Media();\n this.setData(options);\n }\n\n public setData(options: any){\n for(let prop in options){\n if(options.hasOwnProperty(prop) && this.media.hasOwnProperty(prop)){\n this.media[prop] = options[prop];\n }\n }\n\n if(this.media.file !== null && this.media.name === \"\"){\n this.media.name = this.media.file.name;\n }\n\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/services/media/media.service.ts","import {HttpService} from \"../http/http.service\";\nimport {Ticket} from \"../../entities/ticket\";\nimport {Response} from \"../../entities/response\";\nimport {VIMEO_ROUTES} from \"../../routes/routes\";\n/**\n * Created by kfaulhaber on 30/06/2017.\n */\n\nexport class TicketService {\n\n public ticket:Ticket;\n\n constructor(\n public token: string\n ){}\n\n public open(): Promise {\n return new HttpService(\"POST\", VIMEO_ROUTES.TICKET(), JSON.stringify({ type: 'streaming' }), {\n Authorization: `Bearer ${this.token}`,\n 'Content-Type': 'application/json'\n }).send();\n }\n\n public save(response: Response){\n this.ticket = new Ticket(\n response.data.upload_link_secure,\n response.data.ticket_id,\n response.data.upload_link,\n response.data.complete_uri,\n response.data.user\n );\n }\n\n public close(): Promise{\n return new HttpService(\"DELETE\", VIMEO_ROUTES.DEFAULT(this.ticket.completeUri), null, {\n Authorization: `Bearer ${this.token}`\n }).send();\n }\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./src/services/ticket/ticket.service.ts","import {Chunk} from \"../../entities/chunk\";\nimport {HttpService} from \"../http/http.service\";\nimport {TicketService} from \"../ticket/ticket.service\";\nimport {MediaService} from \"../media/media.service\";\n/**\n * Created by kfaulhaber on 30/06/2017.\n */\n\n\nexport class UploadService {\n\n constructor(\n public mediaService: MediaService,\n public ticketService: TicketService\n ){}\n\n public send(chunk: Chunk): Promise{\n console.log(chunk.content, chunk.contentRange);\n return new HttpService(\"PUT\", this.ticketService.ticket.uploadLinkSecure, chunk.content, {\n 'Content-Type': this.mediaService.media.file.type,\n 'Content-Range': chunk.contentRange\n }).send(true);\n }\n\n public getRange(): Promise{\n return new HttpService(\"PUT\", this.ticketService.ticket.uploadLinkSecure, null, {\n 'Content-Type': this.mediaService.media.file.type,\n 'Content-Range': 'bytes */* '\n }).send();\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/services/upload/upload.service.ts","/**\n * Created by kfaulhaber on 30/06/2017.\n */\n\nexport class ValidatorService {\n\n constructor(\n public supportedFiles: string[]\n ){}\n\n public isSupported(file: File) {\n let type = file.type;\n\n if(type.indexOf('/') === -1){\n console.warn(`Wrong type found (${type}).`);\n return false;\n }\n\n let split = type.split('/');\n\n if(split[0] !== \"video\"){\n console.warn(`Only videos are supported, ${type} given.`)\n return false;\n }\n\n return this.supportedFiles.includes(split[1]);\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/services/validator/validator.service.ts","/**\n * Created by kfaulhaber on 17/07/2017.\n */\n\n\nexport class TimeUtil {\n\n static TimeToSeconds(time: number): number {\n return time/1000;\n }\n\n static TimeToString(time: number): string {\n let date = new Date(null);\n date.setTime(time);\n return date.toISOString().substr(11, 8);\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/utils/utils.ts"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/vimeo-upload.min.js b/dist/vimeo-upload.min.js new file mode 100644 index 0000000..221f686 --- /dev/null +++ b/dist/vimeo-upload.min.js @@ -0,0 +1 @@ +var VimeoUpload=function(e){function t(i){if(n[i])return n[i].exports;var o=n[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=10)}([function(e,t,n){"use strict";t.__esModule=!0,t.DEFAULT_VALUES={preferredUploadDuration:30,chunkSize:1048576,token:"TOKEN_STRING_HERE",supportedFiles:["mov","mpeg4","mp4","avi","wmv","mpegps","flv","3gpp","webm"],name:"",description:"",file:null,upgrade_to_1080:!1},t.DEFAULT_EVENTS={chunkprogresschanged:function(e){return console.log("Default: Chunk Progress Update: "+e.detail+"/100")},totalprogresschanged:function(e){return console.log("Default: Total Progress Update: "+e.detail+"/100")},estimatedtimechanged:function(e){return console.log("Default: Estimated Time Update: "+e.detail)},estimateduploadspeedchanged:function(e){return console.log("Default: Estimated Upload Speed Changed: "+e.detail+" mb/s")},uploadaborted:function(e){return console.log("Default: Upload aborted detected.")}}},function(e,t,n){"use strict";t.__esModule=!0;var i=n(0),o=function(){function e(){}return e.Add=function(e,t){window.addEventListener(e,t,!1)},e.Remove=function(e,t){window.removeEventListener(e,t,!1)},e.Dispatch=function(e,t){void 0===t&&(t=null);var n=new CustomEvent(e,{detail:t});window.dispatchEvent(n)},e.Exists=function(e){return i.DEFAULT_EVENTS.hasOwnProperty(e)},e.GetDefault=function(e){return i.DEFAULT_EVENTS[e]},e}();t.EventService=o},function(e,t,n){"use strict";t.__esModule=!0;var i=n(7),o=n(5),r=n(8),s=n(1),c=function(){function e(t,n,i,o){void 0===i&&(i=null),void 0===o&&(o=null),this.request=e.CreateRequest(t,n,i,o)}return e.prototype.send=function(t){return void 0===t&&(t=!1),e.Send(this.request,t)},e.CreateRequest=function(e,t,n,r){void 0===n&&(n=null),void 0===r&&(r=null);var s=[];for(var c in r)r.hasOwnProperty(c)&&s.push(new o.Header(c,r[c]));return new i.Request(e,t,n,s)},e.Send=function(e,t){return void 0===t&&(t=!1),new Promise(function(n,i){var o=new XMLHttpRequest;o.open(e.method,e.url,!0),e.headers.forEach(function(e){return o.setRequestHeader(e.title,e.value)}),window.addEventListener("uploadaborted",function(){o.abort()},!1),o.onload=function(){var t=new Date,s=null;try{s=JSON.parse(o.response)}catch(e){console.warn("Unable to parse xhr return response."),s=o.response}var c=new r.Response(o.status,o.statusText,s);new Date(null);switch(c.duration=t.getTime()-e.startTime,!0){case o.status>=200&&o.status<300:n(c);break;case 308===o.status:c.range=o.getResponseHeader("Range"),n(c);break;default:i(c)}},o.onerror=function(){i(new r.Response(o.status,o.statusText,o.response||null))},t&&o.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=Math.floor(e.loaded/e.total*100);s.EventService.Dispatch("chunkprogresschanged",t)}}),e.startTime=(new Date).getTime();try{o.send(e.data)}catch(e){console.error("An error occured while sending.",e)}})},e}();t.HttpService=c},function(e,t,n){"use strict";t.__esModule=!0;var i=n(14),o=n(12),r=n(15),s=n(0),c=n(1),u=n(17),a=n(16),d=n(13),l=function(){function e(e){void 0===e&&(e={});for(var t in e)if(e.hasOwnProperty(t))switch(!0){case s.DEFAULT_VALUES.hasOwnProperty(t):s.DEFAULT_VALUES[t]=e[t];break;default:console.warn("Unrecognized property: "+t)}this.ticketService=new i.TicketService(s.DEFAULT_VALUES.token),this.mediaService=new d.MediaService(s.DEFAULT_VALUES),this.chunkService=new o.ChunkService(this.mediaService,s.DEFAULT_VALUES.preferredUploadDuration,s.DEFAULT_VALUES.chunkSize),this.uploadService=new r.UploadService(this.mediaService,this.ticketService),this.validatorService=new a.ValidatorService(s.DEFAULT_VALUES.supportedFiles)}return e.prototype.start=function(e){var t=this;void 0===e&&(e={}),this.mediaService.setData(e),e.token&&(this.ticketService.token=s.DEFAULT_VALUES.token=e.token),this.validatorService.isSupported(this.mediaService.media.file)&&this.ticketService.open().then(function(e){console.log(e),t.ticketService.save(e),t.process()}).catch(function(e){console.log("Error occured while generating ticket. "+e)})},e.prototype.process=function(){var e=this;console.log("Processing");var t=this.chunkService.create();console.log(t.content,t.contentRange),this.uploadService.send(t).then(function(t){c.EventService.Dispatch("estimatedtimechanged",t.duration),c.EventService.Dispatch("estimateduploadspeedchanged",e.chunkService.size/t.duration);var n=u.TimeUtil.TimeToSeconds(t.duration);e.chunkService.updateSize(n),e.check()}).catch(function(e){console.error("Error sending chunk",e)})},e.prototype.check=function(){var e=this;this.uploadService.getRange().then(function(t){switch(t.status){case 308:if(console.log("New range "+t.range),e.chunkService.updateOffset(t.range),c.EventService.Dispatch("totalprogresschanged",e.chunkService.getPercent()),e.chunkService.isDone())return void e.done();e.process();break;case 200:e.ticketService.close().then(function(e){console.log(e)}).catch(function(e){console.log(e)});break;default:console.warn("Unrecognized status code ("+t.status+") for chunk range.")}}).catch(function(e){console.error("Error getting chunk range",e)})},e.prototype.done=function(){this.ticketService.close().then(function(e){console.log("Delete success:",e)}).catch(function(e){console.warn("Delete failed:",e)})},e.prototype.abort=function(){c.EventService.Dispatch("uploadaborted"),this.done()},e.On=function(e,t){void 0===t&&(t=null),c.EventService.Exists(e)&&(null===t&&(t=c.EventService.GetDefault(e)),c.EventService.Add(e,t))},e.Off=function(e,t){void 0===t&&(t=null),c.EventService.Exists(e)&&(null===t&&(t=c.EventService.GetDefault(e)),c.EventService.Remove(e,t))},e}();t.App=l},function(e,t,n){"use strict";t.__esModule=!0;var i=function(){function e(e,t){this.content=e,this.contentRange=t}return e}();t.Chunk=i},function(e,t,n){"use strict";t.__esModule=!0;var i=function(){function e(e,t){this.title=e,this.value=t}return e}();t.Header=i},function(e,t,n){"use strict";t.__esModule=!0;var i=function(){function e(e,t,n,i){void 0===e&&(e=""),void 0===t&&(t=""),void 0===n&&(n=null),void 0===i&&(i=!1),this.name=e,this.description=t,this.file=n,this.upgrade_to_1080=i}return e}();t.Media=i},function(e,t,n){"use strict";t.__esModule=!0;var i=function(){function e(e,t,n,i){void 0===n&&(n=null),void 0===i&&(i=[]),this.method=e,this.url=t,this.data=n,this.headers=i,this.startTime=-1}return e}();t.Request=i},function(e,t,n){"use strict";t.__esModule=!0;var i=function(){function e(e,t,n,i){void 0===n&&(n=null),void 0===i&&(i=null),this.status=e,this.statusText=t,this.data=n,this.duration=i,this.range=null}return e}();t.Response=i},function(e,t,n){"use strict";t.__esModule=!0;var i=function(){function e(e,t,n,i,o){this.uploadLinkSecure=e,this.ticketId=t,this.uploadLink=n,this.completeUri=i,this.user=o}return e}();t.Ticket=i},function(e,t,n){"use strict";t.__esModule=!0;var e,i=n(3);e.exports=i.App},function(e,t,n){"use strict";t.__esModule=!0,t.VIMEO_ROUTES={DEFAULT:function(e){return void 0===e&&(e=""),"https://api.vimeo.com"+e},TICKET:function(){return t.VIMEO_ROUTES.DEFAULT()+"/me/videos"}}},function(e,t,n){"use strict";t.__esModule=!0;var i=n(4),o=function(){function e(e,t,n,i){void 0===i&&(i=0),this.mediaService=e,this.preferredUploadDuration=t,this.size=n,this.offset=i}return e.prototype.updateSize=function(e){console.log(this.size,e,this.preferredUploadDuration),this.size=Math.floor(this.size*this.preferredUploadDuration/e)},e.prototype.create=function(){var e=Math.min(this.offset+this.size,this.mediaService.media.file.size),t=this.mediaService.media.file.slice(this.offset,e);return new i.Chunk(t,"bytes "+this.offset+"-"+e+"/"+this.mediaService.media.file.size)},e.prototype.updateOffset=function(e){this.offset=parseInt(e.match(/\d+/g).pop(),10)+1},e.prototype.getPercent=function(){return Math.floor(this.offset/this.mediaService.media.file.size*100)},e.prototype.isDone=function(){return this.offset>=this.mediaService.media.file.size},e}();t.ChunkService=o},function(e,t,n){"use strict";t.__esModule=!0;var i=n(6),o=function(){function e(e){this.options=e,this.media=new i.Media,this.setData(e)}return e.prototype.setData=function(e){for(var t in e)e.hasOwnProperty(t)&&this.media.hasOwnProperty(t)&&(this.media[t]=e[t]);null!==this.media.file&&""===this.media.name&&(this.media.name=this.media.file.name)},e}();t.MediaService=o},function(e,t,n){"use strict";t.__esModule=!0;var i=n(2),o=n(9),r=n(11),s=function(){function e(e){this.token=e}return e.prototype.open=function(){return new i.HttpService("POST",r.VIMEO_ROUTES.TICKET(),JSON.stringify({type:"streaming"}),{Authorization:"Bearer "+this.token,"Content-Type":"application/json"}).send()},e.prototype.save=function(e){this.ticket=new o.Ticket(e.data.upload_link_secure,e.data.ticket_id,e.data.upload_link,e.data.complete_uri,e.data.user)},e.prototype.close=function(){return new i.HttpService("DELETE",r.VIMEO_ROUTES.DEFAULT(this.ticket.completeUri),null,{Authorization:"Bearer "+this.token}).send()},e}();t.TicketService=s},function(e,t,n){"use strict";t.__esModule=!0;var i=n(2),o=function(){function e(e,t){this.mediaService=e,this.ticketService=t}return e.prototype.send=function(e){return console.log(e.content,e.contentRange),new i.HttpService("PUT",this.ticketService.ticket.uploadLinkSecure,e.content,{"Content-Type":this.mediaService.media.file.type,"Content-Range":e.contentRange}).send(!0)},e.prototype.getRange=function(){return new i.HttpService("PUT",this.ticketService.ticket.uploadLinkSecure,null,{"Content-Type":this.mediaService.media.file.type,"Content-Range":"bytes */* "}).send()},e}();t.UploadService=o},function(e,t,n){"use strict";t.__esModule=!0;var i=function(){function e(e){this.supportedFiles=e}return e.prototype.isSupported=function(e){var t=e.type;if(-1===t.indexOf("/"))return console.warn("Wrong type found ("+t+")."),!1;var n=t.split("/");return"video"!==n[0]?(console.warn("Only videos are supported, "+t+" given."),!1):this.supportedFiles.includes(n[1])},e}();t.ValidatorService=i},function(e,t,n){"use strict";t.__esModule=!0;var i=function(){function e(){}return e.TimeToSeconds=function(e){return e/1e3},e.TimeToString=function(e){var t=new Date(null);return t.setTime(e),t.toISOString().substr(11,8)},e}();t.TimeUtil=i}]); \ No newline at end of file diff --git a/index.html b/index.html index 20b53dc..e8cf70f 100644 --- a/index.html +++ b/index.html @@ -10,31 +10,25 @@ position: relative; min-height: 100%; } - body { margin-bottom: 60px; color: #505662; } - .help { font-size: smaller; } - .page-header { padding-bottom: 18px; margin: 40px 0 12px; } - .logo { width: 100%; margin-bottom: 20px; } - .lead { font-size: 18px; margin-bottom: 12px; } - .footer { position: absolute; bottom: 0; @@ -44,39 +38,31 @@ height: 120px; color: #505662; } - .footer a.brand { color: #505662; } - .footer a.brand:hover { color: #393e46; text-decoration: none; } - .footer .container { border-top: 1px solid #eee; padding-top: 45px; } - /* Custom page CSS */ - .container { width: auto; max-width: 680px; padding: 0 15px; } - .container .text-muted { margin: 20px 0; } - #progress-container { -webkit-box-shadow: none; box-shadow: inset none; display:none; } - #drop_zone { border: 2px dashed #bbb; -moz-border-radius: 5px; @@ -88,33 +74,28 @@ color: #bbb; height:140px; } - #video-data { margin-top: 1em; font-size: 1.1em; font-weight: 500; } - /* Bragit buttons, http://websemantics.github.io/bragit/ */ .ui.bragit.button, .ui.bragit.buttons .button { background-color: #676f7e; color: #fff!important; } - .ui.bragit.label { color: #505662!important; border-color: #676f7e!important; background-color: #ffffff; } - .ui.bragit.button:focus, .ui.bragit.buttons .button:focus, .ui.bragit.button:hover, .ui.bragit.buttons .button:hover { background-color: #505662; } - .ui.bragit.labels .label:focus, .ui.bragit.label:focus, .ui.bragit.labels .label:hover, @@ -122,13 +103,12 @@ color: #505662!important; border-color: #505662!important; } - .ui.labeled .ui.button .star.icon { color: #F5CC7A!important; } - - + +