読者です 読者をやめる 読者になる 読者になる

人生送りバント。

yuki540の人生送りバント。

RubyでAnitubeのダウンロードスクリプトを書く

最近のハマってるお菓子は?

いきなりタイトルの話題とズレますが、私は無類のお菓子好きなため、一つに絞るのが難しいのですが最近ハマっているのは、プリッツ(サラダ)です。

今日もコンビニで2個買って帰りました。

本当はチョコ類が好きなのですが、季節的に溶けやすくなってきたので敬遠気味です。

みなさんの好きなお菓子は何でしょう?

Anitubeをダウンロードする

今まで、anitubeから動画をダウンロードするとき、Chromeデベロッパーツールを開いて、動画をリンクを見つけて、wgetでダウンロードしていたんですが、めんどくさくなったのでスクリプトを書くことにしました。

f:id:yuki540com:20170519215704p:plain

なぜRuby? CoffeeScriptは?

まあ、特に理由はないんですがRubyで書きました。

普段ならCoffeeScriptを使うんですが、気分転換にRubyを使いました。

APIを探せ!

というわけで、作業に取り掛かりましょう。

動画をダウンロードするには動画の直リンクを探さないといけません。

直リンクを探すには、APIを探さないといけません。

探しました。これです。↓

http://www.anitube.se/player/config.php?key={ 動画キー(?) }

動画ページに上記のリンクが入ったscriptタグが埋め込まれています。

curlでリンクにアクセスしてみるとわかるのですが、jwplayerを使ったJavaScriptファイルが返ってきます。

f:id:yuki540com:20170519222624p:plain

その中に…

f:id:yuki540com:20170519222957p:plain

ありますね。動画の直リンク。

ここまで分かれば、あとはコードに落とし込むだけなので簡単ですね。

スクリプトを書く

さあ、コードを書きましょう。

require 'open-uri'

httpリクエストをするので、open-uriをrequireします。

まず、はじめは動画キーとタイトルを取得しましょう。

##
# 動画キー・タイトルの取得
# @param url : 動画URL
# @return { key, title }
##
def get_info(url)
    res    = open url
    status = res.status[0].to_i

    if status == 200
        data = res.read.gsub /(\t|\n)/, ''

        # key
        mat  = data.match /http:\/\/www.anitube.se\/player\/config.php\?key=(.*?)\"/
        key  =  mat[1]

        # title
        data  = data.gsub /\s/, '_'
        mat   = data.match /<title>(.*)<\/title>/
        title = mat[1].sub /_-_AniTube!_Animes_Online/, ''

        return { "key" => key, "title" => title }
    else
        return false
    end
end

まあ、これで多少は大丈夫でしょう。

次は、本命の動画リンクの取得です。

##
# 動画リンクの取得
# @param key : 動画キー
# @return link
##
def get_link(key)
    url    = 'http://www.anitube.se/player/config.php?key=' + key
    res    = open url
    status = res.status[0].to_i

    if status == 200
        files = []
        data  = res.read.gsub /(\t|\n|\s)/, ''
        mat   = data.match /sources:(\[.*?\])/
        mat   = mat[1].scan /file:\"(.*?)\"/
        
        mat.each do |file|
            files.push file[0]
        end
        return files
    else
        return false
    end
end

こちらもさっきと同じように正規表現でマッチさせているだけです。

で、あとはファイルに書き出せば終わり!超簡単!

##
# ファイルの書き込み
# @param title : 動画タイトル
# @param link  : 動画リンク
# @return bool
##
def write(title, link)
    res    = open link
    status = res.status[0].to_i

    if status == 200
        data = res.read
        File.open(title + ".mp4", "w") do |f|
            f.puts data
        end
        return true
    else
        return false
    end
end

GitHubにあげてるよ

今回書いたコードは、GitHubにあげといたのでよかったらみてください。

使い方は、下記の通りです。

ruby anitube.rb 動画URL