enigmamachine 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +26 -21
- data/VERSION +1 -1
- data/enigmamachine.gemspec +7 -7
- data/lib/enigmamachine/views/encoders/edit.erb +20 -19
- data/lib/enigmamachine/views/encoders/encoder.erb +7 -7
- data/lib/enigmamachine/views/encoders/encoding_task.erb +5 -5
- data/lib/enigmamachine/views/encoders/form.erb +9 -3
- data/lib/enigmamachine/views/encoders/index.erb +10 -8
- data/lib/enigmamachine/views/encoders/new.erb +22 -18
- data/lib/enigmamachine/views/encoders/show.erb +21 -18
- data/lib/enigmamachine/views/encoding_tasks/edit.erb +18 -18
- data/lib/enigmamachine/views/encoding_tasks/form.erb +21 -7
- data/lib/enigmamachine/views/encoding_tasks/new.erb +22 -22
- data/lib/enigmamachine/views/videos/form.erb +8 -4
- data/lib/enigmamachine/views/videos/index.erb +38 -35
- data/lib/enigmamachine/views/videos/new.erb +21 -18
- data/lib/enigmamachine.rb +0 -1
- metadata +27 -6
data/README.rdoc
CHANGED
@@ -43,7 +43,7 @@ Then check it out in your browser, at http://localhost:2002. This web interface
|
|
43
43
|
exists so that you can configure your enigmamachine easily, and check its status.
|
44
44
|
|
45
45
|
Most of the time, though, your enigmamachine will be accessed not through a
|
46
|
-
browser, but by
|
46
|
+
browser, but by your program's code. Let's say you want your website to be able to
|
47
47
|
enocode video. You write the code for the video upload, so your web app can
|
48
48
|
receive the video. When the upload is complete, make an HTTP call something like this in your code:
|
49
49
|
|
@@ -67,41 +67,46 @@ called "HTTP_AUTHORIZATION".
|
|
67
67
|
|
68
68
|
Programmatic requests in Ruby might look something like this:
|
69
69
|
|
70
|
+
# enigma_client.rb:
|
71
|
+
|
70
72
|
require 'rubygems'
|
71
|
-
require 'httparty'
|
72
73
|
require 'base64'
|
74
|
+
require 'net/http'
|
75
|
+
require 'uri'
|
73
76
|
|
74
77
|
class EnigmaClient
|
75
78
|
|
76
|
-
include HTTParty
|
77
|
-
base_uri 'localhost:2002'
|
78
|
-
|
79
79
|
def initialize (u, p)
|
80
|
-
@
|
80
|
+
@username, @password = u, p
|
81
81
|
end
|
82
82
|
|
83
83
|
def post(path_to_video, encoder_id)
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
def encode_credentials(username, password)
|
93
|
-
"Basic " + Base64.encode64("#{username}:#{password}")
|
84
|
+
request = {:body => {
|
85
|
+
:video => {:file => path_to_video},
|
86
|
+
:encoder_id => encoder_id
|
87
|
+
}}
|
88
|
+
Net::HTTP.post_form(
|
89
|
+
URI.parse("http://#{@username}:#{@password}@localhost:2002/videos"),
|
90
|
+
request)
|
94
91
|
end
|
95
92
|
|
96
93
|
end
|
97
94
|
|
98
|
-
|
99
|
-
|
100
95
|
# Let's use it!
|
101
96
|
#
|
97
|
+
irb
|
98
|
+
require 'enigma_client'
|
102
99
|
EnigmaClient.new("admin", "admin").post("/path/to/your/uploaded/video.mp4", 1)
|
103
100
|
|
104
101
|
|
102
|
+
A simpler, wget-based approach might look like this:
|
103
|
+
|
104
|
+
wget http://admin:admin@localhost:2002/videos --post-data 'video[file]=/path/to/your/video.mp4&encoder_id=1'
|
105
|
+
|
106
|
+
<b>Don't use wget like this on a shared host, it's insecure</b> (read the wget
|
107
|
+
docs for more on this). This wget example is just to show you what's going on
|
108
|
+
when using a simple tool that most programmers know how to use.
|
109
|
+
|
105
110
|
== Encoders and Encoding Tasks
|
106
111
|
|
107
112
|
When you POST the location of a video to your enigmamachine, you need to tell
|
@@ -120,12 +125,12 @@ thumbnails", and save it.
|
|
120
125
|
So, now there's an encoder, but it won't do anything. Let's add some tasks,
|
121
126
|
by clicking on the "new task" link.
|
122
127
|
|
123
|
-
Give the first task a name, like
|
128
|
+
Give the first task a name, like <i>Encode a 320x240 flv at 25 frames per second</i>.
|
124
129
|
|
125
130
|
The output file suffix in this case will be *.flv*.
|
126
131
|
|
127
132
|
The encoding command you'll want to use would be
|
128
|
-
|
133
|
+
<i>-ab 128 -ar 22050 -b 500000 -r 25 -s 320x240</i>. This cryptic command string
|
129
134
|
tells ffmpeg to encode a Flash video at 320x240 pixels, with an audio bitrate
|
130
135
|
of 128kbps, an audio sample rate of 22.050khz, and a frame rate of 25fps. You
|
131
136
|
can find out what all the ffmpeg command line switches do by RTFMing at
|
@@ -134,7 +139,7 @@ http://www.ffmpeg.org/ffmpeg-doc.html
|
|
134
139
|
You would go on to define a couple more encoding tasks for your encoder.
|
135
140
|
Grabbing a screen frame in ffmpeg can be done with the following command-line
|
136
141
|
switches, which you can put into a task called, let's say,
|
137
|
-
|
142
|
+
<i>Grab a 320x240 JPEG thumbnail</i>:
|
138
143
|
|
139
144
|
-ss 00:00:05 -t 00:00:01 -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240
|
140
145
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.1
|
data/enigmamachine.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{enigmamachine}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["dave"]
|
12
|
-
s.date = %q{2010-07-
|
12
|
+
s.date = %q{2010-07-12}
|
13
13
|
s.default_executable = %q{enigmamachine}
|
14
14
|
s.description = %q{A RESTful video encoder which you can use as either a front-end to ffmpeg or headless on a server.}
|
15
15
|
s.email = %q{dave@caprica}
|
@@ -76,22 +76,22 @@ Gem::Specification.new do |s|
|
|
76
76
|
s.homepage = %q{http://github.com/futurechimp/enigmamachine}
|
77
77
|
s.rdoc_options = ["--charset=UTF-8"]
|
78
78
|
s.require_paths = ["lib"]
|
79
|
-
s.rubygems_version = %q{1.3.
|
79
|
+
s.rubygems_version = %q{1.3.7}
|
80
80
|
s.summary = %q{A RESTful video encoder.}
|
81
81
|
s.test_files = [
|
82
82
|
"test/support/blueprints.rb",
|
83
|
-
"test/helper.rb",
|
84
83
|
"test/test_encoding_queue.rb",
|
85
|
-
"test/
|
84
|
+
"test/helper.rb",
|
86
85
|
"test/test_encoder.rb",
|
87
|
-
"test/test_enigmamachine.rb"
|
86
|
+
"test/test_enigmamachine.rb",
|
87
|
+
"test/test_video.rb"
|
88
88
|
]
|
89
89
|
|
90
90
|
if s.respond_to? :specification_version then
|
91
91
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
92
92
|
s.specification_version = 3
|
93
93
|
|
94
|
-
if Gem::Version.new(Gem::
|
94
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
95
95
|
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
96
96
|
s.add_runtime_dependency(%q<data_mapper>, ["= 1.0.0"])
|
97
97
|
s.add_runtime_dependency(%q<eventmachine>, ["= 0.12.10"])
|
@@ -1,20 +1,21 @@
|
|
1
1
|
<div class="post">
|
2
|
-
<h1 class="title">Edit resource</h1>
|
3
|
-
<div class="entry">
|
4
|
-
<% unless @encoder.errors.empty? %>
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
<% end %>
|
14
|
-
|
15
|
-
<form action="/encoders/<%= @encoder.id%>" method="POST">
|
16
|
-
|
17
|
-
|
18
|
-
</form>
|
19
|
-
</div>
|
20
|
-
|
2
|
+
<h1 class="title">Edit resource</h1>
|
3
|
+
<div class="entry">
|
4
|
+
<% unless @encoder.errors.empty? %>
|
5
|
+
<div class="errors">
|
6
|
+
<h2>Errors on Encoder</h2>
|
7
|
+
<ul>
|
8
|
+
<% @encoder.errors.each do |error| %>
|
9
|
+
<li><%= error %></li>
|
10
|
+
<% end %>
|
11
|
+
</ul>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<form action="/encoders/<%= @encoder.id%>" method="POST">
|
16
|
+
<input name="_method" value="PUT" type="hidden"/>
|
17
|
+
<%= partial :"encoders/form" %>
|
18
|
+
</form>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
|
@@ -1,10 +1,10 @@
|
|
1
1
|
<li>
|
2
|
-
<%= encoders_encoder.name %> -
|
3
|
-
<a href="/encoders/<%= encoders_encoder.id %>">show</a>
|
4
|
-
<a href="/encoders/<%= encoders_encoder.id %>/edit">edit</a>
|
5
|
-
<form action="/encoders/<%= encoders_encoder.id %>" method="POST">
|
6
|
-
|
7
|
-
|
8
|
-
</form>
|
2
|
+
<%= encoders_encoder.name %> -
|
3
|
+
<a href="/encoders/<%= encoders_encoder.id %>">show</a>
|
4
|
+
<a href="/encoders/<%= encoders_encoder.id %>/edit">edit</a>
|
5
|
+
<form action="/encoders/<%= encoders_encoder.id %>" method="POST">
|
6
|
+
<input name="_method" value="DELETE" type="hidden"/>
|
7
|
+
<input type="submit" value="Delete"/>
|
8
|
+
</form>
|
9
9
|
</li>
|
10
10
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
<% task = encoders_encoding_task %>
|
2
2
|
<div id="task<%= task.id %>">
|
3
|
-
<strong><%= task.name %>:</strong> ffmpeg <%= task.command %> :: <i><%= task.output_file_suffix %></i> suffix :: <a href="/encoding_tasks/<%= task.id%>/edit">edit</a>
|
3
|
+
<strong><%= task.name %>:</strong> ffmpeg <%= task.command %> :: <i><%= task.output_file_suffix %></i> suffix :: <a href="/encoding_tasks/<%= task.id%>/edit">edit</a>
|
4
4
|
|
5
|
-
<form action="/encoding_tasks/<%= task.id %>" method="POST">
|
6
|
-
|
7
|
-
|
8
|
-
</form>
|
5
|
+
<form action="/encoding_tasks/<%= task.id %>" method="POST">
|
6
|
+
<input name="_method" value="DELETE" type="hidden"/>
|
7
|
+
<input type="submit" value="Delete"/>
|
8
|
+
</form>
|
9
9
|
</div>
|
10
10
|
|
@@ -1,5 +1,11 @@
|
|
1
|
-
<p
|
2
|
-
<
|
1
|
+
<p>
|
2
|
+
<strong>Name:</strong>
|
3
|
+
<input name="encoder[name]" id="encoder_name" value="<%= @encoder.name %>" size="50"></input>
|
4
|
+
</p>
|
5
|
+
|
3
6
|
<input type="submit" value="Save"/>
|
4
|
-
|
7
|
+
|
8
|
+
<p>
|
9
|
+
<a href="/encoders">cancel</a>
|
10
|
+
</p>
|
5
11
|
|
@@ -1,12 +1,14 @@
|
|
1
1
|
<div class="post">
|
2
2
|
<h1 class="title">Available encoders</h1>
|
3
3
|
<div class="entry">
|
4
|
-
<% unless @encoders.empty? %>
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
<% unless @encoders.empty? %>
|
5
|
+
<ul>
|
6
|
+
<%= partial :'encoders/encoder', :collection => @encoders %>
|
7
|
+
</ul>
|
8
|
+
<% end %>
|
9
|
+
<p>
|
10
|
+
<a href="/encoders/new">New encoder</a>
|
11
|
+
</p>
|
10
12
|
</div>
|
11
|
-
</div>
|
12
|
-
|
13
|
+
</div>
|
14
|
+
|
@@ -1,19 +1,23 @@
|
|
1
1
|
<div class="post">
|
2
|
-
<h1 class="title">Create a new encoder</h1>
|
3
|
-
<div class="entry">
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
<% end %>
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
2
|
+
<h1 class="title">Create a new encoder</h1>
|
3
|
+
<div class="entry">
|
4
|
+
|
5
|
+
<% unless @encoder.errors.empty? %>
|
6
|
+
<div class="errors">
|
7
|
+
<h2>Errors on Encoder</h2>
|
8
|
+
<ul>
|
9
|
+
<% @encoder.errors.each do |error| %>
|
10
|
+
<li>
|
11
|
+
<%= error %>
|
12
|
+
</li>
|
13
|
+
<% end %>
|
14
|
+
</ul>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
|
18
|
+
<form action="/encoders" method="POST">
|
19
|
+
<%= partial :"encoders/form" %>
|
20
|
+
</form>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
|
@@ -1,19 +1,22 @@
|
|
1
1
|
<div class="post">
|
2
|
-
<h1 class="title">Encoder: <%= @encoder.name %></h1>
|
3
|
-
<div class="entry">
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
</
|
19
|
-
|
2
|
+
<h1 class="title">Encoder: <%= @encoder.name %></h1>
|
3
|
+
<div class="entry">
|
4
|
+
<p>
|
5
|
+
Encoding tasks that this encoder performs:
|
6
|
+
</p>
|
7
|
+
<% if @encoder.encoding_tasks.empty? %>
|
8
|
+
None.
|
9
|
+
<% end %>
|
10
|
+
<%= partial(:"encoders/encoding_task", :collection => @encoder.encoding_tasks) %>
|
11
|
+
|
12
|
+
<p>
|
13
|
+
Add a <a href="/encoding_tasks/new/<%= @encoder.id%>">new</a> task to
|
14
|
+
this encoder.
|
15
|
+
</p>
|
16
|
+
|
17
|
+
<p>
|
18
|
+
<a href="/encoders">Back</a> to the list of available encoders.
|
19
|
+
</p>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
|
@@ -1,25 +1,25 @@
|
|
1
1
|
<div class="post">
|
2
|
-
<h1 class="title">Edit an encoding task</h1>
|
3
|
-
<div class="entry">
|
2
|
+
<h1 class="title">Edit an encoding task</h1>
|
3
|
+
<div class="entry">
|
4
4
|
|
5
|
-
<% unless @encoding_task.errors.empty? %>
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
<% unless @encoding_task.errors.empty? %>
|
6
|
+
<div class="errors">
|
7
|
+
<h2>Errors on Encoding Task</h2>
|
8
|
+
<ul>
|
9
|
+
<% @encoding_task.errors.each do |error| %>
|
10
|
+
<li><%= error %></li>
|
11
|
+
<% end %>
|
12
|
+
</ul>
|
13
|
+
</div>
|
11
14
|
<% end %>
|
12
|
-
</ul>
|
13
|
-
</div>
|
14
|
-
<% end %>
|
15
15
|
|
16
|
-
<form id="task-<%= @encoding_task.id%>-edit"
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
</form>
|
16
|
+
<form id="task-<%= @encoding_task.id%>-edit"
|
17
|
+
action="/encoding_tasks/<%= @encoding_task.id %>"
|
18
|
+
method="POST">
|
19
|
+
<input name="_method" value="PUT" type="hidden"></input>
|
20
|
+
<%= partial(:'encoding_tasks/form') %>
|
21
|
+
</form>
|
22
22
|
|
23
|
-
</div>
|
23
|
+
</div>
|
24
24
|
</div>
|
25
25
|
|
@@ -1,12 +1,26 @@
|
|
1
|
-
<p
|
2
|
-
|
1
|
+
<p>
|
2
|
+
Note: you can read about your options in the
|
3
|
+
<a href="http://www.ffmpeg.org/ffmpeg-doc.html">ffmpeg documentation</a>
|
4
|
+
</p>
|
5
|
+
<p>
|
6
|
+
<strong>Name:</strong> e.g. <em>encode a 320x240 flv at 25 frames per second</em>
|
7
|
+
<br/>
|
8
|
+
<input name="encoding_task[name]" id="encoding_task_name" value="<%= @encoding_task.name %>" ></input>
|
9
|
+
</p>
|
3
10
|
|
4
|
-
<p
|
5
|
-
|
11
|
+
<p>
|
12
|
+
<strong>Output file suffix:</strong> e.g. <em>.flv</em>
|
13
|
+
<br/>
|
14
|
+
<input name="encoding_task[output_file_suffix]" id="encoding_task_output_file_suffix" value="<%= @encoding_task.output_file_suffix %>" ></input>
|
15
|
+
</p>
|
6
16
|
|
7
|
-
<p
|
8
|
-
|
17
|
+
<p>
|
18
|
+
<strong>Encoding command:</strong> e.g. <em>-ab 128 -ar 22050 -b 500000 -r 25 -s 320x240<br/>
|
19
|
+
<input name="encoding_task[command]" id="encoding_task_command" value="<%= @encoding_task.command %>" size="70"></input>
|
20
|
+
</p>
|
9
21
|
|
10
22
|
<input type="submit" value="Save"/>
|
11
|
-
<p
|
23
|
+
<p>
|
24
|
+
<a href="/encoders/<%= @encoding_task.encoder.id %>">cancel</a>
|
25
|
+
</p>
|
12
26
|
|
@@ -1,23 +1,23 @@
|
|
1
1
|
<div class="post">
|
2
|
-
<h1 class="title">New encoding task</h1>
|
3
|
-
<div class="entry">
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
<
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
</div>
|
23
|
-
|
2
|
+
<h1 class="title">New encoding task</h1>
|
3
|
+
<div class="entry">
|
4
|
+
|
5
|
+
<% unless @encoding_task.errors.empty? %>
|
6
|
+
<div class="errors">
|
7
|
+
<h2>Errors on Encoding Task</h2>
|
8
|
+
<ul>
|
9
|
+
<% @encoding_task.errors.each do |error| %>
|
10
|
+
<li><%= error %></li>
|
11
|
+
<% end %>
|
12
|
+
</ul>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<p>Create a new encoding task for this encoder</p>
|
17
|
+
<form action="/encoding_tasks/<%= @encoding_task.encoder.id %>" method="POST">
|
18
|
+
<%= partial(:"encoding_tasks/form")%>
|
19
|
+
</form>
|
20
|
+
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
|
@@ -1,11 +1,15 @@
|
|
1
|
-
|
2
|
-
<
|
3
|
-
<
|
1
|
+
<p>
|
2
|
+
<strong>File location:</strong>
|
3
|
+
<br/>
|
4
|
+
<input name="video[file]" id="video_file" value="<%= @video.file %>" size="50"></input>
|
5
|
+
</p>
|
4
6
|
<select id="encoder_id" name="encoder_id">
|
5
7
|
<% @encoders.each do |e| %>
|
6
8
|
<option value="<%= e.id %>"><%= e.name %></option>
|
7
9
|
<% end %>
|
8
10
|
</select>
|
9
11
|
<input type="submit" value="Save"/>
|
10
|
-
<p
|
12
|
+
<p>
|
13
|
+
<a href="/videos">cancel</a>
|
14
|
+
</p>
|
11
15
|
|
@@ -1,36 +1,39 @@
|
|
1
1
|
<div class="post">
|
2
|
-
<h1 class="title">Videos</h1>
|
3
|
-
<div class="entry">
|
4
|
-
|
5
|
-
<p
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
<%
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
<%
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
<%
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
2
|
+
<h1 class="title">Videos</h1>
|
3
|
+
<div class="entry">
|
4
|
+
|
5
|
+
<p>
|
6
|
+
<a href="/videos/new">New video</a>
|
7
|
+
</p>
|
8
|
+
|
9
|
+
<% unless @encoding_videos.empty? %>
|
10
|
+
<h2>Currently encoding</h2>
|
11
|
+
<ul>
|
12
|
+
<%= partial :"videos/video", :collection => @encoding_videos %>
|
13
|
+
</ul>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<% unless @unencoded_videos.empty? %>
|
17
|
+
<h2>Waiting to encode</h2>
|
18
|
+
<ul>
|
19
|
+
<%= partial :"videos/video", :collection => @unencoded_videos %>
|
20
|
+
</ul>
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
<% unless @completed_videos.empty? %>
|
24
|
+
<h2>Completed</h2>
|
25
|
+
<ul>
|
26
|
+
<%= partial :"videos/video", :collection => @completed_videos %>
|
27
|
+
</ul>
|
28
|
+
<% end %>
|
29
|
+
|
30
|
+
<% unless @videos_with_errors.empty? %>
|
31
|
+
<h2>Failed to encode</h2>
|
32
|
+
<ul>
|
33
|
+
<%= partial :"videos/video", :collection => @videos_with_errors %>
|
34
|
+
</ul>
|
35
|
+
<% end %>
|
36
|
+
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
|
@@ -1,19 +1,22 @@
|
|
1
1
|
<div class="post">
|
2
|
-
<h1 class="title">Create a new video</h1>
|
3
|
-
<div class="entry">
|
4
|
-
<% unless @video.errors.empty? %>
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
2
|
+
<h1 class="title">Create a new video</h1>
|
3
|
+
<div class="entry">
|
4
|
+
<% unless @video.errors.empty? %>
|
5
|
+
<div class="errors">
|
6
|
+
<h2>Errors on video</h2>
|
7
|
+
<ul>
|
8
|
+
<% @video.errors.each do |error| %>
|
9
|
+
<li>
|
10
|
+
<%= error %>
|
11
|
+
</li>
|
12
|
+
<% end %>
|
13
|
+
</ul>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<form action="/videos" method="POST">
|
18
|
+
<%= partial :"videos/form" %>
|
19
|
+
</form>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
|
data/lib/enigmamachine.rb
CHANGED
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enigmamachine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 17
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
9
|
+
- 1
|
10
|
+
version: 0.3.1
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- dave
|
@@ -14,16 +15,18 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2010-07-
|
18
|
+
date: 2010-07-12 00:00:00 +01:00
|
18
19
|
default_executable: enigmamachine
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
name: thoughtbot-shoulda
|
22
23
|
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
24
26
|
requirements:
|
25
27
|
- - ">="
|
26
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
27
30
|
segments:
|
28
31
|
- 0
|
29
32
|
version: "0"
|
@@ -33,9 +36,11 @@ dependencies:
|
|
33
36
|
name: data_mapper
|
34
37
|
prerelease: false
|
35
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
36
40
|
requirements:
|
37
41
|
- - "="
|
38
42
|
- !ruby/object:Gem::Version
|
43
|
+
hash: 23
|
39
44
|
segments:
|
40
45
|
- 1
|
41
46
|
- 0
|
@@ -47,9 +52,11 @@ dependencies:
|
|
47
52
|
name: eventmachine
|
48
53
|
prerelease: false
|
49
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
50
56
|
requirements:
|
51
57
|
- - "="
|
52
58
|
- !ruby/object:Gem::Version
|
59
|
+
hash: 59
|
53
60
|
segments:
|
54
61
|
- 0
|
55
62
|
- 12
|
@@ -61,9 +68,11 @@ dependencies:
|
|
61
68
|
name: dm-sqlite-adapter
|
62
69
|
prerelease: false
|
63
70
|
requirement: &id004 !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
64
72
|
requirements:
|
65
73
|
- - "="
|
66
74
|
- !ruby/object:Gem::Version
|
75
|
+
hash: 23
|
67
76
|
segments:
|
68
77
|
- 1
|
69
78
|
- 0
|
@@ -75,9 +84,11 @@ dependencies:
|
|
75
84
|
name: rack-flash
|
76
85
|
prerelease: false
|
77
86
|
requirement: &id005 !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
78
88
|
requirements:
|
79
89
|
- - ">="
|
80
90
|
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
81
92
|
segments:
|
82
93
|
- 0
|
83
94
|
version: "0"
|
@@ -87,9 +98,11 @@ dependencies:
|
|
87
98
|
name: ruby-debug
|
88
99
|
prerelease: false
|
89
100
|
requirement: &id006 !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
90
102
|
requirements:
|
91
103
|
- - ">="
|
92
104
|
- !ruby/object:Gem::Version
|
105
|
+
hash: 3
|
93
106
|
segments:
|
94
107
|
- 0
|
95
108
|
version: "0"
|
@@ -99,9 +112,11 @@ dependencies:
|
|
99
112
|
name: sinatra
|
100
113
|
prerelease: false
|
101
114
|
requirement: &id007 !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
102
116
|
requirements:
|
103
117
|
- - "="
|
104
118
|
- !ruby/object:Gem::Version
|
119
|
+
hash: 23
|
105
120
|
segments:
|
106
121
|
- 1
|
107
122
|
- 0
|
@@ -113,9 +128,11 @@ dependencies:
|
|
113
128
|
name: thin
|
114
129
|
prerelease: false
|
115
130
|
requirement: &id008 !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
116
132
|
requirements:
|
117
133
|
- - ">="
|
118
134
|
- !ruby/object:Gem::Version
|
135
|
+
hash: 3
|
119
136
|
segments:
|
120
137
|
- 0
|
121
138
|
version: "0"
|
@@ -194,30 +211,34 @@ rdoc_options:
|
|
194
211
|
require_paths:
|
195
212
|
- lib
|
196
213
|
required_ruby_version: !ruby/object:Gem::Requirement
|
214
|
+
none: false
|
197
215
|
requirements:
|
198
216
|
- - ">="
|
199
217
|
- !ruby/object:Gem::Version
|
218
|
+
hash: 3
|
200
219
|
segments:
|
201
220
|
- 0
|
202
221
|
version: "0"
|
203
222
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
223
|
+
none: false
|
204
224
|
requirements:
|
205
225
|
- - ">="
|
206
226
|
- !ruby/object:Gem::Version
|
227
|
+
hash: 3
|
207
228
|
segments:
|
208
229
|
- 0
|
209
230
|
version: "0"
|
210
231
|
requirements: []
|
211
232
|
|
212
233
|
rubyforge_project:
|
213
|
-
rubygems_version: 1.3.
|
234
|
+
rubygems_version: 1.3.7
|
214
235
|
signing_key:
|
215
236
|
specification_version: 3
|
216
237
|
summary: A RESTful video encoder.
|
217
238
|
test_files:
|
218
239
|
- test/support/blueprints.rb
|
219
|
-
- test/helper.rb
|
220
240
|
- test/test_encoding_queue.rb
|
221
|
-
- test/
|
241
|
+
- test/helper.rb
|
222
242
|
- test/test_encoder.rb
|
223
243
|
- test/test_enigmamachine.rb
|
244
|
+
- test/test_video.rb
|