VRFS-3242 : Merge with latest develop

This commit is contained in:
Steven Miers 2015-05-13 20:56:58 -05:00
commit 193888f960
43 changed files with 588 additions and 325 deletions

View File

@ -103,7 +103,7 @@ module JamRuby
def copy_url_to_file(url, filename)
uri = URI(url)
open(filename, 'w+b') do |io|
Net::HTTP.start(uri.host, uri.port) do |http|
Net::HTTP.start(uri.host, uri.port, use_ssl: url.start_with?('https') ? true : false) do |http|
request = Net::HTTP::Get.new uri
http.request request do |response|
response_code = response.code.to_i

View File

@ -44,7 +44,7 @@ module JamRuby
# this is basically a dev-time only path of code; we store real artifacts in s3
url = APP_CONFIG.jam_admin_root_url + self.uri.url
else
url = "http://#{APP_CONFIG.cloudfront_host}/#{self.uri.store_dir}/#{self[:uri]}"
url = "https://#{APP_CONFIG.cloudfront_host}/#{self.uri.store_dir}/#{self[:uri]}"
#url = self.uri.url.gsub(APP_CONFIG.aws_fullhost, APP_CONFIG.cloudfront_host)
end

View File

@ -224,8 +224,8 @@ module JamRuby
:cropped_s3_path_photo => cropped_s3_path,
:cropped_large_s3_path_photo => cropped_large_s3_path,
:crop_selection_photo => crop_selection,
:photo_url => S3Util.url(aws_bucket, escape_filename(cropped_s3_path), :secure => false),
:large_photo_url => S3Util.url(aws_bucket, escape_filename(cropped_large_s3_path), :secure => false))
:photo_url => S3Util.url(aws_bucket, escape_filename(cropped_s3_path), :secure => true),
:large_photo_url => S3Util.url(aws_bucket, escape_filename(cropped_large_s3_path), :secure => true))
end
def delete_photo(aws_bucket)

View File

@ -50,7 +50,7 @@ module JamRuby
end
def self.ready_to_clean
JamTrackRight.where("downloaded_since_sign=? AND updated_at <= ?", true, 5.minutes.ago).limit(1000)
JamTrackRight.where("downloaded_since_sign=? AND updated_at <= ?", true, 5.minutes.ago).limit(1000)
end
def finish_errored(error_reason, error_detail, sample_rate)
@ -98,7 +98,7 @@ module JamRuby
# but the url is short lived enough so that it wouldn't be easily shared
def sign_url(expiration_time = 120, bitrate=48)
field_name = (bitrate==48) ? "url_48" : "url_44"
s3_manager.sign_url(self[field_name], {:expires => expiration_time, :secure => false})
s3_manager.sign_url(self[field_name], {:expires => expiration_time, :secure => true})
end
def delete_s3_files

View File

@ -60,7 +60,7 @@ module JamRuby
def preview_public_url(media_type='ogg')
url = media_type == 'ogg' ? self[:preview_url] : self[:preview_mp3_url]
if url
s3_public_manager.public_url(url,{ :secure => false})
s3_public_manager.public_url(url,{ :secure => true})
else
nil
end
@ -87,7 +87,7 @@ module JamRuby
# we would verify their rights (can_download?), and generates a URL in response to the click so that they can download
# but the url is short lived enough so that it wouldn't be easily shared
def sign_url(expiration_time = 120, sample_rate=48)
s3_manager.sign_url(url_by_sample_rate(sample_rate), {:expires => expiration_time, :response_content_type => 'audio/ogg', :secure => false})
s3_manager.sign_url(url_by_sample_rate(sample_rate), {:expires => expiration_time, :response_content_type => 'audio/ogg', :secure => true})
end
def can_download?(user)

View File

@ -131,9 +131,10 @@ module JamRuby
end
end
uri = URI(sign_url(field))
url = sign_url(field)
uri = URI(url)
open downloaded_filename, 'wb' do |io|
Net::HTTP.start(uri.host, uri.port) do |http|
Net::HTTP.start(uri.host, uri.port, use_ssl: url.start_with?('https') ? true : false) do |http|
request = Net::HTTP::Get.new uri
http.request request do |response|
response_code = response.code.to_i

View File

@ -305,7 +305,7 @@ module JamRuby
# if the url starts with http, just return it because it's in some other store. Otherwise it's a relative path in s3 and needs be signed
def resolve_url(url_field, mime_type, expiration_time)
self[url_field].start_with?('http') ? self[url_field] : s3_manager.sign_url(self[url_field], {:expires => expiration_time, :response_content_type => mime_type, :secure => false})
self[url_field].start_with?('http') ? self[url_field] : s3_manager.sign_url(self[url_field], {:expires => expiration_time, :response_content_type => mime_type, :secure => true})
end
def sign_url(expiration_time = 120, type='ogg')

View File

@ -39,7 +39,7 @@ module JamRuby
end
def sign_url(expiration_time = 120)
s3_manager.sign_url(self[:file_url], {:expires => expiration_time, :secure => false})
s3_manager.sign_url(self[:file_url], {:expires => expiration_time, :secure => true})
end
private

View File

@ -219,7 +219,7 @@ module JamRuby
# if the url starts with http, just return it because it's in some other store. Otherwise it's a relative path in s3 and needs be signed
def resolve_url(url_field, mime_type, expiration_time)
self[url_field].start_with?('http') ? self[url_field] : s3_manager.sign_url(self[url_field], {:expires => expiration_time, :response_content_type => mime_type, :secure => false})
self[url_field].start_with?('http') ? self[url_field] : s3_manager.sign_url(self[url_field], {:expires => expiration_time, :response_content_type => mime_type, :secure => true})
end
def sign_url(expiration_time = 120, type='ogg')
@ -232,6 +232,7 @@ module JamRuby
end
end
# this is not 'secure' because, in testing, the PUT failed often in Ruby. should investigate more.
def sign_put(expiration_time = 3600 * 24, type='ogg')
type ||= 'ogg'
if type == 'ogg'

