beanieboi/ffprober

View on GitHub
lib/ffprober/wrapper.rb

Summary

Maintainability
A
0 mins
Test Coverage
# typed: true
# frozen_string_literal: true

module Ffprober
  class Wrapper
    extend T::Sig

    attr_reader :json

    sig { returns(Ffprober::Format) }
    attr_reader :format

    # rubocop:disable Metrics/AbcSize
    sig { params(json: T::Hash[T.untyped, T.untyped]).void }
    def initialize(json)
      raise FfprobeError, json[:error] if json[:error]

      @json = json
      @format = T.let(Format.new(json[:format]), Ffprober::Format)
      @video_streams = T.let(nil, T.nilable(T::Array[Ffprober::VideoStream]))
      @audio_streams = T.let(nil, T.nilable(T::Array[Ffprober::AudioStream]))
      @data_streams = T.let(nil, T.nilable(T::Array[Ffprober::DataStream]))
      @subtitle_streams = T.let(nil, T.nilable(T::Array[Ffprober::SubtitleStream]))
      @chapters = T.let(nil, T.nilable(T::Array[Ffprober::Chapter]))
    end
    # rubocop:enable Metrics/AbcSize

    sig { returns(T::Array[Ffprober::VideoStream]) }
    def video_streams
      @video_streams ||= stream_by_codec('video').map do |data|
        VideoStream.new(data)
      end
    end

    sig { returns(T::Array[Ffprober::AudioStream]) }
    def audio_streams
      @audio_streams ||= stream_by_codec('audio').map do |data|
        AudioStream.new(data)
      end
    end

    sig { returns(T::Array[Ffprober::DataStream]) }
    def data_streams
      @data_streams ||= stream_by_codec('data').map do |data|
        DataStream.new(data)
      end
    end

    sig { returns(T::Array[Ffprober::Chapter]) }
    def chapters
      @chapters ||= json[:chapters].map { |chapter| Chapter.new(chapter) }
    end

    sig { returns(T::Array[Ffprober::SubtitleStream]) }
    def subtitle_streams
      @subtitle_streams ||= stream_by_codec('subtitle').map do |stream|
        SubtitleStream.new(stream)
      end
    end

    private

    def stream_by_codec(codec_type)
      streams.select { |stream| stream[:codec_type] == codec_type }
    end

    def streams
      json[:streams]
    end
  end
end