heywatch 0.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt DELETED
@@ -1,18 +0,0 @@
1
- Manifest.txt
2
- README.txt
3
- Rakefile
4
- lib/heywatch.rb
5
- lib/heywatch/video.rb
6
- lib/heywatch/version.rb
7
- lib/heywatch/job.rb
8
- lib/heywatch/ext.rb
9
- lib/heywatch/encoded_video.rb
10
- lib/heywatch/download.rb
11
- lib/heywatch/discover.rb
12
- lib/heywatch/browser.rb
13
- lib/heywatch/base.rb
14
- lib/heywatch/auth.rb
15
- lib/heywatch/account.rb
16
- setup.rb
17
- test/test_helper.rb
18
- test/test_heywatch.rb
data/README.txt DELETED
@@ -1,163 +0,0 @@
1
- =Hey!Watch - Video Encoding Web Service
2
-
3
- Hey!Watch <http://heywatch.com> provides a simple and robust encoding plateform.
4
- The service allows developers to access a fast, scalable and inexpensive web
5
- service to encode videos easier. The API can be easily integrated
6
- in any web or desktop applications.
7
-
8
- The documentation of the API can be found at http://wiki.heywatch.com/API_Documentation
9
-
10
-
11
- ==Getting started
12
-
13
- ===Transfer a video, encode it in ipod format and download the encoded video
14
-
15
- require 'heywatch'
16
- include HeyWatch
17
-
18
- Base::establish_connection! :login => 'login', :password => 'password'
19
-
20
- raw_video = Discover.create(:url => 'http://youtube.com/watch?v=SXcpNZCyQJw', :download => true) do |percent, total_size, received|
21
- puts "#{percent}%"
22
- end
23
-
24
- ipod_format = Format.find_by_name('iPod 4:3')
25
- encoded_video = Job.create(:video_id => raw_video.id, :format_id => ipod_format.id) do |percent|
26
- puts "#{percent}%"
27
- end
28
-
29
- puts "downloading {encoded_video.title}"
30
- path = encoded_video.download
31
- puts "video saved in {path}"
32
-
33
-
34
- ===Upload a video from the disk, encode it with FTP auto transfer option
35
-
36
- raw_video = Video.create(:file => 'videos/myvideo.avi', :title => 'Funny video') do |percent, total_size, received|
37
- puts "#{percent}%"
38
- end
39
-
40
- Job.create :video_id => raw_video.id, :default_format => true, :ftp_directive => 'ftp://login:pass@host.com/heywatch_vids/'
41
-
42
-
43
- ===Generate a thumbnail
44
-
45
- v = EncodedVideo.find(5400)
46
- v.thumbnail :start => 15, :width => 640, :height => 480
47
-
48
-
49
- ===Update your account
50
-
51
- account = Account.find
52
- account.update_attributes :ping_url_after_encode => 'http://yourhost.com/ping/encode'
53
-
54
-
55
-
56
- ==Integration in a rails application
57
-
58
- This short HOWTO uses the ping options. So in your HeyWatch account, you must
59
- configure all the ping URL (except transfer for this example).
60
-
61
- Examples:
62
-
63
- ping_url_after_encode => http://myhost.com/ping/encode
64
- ping_url_if_error => http://myhost.com/ping/error
65
-
66
-
67
- ===Config
68
-
69
- In your config/environment.rb:
70
-
71
- require 'heywatch'
72
- HeyWatch::Base::establish_connection! :login => 'login', :password => 'passwd'
73
-
74
-
75
- ===Item Model
76
-
77
- create_table "items", :force => true do |t|
78
- t.column "title", :string, :null => false
79
- t.column "description", :text, :null => false
80
- t.column "created_at", :datetime
81
- t.column "updated_at", :datetime
82
- t.column "status", :string, :default => "working"
83
- t.column "url", :string
84
- t.column "meta", :text
85
- t.column "user_id", :integer
86
- end
87
-
88
- In app/models/item.rb:
89
-
90
- class Item < ActiveRecord::Base
91
- belongs_to :user
92
- serialize :meta
93
- after_create :convert
94
-
95
- # When HeyWatch send videos to your FTP,
96
- # they will be available to this HTTP url.
97
- def base_url
98
- "http://myhost.com/flv/#{self.id}/"
99
- end
100
-
101
- # Transfer the given URL and convert the video from
102
- # this address in format 31 (flv format). When the encode
103
- # is done, the video will be sent to the specified FTP
104
- # with custom path.
105
- #
106
- # Note item_id which is a custom field.
107
- def convert
108
- HeyWatch::Discover.create(
109
- :url => self.url,
110
- :download => true,
111
- :item_id => self.id,
112
- :title => self.title,
113
- :automatic_encode => true,
114
- :format_id => 31,
115
- :ftp_directive => "ftp://login:passwd@myhost.com/flv/#{self.id}/"
116
- )
117
- end
118
- end
119
-
120
-
121
- ===Ping Controller
122
-
123
- In app/controllers/ping_controller.rb:
124
-
125
- class PingController < ApplicationController
126
- before_filter :find_item
127
-
128
- def encode
129
- @encoded_video = HeyWatch::EncodedVideo.find(params[:encoded_video_id])
130
- @full_url = @item.base_url + @encoded_video.filename
131
- @item.status = 'finished'
132
- @item.meta = {
133
- :url => @full_url,
134
- :thumb => @full_url + ".jpg",
135
- :size => @encoded_video.specs["size"],
136
- :mime_type => @encoded_video.specs["mime_type"],
137
- :length => @encoded_video.specs.video["length"]
138
- }
139
- @item.save
140
- @encoded_video.job.video.destroy # delete the raw video
141
- @encoded_video.destroy # delete the encoded video
142
- render :nothing => true
143
- end
144
-
145
- def error
146
- if params[:discover_id]
147
- error_msg = "No video link found"
148
- else
149
- error_msg = HeyWatch::ErrorCode[params[:error_code].to_i]
150
- end
151
- @item.update_attributes :status => 'error'
152
- ItemMailer.deliver_error(error_msg, @item.user)
153
- render :nothing => true
154
- end
155
-
156
- private
157
-
158
- # item_id is a custom_field sent in Item#convert.
159
- # Thanks to it, we can track the item.
160
- def find_item
161
- @item = Item.find params[:item_id]
162
- end
163
- end
data/Rakefile DELETED
@@ -1,74 +0,0 @@
1
- require 'rubygems'
2
- require 'rake'
3
- require 'rake/clean'
4
- require 'rake/testtask'
5
- require 'rake/packagetask'
6
- require 'rake/gempackagetask'
7
- require 'rake/rdoctask'
8
- require 'rake/contrib/rubyforgepublisher'
9
- require 'fileutils'
10
- require 'hoe'
11
- include FileUtils
12
- require File.join(File.dirname(__FILE__), 'lib', 'heywatch', 'version')
13
-
14
- AUTHOR = 'Bruno Celeste' # can also be an array of Authors
15
- EMAIL = "bruno.celeste@heywatch.com"
16
- DESCRIPTION = "Ruby Library for HeyWatch service (http://heywatch.com)."
17
- GEM_NAME = 'heywatch' # what ppl will type to install your gem
18
- RUBYFORGE_PROJECT = 'heywatch' # The unix name for your project
19
- HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
20
-
21
-
22
- NAME = "heywatch"
23
- REV = nil # UNCOMMENT IF REQUIRED: File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
24
- VERS = ENV['VERSION'] || (HeyWatch::VERSION::STRING + (REV ? ".#{REV}" : ""))
25
- CLEAN.include ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store']
26
- RDOC_OPTS = ['--quiet', '--title', 'heywatch documentation',
27
- "--opname", "index.html",
28
- "--line-numbers",
29
- "--main", "README.txt",
30
- "--inline-source"]
31
-
32
- class Hoe
33
- def extra_deps
34
- @extra_deps.reject { |x| Array(x).first == 'hoe' }
35
- end
36
- end
37
-
38
- # Generate all the Rake tasks
39
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
40
- hoe = Hoe.new(GEM_NAME, VERS) do |p|
41
- p.author = AUTHOR
42
- p.description = DESCRIPTION
43
- p.email = EMAIL
44
- p.summary = DESCRIPTION
45
- p.url = HOMEPATH
46
- p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
47
- p.test_globs = ["test/**/test_*.rb"]
48
- p.clean_globs = CLEAN #An array of file patterns to delete on clean.
49
-
50
- # == Optional
51
- p.extra_deps = [ ['xml-simple', '>= 1.0.0'] ] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
52
- p.spec_extras = {:extra_rdoc_files => ["README.txt"], :rdoc_options => RDOC_OPTS} # A hash of extra values to set in the gemspec.
53
- end
54
-
55
-
56
- desc 'Generate website files'
57
- task :website_generate do
58
- Dir['website/**/*.txt'].each do |txt|
59
- sh %{ ruby scripts/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
60
- end
61
- end
62
-
63
- desc 'Upload website files to rubyforge'
64
- task :website_upload do
65
- config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
66
- host = "#{config["username"]}@rubyforge.org"
67
- remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/"
68
- # remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
69
- local_dir = 'website'
70
- sh %{rsync -av #{local_dir}/ #{host}:#{remote_dir}}
71
- end
72
-
73
- desc 'Generate and upload website files'
74
- task :website => [:website_generate, :website_upload]
@@ -1,32 +0,0 @@
1
- module HeyWatch
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(HeyWatch::response(Browser::get(self.path, self.session).body))
30
- end
31
- end
32
- end
data/lib/heywatch/auth.rb DELETED
@@ -1,83 +0,0 @@
1
- module HeyWatch
2
- # Authenticate to the Hey!Watch 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
- # format = user.formats.find(:first, :conditions => {:name => "iPod 4:3"})
17
- # user.jobs.create :video_id => video.id, :format_id => format.id
18
- # end
19
- #
20
- # All the resources (pluralized) are available within the Auth class:
21
- #
22
- # jobs, encoded_videos, videos, formats, downloads, discovers, logs, account
23
- #
24
- class Auth
25
- attr_reader :session
26
- @@sessions = {}
27
-
28
- # Authenticate to the Hey!Watch service
29
- #
30
- # options can be:
31
- #
32
- # * <tt>:login</tt> Hey!Watch username
33
- # * <tt>:password</tt> Hey!Watch 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
data/lib/heywatch/base.rb DELETED
@@ -1,269 +0,0 @@
1
- module HeyWatch
2
- # You can connect to the Hey!Watch service permanently
3
- #
4
- # Base::establish_connection! :login => "login", :password => "password"
5
- #
6
- # You can access all the resources and manipulate the objects like in ActiveRecord
7
- #
8
- # EncodedVideo.find(:all, :conditions => {:title => /bad video/i}).each do |v|
9
- # v.destroy
10
- # end
11
- #
12
- # Format.create :name => "my new format", :video_codec => "mpeg4", ...
13
- #
14
- # f = Format.new
15
- # f.container = "avi"
16
- # f.audio_codec = "mp3"
17
- # ...
18
- # f.save
19
- #
20
- # v = Video.find(15).update_attributes :title => "My edited title"
21
- # puts v.title
22
- #
23
- # Format.find_by_name("iPod 4:3")
24
- #
25
- # Format.find_all_by_name /ipod/i
26
- class Base
27
- attr_reader :attributes, :errors
28
-
29
- class << self
30
- def session=(session) #:nodoc:
31
- @session = session
32
- end
33
-
34
- def session #:nodoc:
35
- (@session || Base.session) rescue nil
36
- end
37
-
38
- # Establish the connection for all your session
39
- def establish_connection!(options={})
40
- Base.session = Browser::login(options[:login], options[:password])
41
- end
42
-
43
- def disconnect!
44
- Base.session = nil
45
- end
46
-
47
- def method_missing(m, *args) #:nodoc:
48
- if m.to_s =~ /find_by_(.*)/
49
- find(:first, :conditions => {$1.to_sym => args.first}) rescue nil
50
- elsif m.to_s =~ /find_all_by_(.*)/
51
- find :all, {:conditions => {$1.to_sym => args.first}}.merge(args[1]||{})
52
- else
53
- raise NoMethodError, "undefined method `#{m.to_s}' for #{self}"
54
- end
55
- end
56
-
57
- def path #:nodoc:
58
- return @path if @path
59
- "/"+self.to_s.split("::").last.
60
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
61
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
62
- tr("-", "_").
63
- downcase
64
- end
65
-
66
- # if the path of the resource is not standard, you can set it manually.
67
- #
68
- # class Log < Base
69
- # self.path = "/user_logs"
70
- # end
71
- def path=(path) #:nodoc:
72
- @path = path
73
- end
74
-
75
- # Find objects
76
- #
77
- # Arguments:
78
- #
79
- # * <tt>ID</tt> ID of the object
80
- # * <tt>:first</tt> retrieve the first result
81
- # * <tt>:all</tt> retrieve all the results
82
- #
83
- # Options:
84
- #
85
- # * <tt>:conditions</tt> {:fieldname => "keyword"} or {:fieldname => /[0-9]+/}
86
- # * <tt>:order</tt> to sort the result
87
- # * <tt>:limit</tt> limit the number of result to return
88
- # * <tt>:include</tt> fetch the object to include
89
- #
90
- # Format.find(:all, :conditions => {:name => /mobile/i})
91
- # Format.find(:all, :conditions => {:width => '<320'})
92
- # Job.find(:all, :include => "encoded_video", :order => "created_at DESC", :limit => 3)
93
- # Video.find :first
94
- # Download.find(5)
95
- def find(*args)
96
- scope, options = args
97
- options ||= {}
98
- case scope
99
- when :all then find_every(options)
100
- when :first then find_every(options).first
101
- else find_single(scope, options)
102
- end
103
- end
104
-
105
- private
106
-
107
- def find_every(options) #:nodoc:
108
- collection = []
109
- res = HeyWatch::response(Browser::get(path, session).body)
110
- return collection if res.empty?
111
-
112
- [res[res.keys.first]].flatten.each {|object| collection << new(object)}
113
- collection.find_with_options(options)
114
- end
115
-
116
- def find_single(arg, options) #:nodoc:
117
- new(HeyWatch::response(Browser::get(path+"/"+arg.to_s, session).body)).include_heywatch_object(options[:include])
118
- end
119
-
120
- public
121
-
122
- # Create the object
123
- #
124
- # Download.create :url => "http://host.com/video.avi"
125
- def create(attributes={})
126
- new(HeyWatch::response(Browser::post(path, attributes, session).body))
127
- end
128
-
129
- # Update the object passing its ID
130
- #
131
- # EncodedVideo.update 15, :title => "my title"
132
- def update(id, attributes={})
133
- Browser::put(path+"/"+id.to_s, attributes, session)
134
- end
135
-
136
- # Destroy the object passing its ID
137
- #
138
- # Format.destroy 12
139
- def destroy(id)
140
- Browser::delete(path+"/"+id.to_s, session)
141
- end
142
-
143
- # Destroy all the objects
144
- #
145
- # Video.destroy_all
146
- def destroy_all
147
- find(:all).each do |object|
148
- object.destroy
149
- end
150
- end
151
-
152
- # Count request
153
- #
154
- # Accept :conditions like in Base#find
155
- def count(field=nil, options={})
156
- find(:all, options).size
157
- end
158
- end
159
-
160
- # Instanciate a new object
161
- #
162
- # Format.new :name => "test format", :sample_rate => 24000
163
- def initialize(attributes={})
164
- @attributes = attributes.underscore_keys!
165
- @attributes.type_cast!
166
- end
167
-
168
- def include_heywatch_object(objects=nil) #:nodoc:
169
- return self if objects.nil?
170
- objects = objects.to_s.split(",") if objects.is_a?(String) or objects.is_a?(Symbol)
171
- objects.each do |ob|
172
- begin
173
- self.instance_variable_set "@#{ob}", (self.send(ob) rescue nil)
174
- self.instance_eval "attr_reader #{ob.to_sym}"
175
- rescue
176
- end
177
- end
178
- self
179
- end
180
-
181
- # Save the object.
182
- #
183
- # If the object doesn't exist, it will be created, otherwise updated.
184
- # If an error occurred, @errors will be filled. This method doesn't raise.
185
- def save
186
- begin
187
- save!
188
- true
189
- rescue => e
190
- @errors = e.to_s
191
- false
192
- end
193
- end
194
-
195
- # Save the current object
196
- #
197
- # Raise if an error occurred. Return self.
198
- def save!
199
- if new_record?
200
- self.class.create(@attributes)
201
- else
202
- update_attributes(@attributes)
203
- end
204
- self
205
- end
206
-
207
- def id #:nodoc:
208
- @attributes["id"].to_i
209
- end
210
-
211
- # Update the object with the given attributes
212
- #
213
- # Video.find(10).update_attributes :title => "test title"
214
- def update_attributes(attributes={})
215
- if self.class.update(id, attributes)
216
- reload
217
- true
218
- end
219
- end
220
-
221
- # Destroy the object
222
- #
223
- # Video.find(56).destroy
224
- def destroy
225
- self.class.destroy(id)
226
- end
227
-
228
- # Reload the current object
229
- #
230
- # j = Job.find(5400)
231
- # j.reload
232
- def reload
233
- unless new_record?
234
- @attributes = self.class.find(self.id).attributes
235
- end
236
- self
237
- end
238
-
239
- def new_record? #:nodoc:
240
- @attributes["id"].nil?
241
- end
242
-
243
- def method_missing(m, *args) #:nodoc:
244
- method_name = m.to_s
245
- case method_name[-1..-1]
246
- when '='
247
- @attributes[method_name[0..-2]] = *args.first
248
- when '?'
249
- @attributes[method_name[0..-2]]
250
- else
251
- if instance_variables.include?("@#{m.to_s}")
252
- eval("@#{m.to_s}")
253
- else
254
- if object_id = @attributes[m.to_s+"_id"] # belongs_to
255
- klass = HeyWatch::const_get(m.to_s.camelize)
256
- klass.session = self.class.session
257
- klass.find(object_id)
258
- else
259
- @attributes[m.to_s] rescue nil
260
- end
261
- end
262
- end
263
- end
264
- end
265
-
266
- Resources.each do |k|
267
- HeyWatch.module_eval(%{class #{k.to_s.camelize} < Base; end})
268
- end
269
- end