View File

@ -41,7 +41,7 @@ module JamRuby
end
def sign_url(expiration_time = 120)
s3_manager.sign_url(self[:url], {:expires => expiration_time, :response_content_type => 'audio/ogg', :secure => false})
s3_manager.sign_url(self[:url], {:expires => expiration_time, :response_content_type => 'audio/ogg', :secure => true})
end
def can_download?(some_user)

View File

@ -148,7 +148,7 @@ module JamRuby
end
def sign_url(expiration_time = 120)
s3_manager.sign_url(self[:url], {:expires => expiration_time, :response_content_type => 'audio/ogg', :secure => false})
s3_manager.sign_url(self[:url], {:expires => expiration_time, :response_content_type => 'audio/ogg', :secure => true})
end
def upload_start(length, md5)

View File

@ -1259,8 +1259,8 @@ module JamRuby
:cropped_s3_path => cropped_s3_path,
:cropped_large_s3_path => cropped_large_s3_path,
:crop_selection => crop_selection,
:photo_url => S3Util.url(aws_bucket, escape_filename(cropped_s3_path), :secure => false),
:large_photo_url => S3Util.url(aws_bucket, escape_filename(cropped_large_s3_path), :secure => false)
:photo_url => S3Util.url(aws_bucket, escape_filename(cropped_s3_path), :secure => true),
:large_photo_url => S3Util.url(aws_bucket, escape_filename(cropped_large_s3_path), :secure => true)
)
end

View File

