Skip to content

Commit d9fde95

Browse files
authored
Read subtitle metadata (#3)
1 parent 77bcda5 commit d9fde95

3 files changed

Lines changed: 56 additions & 9 deletions

File tree

lib/ffmpeg/movie.rb

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class Movie
88
attr_reader :path, :duration, :time, :bitrate, :rotation, :creation_time
99
attr_reader :video_stream, :video_codec, :video_bitrate, :colorspace, :width, :height, :sar, :dar, :frame_rate
1010
attr_reader :audio_streams, :audio_stream, :audio_codec, :audio_bitrate, :audio_sample_rate, :audio_channels, :audio_tags
11+
attr_reader :subtitle_streams, :subtitle_stream, :subtitle_codec, :subtitle_language
1112
attr_reader :container
1213
attr_reader :metadata, :format_tags
1314

@@ -53,6 +54,7 @@ def initialize(path)
5354
else
5455
video_streams = @metadata[:streams].select { |stream| stream.key?(:codec_type) and stream[:codec_type] === 'video' }
5556
audio_streams = @metadata[:streams].select { |stream| stream.key?(:codec_type) and stream[:codec_type] === 'audio' }
57+
subtitle_streams = @metadata[:streams].select { |stream| stream.key?(:codec_type) and stream[:codec_type] === 'subtitle' }
5658

5759
@container = @metadata[:format][:format_name]
5860

@@ -62,15 +64,13 @@ def initialize(path)
6264

6365
@format_tags = @metadata[:format][:tags]
6466

65-
@creation_time = if @format_tags and @format_tags.key?(:creation_time)
66-
begin
67-
Time.parse(@format_tags[:creation_time])
68-
rescue ArgumentError
69-
nil
70-
end
71-
else
72-
nil
73-
end
67+
@creation_time = nil
68+
if @format_tags and @format_tags.key?(:creation_time)
69+
begin
70+
@creation_time = Time.parse(@format_tags[:creation_time])
71+
rescue ArgumentError
72+
end
73+
end
7474

7575
@bitrate = @metadata[:format][:bit_rate].to_i
7676

@@ -127,6 +127,22 @@ def initialize(path)
127127
@audio_stream = audio_stream[:overview]
128128
end
129129

130+
@subtitle_streams = subtitle_streams.map do |stream|
131+
{
132+
:index => stream[:index],
133+
:language => stream[:tags][:language],
134+
:codec_name => stream[:codec_tag_string],
135+
:overview => "#{stream[:codec_tag_string]} (#{stream[:tags][:language]})"
136+
}
137+
end
138+
139+
subtitle_stream = @subtitle_streams.first
140+
unless subtitle_stream.nil?
141+
@subtitle_language = subtitle_stream[:language]
142+
@subtitle_codec = subtitle_stream[:codec_name]
143+
@subtitle_stream = subtitle_stream[:overview]
144+
end
145+
130146
end
131147

132148
unsupported_stream_ids = unsupported_streams(std_error)

spec/ffmpeg/movie_spec.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,14 @@ module FFMPEG
214214
end
215215
end
216216

217+
context "given a file with a subtitle stream" do
218+
let(:movie) {Movie.new("#{fixture_path}/movies/awesome movie with subtitles.m4v") }
219+
220+
it "should be valid" do
221+
expect(movie).to be_valid
222+
end
223+
end
224+
217225
context "given a file named with URL characters" do
218226
# let(:movie) { Movie.new("#{fixture_path}/movies/file+with+data&streams=works?.mp4") }
219227

@@ -509,6 +517,29 @@ module FFMPEG
509517
end
510518
end
511519

520+
context "given a file with subtitle streams" do
521+
let(:movie) {Movie.new("#{fixture_path}/movies/awesome movie with subtitles.m4v") }
522+
523+
it "should identify both subtitle streams" do
524+
expect(movie.subtitle_streams.length).to eq(2)
525+
end
526+
527+
it "should assign subtitle_codec to the format of the first stream" do
528+
subtitle_codec = movie.subtitle_streams[0][:codec_name]
529+
expect(movie.subtitle_codec).to eq(subtitle_codec)
530+
end
531+
532+
it "should assign subtitle_language to the language of the first stream" do
533+
subtitle_language = movie.subtitle_streams[0][:language]
534+
expect(movie.subtitle_language).to eq(subtitle_language)
535+
end
536+
537+
it "should assign subtitle_stream to the properties of the first stream" do
538+
stream_overview = movie.subtitle_streams[0][:overview]
539+
expect(movie.subtitle_stream).to eq stream_overview
540+
end
541+
end
542+
512543
describe "transcode" do
513544
let(:movie) { Movie.new("#{fixture_path}/movies/awesome movie.mov")}
514545

408 KB
Binary file not shown.

0 commit comments

Comments
 (0)