Rails 4:集成You Tube(youtube_it gem)

时间:2015-06-30 12:17:25

标签: ruby-on-rails video youtube

我正在尝试将你的电子管加入我的rails 4 app。

我希望用户能够上传视频文件,然后将其发布到我的管道频道上。

我在Youtube_it gem中使用Rails 4。我一直在尝试遵循本教程:http://www.sitepoint.com/youtube-rails/

我的文件结构包含项目模型和视频模型。协会是:

Project.rb

has_one :video
  accepts_nested_attributes_for :video

Video.rb

  belongs_to :project

我的视频表有一个名为:include_video。

的布尔属性
    <%= f.collection_radio_buttons :include_video, [[true, ' Yes'], [false, ' No']], :first, :last, {:item_wrapper_class => 'fixradio'}, {:class => "radio-inline create-project response-project"} %>

如果确实如此,那么我想揭示用户添加视频链接的字段(属性称为:链接)。

    <%= f.file_field :link %>

我提出这些问题的视频表格是部分的。部分是在项目表格内部,其他问题。我还有一个局部视图,其中包含用于管夹的容器(如教程中所示)。

视图部分包含在我的项目展示页面中:

<% if @project.video.include_video? %>

          <%= render 'videos/particulars' %>
    <% end %>

我的项目负责人有:

def new
    @project = Project.new
    @project.video = Video.new
end
 def show
    #authorise @project
    @project = Project.find(params[:id])
    @creator = User.find(@project.creator_id)
    @creator_profile = @creator.profile
    @project.video ||= Video.new

  end

我的项目控制器还有来自我的视频表的白色标记属性(和我的视频控制器一样。

 def project_params
      params.require(:project).permit(
      video_attributes: [:include_video, :link],

我的视频控制器有:

  def show
    respond_with(@video)
  end


 def create

    @video = Video.new(video_params)
    @video.project_id = video_params[:project_id]

  end

   def video_params
      params[:video].permit(:include_video, :link, :project_id)
    end

我的视频.rb有:

class Video < ActiveRecord::Base

  # --------------- associations
  belongs_to :project
  belongs_to :program
  belongs_to :proposal
  belongs_to :profile
  belongs_to :user


  # --------------- scopes
  # --------------- validations

  YT_LINK_FORMAT = /\A.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*\z/i

  validates :link, presence: true, format: YT_LINK_FORMAT


  # --------------- class methods

  # --------------- callbacks

  before_create -> do
    uid = link.match(YT_LINK_FORMAT)
    self.uid = uid[2] if uid && uid[2]

    if self.uid.to_s.length != 11
      self.errors.add(:link, 'is invalid.')
      false
    elsif Video.where(uid: self.uid).any?
      self.errors.add(:link, 'is not unique.')
      false
    else
      get_additional_info
    end
  end

  # --------------- instance methods

  # --------------- private methods

  def get_additional_info
    begin
      client = YouTubeIt::OAuth2Client.new(dev_key: ENV['YT_developer_key'])
      video = client.video_by(uid)
      self.title = video.title
      self.duration = parse_duration(video.duration)
      self.author = video.author.name
      self.likes = video.rating.likes
    rescue
      self.title = '' ; self.duration = '00:00:00' ; self.author = '' ; self.likes = 0 ; self.dislikes = 0
    end
  end

  def parse_duration(d)
    hr = (d / 3600).floor
    min = ((d - (hr * 3600)) / 60).floor
    sec = (d - (hr * 3600) - (min * 60)).floor

    hr = '0' + hr.to_s if hr.to_i < 10
    min = '0' + min.to_s if min.to_i < 10
    sec = '0' + sec.to_s if sec.to_i < 10

    hr.to_s + ':' + min.to_s + ':' + sec.to_s
  end
end

我遇到了相关问题并从这篇帖子中获得了帮助:Rails 4 with You Tube

然而,它创造了一个新问题,我不知道它是否推进了我的解决方案的进展。

新的一点(来自用户在另一个发布的问题上提出的建议)是向我的项目控制器添加一个显示行以用于视频。当我尝试这个时,我收到了这个错误:

Failed to save the new associated video.

当我尝试制作一个视频形式部分在其中的全新项目时,我在保存表单时出错。它说视频链接无效(我从硬盘驱动器中选择.mov文件)。

然后我将video.rb中的验证更改为:

 validates :link,  format: YT_LINK_FORMAT, :allow_blank => true, :allow_nil => true

(即删除:存在:为真,并添加空白和零,但我仍然会收到该错误)

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我不会使用youtube_it ruby​​ gem,因为它使用了YouTube API的v2(自2015年4月20日起未受支持)。我建议使用yt ruby​​ gem(使用最新版本的YouTube API)。

A tutorial on the yt gem and why you shouldn't use youtube_it

您的问题很可能与尝试使用YouTube API不支持的youtube_it功能有关。重构你的代码似乎需要做很多工作,但我相信它会为你节省很多麻烦(特别是因为youtube_it似乎没有得到很好的维护)。

答案 1 :(得分:-1)

您可以使用omniauth-google-oauth2 gem与Google进行完全身份验证。

在devise.rb中:

config.omniauth :google_oauth2, ENV['GP_key'], ENV['GP_secret'],
    {
                  name: 'google',
                  scope: 'plus.login, userinfo.email, userinfo.profile,
                          ...
                          youtube, youtube.readonly, youtubepartner,
                          youtube.upload, youtubepartner, 
                          youtubepartner-channel-audit',
                  prompt: "select_account"
    }

我希望,它会解决你困难......