jam-cloud/ruby/lib/jam_ruby/models/jam_track_file.rb

79 lines
2.3 KiB
Ruby

module JamRuby
# holds a click track or precount file
class JamTrackFile < ActiveRecord::Base
include JamRuby::S3ManagerMixin
# there should only be one Master per JamTrack, but there can be N Track per JamTrack
FILE_TYPE = %w{ClickWav ClickTxt Precount}
@@log = Logging.logger[JamTrackFile]
before_destroy :delete_s3_files
attr_accessible :jam_track_id, :file_type, :filename, as: :admin
attr_accessible :url, :md5, :length, as: :admin
attr_accessor :original_audio_s3_path, :skip_uploader, :preview_generate_error
before_destroy :delete_s3_files
validates :track_type, inclusion: {in: FILE_TYPE }
belongs_to :jam_track, class_name: "JamRuby::JamTrack"
# create storage directory that will house this jam_track, as well as
def store_dir
"jam_track_files"
end
# create name of the file
def filename(original_name)
"#{store_dir}/#{jam_track.original_artist}/#{jam_track.name}/#{original_name}"
end
def manually_uploaded_filename
if click_wav?
filename('click.wav')
elsif click_txt?
filename('click.txt')
elsif precount?
filename('precount.wav')
else
raise 'unknown file type: ' + file_type
end
end
def click_wav?
track_type == 'ClickWav'
end
def click_txt?
track_type == 'ClickTxt'
end
def precount?
track_type == 'Precount'
end
# creates a short-lived URL that has access to the object.
# the idea is that this is used when a user who has the rights to this tries to download this JamTrack
# we would verify their rights (can_download?), and generates a URL in response to the click so that they can download
# but the url is short lived enough so that it wouldn't be easily shared
def sign_url(expiration_time = 120)
s3_manager.sign_url(self[url], {:expires => expiration_time, :response_content_type => 'audio/wav', :secure => true})
end
def can_download?(user)
# I think we have to make a special case for 'previews', but maybe that's just up to the controller to not check can_download?
jam_track.owners.include?(user)
end
def delete_s3_files
s3_manager.delete(self[:url]) if self[:url] && s3_manager.exists?(self[:url])
end
end
end