Подтвердить что ты не робот

Преобразование обычной ссылки Youtube во встроенное видео

Моя цель: я пытаюсь разрешить пользователям вставлять ссылку на видео Youtube на моем сайте, предоставляя мне контроль над настройками проигрывателя.

Я хотел бы сделать это, только попросив пользователя указать ссылку (не весь код для встраивания), откуда я могу как-то вставить эту ссылку в код для встраивания.

Я пробовал сделать простую замену несколькими ссылками Youtube (http://youtu.be/...), но они не работают, говоря, что "фильм не загружен". Есть ли надежный способ сделать это?

4b9b3361

Ответ 1

Я делаю это довольно часто для клиентов, суть в том, что вы анализируете идентификатор из URL-адреса, а затем генерируете iframe HTML, используя это.

def youtube_embed(youtube_url)
  if youtube_url[/youtu\.be\/([^\?]*)/]
    youtube_id = $1
  else
    # Regex from # http://stackoverflow.com/questions/3452546/javascript-regex-how-to-get-youtube-video-id-from-url/4811367#4811367
    youtube_url[/^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/]
    youtube_id = $5
  end

  %Q{<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/#{ youtube_id }" frameborder="0" allowfullscreen></iframe>}
end

youtube_embed('youtu.be/jJrzIdDUfT4')
# => <iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/jJrzIdDUfT4" frameborder="0" allowfullscreen></iframe>

Я помещал это в помощника. Измените высоту, ширину и параметры по вкусу.

Ответ 2

Еще один ответ - использовать этот драгоценный камень, который обрабатывает youtube и vimeo, и может быть расширен до большего. Он также хорошо интегрируется с AR, поэтому вы можете кэшировать полученный html вместо фильтрации на каждом рендере:

https://github.com/dejan/auto_html

Ответ 3

Я использовал наивысший рейтинг с функцией youtube_embed, но когда я реализовал на мой взгляд, я видел, что код iframe появляется на моей странице, но нет видео. Я добавил raw перед вызовом функции, и теперь все хорошо с этой страницей.

Внутри моего view.html.erb

<p><%= raw(youtube_embed(@experiment.researchsection.videolink)) %></p>

Ответ 4

что-то вроде этого (например, в модели):

@@video_regexp = [ /^(?:https?:\/\/)?(?:www\.)?youtube\.com(?:\/v\/|\/watch\?v=)([A-Za-z0-9_-]{11})/, 
                   /^(?:https?:\/\/)?(?:www\.)?youtu\.be\/([A-Za-z0-9_-]{11})/,
                   /^(?:https?:\/\/)?(?:www\.)?youtube\.com\/user\/[^\/]+\/?#(?:[^\/]+\/){1,4}([A-Za-z0-9_-]{11})/
                   ]

def video_id
  @@video_regexp.each { |m| return m.match(source_url)[1] unless m.nil? }
end

где source_url - полная ссылка на видео. затем помощник:

def youtube_video(video_id)
  render :partial => 'youtube_video', :locals => { :id => video_id }
end

и пример частичного (haml):

%iframe{:allowfullscreen => "", :frameborder => "0", :height => "349",
        :src => "http://www.youtube.com/embed/#{id}", :width => "560"}

и так просто:

= youtube_video Model.video_id

Ответ 5

Это то, что использует youtube:

<iframe width="425" height="349" src="http://www.youtube.com/embed/zb-gmJVW5lw" frameborder="0" allowfullscreen></iframe>

Затем просто используйте regexp для изменения ссылки:

http://www.youtube.com/watch?v=zb-gmJVW5lw

в

http://www.youtube.com/embed/zb-gmJVW5lw

Здесь доказательство регулярного выражения для соответствия регулярных ссылок на YouTube:

И здесь доказательство концепции regexp для сопоставления ссылок youtu.be:

Обратите внимание, что URL-адрес вставки можно также загрузить в браузере, который открывает страницу, где видео полноэкранный.

Ответ 6

Мне пришлось включить эту функциональность в один из моих последних проектов. Мне пришлось поддерживать связь как с видео YouTube, так и с Vimeo. Я использую модуль uri Ruby и HTTParty. В основном я пришел со следующим:

class LinkVideo < ActiveRecord::Base
  require 'uri'
  include HTTParty

  cattr_reader :per_page
  @@per_page = 12

  belongs_to :user

  validates :weblink, :presence => true, :domain => true


  def embed(width = "640", height = "390")
    embed_code = nil

    case base_uri
      when "www.youtube.com"
        embed_code = "<object width='#{width}' height='#{height}'>" +
              "<param name='movie' value='#{url}'></param>" +
              "<param name='allowFullScreen' value='false'></param>" +
              "<param name='allowscriptaccess' value='always'></param>" +
              "<embed src='#{url}' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='false' 
                  width='#{width}' height='#{height}'> </embed>" +
            "</object>"
        when "www.vimeo.com"
          embed_code = "<iframe src='#{url}' width='#{width}' height='#{height}' frameborder='0'></iframe>"
      end

      embed_code
  end

  def url
    url = nil
    case base_uri
      when "www.youtube.com"
        url = "http://www.youtube.com/v/" + video_id + "&amp;hl=en_US&amp;fs=1"
      when "www.vimeo.com"
        url = "http://player.vimeo.com/video/" + video_id
    end

    url
  end

  def thumbnail
    url = nil
    case base_uri
      when "www.youtube.com"  
        url = "http://img.youtube.com/vi/" + video_id + "/2.jpg"
      when "www.vimeo.com"
        url = thumbnail_path( image_base_uri, video_id )
    end

    url  
  end

  # Video Paths:
  #   http://www.youtube.com/watch?v=Gqraan6sBjk
  #   http://www.vimeo.com/21618919
  # Thumbnail Paths:
  #   http://img.youtube.com/vi/Gqraan6sBjk/2.jpg
  private
    def image_base_uri
      image_base_uri = nil
      case base_uri
        when "www.youtube.com"
          image_base_uri = "http://img.youtube.com/vi/"
        when "www.vimeo.com"
          image_base_uri = "http://vimeo.com/api/v2/video/"
      end

      image_base_uri
    end

    def thumbnail_path(base_uri, videoid = nil, format = 'xml')
      path = nil

      return path if base_uri.nil?

      xml     = HTTParty.get( base_uri + ( videoid.nil? ? video_id : videoid ) + format.insert(0, '.') )
      values  = xml.parsed_response.values_at("videos").first.fetch('video')
      if values["user_portrait_medium"].include?('100')
        path  = values["user_portrait_medium"]
      else values["user_portrait_large"].include?('100')
        path = values["user_portrait_large"]
      end

      path
    end

    def base_uri
      @uri ||= parse_it

      @uri.host
    end

    def video_id
      video_id = nil
      case base_uri
        when "www.youtube.com"
          video_id = @uri.query.split('=')[1].slice(0, 11)
        when "www.vimeo.com"
          video_id = @uri.path.delete('/')
      end

      video_id
    end

    def parse_it
      @uri = URI.parse( weblink )
    end
end

Ответ 7

Возможно, вам захочется свернуть свое собственное решение, но стоит подумать о API-интерфейсе Embedly. http://embed.ly/

Ответ 8

Я думаю, что самый простой способ добиться того, что вы пытаетесь сделать, это следующее:

Вы пытаетесь получить от этого:

http://www.youtube.com/watch?v=zb-gmJVW5lw

Для этого:

<iframe width="640" height="360" src="http://www.youtube.com/embed/zb-gmJVW5l" frameborder="0" allowfullscreen></iframe>

Итак, вы можете просто сделать это:

#### Use a regular expression to extract the video code
@video_id = (/([\w-]{11})/.match(@v_url)).to_s
#### Put this information in the right format
@embed_code = "<iframe width='640' height='360' src='http://www.youtube.com/embed/#{@video_id}' frameborder='0' allowfullscreen></iframe>"

И затем, на ваш взгляд, просто выполните:

<%= raw(@embed_code) %>

Ответ 9

Я создал простой помощник для встраивания видео на YouTube:

# Helpers for better embedding and manipulation of videos
module VideosHelper
  # Regex to find YouTube video ID
  YOUTUBE_REGEX = %r(^(http[s]*:\/\/)?(www.)?(youtube.com|youtu.be)\/(watch\?v=){0,1}([a-zA-Z0-9_-]{11}))

  # Embeds YouTube video of given URL in an iframe
  #
  # @param url [String] URL of desired video
  # @param width [String] width of embedded video. Can be any valid CSS unit
  # @param height [String] height of embedded video. Can be any valid CSS unit
  # @return [String] HTML string of embedded video
  def youtube_embed(url, width = "100%", height = "250px")
    youtube_id = find_youtube_id(url)

    result = %(<iframe title="YouTube video player" width="#{width}"
                height="#{height}" src="//www.youtube.com/embed/#{ youtube_id }"
                frameborder="0" allowfullscreen></iframe>)
    result.html_safe
  end

  # Finds YouTube video ID from given URL or [nil] if URL is invalid
  # The video ID matches the RegEx \[a-zA-Z0-9_-]{11}\
  #
  # @param url [String] URL of desired video
  # @return [String] video ID of given URL
  def find_youtube_id(url)
    url = sanitize(url).to_str

    matches = YOUTUBE_REGEX.match url

    if matches
      matches[6] || matches[5]
    end
  end
end