moshy 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/moshy/ppulse.rb CHANGED
@@ -1,153 +1,153 @@
1
- module Moshy
2
- class PPulse
3
- def cli(args)
4
- opts = Slop::Options.new
5
- opts.banner = "Usage: moshy -m ppulse -i file.avi -o file_out.avi [options]\nmoshy -m inspect --help for details"
6
- opts.separator 'Required Parameters:'
7
- opts.string '-i', '--input', 'Input file path - must be an .avi. Clip to split in split mode, first clip in stitch mode'
8
- opts.string '-o', '--output', 'Output file path - will be appended with -#.avi for each frame in split mode'
9
- opts.separator 'Optional Parameters:'
10
- opts.string '-k', '--keep', 'Whether or not to keep standard frames. (default: true)', default: "true"
11
- opts.integer '-c', '--count', 'How many frames to grab forward from each interval. (default: 1)', default: 1
12
- opts.integer '-d', '--dupes', 'Number of times to multiply the frame (default: 30)', default: 30
13
- opts.integer '-n', '--interval', 'Which nth frames should be duplicated (default: 30)', default: 30
14
- opts.on '-h', '--help' do
15
- puts opts
16
- puts "\n"
17
- puts \
18
- "Takes c number of frames and every n frames and duplicates them a
19
- given amount, resulting in a consistent P-duplication datamosh that's
20
- good for creating rhythmic effects. This was originally created to
21
- create mosh effects in sync with a beat for a music video.
22
-
23
- You can specify what interval to get frames at with -n (--interval).
24
- You can specify how many frames to get from the current interval with
25
- -c (--count). You can specify how many times to duplicate a given
26
- frame with -d (--dupes). You can then specify whether or not to keep
27
- the original video's frames between the end of the duplication and
28
- where the next interval occurs with -k (--keep). Keeping original
29
- frames causes the original motion to continue after the P-frame dupe
30
- effect, whereas dropping original frames causes the video to snap
31
- into the motion of the frames at each interval. This is a more complex
32
- effect so I recommend experimenting with it!"
33
- exit
34
- end
35
-
36
- default = {
37
- :dupes => 30,
38
- :interval => 30,
39
- :count => 1,
40
- :keep => true
41
- }
42
-
43
- parser = Slop::Parser.new(opts)
44
- slop_options = parser.parse(ARGV)
45
- @options = default.merge(slop_options) { |key, oldval, newval|
46
- if newval.nil?
47
- oldval
48
- else
49
- newval
50
- end
51
- }
52
-
53
- if @options[:keep] == "false"
54
- @options[:keep] = false
55
- else
56
- @options[:keep] = true
57
- end
58
-
59
- # Check mandatory params
60
- mandatory = [:input, :output]
61
- missing = mandatory.select{ |param| @options[param].nil? }
62
- unless missing.empty?
63
- puts "Missing options: #{missing.join(', ')}"
64
- puts slop_options
65
- exit
66
- end
67
-
68
- puts "Opening file " + @options[:input] + "..."
69
- a = AviGlitch.open @options[:input] # Rewrite this line for your file.
70
- puts "Opened!"
71
-
72
- ppulse(a, @options[:output], @options[:interval], @options[:count], @options[:dupes], @options[:keep])
73
- end
74
-
75
- # Loops through a video file and grabs every `interval` frames then duplicates them
76
- # `duplicate_amount` times
77
- #
78
- # `leave_originals` will copy standard frames and only p-frame the last one every `interval`
79
- def ppulse(clip, output, interval = 30, count = 1, duplicate_amount = 30, leave_originals = true)
80
-
81
- puts "Size: " + clip.frames.size_of('videoframe').to_s
82
-
83
- frames = nil
84
-
85
- video_frame_counter = 0
86
-
87
- have_iframe = false
88
-
89
- if leave_originals
90
- first_index = 0
91
- second_index = 0
92
- clip.frames.each_with_index do |f, i|
93
- if f.is_videoframe?
94
- video_frame_counter += 1
95
- if video_frame_counter % interval == 0
96
- second_index = i
97
- puts "first index: " + first_index.to_s
98
- puts "second index: " + second_index.to_s
99
-
100
- clipped = clip.frames[first_index..(i + 5)]
101
- dupe_clip = clip.frames[i, count] * duplicate_amount
102
- if frames.nil?
103
- frames = clipped + dupe_clip
104
- else
105
- frames = frames + clipped + dupe_clip
106
- end
107
- puts "Current expected output frame count: " + frames.size.to_s
108
-
109
- first_index = i + 5
110
- end
111
- end
112
- end
113
- else
114
- # Harvest clip details
115
- clip.frames.each_with_index do |f, i|
116
- if f.is_videoframe?
117
- if !have_iframe && f.is_keyframe?
118
- puts "Added first iframe (necessary to avoid total corruption)"
119
- # no idea why i need to get 5
120
- frames = clip.frames[i, 1]
121
- have_iframe = true
122
- end
123
-
124
- # +1 to offset the first iframe
125
- if video_frame_counter % interval == 0 && f.is_deltaframe?
126
- puts "Processing frame " + video_frame_counter.to_s + " at index " + i.to_s
127
- # You might ask why we need to check if frames are nil when we already check
128
- # whether or not we have an i frame and if the above is a keyframe - that's
129
- # because datamoshers are crazy and might pass use clip with no leading iframe :)
130
- if frames.nil?
131
- puts "First frame, setting"
132
- clipped = clip.frames[i, count]
133
- frames = frames.concat( clipped * duplicate_amount )
134
- puts "Frame size"
135
- puts frames.size_of('videoframe')
136
- else
137
- puts "Current i: " + i.to_s
138
- puts "Duping frame " + i.to_s + " " + duplicate_amount.to_s + " times"
139
- frames = frames.concat( clip.frames[i, count] * duplicate_amount )
140
- puts "Next frame, size: " + frames.size.to_s
141
- end
142
- end
143
- video_frame_counter += 1
144
- end
145
- end
146
- end
147
-
148
- o = AviGlitch.open frames
149
- o.output output
150
- puts "Done! File processed to: " + output
151
- end
152
- end
153
- end
1
+ module Moshy
2
+ class PPulse
3
+ def cli(args)
4
+ opts = Slop::Options.new
5
+ opts.banner = "Usage: moshy -m ppulse -i file.avi -o file_out.avi [options]\nmoshy -m inspect --help for details"
6
+ opts.separator 'Required Parameters:'
7
+ opts.string '-i', '--input', 'Input file path - must be an .avi. Clip to split in split mode, first clip in stitch mode'
8
+ opts.string '-o', '--output', 'Output file path - will be appended with -#.avi for each frame in split mode'
9
+ opts.separator 'Optional Parameters:'
10
+ opts.string '-k', '--keep', 'Whether or not to keep standard frames. (default: true)', default: "true"
11
+ opts.integer '-c', '--count', 'How many frames to grab forward from each interval. (default: 1)', default: 1
12
+ opts.integer '-d', '--dupes', 'Number of times to multiply the frame (default: 30)', default: 30
13
+ opts.integer '-n', '--interval', 'Which nth frames should be duplicated (default: 30)', default: 30
14
+ opts.on '-h', '--help' do
15
+ puts opts
16
+ puts "\n"
17
+ puts \
18
+ "Takes c number of frames and every n frames and duplicates them a
19
+ given amount, resulting in a consistent P-duplication datamosh that's
20
+ good for creating rhythmic effects. This was originally created to
21
+ create mosh effects in sync with a beat for a music video.
22
+
23
+ You can specify what interval to get frames at with -n (--interval).
24
+ You can specify how many frames to get from the current interval with
25
+ -c (--count). You can specify how many times to duplicate a given
26
+ frame with -d (--dupes). You can then specify whether or not to keep
27
+ the original video's frames between the end of the duplication and
28
+ where the next interval occurs with -k (--keep). Keeping original
29
+ frames causes the original motion to continue after the P-frame dupe
30
+ effect, whereas dropping original frames causes the video to snap
31
+ into the motion of the frames at each interval. This is a more complex
32
+ effect so I recommend experimenting with it!"
33
+ exit
34
+ end
35
+
36
+ default = {
37
+ :dupes => 30,
38
+ :interval => 30,
39
+ :count => 1,
40
+ :keep => true
41
+ }
42
+
43
+ parser = Slop::Parser.new(opts)
44
+ slop_options = parser.parse(ARGV)
45
+ @options = default.merge(slop_options) { |key, oldval, newval|
46
+ if newval.nil?
47
+ oldval
48
+ else
49
+ newval
50
+ end
51
+ }
52
+
53
+ if @options[:keep] == "false"
54
+ @options[:keep] = false
55
+ else
56
+ @options[:keep] = true
57
+ end
58
+
59
+ # Check mandatory params
60
+ mandatory = [:input, :output]
61
+ missing = mandatory.select{ |param| @options[param].nil? }
62
+ unless missing.empty?
63
+ puts "Missing options: #{missing.join(', ')}"
64
+ puts slop_options
65
+ exit
66
+ end
67
+
68
+ puts "Opening file " + @options[:input] + "..."
69
+ a = AviGlitch.open @options[:input] # Rewrite this line for your file.
70
+ puts "Opened!"
71
+
72
+ ppulse(a, @options[:output], @options[:interval], @options[:count], @options[:dupes], @options[:keep])
73
+ end
74
+
75
+ # Loops through a video file and grabs every `interval` frames then duplicates them
76
+ # `duplicate_amount` times
77
+ #
78
+ # `leave_originals` will copy standard frames and only p-frame the last one every `interval`
79
+ def ppulse(clip, output, interval = 30, count = 1, duplicate_amount = 30, leave_originals = true)
80
+
81
+ puts "Size: " + clip.frames.size_of('videoframe').to_s
82
+
83
+ frames = nil
84
+
85
+ video_frame_counter = 0
86
+
87
+ have_iframe = false
88
+
89
+ if leave_originals
90
+ first_index = 0
91
+ second_index = 0
92
+ clip.frames.each_with_index do |f, i|
93
+ if f.is_videoframe?
94
+ video_frame_counter += 1
95
+ if video_frame_counter % interval == 0
96
+ second_index = i
97
+ puts "first index: " + first_index.to_s
98
+ puts "second index: " + second_index.to_s
99
+
100
+ clipped = clip.frames[first_index..(i + 5)]
101
+ dupe_clip = clip.frames[i, count] * duplicate_amount
102
+ if frames.nil?
103
+ frames = clipped + dupe_clip
104
+ else
105
+ frames = frames + clipped + dupe_clip
106
+ end
107
+ puts "Current expected output frame count: " + frames.size.to_s
108
+
109
+ first_index = i + 5
110
+ end
111
+ end
112
+ end
113
+ else
114
+ # Harvest clip details
115
+ clip.frames.each_with_index do |f, i|
116
+ if f.is_videoframe?
117
+ if !have_iframe && f.is_keyframe?
118
+ puts "Added first iframe (necessary to avoid total corruption)"
119
+ # no idea why i need to get 5
120
+ frames = clip.frames[i, 1]
121
+ have_iframe = true
122
+ end
123
+
124
+ # +1 to offset the first iframe
125
+ if video_frame_counter % interval == 0 && f.is_deltaframe?
126
+ puts "Processing frame " + video_frame_counter.to_s + " at index " + i.to_s
127
+ # You might ask why we need to check if frames are nil when we already check
128
+ # whether or not we have an i frame and if the above is a keyframe - that's
129
+ # because datamoshers are crazy and might pass use clip with no leading iframe :)
130
+ if frames.nil?
131
+ puts "First frame, setting"
132
+ clipped = clip.frames[i, count]
133
+ frames = frames.concat( clipped * duplicate_amount )
134
+ puts "Frame size"
135
+ puts frames.size_of('videoframe')
136
+ else
137
+ puts "Current i: " + i.to_s
138
+ puts "Duping frame " + i.to_s + " " + duplicate_amount.to_s + " times"
139
+ frames = frames.concat( clip.frames[i, count] * duplicate_amount )
140
+ puts "Next frame, size: " + frames.size.to_s
141
+ end
142
+ end
143
+ video_frame_counter += 1
144
+ end
145
+ end
146
+ end
147
+
148
+ o = AviGlitch.open frames
149
+ o.output output
150
+ puts "Done! File processed to: " + output
151
+ end
152
+ end
153
+ end
data/lib/moshy/prep.rb CHANGED
@@ -1,78 +1,78 @@
1
- module Moshy
2
- class Prep
3
- def cli(args)
4
- opts = Slop::Options.new
5
- opts.banner = "Usage: moshy.rb -m prep -i <file> -o <output> [options]\n"
6
- opts.separator 'Required Parameters:'
7
- opts.string '-i', '--input', 'Input file path - can be anything that ffmpeg supports.'
8
- opts.string '-o', '--output', 'File output path - should end in .avi.'
9
- opts.separator 'Optional Parameters:'
10
- opts.integer '-b', '--bitrate', 'Bitrate amount (kb/s). Defaults to 4196. Larger number means higher quality, but larger size.'
11
- opts.on '-h', '--help' do
12
- puts opts
13
- puts "\n"
14
- puts \
15
- "Preps a video file for datamoshing with moshy by converting it into an
16
- AVI with no B-Frames (they're not good for moshing), and placing as
17
- few I-Frames as possible. Requires ffmpeg be installed locally. Check
18
- the repository's README.md for more information on how to install ffmpeg.
19
-
20
- This command is meant to be a simple one-liner that makes your datamoshing
21
- workflow faster. Under the covers, it runs the following ffmpeg command:
22
-
23
- ffmpeg -i <moshy input> -bf 0 -g 600 -b:v <moshy bitrate> -o <moshy output>
24
-
25
- This takes in an input file (it should theoretically work with any video
26
- file type that ffmpeg supports), makes sure that no B-Frames are rendered,
27
- and sets the ideal I-frame interval to 600 (ffmpeg's max). This seems to
28
- mean that an I-frame will only show up every 30 to 25 seconds
29
- (600f / 30fps = 20s or 600f / 24fps = 25s), but I-Frames must be deposited
30
- wherever there is a hard cut or transition in a video where a P-frame would
31
- not be able to properly predict the motion of pixels."
32
- exit
33
- end
34
-
35
- default = {
36
- :bitrate => 4196
37
- }
38
-
39
- parser = Slop::Parser.new(opts)
40
- slop_options = parser.parse(ARGV)
41
- @options = default.merge(slop_options) { |key, oldval, newval|
42
- if newval.nil?
43
- oldval
44
- else
45
- newval
46
- end
47
- }
48
-
49
- # Check mandatory params
50
- mandatory = [:input, :output]
51
- missing = mandatory.select{ |param| @options[param].nil? }
52
- unless missing.empty?
53
- puts "Missing options: #{missing.join(', ')}"
54
- puts slop_options
55
- exit
56
- end
57
-
58
- prep @options[:input], @options[:output], @options[:bitrate]
59
- end
60
-
61
- def prep(input, output, bitrate)
62
- ffmpeg = Av::Commands::Ffmpeg.new
63
- ffmpeg.add_source input
64
- ffmpeg.add_destination output
65
-
66
- # Ensures all frames come out as P-frames, B-frames don't
67
- # dupe or mosh properly
68
- ffmpeg.add_output_param ['bf', 0]
69
- # Keyframe interval, sets as few I-frames as possible.
70
- # ffmpeg will complain about anything over 600 and cap it.
71
- ffmpeg.add_output_param ['g', 600]
72
- # Bitrate
73
- ffmpeg.add_output_param ['b:v', bitrate.to_s + 'k']
74
-
75
- ffmpeg.run
76
- end
77
- end
78
- end
1
+ module Moshy
2
+ class Prep
3
+ def cli(args)
4
+ opts = Slop::Options.new
5
+ opts.banner = "Usage: moshy.rb -m prep -i <file> -o <output> [options]\n"
6
+ opts.separator 'Required Parameters:'
7
+ opts.string '-i', '--input', 'Input file path - can be anything that ffmpeg supports.'
8
+ opts.string '-o', '--output', 'File output path - should end in .avi.'
9
+ opts.separator 'Optional Parameters:'
10
+ opts.integer '-b', '--bitrate', 'Bitrate amount (kb/s). Defaults to 4196. Larger number means higher quality, but larger size.'
11
+ opts.on '-h', '--help' do
12
+ puts opts
13
+ puts "\n"
14
+ puts \
15
+ "Preps a video file for datamoshing with moshy by converting it into an
16
+ AVI with no B-Frames (they're not good for moshing), and placing as
17
+ few I-Frames as possible. Requires ffmpeg be installed locally. Check
18
+ the repository's README.md for more information on how to install ffmpeg.
19
+
20
+ This command is meant to be a simple one-liner that makes your datamoshing
21
+ workflow faster. Under the covers, it runs the following ffmpeg command:
22
+
23
+ ffmpeg -i <moshy input> -bf 0 -g 600 -b:v <moshy bitrate> -o <moshy output>
24
+
25
+ This takes in an input file (it should theoretically work with any video
26
+ file type that ffmpeg supports), makes sure that no B-Frames are rendered,
27
+ and sets the ideal I-frame interval to 600 (ffmpeg's max). This seems to
28
+ mean that an I-frame will only show up every 30 to 25 seconds
29
+ (600f / 30fps = 20s or 600f / 24fps = 25s), but I-Frames must be deposited
30
+ wherever there is a hard cut or transition in a video where a P-frame would
31
+ not be able to properly predict the motion of pixels."
32
+ exit
33
+ end
34
+
35
+ default = {
36
+ :bitrate => 4196
37
+ }
38
+
39
+ parser = Slop::Parser.new(opts)
40
+ slop_options = parser.parse(ARGV)
41
+ @options = default.merge(slop_options) { |key, oldval, newval|
42
+ if newval.nil?
43
+ oldval
44
+ else
45
+ newval
46
+ end
47
+ }
48
+
49
+ # Check mandatory params
50
+ mandatory = [:input, :output]
51
+ missing = mandatory.select{ |param| @options[param].nil? }
52
+ unless missing.empty?
53
+ puts "Missing options: #{missing.join(', ')}"
54
+ puts slop_options
55
+ exit
56
+ end
57
+
58
+ prep @options[:input], @options[:output], @options[:bitrate]
59
+ end
60
+
61
+ def prep(input, output, bitrate)
62
+ ffmpeg = Av::Commands::Ffmpeg.new
63
+ ffmpeg.add_source input
64
+ ffmpeg.add_destination output
65
+
66
+ # Ensures all frames come out as P-frames, B-frames don't
67
+ # dupe or mosh properly
68
+ ffmpeg.add_output_param ['bf', 0]
69
+ # Keyframe interval, sets as few I-frames as possible.
70
+ # ffmpeg will complain about anything over 600 and cap it.
71
+ ffmpeg.add_output_param ['g', 600]
72
+ # Bitrate
73
+ ffmpeg.add_output_param ['b:v', bitrate.to_s + 'k']
74
+
75
+ ffmpeg.run
76
+ end
77
+ end
78
+ end
data/lib/moshy/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- module Moshy
2
- VERSION = "1.0.0"
3
- end
1
+ module Moshy
2
+ VERSION = "2.0.0"
3
+ end
data/lib/moshy.rb CHANGED
@@ -1,13 +1,13 @@
1
- require "aviglitch"
2
- require "av"
3
- require_relative "moshy/version"
4
- require_relative "moshy/inspect"
5
- require_relative "moshy/isplit"
6
- require_relative "moshy/pdupe"
7
- require_relative "moshy/bake"
8
- require_relative "moshy/prep"
9
- require_relative "moshy/ppulse"
10
-
11
- module Moshy
12
- # Empty skeleton - just used to include the others
13
- end
1
+ require "aviglitch"
2
+ require "av"
3
+ require_relative "moshy/version"
4
+ require_relative "moshy/inspect"
5
+ require_relative "moshy/isplit"
6
+ require_relative "moshy/pdupe"
7
+ require_relative "moshy/bake"
8
+ require_relative "moshy/prep"
9
+ require_relative "moshy/ppulse"
10
+
11
+ module Moshy
12
+ # Empty skeleton - just used to include the others
13
+ end
data/moshy.gemspec CHANGED
@@ -1,27 +1,27 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'moshy/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "moshy"
8
- spec.version = Moshy::VERSION
9
- spec.summary = "datamoshing utility kit for common tasks with AVI files"
10
- spec.description = spec.summary
11
- spec.authors = ["wayspurrchen"]
12
- spec.email = 'wayspurrchen@gmail.com'
13
- spec.homepage = 'https://github.com/wayspurrchen/moshy'
14
- spec.license = 'MIT'
15
-
16
- spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
20
-
21
- spec.add_runtime_dependency "slop"
22
- spec.add_runtime_dependency "aviglitch"
23
- spec.add_runtime_dependency "av"
24
-
25
- spec.add_development_dependency "bundler", "~> 1.6"
26
- spec.add_development_dependency "rake"
27
- end
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'moshy/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "moshy"
8
+ spec.version = Moshy::VERSION
9
+ spec.summary = "datamoshing utility kit for common tasks with AVI files"
10
+ spec.description = spec.summary
11
+ spec.authors = ["wayspurrchen"]
12
+ spec.email = 'wayspurrchen@gmail.com'
13
+ spec.homepage = 'https://github.com/wayspurrchen/moshy'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "slop", "~> 4.2.1"
22
+ spec.add_runtime_dependency "aviglitch"
23
+ spec.add_runtime_dependency "av"
24
+
25
+ spec.add_development_dependency "bundler"
26
+ spec.add_development_dependency "rake"
27
+ end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moshy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - wayspurrchen
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-12 00:00:00.000000000 Z
11
+ date: 2022-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: slop
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 4.2.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 4.2.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: aviglitch
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1.6'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '1.6'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -88,6 +88,7 @@ extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
90
  - ".gitignore"
91
+ - DEVNOTES.md
91
92
  - Gemfile
92
93
  - LICENSE.txt
93
94
  - README.md
@@ -106,7 +107,7 @@ homepage: https://github.com/wayspurrchen/moshy
106
107
  licenses:
107
108
  - MIT
108
109
  metadata: {}
109
- post_install_message:
110
+ post_install_message:
110
111
  rdoc_options: []
111
112
  require_paths:
112
113
  - lib
@@ -121,9 +122,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
122
  - !ruby/object:Gem::Version
122
123
  version: '0'
123
124
  requirements: []
124
- rubyforge_project:
125
- rubygems_version: 2.2.2
126
- signing_key:
125
+ rubygems_version: 3.3.7
126
+ signing_key:
127
127
  specification_version: 4
128
128
  summary: datamoshing utility kit for common tasks with AVI files
129
129
  test_files: []