Ruby mediainfo находит уникальные свойства

Я пытаюсь отсканировать большой жесткий диск (например, 17 ТБ), чтобы найти оценку хранилища для видеофайлов в определенных папках. Кроме того, я пытаюсь найти конкретные уникальные свойства видеофайлов. Цель этого - создать систему управления цифровыми активами, которая может поддерживать видеофайлы, которые мы получили в 2009 году. Я использую mediainfo для проверки каждого видео.

У меня работает размер файла / количество хранилищ, но у меня возникают проблемы с добавлением хэшей свойств видео в массив в моем цикле. Моя цель состоит в том, чтобы информация о мультимедиа смотрела на конкретные свойства каждого видео, помещала их в хэш и добавляла этот хэш в массив. Затем, как только я соберу все хэши свойств видео, я назову uniq! на массиве, чтобы он показал мне уникальные свойства видео.

Вывод моего кода в настоящее время снова и снова возвращает свойства видео для последнего видео. Я не вижу, что я делаю не так. Любой совет?

require 'yaml'

#!/usr/bin/ruby

library_path = ARGV[0]

files_list = Dir.glob("#{library_path}/**/*")
total_capture_scatch_and_exports_size = 0

video_audit = Hash.new()
video_info = []
codecs = Hash.new()




files_list.each do |filepath|
filename = File.basename(filepath.to_s)
  filepath.chomp!
  puts filename
  folders_to_scan = ["/capture scratch/", "/capturescratch/", "/capture-scratch/", "/capture_scratch/", "exports", "export"]

  file_size = File.size(filepath)
  file_extension = File.extname(filepath)
  if 
    folders_to_scan.any? { |folder| filepath.downcase.include? folder }

      if 
        File.file?(filepath) && filename[0] != "." && file_extension != ".TIFF" && file_extension != ".TIF" && file_extension != ".tif" && file_extension != ".tiff" && file_extension != ".jpg" && file_extension != ".jpeg" && file_extension != ".JPG" && file_extension != ".JPEG"
            duration = %x[mediainfo --Inform="General;%Duration/String3%" '#{filepath}'].chomp!
            format = %x[mediainfo --Inform="General;%Format%" '#{filepath}'].chomp!
            commercial_name = %x[mediainfo --Inform="General;%Format_Commercial_IfAny%" '#{filepath}'].chomp!
            format_profile = %x[mediainfo --Inform="General;%Format_Profile%" '#{filepath}'].chomp!
            writing_library = %x[mediainfo --Inform="General;%Encoded_Library%" '#{filepath}'].chomp!


            video_audit[:filepath] = filepath
            video_audit[:filename] = filename   
            video_audit[:duration] = duration
            video_audit[:file_size] = file_size
            video_audit[:format] = format
            video_audit[:commercial_name] = commercial_name
            video_audit[:format_profile] = format_profile
            video_audit[:writing_library] = writing_library
            video_audit[:file_extension] = file_extension

            codecs[:filename] = filename
            codecs[:format] = format
            codecs[:commercial_name] = commercial_name
            codecs[:format_profile] = format_profile
            codecs[:writing_library] = writing_library
            codecs[:file_extension] = file_extension    
      end   

  end
  puts video_audit.to_yaml
  puts codecs
  video_info << codecs
  total_capture_scatch_and_exports_size += file_size

end
puts "THE VIDEO INFO IS=======>>>> #{video_info}"
puts "THE UNIQUE CODECS ARE: #{video_info.uniq!}"
#1000**3 is for gigabytes (this is how finder on OSX calculates storage on the Drobo Harddrives)use 1024**3 ofr gibibytes
puts "The total filesize is : #{total_capture_scatch_and_exports_size/(1000**3).to_f} GB"

1 ответ

Я понял. Я создавал новые хеши вне цикла. Для каждой итерации необходимо было создать новый хеш, чтобы затем его можно было добавить в массив video_info. Затем мне нужно было удалить оператор bang, когда я вызвал uniq для video_info в конце скрипта. Вот мой окончательный код:

require 'json'

#developed by Maile Thiesen
#!/usr/bin/ruby

library_path = ARGV[0]

files_list = Dir.glob("#{library_path}/**/*")
total_capture_scatch_and_exports_size = 0
counter = 0

video_info = []

files_list.each do |filepath|
filename = File.basename(filepath.to_s)
  codecs = {}
  filepath.chomp!
  folders_to_scan = ["/capture scratch/", "/capturescratch/", "/capture-scratch/", "/capture_scratch/", "exports", "export"]

  file_size = File.size(filepath)
  file_extension = File.extname(filepath)
  if 
      folders_to_scan.any? { |folder| filepath.downcase.include? folder }

      if 
          File.file?(filepath) && filename[0] != "." && file_extension != ".TIFF" && file_extension != ".TIF" && file_extension != ".tif" && file_extension != ".tiff" && file_extension != ".jpg" && file_extension != ".jpeg" && file_extension != ".JPG" && file_extension != ".JPEG"
              duration = %x[mediainfo --Inform="General;%Duration/String3%" '#{filepath}'].chomp!
              format = %x[mediainfo --Inform="General;%Format%" '#{filepath}'].chomp!
              commercial_name = %x[mediainfo --Inform="General;%Format_Commercial_IfAny%" '#{filepath}'].chomp!
              format_profile = %x[mediainfo --Inform="General;%Format_Profile%" '#{filepath}'].chomp!
              writing_library = %x[mediainfo --Inform="General;%Encoded_Library%" '#{filepath}'].chomp!

              codecs[:format] = format
              codecs[:commercial_name] = commercial_name
              codecs[:format_profile] = format_profile
              codecs[:writing_library] = writing_library
            codecs[:file_extension] = file_extension    
            total_capture_scatch_and_exports_size += file_size

            counter += 1
            video_info << codecs
      end    

  end

end
puts "THE UNIQUE CODECS ARE: #{JSON.pretty_generate(video_info.uniq)}"
puts "THE TOTAL FILESIZE IS : #{total_capture_scatch_and_exports_size/(1000**3).to_f} GB"
Другие вопросы по тегам