github
Advanced Search
  • Home
  • Pricing and Signup
  • Explore GitHub
  • Blog
  • Login

edgarjs / youtube-model

  • Admin
  • Watch Unwatch
  • Fork
  • Your Fork
  • Pull Request
  • Download Source
    • 52
    • 4
  • Source
  • Commits
  • Network (4)
  • Issues (0)
  • Downloads (0)
  • Wiki (1)
  • Graphs
  • Branch: master

click here to add a description

click here to add a homepage

  • Branches (2)
    • master ✓
    • vBeta
  • Tags (0)
Sending Request…
Click here to lend your support to: youtube-model and make a donation at www.pledgie.com ! Edit Pledgie Setup

Pledgie Donations

Once activated, we'll place the following badge in your repository's detail box:
Pledgie_example
This service is courtesy of Pledgie.

Allows you to generate an ActiveResource model ready to interact with the You Tube API. — Read more

  cancel

http://rdoc.info/projects/edgarjs/youtube-model

  cancel
  • Private
  • Read-Only
  • HTTP Read-Only

This URL has Read+Write access

Changes to readme 
edgarjs (author)
Fri Jul 24 07:46:31 -0700 2009
commit  178340bc008652194fafe884543696737b4c5c77
tree    5ae2fbde76963bc2350596d980c94be6e76b349f
parent  072d2965fef88ed6d9bfd39ab0ec902572ba79d5
youtube-model /
name age
history
message
file README.textile Fri Jul 24 07:46:31 -0700 2009 Changes to readme [edgarjs]
file Rakefile Tue Jun 03 21:32:01 -0700 2008 first commit to github [edgarjs]
directory generators/ Wed Sep 17 21:23:46 -0700 2008 uploading is supported now. README completed. V... [edgarjs]
file init.rb Wed Sep 17 21:23:46 -0700 2008 uploading is supported now. README completed. V... [edgarjs]
file install.rb Tue Sep 16 23:04:11 -0700 2008 Readme updated with more useful examples. Unit ... [edgarjs]
directory lib/ Fri Jul 24 07:33:24 -0700 2009 added gdata gem Signed-off-by: Edgar J. Suárez... [vibha]
README.textile

YouTube Model

This plugin allows you to interact with the new YouTube API (yes, that means uploading is now featured)
through a simple ActiveResource model. The uploaded video can also be updated and deleted. The changes will be reflected at the youtube.

Repository

Find it at http://github.com/vibha/youtube-model

Documentation

Installing

Simply as:

./script/plugin install git://github.com/vibha/youtube-model.git

Generating the system

The plugin includes a generator to create a model based on ActiveResource

./script/generate youtube_model ModelName

This generator will create four files:

  • An ActiveResource based model under app/models directory.
  • A yaml configuration file under config directory.
  • An initializer that loads the configuration file, under config/initializers directory.

And that’s all, but be sure to check the configuration file to set up your Developer and Client Keys.
You can get these keys at the YouTube APIs and Tools page.

AuthSub for web applications

A link is provided to authorise the website to access to the logged in user’s youtube account.

The token obtained after doing authorisation process will become a session token. So we will set the session parameter to 1 in yaml configuration file. This token is used to upload, edit and delete video.


#app/views/videos/index.html.erb

Please Click <%= link_to ‘here’, youtube_auth_url(authorise_videos_url) %> first to authorise access to your youtube account.

An authorise method will be added to make the single use token to a session token.


#VideosController
def authorise
client = GData::Client::DocList.new
if params[:token]
client.authsub_token = params[:token] # extract the single-use token from the URL query params
session[:token] = client.auth_handler.upgrade()
client.authsub_token = session[:token] if session[:token]
end
redirect_to videos_path
end

Also add ‘include GData’ in the videos controller, which includes the module GData for authorisation process.


  #config/environment.rb
  config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
  config.gem 'gdata', :lib => 'gdata'
  

Listing videos

Example

To get all the videos uploaded by a user you can use the method uploaded_by_user passing the session[:token] we saved during authorisation process

YouTube.uploaded_by_user(session[:token])

#VideosController
def index
@youtube =YouTube.uploaded_by_user(session[:token]) if session[:token]
end

def show
@video = YouTube.find_by_id(params[:id]) rescue nil
flash[:message] = “Sorry the video is not found at Youtube” and redirect_to videos_path unless @video
end

#app/views/videos/index.html.erb
<% if session[:token] >
<
= image_tag @youtube.logo %>

<%= @youtube.title %>

<%= “Displaying #{@youtube.startIndex} – #{@youtube.itemsPerPage} of #{@youtube.totalResults}” %> <% for video in @youtube.videos %>

<%= video.title %>

in <%= video.group.category >
by <
= link_to video.author.name, “http://youtube.com/#{video.author.name}” %>

