|
@@ -0,0 +1,106 @@
|
|
|
+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
|