@ -72,7 +72,7 @@ module JamRuby
uri = URI(filename)
open download_filename, 'wb' do |io|
begin
Net::HTTP.start(uri.host, uri.port) do |http|
Net::HTTP.start(uri.host, uri.port, use_ssl: filename.start_with?('https') ? true : false) do |http|
request = Net::HTTP::Get.new uri
http.request request do |response|
response_code = response.code.to_i
@ -165,6 +165,7 @@ module JamRuby
uri = URI.parse(@postback_ogg_url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = @postback_ogg_url.start_with?('https') ? true : false
request = Net::HTTP::Put.new(uri.request_uri)
response = nil
@ -186,6 +187,7 @@ module JamRuby
uri = URI.parse(@postback_mp3_url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = @postback_mp3_url.start_with?('https') ? true : false
request = Net::HTTP::Put.new(uri.request_uri)
response = nil

View File

@ -79,6 +79,7 @@ module JamRuby
uri = URI.parse(@postback_mp3_url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = @postback_mp3_url.start_with?('https') ? true : false
request = Net::HTTP::Put.new(uri.request_uri)
response = nil

View File

@ -22,6 +22,7 @@ describe JamTracksCleaner do
end
it "should clean" do
pending "re-enable cleaner after manual testing"
jam_track_right = JamTrackRight.create(:user=>@user, :jam_track=>@jam_track)
jam_track_right.signed_48=true
jam_track_right
@ -48,6 +49,6 @@ describe JamTracksCleaner do
# But not after running cleaner job:
JamRuby::JamTracksCleaner.perform
s3.exists?(url).should be_false
s3.exists?(url).should be_false
end
end

View File

@ -9,6 +9,7 @@ context.JK.AccountJamTracks = class AccountJamTracks
@logger = context.JK.logger
@screen = null
@userId = context.JK.currentUserId;
@sessionUtils = context.JK.SessionUtils
initialize:() =>
screenBindings =
@ -27,26 +28,34 @@ context.JK.AccountJamTracks = class AccountJamTracks
populateJamTracks:(data) =>
if (data.jamtracks? && data.jamtracks.length > 0)
@screen.find(".no-jamtracks-found").addClass("hidden")
@appendJamTracks context._.template($('#template-account-jamtrack').html(), {jamtracks:data.jamtracks}, { variable: 'data' })
@appendJamTracks(data)
@screen.find('.jamtrack-solo-session').on 'click', @soloSession
@screen.find('.jamtrack-group-session').on 'click', @groupSession
else
@screen.find(".no-jamtracks-found").removeClass("hidden")
appendJamTracks:(template) =>
$('#account-my-jamtracks table tbody').replaceWith template
appendJamTracks:(data) =>
$tbody = $('#account-my-jamtracks table tbody')
$tbody.empty()
for jamTrack in data.jamtracks
$template = $(context._.template($('#template-account-jamtrack').html(), {jamtrack:jamTrack}, { variable: 'data' }))
$template.data('jamTrack', jamTrack)
$tbody.append($template)
soloSession:(e) =>
#context.location="client#/createSession"
jamRow = $(e.target).parents("tr")
@createSession(jamRow.data(), true)
@createSession(jamRow.data(), true, jamRow.data('jamTrack'))
groupSession:(e) =>
#context.location="client#/createSession"
jamRow = $(e.target).parents("tr")
@createSession(jamRow.data(), false)
@createSession(jamRow.data(), false, jamRow.data('jamTrack'))
createSession:(sessionData, solo) =>
createSession:(sessionData, solo, jamTrack) =>
tracks = context.JK.TrackHelpers.getUserTracks(context.jamClient)
if (context.JK.guardAgainstBrowser(@app))
@ -75,6 +84,7 @@ context.JK.AccountJamTracks = class AccountJamTracks
rest.legacyCreateSession(data).done((response) =>
newSessionId = response.id
@sessionUtils.setAutoOpenJamTrack(jamTrack) # so that the session screen will pick this up
context.location = '/client#/session/' + newSessionId
# Re-loading the session settings will cause the form to reset with the right stuff in it.
# This is an extra xhr call, but it keeps things to a single codepath

View File

@ -0,0 +1,215 @@
(function (context, $) {
"use strict";
context.JK = context.JK || {};
context.JK.CheckoutCompleteScreen = function (app) {
var EVENTS = context.JK.EVENTS;
var logger = context.JK.logger;
var rest = context.JK.Rest();
var jamTrackUtils = context.JK.JamTrackUtils;
var checkoutUtils = context.JK.CheckoutUtilsInstance;
var $screen = null;
var $navigation = null;
var $templatePurchasedJamTrack = null;
var $thanksPanel = null;
var $jamTrackInBrowser = null;
var $purchasedJamTrack = null;
var $purchasedJamTrackHeader = null;
var $purchasedJamTracks = null;
var userDetail = null;
var step = null;
var downloadJamTracks = [];
var purchasedJamTracks = null;
var purchasedJamTrackIterator = 0;
var $backBtn = null;
var $downloadApplicationLink = null;
var $noPurchasesPrompt = null;
function beforeShow() {
}
function afterShow(data) {
prepThanks()
}
function beforeHide() {
if(downloadJamTracks) {
context._.each(downloadJamTracks, function(downloadJamTrack) {
downloadJamTrack.destroy();
downloadJamTrack.root.remove();
})
downloadJamTracks = [];
}
purchasedJamTracks = null;
purchasedJamTrackIterator = 0;
}
function prepThanks() {
$noPurchasesPrompt.addClass('hidden')
$purchasedJamTracks.empty()
$thanksPanel.addClass("hidden")
$purchasedJamTrackHeader.attr('status', 'in-progress')
step = 3;
renderNavigation();
showThanks();
}
function showThanks(purchaseResponse) {
var purchaseResponse = checkoutUtils.getLastPurchase();
if(!purchaseResponse || purchaseResponse.length == 0) {
// user got to this page with no context
logger.debug("no purchases found; nothing to show")
$noPurchasesPrompt.removeClass('hidden')
}
else {
$thanksPanel.removeClass('hidden')
handleJamTracksPurchased(purchaseResponse.jam_tracks)
}
}
function handleJamTracksPurchased(jamTracks) {
// were any JamTracks purchased?
var jamTracksPurchased = jamTracks && jamTracks.length > 0;
if(jamTracksPurchased) {
if(gon.isNativeClient) {
startDownloadJamTracks(jamTracks)
}
else {
$jamTrackInBrowser.removeClass('hidden');
app.user().done(function(user) {
if(!user.first_downloaded_client_at) {
$downloadApplicationLink.removeClass('hidden')
}
})
}
}
}
function startDownloadJamTracks(jamTracks) {
// there can be multiple purchased JamTracks, so we cycle through them
purchasedJamTracks = jamTracks;
// populate list of jamtracks purchased, that we will iterate through graphically
context._.each(jamTracks, function(jamTrack) {
var downloadJamTrack = new context.JK.DownloadJamTrack(app, jamTrack, 'small');
var $purchasedJamTrack = $(context._.template(
$templatePurchasedJamTrack.html(),
jamTrack,
{variable: 'data'}
));
$purchasedJamTracks.append($purchasedJamTrack)
// show it on the page
$purchasedJamTrack.append(downloadJamTrack.root)
downloadJamTracks.push(downloadJamTrack)
})
iteratePurchasedJamTracks();
}
function iteratePurchasedJamTracks() {
if(purchasedJamTrackIterator < purchasedJamTracks.length ) {
var downloadJamTrack = downloadJamTracks[purchasedJamTrackIterator++];
// make sure the 'purchasing JamTrack' section can be seen
$purchasedJamTrack.removeClass('hidden');
// the widget indicates when it gets to any transition; we can hide it once it reaches completion
$(downloadJamTrack).on(EVENTS.JAMTRACK_DOWNLOADER_STATE_CHANGED, function(e, data) {
if(data.state == downloadJamTrack.states.synchronized) {
logger.debug("jamtrack " + downloadJamTrack.jamTrack.name + " synchronized;")
//downloadJamTrack.root.remove();
downloadJamTrack.destroy();
// go to the next JamTrack
iteratePurchasedJamTracks()
}
})
logger.debug("jamtrack " + downloadJamTrack.jamTrack.name + " downloader initializing")
// kick off the download JamTrack process
downloadJamTrack.init()
// XXX style-test code
// downloadJamTrack.transitionError("package-error", "The server failed to create your package.")
}
else {
logger.debug("done iterating over purchased JamTracks")
$purchasedJamTrackHeader.attr('status', 'done')
}
}
function clearOrderPage() {
$orderContent.empty();
}
function renderNavigation() {
$navigation.html("");
var navigationHtml = $(
context._.template(
$('#template-checkout-navigation').html(),
{current: step, purchases_disable_class: gon.global.purchases_enabled ? 'hidden' : ''},
{variable: 'data'}
)
);
$navigation.append(navigationHtml);
}
function events() {
$backBtn.on('click', function(e) {
e.preventDefault();
context.location = '/client#/checkoutOrder'
})
}
function initialize() {
var screenBindings = {
'beforeShow': beforeShow,
'afterShow': afterShow,
'beforeHide': beforeHide
};
app.bindScreen('checkoutComplete', screenBindings);
$screen = $("#checkoutCompleteScreen");
$navigation = $screen.find(".checkout-navigation-bar");
$templatePurchasedJamTrack = $('#template-purchased-jam-track');
$thanksPanel = $screen.find(".thanks-panel");
$jamTrackInBrowser = $screen.find(".thanks-detail.jam-tracks-in-browser");
$purchasedJamTrack = $thanksPanel.find(".thanks-detail.purchased-jam-track");
$purchasedJamTrackHeader = $purchasedJamTrack.find(".purchased-jam-track-header");
$purchasedJamTracks = $purchasedJamTrack.find(".purchased-list")
$backBtn = $screen.find('.back');
$downloadApplicationLink = $screen.find('.download-jamkazam-wrapper');
$noPurchasesPrompt = $screen.find('.no-purchases-prompt')
if ($screen.length == 0) throw "$screen must be specified";
if ($navigation.length == 0) throw "$navigation must be specified";
events();
}
this.initialize = initialize;
return this;
}
})
(window, jQuery);

View File

@ -13,24 +13,14 @@
var $screen = null;
var $navigation = null;
var $templateOrderContent = null;
var $templatePurchasedJamTrack = null;
var $orderPanel = null;
var $thanksPanel = null;
var $jamTrackInBrowser = null;
var $purchasedJamTrack = null;
var $purchasedJamTrackHeader = null;
var $purchasedJamTracks = null;
var $orderContent = null;
var userDetail = null;
var step = null;
var downloadJamTracks = [];
var purchasedJamTracks = null;
var purchasedJamTrackIterator = 0;
var $backBtn = null;
var $orderPrompt = null;
var $emptyCartPrompt = null;
var $noAccountInfoPrompt = null;
var $downloadApplicationLink = null;
function beforeShow() {
@ -44,26 +34,14 @@
function beforeHide() {
if(downloadJamTracks) {
context._.each(downloadJamTracks, function(downloadJamTrack) {
downloadJamTrack.destroy();
downloadJamTrack.root.remove();
})
downloadJamTracks = [];
}
purchasedJamTracks = null;
purchasedJamTrackIterator = 0;
}
function beforeShowOrder() {
$purchasedJamTracks.empty()
$orderPrompt.addClass('hidden')
$emptyCartPrompt.addClass('hidden')
$noAccountInfoPrompt.addClass('hidden')
$orderPanel.removeClass("hidden")
$thanksPanel.addClass("hidden")
$purchasedJamTrackHeader.attr('status', 'in-progress')
$screen.find(".place-order").addClass('disabled').off('click', placeOrder)
$("#order_error").text('').addClass("hidden")
step = 3;
@ -254,92 +232,18 @@
}
function moveToThanks(purchaseResponse) {
checkoutUtils.setLastPurchase(purchaseResponse)
checkoutUtils.deletePreserveBillingInfo()
$("#order_error").addClass("hidden")
$orderPanel.addClass("hidden")
$thanksPanel.removeClass("hidden")
checkoutUtils.deletePreserveBillingInfo()
//$thanksPanel.removeClass("hidden")
jamTrackUtils.checkShoppingCart()
app.refreshUser()
handleJamTracksPurchased(purchaseResponse.jam_tracks)
window.location = '/client#/checkoutComplete'
}
function handleJamTracksPurchased(jamTracks) {
// were any JamTracks purchased?
var jamTracksPurchased = jamTracks && jamTracks.length > 0;
if(jamTracksPurchased) {
if(gon.isNativeClient) {
startDownloadJamTracks(jamTracks)
}
else {
$jamTrackInBrowser.removeClass('hidden');
app.user().done(function(user) {
if(!user.first_downloaded_client_at) {
$downloadApplicationLink.removeClass('hidden')
}
})
}
}
}
function startDownloadJamTracks(jamTracks) {
// there can be multiple purchased JamTracks, so we cycle through them
purchasedJamTracks = jamTracks;
// populate list of jamtracks purchased, that we will iterate through graphically
context._.each(jamTracks, function(jamTrack) {
var downloadJamTrack = new context.JK.DownloadJamTrack(app, jamTrack, 'small');
var $purchasedJamTrack = $(context._.template(
$templatePurchasedJamTrack.html(),
jamTrack,
{variable: 'data'}
));
$purchasedJamTracks.append($purchasedJamTrack)
// show it on the page
$purchasedJamTrack.append(downloadJamTrack.root)
downloadJamTracks.push(downloadJamTrack)
})
iteratePurchasedJamTracks();
}
function iteratePurchasedJamTracks() {
if(purchasedJamTrackIterator < purchasedJamTracks.length ) {
var downloadJamTrack = downloadJamTracks[purchasedJamTrackIterator++];
// make sure the 'purchasing JamTrack' section can be seen
$purchasedJamTrack.removeClass('hidden');
// the widget indicates when it gets to any transition; we can hide it once it reaches completion
$(downloadJamTrack).on(EVENTS.JAMTRACK_DOWNLOADER_STATE_CHANGED, function(e, data) {
if(data.state == downloadJamTrack.states.synchronized) {
logger.debug("jamtrack " + downloadJamTrack.jamTrack.name + " synchronized;")
//downloadJamTrack.root.remove();
downloadJamTrack.destroy();
// go to the next JamTrack
iteratePurchasedJamTracks()
}
})
logger.debug("jamtrack " + downloadJamTrack.jamTrack.name + " downloader initializing")
// kick off the download JamTrack process
downloadJamTrack.init()
// XXX style-test code
// downloadJamTrack.transitionError("package-error", "The server failed to create your package.")
}
else {
logger.debug("done iterating over purchased JamTracks")
$purchasedJamTrackHeader.attr('status', 'done')
}
}
function clearOrderPage() {
$orderContent.empty();
@ -377,19 +281,12 @@
$screen = $("#checkoutOrderScreen");
$navigation = $screen.find(".checkout-navigation-bar");
$templateOrderContent = $("#template-order-content");
$templatePurchasedJamTrack = $('#template-purchased-jam-track');
$orderPanel = $screen.find(".order-panel");
$thanksPanel = $screen.find(".thanks-panel");
$jamTrackInBrowser = $screen.find(".thanks-detail.jam-tracks-in-browser");
$purchasedJamTrack = $thanksPanel.find(".thanks-detail.purchased-jam-track");
$purchasedJamTrackHeader = $purchasedJamTrack.find(".purchased-jam-track-header");
$purchasedJamTracks = $purchasedJamTrack.find(".purchased-list")
$backBtn = $screen.find('.back');
$orderPrompt = $screen.find('.order-prompt');
$emptyCartPrompt = $screen.find('.empty-cart-prompt');
$noAccountInfoPrompt = $screen.find('.no-account-info-prompt');
$orderContent = $orderPanel.find(".order-content");
$downloadApplicationLink = $screen.find('.download-jamkazam-wrapper');
if ($screen.length == 0) throw "$screen must be specified";
if ($navigation.length == 0) throw "$navigation must be specified";

View File

@ -7,6 +7,8 @@ class CheckoutUtils
@logger = context.JK.logger
@rest = new context.JK.Rest();
@cookie_name = "preserve_billing"
@lastPurchaseResponse = null
init: () =>
refreshPreserveBillingInfo:() =>
@ -35,6 +37,11 @@ class CheckoutUtils
value = $.cookie(@cookie_name)
value?
setLastPurchase: (purchaseResponse) =>
@lastPurchaseResponse = purchaseResponse
getLastPurchase: () =>
return @lastPurchaseResponse
# global instance

View File

@ -85,7 +85,7 @@
$tbody.on('click', 'tr', function(e) {
var jamTrack = $(this).data('server-model');
// tell the server we are about to start a recording
// tell the server we are about to open a jamtrack
rest.openJamTrack({id: context.JK.CurrentSessionModel.id(), jam_track_id: jamTrack.id})
.done(function(response) {
$dialog.data('result', {success:true, jamTrack: jamTrack})

View File

@ -62,10 +62,16 @@ context.JK.JamTrackScreen=class JamTrackScreen
if(parms.artist?)
@artist.val(parms.artist)
else
@artist.val('')
if(parms.instrument?)
@instrument.val(parms.instrument)
else
@instrument.val('')
if(parms.availability?)
@availability.val(parms.availability)
else
@availability.val('')
window.history.replaceState({}, "", "/client#/jamtrackBrowse")
getParams:() =>

View File

@ -101,10 +101,10 @@
function startDrag(e, ui) {
dragging = true;
playingWhenDragStart = playbackPlaying;
draggingUpdateTimer = setInterval(function() { canUpdateBackend = true; }, 333); // only call backend up to 3 times a second while dragging
if(playingWhenDragStart) {
stopPlay();
}
//draggingUpdateTimer = setInterval(function() { canUpdateBackend = true; }, 333); // only call backend up to 3 times a second while dragging
//if(playingWhenDragStart) {
//stopPlay();
//}
}
function stopDrag(e, ui) {
@ -114,11 +114,12 @@
canUpdateBackend = true;
updateOffsetBasedOnPosition(ui.position.left);
updateSliderPosition(playbackPositionMs);
if(playingWhenDragStart) {
playingWhenDragStart = false;
startPlay();
}
//if(playingWhenDragStart) {
// playingWhenDragStart = false;
// startPlay();
//}
}
function onDrag(e, ui) {

View File

@ -305,7 +305,8 @@
window.location="/client#/home"
}
})
.done(function() {logger.debug("user has passed all session guards")
.done(function() {
logger.debug("user has passed all session guards")
promptLeave = true;
var sessionModel = context.JK.CurrentSessionModel;
@ -489,7 +490,25 @@
else {
app.notifyServerError(xhr, 'Unable to Join Session');
}
});
})
.done(function() {
// check if this is a auto-load jamtrack situation (came from account jamtrack screen)
var jamTrack = sessionUtils.grabAutoOpenJamTrack();
if(jamTrack) {
// give the session to settle just a little (call a timeout of 1 second)
setTimeout(function() {
// tell the server we are about to open a jamtrack
rest.openJamTrack({id: context.JK.CurrentSessionModel.id(), jam_track_id: jamTrack.id})
.done(function(response) {
// now actually load the jamtrack
loadJamTrack(jamTrack);
})
.fail(function(jqXHR) {
app.notifyServerError(jqXHR, "Unable to Open JamTrack For Playback");
})
}, 1000)
}
})
})
}
@ -1276,7 +1295,7 @@
}
function renderJamTracks(jamTrackMixersOrig) {
logger.debug("rendering jam tracks")
logger.debug("rendering jam tracks", jamTrackMixersOrig);
var jamTrackMixers = jamTrackMixersOrig.slice();
var jamTracks = []
@ -2699,69 +2718,7 @@
// once the dialog is closed, see if the user has a jamtrack selected
if(!data.canceled && data.result.jamTrack) {
var jamTrack = data.result.jamTrack;
$('.session-recording-name').text('');
// hide 'other audio' placeholder
otherAudioFilled();
if(downloadJamTrack) {
// if there was one showing before somehow, destroy it.
logger.warn("destroying existing JamTrack")
downloadJamTrack.root.remove();
downloadJamTrack.destroy();
downloadJamTrack = null
}
downloadJamTrack = new context.JK.DownloadJamTrack(app, jamTrack, 'large');
// the widget indicates when it gets to any transition; we can hide it once it reaches completion
$(downloadJamTrack).on(EVENTS.JAMTRACK_DOWNLOADER_STATE_CHANGED, function(e, data) {
if(data.state == downloadJamTrack.states.synchronized) {
logger.debug("jamtrack synchronized; hide widget and show tracks")
downloadJamTrack.root.remove();
downloadJamTrack.destroy();
downloadJamTrack = null;
// XXX: test with this removed; it should be unnecessary
context.jamClient.JamTrackStopPlay();
var sampleRate = context.jamClient.GetSampleRate()
var sampleRateForFilename = sampleRate == 48 ? '48' : '44'
var fqId = jamTrack.id + '-' + sampleRateForFilename
if(jamTrack.jmep)
{
logger.debug("setting jmep data")
context.jamClient.JamTrackLoadJmep(fqId, jamTrack.jmep)
}
else {
logger.debug("no jmep data for jamtrack")
}
// JamTrackPlay means 'load'
var result = context.jamClient.JamTrackPlay(fqId);
if(!result) {
app.notify(
{ title: "JamTrack Can Not Open",
text: "Unable to open your JamTrack. Please contact support@jamkazam.com"
}, null, true);
} else {
playJamTrack(jamTrack.id);
}
}
})
// show it on the page
$otherAudioContainer.append(downloadJamTrack.root)
// kick off the download JamTrack process
downloadJamTrack.init()
loadJamTrack(data.result.jamTrack);
}
else {
logger.debug("OpenJamTrack dialog closed with no selection; ignoring", data)
@ -2771,6 +2728,69 @@
return false;
}
function loadJamTrack(jamTrack) {
$('.session-recording-name').text('');
// hide 'other audio' placeholder
otherAudioFilled();
if(downloadJamTrack) {
// if there was one showing before somehow, destroy it.
logger.warn("destroying existing JamTrack")
downloadJamTrack.root.remove();
downloadJamTrack.destroy();
downloadJamTrack = null
}
downloadJamTrack = new context.JK.DownloadJamTrack(app, jamTrack, 'large');
// the widget indicates when it gets to any transition; we can hide it once it reaches completion
$(downloadJamTrack).on(EVENTS.JAMTRACK_DOWNLOADER_STATE_CHANGED, function(e, data) {
if(data.state == downloadJamTrack.states.synchronized) {
logger.debug("jamtrack synchronized; hide widget and show tracks")
downloadJamTrack.root.remove();
downloadJamTrack.destroy();
downloadJamTrack = null;
// XXX: test with this removed; it should be unnecessary
context.jamClient.JamTrackStopPlay();
var sampleRate = context.jamClient.GetSampleRate()
var sampleRateForFilename = sampleRate == 48 ? '48' : '44'
var fqId = jamTrack.id + '-' + sampleRateForFilename
if(jamTrack.jmep)
{
logger.debug("setting jmep data")
context.jamClient.JamTrackLoadJmep(fqId, jamTrack.jmep)
}
else {
logger.debug("no jmep data for jamtrack")
}
// JamTrackPlay means 'load'
var result = context.jamClient.JamTrackPlay(fqId);
if(!result) {
app.notify(
{ title: "JamTrack Can Not Open",
text: "Unable to open your JamTrack. Please contact support@jamkazam.com"
}, null, true);
} else {
playJamTrack(jamTrack.id);
}
}
})
// show it on the page
$otherAudioContainer.append(downloadJamTrack.root)
// kick off the download JamTrack process
downloadJamTrack.init()
}
function playJamTrack(jamTrackId) {
var participantCnt=sessionModel.participants().length
rest.playJamTrack(jamTrackId)
@ -3088,7 +3108,11 @@
logger.debug("calling jamClient.SessionTrackSeekMs(" + seek + ")");
if(data.playbackMonitorMode == context.JK.PLAYBACK_MONITOR_MODE.JAMTRACK) {
// this doesn't ever show anything, because of blocking nature of the seek call
//var $mediaSeeking = $screen.find('.media-seeking')
//$mediaSeeking.attr('data-mode', 'SEEKING')
context.jamClient.SessionJamTrackSeekMs(seek);
//$mediaSeeking.attr('data-mode', '')
}
else {
context.jamClient.SessionTrackSeekMs(seek);

View File

@ -10,6 +10,7 @@
var rest = new context.JK.Rest();
context.JK.SessionUtils = sessionUtils;
var logger = context.JK.logger;
var autoOpenJamTrack = null;
var LATENCY = sessionUtils.LATENCY = {
ME : {description: "ME", style: "latency-me", min: -1, max: -1},
@ -20,6 +21,18 @@
UNKNOWN: {description: "UNKNOWN", style: "latency-unknown", min: -2, max: -2}
};
sessionUtils.setAutoOpenJamTrack = function(jamTrack) {
logger.debug("setting auto-load jamtrack")
autoOpenJamTrack = jamTrack;
}
// one shot!
sessionUtils.grabAutoOpenJamTrack = function() {
var jamTrack = autoOpenJamTrack;
autoOpenJamTrack = null;
return jamTrack;
}
sessionUtils.createOpenSlot = function($openSlotsTemplate, slot, openSlotCount, currentSlotIndex) {
var inst = context.JK.getInstrumentIcon24(slot.instrument_id);

View File

@ -45,78 +45,3 @@
margin-left: 30px;
}
}
.thanks-panel {
padding: 30px;
span.notice {
font-style:italic;
font-size:12px;
}
br.purchase-downloads {
clear:both;
margin-bottom:20px;
}
.thanks-detail {
.download-jamkazam {
color:$ColorLink;
border-radius: 4px;
border-style:solid;
border-color:#AAA;
border-width:1px;
padding:10px;
margin-top:20px;
display:inline-block;
}
.download-jamkazam-wrapper {
text-align:center;
display:block;
&.hidden {
display:none;
}
}
}
.thanks-detail.purchased-jam-track {
margin-top:20px;
.purchased-jam-track-header {
font-size: 15px;
margin-bottom:10px;
span {
display:none;
}
&[status="in-progress"] {
span.in-progress-msg {
display:inline;
}
}
&[status="done"] {
span.done-msg {
display:inline;
}
}
}
ul.purchased-list {
float:left;
margin:20px 100px 0 20px;
li {
margin:0;
}
}
.download-jamtrack {
width:auto;
vertical-align: middle; // to make bullets mid-align when error shows
}
}
}

View File

@ -0,0 +1,116 @@
@import "client/common.css.scss";
#checkoutCompleteScreen {
p {
font-size:14px;
margin:0;
}
.order-prompt {
color:white;
line-height:125%;
}
h2 {
color:white;
background-color:#4d4d4d;
font-weight:normal;
margin: 0 0 10px 0;
font-size:14px;
padding: 3px 0 3px 10px;
height: 14px;
line-height: 14px;
vertical-align: middle;
text-align:left;
}
.action-bar {
margin-top:20px;
}
#checkout-info-help {
margin-right:1px;
}
.checkout-complete-wrapper {
padding:30px 30px;
}
.no-purchases-prompt {
}
.thanks-panel {
span.notice {
font-style:italic;
font-size:12px;
}
br.purchase-downloads {
clear:both;
margin-bottom:20px;
}
.thanks-detail {
.download-jamkazam {
color:$ColorLink;
border-radius: 4px;
border-style:solid;
border-color:#AAA;
border-width:1px;
padding:10px;
margin-top:20px;
display:inline-block;
}
.download-jamkazam-wrapper {
text-align:center;
display:block;
&.hidden {
display:none;
}
}
}
.thanks-detail.purchased-jam-track {
margin-top:20px;
.purchased-jam-track-header {
font-size: 15px;
margin-bottom:10px;
span {
display:none;
}
&[status="in-progress"] {
span.in-progress-msg {
display:inline;
}
}
&[status="done"] {
span.done-msg {
display:inline;
}
}
}
ul.purchased-list {
float:left;
margin:20px 100px 0 20px;
li {
margin:0;
}
}
.download-jamtrack {
width:auto;
vertical-align: middle; // to make bullets mid-align when error shows
}
}
}
}

View File

@ -61,6 +61,8 @@
*= require ./checkout_signin
*= require ./checkout_payment
*= require ./checkout_order
*= require ./checkout_complete
*= require ./genreSelector
*= require ./sessionList
*= require ./searchResults
*= require ./clientUpdate

View File

@ -85,7 +85,7 @@
top:3px ! important;
}
.jam-track-get-ready {
.jam-track-get-ready, .media-seeking {
display:none;
position:absolute;
top:-29px;
@ -96,11 +96,6 @@
line-height:32px;
left:50%;
&[data-mode="JAMTRACK"] {
&[data-current-time="0"] {
display:block;
}
}
.spinner-small {
vertical-align:middle;
display:inline-block;
@ -110,6 +105,14 @@
vertical-align:middle;
}
}
.jam-track-get-ready[data-mode="JAMTRACK"][data-current-time="0"] {
display:block;
}
.media-seeking[data-mode="SEEKING"] {
display:block;
}
}
.playback-mode-buttons {

View File

@ -5,6 +5,8 @@ class ApplicationController < ActionController::Base
include SessionsHelper
include ClientHelper
force_ssl port: Rails.application.config.external_port_ssl if Rails.application.config.force_ssl
# inject username/email into bugsnag data
before_bugsnag_notify :add_user_info_to_bugsnag

View File

@ -124,7 +124,7 @@
</div>
<div class="right">
<a id="account-my-jamtracks-link" href="#" class="button-orange">UPDATE</a>
<a id="account-my-jamtracks-link" href="#" class="button-orange">VIEW</a>
</div>
<br clear="all" />

View File

@ -31,14 +31,11 @@
a.button-grey href="javascript:history.go(-1)" BACK
script#template-account-jamtrack type='text/template'
tbody
= "{% _.each(data.jamtracks, function(jamtrack) { %}"
tr data-id="{{jamtrack.id}}" data-genre="{{jamtrack.genre}}"
td
| {{jamtrack.name}}
td
| {{jamtrack.original_artist}}
td
.table-link: a.jamtrack-solo-session href= '#' jamtrack-id="{{jamtrack.id}}" Get into solo session
.table-link: a.jamtrack-group-session href= '#' jamtrack-id="{{jamtrack.id}}" Get into session others can join
= "{% }); %}"
tr data-id="{{data.jamtrack.id}}" data-genre="{{data.jamtrack.genre}}"
td
| {{data.jamtrack.name}}
td
| {{data.jamtrack.original_artist}}
td
.table-link: a.jamtrack-solo-session href= '#' jamtrack-id="{{data.jamtrack.id}}" Get into solo session
.table-link: a.jamtrack-group-session href= '#' jamtrack-id="{{data.jamtrack.id}}" Get into session others can join

View File

@ -0,0 +1,44 @@
div layout="screen" layout-id="checkoutComplete" id="checkoutCompleteScreen" class="screen secondary"
.content
.content-head
.content-icon= image_tag("content/icon_shopping_cart.png", {:height => 19, :width => 19})
h1 check out
= render "screen_navigation"
.content-body
.content-body-scroller
.content-wrapper
.checkout-navigation-bar
.checkout-complete-wrapper
.no-purchases-prompt.hidden
| You have not made any purchases recently. Why not go go&nbsp;
a href="/client#/jamtrackBrowse" browse our collection of JamTracks
| ?
.thanks-panel
h2 Thank you for your order!
br
.thanks-detail We'll send you an email confirming your order shortly.
br
.thanks-detail.jam-tracks-in-browser.hidden
p To play your purchased JamTrack, launch the JamKazam application and open the JamTrack while in a session.
a.download-jamkazam-wrapper.hidden href="/downloads" rel="external"
.download-jamkazam
| Click Here to Get the Free JamKazam Application
.thanks-detail.purchased-jam-track.hidden
h2.purchased-jam-track-header status="in-progress"
span.in-progress-msg Downloading Your Purchased JamTracks
span.done-msg All purchased JamTracks have been downloaded successfully! You can now play them in a session.
span Each JamTrack will be downloaded sequentially.
br
span.notice Note that you do not have to wait for this to complete in order to use your JamTrack later.
br.clear
ul.purchased-list
.clearall
.action-bar
.right
a.button-grey href="#" id="checkout-info-help" HELP
a.button-orange.checkout-done href="/client#/home" DONE
.clearall
script type='text/template' id='template-purchased-jam-track'
li data-jam-track-id="{{data.jam_track_id}}"

View File

@ -31,25 +31,6 @@ div layout="screen" layout-id="checkoutOrder" id="checkoutOrderScreen" class="sc
a.button-grey.back href="#" BACK
a.button-orange.place-order href="#" PLACE YOUR ORDER
.clearall
.thanks-panel
h2 Thank you for your order!
br
.thanks-detail We'll send you an email confirming your order shortly.
br
.thanks-detail.jam-tracks-in-browser.hidden
p To play your purchased JamTrack, launch the JamKazam application and open the JamTrack while in a session.
a.download-jamkazam-wrapper.hidden href="/downloads" rel="external"
.download-jamkazam
| Click Here to Get the Free JamKazam Application
.thanks-detail.purchased-jam-track.hidden
h2.purchased-jam-track-header status="in-progress"
span.in-progress-msg Downloading Your Purchased JamTracks
span.done-msg All purchased JamTracks have been downloaded successfully! You can now play them in a session.
span Each JamTrack will be downloaded sequentially.
br
span.notice Note that you do not have to wait for this to complete in order to use your JamTrack later.
br.clear
ul.purchased-list

View File

@ -43,6 +43,7 @@
<%= render "checkout_signin" %>
<%= render "checkout_payment" %>
<%= render "checkout_order" %>
<%= render "checkout_complete" %>
<%= render "order" %>
<%= render "feed" %>
<%= render "bands" %>
@ -287,8 +288,8 @@
var checkoutOrderScreen = new JK.CheckoutOrderScreen(JK.app);
checkoutOrderScreen.initialize();
// var OrderScreen = new JK.OrderScreen(JK.app);
// OrderScreen.initialize();
var checkoutCompleteScreen = new JK.CheckoutCompleteScreen(JK.app);
checkoutCompleteScreen.initialize();
var findMusicianScreen = new JK.MusicianSearchFilter();
findMusicianScreen.init(JK.app);

View File

@ -39,6 +39,7 @@
<meta name="description" content="<%= meta_description(yield(:description)) %>">
<%= include_gon %>
<%= csrf_meta_tags %>
<%= render "shared/ad_sense" %>
</head>
<body>
<%= javascript_include_tag "application" %>

View File

@ -33,6 +33,7 @@
<%= render "layouts/social_meta" %>
<% end %>
<%= yield(:extra_js) %>
<%= render "shared/ad_sense" %>
</head>
<body class="jam" data-client-type="<%= @nativeClient ? 'client' : 'browser' %>">
<%= yield %>

View File

@ -29,6 +29,7 @@
<% else %>
<%= render "layouts/social_meta" %>
<% end %>
<%= render "shared/ad_sense" %>
</head>
<body class="corporate jam" data-purpose="<%= yield(:purpose) %>">

View File

@ -31,6 +31,7 @@
<% else %>
<%= render "layouts/social_meta" %>
<% end %>
<%= render "shared/ad_sense" %>
</head>
<body class="jam landing <%= yield(:page_name) %>">
<div class="dialog-overlay op70" style="display:none; width:100%; height:100%; z-index:99;"></div>

View File

@ -31,6 +31,7 @@
<% else %>
<%= render "layouts/social_meta" %>
<% end %>
<%= render "shared/ad_sense" %>
</head>
<body class="jam">
<div id="minimal-container">

View File

@ -31,6 +31,7 @@
<% else %>
<%= render "layouts/social_meta" %>
<% end %>
<%= render "shared/ad_sense" %>
</head>
<body class="web jam <%= yield(:page_name) %>">
<%= javascript_include_tag "web/web" %>

View File

@ -0,0 +1,3 @@
<% if Rails.application.config.ad_sense_enabled %>
<script type='text/javascript'>(function(A,d,S,t,a,g,e) { A['AdstageAnalytics']=a;A[a]=A[a]||function(){(A[a].q=A[a].q||[]).push(arguments)}; A[a].l=1*new Date();g=d.createElement(S),e=d.getElementsByTagName(S)[0]; g.async=1;g.src=t;e.parentNode.insertBefore(g, e); })(window, document, 'script', '//assets.adstage.io/analytics.js', '_as'); _as('create', '566750ff-ccf7-47ab-98d8-ea9746825704'); _as('send', 'pageview');</script>
<% end %>

View File

@ -122,13 +122,14 @@ if defined?(Bundler)
config.websocket_gateway_trusted_uri = "ws://localhost:#{config.websocket_gateway_port + 1}/websocket"
config.websocket_gateway_uri_ssl = "wss://localhost:#{config.websocket_gateway_port_ssl}/websocket"
config.websocket_gateway_trusted_uri_ssl = "wss://localhost:#{config.websocket_gateway_port_ssl + 1}/websocket"
config.force_ssl = ENV['FORCE_SSL'].nil? ? false : ENV['FORCE_SSL'] == 'true'
config.websocket_gateway_max_connections_per_user = 20
config.lock_connections = false
config.external_hostname = ENV['EXTERNAL_HOSTNAME'] || 'localhost'
config.external_port = ENV['EXTERNAL_PORT'] || 3000
config.external_protocol = ENV['EXTERNAL_PROTOCOL'] || 'http://'
config.external_port_ssl = ENV['EXTERNAL_PORT_ssl'] || 3443
config.external_root_url = "#{config.external_protocol}#{config.external_hostname}#{(config.external_port == 80 || config.external_port == 443) ? '' : ':' + config.external_port.to_s}"
config.admin_port = ENV['ADMIN_PORT'] || 3333
config.admin_root_url = "#{config.external_protocol}#{config.external_hostname}#{(config.admin_port == 80 || config.admin_port == 443) ? '' : ':' + config.admin_port.to_s}"
@ -339,5 +340,6 @@ if defined?(Bundler)
config.gear_check_ignore_high_latency = false
config.remove_whitespace_credit_card = false
config.estimate_taxes = true
config.ad_sense_enabled = false
end
end

View File

@ -809,8 +809,8 @@ describe "Checkout", :js => true, :type => :feature, :capybara_feature => true d
find('.order-items-value.order-total', text:'$1.99')
find('.order-items-value.shipping-handling', text:'$0.00')
find('.order-items-value.sub-total', text:'$1.99')
find('.order-items-value.taxes', text:'$0.00')
find('.order-items-value.grand-total', text:'$1.99')
find('.order-items-value.taxes', text:'$0.16')
find('.order-items-value.grand-total', text:'$2.15')
# click the ORDER button
find('.place-order-center a.button-orange.place-order').trigger(:click)
@ -820,6 +820,8 @@ describe "Checkout", :js => true, :type => :feature, :capybara_feature => true d
guy.reload
sleep 3 # challenge to all comers! WHY DO I HAVE TO SLEEP FOR THIS ASSERTION TO BE TRUE! GAH . and 1 second won't do it
jam_track_right = jamtrack_pearljam_evenflow.right_for_user(guy)
# make sure it appears the user actually bought the jamtrack!
jam_track_right.should_not be_nil