Merge branch 'develop' of bitbucket.org:jamkazam/jam-cloud into develop

This commit is contained in:
Jonathan Kolyer 2014-03-04 08:14:46 +00:00
commit b4c168c12a
18 changed files with 177 additions and 104 deletions

View File

@ -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

View File

@ -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>

View File

@ -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.

View File

@ -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>

View File

@ -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.

View File

@ -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";
}
}

View File

@ -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'});

View File

@ -46,6 +46,7 @@
return loaded;
}
function play(e) {
if(e) {
e.preventDefault();

View File

@ -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) {

View File

@ -187,7 +187,7 @@
})
}, 100);
}
else if(sessionModel.id() && text == 'RebuildMediaControl') {
else if(sessionModel.id() && (text == 'RebuildMediaControl' || text == 'RebuildRemoteUserControl')) {
sessionModel.refreshCurrentSession(true);
}
}

View File

@ -16,6 +16,10 @@
float:left;
}
div.test-user-desc {
font-style: italic !important;
}
#nav {
margin-top:40px;
margin-bottom:30px;

View File

@ -37,13 +37,7 @@
outline: 0;
}
&.no-mount[fan-access="true"]{
.play-button {
display:none;
}
}
&[fan-access="false"]{
&.no-mount{
.play-button {
display:none;
}

View File

@ -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]

View File

@ -18,6 +18,10 @@ class CorpsController < ApplicationController
end
def testimonials
end
def news
end

View File

@ -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

View File

@ -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">

View File

@ -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>

View File

@ -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'