<%= simple_format truncate(video.content, :length => 100) %> <%= link_to image_tag(video.group.thumbnail.first.url, :alt => video.title), video_path(video.id) %> <%= link_to ‘Watch on youtube’, video.link.first.href %> <%= link_to ‘Edit/Update’, edit_video_path(video) %>

<%= link_to ‘Delete’, video_path(video), :method => “delete” >
<
end >
<
end %>

#app/views/videos/show.html.erb

<%= @video.title %>

by <%= link_to video.author.name, "http://youtube.com/#{video.author.name}" >
<
= youtube_embed @video %>

<%= link_to ‘Back’, videos_path %> <%= link_to ‘Edit/Update’, edit_video_path(@video) %> <%= link_to ‘Delete’, video_path(@video), :method => “delete” %>

As you can see, the youtube_embed method is used to display a video.

Uploading videos

As seen in the index example above, there is a helper named youtube_auth_url wich generates an url to the
YouTube authentication page. Pass another url as param to wich be redirected after authentication.
This helper method takes the session and secure options from the configuration file. See the details of this options
at the YouTube API

Upload process has two steps:

  1. Meta-info for the video.
  2. File choose.

So basically we have two actions in our controller to upload a video. Here’s a quick code example:


#routes.rb
map.resources :videos, :new => {:upload => :post}, :collection => {:authorise => :get }

#VideosController
def new
@categories ||= YouTube.video_categories
end

def upload
@upload_info = YouTube.get_upload_url(params[:video])
end

Also add a link to upload the video at the index page.


#app/views/videos/index.html.erb
<%= link_to “Upload Video”, new_video_url %>
#app/views/videos/new.html.erb <% form_for ‘video’, :url => upload_new_video_path do |f| %> <%= f.hidden_field :auth_sub, :value => session[:token] %> <%= f.label :title %> <%= f.text_field :title %> <%= f.label :description %> <%= f.text_area :content, :rows => 10 %> <%= f.label :category %> <%= f.select :category, @categories %> <%= f.label :keywords %> <%= f.text_field :keywords %> <%= f.submit ‘Continue to Step 2’ %> <% end %> #app/views/videos/upload.html.erb <% form_tag @upload_info[:url], :multipart => true do %> <%= hidden_field_tag :token, @upload_info[:token] %> <%= label_tag :file %> <%= file_field_tag :file %> <%= submit_tag ‘Upload video’ %> <% end %>

Updating Videos

To get the videos updated by a user you can use the method update_video passing the id of that video, session[:token] and params hash

YouTube.update_video(params[:id], session[:token], params[:you_tube_entry])


#VideosController
before_filter :find_video, :only => [:edit, :update]
def edit
@youtube_videos =YouTube.uploaded_by_user(session[:token])
@video = @youtube_videos.videos.select { |video| video.id == params[:id] }
@youtube = @video.first
@youtube.keywords = @youtube.group.keywords
@youtube.category = @youtube.group.category
@categories ||= YouTube.video_categories
end

def update
if u = YouTube.update_video(params[:id], session[:token], params[:you_tube_entry]) rescue nil
flash[:message] = “Video has been Updated Successfully.”
else
flash[:message] = “Video has not been Updated Successfully.”
end
redirect_to videos_path
end

private def find_video flash[:message] = “Sorry the video is not found at Youtube” and redirect_to videos_path unless @video = YouTube.find_by_id(params[:id]) rescue nil end

#app/views/videos/edit.html.erb
<% form_for @youtube, :url => video_url, :html => { :multipart => true } do |f| >
<
= f.label :title >
<
= f.text_field :title %>

<%= f.label :description %> <%= f.text_area :content, :rows => 10 %> <%= f.label :category %> <%= f.select :category, @categories %> <%= f.label :keywords %>

<%= f.text_field :keywords %>

<%= f.submit ‘Update video’ %> <% end %> <%= link_to ‘Back’, videos_path %>

h3. Deleting Videos

To delete the videos of any user you can use the method delete_video passing the id of that video and session[:token]

YouTube.delete_video(params[:id], session[:token])

#VideosController
before_filter :find_video, :only => [:show, :edit, :update, :destroy]
def destroy
yt = YouTube.delete_video(params[:id], session[:token]) rescue nil
if yt.msg == “OK”
flash[:message] = “Video has been sucessfully deleted.”
else
flash[:message] = “Sorry the video has not been deleted.”
end
redirect_to videos_path
end

The filter is applied on show method so that method can now be removed.

Also don’t forget to set :multipart => true in the second step.

And for a more specific speech… the class method get_upload_url receives a hash containing
the meta-info of the first step, and returns a hash with the upload url and token.

Feedback

I’ll really appreciate your feedback, please contact me at vibha[at]vinsol.com

License

This code is released under Creative Commons Attribution-Share Alike 3.0 license.

Blog | Support | Training | Contact | API | Status | Twitter | Help | Security
© 2010 GitHub Inc. All rights reserved. | Terms of Service | Privacy Policy
Powered by the Dedicated Servers and
Cloud Computing of Rackspace Hosting®
Dedicated Server