module StorageAdapters class LocalAdapter < BaseAdapter VIDEO_EXTENSIONS = %w[.mp4 .mkv .avi .mov .wmv .flv .webm .m4v].freeze def scan return [] unless readable? pattern = if storage_location.scan_subdirectories File.join(storage_location.path, "**", "*{#{VIDEO_EXTENSIONS.join(',')}}") else File.join(storage_location.path, "*{#{VIDEO_EXTENSIONS.join(',')}}") end Dir.glob(pattern, File::FNM_CASEFOLD).map do |full_path| full_path.sub(storage_location.path + "/", "") end end def stream_url(video) full_path(video) end def exists?(file_path) File.exist?(full_path_from_relative(file_path)) end def readable? return false unless storage_location.path.present? File.directory?(storage_location.path) && File.readable?(storage_location.path) end def writable? super && File.writable?(storage_location.path) end def write(source_path, dest_path) dest_full_path = full_path_from_relative(dest_path) FileUtils.mkdir_p(File.dirname(dest_full_path)) FileUtils.cp(source_path, dest_full_path) dest_path end def download_to_temp(video) # Already local, return path full_path(video) end def full_path(video) full_path_from_relative(video.file_path) end private def full_path_from_relative(file_path) File.join(storage_location.path, file_path) end end end