diff --git a/admin/app/admin/fake_purchaser.rb b/admin/app/admin/fake_purchaser.rb index b8c5caa31..87d167330 100644 --- a/admin/app/admin/fake_purchaser.rb +++ b/admin/app/admin/fake_purchaser.rb @@ -32,6 +32,7 @@ ActiveAdmin.register_page "Fake Purchaser" do jam_track_right.user = user jam_track_right.jam_track = jam_track jam_track_right.is_test_purchase = true + jam_track_right.version = jam_track.version jam_track_right.save! count = count + 1 end diff --git a/db/manifest b/db/manifest index 40053da47..c75998c34 100755 --- a/db/manifest +++ b/db/manifest @@ -313,4 +313,5 @@ jam_track_lang_idx.sql giftcard.sql add_description_to_crash_dumps.sql acappella.sql -purchasable_gift_cards.sql \ No newline at end of file +purchasable_gift_cards.sql +versionable_jamtracks.sql \ No newline at end of file diff --git a/db/up/versionable_jamtracks.sql b/db/up/versionable_jamtracks.sql new file mode 100644 index 000000000..9751bb940 --- /dev/null +++ b/db/up/versionable_jamtracks.sql @@ -0,0 +1 @@ +ALTER TABLE jam_track_rights ADD COLUMN version VARCHAR NOT NULL DEFAULT '0'; \ No newline at end of file diff --git a/ruby/lib/jam_ruby/jam_track_importer.rb b/ruby/lib/jam_ruby/jam_track_importer.rb index 429f00cc8..d0ed07404 100644 --- a/ruby/lib/jam_ruby/jam_track_importer.rb +++ b/ruby/lib/jam_ruby/jam_track_importer.rb @@ -56,7 +56,7 @@ module JamRuby #track.original_filename = wav_file click_track.original_audio_s3_path = click_track_file[:original_filename] click_track.track_type = 'Click' - click_track.part = 'Click' + click_track.part = 'Clicktrack' click_track.instrument_id = 'computer' click_track.jam_track = jam_track click_track.position = 10000 @@ -67,8 +67,12 @@ module JamRuby end end + jam_track.increment_version! + # with the click track in hand, flesh out the details synchronize_audio_track(jam_track, tmp_dir, false, click_track) + + finish('success', nil) end end end @@ -1255,7 +1259,6 @@ module JamRuby @@log.debug("#{self.name} track! instrument: #{parsed_wav[:instrument] ? parsed_wav[:instrument] : 'N/A'}, part: #{parsed_wav[:part] ? parsed_wav[:part] : 'N/A'}, filename: #{parsed_wav[:filename]} ") end - track.instrument_id = parsed_wav[:instrument] || 'other' track.track_type = 'Track' track.part = parsed_wav[:part] || "Other #{unknowns}" @@ -1266,6 +1269,13 @@ module JamRuby elsif parsed_wav[:type] == :clickwav file.file_type = 'ClickWav' addt_files << file + + # and also add a JamTrackTrack for this click track + track.track_type = 'Click' + track.part = 'Clicktrack' + track.instrument_id = 'computer' + track.position = 10000 + tracks << track elsif parsed_wav[:type] == :precount file.file_type = 'Precount' file.precount_num = parsed_wav[:precount_num] diff --git a/ruby/lib/jam_ruby/jam_tracks_manager.rb b/ruby/lib/jam_ruby/jam_tracks_manager.rb index d6ae37b1e..96ccf87f8 100644 --- a/ruby/lib/jam_ruby/jam_tracks_manager.rb +++ b/ruby/lib/jam_ruby/jam_tracks_manager.rb @@ -41,7 +41,7 @@ module JamRuby jam_file_opts="" jam_track.jam_track_tracks.each do |jam_track_track| - next if jam_track_track.track_type != "Track" # master mixes do not go into the JKZ + next if jam_track_track.track_type == "Master" # master mixes do not go into the JKZ # use the jam_track_track ID as the filename.ogg/.wav, because it's important metadata nm = jam_track_track.id + File.extname(jam_track_track.url_by_sample_rate(sample_rate)) @@ -52,7 +52,8 @@ module JamRuby step = bump_step(jam_track_right, step) copy_url_to_file(track_url, track_filename) - jam_file_opts << " -i #{Shellwords.escape("#{track_filename}+#{jam_track_track.part}")}" + part = jam_track_track.track_type == 'Click' ? 'ClickTrack' : jam_track_track.part + jam_file_opts << " -i #{Shellwords.escape("#{track_filename}+#{part}")}" end #puts "LS + " + `ls -la '#{tmp_dir}'` diff --git a/ruby/lib/jam_ruby/models/jam_track.rb b/ruby/lib/jam_ruby/models/jam_track.rb index 1eece1544..d5365c37e 100644 --- a/ruby/lib/jam_ruby/models/jam_track.rb +++ b/ruby/lib/jam_ruby/models/jam_track.rb @@ -86,6 +86,10 @@ module JamRuby after_save :sync_reproduction_royalty after_save :sync_onboarding_exceptions + def increment_version + self.version = version.to_i + 1 + save! + end def sync_reproduction_royalty @@ -341,7 +345,7 @@ module JamRuby query = query.where('genre_id = ? ', options[:genre]) end - query = query.where("jam_track_tracks.instrument_id = '#{options[:instrument]}' and jam_track_tracks.track_type != 'Master'") unless options[:instrument].blank? + query = query.where("jam_track_tracks.instrument_id = '#{options[:instrument]}' and jam_track_tracks.track_type = 'Track'") unless options[:instrument].blank? query = query.where("jam_tracks.sales_region = '#{options[:availability]}'") unless options[:availability].blank? # FIXME: n+1 queries for rights and genres diff --git a/ruby/lib/jam_ruby/models/jam_track_right.rb b/ruby/lib/jam_ruby/models/jam_track_right.rb index 808593322..63558f84a 100644 --- a/ruby/lib/jam_ruby/models/jam_track_right.rb +++ b/ruby/lib/jam_ruby/models/jam_track_right.rb @@ -14,6 +14,7 @@ module JamRuby belongs_to :last_mixdown, class_name: 'JamRuby::JamTrackMixdown', foreign_key: 'last_mixdown_id', inverse_of: :jam_track_right belongs_to :last_stem, class_name: 'JamRuby::JamTrackTrack', foreign_key: 'last_stem_id', inverse_of: :jam_track_right + validates :version, presence: true validates :user, presence: true validates :jam_track, presence: true validates :is_test_purchase, inclusion: {in: [true, false]} @@ -133,8 +134,33 @@ module JamRuby end end + def cleanup_old_package! + if self.jam_track.version != self.version + delete_s3_files + self[:url_48] = nil + self[:url_44] = nil + self.signing_queued_at = nil + self.signing_started_at_48 = nil + self.signing_started_at_44 = nil + self.last_signed_at = nil + self.current_packaging_step = nil + self.packaging_steps = nil + self.should_retry = false + self.signing_44 = false + self.signing_48 = false + self.signed_44 = false + self.signed_48 = false + self.queued = false + self.version = self.jam_track.version + self.save! + end + end # if the job is already signed, just queued up for signing, or currently signing, then don't enqueue... otherwise fire it off def enqueue_if_needed(sample_rate=48) + + # delete any package that's out dated + cleanup_old_package! + state = signing_state(sample_rate) if state == 'SIGNED' || state == 'SIGNING' || state == 'QUEUED' false @@ -148,9 +174,9 @@ module JamRuby # @return true if signed && file exists for the sample_rate specifed: def ready?(sample_rate=48) if sample_rate==48 - self.signed_48 && self.url_48.present? && self.url_48.file.exists? + self.signed_48 && self.url_48.present? && self.url_48.file.exists? && self.version == self.jam_track.version else - self.signed_44 && self.url_44.present? && self.url_44.file.exists? + self.signed_44 && self.url_44.present? && self.url_44.file.exists? && self.version == self.jam_track.version end end diff --git a/ruby/lib/jam_ruby/models/jam_track_search.rb b/ruby/lib/jam_ruby/models/jam_track_search.rb index 7a365ed60..4bbcde75b 100644 --- a/ruby/lib/jam_ruby/models/jam_track_search.rb +++ b/ruby/lib/jam_ruby/models/jam_track_search.rb @@ -75,7 +75,7 @@ module JamRuby sqlstr = "'#{instruments.join("','")}'" rel = rel.joins(:jam_track_tracks) rel = rel.where("jam_track_tracks.instrument_id IN (#{sqlstr})") - rel = rel.where("jam_track_tracks.track_type != 'Master'") + rel = rel.where("jam_track_tracks.track_type = 'Track'") end end diff --git a/ruby/lib/jam_ruby/models/sale.rb b/ruby/lib/jam_ruby/models/sale.rb index 9b0fb2047..cddf6b8d8 100644 --- a/ruby/lib/jam_ruby/models/sale.rb +++ b/ruby/lib/jam_ruby/models/sale.rb @@ -73,6 +73,7 @@ module JamRuby def self.ios_purchase(current_user, jam_track, receipt) jam_track_right = JamRuby::JamTrackRight.find_or_create_by_user_id_and_jam_track_id(current_user.id, jam_track.id) do |jam_track_right| jam_track_right.redeemed = false + jam_track_right.version = jam_track.version end end @@ -328,6 +329,7 @@ module JamRuby # create a JamTrackRight (this needs to be in a transaction too to make sure we don't make these by accident) jam_track_right = JamRuby::JamTrackRight.find_or_create_by_user_id_and_jam_track_id(current_user.id, jam_track.id) do |jam_track_right| jam_track_right.redeemed = shopping_cart.free? + jam_track_right.version = jam_track.version end # also if the purchase was a free one, then: diff --git a/web/app/assets/javascripts/download_jamtrack.js.coffee b/web/app/assets/javascripts/download_jamtrack.js.coffee index c4727631d..eb9846546 100644 --- a/web/app/assets/javascripts/download_jamtrack.js.coffee +++ b/web/app/assets/javascripts/download_jamtrack.js.coffee @@ -369,8 +369,8 @@ context.JK.DownloadJamTrack = class DownloadJamTrack @trackDetail = context.jamClient.JamTrackGetTrackDetail ("#{@jamTrack.id}-#{@sampleRateForFilename}") if @trackDetail.version? - @logger.error("after invalidating package, the version is still wrong!") - throw "after invalidating package, the version is still wrong!" + @logger.error("after invalidating package, the version is still wrong!", @trackDetail) + throw "after invalidating package, the version is still wrong! #{@trackDetail.version}" switch @trackDetail.key_state when 'pending' diff --git a/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee b/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee index 88fb5525b..f5d84ebdf 100644 --- a/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee @@ -30,19 +30,21 @@ MIX_MODES = context.JK.MIX_MODES ) for track in jamtrack.tracks - trackRow.tracks.push(track) - if track.track_type=='Master' - track.instrument_desc = "Master" - else - inst = '../assets/content/icon_instrument_default24.png' - if track.instrument? - if track.instrument.id in @instrument_logo_map - inst = @instrument_logo_map[track.instrument.id].asset - track.instrument_desc = track.instrument.description - track.instrument_url = inst - if track.part != '' - track.instrument_desc += ' (' + track.part + ')' + if track.track_type == 'Master' || track.track_type == 'Track' + trackRow.tracks.push(track) + if track.track_type == 'Master' + track.instrument_desc = "Master" + else if track.track_type == 'Track' + inst = '../assets/content/icon_instrument_default24.png' + if track.instrument? + if track.instrument.id in @instrument_logo_map + inst = @instrument_logo_map[track.instrument.id].asset + track.instrument_desc = track.instrument.description + track.instrument_url = inst + + if track.part != '' + track.instrument_desc += ' (' + track.part + ')' trackRow.free_state = if @state.is_free then 'free' else 'non-free' diff --git a/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee b/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee index 18cae8578..7ba13df37 100644 --- a/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee @@ -35,19 +35,22 @@ MIX_MODES = context.JK.MIX_MODES ) ### for track in jamtrack.tracks - trackRow.tracks.push(track) - if track.track_type=='Master' - track.instrument_desc = "Master" - else - inst = '../assets/content/icon_instrument_default24.png' - if track.instrument? - if track.instrument.id in @instrument_logo_map - inst = @instrument_logo_map[track.instrument.id].asset - track.instrument_desc = track.instrument.description - track.instrument_url = inst - if track.part != '' - track.instrument_desc += ' (' + track.part + ')' + if track.track_type == 'Master' || track.track_type == 'Track' + trackRow.tracks.push(track) + + if track.track_type == 'Master' + track.instrument_desc = "Master" + else if track.track_type == 'Track' + inst = '../assets/content/icon_instrument_default24.png' + if track.instrument? + if track.instrument.id in @instrument_logo_map + inst = @instrument_logo_map[track.instrument.id].asset + track.instrument_desc = track.instrument.description + track.instrument_url = inst + + if track.part != '' + track.instrument_desc += ' (' + track.part + ')' trackRow.free_state = if @state.is_free then 'free' else 'non-free' diff --git a/web/app/assets/javascripts/react-components/PopupJamTrackPlayer.js.jsx.coffee b/web/app/assets/javascripts/react-components/PopupJamTrackPlayer.js.jsx.coffee index 4857fdb0b..bd4c34779 100644 --- a/web/app/assets/javascripts/react-components/PopupJamTrackPlayer.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/PopupJamTrackPlayer.js.jsx.coffee @@ -32,6 +32,11 @@ mixins.push(Reflux.listenTo(JamTrackPlayerStore, 'onJamTrackPlayerStoreChanged') mixins: mixins + computeWeight: (jam_track_track) -> + weight = switch + when jam_track_track.track_type == 'Master' then 0 + when jam_track_track.track_type == 'Click' then 10000 + else jam_track_track.position onJamTrackPlayerStoreChanged: (changes) -> #logger.debug("PopupMediaControls: jamtrack changed", changes) @@ -222,9 +227,16 @@ mixins.push(Reflux.listenTo(JamTrackPlayerStore, 'onJamTrackPlayerStoreChanged') active = jamTrack.last_stem_id? trackOptions = [] - for track in jamTrack.tracks - if track.track_type == 'Track' + jamTrack.tracks.sort((a, b) => + aWeight = @computeWeight(a) + bWeight = @computeWeight(b) + return aWeight - bWeight + ) + + + for track in jamTrack.tracks + if track.track_type == 'Track' || track.track_type == 'Click' if track.instrument instrumentId = track.instrument.id @@ -239,7 +251,6 @@ mixins.push(Reflux.listenTo(JamTrackPlayerStore, 'onJamTrackPlayerStoreChanged') boundStemPlayClick = this.downloadStem.bind(this) boundStemChange = this.stemChanged.bind(this) - console.log("jamTrack.lastStemId", jamTrack.last_stem_id) myMixdowns.push `