|
@@ -0,0 +1,69 @@
|
|
|
|
|
+require 'zip'
|
|
|
|
|
+require 'exifr/jpeg'
|
|
|
|
|
+require 'fileutils'
|
|
|
|
|
+
|
|
|
|
|
+module Fotos
|
|
|
|
|
+ class ZipExtractor
|
|
|
|
|
+ def initialize(options)
|
|
|
|
|
+ @zip_file_path = options[:zip]
|
|
|
|
|
+ @destination_path = options[:dest]
|
|
|
|
|
+ @extracted_paths = []
|
|
|
|
|
+ @copied_paths = []
|
|
|
|
|
+ end
|
|
|
|
|
+
|
|
|
|
|
+ attr_reader :zip_file_path, :destination_path
|
|
|
|
|
+ attr_accessor :extracted_paths, :copied_paths
|
|
|
|
|
+
|
|
|
|
|
+ def call
|
|
|
|
|
+ extract
|
|
|
|
|
+ copy
|
|
|
|
|
+ generate_thumbnails
|
|
|
|
|
+ end
|
|
|
|
|
+
|
|
|
|
|
+ private
|
|
|
|
|
+ def extract
|
|
|
|
|
+ Zip::File.open(zip_file_path) do |zip_file|
|
|
|
|
|
+ tmp_dir_path = File.join(Pathname.pwd, 'tmp')
|
|
|
|
|
+ Dir.mkdir(tmp_dir_path) unless Dir.exist?(tmp_dir_path)
|
|
|
|
|
+
|
|
|
|
|
+ zip_file.each do |entry|
|
|
|
|
|
+ file_name = entry.name.split('/').last
|
|
|
|
|
+ dest_path = File.join(tmp_dir_path, file_name)
|
|
|
|
|
+ #puts "extracting #{entry.name}"
|
|
|
|
|
+ extracted_paths << dest_path
|
|
|
|
|
+ entry.extract(dest_path)
|
|
|
|
|
+ rescue Zip::DestinationFileExistsError
|
|
|
|
|
+ next
|
|
|
|
|
+ end
|
|
|
|
|
+ end
|
|
|
|
|
+ end
|
|
|
|
|
+
|
|
|
|
|
+ def copy
|
|
|
|
|
+ date_format = '%d-%m-%Y'
|
|
|
|
|
+ copied_paths = extracted_paths.map do |fp|
|
|
|
|
|
+ file_name = File.basename(fp)
|
|
|
|
|
+ puts "looking at #{file_name}"
|
|
|
|
|
+ exif = EXIFR::JPEG.new(fp)
|
|
|
|
|
+
|
|
|
|
|
+ # get date from file's exif data
|
|
|
|
|
+ exif_date_str = exif.date_time.strftime(date_format)
|
|
|
|
|
+
|
|
|
|
|
+ # destination dir for given file in public/images/dd-mm-yyyy
|
|
|
|
|
+ dest_dir = File.join(Pathname.pwd, destination_path, 'images', exif_date_str)
|
|
|
|
|
+ dest_path = File.join(dest_dir, File.basename(fp))
|
|
|
|
|
+
|
|
|
|
|
+ # create destination dir if not already there
|
|
|
|
|
+ FileUtils.mkdir_p(dest_dir) unless Dir.exist?(dest_dir)
|
|
|
|
|
+ puts "#{file_name} --> #{dest_path}"
|
|
|
|
|
+ FileUtils.cp(fp, dest_path)
|
|
|
|
|
+ dest_path
|
|
|
|
|
+ end
|
|
|
|
|
+ end
|
|
|
|
|
+
|
|
|
|
|
+ def generate_thumbnails
|
|
|
|
|
+ copied_paths.map do |fp|
|
|
|
|
|
+ Thumbnail.new(fp).create
|
|
|
|
|
+ end
|
|
|
|
|
+ end
|
|
|
|
|
+ end
|
|
|
|
|
+end
|