ankoder 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ == 0.0.2 2008-02-25
2
+
3
+ * 1 major enhancement:
4
+ * include the plugin lib subfile
5
+
1
6
  == 0.0.1 2008-02-25
2
7
 
3
8
  * 1 major enhancement:
data/Manifest.txt CHANGED
@@ -6,7 +6,16 @@ Rakefile
6
6
  config/hoe.rb
7
7
  config/requirements.rb
8
8
  lib/ankoder.rb
9
+ lib/ankoder/account.rb
10
+ lib/ankoder/auth.rb
11
+ lib/ankoder/base.rb
12
+ lib/ankoder/browser.rb
13
+ lib/ankoder/download.rb
14
+ lib/ankoder/ext.rb
15
+ lib/ankoder/job.rb
16
+ lib/ankoder/profile.rb
9
17
  lib/ankoder/version.rb
18
+ lib/ankoder/video.rb
10
19
  log/debug.log
11
20
  script/destroy
12
21
  script/generate
data/config/hoe.rb CHANGED
@@ -28,8 +28,7 @@ Run 'rubyforge setup' to prepare your env for access to Rubyforge
28
28
  end
29
29
 
30
30
 
31
- REV = nil
32
- ENV["VERSION"] = "0.0.1"
31
+ REV = nil
33
32
  # UNCOMMENT IF REQUIRED:
34
33
  # REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
35
34
  VERS = Ankoder::VERSION::STRING + (REV ? ".#{REV}" : "")
