diff options
Diffstat (limited to 'www/js/importer.js')
-rw-r--r-- | www/js/importer.js | 510 |
1 files changed, 317 insertions, 193 deletions
diff --git a/www/js/importer.js b/www/js/importer.js index b34c4b6..09f5db5 100644 --- a/www/js/importer.js +++ b/www/js/importer.js @@ -24,141 +24,181 @@ var Rdxport = Rdxport || {}; -Rdxport.Importer = function(username, token) { +Rdxport.Importer = function(username, token, rhimpordEndpoint) { this.username = username; this.token = token; + this.rhimpordEndpoint = rhimpordEndpoint; this.$el = $('#uploadModal'); + this.listWebSocket = null; this.uploads = []; - this.webSocket = null; - this.initWebSocket(); + this.initListWebSocket(); }; Rdxport.Importer.CMD_LIST = 'list'; Rdxport.Importer.CMD_NEW = 'new'; Rdxport.Importer.CMD_RECONNECT = 'reconnect'; +Rdxport.Importer.ERROR_OK = 'ok'; +Rdxport.Importer.ERROR_ERROR = 'error'; +Rdxport.Importer.TYPE_ERROR = 'error'; +Rdxport.Importer.TYPE_ACK = 'ack'; +Rdxport.Importer.TYPE_LIST = 'list'; +Rdxport.Importer.TYPE_PROGRESS = 'progress'; +Rdxport.Importer.TYPE_DONE = 'done'; + +Rdxport.Importer.prototype.initListWebSocket = function() { + var self = this; + this.listWebSocket = new WebSocket(this.rhimpordEndpoint); -Rdxport.Importer.prototype.initWebSocket = function() { - var importer = this; - - var webSocket = new WebSocket('wss://import.helsinki.at/rhimportd'); - - webSocket.onclose = function(code, reason) { + this.listWebSocket.onclose = function(code, reason) { console.log('close'); console.log(code); console.log(reason); }; - webSocket.onerror = function() { + this.listWebSocket.onerror = function(error) { console.log('error'); + console.log(error); }; - webSocket.onopen = function() { - console.log('open'); - - console.log('send new'); + this.listWebSocket.onopen = function() { var sendOptions = { - COMMAND: Rdxport.Importer.CMD_NEW, + COMMAND: Rdxport.Importer.CMD_LIST, LOGIN_NAME: importer.username, - PASSWORD: importer.token, - TIMEOUT: 200, - REFERENCE_ID: "999", - SHOW_ID: 10000, - CLEAR_SHOW_CARTS: true, - SOURCE_URI: 'archiv://2016/03/31/05' + PASSWORD: importer.token }; - console.log(sendOptions); this.send(JSON.stringify(sendOptions)); + var self = this; + setInterval(function() { + self.send(JSON.stringify(sendOptions)); + }, 3 * 1000); }; - webSocket.onmessage = function(event) { - console.log('message'); - console.log(event.data); - }; - - /*this.webSocket = new WebSocket('wss://import.helsinki.at/rhimportd'); - - this.webSocket.onclose = function(code, reason) { - console.log('close'); - console.log(code); - console.log(reason); - }; - - this.webSocket.onerror = function() { - console.log('error'); - }; - - this.webSocket.onopen = function() { - console.log('open'); - - console.log('send reconnect'); - var reconnectOptions = { - COMMAND: Rdxport.Importer.CMD_RECONNECT, - LOGIN_NAME: importer.username, - PASSWORD: importer.token - }; - console.log(reconnectOptions); - this.send(JSON.stringify(reconnectOptions)); + this.listWebSocket.onmessage = function(event) { + var data = $.parseJSON(event.data); + if (data.TYPE.toLowerCase() === Rdxport.Importer.TYPE_LIST) { + $.each(data.SESSIONS, function(id, reference) { + if (importer.getUploadById(id) !== null) { + return true; //continue; + } + var reference = reference.split('/'); + var groupName = reference[0]; + var cartNumber = reference[1]; + var filename = reference[2]; + + var groupViews = null; + switch (router.activeRoute) { + default: + //fallthrough + case 'shows': + if (showListView) { + groupViews = showListView.showViews; + } + case 'jingles': + if (jingleGroupListView) { + groupViews = jingleGroupListView.jingleGroupViews; + } + case 'musicpools': + if (musicpoolsView) { + groupViews = musicpoolsView.musicpoolViews; + } + } + + var groupView = groupViews.find(function (element) { + return element.model.groupName === groupName; + }); + + if (!groupView) { + return true; //continue; + } + + var group = groupView.model; + + var upload = new Rdxport.Upload('/' + filename, group, groupView, cartNumber, cartNumber, null); + upload.reconnect(id, reference); + self.uploads.push(upload); + }); + } }; - - this.webSocket.onmessage = function(event) { - console.log('message'); - console.log(event.data); - };*/ }; Rdxport.Importer.prototype.resetModal = function() { $('div.modal-header h4', this.$el).text("Datei auswählen..."); - $('.modal-body', this.$el).empty().css("background-image", "url('/img/dz-backdrop.png')"); + $('.modal-body .drop', this.$el).css("background-image", "url('/img/dz-backdrop.png')"); + $('.modal-body .drop form input[type="file"]', this.$el).val(''); + $('.modal-body #sourceUri', this.$el).val(''); $('#uploadModal-confirm', this.$el).attr('disabled','disabled').off('click'); }; -Rdxport.Importer.prototype.openModal = function(group, groupView, createCart, newCartNumber, useMetadata) { - createCart = typeof createCart === 'undefined' ? false : createCart; - useMetadata = typeof useMetadata === 'undefined' ? false : useMetadata; - +Rdxport.Importer.prototype.openModal = function(group, groupView, cartNumber, newCartNumber, useMetadata) { this.resetModal(); - $('.modal-body', this.$el).append($('<form>')); - - var dropzone = new Dropzone('#uploadModal form', { - url: '/rd-bin/rdxport.cgi', - parallelUploads: 1, - maxFilesize: 2048, - paramName: 'FILENAME', - uploadMultiple: false, // todo: maybe enable this? - clickable: true, - createImageThumbnails: false, - acceptedFiles: '.flac,.wav,.ogg,.mp3', - autoProcessQueue: false + var $drop = $('.modal-body .drop', this.$el); + var $form = $('form', $drop); + var $fileInput = $('input[type="file"]', $form); + + $drop.on('click', function(event) { + $fileInput.get(0).click(); + }); + + $fileInput.on('change', function() { + handleFiles($(this).get(0).files); }); - this.$el.off('hide.bs.modal').on('hide.bs.modal', function() { - dropzone.removeAllFiles(true); - dropzone.disable(); - dropzone.destroy(); + $drop.on('dragenter dragover', function(event) { + event.stopPropagation(); + event.preventDefault(); + }); + + $drop.on('drop', function(event) { + event.stopPropagation(); + event.preventDefault(); + var dataTransfer = event.dataTransfer; + handleFiles(dataTransfer.files); }); var self = this; - dropzone.on('addedfile', function(file) { - if (!Dropzone.isValidFile(file, dropzone.options.acceptedFiles)) { + function handleFiles(files) { + var file = files[0]; + + /*if (!Dropzone.isValidFile(file, dropzone.options.acceptedFiles)) { $('div.modal-header h4', self.$el).text('Nicht unterstützter Dateityp.'); - $('.modal-body', this.$el).css("background-image", "url('/img/dz-backdrop.png')"); + $('.modal-body .drop', this.$el).css("background-image", "url('/img/dz-backdrop.png')"); $('#uploadModal-confirm', this.$el).attr('disabled','disabled').off('click'); return; - } + }*/ $('div.modal-header h4', self.$el).text(file.name); - $('div.modal-body', self.$el).css("background-image", "url('/img/audio_file.png')"); + $('div.modal-body .drop', self.$el).css("background-image", "url('/img/audio_file.png')"); + $('.modal-body #sourceUri', self.$el).val(''); + $('#uploadModal-confirm', self.$el).off('click').on('click', function() { + var upload = new Rdxport.Upload(file, group, groupView, cartNumber, newCartNumber, useMetadata); + upload.import(); + self.uploads.push(upload); + self.$el.off('hide.bs.modal'); + self.$el.modal('hide'); + }) + .removeAttr('disabled').focus(); + } + + $('.modal-body #sourceUri', this.$el).off().on('keyup change', function(event) { + if ($(this).val() === '') { + $('#uploadModal-confirm', self.$el).off('click').attr('disabled', 'disabled'); + return; + } + $('.modal-body .drop', self.$el).css("background-image", "url('/img/dz-backdrop.png')"); + $('.modal-body .drop form input[type="file"]', this.$el).val(''); $('#uploadModal-confirm', self.$el).off('click').on('click', function() { - var upload = new Rdxport.Upload(group, groupView, createCart, newCartNumber, useMetadata, dropzone); + var sourceUri = $('.modal-body #sourceUri', self.$el).val(); + var upload = new Rdxport.Upload(sourceUri, group, groupView, cartNumber, newCartNumber, useMetadata); + upload.import(); self.uploads.push(upload); self.$el.off('hide.bs.modal'); self.$el.modal('hide'); }) - .removeAttr('disabled').focus(); + .removeAttr('disabled'); }); this.$el.modal({keyboard: true}); @@ -169,13 +209,22 @@ Rdxport.Importer.prototype.isUploading = function() { $.each(this.uploads, function(index, upload) { if (upload && upload.isUploading()) { $result = true; + return false; //break; } }); return $result; }; +Rdxport.Importer.prototype.closeAllUploads = function() { + $.each(this.uploads, function(index, upload) { + if (upload) { + upload.close(); + } + }); +}; + Rdxport.Importer.prototype.cancelAllUploads = function() { - $.each(this.uploads, function(index, upload){ + $.each(this.uploads, function(index, upload) { if (upload) { upload.cancel(); } @@ -187,126 +236,236 @@ Rdxport.Importer.prototype.removeUpload = function(upload) { $.each(this.uploads, function(index, currentUpload){ if(currentUpload === upload) { self.uploads.splice(index, 1); + return false; //break; } }); }; -Rdxport.Importer.prototype.getUploadByCartNumber = function (cartNumber) { +Rdxport.Importer.prototype.getUploadByCartNumber = function(cartNumber) { + if (cartNumber === null) { + return null; + } var upload = null; - $.each(this.uploads, function(index, currentUpload){ - if (currentUpload.cart !== null && - currentUpload.cart.number === cartNumber ) { - upload = currentUpload; + $.each(this.uploads, function(index, currentUpload) { + if (currentUpload.cartNumber === cartNumber || + currentUpload.newCartNumber === cartNumber) { + upload = currentUpload; + return false; //break; } }); return upload; }; -Rdxport.Importer.prototype.getUploadByCartAndCutNumber = function (cartNumber, cutNumber) { +Rdxport.Importer.prototype.getUploadById = function(uploadId) { + if (uploadId === null) { + return null; + } var upload = null; $.each(this.uploads, function(index, currentUpload) { - if (currentUpload.cart !== null && - currentUpload.cart.number === cartNumber && - currentUpload.cut !== null && - currentUpload.cut.number === cutNumber) { - upload = currentUpload; + if (currentUpload.uploadId === uploadId ) { + upload = currentUpload; + return false; //break; } }); return upload; }; -Rdxport.Upload = function(group, groupView, createCart, newCartNumber, useMetadata, dropzone) { +Rdxport.Importer.prototype.getUploadsByCartNumber = function(cartNumber) { + if (cartNumber === null) { + return null; + } + return this.uploads.filter(function (currentUpload) { + return currentUpload.cartNumber === cartNumber || + currentUpload.newCartNumber === cartNumber; + }); +}; + +Rdxport.Importer.prototype.getUploadsByGroupName = function(groupName) { + if (groupName === null) { + return null; + } + return this.uploads.filter(function (currentUpload) { + return currentUpload.group.name === groupName; + }); +}; + +Rdxport.Upload = function(fileOrsourceUri, group, groupView, cartNumber, newCartNumber, useMetadata) { + this.sourceUri = ''; + this.file = null; + this.filename = ''; + + if (typeof fileOrsourceUri === "string") { + this.sourceUri = fileOrsourceUri; + this.filename = fileOrsourceUri ? fileOrsourceUri.substr(fileOrsourceUri.lastIndexOf('/') + 1) : ''; + } else { + this.file = fileOrsourceUri; + this.filename = fileOrsourceUri.name; + this.sourceUri = 'attachment://' + fileOrsourceUri.size + '/' + this.filename; + } + this.group = group; this.groupView = groupView; - this.createCart = createCart; + this.cartNumber = cartNumber; this.newCartNumber = newCartNumber; this.useMetadata = useMetadata; - this.dropzone = dropzone; + this.uploadId = null; + this.webSocket = null; this.uploadprogress = { - progress: 0, + current: 0, total: 0, - bytesSent: 0 + progress: 0, + progress_step: 0, + progress_step_name: '' }; - this.cart = null; - this.cut = null; - - this.import(); + this.sendingFile = false; }; Rdxport.Upload.prototype.isUploading = function() { - var files = this.dropzone.getUploadingFiles(); - return files.length > 0; + return this.file && this.uploadprogress.progress_step < 2; }; -Rdxport.Upload.prototype.cancel = function() { - this.dropzone.off(Dropzone.ERROR); - this.dropzone.removeAllFiles(true); - this.dropzone.disable(); - this.dropzone.destroy(); +Rdxport.Upload.prototype.onclose = function(code, reason) { + console.log('close'); + console.log(code); + console.log(reason); +}; - var self = this; - if (this.createCart && this.cart !== null) { - rdxport.removeCart(this.cart.number, function() { - self.group.fetchCarts(); - }); - this.cart = null; - } else if (this.cart !== null && this.cut !== null) { - rdxport.removeCut(this.cart.number, this.cut.number, function() { - self.group.fetchCarts(); - }); - this.cut = null; +Rdxport.Upload.prototype.onerror = function(error) { + console.log('error'); + console.log(error); + + var file = { + cartNumber: this.cartNumber || this.newCartNumber + }; + this.importFileUploadError(file, error); +}; + +Rdxport.Upload.prototype.onmessage = function(event) { + var data = $.parseJSON(event.data); + this.uploadId = data.ID; + var file = { + cartNumber: this.cartNumber || this.newCartNumber + }; + switch (data.TYPE.toLowerCase()) { + case Rdxport.Importer.TYPE_ERROR: + console.log(data); + this.importFileUploadError(file, data.ERROR_STRING); + break; + case Rdxport.Importer.TYPE_PROGRESS: + this.uploadprogress.current = data.CURRENT; + this.uploadprogress.total = data.TOTAL; + this.uploadprogress.progress = data.PROGRESS; + this.uploadprogress.progress_step = data.PROGRESS_STEP; + this.uploadprogress.progress_step_name = data.PROGRESS_STEP_NAME; + this.groupView.uploadProgress(this, file); + break; + case Rdxport.Importer.TYPE_DONE: + console.log(data); + this.importFileUploadSuccess(); + break; } - importer.removeUpload(this); + if (this.file && !this.sendingFile) { + this.sendingFile = true; + + var chunkSize = 60 * 1024; + var start = 0; + var end = chunkSize; + var self = this; + var interval = setInterval(function() { + if (self.webSocket.bufferedAmount > 4 * chunkSize) { + return true; + } + var blob = self.file.slice(start, end, {type: "application/octet-stream"}); + self.webSocket.send(blob); + + if (self.file.size === end) { + clearInterval(interval); + } + start += chunkSize; + end += chunkSize; + end = end > self.file.size ? self.file.size : end; + }, 10); + } }; Rdxport.Upload.prototype.import = function() { var self = this; - this.dropzone.off('uploadprogress').on('uploadprogress', function(file) { - self.uploadprogress = file.upload; - self.groupView.uploadProgress(self, file); - }); - this.dropzone.off(Dropzone.SUCCESS).on(Dropzone.SUCCESS, function(file) { - self.importFileUploadSuccess(); - }); - this.dropzone.off(Dropzone.ERROR).on(Dropzone.ERROR, function(file, msg, xhr) { - self.importFileUploadError(file, msg, xhr); - }); - // debug - //self.importFileUploadError({cartNumber: 100000}, '<?xml version="1.0" encoding="UTF-8"?><woot><ResponseCode>123</ResponseCode><ErrorString>Fake error</ErrorString></woot>', null); + this.webSocket = new WebSocket(importer.rhimpordEndpoint); + this.webSocket.onclose = function(code, reason) { self.onclose(code, reason) }; + this.webSocket.onerror = function(error) { self.onerror(error); }; + this.webSocket.onmessage = function(event) { self.onmessage(event) }; - this.addCart(function(file) { - self.addCut(file); - }); -}; + this.webSocket.onopen = function() { + var sendOptions = { + COMMAND: Rdxport.Importer.CMD_NEW, + LOGIN_NAME: importer.username, + PASSWORD: importer.token, + TIMEOUT: 7200, // 2 hours + SOURCE_URI: self.sourceUri, + CHANNELS: 2, + // todo: is this needed? + //NORMALIZATION_LEVEL: self.cart.normlevel, + //AUTOTRIM_LEVEL: self.cart.trimlevel, + USE_METADATA: self.useMetadata + }; + if (self.cartNumber) { + sendOptions.REFERENCE_ID = self.group.groupName + '/' + self.cartNumber + '/' + self.filename; + sendOptions.CART_NUMBER = parseInt(self.cartNumber); + } else { + if (self.newCartNumber) { + sendOptions.REFERENCE_ID = self.group.groupName + '/' + self.newCartNumber + '/' + self.filename; + sendOptions.CART_NUMBER = parseInt(self.newCartNumber); + } else if (self.group instanceof Rdxport.Musicpool) { + sendOptions.REFERENCE_ID = self.group.groupName + '/' + '/' + self.filename; + sendOptions.MUSIC_POOL_GROUP = self.group.groupName; + } + } + console.log(sendOptions); + this.send(JSON.stringify(sendOptions)); -Rdxport.Upload.prototype.addCart = function(success) { - var files = this.dropzone.getAcceptedFiles(); - var file = files[files.length - 1]; + self.group.fetchCarts(); + }; +}; +Rdxport.Upload.prototype.reconnect = function(id, reference) { var self = this; - if (this.createCart) { - rdxport.addCart(this.group.groupName, 'audio', {CART_NUMBER: this.newCartNumber}, function(cartXML) { - self.cart = new Rdxport.Cart(cartXML, self.group); - success(file); - }).fail(function() { - //self.importFileUploadError(files[0], 'Failed to add Cart.'); - }); - } else { - this.cart = this.group.carts[0]; - success(file); - } + + this.webSocket = new WebSocket(importer.rhimpordEndpoint); + this.webSocket.onclose = function(code, reason) { self.onclose(code, reason) }; + this.webSocket.onerror = function(error) { self.onerror(error); }; + this.webSocket.onmessage = function(event) { self.onmessage(event) }; + + this.webSocket.onopen = function() { + var reconnectOptions = { + COMMAND: Rdxport.Importer.CMD_RECONNECT, + LOGIN_NAME: importer.username, + PASSWORD: importer.token, + ID: id + }; + this.send(JSON.stringify(reconnectOptions)); + + self.group.fetchCarts(); + }; }; -Rdxport.Upload.prototype.importFileUploadSuccess = function() { - this.dropzone.off(Dropzone.ERROR); - this.dropzone.removeAllFiles(true); - this.dropzone.disable(); - this.dropzone.destroy(); +Rdxport.Upload.prototype.close = function() { + this.webSocket.close(); + this.group.fetchCarts(); importer.removeUpload(this); +}; +Rdxport.Upload.prototype.cancel = function() { + this.webSocket.send(JSON.stringify({ COMMAND: 'cancel' })); + this.webSocket.close(); + this.group.fetchCarts(); + importer.removeUpload(this); +}; + +Rdxport.Upload.prototype.importFileUploadSuccess = function() { + importer.removeUpload(this); this.group.fetchCarts(); }; @@ -316,38 +475,3 @@ Rdxport.Upload.prototype.importFileUploadError = function(file, msg, xhr) { self.cancel(); }); }; - -Rdxport.Upload.prototype.addCut = function(file) { - var self = this; - - rdxport.addAndEditCut(this.cart.number, {DESCRIPTION: file.name}, function(cutXml) { - self.cut = new Rdxport.Cut(cutXml, self.cart); - - self.dropzone.on('sending', function(file, xhr, formData) { - var cutNumber = $('cutNumber', cutXml).text(); - var cutNumberLeading = cutNumber; - switch (cutNumber.toString().length) { - case 0: cutNumberLeading = '000' + cutNumber; break; - case 1: cutNumberLeading = '00' + cutNumber; break; - case 2: cutNumberLeading = '0' + cutNumber; break; - case 3: default: cutNumberLeading = cutNumber; break; - } - file.cartNumber = self.cart.number; - file.cutNumber = cutNumberLeading; - - formData.append('COMMAND', 2); - formData.append('LOGIN_NAME', auth.username); - formData.append('PASSWORD', auth.token); - formData.append('CART_NUMBER', self.cart.number); - formData.append('CUT_NUMBER', cutNumber); - formData.append('CHANNELS', 2); - formData.append('NORMALIZATION_LEVEL', self.cart.normlevel); - formData.append('AUTOTRIM_LEVEL', self.cart.trimlevel); - formData.append('USE_METADATA', (self.useMetadata ? 1 : 0)); - }); - - self.dropzone.processQueue(); - self.group.fetchCarts(); - - }); -}; |