forked from 0x2620/pandora
160 lines
4.9 KiB
JavaScript
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;
|
|
};
|