require 'cinch' require 'open-uri' require 'nokogiri' require 'zlib' class Download include Cinch::Plugin match(/crd (.*)\??$/i) def execute(m, url) @dlDir = "#{File.join(File.absolute_path(File.dirname(__FILE__)), "downloads")}" if URI.parse url and url.match(/(crunchyroll\.(fr|com)(\/\S+)?)/) doc = Nokogiri::HTML(open("#{url}")) title = doc.css("title").text.sub(/Crunchyroll - Watch /, "") series = title.sub(/( (E|É)pisode ).*/, "") episode = title.match(/((E|É)pisode [0-9]+)/)[0].sub(/((E|É)pisode )/, "") episode = "0#{episode}" if episode.to_i < 10 fname = "#{series.gsub(/\s+/, "_")}_-_#{episode}" # debug "#{fname} / #{episode} / #{series}" m.reply "Récupération de « #{title} », demandé par #{m.user.nick}" if getVideo(url, title) m.reply "« #{title} » a été téléchargé, merci de patienter le temps de quelques ajustements !" remux(title, fname) release = crc32(fname) upload(release) cleanup(title, release) m.reply "#{m.user.nick}, le fichier #{release} a été déposé sur le XDCC." else m.reply "Un problème est survenu pendant le téléchargement de « #{title} » :/" end else m.reply "#{m.user.nick} apprend à recopier une URL, tss..." end doc = nil @dlDir = nil title = nil episode = nil fname = nil release = nil end def getVideo url, title debug "Exécution de crdown pour récup la vidéo #{url}" pidCr = spawn("crdown #{url}") Process.wait(pidCr) debug "Vérification de la présence du fichier #{title}.{flv,ass} dans #{@dlDir}..." if File.exists?(File.join(@dlDir,"#{title}.flv")) and File.exists?(File.join(@dlDir,"#{title}.ass")) debug "Tout a été téléchargé." return true else debug "Fichiers manquants" return false end end def remux title, fname debug "Exécution de ffmpeg pour split le fichier" pidConv = spawn("ffmpeg -loglevel quiet -i \"#{@dlDir}/#{title}.flv\" -vcodec copy -vbsf h264_mp4toannexb \"#{@dlDir}/#{title}.h264\" -acodec copy \"#{@dlDir}/#{title}.aac\"", :out => "/dev/null") Process.wait(pidConv) debug "Split terminé." debug "Mux en mkv en cours..." pidMux = spawn("mkvmerge -q -o \"#{@dlDir}/#{fname}.mkv\" \"#{@dlDir}/#{title}.ass\" \"#{@dlDir}/#{title}.h264\" --aac-is-sbr 0 \"#{@dlDir}/#{title}.aac\"") Process.wait(pidMux) debug "Mux terminé !" end def crc32 fname debug "Calcul du CRC32 pour #{fname}.mkv" #crc32 = "#{File.open(File.join(@dlDir, "#{fname}.mkv")) { |f| Zlib.crc32 f.read }.to_s(16).upcase}" io=IO.popen("perl crc32.pl \"#{File.join(@dlDir, "#{fname}.mkv")}\"") crc32 = "#{io.read.chomp.upcase}" io.close crc32 = "0#{crc32}" if crc32.length < 8 debug "CRC32 done. Renommage" File.rename(File.join(@dlDir, "#{fname}.mkv"), File.join(@dlDir, "#{fname}_[#{crc32}].mkv")) return "#{fname}_[#{crc32}].mkv" end def upload fname debug "Upload en cours" system("rsync -e 'ssh -i /home/tone/.ssh/id_rsync' -q \"downloads/#{fname}\" tone@t0ne.net:dcc/") end def cleanup title, fname debug "Nettoyage..." system("rm \"#{@dlDir}/#{title}.flv\"") system("rm \"#{@dlDir}/#{title}.ass\"") system("rm \"#{@dlDir}/#{title}.aac\"") system("rm \"#{@dlDir}/#{title}.h264\"") system("rm \"#{@dlDir}/#{fname}\"") debug "Nettoyage terminé !" end end bot = Cinch::Bot.new do configure do |c| c.nick = "Crunch" c.server = "irc.recycled-irc.net" c.channels = ["#tone-bot"] c.plugins.plugins = [Download] end end bot.start