module VideoInfo::Providers::VimeoScraper

Public Instance Methods

author() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 7
def author
  if available?
    json_info["author"]["name"]
  end
end
author_thumbnail() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 13
def author_thumbnail
  unless available?
    return nil
  end

  split_point = "window.vimeo.clip_page_config ="
  script_tags = data.css("script")

  script_index = script_tags.find_index do |x|
    x.text.include?(split_point)
  end

  script_text = script_tags[script_index].text

  split_script_text = script_text.split(split_point)[1]

  parsed_data = JSON.parse(split_script_text.split(";\n")[0])

  parsed_data["owner"]["portrait"]["src"]
end
author_url() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 34
def author_url
  if available?
    json_info["author"]["url"]
  end
end
available?() click to toggle source
Calls superclass method
# File lib/video_info/providers/vimeo_scraper.rb, line 40
def available?
  is_available = super

  if data.nil?
    is_available = false
  elsif is_available
    password_elements = data.css(".exception_title--password")

    unless password_elements.empty?
      is_available = false
    end
  end

  is_available
end
date() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 64
def date
  if available?
    upload_date = json_info["uploadDate"]
    ISO8601::DateTime.new(upload_date).to_time
  end
end
description() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 60
def description
  meta_node_value("og:description")
end
duration() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 71
def duration
  if available?
    duration = json_info["duration"]
    ISO8601::Duration.new(duration).to_seconds.to_i
  end
end
height() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 86
def height
  if available?
    json_info["height"]
  end
end
keywords() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 78
def keywords
  unless available?
    return nil
  end

  json_info["keywords"] || []
end
stats() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 122
def stats
  return {} unless available?
  {
    "plays" => view_count,
    "likes" => user_interaction_count(interaction_type: "LikeAction"),
    "comments" => user_interaction_count(interaction_type: "CommentAction")
  }
end
thumbnail_large() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 110
def thumbnail_large
  if available?
    thumbnail_url.split("_")[0] + "_640.jpg"
  end
end
thumbnail_medium() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 104
def thumbnail_medium
  if available?
    thumbnail_url.split("_")[0] + "_200x150.jpg"
  end
end
thumbnail_small() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 98
def thumbnail_small
  if available?
    thumbnail_url.split("_")[0] + "_100x75.jpg"
  end
end
title() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 56
def title
  meta_node_value("og:title")
end
view_count() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 116
def view_count
  if available?
    user_interaction_count(interaction_type: "WatchAction")
  end
end
width() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 92
def width
  if available?
    json_info["width"]
  end
end

Private Instance Methods

_api_path() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 201
def _api_path
  _api_url
end
_api_url() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 195
def _api_url
  uri = URI.parse(@url)
  uri.scheme = "https"
  uri.to_s
end
_set_data_from_api_impl(api_url) click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 189
def _set_data_from_api_impl(api_url)
  Oga.parse_html(URI.parse(api_url.to_s).read)
rescue OpenURI::HTTPError
  nil
end
interaction_statistic() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 139
def interaction_statistic
  json_info["interactionStatistic"]
end
json_info() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 143
def json_info
  @json_info ||= JSON.parse(data.css("script").detect do |n|
    type = n.attr("type")

    if type.nil?
      false
    else
      type.value == "application/ld+json"
    end
  end.text)[0]
end
meta_node_value(name) click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 173
def meta_node_value(name)
  if available?
    node = meta_nodes.detect do |n|
      property = n.attr("property")

      if property.nil?
        false
      else
        property.value == name
      end
    end

    node.attr("content").value
  end
end
meta_nodes() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 169
def meta_nodes
  @meta_nodes ||= data.css("meta")
end
remove_overlay(url) click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 159
def remove_overlay(url)
  uri = URI.parse(url)

  if uri.path == "/filter/overlay"
    CGI.parse(uri.query)["src0"][0]
  else
    url
  end
end
thumbnail_url() click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 155
def thumbnail_url
  @thumbnail_url ||= remove_overlay(meta_node_value("og:image"))
end
user_interaction_count(interaction_type:) click to toggle source
# File lib/video_info/providers/vimeo_scraper.rb, line 133
def user_interaction_count(interaction_type:)
  interaction_statistic&.find do |stat|
    stat["interactionType"] == "http://schema.org/#{interaction_type}"
  end&.public_send(:[], "userInteractionCount")
end