Merge branch 'develop' of bitbucket.org:jamkazam/jam-cloud into develop
This commit is contained in:
commit
b4c168c12a
|
|
@ -191,12 +191,12 @@ ActiveAdmin.register_page "Bootstrap" do
|
|||
mount_template.mp3_metadata_interval = nil
|
||||
mount_template.mime_type ='audio/ogg'
|
||||
mount_template.subtype = 'vorbis'
|
||||
mount_template.fallback_mount = "/fallback-#{mount_template.bitrate}.ogg"
|
||||
#mount_template.fallback_mount = "/fallback-#{mount_template.bitrate}.ogg"
|
||||
else
|
||||
mount_template.mp3_metadata_interval = 4096
|
||||
mount_template.mime_type ='audio/mpeg'
|
||||
mount_template.subtype = nil
|
||||
mount_template.fallback_mount = "/fallback-#{mount_template.bitrate}.mp3"
|
||||
#mount_template.fallback_mount = "/fallback-#{mount_template.bitrate}.mp3"
|
||||
end
|
||||
mount_template.save!
|
||||
end
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@
|
|||
|
||||
<!-- CALL OUT BOX -->
|
||||
</font></p>
|
||||
<p style="margin-top:0px"><font size="2" color="#7FACBA" face="Arial, Helvetica, sans-serif">This email was sent to you because you have an account at <a href="http://www.jamkazam.com">Jamkazam</a>.
|
||||
<p style="margin-top:0px"><font size="2" color="#7FACBA" face="Arial, Helvetica, sans-serif">This email was sent to you because you have an account at <a href="http://www.jamkazam.com">JamKazam</a>.
|
||||
</td></tr></table>
|
||||
|
||||
</td>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
|
||||
<% unless @suppress_user_has_account_footer == true %>
|
||||
This email was sent to you because you have an account at Jamkazam / http://www.jamkazam.com.
|
||||
This email was sent to you because you have an account at JamKazam / http://www.jamkazam.com.
|
||||
<% end %>
|
||||
|
||||
Copyright <%= Time.now.year %> JamKazam, Inc. All rights reserved.
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
<!-- CALL OUT BOX -->
|
||||
</font></p>
|
||||
<p style="margin-top:0px"><font size="2" color="#7FACBA" face="Arial, Helvetica, sans-serif">This email was sent to you because you have an account at <a href="http://www.jamkazam.com">Jamkazam</a>.
|
||||
<p style="margin-top:0px"><font size="2" color="#7FACBA" face="Arial, Helvetica, sans-serif">This email was sent to you because you have an account at <a href="http://www.jamkazam.com">JamKazam</a>.
|
||||
</td></tr></table>
|
||||
|
||||
</td>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
|
||||
<% unless @suppress_user_has_account_footer == true %>
|
||||
This email was sent to you because you have an account at Jamkazam / http://www.jamkazam.com.
|
||||
This email was sent to you because you have an account at JamKazam / http://www.jamkazam.com.
|
||||
<% end %>
|
||||
|
||||
Copyright <%= Time.now.year %> JamKazam, Inc. All rights reserved.
|
||||
|
|
|
|||
|
|
@ -26,9 +26,9 @@
|
|||
|
||||
function populateAccount(userDetail) {
|
||||
|
||||
var audioProfiles = prettyPrintAudioProfiles(context.jamClient.TrackGetDevices());
|
||||
var validProfiles = prettyPrintAudioProfiles(context.JK.getGoodAudioConfigs());
|
||||
|
||||
var badAudioConfigs = context.JK.getBadAudioConfigs();
|
||||
var invalidProfiles = prettyPrintAudioProfiles(context.JK.getBadAudioConfigs());
|
||||
|
||||
var template = context.JK.fillTemplate($('#template-account-main').html(), {
|
||||
email: userDetail.email,
|
||||
|
|
@ -36,12 +36,10 @@
|
|||
location : userDetail.location,
|
||||
instruments : prettyPrintInstruments(userDetail.instruments),
|
||||
photoUrl : context.JK.resolveAvatarUrl(userDetail.photo_url),
|
||||
validProfiles : audioProfiles,
|
||||
invalidProfiles : badAudioConfigs.length > 0 ? badAudioConfigs.join(", ") : "N/A"
|
||||
validProfiles : validProfiles,
|
||||
invalidProfiles : invalidProfiles
|
||||
});
|
||||
$('#account-content-scroller').html(template);
|
||||
|
||||
badAudioConfigs.join(", ");
|
||||
}
|
||||
|
||||
function prettyPrintAudioProfiles(devices) {
|
||||
|
|
@ -57,7 +55,7 @@
|
|||
return profiles.substring(0, profiles.length - delimiter.length);
|
||||
}
|
||||
else {
|
||||
return "no qualified audio profiles"
|
||||
return "N/A";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,11 +32,12 @@
|
|||
|
||||
$('#account-audio-content-scroller table tbody').html('');
|
||||
|
||||
var badAudioConfigs = context.JK.getBadAudioConfigs();
|
||||
var validProfiles = context.JK.getGoodAudioConfigs();
|
||||
var invalidProfiles = context.JK.getBadAudioConfigs();
|
||||
|
||||
// render valid device profiles
|
||||
var options = {
|
||||
configurations: context.JK.getGoodAudioConfigs(),
|
||||
configurations: validProfiles,
|
||||
valid: 1
|
||||
}
|
||||
|
||||
|
|
@ -45,7 +46,7 @@
|
|||
|
||||
// render invalid device profiles
|
||||
options = {
|
||||
configurations: badAudioConfigs,
|
||||
configurations: invalidProfiles,
|
||||
valid: 0
|
||||
}
|
||||
template = context._.template($('#template-account-audio').html(), options, {variable: 'data'});
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@
|
|||
|
||||
return loaded;
|
||||
}
|
||||
|
||||
function play(e) {
|
||||
if(e) {
|
||||
e.preventDefault();
|
||||
|
|
|
|||
|
|
@ -132,6 +132,7 @@
|
|||
$audio.append(originalSource);
|
||||
audioDomElement = $audio.get(0);
|
||||
audioBind();
|
||||
logger.debug("recreated audio element ")
|
||||
}
|
||||
|
||||
function clearBufferTimeout() {
|
||||
|
|
@ -173,7 +174,7 @@
|
|||
clearBufferTimeout();
|
||||
|
||||
// tell audio to stop/start, in attempt to retry
|
||||
//audioDomElement.stop();
|
||||
//audioDomElement.pause();
|
||||
audioDomElement.load();
|
||||
audioDomElement.play();
|
||||
|
||||
|
|
@ -243,6 +244,10 @@
|
|||
if(isNoisyEvent('stalled')) return;
|
||||
logger.debug("stalled", arguments);
|
||||
|
||||
if(arguments[0].target !== audioDomElement) {
|
||||
logger.debug("ignoring stalled msg for non-active audio element")
|
||||
return;
|
||||
}
|
||||
// fires in Chrome on page load
|
||||
|
||||
if(playState == PlayStateBuffering || playState == PlayStatePlaying) {
|
||||
|
|
|
|||
|
|
@ -187,7 +187,7 @@
|
|||
})
|
||||
}, 100);
|
||||
}
|
||||
else if(sessionModel.id() && text == 'RebuildMediaControl') {
|
||||
else if(sessionModel.id() && (text == 'RebuildMediaControl' || text == 'RebuildRemoteUserControl')) {
|
||||
sessionModel.refreshCurrentSession(true);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,10 @@
|
|||
float:left;
|
||||
}
|
||||
|
||||
div.test-user-desc {
|
||||
font-style: italic !important;
|
||||
}
|
||||
|
||||
#nav {
|
||||
margin-top:40px;
|
||||
margin-bottom:30px;
|
||||
|
|
|
|||
|
|
@ -37,13 +37,7 @@
|
|||
outline: 0;
|
||||
}
|
||||
|
||||
&.no-mount[fan-access="true"]{
|
||||
.play-button {
|
||||
display:none;
|
||||
}
|
||||
}
|
||||
|
||||
&[fan-access="false"]{
|
||||
&.no-mount{
|
||||
.play-button {
|
||||
display:none;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ require 'aws-sdk'
|
|||
class ApiMusicSessionsController < ApiController
|
||||
|
||||
# have to be signed in currently to see this screen
|
||||
before_filter :api_signed_in_user, :except => [ :add_like ]
|
||||
before_filter :api_signed_in_user, :except => [ :add_like, :show ]
|
||||
before_filter :lookup_session, only: [:show, :update, :delete, :claimed_recording_start, :claimed_recording_stop, :track_sync]
|
||||
skip_before_filter :api_signed_in_user, only: [:perf_upload]
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,10 @@ class CorpsController < ApplicationController
|
|||
|
||||
end
|
||||
|
||||
def testimonials
|
||||
|
||||
end
|
||||
|
||||
def news
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,94 +1,100 @@
|
|||
object @music_session
|
||||
|
||||
attributes :id, :description, :musician_access, :approval_required, :fan_access, :fan_chat, :band_id, :user_id, :claimed_recording_initiator_id, :track_changes_counter
|
||||
if !current_user
|
||||
# there should be more data returned, but we need to think very carefully about what data is public for a music session
|
||||
attributes :id
|
||||
else
|
||||
|
||||
node :genres do |item|
|
||||
item.genres.map(&:description)
|
||||
end
|
||||
attributes :id, :description, :musician_access, :approval_required, :fan_access, :fan_chat, :band_id, :user_id, :claimed_recording_initiator_id, :track_changes_counter
|
||||
|
||||
if :is_recording?
|
||||
node do |music_session|
|
||||
{ :recording => partial("api_recordings/show", :object => music_session.recording) }
|
||||
node :genres do |item|
|
||||
item.genres.map(&:description)
|
||||
end
|
||||
|
||||
if :is_recording?
|
||||
node do |music_session|
|
||||
{ :recording => partial("api_recordings/show", :object => music_session.recording) }
|
||||
end
|
||||
end
|
||||
|
||||
node :share_url do |music_session|
|
||||
unless music_session.music_session_history.share_token.nil?
|
||||
share_token_url(music_session.music_session_history.share_token.token)
|
||||
end
|
||||
end
|
||||
|
||||
node :share_url do |music_session|
|
||||
unless music_session.music_session_history.share_token.nil?
|
||||
share_token_url(music_session.music_session_history.share_token.token)
|
||||
end
|
||||
end
|
||||
|
||||
child(:connections => :participants) {
|
||||
collection @music_sessions, :object_root => false
|
||||
attributes :ip_address, :client_id, :joined_session_at
|
||||
|
||||
node :user do |connection|
|
||||
{ :id => connection.user.id, :photo_url => connection.user.photo_url, :name => connection.user.name, :is_friend => connection.user.friends?(current_user), :connection_state => connection.aasm_state }
|
||||
end
|
||||
|
||||
child(:tracks => :tracks) {
|
||||
attributes :id, :connection_id, :instrument_id, :sound, :client_track_id, :updated_at
|
||||
}
|
||||
}
|
||||
child(:connections => :participants) {
|
||||
collection @music_sessions, :object_root => false
|
||||
attributes :ip_address, :client_id, :joined_session_at
|
||||
|
||||
node :user do |connection|
|
||||
{ :id => connection.user.id, :photo_url => connection.user.photo_url, :name => connection.user.name, :is_friend => connection.user.friends?(current_user), :connection_state => connection.aasm_state }
|
||||
end
|
||||
|
||||
child({:invitations => :invitations}) {
|
||||
attributes :id, :sender_id, :receiver_id
|
||||
}
|
||||
|
||||
# only show join_requests if the current_user is in the session
|
||||
node(:join_requests, :if => lambda { |music_session| music_session.users.exists?(current_user) } ) do |music_session|
|
||||
child(:join_requests => :join_requests) {
|
||||
attributes :id, :text
|
||||
child(:user => :user) {
|
||||
attributes :id, :name
|
||||
child(:tracks => :tracks) {
|
||||
attributes :id, :connection_id, :instrument_id, :sound, :client_track_id, :updated_at
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
# only show currently playing recording data if the current_user is in the session
|
||||
node(:claimed_recording, :if => lambda { |music_session| music_session.users.exists?(current_user) } ) do |music_session|
|
||||
|
||||
child(:claimed_recording => :claimed_recording) {
|
||||
attributes :id, :name, :description, :is_public
|
||||
child({:invitations => :invitations}) {
|
||||
attributes :id, :sender_id, :receiver_id
|
||||
}
|
||||
|
||||
child(:recording => :recording) {
|
||||
attributes :id, :created_at, :duration
|
||||
child(:band => :band) {
|
||||
attributes :id, :name
|
||||
}
|
||||
# only show join_requests if the current_user is in the session
|
||||
node(:join_requests, :if => lambda { |music_session| music_session.users.exists?(current_user) } ) do |music_session|
|
||||
child(:join_requests => :join_requests) {
|
||||
attributes :id, :text
|
||||
child(:user => :user) {
|
||||
attributes :id, :name
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
child(:mixes => :mixes) {
|
||||
attributes :id, :is_completed
|
||||
# only show currently playing recording data if the current_user is in the session
|
||||
node(:claimed_recording, :if => lambda { |music_session| music_session.users.exists?(current_user) } ) do |music_session|
|
||||
|
||||
node :mp3_url do |mix|
|
||||
mix[:mp3_url]
|
||||
end
|
||||
child(:claimed_recording => :claimed_recording) {
|
||||
attributes :id, :name, :description, :is_public
|
||||
|
||||
node :ogg_url do |mix|
|
||||
mix[:ogg_url]
|
||||
end
|
||||
}
|
||||
child(:recording => :recording) {
|
||||
attributes :id, :created_at, :duration
|
||||
child(:band => :band) {
|
||||
attributes :id, :name
|
||||
}
|
||||
|
||||
child(:recorded_tracks => :recorded_tracks) {
|
||||
attributes :id, :fully_uploaded, :client_track_id, :client_id, :instrument_id
|
||||
child(:mixes => :mixes) {
|
||||
attributes :id, :is_completed
|
||||
|
||||
node :url do |recorded_track|
|
||||
recorded_track[:url]
|
||||
node :mp3_url do |mix|
|
||||
mix[:mp3_url]
|
||||
end
|
||||
|
||||
child(:user => :user) {
|
||||
attributes :id, :first_name, :last_name, :city, :state, :country, :photo_url
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
node :ogg_url do |mix|
|
||||
mix[:ogg_url]
|
||||
end
|
||||
}
|
||||
|
||||
# only show mount info if fan_access is public. Eventually we'll also need to show this in other scenarios, like if invited
|
||||
child({:mount => :mount}, :if => lambda { |music_session| music_session.fan_access}) {
|
||||
attributes :id, :name, :sourced, :listeners, :bitrate, :subtype, :url
|
||||
node(:mime_type) { |mount| mount.resolve_string(:mime_type) }
|
||||
node(:bitrate) { |mount| mount.resolve_string(:bitrate) }
|
||||
node(:subtype) { |mount| mount.resolve_string(:subtype) }
|
||||
}
|
||||
child(:recorded_tracks => :recorded_tracks) {
|
||||
attributes :id, :fully_uploaded, :client_track_id, :client_id, :instrument_id
|
||||
|
||||
node :url do |recorded_track|
|
||||
recorded_track[:url]
|
||||
end
|
||||
|
||||
child(:user => :user) {
|
||||
attributes :id, :first_name, :last_name, :city, :state, :country, :photo_url
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
# only show mount info if fan_access is public. Eventually we'll also need to show this in other scenarios, like if invited
|
||||
child({:mount => :mount}, :if => lambda { |music_session| music_session.fan_access}) {
|
||||
attributes :id, :name, :sourced, :listeners, :bitrate, :subtype, :url
|
||||
node(:mime_type) { |mount| mount.resolve_string(:mime_type) }
|
||||
node(:bitrate) { |mount| mount.resolve_string(:bitrate) }
|
||||
node(:subtype) { |mount| mount.resolve_string(:subtype) }
|
||||
}
|
||||
end
|
||||
|
|
@ -28,15 +28,14 @@
|
|||
<div class="left mr20"><%= image_tag("content/icon_users.png", height: '58', width: '58') %></div>
|
||||
<br>
|
||||
|
||||
<h2>User Examples</h2>
|
||||
<h2>User Content</h2>
|
||||
<br clear="all"><br>
|
||||
|
||||
<ul class="media_links">
|
||||
<li><a href='#'>Band #1</a></li>
|
||||
<li><a href='#'>Band #2</a></li>
|
||||
<li><a href='#'>Band #3</a></li>
|
||||
<li><a href='#'>Individual User #1</a></li>
|
||||
<li><a href='#'>Individual User #2</a></li>
|
||||
<li><a href='/corp/testimonials'>User Testimonials</a></li>
|
||||
<li><a href='#'>Barton Strings</a></li>
|
||||
<li><a href='#'>LC Rocks</a></li>
|
||||
<li><a href='#'>Jazz Quartet</a></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td valign="top">
|
||||
|
|
|
|||
|
|
@ -0,0 +1,60 @@
|
|||
<% provide(:title, 'Testimonials') %>
|
||||
<% provide(:purpose, 'Testimonials') %>
|
||||
|
||||
<h1>Testimonials</h1>
|
||||
|
||||
<p><h2>JULIE BONK</h2></p>
|
||||
<div class="test-user-desc">Julie is a well-respected and oft-recorded pianist and teacher in jazz and blues improvisation, composition, and theory, and has mentored students including Grammy winner Norah Jones.</div><br/>
|
||||
<ul>
|
||||
<li>I've been hoping and waiting for something like this for a long time. It's amazing!</li>
|
||||
<li>I use Skype to give music lessons, but it won't work for rehearsals, and this will really help with preparation.</li>
|
||||
<li>I'll be using this every week.</li>
|
||||
</ul>
|
||||
|
||||
<br/>
|
||||
|
||||
<p><h2>JUSTIN PIERCE</h2></p>
|
||||
<div class="test-user-desc">Justin holds a master's degree in jazz studies, performs regularly with bands in Texas, and has played with John Clayton, The Temptations, Wayne Newton, and others.</div><br/>
|
||||
<ul>
|
||||
<li>The sound quality is exceptional. It reminds me of recording in a studio.</li>
|
||||
<li>The service met and exceeded my expectations, and I'm excited for its future.</li>
|
||||
<li>The sound quality is significantly better than Skype for giving remote lessons.</li>
|
||||
</ul>
|
||||
|
||||
<br/>
|
||||
|
||||
<p><h2>CHRIS BENNETT</h2></p>
|
||||
<div class="test-user-desc">Chris has decades of musical experience in touring bands, has been published in Classic Drummer and Not So Modern Drummer, started Bopworks Drumsticks, and teaches at the Austin School of Music.</div><br/>
|
||||
<ul>
|
||||
<li>Far from being futuristically cold and isolating, playing was way easier than a studio.</li>
|
||||
<li>Given the fact that I had never met, seen, or played with any of the musicians I played with using JamKazam, the experience was great.</li>
|
||||
</ul>
|
||||
|
||||
<br/>
|
||||
|
||||
<p><h2>SARA NELSON</h2></p>
|
||||
<div class="test-user-desc">Sara holds a bachelor's degree in music, performs as a cellist for the Austin Lyric Opera, and has also played with the Austin Symphony Orchestra and bands such as David Byrne and Bob Schneider.</div><br/>
|
||||
<ul>
|
||||
<li>JamKazam is a great tool for musicians who want to rehearse without the hassle of finding a common location to meet.</li>
|
||||
<li>Being able to play with people in different cities is very exciting!</li>
|
||||
</ul>
|
||||
|
||||
<br/>
|
||||
|
||||
<p><h2>GEORGE PRADO</h2></p>
|
||||
<div class="test-user-desc">George spent 15 years in LA performing and recording with numerous industry greats including Eartha Kitt and Chuck Berry, founded the legendary Regency Jazz Band, and has played and taught 40+ years.</div><br/>
|
||||
<ul>
|
||||
<li>An exciting tool with great sound and fidelity, this has unlimited potential for musicians and others in the entertainment industry, not to mention its use for educators. Check it out!</li>
|
||||
<li>Working for over 50 years as a professional musician, I am excited about this new method of sharing musical ideas. It allows me to connect with friends far away and close by through the means of this technology.</li>
|
||||
</ul>
|
||||
|
||||
<br/>
|
||||
|
||||
<p><h2>CHRIS MAX</h2></p>
|
||||
<div class="test-user-desc">Chris is the lead guitar player and backing vocalist for LC Rocks, which has been playing top Austin clubs since 2002, and also frequently plays solo gigs throughout Central Texas.</div><br/>
|
||||
<ul>
|
||||
<li>JamKazam, now here's a concept whose time has come!</li>
|
||||
<li>No loading gear, driving, or rehearsal room rental fees. Just plug into your home computer, interface with your bandmates, and start getting ready for your upcoming shows.</li>
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
|
@ -90,6 +90,7 @@ SampleApp::Application.routes.draw do
|
|||
match '/contact', to: 'corps#contact', as: 'corp_contact'
|
||||
match '/help', to: 'corps#help', as: 'corp_help'
|
||||
match '/media_center', to: 'corps#media_center', as: 'corp_media_center'
|
||||
match '/testimonials', to: 'corps#testimonials', as: 'corp_testimonials'
|
||||
match '/news', to: 'corps#news', as: 'corp_news'
|
||||
match '/privacy', to: 'corps#privacy', as: 'corp_privacy'
|
||||
match '/terms', to: 'corps#terms', as: 'corp_terms'
|
||||
|
|
|
|||
Loading…
Reference in New Issue