enigmamachine 0.3.0 → 0.3.1
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.
- 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
|