diff --git a/ruby/lib/jam_ruby/base_manager.rb b/ruby/lib/jam_ruby/base_manager.rb index b38be19c8..49dcff5d5 100644 --- a/ruby/lib/jam_ruby/base_manager.rb +++ b/ruby/lib/jam_ruby/base_manager.rb @@ -26,7 +26,7 @@ module JamRuby connection.transaction do yield manager end - rescue Exception => e + rescue Exception => e ActiveRecord::Base.connection.execute('ROLLBACK') end end diff --git a/ruby/lib/jam_ruby/jam_track_importer.rb b/ruby/lib/jam_ruby/jam_track_importer.rb index 87637ddc8..01fed9be0 100644 --- a/ruby/lib/jam_ruby/jam_track_importer.rb +++ b/ruby/lib/jam_ruby/jam_track_importer.rb @@ -99,82 +99,99 @@ module JamRuby end def generate_jmep(jam_track) - if !jam_track.blank? - finish('success', 'jmep already exists') + + # https://docs.google.com/spreadsheets/d/1dyUOjWkeU8BXwnJl-ws1Kvxq_twWEG7E78F29haYkLc/edit#gid=987457683 + # cross-check against marks_approved + + if JamTrackImporter.marks_approved.has_key?(jam_track.slug) + @@log.info("Found track in mark approved list. skipping") + finish('success', 'mark created') return + end + + # can we overwrite this one? + if jam_track.jmep_text.blank? || jam_track.jmep_text.include?('created via code') + @@log.info("This is a blank jmep or created earlier by code.") else - # we need to download the click track, if it exists. - Dir.mktmpdir do |tmp_dir| + @@log.info("This a JMEP that was not created by code. Skip it.") + return + end - master_track = jam_track.master_track + # we need to download the click track, if it exists. + Dir.mktmpdir do |tmp_dir| - click_track = jam_track.click_track_file + master_track = jam_track.master_track - if master_track.nil? - finish('no_master_track', nil) - return - end + click_track = jam_track.click_track_file - master_track_file = File.join(tmp_dir, File.basename(master_track[:url_48])) - begin - JamTrackImporter.private_s3_manager.download(master_track.url_by_sample_rate(44), master_track_file) - rescue Exception => e - @@log.error("unable to download master track") - finish("no-download-master", master_track.url_by_sample_rate(44)) - return - end + if master_track.nil? + finish('no_master_track', nil) + return + end - if click_track - click_track_file = File.join(tmp_dir, File.basename(click_track[:original_filename])) - JamTrackImporter.song_storage_manager.download(click_track[:original_filename], click_track_file) - else - # we'll use the master for click analysis. not ideal, but would work - click_track_file = master_track_file - end + master_track_file = File.join(tmp_dir, File.basename(master_track[:url_48])) + begin + JamTrackImporter.private_s3_manager.download(master_track.url_by_sample_rate(44), master_track_file) + rescue Exception => e + @@log.error("unable to download master track") + finish("no-download-master", master_track.url_by_sample_rate(44)) + return + end + if click_track + click_track_file = File.join(tmp_dir, File.basename(click_track[:original_filename])) + JamTrackImporter.song_storage_manager.download(click_track[:original_filename], click_track_file) + else + # we'll use the master for click analysis. not ideal, but would work + click_track_file = master_track_file + end + + + if click_track + start_time = determine_start_time(click_track_file, tmp_dir, click_track[:original_filename]) + else start_time = determine_start_time(master_track_file, tmp_dir, master_track[:url]) + end - # bpm comes from git clone http://www.pogo.org.uk/~mark/bpm-tools.git + # bpm comes from git clone http://www.pogo.org.uk/~mark/bpm-tools.git - sox="sox #{Shellwords.escape(click_track_file)} -t raw -r 44100 -e float -c 1 - | bpm" - cmd = "bash -c #{Shellwords.escape(sox)}" - @@log.debug("executing cmd #{cmd}") - output=`#{cmd}` + sox="sox #{Shellwords.escape(click_track_file)} -t raw -r 44100 -e float -c 1 - | bpm" + cmd = "bash -c #{Shellwords.escape(sox)}" + @@log.debug("executing cmd #{cmd}") + output=`#{cmd}` - result_code = $?.to_i + result_code = $?.to_i - if result_code == 0 - bpm = output.to_f + if result_code == 0 + bpm = output.to_f - @@log.debug("bpm: #{bpm} start_time: #{start_time}") + @@log.debug("bpm: #{bpm} start_time: #{start_time}") - metro_fin = "#{Time.at(start_time).utc.strftime("%H:%M:%S")}:#{((start_time - start_time.to_i) * 1000).round}" + metro_fin = "#{Time.at(start_time).utc.strftime("%H:%M:%S")}:#{((start_time - start_time.to_i) * 1000).round}" - jmep = "" - jmep << "# created via code using bpm/silence detection (bpm:#{bpm})\r\n" - jmep << "prelude@10.0 #number of seconds before music starts\r\n" - jmep << "metro_fin@#{metro_fin} bpm=#{bpm}, ticks=8, pmode=stream, name=Beep, play=mono" + jmep = "" + jmep << "# created via code using bpm/silence detection (bpm:#{bpm})\r\n" + jmep << "prelude@10.0 #number of seconds before music starts\r\n" + jmep << "metro_fin@#{metro_fin} bpm=#{bpm}, ticks=8, pmode=stream, name=Beep, play=mono" - @@log.info("jmep generated: #{jmep}") + @@log.info("jmep generated: #{jmep}") - jam_track.jmep_text = jmep - if jam_track.save - finish('success', nil) - else - @@log.error("jamtrack did not save. #{jam_track.errors.inspect}") - finish("no-save", "jamtrack did not save. #{jam_track.errors.inspect}") - return - end + jam_track.jmep_text = jmep + if jam_track.save + finish('success', nil) else - finish("bpm-fail", "failed to run bpm: #{output}") + @@log.error("jamtrack did not save. #{jam_track.errors.inspect}") + finish("no-save", "jamtrack did not save. #{jam_track.errors.inspect}") return end + else + finish("bpm-fail", "failed to run bpm: #{output}") + return end end end - def determine_start_time(audio_file, tmp_dir, original_filename) burp_gaps = ['0.3', '0.2', '0.1', '0.05'] @@ -824,7 +841,6 @@ module JamRuby end - else if !options[:resync_audio] #@@log.debug("#{self.name} skipped because it already exists in database") @@ -1209,72 +1225,72 @@ module JamRuby #if track.persisted? # instrument_weight = track.position #else - if track.instrument_id == 'voice' + if track.instrument_id == 'voice' - if track.part && track.part.start_with?('Lead') - instrument_weight = 100 - elsif track.part && track.part.start_with?('Backing') - instrument_weight = 110 - else - instrument_weight = 120 - end - - elsif track.instrument_id == 'drums' - - if track.part && track.part == 'Drums' - instrument_weight = 150 - elsif track.part && track.part == 'Percussion' - instrument_weight = 160 - else - instrument_weight = 170 - end - elsif track.instrument_id == 'percussion' - instrument_weight = 175 - elsif track.instrument_id == 'bass guitar' && track.part && track.part == 'Bass' - instrument_weight = 180 - - elsif track.instrument_id == 'piano' && track.part && track.part == 'Piano' - instrument_weight = 250 - - elsif track.instrument_id == 'keyboard' - - if track.part && track.part.start_with?('Synth') - instrument_weight = 260 - elsif track.part && track.part.start_with?('Pads') - instrument_weight = 270 - else - instrument_weight = 280 - end - - elsif track.instrument_id == 'acoustic guitar' - if track.part && track.part.start_with?('Lead') - instrument_weight = 300 - elsif track.part && track.part.start_with?('Rhythm') - instrument_weight = 310 - else - instrument_weight = 320 - end - elsif track.instrument_id == 'electric guitar' - if track.part && track.part.start_with?('Lead') - instrument_weight = 400 - elsif track.part && track.part.start_with?('Solo') - instrument_weight = 410 - elsif track.part && track.part.start_with?('Rhythm') - instrument_weight = 420 - else - instrument_weight = 440 - end + if track.part && track.part.start_with?('Lead') + instrument_weight = 100 + elsif track.part && track.part.start_with?('Backing') + instrument_weight = 110 else - instrument_weight = slop + instrument_weight = 120 end - if track.track_type == 'Master' - instrument_weight = 1000 + elsif track.instrument_id == 'drums' + + if track.part && track.part == 'Drums' + instrument_weight = 150 + elsif track.part && track.part == 'Percussion' + instrument_weight = 160 + else + instrument_weight = 170 + end + elsif track.instrument_id == 'percussion' + instrument_weight = 175 + elsif track.instrument_id == 'bass guitar' && track.part && track.part == 'Bass' + instrument_weight = 180 + + elsif track.instrument_id == 'piano' && track.part && track.part == 'Piano' + instrument_weight = 250 + + elsif track.instrument_id == 'keyboard' + + if track.part && track.part.start_with?('Synth') + instrument_weight = 260 + elsif track.part && track.part.start_with?('Pads') + instrument_weight = 270 + else + instrument_weight = 280 end - if track.track_type == 'Click' - instrument_weight = 10000 + elsif track.instrument_id == 'acoustic guitar' + if track.part && track.part.start_with?('Lead') + instrument_weight = 300 + elsif track.part && track.part.start_with?('Rhythm') + instrument_weight = 310 + else + instrument_weight = 320 end + elsif track.instrument_id == 'electric guitar' + if track.part && track.part.start_with?('Lead') + instrument_weight = 400 + elsif track.part && track.part.start_with?('Solo') + instrument_weight = 410 + elsif track.part && track.part.start_with?('Rhythm') + instrument_weight = 420 + else + instrument_weight = 440 + end + else + instrument_weight = slop + end + + if track.track_type == 'Master' + instrument_weight = 1000 + end + + if track.track_type == 'Click' + instrument_weight = 10000 + end #end @@ -1525,7 +1541,7 @@ module JamRuby raise "unable to locate jam track wit h#{wav_file} as original_filename" end track = matches[0] - track.original_audio_s3_path = wav_file + track.original_audio_s3_path = wav_file file = nil end @@ -2115,6 +2131,7 @@ module JamRuby attr_accessor :paris_mapping attr_accessor :paris_metadata attr_accessor :summaries + attr_accessor :marks_approved def report_summaries @@log.debug("SUMMARIES DUMP") @@ -2150,7 +2167,7 @@ module JamRuby end def summaries - @summaries ||= {unknown_filetype: 0, no_instrument: 0, no_part: 0, total_tracks: 0, no_instrument_detail: {}, no_precount_num: 0, no_precount_detail: [], unique_artists: SortedSet.new, multiple_masters: 0, total:0} + @summaries ||= {unknown_filetype: 0, no_instrument: 0, no_part: 0, total_tracks: 0, no_instrument_detail: {}, no_precount_num: 0, no_precount_detail: [], unique_artists: SortedSet.new, multiple_masters: 0, total: 0} end def tency_s3_manager @@ -2313,11 +2330,11 @@ module JamRuby if is_tency_storage? iterate_tency_song_storage do |metadata, metalocation| blk.call(metadata, metalocation) - end + end elsif is_paris_storage? - iterate_paris_song_storage do |metadata, metalocation| - blk.call(metadata, metalocation) - end + iterate_paris_song_storage do |metadata, metalocation| + blk.call(metadata, metalocation) + end elsif is_tim_tracks_storage? iterate_tim_tracks_song_storage do |metadata, metalocation| blk.call(metadata, metalocation) @@ -2549,6 +2566,7 @@ module JamRuby importer end + def generate_jmep(jam_track) importer = JamTrackImporter.new importer.name = jam_track.name @@ -2561,7 +2579,7 @@ module JamRuby importers = [] JamTrack.all.each do |jam_track| - #jam_track = JamTrack.find('126') + #jam_track = JamTrack.find('126') importers << import_click_track(jam_track) end @@ -2807,7 +2825,7 @@ module JamRuby jam_tracks = JamTrack.where(licensor_id: paris.id) elsif is_default_storage? # XXX IF WE ADD ANOTHER STORAGE, UPDATE THE WHERE TO EXCLUDE IT AS WELL - jam_tracks = JamTrack.where('licensor_id is null OR licensor_id != ?', tency.id ) + jam_tracks = JamTrack.where('licensor_id is null OR licensor_id != ?', tency.id) else raise 'unknown storage format!' end @@ -3010,7 +3028,7 @@ module JamRuby jam_track.original_artist = metadata[:original_artist] jam_track.name = metadata[:name] if jam_track.changed? - puts "ARTIST/NAME CHANGE: #{jam_track.changes.inspect}" + puts "ARTIST/NAME CHANGE: #{jam_track.changes.inspect}" end if !jam_track.save @@ -3078,6 +3096,32 @@ module JamRuby end end + def load_marks_approved + @marks_approved = {} + Dir.mktmpdir do |tmp_dir| + mapping_file = 'marks_approved.csv' + mapping_csv = CSV.read(mapping_file, headers: true, return_headers: false) + + mapping_csv.each do |line| + approved = line[3] + track_url = line[2] + comments = line[7] + + approved.strip! if approved + track_url.strip! if track_url + comments.strip! if comments + + if approved == 'MJ' + prefix = 'https://www.jamkazam.com/landing/jamtracks/'.length + slug = track_url[prefix..-1] + + puts "MARKS APPROVED #{slug} #{comments}" + @marks_approved[slug] = comments + end + end + end + end + def load_paris_mappings Dir.mktmpdir do |tmp_dir| mapping_file = File.join(tmp_dir, 'mapping.csv') diff --git a/web/lib/tasks/jam_tracks.rake b/web/lib/tasks/jam_tracks.rake index 034ab513a..7ada13f6e 100644 --- a/web/lib/tasks/jam_tracks.rake +++ b/web/lib/tasks/jam_tracks.rake @@ -7,6 +7,13 @@ namespace :jam_tracks do task generate_jmep: :environment do |task, args| JamTrackImporter.storage_format = 'Tency' + JamTrackImporter.load_marks_approved + JamTrackImporter.generate_jmeps + end + + task generate_jmep_paris: :environment do |task, args| + JamTrackImporter.storage_format = 'Paris' + JamTrackImporter.load_marks_approved JamTrackImporter.generate_jmeps end