Crunch.rb 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. require 'cinch'
  2. require 'open-uri'
  3. require 'nokogiri'
  4. require 'zlib'
  5. class Download
  6. include Cinch::Plugin
  7. match(/crd (.*)\??$/i)
  8. def execute(m, url)
  9. @dlDir = "#{File.join(File.absolute_path(File.dirname(__FILE__)), "downloads")}"
  10. if URI.parse url and url.match(/(crunchyroll\.(fr|com)(\/\S+)?)/)
  11. doc = Nokogiri::HTML(open("#{url}"))
  12. title = doc.css("title").text.sub(/Crunchyroll - Watch /, "")
  13. series = title.sub(/( (E|É)pisode ).*/, "")
  14. episode = title.match(/((E|É)pisode [0-9]+)/)[0].sub(/((E|É)pisode )/, "")
  15. episode = "0#{episode}" if episode.to_i < 10
  16. fname = "#{series.gsub(/\s+/, "_")}_-_#{episode}"
  17. # debug "#{fname} / #{episode} / #{series}"
  18. m.reply "Récupération de « #{title} », demandé par #{m.user.nick}"
  19. if getVideo(url, title)
  20. m.reply "« #{title} » a été téléchargé, merci de patienter le temps de quelques ajustements !"
  21. remux(title, fname)
  22. release = crc32(fname)
  23. upload(release)
  24. cleanup(title, release)
  25. m.reply "#{m.user.nick}, le fichier #{release} a été déposé sur le XDCC."
  26. else
  27. m.reply "Un problème est survenu pendant le téléchargement de « #{title} » :/"
  28. end
  29. else
  30. m.reply "#{m.user.nick} apprend à recopier une URL, tss..."
  31. end
  32. doc = nil
  33. @dlDir = nil
  34. title = nil
  35. episode = nil
  36. fname = nil
  37. release = nil
  38. end
  39. def getVideo url, title
  40. debug "Exécution de crdown pour récup la vidéo #{url}"
  41. pidCr = spawn("crdown #{url}")
  42. Process.wait(pidCr)
  43. debug "Vérification de la présence du fichier #{title}.{flv,ass} dans #{@dlDir}..."
  44. if File.exists?(File.join(@dlDir,"#{title}.flv")) and File.exists?(File.join(@dlDir,"#{title}.ass"))
  45. debug "Tout a été téléchargé."
  46. return true
  47. else
  48. debug "Fichiers manquants"
  49. return false
  50. end
  51. end
  52. def remux title, fname
  53. debug "Exécution de ffmpeg pour split le fichier"
  54. 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")
  55. Process.wait(pidConv)
  56. debug "Split terminé."
  57. debug "Mux en mkv en cours..."
  58. pidMux = spawn("mkvmerge -q -o \"#{@dlDir}/#{fname}.mkv\" \"#{@dlDir}/#{title}.ass\" \"#{@dlDir}/#{title}.h264\" --aac-is-sbr 0 \"#{@dlDir}/#{title}.aac\"")
  59. Process.wait(pidMux)
  60. debug "Mux terminé !"
  61. end
  62. def crc32 fname
  63. debug "Calcul du CRC32 pour #{fname}.mkv"
  64. #crc32 = "#{File.open(File.join(@dlDir, "#{fname}.mkv")) { |f| Zlib.crc32 f.read }.to_s(16).upcase}"
  65. io=IO.popen("perl crc32.pl \"#{File.join(@dlDir, "#{fname}.mkv")}\"")
  66. crc32 = "#{io.read.chomp.upcase}"
  67. io.close
  68. crc32 = "0#{crc32}" if crc32.length < 8
  69. debug "CRC32 done. Renommage"
  70. File.rename(File.join(@dlDir, "#{fname}.mkv"), File.join(@dlDir, "#{fname}_[#{crc32}].mkv"))
  71. return "#{fname}_[#{crc32}].mkv"
  72. end
  73. def upload fname
  74. debug "Upload en cours"
  75. system("rsync -e 'ssh -i /home/tone/.ssh/id_rsync' -q \"downloads/#{fname}\" [email protected]:dcc/")
  76. end
  77. def cleanup title, fname
  78. debug "Nettoyage..."
  79. system("rm \"#{@dlDir}/#{title}.flv\"")
  80. system("rm \"#{@dlDir}/#{title}.ass\"")
  81. system("rm \"#{@dlDir}/#{title}.aac\"")
  82. system("rm \"#{@dlDir}/#{title}.h264\"")
  83. system("rm \"#{@dlDir}/#{fname}\"")
  84. debug "Nettoyage terminé !"
  85. end
  86. end
  87. bot = Cinch::Bot.new do
  88. configure do |c|
  89. c.nick = "Crunch"
  90. c.server = "irc.recycled-irc.net"
  91. c.channels = ["#tone-bot"]
  92. c.plugins.plugins = [Download]
  93. end
  94. end
  95. bot.start