summaryrefslogtreecommitdiff
path: root/www/js/importer.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/js/importer.js')
-rw-r--r--www/js/importer.js510
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();
-
- });
-};