#!/usr/bin/ruby ARGV.each { |base| base = Regexp.escape base # handle badly decoded nget files Dir.entries('.').grep(/#{base}.*\.\d+\.\d+$/).each { |file| canon = file[/^.*(?=\.\d+\.\d+$)/] if not File.exist? canon or File.size(canon) < File.size(file) puts "[+] renaming nget partial file #{file.inspect}" File.rename(file, canon) end } # par2 the files files = Dir.entries('.').grep(/#{base}/) files -= files.grep(/^ngettemp-/) parfile = files.reject{ |f| f =~ /\.vol\d/ }.grep(/\.par2$/i).first || files.grep(/\.vol0+\+\d+\.par2$/i).first || files.grep(/\.par2$/i).first || files.grep(/\.p01$/i).first if not parfile puts "[-] no parity file found for #{base}" else nbase = Regexp.escape parfile.sub(/\.par2$/i, '').sub(/\.vol\d+\+\d+$/i, '').sub(/\.p\d\d$/i, '') if system('par2', 'r', parfile) puts files = Dir.entries('.').grep(/^#{nbase}\.(\w+(\.\w+)?\.(\d+\.\d+|1)|(vol\d+\+\d+\.)?par2|sfv|nzb)$/i) File.unlink(*files) else puts # detect splitted files unsplitted = false if files.grep(/^#{nbase}$/).empty? and not files.grep(/^#{nbase}\.001$/).empty? root = files.grep(/^#{nbase}\.001$/).first[0..-5] puts "[+] unsplitting #{root}" File.open(root, 'w') { |w| files.grep(/^#{nbase}\.\d\d\d$/).sort.each { |file| w.write File.open(file, 'rb') { |r| r.read } } } end if root and system('par2', 'r', parfile) puts files = Dir.entries('.').grep(/^#{nbase}\.((\w+(\.\w+)?\.)?(\d+\.\d+|1)|(vol\d+\+\d+\.)?par2|sfv|nzb|\d\d\d)$/i) File.unlink(*files) end end end files = Dir.entries('.').grep(/^#{nbase}/) if parfile files -= files.grep(/^ngettemp-/) rarfile = files.grep(/\.part0*1\.rar$/i).first || files.grep(/\.rar$/i).first || files.grep(/\.r0*1$/i).first || files.grep(/\.001/).first if not rarfile puts "[-] no 1st rar file found for #{nbase || base}" else if system('rar', 'x', rarfile) puts nbase = Regexp.escape rarfile.sub(/\.((part0*1\.)?rar|r0*1|001)$/i, '') files = Dir.entries('.').grep(/^#{nbase}\.(\w+(\.\w+)?\.(\d+\.\d+|1)|(vol\d+\+\d+\.)?par2|sfv|nzb|(part\d+\.)?rar|r\d+|\d\d\d)$/i) File.unlink(*files) end end }