schneidmaster/debatevid.io

View on GitHub
app/services/video_information_service.rb

Summary

Maintainability
A
2 hrs
Test Coverage
A
100%
class VideoInformationService
  class << self
    def link_info(link)
      is_vimeo = link.include?('vimeo')
      is_youtube = link.include?('youtube') || link.include?('youtu.be')
      return invalid_json unless is_vimeo || is_youtube

      if is_vimeo
        vimeo_link_info(link)
      else
        youtube_link_info(link)
      end
    end

    private

    def vimeo_link_info(link)
      id = URI.parse(link).request_uri[1..-1].split('?').first
      object = Vimeo::Simple::Video.info(id)
      return invalid_json if object.response.code == '404'
      raw_info = object.first
      {
        provider: 'vimeo',
        key: id,
        title: raw_info['title'],
        thumbnail: raw_info['thumbnail_medium'],
      }
    end

    VALID_YOUTUBE_HOSTS = ['www.youtube.com', 'youtube.com', 'youtu.be'].freeze

    def youtube_link_info(link)
      uri = URI.parse(link)
      return invalid_json unless VALID_YOUTUBE_HOSTS.include?(uri.host)

      id =
        if uri.host == 'youtu.be'
          link.split('/').last
        else
          params = URI.parse(link).request_uri.split('?').last
          params_array = CGI.parse(params)
          params_array['v'].first
        end

      begin
        html = RestClient.get(link)
        return invalid_json unless html.code == 200

        title_node = html.body.match(/<title>(.*)<\/title>/)
        title = title_node.to_s.gsub(/<(\/?)title>/, '').gsub(' - YouTube', '')

        img_node = html.body.match(/<meta property="og:image" content="(.*)">/)
        thumbnail = img_node.to_s.gsub('<meta property="og:image" content="', '').gsub('">', '')
      rescue
        return invalid_json
      end

      {
        provider: 'youtube',
        key: id,
        title: title,
        thumbnail: thumbnail,
      }
    end

    def invalid_json
      { invalid: true }
    end
  end
end