瀏覽代碼

Push this to the repooooo!

Tone 10 年之前
當前提交
072f5024ef
共有 5 個文件被更改,包括 156 次插入0 次删除
  1. 106 0
      Crunch.rb
  2. 4 0
      Gemfile
  3. 35 0
      batch.sh
  4. 11 0
      crc32.pl
  5. 0 0
      downloads/.keep

+ 106 - 0
Crunch.rb

@@ -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

+ 4 - 0
Gemfile

@@ -0,0 +1,4 @@
+source "http://rubygems.org"
+gem "simple-rss"
+gem "nokogiri"
+gem "cinch"

+ 35 - 0
batch.sh

@@ -0,0 +1,35 @@
+#!/bin/bash
+
+# Unofficial Bash Strict Mode http://redsymbol.net/articles/unofficial-bash-strict-mode/
+set -euo pipefail
+IFS=$'\n\t'
+
+# Get current dir
+TOP_DIR=`pwd`
+
+# Change to export dir
+cd downloads
+for i in *.flv; do
+  # Get file name without extension
+  _filename=`basename "${i}" ".flv"`
+
+  # Split .flv in .264/.aac files. Needs ffmpeg installed.
+  echo "Spliting video of file ${_filename}.flv"
+  ffmpeg -i "${_filename}.flv" -vcodec copy -vbsf h264_mp4toannexb "${_filename}.h264" -acodec copy "${_filename}.aac" 
+  
+  # Merge .264/.aac/.ass files in .mkv. Needs mkvtoolnix installed.
+  echo "Starting mkvmerge of file ${_filename}"
+  if [ ! -f ${_filename}.ass ]; then
+    mkvmerge -o "${_filename}.mkv" "${_filename}.h264" --aac-is-sbr 0 "${_filename}.aac"
+  else
+    mkvmerge -o "${_filename}.mkv" "${_filename}.ass" "${_filename}.h264" --aac-is-sbr 0 "${_filename}.aac"
+  fi
+done
+
+# Delete all temporary files
+echo "Cleaning temporary files"
+find . -type f ! -iname '*.mkv' -delete
+
+# Go back to original dir
+cd "${TOP_DIR}"
+

+ 11 - 0
crc32.pl

@@ -0,0 +1,11 @@
+use strict;
+use warnings;
+use Digest::CRC;
+
+my $ctx = Digest::CRC->new( type => 'crc32' );
+
+open my $fh, '<:raw', $ARGV[0] or die $!;
+$ctx->addfile(*$fh);
+close $fh;
+
+print uc $ctx->hexdigest, "\n";

+ 0 - 0
downloads/.keep