#!/usr/bin/ruby # Copyright (c) 2007, Mirco Macrelli # All rights reserved. def process_file(file_name) case file_name[/\....$/].downcase when ".zip", ".cbz" process_zip file_name when ".rar", ".cbr" process_rar file_name end end def get_zip_path(line) path = line.match(/ [\d]{2}\:[\d]{2} (.+)$/).to_s return path.slice(7,path.length) end def process_zip(zip) info = `zipinfo "#{zip}"` dir_name = '' info.each_line do |line| if line =~ /^drwx.*/ dir_name = get_zip_path(line) end end if dir_name.empty? puts "Salto il file #{zip} perché non ha una cartella principale." return end info.each_line do |line| if line =~ /^\-rwx.*/ file_path = get_zip_path(line) if file_path.slice(0,dir_name.length) != dir_name puts "Salto il file '#{zip}' perché cotiene dei file fuori dalla caretella pricipale." return end end end `unzip "#{zip}"` process_directory dir_name end def process_rar(rar) info = `rar l "#{rar}"` dir_name = '' info.each_line do |line| if line =~ /[\d]{2}\:[\d]{2} drwx/ dir_name = line.match(/^ .+ 0/).to_s dir_name = dir_name.slice(0,dir_name.length - 10).rstrip!.lstrip! end end if dir_name.empty? puts "Salto il file #{rar} perché non ha una cartella principale." return end info = `rar vb "#{rar}"` info.each_line do |line| unless line.include? dir_name puts "Salto il file '#{rar}' perché cotiene dei file fuori dalla caretella pricipale." return end end `rar x "#{rar}"` process_directory dir_name end def process_directory(directory) puts "Inserisci il nuovo nome da usare per \"#{directory}\":" template = STDIN.gets.chop new_directory = template if FileTest.exists? new_directory puts "La cartella \"#{new_directory}\" esiste!" return end if FileTest.exists? "#{new_directory}.cbr" puts "Il file \"#{new_directory}.cbr\" esiste!" return end File.rename directory, new_directory Dir.foreach new_directory do |entry| next if entry == "." or entry == ".." if FileTest.directory? entry puts "Ho trovato una sotto cartella di nome \"#{entry}\" vuoi cancellarla?" response = STDIN.gets File.delete "#{new_directory}/#{entry}" if response == "s" end File.delete "#{new_directory}/#{entry}" if entry == "Thumbs.db" or entry == ".DS_Store" if entry =~ /cover/i or entry =~ /credits/i then puts "Vuoi cancellare il file \"#{entry}\"?" response = STDIN.gets.chop! File.delete "#{new_directory}/#{entry}" if response == "s" end end file_list=[] Dir.foreach new_directory do |entry| file_list << entry if FileTest.file? "#{new_directory}/#{entry}" end file_list.sort! justify_length = 1 if file_list.length > 9 justify_length = 2 elsif file_list.length > 99 justify_length = 3 end file_index = 1 file_list.each do |file| new_file = "#{template}_" + "#{file_index}".rjust(justify_length, "0") + file[/\....$/].downcase File.rename "#{new_directory}/#{file}", "#{new_directory}/#{new_file}" file_index += 1 end `rar a -m5 -s "#{new_directory}.cbr" "#{new_directory}"` `rm -rf "#{new_directory}"` end ### ENTRY POINT ### if $*.length == 0 puts "Devi fornire come argomento almeno un file o una cartella!\n" return end $*.each do |item| if !FileTest.exists? item puts "\"#{item}\" non esiste! Continuo con il prossimo." next end if FileTest.file? item process_file item elsif FileTest.directory? item process_directory item end end