@@ -0,0 +1,32 @@
1
+ module Ankoder
2
+ class Account < Base #:nodoc:
3
+ def new_record?
4
+ false
5
+ end
6
+
7
+ def update_attributes(attributes={})
8
+ attributes.delete "account"
9
+ attributes.keys.each do |k|
10
+ attributes.merge!("user[#{k.to_s}]" => attributes[k])
11
+ attributes.delete k
12
+ end
13
+
14
+ if Account.update(id, attributes)
15
+ reload
16
+ true
17
+ end
18
+ end
19
+
20
+ def reload
21
+ @attributes = Account.find.attributes
22
+ end
23
+
24
+ def id
25
+ ""
26
+ end
27
+
28
+ def self.find(*args)
29
+ new(Ankoder::response(Browser::get(self.path, self.session).body))
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,83 @@
1
+ module Ankoder
2
+ # Authenticate to the ankoder service
3
+ #
4
+ # user = Auth.create("login", "password")
5
+ # user.account
6
+ #
7
+ # If you want to recover a session:
8
+ #
9
+ # user = Auth.recover(session_id)
10
+ # user.account
11
+ #
12
+ # The initialize and create methods can take blocks.
13
+ #
14
+ # Auth.create("login", "password") do |user|
15
+ # video = user.videos.find(:first)
16
+ # profile = user.profiles.find(:first, :conditions => {:name => "iPod 4:3"})
17
+ # user.jobs.create :original_file_id => video.id, :profile_id => profile.id
18
+ # end
19
+ #
20
+ # All the resources (pluralized) are available within the Auth class:
21
+ #
22
+ # jobs, videos, profiles, downloads, account
23
+ #
24
+ class Auth
25
+ attr_reader :session
26
+ @@sessions = {}
27
+
28
+ # Authenticate to the _ankoderapi_session service
29
+ #
30
+ # options can be:
31
+ #
32
+ # * <tt>:login</tt> _ankoderapi_session username
33
+ # * <tt>:password</tt> _ankoderapi_session password
34
+ # * <tt>:session</tt> A previous session, using this option, you will not be reconnected, you will just recover your session
35
+ def initialize(options={}, &block)
36
+ if options[:session]
37
+ @session = options[:session]
38
+ else
39
+ @session = Browser::login(options[:login], options[:password])
40
+ @@sessions.merge!(@session => true)
41
+ end
42
+ yield self if block_given?
43
+ end
44
+
45
+ # Same as initialize
46
+ #
47
+ # Auth::create 'login', 'password'
48
+ def self.create(login, password, &block)
49
+ new(:login => login, :password => password, &block)
50
+ end
51
+
52
+ # Recover a session
53
+ #
54
+ # Auth.recover(session_id)
55
+ def self.recover(session, &block)
56
+ #raise SessionNotFound if @@sessions[session].nil?
57
+ new(:session => session, &block)
58
+ end
59
+
60
+ RESOURCES.each do |k|
61
+ Auth.module_eval(%{
62
+ def #{k.to_s+"s"}
63
+ klass = #{k.to_s.camelize}
64
+ klass.session = @session
65
+ klass
66
+ end
67
+ }
68
+ )
69
+ end
70
+
71
+ # Delete the current session
72
+ def destroy
73
+ @@sessions.delete(@session)
74
+ @session = nil
75
+ end
76
+
77
+ # Show account info
78
+ def account
79
+ Account.session = @session
80
+ Account.find(:first)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,252 @@
1
+ module Ankoder
2
+ # You can connect to the _ankoderapi_session service permanently
3
+ #
4
+ # You can access all the resources and manipulate the objects like in ActiveRecord
5
+ #
6
+ # v = Video.find(15).update_attributes :name => "My edited title"
7
+ # puts v.title
8
+ class Base
9
+ attr_reader :attributes, :errors
10
+
11
+ class << self
12
+ def session=(session) #:nodoc:
13
+ @session = session
14
+ end
15
+
16
+ def session #:nodoc:
17
+ (@session || Base.session) rescue nil
18
+ end
19
+
20
+ # Establish the connection for all your session
21
+ def establish_connection!(options={})
22
+ Base.session = Browser::login(options[:login], options[:password])
23
+ end
24
+
25
+ def disconnect!
26
+ Base.session = nil
27
+ end
28
+
29
+ def method_missing(m, *args) #:nodoc:
30
+ if m.to_s =~ /find_by_(.*)/
31
+ find(:first, :conditions => {$1.to_sym => args.first}) rescue nil
32
+ elsif m.to_s =~ /find_all_by_(.*)/
33
+ find :all, {:conditions => {$1.to_sym => args.first}}.merge(args[1]||{})
34
+ else
35
+ raise NoMethodError, "undefined method `#{m.to_s}' for #{self}"
36
+ end
37
+ end
38
+
39
+ def path #:nodoc:
40
+ return @path if @path
41
+ "/"+self.to_s.split("::").last.
42
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
43
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
44
+ tr("-", "_").
45
+ downcase
46
+ end
47
+
48
+ # if the path of the resource is not standard, you can set it manually.
49
+ #
50
+ # class Log < Base
51
+ # self.path = "/user_logs"
52
+ # end
53
+ def path=(path) #:nodoc:
54
+ @path = path
55
+ end
56
+
57
+ # Find objects
58
+ #
59
+ # Arguments:
60
+ #
61
+ # * <tt>ID</tt> ID of the object
62
+ # * <tt>:first</tt> retrieve the first result
63
+ # * <tt>:all</tt> retrieve all the results
64
+ #
65
+ # Options:
66
+ #
67
+ # * <tt>:conditions</tt> {:fieldname => "keyword"} or {:fieldname => /[0-9]+/}
68
+ # * <tt>:order</tt> to sort the result
69
+ # * <tt>:limit</tt> limit the number of result to return
70
+ # * <tt>:include</tt> fetch the object to include
71
+ #
72
+ # Profile.find(:all, :conditions => {:name => /mobile/i})
73
+ # Profile.find(:all, :conditions => {:width => '<320'})
74
+ # Job.find(:all, :include => "video", :order => "created_at DESC", :limit => 3)
75
+ # Video.find :first
76
+ # Download.find(5)
77
+ def find(*args)
78
+ scope, options = args
79
+ options ||= {}
80
+ case scope
81
+ when :all then find_every(options)
82
+ when :first then find_every(options).first
83
+ else find_single(scope, options)
84
+ end
85
+ end
86
+
87
+ private
88
+
89
+ def find_every(options) #:nodoc:
90
+ collection = []
91
+ res = Ankoder::response(Browser::get(path, session).body)
92
+
93
+ return collection if res.empty?
94
+
95
+ [res[res.keys.first]].flatten.each {|object| collection << new(object)}
96
+ collection.find_with_options(options)
97
+ end
98
+
99
+ def find_single(arg, options) #:nodoc:
100
+ new(Ankoder::response(Browser::get(path+"/"+arg.to_s, session).body)).include_ankoder_object(options[:include])
101
+ end
102
+
103
+ public
104
+
105
+ # Create the object
106
+ #
107
+ # Download.create :url => "http://host.com/video.avi"
108
+ def create(attributes={})
109
+ new(Ankoder::response(Browser::post(path, attributes, session).body))
110
+ end
111
+
112
+ # Update the object passing its ID
113
+ #
114
+ # Video.update 15, :name => "my title"
115
+ def update(id, attributes={})
116
+ Browser::put(path+"/"+id.to_s, attributes, session)
117
+ end
118
+
119
+ # Destroy the object passing its ID
120
+ #
121
+ # Profile.destroy 12
122
+ def destroy(id)
123
+ Browser::delete(path+"/"+id.to_s, session)
124
+ end
125
+
126
+ # Destroy all the objects
127
+ #
128
+ # Video.destroy_all
129
+ def destroy_all
130
+ find(:all).each do |object|
131
+ object.destroy
132
+ end
133
+ end
134
+
135
+ # Count request
136
+ #
137
+ # Accept :conditions like in Base#find
138
+ def count(field=nil, options={})
139
+ find(:all, options).size
140
+ end
141
+ end
142
+
143
+ # Instanciate a new object
144
+ #
145
+ # Profile.new :name => "test format", :sample_rate => 24000
146
+ def initialize(attributes={})
147
+ @attributes = attributes.underscore_keys!
148
+ @attributes.type_cast!
149
+ end
150
+
151
+ def include_ankoder_object(objects=nil) #:nodoc:
152
+ return self if objects.nil?
153
+ objects = objects.to_s.split(",") if objects.is_a?(String) or objects.is_a?(Symbol)
154
+ objects.each do |ob|
155
+ begin
156
+ self.instance_variable_set "@#{ob}", (self.send(ob) rescue nil)
157
+ self.instance_eval "attr_reader #{ob.to_sym}"
158
+ rescue
159
+ end
160
+ end
161
+ self
162
+ end
163
+
164
+ # Save the object.
165
+ #
166
+ # If the object doesn't exist, it will be created, otherwise updated.
167
+ # If an error occurred, @errors will be filled. This method doesn't raise.
168
+ def save
169
+ begin
170
+ save!
171
+ true
172
+ rescue => e
173
+ @errors = e.to_s
174
+ false
175
+ end
176
+ end
177
+
178
+ # Save the current object
179
+ #
180
+ # Raise if an error occurred. Return self.
181
+ def save!
182
+ if new_record?
183
+ self.class.create(@attributes)
184
+ else
185
+ update_attributes(@attributes)
186
+ end
187
+ self
188
+ end
189
+
190
+ def id #:nodoc:
191
+ @attributes["id"].to_i
192
+ end
193
+
194
+ # Update the object with the given attributes
195
+ #
196
+ # Video.find(10).update_attributes :name => "test title"
197
+ def update_attributes(attributes={})
198
+ if self.class.update(id, attributes)
199
+ reload
200
+ true
201
+ end
202
+ end
203
+
204
+ # Destroy the object
205
+ #
206
+ # Video.find(56).destroy
207
+ def destroy
208
+ self.class.destroy(id)
209
+ end
210
+
211
+ # Reload the current object
212
+ #
213
+ # j = Job.find(5400)
214
+ # j.reload
215
+ def reload
216
+ unless new_record?
217
+ @attributes = self.class.find(self.id).attributes
218
+ end
219
+ self
220
+ end
221
+
222
+ def new_record? #:nodoc:
223
+ @attributes["id"].nil?
224
+ end
225
+
226
+ def method_missing(m, *args) #:nodoc:
227
+ method_name = m.to_s
228
+ case method_name[-1..-1]
229
+ when '='
230
+ @attributes[method_name[0..-2]] = *args.first
231
+ when '?'
232
+ @attributes[method_name[0..-2]]
233
+ else
234
+ if instance_variables.include?("@#{m.to_s}")
235
+ eval("@#{m.to_s}")
236
+ else
237
+ if object_id = @attributes[m.to_s+"_id"] # belongs_to
238
+ klass = Ankoder::const_get(m.to_s.camelize)
239
+ klass.session = self.class.session
240
+ klass.find(object_id)
241
+ else
242
+ @attributes[m.to_s] rescue nil
243
+ end
244
+ end
245
+ end
246
+ end
247
+ end
248
+
249
+ RESOURCES.each do |k|
250
+ Ankoder.module_eval(%{class #{k.to_s.camelize} < Base; end})
251
+ end
252
+ end
@@ -0,0 +1,98 @@
1
+ require "net/http"
2
+
3
+ module Ankoder
4
+ # This class is used to request the _ankoderapi_session service.
5
+ #
6
+ # Browser::get '/video', session
7
+ # Browser::post '/download', {:url => 'http://host.com/video.avi'}, session
8
+ # Browser::put '/video/54000', {:name => 'new title'}, session
9
+ # Browser::delete '/video/54000', session
10
+ class Browser
11
+ class << self
12
+ # Raise when code response != 2xx
13
+ def raise_if_response_error(res)
14
+ code = res.response.code.to_i
15
+ message = res.response.message
16
+ return if code.to_s =~ /^2/
17
+
18
+ raise RequestError, Ankoder::response(res.body).content if code == 400
19
+ raise NotAuthorized, message if code == 401
20
+ raise ResourceNotFound, message if code == 404
21
+ raise ServerError, message if code == 500
22
+ end
23
+
24
+ def header(session=nil) #:nodoc:
25
+ h = {}
26
+ h.merge!({"Cookie" => "_ankoderapi_session=#{session};"}) if session
27
+ h.merge!({"User-Agent" => "_ankoderapi_session ruby API - #{VERSION::STRING}"})
28
+ end
29
+
30
+ # Login to _ankoderapi_session service. Return the session ID.
31
+ #
32
+ # You should not use it directly, use Auth#create instead
33
+ #
34
+ # Browser::login 'login', 'password'
35
+ def login(login, password) #:nodoc:
36
+ res = Browser::post("/auth/login", :login => login, :password => password)
37
+ return res["Set-cookie"].match(/_ankoderapi_session=(.*);/i)[1].to_s
38
+ end
39
+
40
+ # GET on path
41
+ def get(path, session=nil)
42
+ path += ".#{OUT_FORMAT}" unless path.include? "."
43
+ res = Net::HTTP.start(HOST) {|http| http.get(path, header(session))}
44
+ raise_if_response_error(res)
45
+ res
46
+ end
47
+
48
+ # POST on path and pass the query(Hash)
49
+ def post(path, query={}, session=nil)
50
+ res = Net::HTTP.start(HOST) {|http| http.post(path, query.merge(:format => OUT_FORMAT).to_a.map{|x| x.join("=")}.join("&"), self.header(session))}
51
+ raise_if_response_error(res)
52
+ res
53
+ end
54
+
55
+ # PUT on path and pass the query(Hash)
56
+ def put(path, query={}, session=nil)
57
+ req = Net::HTTP::Put.new(path, header(session))
58
+ req.form_data = query.merge(:format => OUT_FORMAT)
59
+ res = Net::HTTP.new(HOST).start {|http| http.request(req) }
60
+ raise_if_response_error(res)
61
+ true
62
+ end
63
+
64
+ # DELETE on path
65
+ def delete(path, session=nil)
66
+ res = Net::HTTP.start(HOST) {|http| http.delete(path+"."+OUT_FORMAT, header(session))}
67
+ raise_if_response_error(res)
68
+ true
69
+ end
70
+
71
+ def post_multipart(path, attributes={}, session=nil) #:nodoc:
72
+ file = attributes.delete(:file)
73
+ params = [file_to_multipart("data", File.basename(file),"application/octet-stream", File.read(file))]
74
+ attributes.merge("format" => OUT_FORMAT).each_pair{|k,v| params << text_to_multipart(k.to_s, v.to_s)}
75
+
76
+ boundary = '349832898984244898448024464570528145'
77
+ query = params.collect {|p| '--' + boundary + "\r\n" + p}.join('') + "--" + boundary + "--\r\n"
78
+ res = Net::HTTP.start(HOST) {|http| http.post(path, query, header(session).merge("Content-Type" => "multipart/form-data; boundary=" + boundary))}
79
+ raise_if_response_error(res)
80
+ res
81
+ end
82
+
83
+ def text_to_multipart(key,value) #:nodoc:
84
+ return "Content-Disposition: form-data; name=\"#{CGI::escape(key.to_s)}\"\r\n" +
85
+ "\r\n" +
86
+ "#{value}\r\n"
87
+ end
88
+
89
+ def file_to_multipart(key,filename,mime_type,content) #:nodoc:
90
+ return "Content-Disposition: form-data; name=\"#{CGI::escape(key.to_s)}\"; filename=\"#{filename}\"\r\n" +
91
+ "Content-Transfer-Encoding: binary\r\n" +
92
+ "Content-Type: #{mime_type}\r\n" +
93
+ "\r\n" +
94
+ "#{content}\r\n"
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,17 @@
1
+ module Ankoder
2
+ class DownloadFailed < RuntimeError; end
3
+
4
+ class Download < Base
5
+ # Download file from the given URL
6
+ #
7
+ # Download.create('url' => 'http://host.com/file.avi', :postback_url => 'http://your_own_host.com/postback/download')
8
+ #
9
+ # the return result would be the Video record that you can save for further checking
10
+ #
11
+ # if the postback url is included, the download result will send back to your server in JSON format
12
+ def self.create(attributes={})
13
+ download = super
14
+ return download
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,118 @@
1
+ class String
2
+ # convert "undercore_string" in "UnderscoreString"
3
+ #
4
+ # Method from Rails
5
+ def camelize
6
+ self.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
7
+ end
8
+ end
9
+
10
+ module Ankoder
11
+ module CoreExtension
12
+ module HashExtension
13
+ # Replace "-" by "_" in all keys of the hash
14
+ def underscore_keys!
15
+ self.keys.each do |k|
16
+ self[k] = self[k].underscore_keys! if self[k].is_a?(Hash)
17
+ self[k.to_s.gsub("-", "_")] = self[k]
18
+ delete(k) if k.to_s =~ /-/
19
+ end
20
+ self
21
+ end
22
+
23
+ # Cast each value of the hash in the right format (integer, float, time, boolean)
24
+ def type_cast!
25
+ self.keys.each do |k|
26
+ self[k] = self[k].type_cast! if self[k].is_a?(Hash)
27
+ self[k] = self[k].to_i if self[k] =~ /^[0-9]+$/
28
+ self[k] = self[k].to_f if self[k] =~ /^[0-9]+\.[0-9]+$/
29
+ self[k] = Time.parse(self[k]) if self[k] =~ /[a-z]+ [a-z]+ [0-9]+ [0-9]{2}:[0-9]{2}:[0-9]{2} [a-z0-9\+]+ [0-9]{4}/i
30
+ self[k] = true if self[k] == "true"
31
+ self[k] = false if self[k] == "false"
32
+ self[k] = nil if self[k] == {}
33
+ end
34
+ self
35
+ end
36
+
37
+ # The hash keys are available by calling the method name "key"
38
+ #
39
+ # h = {"profile_id" => 54, "video_id" => 12}
40
+ # h.profile_id
41
+ # => 54
42
+ def method_missing(m, *args)
43
+ if has_key? m.to_s
44
+ self[m.to_s]
45
+ else
46
+ raise NoMethodError, "undefined method `#{m.to_s}' for #{self.class}"
47
+ end
48
+ end
49
+ end
50
+
51
+
52
+ module ArrayExtension
53
+ def find_with_options(options={})
54
+ collection = self
55
+ if options[:conditions]
56
+ options[:conditions].each_pair do |k,v|
57
+ collection = collection.find_with_conditions(k => v)
58
+ end
59
+ end
60
+ collection.limit(options[:limit]).order(options[:order]).include_ankoder_object(options[:include])
61
+ end
62
+
63
+
64
+ # Select Ankoder#Base object containing the conditions
65
+ #
66
+ # Profile.find(:all).find_with_conditions(:name => "aaa")
67
+ def find_with_conditions(conditions={})
68
+ return self if conditions.nil? or conditions.empty?
69
+ res = []
70
+ self.each do |object|
71
+ object.attributes.each_pair do |k,v|
72
+ if conditions[k.to_sym]
73
+ condition = []
74
+ if not conditions[k.to_sym].is_a?(Regexp) and conditions[k.to_sym].to_s =~ /([<|>|<=|>=|==]+)[\s]*([0-9]+)$/
75
+ conditions[k.to_sym].to_s.split(" and ").each do |c|
76
+ c.match(/([<|>|<=|>=|==]+)[\s]*([0-9]+)$/)
77
+ condition << "#{v} #{$1} #{$2}"
78
+ end
79
+ res << object if eval(condition.join(" and "))
80
+ elsif conditions[k.to_sym].is_a?(Regexp)
81
+ res << object if v =~ conditions[k.to_sym]
82
+ else
83
+ res << object if v == conditions[k.to_sym]
84
+ end
85
+ end
86
+ end
87
+ end
88
+ return res
89
+ end
90
+
91
+ def limit(lim=nil)
92
+ return self if lim.nil?
93
+ self[0..lim-1]
94
+ end
95
+
96
+ def order(order_str=nil)
97
+ return self if order_str.nil?
98
+ field, sort = order_str.match(/([a-z0-9_]+)([\s+]*[ASC|DESC]*)/i).to_a[1..-1]
99
+ sort = "ASC" if sort.nil? or sort.empty?
100
+ begin
101
+ self.sort do |x,y|
102
+ case sort
103
+ when /ASC/i then x.send(field) <=> y.send(field)
104
+ when /DESC/i then y.send(field) <=> x.send(field)
105
+ end
106
+ end
107
+ rescue
108
+ self
109
+ end
110
+ end
111
+
112
+ def include_ankoder_object(inc=nil)
113
+ return self if inc.nil?
114
+ self.each {|object| object.include_ankoder_object(inc)}
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,18 @@
1
+ module Ankoder
2
+ class JobFailed < RuntimeError; end
3
+
4
+ class Job < Base
5
+ # Encode the given video into the given format
6
+ #
7
+ # Video_ID is the video id that get from Ankoder::Download
8
+ # Profile_ID is selected from the list of Ankoder::Profile.find(:all)
9
+ #
10
+ # Job.create(:original_file_id => "Video_ID", :profile_id => "Profile_ID",
11
+ # :postback_url => 'http://your_own_host.com/postback/job')
12
+ def self.create(attributes={}, &block)
13
+ job = super
14
+ return job
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module Ankoder
2
+ # to get the list of the supported profile
3
+ #
4
+ # Profile.find(:all)
5
+ #
6
+ class Profile < Base
7
+
8
+ end
9
+ end
@@ -2,7 +2,7 @@ module Ankoder #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 1
5
+ TINY = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -0,0 +1,13 @@
1
+ require 'hmac'
2
+ require 'hmac-sha1'
3
+
4
+ module Ankoder
5
+ # Get a video from Ankoder
6
+ #
7
+ # Videos.find(video_id)
8
+ #
9
+ class Video < Base
10
+
11
+
12
+ end
13
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ankoder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ""
6
6
  authors:
7
7
  - RoRCraft.com
@@ -56,7 +56,16 @@ files:
56
56
  - config/hoe.rb
57
57
  - config/requirements.rb
58
58
  - lib/ankoder.rb
59
+ - lib/ankoder/account.rb
60
+ - lib/ankoder/auth.rb
61
+ - lib/ankoder/base.rb
62
+ - lib/ankoder/browser.rb
63
+ - lib/ankoder/download.rb
64
+ - lib/ankoder/ext.rb
65
+ - lib/ankoder/job.rb
66
+ - lib/ankoder/profile.rb
59
67
  - lib/ankoder/version.rb
68
+ - lib/ankoder/video.rb
60
69
  - log/debug.log
61
70
  - script/destroy
62
71
  - script/generate
metadata.gz.sig CHANGED
Binary file