codevise/pageflow

View on GitHub
app/helpers/pageflow/video_files_helper.rb

Summary

Maintainability
A
3 hrs
Test Coverage
module Pageflow
  module VideoFilesHelper
    include RevisionFileHelper

    def mobile_poster_image_div(config = {})
      classes = ['background', 'background_image']
      position = {x: 50, y: 50}

      if config['mobile_poster_image_id']
        classes << "image_#{config['mobile_poster_image_id']}"
        position[:x] = config['mobile_poster_image_x'] || 50
        position[:y] = config['mobile_poster_image_y'] || 50
      elsif config['poster_image_id']
        classes << "image_#{config['poster_image_id']}"
        position[:x] = config['poster_image_x'] || 50
        position[:y] = config['poster_image_y'] || 50
      elsif config['video_file_id']
        classes << "video_poster_#{config['video_file_id']}"
        position[:x] = config['video_file_x'] || 50
        position[:y] = config['video_file_y'] || 50
      else
        classes << 'video_poster_none'
      end

      content_tag(:div, '',
                  class: classes.join(' '),
                  style: "background-position: #{position[:x]}% #{position[:y]}%;")
    end

    def poster_image_tag(video_file_perma_id, poster_image_perma_id = nil, options = {})
      video_file = find_file_in_entry(VideoFile, video_file_perma_id)
      poster = poster_image_perma_id.present? ? find_file_in_entry(ImageFile, poster_image_perma_id) : nil

      if poster&.ready?
        options = options.merge('data-src' => poster.attachment.url(:medium))
        options = options.merge('data-printsrc' => poster.attachment.url(:print))
      elsif video_file
        options = options.merge('data-src' => video_file.poster.url(:medium))
        options = options.merge('data-printsrc' => video_file.poster.url(:print))
      end

      image_tag('', options)
    end

    def video_file_video_tag(video_file, options = {})
      defaults = {
        crossorigin: 'anonymous',
        class: [
          'player video-js video-viewport vjs-default-skin',
          options.delete(:class)
        ].compact * ' ',
        preload:  options.delete(:preload) ? 'metadata' : 'none'
      }

      options.reverse_merge! defaults
      url_options = {unique_id: options.delete(:unique_id)}

      poster_image_id = options.delete(:poster_image_id)
      poster = poster_image_id.present? ? find_file_in_entry(ImageFile, poster_image_id) : nil
      mobile_poster_image_id = options.delete(:mobile_poster_image_id)
      mobile_poster = mobile_poster_image_id.present? ? find_file_in_entry(ImageFile, mobile_poster_image_id) : nil

      options[:data] = {}

      if mobile_poster&.ready?
        options[:data][:mobile_poster] = mobile_poster.attachment.url(:medium)
        options[:data][:mobile_large_poster] = mobile_poster.attachment.url(:large)
      end

      if poster&.ready?
        options[:data][:poster] = poster.attachment.url(:medium)
        options[:data][:large_poster] = poster.attachment.url(:large)
      elsif video_file
        options[:data][:poster] = video_file.poster.url(:medium)
        options[:data][:large_poster] = video_file.poster.url(:large)
      end

      if video_file && video_file.width.present? && video_file.height.present?
        options[:data][:width] = video_file.width
        options[:data][:height] = video_file.height
      end

      render('pageflow/video_files/video_tag',
             video_file: video_file,
             options: options,
             url_options: url_options)
    end

    # @deprecated
    def lookup_video_tag(video_id, poster_image_id, options = {})
      video_file_script_tag(video_id, options.merge(poster_image_id: poster_image_id))
    end

    def video_file_script_tag(video_file_perma_id, options = {})
      video_file = find_file_in_entry(VideoFile, video_file_perma_id)

      script_tag_data = {template: 'video'}

      if video_file && video_file.width.present? && video_file.height.present?
        script_tag_data[:video_width] = video_file.width
        script_tag_data[:video_height] = video_file.height
      end

      render('pageflow/video_files/script_tag',
             script_tag_data: script_tag_data,
             video_file: video_file,
             options: options)
    end

    def video_file_non_js_link(entry, video_file_perma_id)
      video_file = find_file_in_entry(VideoFile, video_file_perma_id)
      return unless video_file

      link_to(t('pageflow.public.play_video'),
              short_video_file_path(entry, video_file.id),
              class: 'hint')
    end

    def video_file_sources(video_file, options = {})
      [
        {
          type: 'application/x-mpegURL',
          src: video_file.hls_playlist.url(options),
          high_src: video_file.hls_playlist.url(options)
        },
        {
          type: 'video/mp4',
          src: video_file.mp4_medium.url(options),
          high_src: video_file.mp4_high.url(options)
        }
      ]
    end
  end
end