aviglitch 0.1.6 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +5 -21
- data/.gitignore +1 -0
- data/ChangeLog.md +14 -0
- data/Gemfile +5 -0
- data/LICENSE +1 -1
- data/README.md +0 -4
- data/aviglitch.gemspec +1 -2
- data/bin/datamosh +13 -3
- data/lib/aviglitch/avi.rb +557 -0
- data/lib/aviglitch/base.rb +31 -59
- data/lib/aviglitch/frame.rb +20 -0
- data/lib/aviglitch/frames.rb +187 -185
- data/lib/aviglitch.rb +12 -5
- data/spec/avi2_spec.rb +41 -0
- data/spec/aviglitch_spec.rb +20 -18
- data/spec/datamosh_spec.rb +4 -14
- data/spec/frames_spec.rb +39 -28
- data/spec/spec_helper.rb +45 -0
- metadata +7 -6
- data/spec/files/sample.avi +0 -0
data/spec/datamosh_spec.rb
CHANGED
@@ -3,23 +3,12 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe AviGlitch, 'datamosh cli' do
|
4
4
|
|
5
5
|
before :all do
|
6
|
-
FileUtils.mkdir OUTPUT_DIR unless File.exist? OUTPUT_DIR
|
7
|
-
@in = FILES_DIR + 'sample.avi'
|
8
|
-
@out = OUTPUT_DIR + 'out.avi'
|
9
6
|
here = File.dirname(__FILE__)
|
10
7
|
lib = Pathname.new(File.join(here, '..', 'lib')).realpath
|
11
8
|
datamosh = Pathname.new(File.join(here, '..', 'bin/datamosh')).realpath
|
12
9
|
@cmd = "ruby -I%s %s -o %s " % [lib, datamosh, @out]
|
13
10
|
end
|
14
11
|
|
15
|
-
after :each do
|
16
|
-
FileUtils.rm Dir.glob((OUTPUT_DIR + '*').to_s)
|
17
|
-
end
|
18
|
-
|
19
|
-
after :all do
|
20
|
-
FileUtils.rmdir OUTPUT_DIR
|
21
|
-
end
|
22
|
-
|
23
12
|
it 'should correctly process files' do
|
24
13
|
a = AviGlitch.open @in
|
25
14
|
keys = a.frames.inject(0) do |c, f|
|
@@ -27,12 +16,13 @@ describe AviGlitch, 'datamosh cli' do
|
|
27
16
|
c
|
28
17
|
end
|
29
18
|
total = a.frames.size
|
19
|
+
first_keyframe = a.frames.index(a.frames.first_of(:keyframe))
|
30
20
|
a.close
|
31
21
|
|
32
22
|
system [@cmd, @in].join(' ')
|
33
23
|
o = AviGlitch.open @out
|
34
24
|
o.frames.size.should == total
|
35
|
-
o.frames.
|
25
|
+
o.frames[first_keyframe].is_keyframe?.should be true
|
36
26
|
o.has_keyframe?.should be true
|
37
27
|
o.close
|
38
28
|
AviGlitch::Base.surely_formatted?(@out, true).should be true
|
@@ -40,7 +30,7 @@ describe AviGlitch, 'datamosh cli' do
|
|
40
30
|
system [@cmd, '-a', @in].join(' ')
|
41
31
|
o = AviGlitch.open @out
|
42
32
|
o.frames.size.should == total
|
43
|
-
o.frames.
|
33
|
+
o.frames[first_keyframe].is_keyframe?.should be false
|
44
34
|
o.has_keyframe?.should be false
|
45
35
|
o.close
|
46
36
|
AviGlitch::Base.surely_formatted?(@out, true).should be true
|
@@ -48,7 +38,7 @@ describe AviGlitch, 'datamosh cli' do
|
|
48
38
|
system [@cmd, @in, @in, @in].join(' ')
|
49
39
|
o = AviGlitch.open @out
|
50
40
|
o.frames.size.should == total * 3
|
51
|
-
o.frames.
|
41
|
+
o.frames[first_keyframe].is_keyframe?.should be true
|
52
42
|
o.close
|
53
43
|
AviGlitch::Base.surely_formatted?(@out, true).should be true
|
54
44
|
|
data/spec/frames_spec.rb
CHANGED
@@ -1,30 +1,28 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
|
3
|
+
# Since Ruby 3.3.x, Windows frequently fails to close the Tempfile on GC.
|
4
|
+
# Although not a fatal error, it should be better to remove them manually in such cases.
|
5
|
+
# Now this spec is skipped in Windows because it could generate a lot of warning messages and undeleted temp files.
|
6
|
+
describe AviGlitch::Frames, :skip => Gem.win_platform? do
|
4
7
|
|
5
8
|
before :all do
|
6
9
|
AviGlitch::Frames.class_eval do
|
7
10
|
define_method(:get_real_id_with) do |frame|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
movi = @avi.get_movi
|
12
|
+
pos = movi.pos
|
13
|
+
movi.pos -= frame.data.size
|
14
|
+
movi.pos -= 8
|
15
|
+
id = movi.read 4
|
16
|
+
movi.pos = pos
|
13
17
|
id
|
14
18
|
end
|
15
19
|
end
|
16
20
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
after :each do
|
23
|
-
FileUtils.rm Dir.glob((OUTPUT_DIR + '*').to_s)
|
24
|
-
end
|
25
|
-
|
26
|
-
after :all do
|
27
|
-
FileUtils.rmdir OUTPUT_DIR
|
21
|
+
AviGlitch::Avi.class_eval do
|
22
|
+
define_method(:get_movi) do
|
23
|
+
@movi
|
24
|
+
end
|
25
|
+
end
|
28
26
|
end
|
29
27
|
|
30
28
|
it 'should save the same file when nothing is changed' do
|
@@ -85,15 +83,6 @@ describe AviGlitch::Frames do
|
|
85
83
|
avi.close
|
86
84
|
end
|
87
85
|
|
88
|
-
it 'should hide the inner variables' do
|
89
|
-
avi = AviGlitch.open @in
|
90
|
-
frames = avi.frames
|
91
|
-
lambda { frames.meta }.should raise_error(NoMethodError)
|
92
|
-
lambda { frames.io }.should raise_error(NoMethodError)
|
93
|
-
lambda { frames.frames_data_as_io }.should raise_error(NoMethodError)
|
94
|
-
avi.close
|
95
|
-
end
|
96
|
-
|
97
86
|
it 'should save video frames count in header' do
|
98
87
|
avi = AviGlitch.open @in
|
99
88
|
c = 0
|
@@ -493,8 +482,7 @@ describe AviGlitch::Frames do
|
|
493
482
|
expect(File.size(@out)).to be < File.size(@in)
|
494
483
|
end
|
495
484
|
|
496
|
-
it 'should use Enumerator as an external iterator'
|
497
|
-
:skip => Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('1.9.0') || RUBY_PLATFORM == 'java' do
|
485
|
+
it 'should use Enumerator as an external iterator' do
|
498
486
|
a = AviGlitch.open @in
|
499
487
|
e = a.frames.each
|
500
488
|
expect {
|
@@ -557,4 +545,27 @@ describe AviGlitch::Frames do
|
|
557
545
|
expect(ac2).to eq(ac)
|
558
546
|
end
|
559
547
|
|
548
|
+
it 'should pick the first / last frame with a method' do
|
549
|
+
a = AviGlitch.open @in
|
550
|
+
fkidx = -1
|
551
|
+
lkidx = -1
|
552
|
+
faidx = -1
|
553
|
+
laidx = -1
|
554
|
+
a.frames.each_with_index do |f, i|
|
555
|
+
if f.is_keyframe?
|
556
|
+
fkidx = i if fkidx == -1
|
557
|
+
lkidx = i
|
558
|
+
end
|
559
|
+
if f.is_audioframe?
|
560
|
+
faidx = i if faidx == -1
|
561
|
+
laidx = i
|
562
|
+
end
|
563
|
+
end
|
564
|
+
a.frames.index(a.frames.first_of(:keyframe)).should eq(fkidx)
|
565
|
+
a.frames.rindex(a.frames.last_of(:keyframe)).should eq(lkidx)
|
566
|
+
a.frames.index(a.frames.first_of(:audioframe)).should eq(faidx)
|
567
|
+
a.frames.rindex(a.frames.last_of(:audioframe)).should eq(laidx)
|
568
|
+
a.close
|
569
|
+
end
|
570
|
+
|
560
571
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,7 @@ require 'rspec'
|
|
2
2
|
require 'aviglitch'
|
3
3
|
require 'pathname'
|
4
4
|
require 'fileutils'
|
5
|
+
require 'net/http'
|
5
6
|
|
6
7
|
FILES_DIR = Pathname.new(File.dirname(__FILE__)).realpath + 'files'
|
7
8
|
OUTPUT_DIR = FILES_DIR + 'output'
|
@@ -11,4 +12,48 @@ RSpec.configure do |config|
|
|
11
12
|
config.expect_with :rspec do |c|
|
12
13
|
c.syntax = [:should, :expect]
|
13
14
|
end
|
15
|
+
|
16
|
+
config.before(:all) do
|
17
|
+
FileUtils.mkdir FILES_DIR unless File.exist? FILES_DIR
|
18
|
+
FileUtils.mkdir OUTPUT_DIR unless File.exist? OUTPUT_DIR
|
19
|
+
@in = FILES_DIR + 'sample1.avi'
|
20
|
+
@in2 = FILES_DIR + 'sample2.avi'
|
21
|
+
@out = OUTPUT_DIR + 'out.avi'
|
22
|
+
[
|
23
|
+
[@in2, 'http://a.ucnv.org/sample2.avi'], [@in, 'http://a.ucnv.org/sample1.avi']
|
24
|
+
].each do |file, url|
|
25
|
+
unless File.exist? file
|
26
|
+
if file == @in2
|
27
|
+
puts 'At first test it needs to download a file over 1GB. It will take a while.'
|
28
|
+
end
|
29
|
+
puts 'Downloading ' + url
|
30
|
+
$stdout.sync = true
|
31
|
+
u = URI.parse url
|
32
|
+
Net::HTTP.start(u.host, u.port) do |http|
|
33
|
+
res = http.request_head u.path
|
34
|
+
max = res['content-length'].to_i
|
35
|
+
len = 0
|
36
|
+
bl = 75
|
37
|
+
File.open(file, 'w') do |file|
|
38
|
+
http.get(u.path) do |chunk|
|
39
|
+
file.write chunk
|
40
|
+
len += chunk.length
|
41
|
+
pct = '%3.1f' % (100.0 * len / max)
|
42
|
+
bar = ('#' * (bl * len / max)).ljust(bl)
|
43
|
+
print "\r#{bar} #{'%5s' % pct}%" unless ENV['CI']
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
puts
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
config.after(:each) do
|
53
|
+
begin
|
54
|
+
FileUtils.rm_r Dir.glob((OUTPUT_DIR + '*').to_s)
|
55
|
+
rescue => e
|
56
|
+
# Sometimes windows can't remove files.
|
57
|
+
end
|
58
|
+
end
|
14
59
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aviglitch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ucnv
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -73,15 +73,16 @@ files:
|
|
73
73
|
- aviglitch.gemspec
|
74
74
|
- bin/datamosh
|
75
75
|
- lib/aviglitch.rb
|
76
|
+
- lib/aviglitch/avi.rb
|
76
77
|
- lib/aviglitch/base.rb
|
77
78
|
- lib/aviglitch/frame.rb
|
78
79
|
- lib/aviglitch/frames.rb
|
80
|
+
- spec/avi2_spec.rb
|
79
81
|
- spec/aviglitch_spec.rb
|
80
82
|
- spec/datamosh_spec.rb
|
81
|
-
- spec/files/sample.avi
|
82
83
|
- spec/frames_spec.rb
|
83
84
|
- spec/spec_helper.rb
|
84
|
-
homepage:
|
85
|
+
homepage: https://github.com/ucnv/aviglitch
|
85
86
|
licenses:
|
86
87
|
- MIT
|
87
88
|
metadata: {}
|
@@ -102,13 +103,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
103
|
- !ruby/object:Gem::Version
|
103
104
|
version: '0'
|
104
105
|
requirements: []
|
105
|
-
rubygems_version: 3.
|
106
|
+
rubygems_version: 3.5.11
|
106
107
|
signing_key:
|
107
108
|
specification_version: 4
|
108
109
|
summary: A Ruby library to destroy your AVI files.
|
109
110
|
test_files:
|
111
|
+
- spec/avi2_spec.rb
|
110
112
|
- spec/aviglitch_spec.rb
|
111
113
|
- spec/datamosh_spec.rb
|
112
|
-
- spec/files/sample.avi
|
113
114
|
- spec/frames_spec.rb
|
114
115
|
- spec/spec_helper.rb
|
data/spec/files/sample.avi
DELETED
Binary file
|