pandora/static/js/pandora/importAnnotations.js
2013-01-12 06:55:20 +00:00

160 lines
4.9 KiB
JavaScript

// vim: et:ts=4:sw=4:sts=4:ft=javascript
'use strict';
pandora.ui.importAnnotations = function(data) {
var content = Ox.Element().css({margin: '16px'}),
file,
height = 192,
layers = pandora.site.layers.filter(function(layer) {
return layer.canAddAnnotations[pandora.user.level];
}),
layer,
width = 384,
srt = [],
total = 0,
importButton,
selectLayer,
selectFile,
that = Ox.Dialog({
buttons: [
Ox.Button({
id: 'close',
title: 'Close'
}).bindEvent({
click: function() {
that.close();
}
}),
importButton = Ox.Button({
disabled: true,
id: 'import',
title: 'Import'
}).bindEvent({
click: function() {
importButton.hide();
selectLayer.hide();
selectFile.hide();
addAnnotation();
}
})
],
closeButton: true,
content: content,
keys: {
'escape': 'close'
},
height: height,
removeOnClose: true,
width: width,
title: 'Import Annotations'
})
.bindEvent({
close: function(data) {
that.close();
}
}),
$status = $('<div>').css({
padding: '4px'
});
function addAnnotation() {
if (srt.length > 0) {
var data = srt.shift();
data.text = Ox.sanitizeHTML(data.text)
.replace(/<br[ /]*?>\n/g, '\n')
.replace(/\n\n/g, '<br>\n')
.replace(/\n/g, '<br>\n');
$status.html(
Ox.formatDuration(data['in']) + ' to '
+ Ox.formatDuration(data.out) + '<br>\n' + data.text
);
pandora.api.addAnnotation({
'in': data['in'],
out: data.out,
value: data.text,
item: pandora.user.ui.item,
layer: layer
}, function(result) {
if (result.status.code == 200) {
addAnnotation();
} else {
content.html('Failed');
}
});
} else {
$status.html(total + ' annotations imported.');
Ox.Request.clearCache(pandora.user.ui.item);
pandora.$ui.contentPanel.replaceElement(
1, pandora.$ui.item = pandora.ui.item()
);
}
}
function parseSRT(data) {
var srt = Ox.parseSRT(data),
length = srt.length - 1;
//pandora layers include outpoint,
//speedtrans right now sets in to out,
//to avoid one frame overlaps,
//move outpoint by 0.001 seconds
for (var i=0; i < length; i++) {
if (srt[i].out == srt[i+1]['in']) {
srt[i].out = srt[i].out - 0.001;
}
}
return srt;
}
content.append($('<div>').css({
padding: '4px',
paddingBottom: '16px'
}).html('Import annotations from .srt file:'));
selectLayer = Ox.Select({
items: layers,
title: 'select...',
label: 'Layer'
})
.bindEvent({
change: function(data) {
selectLayer.options({
title: null
});
layer = data.value;
total && layer && importButton.options({disabled: false});
}
})
.appendTo(content);
selectFile = $('<input>')
.attr({
type: 'file'
})
.css({
padding: '8px'
})
.on({
change: function(event) {
if (this.files.length) {
file = this.files[0];
var reader = new FileReader();
reader.onloadend = function(event) {
srt = parseSRT(this.result);
total = srt.length;
total && layer && importButton.options({disabled: false});
$status.html(
'File contains ' + total + ' annotation'
+ (total == 1 ? '' : 's') + '.'
);
};
reader.readAsText(file);
} else {
srt = [];
total = 0;
importButton.options({
disabled: true
});
}
}
})
.appendTo(content);
content.append($status);
return that;
};