app/models/media_entry.rb

Summary

Maintainability
C
1 day
Test Coverage
# -*- encoding : utf-8 -*-
#= MediaEntry
#
# This class could just as easily also be known as MediaObject..
# and one day might become so.

class MediaEntry < MediaResource
  include MediaResourceModules::MediaFile

  default_scope { reorder(:created_at,:id) }

  alias :media_sets :parent_sets 

########################################################

  # OPTIMIZE
  def individual_contexts
    media_sets.flat_map {|set| set.individual_contexts }.uniq
  end

########################################################

  def to_s
    "#{title}"
  end

  # compares two objects in order to sort them
  # required by dot
  def <=>(other)
    self.updated_at <=> other.updated_at
  end

########################################################

  def self.to_tms_doc(resources, io_interface= IoInterface.find("tms"))
    require 'active_support/builder' unless defined?(::Builder)
    xml = ::Builder::XmlMarkup.new
    xml.instruct!
    xml.madek(:version => MadekSemver.semver) do
      Array(resources).each do |resource|
        resource.to_tms(xml, io_interface)
      end
    end
  end
  
########################################################

  def to_tms(xml, io_interface)
    xml.snapshot do
      #old# meta_data.each do |meta_datum|
      meta_data.for_io_interface(io_interface).each do |meta_datum|
        key_map = meta_datum.meta_key.key_map_for(io_interface)
        if key_map
          # TODO use treetop gem
          key_map.split('||').each do |km|
            tokens = km.split(' ', 2)
            name = tokens.first
            attrs = {}
          
            tokens = (tokens.size > 1 ? tokens.last : nil)
            
            while not tokens.blank? do
              a = tokens.split('=', 2)
              k = a.first
              if a.last.first == '"'
                b = a.last.split('"', 3)
                v = b[1]
                tokens = (b.size > 2 ? b.last : nil)
              else
                b = a.last.split(' ', 2)
                v = b[0]
                tokens = (b.size > 1 ? b.last : nil)
              end
              attrs[k] = v
            end
            case meta_datum.meta_key.meta_datum_object_type
              when "MetaDatumMetaTerms"
                xml.tag!(name, attrs) do
                  meta_datum.value.each do |dv|
                    xml.tag!("term", dv.to_s)
                  end
                end
              when "MetaDatumPeople"
                meta_datum.value.each do |dv|
                  xml.tag!(name, attrs) do
                    xml.tag!("first_name", dv.first_name)
                    xml.tag!("last_name", dv.last_name)
                  end
                end
              else
                value = meta_datum.to_s
                case name
                  when "person"
                    xml.person(attrs) do
                      xml.tag!("name", value)
                    end
                  when "objects.creditline"
                    xml.tag!(name, attrs, "Verwaltet durch #{value}")
                  else
                    xml.tag!(name, attrs, value)
                end
            end
          end
        end
      end
    end
  end
  
########################################################

  def self.compared_meta_data(media_entries, context)
   compared_against, other_entries = media_entries[0], media_entries[1..-1]
   compared_meta_data = compared_against.meta_data.for_context(context)
   
   new_blank_media_entry = self.new
   compared_meta_data.map do |md_bare|
      if other_entries.any? {|me| not me.meta_data.get(md_bare.meta_key_id).same_value?(md_bare.value)}
        new_blank_media_entry.meta_data.build(:meta_key_id => md_bare.meta_key_id, :keep_original_value => true)
      else
        new_blank_media_entry.meta_data.build(:meta_key_id => md_bare.meta_key_id, :value => md_bare.value)
      end
   end
  end

  def self.search_with(term)
    if uuid?(term)
      where(id: term)
    else
      joins(%Q{LEFT OUTER JOIN custom_urls ON "custom_urls"."media_resource_id"="media_resources"."id"}) \
        .joins(%Q{LEFT OUTER JOIN meta_data ON "meta_data"."media_resource_id"="media_resources"."id"}) \
        .where(%Q{"custom_urls"."id" ILIKE :search_term OR "meta_data"."meta_key_id"='title' AND "meta_data"."string" ILIKE :search_term}, search_term: "%#{term}%") \
        .group("media_resources.id")
    end
  end

  def self.uuid?(id)
    id =~ /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
  end


  ########################################################

  def self.original_md5file_duplicates

    files_md5 = Set.new
    duplicate_ids = Set.new

    all.each do |me|
      file = me.media_file.file_storage_location
      unless File.file?(file)
        Rails.logger.warn "Original file for MediaEntry #{me.id} does not exist"
      else
        md5= Digest::MD5.file(file).hexdigest
        unless files_md5.include?(md5)
          files_md5.add(md5)
        else
          duplicate_ids.add(me.id)
        end
      end
    end

    where(id: duplicate_ids.to_a)

  end



  def self.original_filename_duplicates

    files_md5 = Set.new
    duplicate_ids = Set.new

    all.each do |me|
      file = me.media_file
      file_path= file.file_storage_location
      unless File.file?(file_path)
        Rails.logger.warn "Original file for MediaEntry #{me.id} does not exist"
      else
        filename= file.filename
        unless files_md5.include?(filename)
          files_md5.add(filename)
        else
          duplicate_ids.add(me.id)
        end
      end
    end

    where(id: duplicate_ids.to_a)

  end



  def self.original_exifcreated_duplicates

    seen_timestamps = Set.new
    duplicate_ids = Set.new

    all.each do |me|
      file = me.media_file
      file_path= file.file_storage_location
      unless File.file?(file_path)
        Rails.logger.warn "Original file for MediaEntry #{me.id} does not exist"
      else
        timestamp = `exiftool -T -createdate #{file_path}`.squish
        if timestamp.present? and timestamp != "-" 
          unless seen_timestamps.include?(timestamp)
            seen_timestamps.add timestamp
          else
            duplicate_ids.add(me.id)
          end
        else
          Rails.logger.warn "No Exif-Timestap for MediaEntry #{me.id} "
        end
      end
    end

    where(id: duplicate_ids.to_a)

  end




end