enigmamachine 0.0.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/.document +5 -0
- data/.gitignore +26 -0
- data/LICENSE +20 -0
- data/README.rdoc +32 -0
- data/Rakefile +57 -0
- data/VERSION +1 -0
- data/bin/enigmamachine +15 -0
- data/lib/enigmamachine/config.ru +9 -0
- data/lib/enigmamachine/encoding_queue.rb +29 -0
- data/lib/enigmamachine/models/encoder.rb +54 -0
- data/lib/enigmamachine/models/encoding_task.rb +19 -0
- data/lib/enigmamachine/models/video.rb +37 -0
- data/lib/enigmamachine/public/default.css +233 -0
- data/lib/enigmamachine/public/images/Enigma-logo.jpg +0 -0
- data/lib/enigmamachine/public/images/bg01.jpg +0 -0
- data/lib/enigmamachine/public/images/bg02.jpg +0 -0
- data/lib/enigmamachine/public/images/bg03.jpg +0 -0
- data/lib/enigmamachine/public/images/bg04.jpg +0 -0
- data/lib/enigmamachine/public/images/img02.gif +0 -0
- data/lib/enigmamachine/public/images/img03.gif +0 -0
- data/lib/enigmamachine/public/images/img04.gif +0 -0
- data/lib/enigmamachine/public/images/img05.gif +0 -0
- data/lib/enigmamachine/public/images/img06.jpg +0 -0
- data/lib/enigmamachine/public/images/spacer.gif +0 -0
- data/lib/enigmamachine/views/encoders/edit.erb +20 -0
- data/lib/enigmamachine/views/encoders/encoder.erb +10 -0
- data/lib/enigmamachine/views/encoders/encoding_task.erb +10 -0
- data/lib/enigmamachine/views/encoders/form.erb +5 -0
- data/lib/enigmamachine/views/encoders/index.erb +12 -0
- data/lib/enigmamachine/views/encoders/new.erb +19 -0
- data/lib/enigmamachine/views/encoders/show.erb +19 -0
- data/lib/enigmamachine/views/encoding_tasks/edit.erb +23 -0
- data/lib/enigmamachine/views/encoding_tasks/form.erb +12 -0
- data/lib/enigmamachine/views/encoding_tasks/new.erb +23 -0
- data/lib/enigmamachine/views/index.erb +13 -0
- data/lib/enigmamachine/views/layout.erb +67 -0
- data/lib/enigmamachine/views/videos/form.erb +11 -0
- data/lib/enigmamachine/views/videos/index.erb +36 -0
- data/lib/enigmamachine/views/videos/new.erb +19 -0
- data/lib/enigmamachine/views/videos/video.erb +6 -0
- data/lib/enigmamachine.rb +179 -0
- data/lib/enigmamachine.sqlite3 +0 -0
- data/lib/ext/array_ext.rb +8 -0
- data/lib/ext/partials.rb +28 -0
- data/lib/init.rb +75 -0
- data/test/helper.rb +49 -0
- data/test/support/afile.mpg +0 -0
- data/test/support/blueprints.rb +29 -0
- data/test/test_encoder.rb +80 -0
- data/test/test_encoder_queue.rb +34 -0
- data/test/test_enigmamachine.rb +536 -0
- data/test/test_video.rb +84 -0
- metadata +141 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
<div class="post">
|
2
|
+
<h1 class="title">Edit an 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
|
+
<form id="task-<%= @encoding_task.id%>-edit" action="/encoding_tasks/<%= @encoding_task.id %>" method="POST">
|
17
|
+
<input name="_method" value="PUT" type="hidden"></input>
|
18
|
+
<%= partial(:'encoding_tasks/form') %>
|
19
|
+
</form>
|
20
|
+
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<p><strong>Name:</strong> e.g. <em>encode a 320x240 flv at 25 frames per second</em><br/>
|
2
|
+
<input name="encoding_task[name]" id="encoding_task_name" value="<%= @encoding_task.name %>" ></input></p>
|
3
|
+
|
4
|
+
<p><strong>Output file suffix:</strong> e.g. <em>.flv</em><br/>
|
5
|
+
<input name="encoding_task[output_file_suffix]" id="encoding_task_output_file_suffix" value="<%= @encoding_task.output_file_suffix %>" ></input></p>
|
6
|
+
|
7
|
+
<p><strong>Encoding command:</strong> e.g. <em>-ab 128 -ar 22050 -b 500000 -r 25 -s 320x240<br/>
|
8
|
+
<input name="encoding_task[command]" id="encoding_task_command" value="<%= @encoding_task.command %>" size="70"></input></p>
|
9
|
+
|
10
|
+
<input type="submit" value="Save"/>
|
11
|
+
<p><a href="/encoders/<%= @encoding_task.encoder.id %>">cancel</a></p>
|
12
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<div class="post">
|
2
|
+
<h1 class="title">New encoding task</h1>
|
3
|
+
<div class="entry">
|
4
|
+
|
5
|
+
|
6
|
+
<% unless @encoding_task.errors.empty? %>
|
7
|
+
<div class="errors">
|
8
|
+
<h2>Errors on Encoding Task</h2>
|
9
|
+
<ul>
|
10
|
+
<% @encoding_task.errors.each do |error| %>
|
11
|
+
<li><%= error %></li>
|
12
|
+
<% end %>
|
13
|
+
</ul>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<p>Create a new encoding task for this encoder</p>
|
18
|
+
<form action="/encoding_tasks/<%= @encoding_task.encoder.id %>" method="POST">
|
19
|
+
<%= partial(:"encoding_tasks/form")%>
|
20
|
+
</form>
|
21
|
+
|
22
|
+
</div>
|
23
|
+
</div>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<div class="post">
|
2
|
+
<h1 class="title">Your enigma machine</h1>
|
3
|
+
<div class="entry">
|
4
|
+
<p>It is encoding some videos.</p>
|
5
|
+
<% unless @videos.empty? %>
|
6
|
+
<p>Here are the next videos which will be encoded:</p>
|
7
|
+
<ul>
|
8
|
+
<%= partial :'videos/video', :collection => @videos %>
|
9
|
+
</ul>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<!--
|
3
|
+
Design by Free CSS Templates
|
4
|
+
http://www.freecsstemplates.org
|
5
|
+
Released for free under a Creative Commons Attribution 2.5 License
|
6
|
+
|
7
|
+
Name : Unqualified
|
8
|
+
Description: A two-column, fixed-width design.
|
9
|
+
Version : 1.0
|
10
|
+
Released : 20071220
|
11
|
+
|
12
|
+
-->
|
13
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
14
|
+
<head>
|
15
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
16
|
+
<title>Enigma Admin</title>
|
17
|
+
<meta name="keywords" content="" />
|
18
|
+
<meta name="description" content="" />
|
19
|
+
<link href="/default.css" rel="stylesheet" type="text/css" media="screen" />
|
20
|
+
</head>
|
21
|
+
<body>
|
22
|
+
<!-- start header -->
|
23
|
+
<div id="header">
|
24
|
+
<div id="logo">
|
25
|
+
<h1><a href="/">Enigma</a></h1>
|
26
|
+
<p>Admin</p>
|
27
|
+
</div>
|
28
|
+
<div id="menu">
|
29
|
+
<ul>
|
30
|
+
<li <%= 'class="active"' if request.path_info == "/" %>><a href="/">Home</a></li>
|
31
|
+
<li <%= 'class="active"' if request.path_info == "/encoders" %>><a href="/encoders">Available Encoders</a></li>
|
32
|
+
<li <%= 'class="active"' if request.path_info == "/encoders/new" %>><a href="/encoders/new">New Encoder</a></li>
|
33
|
+
<li <%= 'class="active"' if request.path_info == "/videos" %>><a href="/videos">Videos</a></li>
|
34
|
+
</ul>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<!-- end header -->
|
38
|
+
<!-- start page -->
|
39
|
+
<div id="page">
|
40
|
+
<!-- start content -->
|
41
|
+
<div id="content">
|
42
|
+
|
43
|
+
<%= yield %>
|
44
|
+
|
45
|
+
</div>
|
46
|
+
<!-- end content -->
|
47
|
+
<!-- start sidebar -->
|
48
|
+
<div id="sidebar">
|
49
|
+
<ul>
|
50
|
+
<li>
|
51
|
+
<h2>Future Chimp</h2>
|
52
|
+
<ul>
|
53
|
+
<li><a href="http://futurechimp.org">blog</a></li>
|
54
|
+
</ul>
|
55
|
+
</li>
|
56
|
+
</div>
|
57
|
+
<!-- end sidebar -->
|
58
|
+
</div>
|
59
|
+
<!-- end page -->
|
60
|
+
|
61
|
+
|
62
|
+
<div id="footer">
|
63
|
+
<p>Design by <a href="http://www.freecsstemplates.org/">Free CSS Templates</a> • Icons by <a href="http://www.famfamfam.com/">FAMFAMFAM</a>.</p>
|
64
|
+
</div>
|
65
|
+
</body>
|
66
|
+
</html>
|
67
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
|
2
|
+
<p><strong>File location:</strong><br/>
|
3
|
+
<input name="video[file]" id="video_file" value="<%= @video.file %>" size="50"></input></p>
|
4
|
+
<select id="encoder_id" name="encoder_id">
|
5
|
+
<% @encoders.each do |e| %>
|
6
|
+
<option value="<%= e.id %>"><%= e.name %></option>
|
7
|
+
<% end %>
|
8
|
+
</select>
|
9
|
+
<input type="submit" value="Save"/>
|
10
|
+
<p><a href="/videos">cancel</a></p>
|
11
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<div class="post">
|
2
|
+
<h1 class="title">Videos</h1>
|
3
|
+
<div class="entry">
|
4
|
+
|
5
|
+
<p><a href="/videos/new">New video</a></p>
|
6
|
+
|
7
|
+
<% unless @encoding_videos.empty? %>
|
8
|
+
<h2>Currently encoding</h2>
|
9
|
+
<ul>
|
10
|
+
<%= partial :"videos/video", :collection => @encoding_videos %>
|
11
|
+
</ul>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<% unless @unencoded_videos.empty? %>
|
15
|
+
<h2>Waiting to encode</h2>
|
16
|
+
<ul>
|
17
|
+
<%= partial :"videos/video", :collection => @unencoded_videos %>
|
18
|
+
</ul>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<% unless @completed_videos.empty? %>
|
22
|
+
<h2>Completed</h2>
|
23
|
+
<ul>
|
24
|
+
<%= partial :"videos/video", :collection => @completed_videos %>
|
25
|
+
</ul>
|
26
|
+
<% end %>
|
27
|
+
|
28
|
+
<% unless @videos_with_errors.empty? %>
|
29
|
+
<h2>Failed to encode</h2>
|
30
|
+
<ul>
|
31
|
+
<%= partial :"videos/video", :collection => @videos_with_errors %>
|
32
|
+
</ul>
|
33
|
+
<% end %>
|
34
|
+
|
35
|
+
</div>
|
36
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<div class="post">
|
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><%= error %></li>
|
10
|
+
<% end %>
|
11
|
+
</ul>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<form action="/videos" method="POST">
|
16
|
+
<%= partial :"videos/form" %>
|
17
|
+
</form>
|
18
|
+
</div>
|
19
|
+
|
@@ -0,0 +1,179 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/init.rb'
|
2
|
+
|
3
|
+
# Shows the enigma status page.
|
4
|
+
#
|
5
|
+
get '/' do
|
6
|
+
@videos = Video.all(:limit => 50, :order => [:created_at.asc])
|
7
|
+
erb :index
|
8
|
+
end
|
9
|
+
|
10
|
+
# Displays a list of all available encoders.
|
11
|
+
#
|
12
|
+
get '/encoders' do
|
13
|
+
@encoders = Encoder.all
|
14
|
+
erb :'encoders/index'
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
# Displays a form to create a new encoder.
|
19
|
+
#
|
20
|
+
get '/encoders/new' do
|
21
|
+
@encoder = Encoder.new
|
22
|
+
erb :'encoders/new'
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
# Displays an encoder.
|
27
|
+
#
|
28
|
+
get '/encoders/:id' do |id|
|
29
|
+
@encoder = Encoder.get(id)
|
30
|
+
@encoding_task = EncodingTask.new
|
31
|
+
erb :'encoders/show'
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
# Displays an edit page for an encoder.
|
36
|
+
#
|
37
|
+
get '/encoders/:id/edit' do |id|
|
38
|
+
@encoder = Encoder.get(id)
|
39
|
+
erb :"encoders/edit"
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
# Creates an encoder.
|
44
|
+
#
|
45
|
+
post '/encoders' do
|
46
|
+
@encoder = Encoder.new(params[:encoder])
|
47
|
+
if @encoder.save
|
48
|
+
flash[:notice] = "Encoder created."
|
49
|
+
redirect "/encoders/#{@encoder.id}"
|
50
|
+
else
|
51
|
+
erb :'encoders/new'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
# Updates an encoder
|
57
|
+
#
|
58
|
+
put '/encoders/:id' do |id|
|
59
|
+
@encoder = Encoder.get(id)
|
60
|
+
if @encoder.update(params[:encoder])
|
61
|
+
flash[:notice] = "Encoder updated."
|
62
|
+
redirect '/encoders'
|
63
|
+
else
|
64
|
+
erb :"encoders/edit"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
delete '/encoders/:id' do |id|
|
69
|
+
@encoder = Encoder.get(id)
|
70
|
+
@encoder.destroy!
|
71
|
+
redirect '/encoders'
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
# Show a form to make a new encoding task
|
76
|
+
#
|
77
|
+
get '/encoding_tasks/new/:encoder_id' do |encoder_id|
|
78
|
+
@encoding_task = EncodingTask.new
|
79
|
+
@encoding_task.encoder = Encoder.get(encoder_id)
|
80
|
+
erb :'encoding_tasks/new'
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
# Creates an encoding task.
|
85
|
+
#
|
86
|
+
post '/encoding_tasks/:encoder_id' do |encoder_id|
|
87
|
+
@encoding_task = EncodingTask.new(params[:encoding_task])
|
88
|
+
@encoder = Encoder.get(encoder_id)
|
89
|
+
@encoding_task.encoder = @encoder
|
90
|
+
if @encoding_task.save
|
91
|
+
flash[:notice] = "Encoding task created."
|
92
|
+
redirect "/encoders/#{@encoding_task.encoder.id}"
|
93
|
+
else
|
94
|
+
erb :'encoding_tasks/new'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
# Gets the edit form for an encoding task
|
100
|
+
#
|
101
|
+
get '/encoding_tasks/:id/edit' do |id|
|
102
|
+
@encoding_task = EncodingTask.get(id)
|
103
|
+
erb :'encoding_tasks/edit'
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
# Updates an encoding task
|
108
|
+
#
|
109
|
+
put '/encoding_tasks/:id' do |id|
|
110
|
+
@encoding_task = EncodingTask.get(id)
|
111
|
+
if @encoding_task.update(params[:encoding_task])
|
112
|
+
redirect "/encoders/#{@encoding_task.encoder.id}"
|
113
|
+
else
|
114
|
+
erb :'encoding_tasks/edit'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
delete '/encoding_tasks/:id' do |id|
|
119
|
+
@encoding_task = EncodingTask.get(id)
|
120
|
+
@encoder = @encoding_task.encoder
|
121
|
+
@encoding_task.destroy!
|
122
|
+
redirect "/encoders/#{id}"
|
123
|
+
end
|
124
|
+
|
125
|
+
# Displays a list of available videos
|
126
|
+
#
|
127
|
+
get '/videos' do
|
128
|
+
@completed_videos = Video.complete
|
129
|
+
@encoding_videos = Video.encoding
|
130
|
+
@videos_with_errors = Video.with_errors
|
131
|
+
@unencoded_videos = Video.unencoded
|
132
|
+
erb :'videos/index'
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
# Displays a form for creating a new video
|
137
|
+
#
|
138
|
+
get '/videos/new' do
|
139
|
+
@video = Video.new
|
140
|
+
@encoders = Encoder.all
|
141
|
+
erb :'videos/new'
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
# Creates a new video
|
146
|
+
#
|
147
|
+
post '/videos' do
|
148
|
+
@video = Video.new(params[:video])
|
149
|
+
@encoder = Encoder.get(params[:encoder_id])
|
150
|
+
@video.encoder = @encoder
|
151
|
+
if @video.save
|
152
|
+
redirect '/videos'
|
153
|
+
else
|
154
|
+
@encoders = Encoder.all
|
155
|
+
erb :'videos/new'
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def reset_encoding_videos
|
160
|
+
Video.encoding.each do |video|
|
161
|
+
video.state = "unencoded"
|
162
|
+
video.save!
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
|
167
|
+
# Starts the enigma encoding thread. The thread will be reabsorbed into the
|
168
|
+
# main Sinatra/thin thread once the periodic timer is added.
|
169
|
+
#
|
170
|
+
Thread.new do
|
171
|
+
until EM.reactor_running?
|
172
|
+
sleep 1
|
173
|
+
end
|
174
|
+
reset_encoding_videos
|
175
|
+
Log.info(":::: Starting encoder ::::")
|
176
|
+
queue = EncodingQueue.new
|
177
|
+
queue.start
|
178
|
+
end
|
179
|
+
|
Binary file
|
data/lib/ext/partials.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# An implementation of partials for Sinatra.
|
2
|
+
#
|
3
|
+
# Can be used like: <%= partial(:foo) %>
|
4
|
+
#
|
5
|
+
# Unlike Rails partials, the .erb files for these partials do not start with a
|
6
|
+
# leading underscore, i.e. the file name should be foo.rb, not _foo.rb.
|
7
|
+
#
|
8
|
+
# Liberated from:
|
9
|
+
# http://github.com/cschneid/irclogger/blob/master/lib/partials.rb
|
10
|
+
#
|
11
|
+
module Sinatra
|
12
|
+
module Partials
|
13
|
+
def partial(template, *args)
|
14
|
+
options = args.extract_options!
|
15
|
+
options.merge!(:layout => false)
|
16
|
+
if collection = options.delete(:collection) then
|
17
|
+
collection.inject([]) do |buffer, member|
|
18
|
+
buffer << erb(template, options.merge(:layout =>
|
19
|
+
false, :locals => {template.to_s.gsub!("/", "_").to_sym => member}))
|
20
|
+
# check with template.to_s.split("/").last.to_sym => member
|
21
|
+
end.join("\n")
|
22
|
+
else
|
23
|
+
erb(template, options)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
data/lib/init.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# Gems
|
2
|
+
#
|
3
|
+
require 'rubygems'
|
4
|
+
require 'sinatra'
|
5
|
+
require 'datamapper'
|
6
|
+
require 'ruby-debug'
|
7
|
+
require 'eventmachine'
|
8
|
+
require 'rack-flash'
|
9
|
+
require 'logger'
|
10
|
+
|
11
|
+
# Enigma code
|
12
|
+
#
|
13
|
+
require File.dirname(__FILE__) + '/enigmamachine'
|
14
|
+
require File.dirname(__FILE__) + '/enigmamachine/models/encoder'
|
15
|
+
require File.dirname(__FILE__) + '/enigmamachine/models/encoding_task'
|
16
|
+
require File.dirname(__FILE__) + '/enigmamachine/models/video'
|
17
|
+
require File.dirname(__FILE__) + '/enigmamachine/encoding_queue'
|
18
|
+
|
19
|
+
# Database config
|
20
|
+
#
|
21
|
+
configure :production do
|
22
|
+
db = "sqlite3:///#{Dir.pwd}/enigmamachine.sqlite3"
|
23
|
+
DataMapper.setup(:default, db)
|
24
|
+
end
|
25
|
+
|
26
|
+
configure :development do
|
27
|
+
db = "sqlite3:///#{Dir.pwd}/enigmamachine.sqlite3"
|
28
|
+
DataMapper.setup(:default, db)
|
29
|
+
end
|
30
|
+
|
31
|
+
configure :test do
|
32
|
+
db = "sqlite3::memory:"
|
33
|
+
DataMapper.setup(:default, db)
|
34
|
+
end
|
35
|
+
|
36
|
+
Video.auto_migrate! unless Video.storage_exists?
|
37
|
+
Encoder.auto_migrate! unless Encoder.storage_exists?
|
38
|
+
EncodingTask.auto_migrate! unless EncodingTask.storage_exists?
|
39
|
+
DataMapper.auto_upgrade!
|
40
|
+
|
41
|
+
# Extensions to Sinatra
|
42
|
+
#
|
43
|
+
require File.dirname(__FILE__) + '/ext/partials'
|
44
|
+
require File.dirname(__FILE__) + '/ext/array_ext'
|
45
|
+
|
46
|
+
# Set the views to the proper path inside the gem
|
47
|
+
#
|
48
|
+
set :views, File.dirname(__FILE__) + '/enigmamachine/views'
|
49
|
+
set :public, File.dirname(__FILE__) + '/enigmamachine/public'
|
50
|
+
|
51
|
+
|
52
|
+
# Register helpers
|
53
|
+
#
|
54
|
+
helpers do
|
55
|
+
include Sinatra::Partials
|
56
|
+
alias_method :h, :escape_html
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# Set up Rack authentication
|
61
|
+
#
|
62
|
+
use Rack::Auth::Basic do |username, password|
|
63
|
+
[username, password] == ['admin', 'admin']
|
64
|
+
end
|
65
|
+
|
66
|
+
# Include flash notices
|
67
|
+
#
|
68
|
+
use Rack::Session::Cookie
|
69
|
+
use Rack::Flash
|
70
|
+
|
71
|
+
configure do
|
72
|
+
Log = Logger.new("enigma.log")
|
73
|
+
Log.level = Logger::INFO
|
74
|
+
end
|
75
|
+
|
data/test/helper.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sinatra'
|
3
|
+
require 'rack/test'
|
4
|
+
require 'base64'
|
5
|
+
require 'machinist/data_mapper'
|
6
|
+
require 'faker'
|
7
|
+
require 'sham'
|
8
|
+
set :environment, :test
|
9
|
+
set :run, false
|
10
|
+
set :raise_errors, true
|
11
|
+
set :logging, false
|
12
|
+
require File.dirname(__FILE__) + '/../lib/init'
|
13
|
+
require File.dirname(__FILE__) + '/../lib/enigmamachine'
|
14
|
+
require File.expand_path(File.dirname(__FILE__) + "/support/blueprints")
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
module TestHelper
|
19
|
+
|
20
|
+
def app
|
21
|
+
# change to your app class if using the 'classy' style
|
22
|
+
Sinatra::Application.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def body
|
26
|
+
last_response.body
|
27
|
+
end
|
28
|
+
|
29
|
+
def status
|
30
|
+
last_response.status
|
31
|
+
end
|
32
|
+
|
33
|
+
include Rack::Test::Methods
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
require 'test/unit'
|
38
|
+
require 'shoulda'
|
39
|
+
|
40
|
+
Test::Unit::TestCase.send(:include, TestHelper)
|
41
|
+
|
42
|
+
def basic_auth_creds(username = 'admin', password = 'admin')
|
43
|
+
{'HTTP_AUTHORIZATION'=> encode_credentials(username, password)}
|
44
|
+
end
|
45
|
+
|
46
|
+
def encode_credentials(username, password)
|
47
|
+
"Basic " + Base64.encode64("#{username}:#{password}")
|
48
|
+
end
|
49
|
+
|
Binary file
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'machinist/data_mapper'
|
2
|
+
require 'faker'
|
3
|
+
require 'sham'
|
4
|
+
|
5
|
+
Encoder.blueprint do
|
6
|
+
name {"Blah encoder"}
|
7
|
+
end
|
8
|
+
|
9
|
+
Video.blueprint do
|
10
|
+
encoder
|
11
|
+
file { File.dirname(__FILE__) + "/afile.mpg" }
|
12
|
+
state { "unencoded" }
|
13
|
+
created_at DateTime.now
|
14
|
+
updated_at DateTime.now
|
15
|
+
end
|
16
|
+
|
17
|
+
EncodingTask.blueprint do
|
18
|
+
name { "320x240 flv"}
|
19
|
+
output_file_suffix { ".foo.flv" }
|
20
|
+
command { "-ss 00:00:02 -t 00:00:01 -vcodec mjpeg -vframes 1 -an -f rawvideo -s 180x136 -y"}
|
21
|
+
end
|
22
|
+
|
23
|
+
EncodingTask.blueprint(:with_encoder) do
|
24
|
+
name { "320x240 flv"}
|
25
|
+
output_file_suffix { ".foo.flv" }
|
26
|
+
command { "-ss 00:00:02 -t 00:00:01 -vcodec mjpeg -vframes 1 -an -f rawvideo -s 180x136 -y"}
|
27
|
+
encoder
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class TestEncoder < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "An Encoder instance" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@encoder = ::Encoder.make
|
9
|
+
end
|
10
|
+
|
11
|
+
should "be invalid without a name" do
|
12
|
+
@encoder.name = ""
|
13
|
+
assert !@encoder.valid?
|
14
|
+
end
|
15
|
+
|
16
|
+
should "have an encoding_tasks association" do
|
17
|
+
assert @encoder.respond_to? "encoding_tasks"
|
18
|
+
end
|
19
|
+
|
20
|
+
should "allow encoding_tasks to be added" do
|
21
|
+
encoder = Encoder.make_unsaved
|
22
|
+
task = EncodingTask.make_unsaved
|
23
|
+
assert_nothing_raised do
|
24
|
+
encoder.encoding_tasks << task
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "hitting the ffmpeg method" do
|
29
|
+
context "for an encoder with 1 task" do
|
30
|
+
setup do
|
31
|
+
video = Video.make
|
32
|
+
task = EncodingTask.make
|
33
|
+
video.encoder.encoding_tasks << task
|
34
|
+
video.encoder.save
|
35
|
+
video.encoder.encode(video)
|
36
|
+
@id = video.id
|
37
|
+
sleep 1
|
38
|
+
end
|
39
|
+
|
40
|
+
should "mark the video as encoding" do
|
41
|
+
video = Video.get(@id)
|
42
|
+
assert_equal "encoding", video.state
|
43
|
+
end
|
44
|
+
|
45
|
+
should_eventually "mark the video as complete" do
|
46
|
+
sleep 5
|
47
|
+
video = Video.get(@id)
|
48
|
+
assert_equal "complete", video.state
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
context "for an encoder with 2 tasks" do
|
54
|
+
setup do
|
55
|
+
video = Video.make
|
56
|
+
task = EncodingTask.make
|
57
|
+
2.times { video.encoder.encoding_tasks << EncodingTask.make }
|
58
|
+
video.encoder.save
|
59
|
+
video.encoder.encode(video)
|
60
|
+
@id = video.id
|
61
|
+
end
|
62
|
+
|
63
|
+
should "mark the video as encoding" do
|
64
|
+
sleep 1
|
65
|
+
video = Video.get(@id)
|
66
|
+
assert_equal "encoding", video.state
|
67
|
+
end
|
68
|
+
|
69
|
+
should_eventually "mark the video as complete" do
|
70
|
+
sleep 1
|
71
|
+
video = Video.get(@id)
|
72
|
+
assert_equal "complete", video.state
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|