aviglitch 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +5 -21
- data/ChangeLog.md +6 -0
- data/LICENSE +1 -1
- data/bin/datamosh +7 -2
- data/lib/aviglitch/avi.rb +22 -15
- data/lib/aviglitch/base.rb +4 -2
- data/lib/aviglitch/frames.rb +21 -2
- data/lib/aviglitch.rb +11 -3
- data/spec/avi2_spec.rb +1 -0
- data/spec/aviglitch_spec.rb +21 -2
- data/spec/frames_spec.rb +5 -3
- data/spec/spec_helper.rb +5 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1d39333c753326230a28e3ecde64dfee176af851c53fd1b185a10797e90bbdd0
|
|
4
|
+
data.tar.gz: dfb9e4b6613a38c7da422ac82ebf100c12bf84fee40cfc44d899950e547f13d6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9df626227e793840d861bd26510323d315024278bfd4dedc7a4d5a147aef2e92ccd5d7cb0564ad8b743e6c1d2c5fea70f9858c86fcefa4f2434869169df1a2c2
|
|
7
|
+
data.tar.gz: de1adf2790a8c7250e2db4f73bf45b7884b1f1797069ba05899b1f3cb5cd0930d89698ba7d9959099e73e15cd937f83bf3f86939528bdc4310cb4e3c6c82880e
|
data/.github/workflows/ruby.yml
CHANGED
|
@@ -1,35 +1,19 @@
|
|
|
1
|
-
# This workflow uses actions that are not certified by GitHub.
|
|
2
|
-
# They are provided by a third-party and are governed by
|
|
3
|
-
# separate terms of service, privacy policy, and support
|
|
4
|
-
# documentation.
|
|
5
|
-
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
|
6
|
-
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
|
7
|
-
|
|
8
1
|
name: test
|
|
9
|
-
|
|
10
2
|
on:
|
|
11
3
|
push:
|
|
12
4
|
branches: [ master ]
|
|
13
5
|
pull_request:
|
|
14
6
|
branches: [ master ]
|
|
15
|
-
|
|
16
7
|
jobs:
|
|
17
8
|
test:
|
|
18
|
-
|
|
19
9
|
runs-on: ubuntu-latest
|
|
20
10
|
strategy:
|
|
21
11
|
matrix:
|
|
22
|
-
ruby-version: ['
|
|
23
|
-
|
|
12
|
+
ruby-version: ['3.3']
|
|
24
13
|
steps:
|
|
25
|
-
- uses: actions/checkout@
|
|
26
|
-
-
|
|
27
|
-
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
|
28
|
-
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
|
29
|
-
# uses: ruby/setup-ruby@v1
|
|
30
|
-
uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: ruby/setup-ruby@v1
|
|
31
16
|
with:
|
|
32
17
|
ruby-version: ${{ matrix.ruby-version }}
|
|
33
|
-
bundler-cache: true
|
|
34
|
-
-
|
|
35
|
-
run: bundle exec rake
|
|
18
|
+
bundler-cache: true
|
|
19
|
+
- run: bundle exec rake
|
data/ChangeLog.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
### 0.2.2 / 2024-07-20
|
|
2
|
+
|
|
3
|
+
* Added option to set a custom directory for temporary files that internally duplicate input files.
|
|
4
|
+
* Also added an option for the custom temp directory in the datamosh cli.
|
|
5
|
+
* Some improvements regarding internal temporary files.
|
|
6
|
+
|
|
1
7
|
### 0.2.0 / 2021-09-13
|
|
2
8
|
|
|
3
9
|
* Support for AVI2.0 formatted files. Now this library can handle files larger than 1GB.
|
data/LICENSE
CHANGED
data/bin/datamosh
CHANGED
|
@@ -8,6 +8,7 @@ require 'aviglitch'
|
|
|
8
8
|
output = './out.avi'
|
|
9
9
|
all = false
|
|
10
10
|
fake = false
|
|
11
|
+
tmpdir = nil
|
|
11
12
|
|
|
12
13
|
opts = OptionParser.new do |opts|
|
|
13
14
|
opts.banner = "datamosh - AviGlitch's datamoshing video generator."
|
|
@@ -28,10 +29,14 @@ opts = OptionParser.new do |opts|
|
|
|
28
29
|
exit
|
|
29
30
|
end
|
|
30
31
|
end
|
|
32
|
+
opts.on("--tmpdir [DIR]", "Specify the temporary directory") do |dir|
|
|
33
|
+
tmpdir = dir
|
|
34
|
+
end
|
|
31
35
|
opts.on_tail("-h", "--help", "Show this message") do
|
|
32
36
|
puts opts
|
|
33
37
|
exit
|
|
34
38
|
end
|
|
39
|
+
opts.version = AviGlitch::VERSION
|
|
35
40
|
end
|
|
36
41
|
|
|
37
42
|
input = opts.parse!
|
|
@@ -48,7 +53,7 @@ else
|
|
|
48
53
|
end
|
|
49
54
|
end
|
|
50
55
|
|
|
51
|
-
a = AviGlitch.open input.shift
|
|
56
|
+
a = AviGlitch.open input.shift, tmpdir: tmpdir
|
|
52
57
|
unless fake
|
|
53
58
|
a.glitch_with_index :keyframe do |frame, i|
|
|
54
59
|
(!all && i == 0) ? frame : "" # keep the first frame
|
|
@@ -62,7 +67,7 @@ else
|
|
|
62
67
|
end
|
|
63
68
|
|
|
64
69
|
input.each do |file|
|
|
65
|
-
b = AviGlitch.open file
|
|
70
|
+
b = AviGlitch.open file, tmpdir: tmpdir
|
|
66
71
|
unless fake
|
|
67
72
|
b.glitch :keyframe do |frame|
|
|
68
73
|
""
|
data/lib/aviglitch/avi.rb
CHANGED
|
@@ -79,16 +79,22 @@ module AviGlitch
|
|
|
79
79
|
# Object which represents RIFF structure.
|
|
80
80
|
attr_accessor :riff
|
|
81
81
|
|
|
82
|
-
attr_accessor :path, :movi #:nodoc:
|
|
82
|
+
attr_accessor :path, :movi, :tmpdir #:nodoc:
|
|
83
83
|
protected :path, :path=, :movi, :movi=
|
|
84
84
|
|
|
85
85
|
##
|
|
86
|
-
# Generates an instance
|
|
86
|
+
# Generates an instance.
|
|
87
87
|
def initialize path = nil
|
|
88
|
-
return
|
|
88
|
+
return unless @movi.nil? # don't reconfigure the path when cloning
|
|
89
|
+
self.path = path unless path.nil?
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
##
|
|
93
|
+
# Set +path+ of the source file.
|
|
94
|
+
def path= path #:nodoc:
|
|
89
95
|
@path = path
|
|
90
96
|
File.open(path, 'rb') do |io|
|
|
91
|
-
@movi = Tempfile.new 'aviglitch', binmode: true
|
|
97
|
+
@movi = Tempfile.new 'aviglitch', @tmpdir, binmode: true
|
|
92
98
|
@riff = []
|
|
93
99
|
@indices = []
|
|
94
100
|
@superidx = []
|
|
@@ -390,18 +396,19 @@ module AviGlitch
|
|
|
390
396
|
end
|
|
391
397
|
|
|
392
398
|
def initialize_copy avi #:nodoc:
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
399
|
+
md = Marshal.dump avi.indices
|
|
400
|
+
@indices = Marshal.load md
|
|
401
|
+
md = Marshal.dump avi.riff
|
|
402
|
+
@riff = Marshal.load md
|
|
403
|
+
newmovi = Tempfile.new 'aviglitch-clone', @tmpdir, binmode: true
|
|
404
|
+
movipos = avi.movi.pos
|
|
405
|
+
avi.movi.rewind
|
|
406
|
+
while d = avi.movi.read(BUFFER_SIZE) do
|
|
407
|
+
newmovi.print d
|
|
408
|
+
end
|
|
409
|
+
avi.movi.pos = movipos
|
|
403
410
|
newmovi.rewind
|
|
404
|
-
|
|
411
|
+
@movi = newmovi
|
|
405
412
|
end
|
|
406
413
|
|
|
407
414
|
def print_chunk io, chunk #:nodoc:
|
data/lib/aviglitch/base.rb
CHANGED
|
@@ -14,14 +14,16 @@ module AviGlitch
|
|
|
14
14
|
# Creates a new instance of AviGlitch::Base, open the file and
|
|
15
15
|
# make it ready to manipulate.
|
|
16
16
|
# It requires +path+ as Pathname or an instance of AviGlirtch::Avi.
|
|
17
|
-
def initialize path_or_object
|
|
17
|
+
def initialize path_or_object, tmpdir: nil
|
|
18
18
|
if path_or_object.kind_of?(Avi)
|
|
19
19
|
@avi = path_or_object
|
|
20
20
|
else
|
|
21
21
|
unless AviGlitch::Base.surely_formatted? path_or_object
|
|
22
22
|
raise 'Unsupported file passed.'
|
|
23
23
|
end
|
|
24
|
-
@avi = Avi.new
|
|
24
|
+
@avi = Avi.new
|
|
25
|
+
@avi.tmpdir = tmpdir
|
|
26
|
+
@avi.path = path_or_object
|
|
25
27
|
end
|
|
26
28
|
@frames = Frames.new @avi
|
|
27
29
|
end
|
data/lib/aviglitch/frames.rb
CHANGED
|
@@ -22,6 +22,7 @@ module AviGlitch
|
|
|
22
22
|
|
|
23
23
|
##
|
|
24
24
|
# Creates a new AviGlitch::Frames object.
|
|
25
|
+
# It takes AviGlitch::Avi as an argument.
|
|
25
26
|
def initialize avi
|
|
26
27
|
@avi = avi
|
|
27
28
|
end
|
|
@@ -31,7 +32,7 @@ module AviGlitch
|
|
|
31
32
|
# It returns Enumerator if a block is not given.
|
|
32
33
|
def each &block
|
|
33
34
|
if block_given?
|
|
34
|
-
Tempfile.open('temp', binmode: true) do |newmovi|
|
|
35
|
+
Tempfile.open('aviglitch-temp', @avi.tmpdir, binmode: true) do |newmovi|
|
|
35
36
|
@avi.process_movi do |indices, movi|
|
|
36
37
|
newindices = indices.select do |m|
|
|
37
38
|
movi.pos = m[:offset] + 8 # 8 for id and size
|
|
@@ -136,6 +137,7 @@ module AviGlitch
|
|
|
136
137
|
times.times do
|
|
137
138
|
result.concat frames
|
|
138
139
|
end
|
|
140
|
+
frames.terminate
|
|
139
141
|
result
|
|
140
142
|
end
|
|
141
143
|
|
|
@@ -175,7 +177,12 @@ module AviGlitch
|
|
|
175
177
|
l = 1 if l.nil?
|
|
176
178
|
tail = self.slice((b + l)..-1)
|
|
177
179
|
self.clear
|
|
178
|
-
|
|
180
|
+
temp = head + tail
|
|
181
|
+
self.concat temp
|
|
182
|
+
temp.terminate
|
|
183
|
+
head.terminate
|
|
184
|
+
tail.terminate
|
|
185
|
+
|
|
179
186
|
sliced
|
|
180
187
|
end
|
|
181
188
|
|
|
@@ -199,6 +206,10 @@ module AviGlitch
|
|
|
199
206
|
|
|
200
207
|
self.clear
|
|
201
208
|
self.concat new_frames
|
|
209
|
+
|
|
210
|
+
new_frames.terminate
|
|
211
|
+
head.terminate
|
|
212
|
+
rest.terminate
|
|
202
213
|
end
|
|
203
214
|
|
|
204
215
|
##
|
|
@@ -342,6 +353,7 @@ module AviGlitch
|
|
|
342
353
|
|
|
343
354
|
self.clear
|
|
344
355
|
self.concat new_frames
|
|
356
|
+
new_frames.terminate
|
|
345
357
|
self
|
|
346
358
|
end
|
|
347
359
|
|
|
@@ -369,6 +381,13 @@ module AviGlitch
|
|
|
369
381
|
@avi == other.avi
|
|
370
382
|
end
|
|
371
383
|
|
|
384
|
+
##
|
|
385
|
+
# Closes the internal temp file explicitly. This instance becomes unusable.
|
|
386
|
+
def terminate
|
|
387
|
+
@avi.close
|
|
388
|
+
@avi = nil
|
|
389
|
+
end
|
|
390
|
+
|
|
372
391
|
##
|
|
373
392
|
# Generates new AviGlitch::Base instance using self.
|
|
374
393
|
def to_avi
|
data/lib/aviglitch.rb
CHANGED
|
@@ -28,9 +28,16 @@ require 'aviglitch/frames'
|
|
|
28
28
|
# end
|
|
29
29
|
# avi.output '/path/to/broken.avi'
|
|
30
30
|
#
|
|
31
|
+
# Since v0.2.2, it allows to specify the temporary directory. This library
|
|
32
|
+
# duplicates and processes a input file in the temporary directory, which
|
|
33
|
+
# by default is +Dir.tmpdir+. To specify the custom temporary directory, use
|
|
34
|
+
# +tmpdir:+ option, like:
|
|
35
|
+
#
|
|
36
|
+
# avi = AviGlitch.open '/path/to/your.avi', tmpdir: '/path/to/tmpdir'
|
|
37
|
+
#
|
|
31
38
|
module AviGlitch
|
|
32
39
|
|
|
33
|
-
VERSION = '0.2.
|
|
40
|
+
VERSION = '0.2.2'
|
|
34
41
|
|
|
35
42
|
BUFFER_SIZE = 2 ** 24
|
|
36
43
|
|
|
@@ -38,11 +45,12 @@ module AviGlitch
|
|
|
38
45
|
##
|
|
39
46
|
# Returns AviGlitch::Base instance.
|
|
40
47
|
# It requires +path_or_frames+ as String or Pathname, or Frames instance.
|
|
41
|
-
|
|
48
|
+
# Additionally, it allows +tmpdir:+ as the internal temporary directory.
|
|
49
|
+
def open path_or_frames, tmpdir: nil
|
|
42
50
|
if path_or_frames.kind_of?(Frames)
|
|
43
51
|
path_or_frames.to_avi
|
|
44
52
|
else
|
|
45
|
-
AviGlitch::Base.new(Pathname(path_or_frames))
|
|
53
|
+
AviGlitch::Base.new(Pathname(path_or_frames), tmpdir: tmpdir)
|
|
46
54
|
end
|
|
47
55
|
end
|
|
48
56
|
end
|
data/spec/avi2_spec.rb
CHANGED
data/spec/aviglitch_spec.rb
CHANGED
|
@@ -92,7 +92,7 @@ describe AviGlitch do
|
|
|
92
92
|
}.should raise_error(IOError)
|
|
93
93
|
end
|
|
94
94
|
|
|
95
|
-
it 'can
|
|
95
|
+
it 'can close the file explicitly' do
|
|
96
96
|
avi = AviGlitch.open @in
|
|
97
97
|
avi.close
|
|
98
98
|
lambda {
|
|
@@ -160,7 +160,7 @@ describe AviGlitch do
|
|
|
160
160
|
end
|
|
161
161
|
end
|
|
162
162
|
|
|
163
|
-
it 'should check if keyframes exist
|
|
163
|
+
it 'should check if keyframes exist' do
|
|
164
164
|
a = AviGlitch.open @in
|
|
165
165
|
a.has_keyframe?.should be true
|
|
166
166
|
a.glitch :keyframe do |f|
|
|
@@ -190,5 +190,24 @@ describe AviGlitch do
|
|
|
190
190
|
|
|
191
191
|
expect(dc1).to eq(dc2)
|
|
192
192
|
end
|
|
193
|
+
|
|
194
|
+
it 'can be set custom temp dir' do
|
|
195
|
+
custom_tmpdir = Pathname.new(OUTPUT_DIR) + 'custom_tmpdir'
|
|
196
|
+
Dir.mkdir custom_tmpdir unless File.exist? custom_tmpdir
|
|
197
|
+
|
|
198
|
+
c = Dir.glob((custom_tmpdir + '*').to_s).size
|
|
199
|
+
b = AviGlitch.open @in, tmpdir: custom_tmpdir
|
|
200
|
+
b2 = b.frames[0, 100].to_avi
|
|
201
|
+
b2.frames.each do |f|
|
|
202
|
+
Dir.glob((custom_tmpdir + '*').to_s).size.should >= c
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
it 'shoud raise an error when specified temp dir is not writable' do
|
|
207
|
+
custom_tmpdir = Pathname.new(OUTPUT_DIR) + 'not_dir'
|
|
208
|
+
lambda {
|
|
209
|
+
AviGlitch.open @in, tmpdir: custom_tmpdir
|
|
210
|
+
}.should raise_error(SystemCallError)
|
|
211
|
+
end
|
|
193
212
|
|
|
194
213
|
end
|
data/spec/frames_spec.rb
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
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
|
|
@@ -479,8 +482,7 @@ describe AviGlitch::Frames do
|
|
|
479
482
|
expect(File.size(@out)).to be < File.size(@in)
|
|
480
483
|
end
|
|
481
484
|
|
|
482
|
-
it 'should use Enumerator as an external iterator'
|
|
483
|
-
: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
|
|
484
486
|
a = AviGlitch.open @in
|
|
485
487
|
e = a.frames.each
|
|
486
488
|
expect {
|
data/spec/spec_helper.rb
CHANGED
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.2.
|
|
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
|
|
@@ -103,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
103
103
|
- !ruby/object:Gem::Version
|
|
104
104
|
version: '0'
|
|
105
105
|
requirements: []
|
|
106
|
-
rubygems_version: 3.
|
|
106
|
+
rubygems_version: 3.5.11
|
|
107
107
|
signing_key:
|
|
108
108
|
specification_version: 4
|
|
109
109
|
summary: A Ruby library to destroy your AVI files.
|