Sha256: 021a0cea2a60a2750ac74b6677a2e4b3ee49dd630f35d570fd2c5e3a39544f05

Contents?: true

Size: 1.6 KB

Versions: 31

Compression:

Stored size: 1.6 KB

Contents

# frozen_string_literal: true

module ActiveStorage
  # Extracts duration (seconds) and bit_rate (bits/s) from an audio blob.
  #
  # Example:
  #
  #   ActiveStorage::Analyzer::AudioAnalyzer.new(blob).metadata
  #   # => { duration: 5.0, bit_rate: 320340 }
  #
  # This analyzer requires the {FFmpeg}[https://www.ffmpeg.org] system library, which is not provided by Rails.
  class Analyzer::AudioAnalyzer < Analyzer
    def self.accept?(blob)
      blob.audio?
    end

    def metadata
      { duration: duration, bit_rate: bit_rate }.compact
    end

    private
      def duration
        duration = audio_stream["duration"]
        Float(duration) if duration
      end

      def bit_rate
        bit_rate = audio_stream["bit_rate"]
        Integer(bit_rate) if bit_rate
      end

      def audio_stream
        @audio_stream ||= streams.detect { |stream| stream["codec_type"] == "audio" } || {}
      end

      def streams
        probe["streams"] || []
      end

      def probe
        @probe ||= download_blob_to_tempfile { |file| probe_from(file) }
      end

      def probe_from(file)
        instrument(File.basename(ffprobe_path)) do
          IO.popen([ ffprobe_path,
            "-print_format", "json",
            "-show_streams",
            "-show_format",
            "-v", "error",
            file.path
          ]) do |output|
            JSON.parse(output.read)
          end
        end
      rescue Errno::ENOENT
        logger.info "Skipping audio analysis because ffprobe isn't installed"
        {}
      end

      def ffprobe_path
        ActiveStorage.paths[:ffprobe] || "ffprobe"
      end
  end
end

Version data entries

31 entries across 29 versions & 4 rubygems

Version Path
activestorage-7.0.8.7 lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.8.6 lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.8.5 lib/active_storage/analyzer/audio_analyzer.rb
blacklight-spotlight-3.6.0.beta8 vendor/bundle/ruby/3.2.0/gems/activestorage-7.0.8.4/lib/active_storage/analyzer/audio_analyzer.rb
cm-admin-1.5.22 vendor/bundle/ruby/3.3.0/gems/activestorage-7.0.5.1/lib/active_storage/analyzer/audio_analyzer.rb
cm-admin-1.5.21 vendor/bundle/ruby/3.3.0/gems/activestorage-7.0.5.1/lib/active_storage/analyzer/audio_analyzer.rb
cm-admin-1.5.20 vendor/bundle/ruby/3.3.0/gems/activestorage-7.0.5.1/lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.8.4 lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.8.1 lib/active_storage/analyzer/audio_analyzer.rb
scrapbook-0.3.2 vendor/ruby/2.7.0/gems/activestorage-7.0.3.1/lib/active_storage/analyzer/audio_analyzer.rb
scrapbook-0.3.2 vendor/ruby/2.7.0/gems/activestorage-7.0.2.3/lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.8 lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.7.2 lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.7.1 lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.7 lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.6 lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.5.1 lib/active_storage/analyzer/audio_analyzer.rb
scrapbook-0.3.1 vendor/ruby/2.7.0/gems/activestorage-7.0.2.3/lib/active_storage/analyzer/audio_analyzer.rb
scrapbook-0.3.1 vendor/ruby/2.7.0/gems/activestorage-7.0.3.1/lib/active_storage/analyzer/audio_analyzer.rb
activestorage-7.0.5 lib/active_storage/analyzer/audio_analyzer.rb