Sha256: 451dcef2b6280bd83f90ee3d8e234f792d7cfe4014647b2309b63f0fe40614c0

Contents?: true

Size: 1.98 KB

Versions: 1

Compression:

Stored size: 1.98 KB

Contents

require 'oga'
require 'open-uri'

class VideoInfo
  module Providers
    module YoutubeScraper
      def date
        date = itemprop_node_value('datePublished')

        Time.parse(date) unless !date
      end

      def description
        meta_node_value('description')
      end

      def duration
        duration = itemprop_node_value('duration')

        if duration
          ISO8601::Duration.new(duration).to_seconds.to_i
        else
          0
        end
      end

      def keywords
        value = meta_node_value('keywords')

        value.split(', ') unless !value
      end

      def title
        meta_node_value('title')
      end

      def thumbnail_small
        "https://i.ytimg.com/vi/#{video_id}/default.jpg"
      end

      def thumbnail_medium
        "https://i.ytimg.com/vi/#{video_id}/mqdefault.jpg"
      end

      def thumbnail_large
        "https://i.ytimg.com/vi/#{video_id}/hqdefault.jpg"
      end

      def view_count
        data.css('div.watch-view-count').text.gsub(',', '').to_i
      end

      private

      def meta_nodes
        @meta_nodes ||= data.css('meta')
      end

      def meta_node_value(name)
        if available?
          node = meta_nodes.detect { |n| n.attr('name').value == name }

          node.attr('content').value
        end
      end

      def itemprop_node_value(name)
        if available?
          node = meta_nodes.detect do |m|
            itemprop_attr = m.attr('itemprop')

            itemprop_attr.value == name unless !itemprop_attr
          end

          node.attr('content').value
        end
      end

      def available?
        data.css('div#unavailable-submessage').text.strip.empty?
      end

      def _set_data_from_api(api_url = _api_url)
        uri = URI(api_url)

        unless uri.scheme
          uri.path = uri.path.prepend('//')
          uri.scheme = 'http'
        end

        Oga.parse_html(open(uri.to_s, allow_redirections: :safe).read)
      end

      def _api_url
        @url
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
video_info-2.5.0 lib/video_info/providers/youtube_scraper.rb