451 lines
16 KiB
JavaScript
451 lines
16 KiB
JavaScript
(function (context, $) {
|
|
|
|
"use strict";
|
|
context.JK = context.JK || {};
|
|
context.JK.RecordingFinishedDialog = function (app) {
|
|
var logger = context.JK.logger;
|
|
var rest = context.JK.Rest();
|
|
var playbackControls = null;
|
|
var recording = null; // deferred object
|
|
var $dialog = null;
|
|
var $saveVideoCheckbox = null
|
|
var $uploadToYoutube = null
|
|
var timeout = null
|
|
var CLIENT_ROLE = context.JK.CLIENT_ROLE
|
|
|
|
function resetForm() {
|
|
// remove all display errors
|
|
$('#recording-finished-dialog form .error-text').remove()
|
|
$('#recording-finished-dialog form .error').removeClass("error")
|
|
if(recording.video) {
|
|
if(recording.owner.id == context.JK.currentUserId) {
|
|
// only the owner of the video gets to see video options
|
|
$dialog.find('.save-video').show()
|
|
$dialog.find('.upload-to-youtube').show()
|
|
}
|
|
else {
|
|
$dialog.find('.save-video').hide()
|
|
$dialog.find('.upload-to-youtube').hide()
|
|
}
|
|
|
|
}
|
|
else {
|
|
$dialog.find('.save-video').hide()
|
|
$dialog.find('.upload-to-youtube').hide()
|
|
}
|
|
removeGoogleLoginErrors()
|
|
}
|
|
|
|
function beforeShow() {
|
|
$dialog.data('result', null);
|
|
if (recording == null) {
|
|
alert("recording data should not be null");
|
|
app.layout.closeDialog('recordingFinished');
|
|
return false;
|
|
}
|
|
|
|
resetForm();
|
|
|
|
if(context.jamClient.getClientParentChildRole() == CLIENT_ROLE.CHILD) {
|
|
|
|
logger.debug("child client; launching preview after xfer");
|
|
$('#recording-finished-dialog span.nowait').addClass('hidden')
|
|
$('#recording-finished-dialog span.pleasewait').removeClass('hidden')
|
|
$('#recording-finished-dialog .preview-area').css('visibility', 'hidden')
|
|
$('#recording-finished-dialog form').css('visibility', 'hidden')
|
|
waitForMixTransfer()
|
|
}
|
|
else {
|
|
console.log("normal client; launching preview immediately")
|
|
$('#recording-finished-dialog span.pleasewait').addClass('hidden')
|
|
$('#recording-finished-dialog span.nowait').removeClass('hidden')
|
|
$('#recording-finished-dialog .preview-area').css('visibility', 'visible')
|
|
$('#recording-finished-dialog form').css('visibility', 'visible')
|
|
launchPreview();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
function waitForMixTransfer() {
|
|
timeout = setTimeout(function() {
|
|
console.log("checking for file transfer", window.RecordingStore.mixTransferred)
|
|
|
|
if(window.RecordingStore.mixTransferred) {
|
|
$('#recording-finished-dialog span.pleasewait').addClass('hidden')
|
|
$('#recording-finished-dialog span.nowait').removeClass('hidden')
|
|
$('#recording-finished-dialog .preview-area').css('visibility', 'visible')
|
|
$('#recording-finished-dialog form').css('visibility', 'visible')
|
|
timeout = null
|
|
launchPreview()
|
|
}
|
|
else {
|
|
waitForMixTransfer();
|
|
}
|
|
|
|
}, 1000)
|
|
}
|
|
|
|
function launchPreview() {
|
|
var parentSelector = '#recording-finished-dialog div.genre-selector';
|
|
context.JK.GenreSelectorHelper.render(parentSelector);
|
|
|
|
// preset genre from 1st genre in current session
|
|
var currentOrLastSession = JK.CurrentSessionModel.getCurrentOrLastSession();
|
|
if (currentOrLastSession && currentOrLastSession.genres.length > 0) {
|
|
var genreDescription = currentOrLastSession.genres[0];
|
|
context.JK.GenreSelectorHelper.setSelectedGenres(parentSelector, [genreDescription]);
|
|
}
|
|
|
|
var localResults = context.jamClient.GetLocalRecordingState({recordings: [recording]});
|
|
|
|
if (localResults['error']) {
|
|
logger.error("unable to open recording due to error: %o", localResults);
|
|
app.notify({
|
|
title: "Unable to Open Recording for Playback",
|
|
text: localResults['error'],
|
|
icon_url: "/assets/content/icon_alert_big.png"
|
|
});
|
|
}
|
|
else {
|
|
var localResult = localResults.recordings[0];
|
|
if (localResult.aggregate_state == 'MISSING') {
|
|
logger.error("unable to open recording due to all missing tracks: %o", localResults);
|
|
app.notify({
|
|
title: "Unable to Open Recording for Playback",
|
|
text: "All of your tracks associated with the recording are missing. This is a bug in the application.",
|
|
icon_url: "/assets/content/icon_alert_big.png"
|
|
});
|
|
}
|
|
else if (localResult.aggregate_state == 'PARTIALLY_MISSING') {
|
|
logger.error("unable to open recording due to some missing tracks: %o", recording, localResults);
|
|
app.notify({
|
|
title: "Unable to Open Recording for Playback",
|
|
text: "Some of your tracks associated with the recording are missing. This is a bug in the application.",
|
|
icon_url: "/assets/content/icon_alert_big.png"
|
|
})
|
|
}
|
|
else {
|
|
|
|
// load recording
|
|
var openRecordingResult = context.jamClient.PreviewRecording(recording);
|
|
|
|
logger.debug("OpenRecording response: %o", openRecordingResult);
|
|
|
|
if (openRecordingResult.error) {
|
|
app.notify({
|
|
"title": "Can't Open Recording",
|
|
"text": openRecordingResult.error,
|
|
"icon_url": "/assets/content/icon_alert_big.png"
|
|
});
|
|
}
|
|
else {
|
|
// hunt for missing backing tracks; if so, mark them as silent
|
|
context._.each(openRecordingResult.backing_tracks, function(backingTrack) {
|
|
if(backingTrack.local_state == "MISSING") {
|
|
// mark this as deleted
|
|
logger.debug("marking recorded track as deleted")
|
|
rest.markRecordedBackingTrackSilent({recording_id: openRecordingResult.recording_id, backing_track_id: backingTrack.client_track_id})
|
|
.fail(function() {
|
|
app.notify({
|
|
"title": "Unable to Mark Backing Track",
|
|
"text": "A backing track was never played, but we could not tell the server to remove it from the recording.",
|
|
"icon_url": "/assets/content/icon_alert_big.png"
|
|
});
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
playbackControls.startMonitor();
|
|
}
|
|
}
|
|
}
|
|
function afterHide() {
|
|
if(timeout) {
|
|
clearTimeout(timeout)
|
|
timeout = null
|
|
}
|
|
if(recording && recording.video) {
|
|
var name = $('#recording-finished-dialog form input[name=name]').val();
|
|
name = name.replace(/[^A-Za-z0-9\-\ ]/g, '');
|
|
|
|
|
|
var saveToDisk = $('#recording-finished-dialog form input[name=save_video]').is(':checked')
|
|
var keepResult = $dialog.data('result');
|
|
keepResult = keepResult && keepResult.keep
|
|
|
|
logger.debug("VideoDecision rid:" + recording.id + ", name=" + name + ", keepResult=" + keepResult + ", saveToDisk=" + saveToDisk);
|
|
|
|
context.jamClient.VideoDecision(recording.id, name, keepResult && saveToDisk)
|
|
}
|
|
|
|
recording = null;
|
|
playbackControls.stopMonitor();
|
|
context.jamClient.ClosePreviewRecording();
|
|
}
|
|
|
|
function onCancel() {
|
|
return false;
|
|
}
|
|
|
|
function discardRecording(e) {
|
|
|
|
resetForm();
|
|
registerDiscardRecordingHandlers(false);
|
|
|
|
rest.discardRecording({
|
|
id: recording.id
|
|
})
|
|
.done(function () {
|
|
logger.debug("recording discarded by user. recordingId=%o", recording.id);
|
|
})
|
|
.fail(function (jqXHR) {
|
|
logger.error("recording discard by user failed. recordingId=%o. reason: %o", recording.id, jqXHR.responseText);
|
|
})
|
|
.always(function () {
|
|
$dialog.data('result', {keep:false});
|
|
app.layout.closeDialog('recordingFinished')
|
|
registerDiscardRecordingHandlers(true);
|
|
})
|
|
return false;
|
|
}
|
|
|
|
function startGoogleLogin(e) {
|
|
e.preventDefault()
|
|
logger.debug("Starting google login")
|
|
window._oauth_win = window.open("/auth/google_login", "Log In to Google", "height=500,width=500,menubar=no,resizable=no,status=no");
|
|
|
|
window._oauth_callback = function() {
|
|
window._oauth_win.close()
|
|
logger.debug("closing window")
|
|
setGoogleAuthState()
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function claimRecording(e) {
|
|
resetForm();
|
|
registerClaimRecordingHandlers(false)
|
|
|
|
var upload_to_youtube = $('#recording-finished-dialog form input[name=upload_to_youtube]').is(':checked')
|
|
|
|
upload_to_youtube = false // don't prevent user from getting through dialog because popup now handles auth
|
|
|
|
if (upload_to_youtube) {
|
|
$.ajax({
|
|
type: "GET",
|
|
dataType: "json",
|
|
url: "/auth/has_google_auth"
|
|
}).success(function(data) {
|
|
if(data.has_google_auth) {
|
|
performClaim()
|
|
} else {
|
|
var error_ul = $('<ul class="error-text upload_to_youtube"><li>You must sign in to YouTube</li></ul>')
|
|
$('#recording-finished-dialog form [purpose=upload_to_youtube]').addClass('error').append(error_ul)
|
|
}
|
|
}).always(function () {
|
|
registerClaimRecordingHandlers(true);
|
|
})
|
|
} else {
|
|
performClaim()
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function performClaim() {
|
|
var name = $('#recording-finished-dialog form input[name=name]').val();
|
|
var description = $('#recording-finished-dialog form textarea[name=description]').val();
|
|
var genre = $('#recording-finished-dialog form select[name=genre]').val();
|
|
var is_public = $('#recording-finished-dialog form input[name=is_public]').is(':checked')
|
|
var save_video = $('#recording-finished-dialog form input[name=save_video]').is(':checked')
|
|
var upload_to_youtube = $('#recording-finished-dialog form input[name=upload_to_youtube]').is(':checked')
|
|
|
|
var recording_id = recording.id
|
|
var recording_video = recording.video
|
|
|
|
rest.claimRecording({
|
|
id: recording.id,
|
|
name: name,
|
|
description: description,
|
|
genre: genre,
|
|
is_public: is_public,
|
|
save_video: save_video,
|
|
upload_to_youtube: upload_to_youtube
|
|
})
|
|
.done(function () {
|
|
$dialog.data('result', {keep:true});
|
|
app.layout.closeDialog('recordingFinished');
|
|
context.JK.GA.trackMakeRecording();
|
|
if(recording_video && save_video && upload_to_youtube) {
|
|
// you have to have elected to save video to have upload to youtube have
|
|
context.VideoUploaderActions.showUploader(recording_id);
|
|
}
|
|
|
|
})
|
|
.fail(function (jqXHR) {
|
|
if (jqXHR.status == 422) {
|
|
var errors = JSON.parse(jqXHR.responseText);
|
|
|
|
var $name_errors = context.JK.format_errors('name', errors);
|
|
if ($name_errors) $('#recording-finished-dialog form input[name=name]').closest('div.field').addClass('error').end().after($name_errors);
|
|
|
|
var $description_errors = context.JK.format_errors('description', errors);
|
|
if ($description_errors) $('#recording-finished-dialog form input[name=description]').closest('div.field').addClass('error').end().after($description_errors);
|
|
|
|
var $genre_errors = context.JK.format_errors('genre', errors);
|
|
if ($genre_errors) $('#recording-finished-dialog form select[name=genre]').closest('div.field').addClass('error').end().after($genre_errors);
|
|
|
|
var $is_public_errors = context.JK.format_errors('is_public', errors);
|
|
if ($is_public_errors) $('#recording-finished-dialog form input[name=is_public]').closest('div.field').addClass('error').end().after($is_public_errors);
|
|
|
|
var $save_video_errors = context.JK.format_errors('save_video', errors);
|
|
if ($save_video_errors) $('#recording-finished-dialog form input[name=save_video]').closest('div.field').addClass('error').end().after($save_video_errors);
|
|
|
|
var recording_error = context.JK.get_first_error('recording_id', errors);
|
|
|
|
if (recording_error) context.JK.showErrorDialog(app, "Unable to claim recording.", recording_error);
|
|
}
|
|
else {
|
|
logger.error("unable to claim recording %o", arguments);
|
|
|
|
context.JK.showErrorDialog(app, "Unable to claim recording.", jqXHR.responseText);
|
|
}
|
|
})
|
|
.always(function () {
|
|
registerClaimRecordingHandlers(true);
|
|
});
|
|
}
|
|
|
|
function registerClaimRecordingHandlers(onOff) {
|
|
$('#keep-session-recording').off('click', claimRecording)
|
|
$('#recording-finished-dialog form').off('submit', claimRecording);
|
|
|
|
if (onOff) {
|
|
$('#keep-session-recording').on('click', claimRecording);
|
|
$('#recording-finished-dialog form').on('submit', claimRecording);
|
|
}
|
|
}
|
|
|
|
function registerDiscardRecordingHandlers(onOff) {
|
|
if (onOff) {
|
|
$('#discard-session-recording').on('click', discardRecording);
|
|
}
|
|
else {
|
|
$('#discard-session-recording').off('click', discardRecording);
|
|
}
|
|
}
|
|
|
|
function onPause() {
|
|
logger.debug("calling jamClient.SessionPausePlay");
|
|
context.jamClient.SessionPausePlay();
|
|
}
|
|
|
|
function onStop() {
|
|
logger.debug("calling jamClient.SessionStopPlay");
|
|
context.jamClient.SessionStopPlay();
|
|
}
|
|
|
|
function onPlay(e, data) {
|
|
logger.debug("calling jamClient.SessionStartPlay");
|
|
context.jamClient.SessionStartPlay(data.playbackMode);
|
|
}
|
|
|
|
function onChangePlayPosition(e, data) {
|
|
logger.debug("calling jamClient.SessionTrackSeekMs(" + data.positionMs + ")");
|
|
context.jamClient.SessionTrackSeekMs(data.positionMs);
|
|
}
|
|
|
|
function registerStaticEvents() {
|
|
registerClaimRecordingHandlers(true);
|
|
registerDiscardRecordingHandlers(true);
|
|
$(playbackControls)
|
|
.on('stop', onStop)
|
|
.on('pause', onPause)
|
|
.on('play', onPlay)
|
|
.on('change-position', onChangePlayPosition);
|
|
$dialog.find(".google_login_button").on('click', startGoogleLogin);
|
|
|
|
// Check for google authorization using AJAX and show/hide the
|
|
// google login button / "signed in" label as appropriate:
|
|
/**$(window).on('focus', function() {
|
|
setGoogleAuthState();
|
|
}); */
|
|
}
|
|
|
|
function setGoogleAuthState() {
|
|
$.ajax({
|
|
type: "GET",
|
|
dataType: "json",
|
|
url: "/auth/has_google_auth"
|
|
}).success(function(data) {
|
|
if(data.has_google_auth) {
|
|
$("input.google_login_button").addClass("hidden")
|
|
$("span.signed_in_to_google").removeClass("hidden")
|
|
removeGoogleLoginErrors()
|
|
} else {
|
|
$("span.signed_in_to_google").addClass("hidden")
|
|
$("input.google_login_button").removeClass("hidden")
|
|
}
|
|
})
|
|
}
|
|
|
|
function removeGoogleLoginErrors() {
|
|
$("ul.error-text.upload_to_youtube").remove()
|
|
$('#recording-finished-dialog form div[purpose=upload_to_youtube]').removeClass('error')
|
|
}
|
|
|
|
function setRecording(recordingData) {
|
|
if (recording != null) {
|
|
//XXX - prevent start/stop recording mashing; protect this dialog
|
|
logger.error("unable to set recording data over existing recording data. this coudld be due to start/stop recording mashing");
|
|
return;
|
|
}
|
|
recording = recordingData;
|
|
}
|
|
|
|
function initializeButtons() {
|
|
$saveVideoCheckbox = $('#recording-finished-dialog input[name="save_video"]')
|
|
$uploadToYoutube = $('#recording-finished-dialog input[name="upload_to_youtube"]')
|
|
var isPublic = $('#recording-finished-dialog input[name="is_public"]');
|
|
context.JK.checkbox(isPublic);
|
|
context.JK.checkbox($saveVideoCheckbox);
|
|
context.JK.checkbox($uploadToYoutube);
|
|
|
|
$saveVideoCheckbox.on('ifChanged', function() {
|
|
var saveVideoToDisk = $saveVideoCheckbox.is(':checked')
|
|
|
|
if(saveVideoToDisk) {
|
|
$uploadToYoutube.iCheck('enable')
|
|
}
|
|
else {
|
|
$uploadToYoutube.iCheck('disable')
|
|
}
|
|
|
|
})
|
|
}
|
|
|
|
function initialize() {
|
|
var dialogBindings = {
|
|
'beforeShow': beforeShow,
|
|
'afterHide': afterHide,
|
|
'onCancel': onCancel
|
|
};
|
|
|
|
app.bindDialog('recordingFinished', dialogBindings);
|
|
|
|
$dialog = $('#recording-finished-dialog')
|
|
playbackControls = new context.JK.PlaybackControls($('#recording-finished-dialog .recording-controls'));
|
|
|
|
registerStaticEvents();
|
|
initializeButtons();
|
|
};
|
|
|
|
|
|
this.initialize = initialize;
|
|
this.setRecording = setRecording;
|
|
}
|
|
|
|
return this;
|
|
})(window, jQuery); |