123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- 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}\" [email protected]: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
|