feature/share-libs
rb 64 lines 2.58 KB
Raw
1 class DrumBackingTrackJob < ApplicationJob
2 # TODO: Set priority based on account type.
3 queue_as :default
4 def perform(audio_file_id)
5 # Get the file to split.
6 file = AudioFile.find_by(id: audio_file_id)
7
8 # Make sure the actual file is attached.
9 # Otherwise, we don't want to do the job.
10 return if file.nil? || !file.source_file.attached? || !file.splitfire_results.count.positive?
11
12 # Create the object now
13 result_drum_backing_track = DrumBackingTrack.new(audio_file_id: file.id)
14 result_drum_backing_track.save
15
16 result_other_path = ActiveStorage::Blob.service.send(:path_for, file.other_file.source_file.key)
17 result_vocals_path = ActiveStorage::Blob.service.send(:path_for, file.vocals_file.source_file.key)
18 result_piano_path = ActiveStorage::Blob.service.send(:path_for, file.piano_file.source_file.key)
19 result_bass_path = ActiveStorage::Blob.service.send(:path_for, file.bass_file.source_file.key)
20
21 unless result_other_path.present? && result_vocals_path.present? && result_piano_path.present? && result_bass_path.present?
22 return
23 end
24
25 # Prepare working directory.
26 working_directory_path = if Rails.env.production?
27 '/home/deploy/apps/ffmpeg/'
28 else
29 '../ffmpeg/'
30 end
31
32 Dir.chdir(working_directory_path)
33
34 codec = 'mp3'
35
36 file_output_directory = file.source_file.blob.key.to_s
37
38 result_drum_backing_track_filename = "drum-backing-track-#{file.id}.#{codec}"
39
40 system("ffmpeg -i #{result_other_path} -i #{result_vocals_path} -i #{result_piano_path} -i #{result_bass_path} -filter_complex amix=inputs=4:duration=longest -y '#{result_drum_backing_track_filename}'")
41
42 status_progress = 10
43 until File.exist?(result_drum_backing_track_filename)
44 system("echo 'We are waiting for #{result_drum_backing_track_filename}...'")
45 result_drum_backing_track.update_attribute(:status_progress, status_progress)
46 result_drum_backing_track.save
47
48 status_progress += 1 if status_progress < 100
49
50 sleep 1
51 end
52 result_drum_backing_track_file = File.open(result_drum_backing_track_filename)
53 result_drum_backing_track.source_file.attach(
54 io: result_drum_backing_track_file,
55 filename: result_drum_backing_track_filename
56 )
57 result_drum_backing_track.update_attribute(:status, :done)
58 result_drum_backing_track.update_attribute(:status_progress, 100)
59 result_drum_backing_track.save
60
61 # Cleanup Spleeter output folder
62 system("rm #{result_drum_backing_track_filename}")
63 end
64 end