scottburton11-MovieBot 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2008-11-09
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
@@ -0,0 +1,174 @@
1
+ .DS_Store
2
+ .git/COMMIT_EDITMSG
3
+ .git/HEAD
4
+ .git/ORIG_HEAD
5
+ .git/config
6
+ .git/description
7
+ .git/hooks/applypatch-msg
8
+ .git/hooks/commit-msg
9
+ .git/hooks/post-commit
10
+ .git/hooks/post-receive
11
+ .git/hooks/post-update
12
+ .git/hooks/pre-applypatch
13
+ .git/hooks/pre-commit
14
+ .git/hooks/pre-rebase
15
+ .git/hooks/update
16
+ .git/index
17
+ .git/info/exclude
18
+ .git/logs/HEAD
19
+ .git/logs/refs/heads/master
20
+ .git/logs/refs/remotes/origin/master
21
+ .git/objects/02/e90c370dc24a7a5faf3cb0cbe5e58b19febe0e
22
+ .git/objects/04/6905539f6d0af83c897b2cd1ca43685b53ed04
23
+ .git/objects/04/9be2d2eca720234e0180bbaff51043409201f0
24
+ .git/objects/05/3d41d2450b122904e18f5e60c7ac4b9fa2a7b4
25
+ .git/objects/06/3710acc9a4e9536685e7a18c8e317e7789dfe0
26
+ .git/objects/06/bd54f94349e6b516995ab7a545175e6c353f2b
27
+ .git/objects/0b/ea68021e8eec252a1ebf8393de7d1348823112
28
+ .git/objects/0c/b1f7e71cba2feb90971884b450135742ae0595
29
+ .git/objects/0e/0a4673b1fdfa2a27af075dec3c3c463da167f8
30
+ .git/objects/17/53616495233863cf5425d15a795944a54cfcfd
31
+ .git/objects/1d/19f283f64763dbfed45cc472eb4efb6832f89d
32
+ .git/objects/22/61d69368131d7b3b6fa67d81e17babfc226320
33
+ .git/objects/23/9d9d4913f72d48733a41cd7d99df43870ef39b
34
+ .git/objects/24/bca1d5aa65c12ef827cc01e51beb1c30115758
35
+ .git/objects/26/210402a59450484d58eb1a1588c5aed7bb4cc2
36
+ .git/objects/2a/5948e6d32ddd58d113ed9eb706f8cedb93c843
37
+ .git/objects/33/834d430d16534ba883b5e40d2f355dd1b07630
38
+ .git/objects/34/a12817bf1b781c9229d6f6151f1b24a6597d73
39
+ .git/objects/36/6c22306e61aabebca7d1f0a81f0182cf323d68
40
+ .git/objects/3c/dff8195f3733590ccb005882b6ca6d5d0f7e9e
41
+ .git/objects/41/679536c6571745348ab928858fbdfb70325490
42
+ .git/objects/42/2bdf8fcb2e7c1c5d346d4b60737014b6ed52d5
43
+ .git/objects/43/0aa314997c1831928587b96f426231304e7f66
44
+ .git/objects/4c/dd786262a18276f15a13f62abc42643cde89f7
45
+ .git/objects/4e/ef0c7d15ebb3b9f235d94f7467c5c5762b7093
46
+ .git/objects/57/c39790b5c1ab3d26bc2f1fb42faf4ff58ca38f
47
+ .git/objects/5a/41ff2e41ae4797820c6003e343af076da56cbf
48
+ .git/objects/5f/46e42ae75cc4ab3912045413d667daff565731
49
+ .git/objects/60/525f0244bdd1c30868ade689c631a41a90ac0e
50
+ .git/objects/60/bc4ce9a4fb4a90eecf061f7d3b6957350a240f
51
+ .git/objects/62/7ce15a4e63c4cddcfab2acbc9f54776f5baf83
52
+ .git/objects/66/75560b05ab8645598cd561ceca635d2ab29bce
53
+ .git/objects/6c/683da13c02d1005caf48dfacdc7fb90d0775e0
54
+ .git/objects/6f/8801f91e2ba6c9f3b38f305d119e7c53054ba8
55
+ .git/objects/71/a5708be50bc914b98fe3105529946d503b084e
56
+ .git/objects/73/7c4f8b387f8eabbd910296dea296a977a364a7
57
+ .git/objects/7d/31a30676f13f382dea8dc246449c2ceb9cb6dd
58
+ .git/objects/7e/54f746e2e5b8872149234b9f493f474022b9ac
59
+ .git/objects/7f/596c82e8655905c7446d4f58397785a29ed165
60
+ .git/objects/85/2b05b0d7a2bb7bf125d3ef1dbbe624fe71d66a
61
+ .git/objects/90/c2ac15f1cd0960bc2c80f87a663741d4d2355a
62
+ .git/objects/94/457e6a420537beba1fd63f49d1e60897ec15ae
63
+ .git/objects/95/f8eaef5ca189659be673fd4ba40ade9ddc94be
64
+ .git/objects/98/5a8637ba350861d5dca2ee73ebb66a3525fd06
65
+ .git/objects/99/48e7c51a0fe47ce9a2fb5a2dc42a6fc3c0b629
66
+ .git/objects/9a/e61e6cee3fdd4448d3b662eda49e64704bdca7
67
+ .git/objects/9c/74149447ad083c30365185a4ee513c679a7676
68
+ .git/objects/9c/7d99bbfcdde8766ff3f62ae9bb9c5eff8423b8
69
+ .git/objects/9e/42bfc540d99535f9276df69d033d1044056e9a
70
+ .git/objects/9e/e7f3a9a93279d394af73ae553f675be89038a4
71
+ .git/objects/af/9d97bbfd9293da698d1c6ee2fa3889e820641e
72
+ .git/objects/b5/389542915827714cd22d72a575696b468e9c8c
73
+ .git/objects/b7/2c74df3760557ea1cf489918d3f117a08563d1
74
+ .git/objects/bc/9691b780f321bdd9b35a7d20d9c41321ef4357
75
+ .git/objects/cc/a1cc612e00b953cfeb2d944f75fe0a9dfc4661
76
+ .git/objects/cd/3972fe469dba432f6d67ec1798e7a9950bf34e
77
+ .git/objects/cd/7e9be819ca55fb694b220f448ae33fea4d55de
78
+ .git/objects/d3/89fde6c7245ced461b8e348580a332890f9a35
79
+ .git/objects/d9/4624c2de4211e637668ac4ac050a9f9614516c
80
+ .git/objects/db/08667e73b334062b7a0803fa5b5e3c2a3de40a
81
+ .git/objects/dc/18c18e21799f0c64a0111dc74249986bd390e5
82
+ .git/objects/e2/48f74d4b8636831a3b71b79e38231e679ffc5a
83
+ .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
84
+ .git/objects/ea/37145e866919bb493bb78577a267fc54555ed4
85
+ .git/objects/ef/63ac02adb9780c8e1c4758ec0b17024f8f3a4c
86
+ .git/objects/f3/772947ab0764b1b3f389af0c9058d99929740b
87
+ .git/objects/f6/9e8b80c2ad4e736d6e2fc528daf0c495dd80b6
88
+ .git/objects/f6/ed5a183ffe6a9a3a0da0f644e727b7fba31e96
89
+ .git/objects/f9/f60d0a8f94f19a9f55d4bcbfeaf7866207ada5
90
+ .git/refs/heads/master
91
+ .git/refs/remotes/origin/master
92
+ .git/refs/tags/0.0.1
93
+ .gitmodules
94
+ History.txt
95
+ Manifest.txt
96
+ MovieBot.gemspec
97
+ README.txt
98
+ Rakefile
99
+ bin/movie_bot
100
+ fixtures/image_formats.csv
101
+ fixtures/image_formats.yml
102
+ init.rb
103
+ lib/movie_bot.rb
104
+ lib/movie_bot/image_converter.rb
105
+ lib/movie_bot/movie_maker.rb
106
+ lib/movie_bot/queue_manager.rb
107
+ spec/movie_bot_spec.rb
108
+ spec/spec_helper.rb
109
+ test/test_movie_bot.rb
110
+ vendor/im_magick/.git/HEAD
111
+ vendor/im_magick/.git/config
112
+ vendor/im_magick/.git/description
113
+ vendor/im_magick/.git/hooks/applypatch-msg
114
+ vendor/im_magick/.git/hooks/commit-msg
115
+ vendor/im_magick/.git/hooks/post-commit
116
+ vendor/im_magick/.git/hooks/post-receive
117
+ vendor/im_magick/.git/hooks/post-update
118
+ vendor/im_magick/.git/hooks/pre-applypatch
119
+ vendor/im_magick/.git/hooks/pre-commit
120
+ vendor/im_magick/.git/hooks/pre-rebase
121
+ vendor/im_magick/.git/hooks/update
122
+ vendor/im_magick/.git/index
123
+ vendor/im_magick/.git/info/exclude
124
+ vendor/im_magick/.git/logs/HEAD
125
+ vendor/im_magick/.git/logs/refs/heads/master
126
+ vendor/im_magick/.git/logs/refs/remotes/origin/master
127
+ vendor/im_magick/.git/objects/pack/pack-53fa29483b3031c9a403ec9c13d6706b68ef081e.idx
128
+ vendor/im_magick/.git/objects/pack/pack-53fa29483b3031c9a403ec9c13d6706b68ef081e.keep
129
+ vendor/im_magick/.git/objects/pack/pack-53fa29483b3031c9a403ec9c13d6706b68ef081e.pack
130
+ vendor/im_magick/.git/refs/heads/master
131
+ vendor/im_magick/.git/refs/remotes/origin/HEAD
132
+ vendor/im_magick/.git/refs/remotes/origin/master
133
+ vendor/im_magick/.gitignore
134
+ vendor/im_magick/History.txt
135
+ vendor/im_magick/License.txt
136
+ vendor/im_magick/Manifest.txt
137
+ vendor/im_magick/README
138
+ vendor/im_magick/Rakefile
139
+ vendor/im_magick/config/hoe.rb
140
+ vendor/im_magick/config/requirements.rb
141
+ vendor/im_magick/lib/im_magick.rb
142
+ vendor/im_magick/lib/im_magick/command/base.rb
143
+ vendor/im_magick/lib/im_magick/command/collector.rb
144
+ vendor/im_magick/lib/im_magick/command/composite.rb
145
+ vendor/im_magick/lib/im_magick/command/convert.rb
146
+ vendor/im_magick/lib/im_magick/command/emitter.rb
147
+ vendor/im_magick/lib/im_magick/command/identify.rb
148
+ vendor/im_magick/lib/im_magick/command/mogrify.rb
149
+ vendor/im_magick/lib/im_magick/command/montage.rb
150
+ vendor/im_magick/lib/im_magick/command/runner.rb
151
+ vendor/im_magick/lib/im_magick/core_ext/class.rb
152
+ vendor/im_magick/lib/im_magick/core_ext/string.rb
153
+ vendor/im_magick/lib/im_magick/image.rb
154
+ vendor/im_magick/lib/im_magick/image_info.rb
155
+ vendor/im_magick/lib/im_magick/image_macros.rb
156
+ vendor/im_magick/lib/im_magick/merbtasks.rb
157
+ vendor/im_magick/lib/im_magick/util/geometry.rb
158
+ vendor/im_magick/lib/im_magick/util/temp_file.rb
159
+ vendor/im_magick/lib/im_magick/version.rb
160
+ vendor/im_magick/script/destroy
161
+ vendor/im_magick/script/generate
162
+ vendor/im_magick/setup.rb
163
+ vendor/im_magick/spec/fixtures/ImageMagick.jpg
164
+ vendor/im_magick/spec/fonts/union.ttf
165
+ vendor/im_magick/spec/fonts/unionbd.ttf
166
+ vendor/im_magick/spec/im_magick_convert_spec.rb
167
+ vendor/im_magick/spec/im_magick_image_info_spec.rb
168
+ vendor/im_magick/spec/im_magick_spec.rb
169
+ vendor/im_magick/spec/spec.opts
170
+ vendor/im_magick/spec/spec_helper.rb
171
+ vendor/im_magick/tasks/deployment.rake
172
+ vendor/im_magick/tasks/environment.rake
173
+ vendor/im_magick/tasks/rspec.rake
174
+ vendor/im_magick/tasks/website.rake
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{MovieBot}
5
+ s.version = "0.0.4"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Scott Burton"]
9
+ s.date = %q{2009-01-18}
10
+ s.description = %q{A simple movie converter, queue and directory crawler, all in one!}
11
+ s.email = %q{scottburton11@gmail.com}
12
+ s.files = ["History.txt", "Manifest.txt", "MovieBot.gemspec", "README.txt", "VERSION.yml", "bin/movie_bot", "lib/movie_bot", "lib/movie_bot/image_converter.rb", "lib/movie_bot/movie_maker.rb", "lib/movie_bot/queue_manager.rb", "lib/movie_bot.rb", "test/test_movie_bot.rb", "spec/movie_bot_spec.rb", "spec/spec_helper.rb"]
13
+ s.homepage = %q{http://wiki.github.com/scottburton11/moviebot/home}
14
+ s.require_paths = ["lib"]
15
+ s.rubygems_version = %q{1.3.1}
16
+ s.summary = %q{A simple movie converter, queue and directory crawler, all in one!}
17
+
18
+ if s.respond_to? :specification_version then
19
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
20
+ s.specification_version = 2
21
+
22
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
23
+ else
24
+ end
25
+ else
26
+ end
27
+ end
@@ -0,0 +1,66 @@
1
+ = MovieBot
2
+
3
+ http://wiki.github.com/scottburton11/moviebot
4
+
5
+ == DESCRIPTION:
6
+
7
+ MovieBot is a wrapper for MEncoder, ffmpeg and Apple Compressor.
8
+
9
+ It provides simple command-line usage, remote control via Starling queue,
10
+ and directory crawling suitable for cron jobs and directory watchers.
11
+
12
+ == FEATURES/PROBLEMS:
13
+
14
+
15
+ == SYNOPSIS:
16
+
17
+ Regular Usage:
18
+ movie_bot /path/to/input.mov -o /path/to/output.mov
19
+
20
+ In regular mode, you specify the input and output files.
21
+
22
+ Queue Mode:
23
+ movie_bot -q host:port:queue_name -o /path/to/output/
24
+
25
+ In queue mode, you specify the Memcache queue and name you want
26
+ to watch, and an output directory for files.
27
+
28
+ Crawl Mode:
29
+ movie_bot /path/to/input -c -o /path/to/output
30
+
31
+ In crawl mode, you specify a directory to crawl and an output
32
+ directory for files.
33
+
34
+ == REQUIREMENTS:
35
+
36
+ ImageMagick
37
+ Mplayer/Mencoder
38
+
39
+ == INSTALL:
40
+
41
+ git clone git@github.com:scottburton11/moviebot.git
42
+
43
+ == LICENSE:
44
+
45
+ (The MIT License)
46
+
47
+ Copyright (c) 2008 Scott Burton
48
+
49
+ Permission is hereby granted, free of charge, to any person obtaining
50
+ a copy of this software and associated documentation files (the
51
+ 'Software'), to deal in the Software without restriction, including
52
+ without limitation the rights to use, copy, modify, merge, publish,
53
+ distribute, sublicense, and/or sell copies of the Software, and to
54
+ permit persons to whom the Software is furnished to do so, subject to
55
+ the following conditions:
56
+
57
+ The above copyright notice and this permission notice shall be
58
+ included in all copies or substantial portions of the Software.
59
+
60
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
61
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
62
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
63
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
64
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
65
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
66
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 0
3
+ :patch: 4
4
+ :major: 0
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # == Synopsis
4
+ # MovieBot converts movies. You can run it in regular mode by providing the
5
+ # input and output filenames. In queue mode, input filenames are provided
6
+ # by reading a MemCache queue. Crawl mode will compress movies in the input
7
+ # directory that aren't already in the output directory.
8
+ #
9
+ # == Examples
10
+ #
11
+ # movie_bot /path/to/input.mov -o /path/to/output.mov
12
+ # movie_bot -q -o /path/to/output/
13
+ # movie_bot /path/to/input -c -o /path/to/output
14
+ #
15
+ # == Usage
16
+ # reguglar mode: movie_bot [options] /path/to/input -o /path/to/output
17
+ # queue mode: movie_bot [options] -q -o /path/to/output
18
+ # crawl mode: movie_bot [options] /path/to/input -c -o /path/to/output
19
+ #
20
+ # For help use: movie_bot -h
21
+
22
+ # == Options
23
+ # -h, --help Displays help message
24
+ # -v, --version Display the version, then exit
25
+ # -Q, --quiet Output as little as possible, overrides verbose
26
+ # -V, --verbose Verbose output
27
+ # -o, --output Set an output location
28
+ # -q, --queue Operate in queue mode
29
+ # {host:port:queue_name}
30
+ # -c, --crawl Operate in crawl mode
31
+ #
32
+ #
33
+ # == Author
34
+ # Scott Burton
35
+ #
36
+ # == Copyright
37
+ # Copyright (c) 2008 Scott Burton. Licensed under the MIT License:
38
+ # http://www.opensource.org/licenses/mit-license.php
39
+
40
+
41
+ require File.join(File.dirname(__FILE__), '../init.rb')
42
+
43
+
44
+ # Create and run the application
45
+ movie_bot = MovieBot.new(ARGV, STDIN)
46
+ movie_bot.run
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ require 'rubygems'
5
+
6
+ require 'optparse'
7
+ require 'rdoc/usage'
8
+ require 'ostruct'
9
+ require 'date'
10
+
11
+ require 'starling'
12
+
13
+ class MovieBot
14
+ VERSION = '0.0.2'
15
+
16
+ attr_reader :options
17
+
18
+ def initialize(arguments, stdin)
19
+ @arguments = arguments
20
+ @stdin = stdin
21
+
22
+ # Set defaults
23
+ @options = OpenStruct.new
24
+ @options.verbose = false
25
+ @options.quiet = false
26
+ @options.output = ENV["PWD"]
27
+ @options.mode = "standard"
28
+ @options.queue_host = "127.0.0.1"
29
+ @options.queue_port = "22122"
30
+ @options.queue_name = "render"
31
+ end
32
+
33
+ # Parse options, check arguments, then process the command
34
+ def run
35
+
36
+ if parsed_options? && arguments_valid?
37
+
38
+ puts "Start at #{DateTime.now}\n\n" if @options.verbose
39
+
40
+ output_options if @options.verbose # [Optional]
41
+
42
+ process_arguments
43
+ process_command
44
+
45
+ puts "\nFinished at #{DateTime.now}" if @options.verbose
46
+
47
+ else
48
+ output_usage
49
+ end
50
+
51
+ end
52
+
53
+ protected
54
+
55
+ def parsed_options?
56
+
57
+ # Specify options
58
+ opts = OptionParser.new
59
+ opts.on('-v', '--version') { output_version ; exit 0 }
60
+ opts.on('-h', '--help') { output_help }
61
+ opts.on('-V', '--verbose') { @options.verbose = true }
62
+ opts.on('-Q', '--quiet') { @options.quiet = true }
63
+ opts.on('-o', '--output FILE') { |path| @options.output = path }
64
+ opts.on('-q', '--queue HOST:PORT:NAME') {|queue| @options.mode = "queue"; @options.queue_host, @options.queue_port, @options.queue_name = queue.split(':') unless queue.empty?}
65
+ opts.on('-c', '--crawl') {@options.mode = "crawl"}
66
+
67
+ opts.parse!(@arguments) rescue return false
68
+
69
+ process_options
70
+ true
71
+ end
72
+
73
+ # Performs post-parse processing on options
74
+ def process_options
75
+ @options.verbose = false if @options.quiet
76
+ # @options.output = "#{@options.output}/#{File.basename(@options.input)}" if File.directory?(@options.output)
77
+ @options.output = "#{@options.output}" if (File.directory?(@options.output) && File.exists?(File.dirname(@options.output)))
78
+ end
79
+
80
+ def output_options
81
+ puts "Options:\n"
82
+
83
+ @options.marshal_dump.each do |name, val|
84
+ puts " #{name} = #{val}"
85
+ end
86
+ end
87
+
88
+ # True if required arguments were provided
89
+ def arguments_valid?
90
+
91
+ # true if @arguments.length == 1 && (File.directory?(@options.output) || File.exists?(File.dirname(@options.output))) && File.directory?(@options.input)
92
+ case @options.mode
93
+ when "queue"
94
+ true if File.directory?(@options.output)
95
+ when "crawl"
96
+ true if File.directory?(@options.output) && File.directory?(@options.input?)
97
+ else
98
+ true if @arguments.length == 1
99
+ end
100
+ end
101
+
102
+ # Setup the arguments
103
+ def process_arguments
104
+ @options.input = @arguments.first
105
+ end
106
+
107
+ def output_help
108
+ output_version
109
+ RDoc::usage() #exits app
110
+ end
111
+
112
+ def output_usage
113
+ RDoc::usage('usage') # gets usage from comments above
114
+ end
115
+
116
+ def output_version
117
+ puts "#{File.basename(__FILE__)} version #{VERSION}"
118
+ end
119
+
120
+ def process_command
121
+
122
+ case @options.mode
123
+ when "queue"
124
+ QueueRunner.new(@options.output, @options.queue_host, @options.queue_port, @options.queue_name)
125
+ when "crawl"
126
+
127
+ else
128
+ # images = ImageConverter.new(@options.input)
129
+ # images.convert
130
+ movie = MovieMaker.new(@options.input, @options.output)
131
+ movie.convert
132
+ end
133
+ #process_standard_input # [Optional]
134
+ end
135
+
136
+ def process_standard_input
137
+ input = @stdin.read
138
+ # TO DO - process input
139
+
140
+ # [Optional]
141
+ #@stdin.each do |line|
142
+ # # TO DO - process each line
143
+ #end
144
+ end
145
+ end
146
+
147
+
148
+ # TO DO - Add your Modules, Classes, etc
149
+
150
+
151
+ # Create and run the application
152
+ # movie_bot = MovieBot.new(ARGV, STDIN)
153
+ # movie_bot.run
@@ -0,0 +1,31 @@
1
+ class ImageConverter
2
+
3
+ require "rmagick"
4
+
5
+
6
+ def initialize(home)
7
+ @home = Dir.open(home)
8
+
9
+ FileUtils.mkdir_p(["#{@home.path}/jpg"])
10
+ @jpg_dir = Dir.open("#{@home.path}/jpg")
11
+ end
12
+
13
+ def convert
14
+ comps.each do |comp|
15
+ image = ImMagick::Image.file(comp)
16
+ image.convert.resize("720x486!")
17
+ image.convert.quality("100")
18
+ ext = ".#{image.filename.split(".").last}"
19
+ image.save("#{@jpg_dir.path}/#{File.basename(image.filename, ext)}.jpg")
20
+ end
21
+ end
22
+
23
+ def comps
24
+ (Dir.entries(@home.path) - [".", ".."]).map {|file| File.expand_path(@home.path) + "/#{file}"}
25
+ end
26
+
27
+ def images
28
+ comps.map {|frame| ImMagick::Image.file(frame)}
29
+ end
30
+
31
+ end
@@ -0,0 +1,160 @@
1
+ class Movie
2
+ def initialize(path)
3
+ @path = path
4
+ end
5
+
6
+ def path
7
+ @path
8
+ end
9
+ end
10
+
11
+ class ImageSequence
12
+ def initialize(path)
13
+ @path = path
14
+ end
15
+
16
+ def images
17
+
18
+ end
19
+
20
+ end
21
+
22
+ class Image
23
+ def initialize(path)
24
+
25
+ end
26
+
27
+ def self.extensions
28
+ # %w"jpg png gif dpx pct bmp"
29
+ end
30
+ end
31
+
32
+ class MovieMaker
33
+
34
+ def initialize(input, output)
35
+ if File.file?(input)
36
+ @builder = MencoderMovieCreator.new(input, output)
37
+ elsif File.directory?(input) && !Dir.entries(input).empty?
38
+ @builder = MencoderMovieFromImagesCreator.new(input, output)
39
+ else
40
+ raise RuntimeError
41
+ end
42
+ end
43
+
44
+ def convert
45
+ @builder.convert
46
+ end
47
+
48
+
49
+ def self.make_movie_from_images(frames_path, output_path)
50
+ jpg_dir = Dir.open("#{frames_path}")
51
+ jpgs = "#{jpg_dir.path}/*.jpg"
52
+ # system("mencoder mf://#{jpgs} \
53
+ # -mf w=720:h=486:fps=24:type=jpg \
54
+ # -ovc lavc \
55
+ # -lavcopts vcodec=mpeg4:mbd=2:trell:precmp=0:cmp=3:vbitrate=1200:vglobal=1:v4mv \
56
+ # -oac copy \
57
+ # -of lavf \
58
+ # -lavfopts format=mov \
59
+ # -o #{movie_path}/output.mov")
60
+ # system("mencoder mf://#{jpgs} \
61
+ # -mf w=1024:h=778:fps=24:type=jpg \
62
+ # -ovc raw \
63
+ # -of rawvideo \
64
+ # -o #{movie_path}/output.mov")
65
+ # system("mencoder mf://#{jpgs} \
66
+ # -mf w=2048:h=1556:fps=24:type=jpg \
67
+ # -ovc copy \
68
+ # -of lavf \
69
+ # -lavfopts format=mov \
70
+ # -vf scale=720:486 \
71
+ # -o #{movie_path}/output.mov ")
72
+ # system("mencoder mf://#{jpgs} \
73
+ # -mf w=720:h=486:fps=24 \
74
+ # -ovc copy \
75
+ # -of lavf \
76
+ # -lavfopts format=mov \
77
+ # -o #{movie_path}/output.mov ")
78
+ system("mencoder mf://#{jpgs} \
79
+ -mf w=720:h=486:fps=24 \
80
+ -ovc lavc \
81
+ -lavcopts vcodec=mjpeg \
82
+ -of lavf \
83
+ -lavfopts format=mov \
84
+ -o #{output_path} ")
85
+ # system("mencoder mf://#{jpgs} \
86
+ # -mf w=720:h=486:fps=24 \
87
+ # -ovc lavc \
88
+ # -lavcopts vcodec=qtrle \
89
+ # -ffourcc rle \
90
+ # -of lavf \
91
+ # -lavfopts format=mov \
92
+ # -o #{output_path} ")
93
+ # system("mencoder mf://#{jpgs} \
94
+ # -mf w=720:h=486:fps=24 \
95
+ # -ovc raw \
96
+ # -vf scale=720:486,format=yv12 \
97
+ # -of lavf \
98
+ # -lavfopts format=mov \
99
+ # -o #{output_path} ")
100
+
101
+ end
102
+
103
+ end
104
+
105
+ class MencoderMovieCreator
106
+ def initialize(input, output)
107
+ @input = Movie.new(input)
108
+ @output = "#{output}/#{File.basename(input)}"
109
+ end
110
+
111
+ def convert
112
+ exec("mencoder #{@input.path} #{setting} -o #{@output}; exit 0")
113
+ end
114
+
115
+ def setting
116
+ MencoderProfile.iphone
117
+ end
118
+
119
+ end
120
+
121
+ class MencoderMovieFromImagesCreator
122
+ def initialize(input, output)
123
+ @input = ImageSequence.new(input)
124
+ @output = output
125
+ end
126
+
127
+ def convert
128
+ exec('mencoder mf://#{@input.images} #{setting} -o #{@output}; exit 0')
129
+ end
130
+
131
+ def setting
132
+ MencoderProfile.mjpeg
133
+ end
134
+
135
+ end
136
+
137
+ class MencoderProfile
138
+ class << self
139
+ def iphone
140
+ "-lavfopts format=mp4 \
141
+ -oac faac=yes \
142
+ -faacopts mpeg=4:object=2:raw=yes:br=160 \
143
+ -ovc x264=yes \
144
+ -vf filmdint=crop=1904:1048:8:32,scale=480:-10,harddup,dsize=480:320:0 \
145
+ -x264encopts nocabac:level_idc=30:bframes=0:global_header=yes:threads=auto:subq=7:frameref=6:partitions=all:trellis=1:chroma_me=yes:me=umh:bitrate=1200 \
146
+ -fps 30000/1001 \
147
+ -ofps 24000/1001 \
148
+ -sws 9 \
149
+ -of lavf=yes"
150
+ end
151
+
152
+ def mjpeg
153
+ "-mf w=720:h=486:fps=24 \
154
+ -ovc lavc \
155
+ -lavcopts vcodec=mjpeg \
156
+ -of lavf \
157
+ -lavfopts format=mov"
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,61 @@
1
+ class EndOfQueue < RuntimeError
2
+ end
3
+
4
+ class RunLimitReachedError < RuntimeError
5
+ end
6
+
7
+ class MessageQueue
8
+
9
+ def initialize(host, port, queue)
10
+ @host = host
11
+ @port = port
12
+ @queue = queue
13
+ @m = Starling.new("#{@host}:#{@port}")
14
+ report_usage
15
+ end
16
+
17
+ def next
18
+ begin
19
+ @m.get("#{@queue}")
20
+ rescue EndOfQueue => e
21
+ puts "#{e.message}"
22
+ raise e
23
+ end
24
+ end
25
+
26
+ def report_usage
27
+ puts "MovieBot started in Queue Mode\nListening to host #{@host}:#{@port} for queue named '#{@queue}'\nType Ctrl-C to quit"
28
+ end
29
+ end
30
+
31
+ class QueueRunner
32
+ def initialize(output, host, port, queue)
33
+ @output = output
34
+ @mq = MessageQueue.new(host, port, queue)
35
+ run
36
+ end
37
+ def run
38
+ loop do
39
+ input = @mq.next
40
+ unless input.nil?
41
+ if fork.nil?
42
+ mov = MovieMaker.new(input, @output)
43
+ mov.convert
44
+ Process.wait
45
+ end
46
+ end
47
+ sleep 3
48
+ end
49
+ end
50
+ end
51
+
52
+ class ProcessCount
53
+ def initialize
54
+ processes.select{ |process| true unless (process =~ %r|#{@command.split.first}|).nil? }.size
55
+ end
56
+
57
+ def processes
58
+ `ps -axwww`
59
+ end
60
+
61
+ end
@@ -0,0 +1,23 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ # describe MovieBot::ImageConverter do
4
+ # before(:each) do
5
+ # project_home = mock("project_home")
6
+ # project_home.should_receive(:path).and_return("/Users/scott/DMTH_examples/CL005_PLATE/")
7
+ # @image_converter = MovieBot::ImageConverter.new(project_home.path)
8
+ # end
9
+ #
10
+ # it "should have an array of paths to frames" do
11
+ # @image_converter.frames.should be_a_kind_of(Array)
12
+ # end
13
+ #
14
+ #
15
+ # end
16
+ #
17
+
18
+
19
+ describe MovieBot, "main method" do
20
+ it "should description" do
21
+
22
+ end
23
+ end
@@ -0,0 +1,6 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../init.rb")
2
+ require 'spec'
3
+
4
+ # require 'rubygems'
5
+ # require 'spec'
6
+ # require File.join(File.dirname(__FILE__), 'lib')
File without changes
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scottburton11-MovieBot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Scott Burton
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-01-18 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: A simple movie converter, queue and directory crawler, all in one!
17
+ email: scottburton11@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - History.txt
26
+ - Manifest.txt
27
+ - MovieBot.gemspec
28
+ - README.txt
29
+ - VERSION.yml
30
+ - bin/movie_bot
31
+ - lib/movie_bot
32
+ - lib/movie_bot/image_converter.rb
33
+ - lib/movie_bot/movie_maker.rb
34
+ - lib/movie_bot/queue_manager.rb
35
+ - lib/movie_bot.rb
36
+ - test/test_movie_bot.rb
37
+ - spec/movie_bot_spec.rb
38
+ - spec/spec_helper.rb
39
+ has_rdoc: false
40
+ homepage: http://wiki.github.com/scottburton11/moviebot/home
41
+ post_install_message:
42
+ rdoc_options: []
43
+
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ version:
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ version:
58
+ requirements: []
59
+
60
+ rubyforge_project:
61
+ rubygems_version: 1.2.0
62
+ signing_key:
63
+ specification_version: 2
64
+ summary: A simple movie converter, queue and directory crawler, all in one!
65
+ test_files: []
66
+