Skip to content

Instantly share code, notes, and snippets.

@nicocache
Last active July 19, 2017 18:10
Show Gist options
  • Save nicocache/632f2c5303371555e9fb1c47b42fbe28 to your computer and use it in GitHub Desktop.
Save nicocache/632f2c5303371555e9fb1c47b42fbe28 to your computer and use it in GitHub Desktop.
ニコニコ動画で配信されているアニメをダウンロードする

about

フォークして自分流にカスタムしました。
最新版はこちら

変更点

  1. フォルダ分け
  2. 名前を動画IDに。
  3. 全部ダウンロード。
  4. フォルダ指定
  5. ID・パスワードは.netrcから取ってくる(nicovideo-dl互換)。
  6. ダウンロード失敗を考慮。

ToDo

  1. "動画id.タイトル.拡張子"って名前にしたい(気が向いたら)。
  2. チャンネル一覧を外部ファイルに置く。
  3. 管理・閲覧用ウェブサーバー。nicoidとかと連携できるAndroidアプリ(面倒)。

感想

  • perlはよく使うけど、いい加減に使ってたから他人のコードは読みにくい。
  • ついうっかりID・パスを公開しそうになる。 修正。

legal notice

  • 著作権等には十分配慮を。
  • このgistはいつ削除してもおかしくありません。具体的には2018年3月までに削除する可能性が濃厚です。

Windowsユーザーへ

Windowsの場合は、

use Net::Netrc;

my $mach = Net::Netrc->lookup('nicovideo');
my ($nicologin, $nicopassword, $nicoaccount) = $mach->lpa;

my $client = WWW::NicoVideo::Download->new(
    email => $nicologin,
    password => $nicopassword,
);

これを

my $client = WWW::NicoVideo::Download->new(
    email => '',
    password => '',
);

とかに置き換え。

use strict;
use warnings;
use File::Basename;
use File::Spec;
use LWP::UserAgent;
use URI;
use WWW::NicoVideo::Download;
use Web::Scraper;
use XML::Simple;
use Net::Netrc;
my $mach = Net::Netrc->lookup('nicovideo');
my ($nicologin, $nicopassword, $nicoaccount) = $mach->lpa;
my $client = WWW::NicoVideo::Download->new(
email => $nicologin,
password => $nicopassword,
);
my @url = (
"http://ch.nicovideo.jp/dummy",
);
my $animedir="";
#my $animedir=dirname(__FILE__)
my $ua = LWP::UserAgent->new();
for my $url (@url) {
my $video = scraper {
process '.g-video-title .g-video-link', 'title' => 'TEXT', 'url[]' => '@href';
}->scrape(URI->new($url));
my $count=0;
foreach my $surl (@{$video->{url}}){
my ($video_id) = $surl =~ m!/watch/(\w+)!;
my $res = $ua->get("http://ext.nicovideo.jp/api/getthumbinfo/$video_id");
my $ext = XMLin($res->content)->{thumb}{movie_type};
my ($chid) = $url =~ m!/([^/]+?)$!;
my $chdir=File::Spec->catfile($animedir , $chid );
if(! -d $chdir){mkdir $chdir;}
my $file = File::Spec->catfile($chdir , "$video_id.$ext");
my $filetmp = File::Spec->catfile($chdir , "tmp.$ext");
unlink $filetmp if -e $filetmp;
$count++;
next if -e $file;
warn "download $file\n";
open my $fh, '>', $filetmp or die $!;
eval {
$client->download($video_id, sub {
my ($data, $res, $proto) = @_;
print {$fh} $data;
});
rename $filetmp,$file;
};
if ($@) {
warn "ERROR: $@\n";
unlink $filetmp;
next;
}
sleep 5;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment