Advertisement
Guest User

Untitled

a guest
Jul 2nd, 2014
1,020
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 4.30 KB | None | 0 0
  1. #!/usr/bin/env perl
  2. #
  3. #  pixiv.pl
  4. #  Pixiv Animation Downloader
  5. #
  6. #  Created by Cure Gecko on 6/29/14.
  7. #  Copyright (c) 2014 Cure Gecko. All rights reserved.
  8. #
  9.  
  10. use LWP::Useragent;
  11. use JSON::Parse 'parse_json';
  12. use Archive::Extract;
  13. use File::Glob ();
  14. use Image::Magick;
  15.  
  16. use Data::Dumper;
  17.  
  18. print "Please enter Pixiv IllustID: ";
  19. my $pixivID = <stdin>;
  20. chomp($pixivID);
  21. my $pixivURL = "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=".$pixivID;
  22.  
  23. my $ua = LWP::UserAgent->new;
  24. my $response = $ua->get($pixivURL);
  25. if (!$response->is_success) {
  26.     print "Error getting response from pixiv.\n";
  27.     exit();
  28. }
  29.  
  30. my $pixivDataJSON = "";
  31. if ($response->content =~ /pixiv\.context\..*IllustData\s*=\s*([^;]*);/i) {
  32.     $pixivDataJSON = $1;
  33. }
  34. my $pixivData = parse_json($pixivDataJSON);
  35.  
  36. my $smallZIP = $pixivData->{'src'};
  37. my $bigZIP = $smallZIP;
  38. $bigZIP =~ s/600x600/1920x1080/i;
  39.  
  40. my $mime = $pixivData->{'mime_type'};
  41. my $ext = "jpg";
  42. if ($mime eq "image/png") {
  43.     $ext = "png";
  44. }
  45.  
  46. my $ms = $pixivData->{'frames'}->[0]->{'delay'};
  47. my $fps = 1/($ms/1000);
  48.  
  49. my $constant = 1;
  50. my $minMS = 0;
  51.  
  52. foreach (@{$pixivData->{'frames'}}) {
  53.     my $frame = $_;
  54.     print Dumper($frame);
  55.     $minMS = ($maxMS>$frame->{'delay'} ? $frame->{'delay'} : $maxMS);
  56.     if ($frame->{'delay'}!=$ms) {
  57.         $constant = 0;
  58.     }
  59. }
  60.  
  61. print "Pixiv Small: ".$smallZIP."\n";
  62. print "Pixiv Big: ".$bigZIP."\n";
  63. print "Mime: ".$mime."\n";
  64. print "Extension: ".$ext."\n";
  65. print "MS: ".$ms."\n";
  66. print "FPS: ".$fps."\n";
  67. print "Constant: ".$constant."\n";
  68.  
  69. my $size = $smallZIP;
  70. print "Do you want the large size? [N/y]: ";
  71. my $largeSize = <stdin>;
  72. if ($largeSize =~ /y|t/i) {
  73.     $size = $bigZIP;
  74. }
  75.  
  76. my $filename = $pixivID.".zip";
  77. unless (-e $filename) {
  78.     my $ua = LWP::UserAgent->new;
  79.     my $req = HTTP::Request->new("GET" => $size);
  80.     $req->header("Referer" => $pixivURL);
  81.     $req->header("User-Agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:31.0) Gecko/20100101 Firefox/31.0 AlexaToolbar/alxf-2.19");
  82.     my $response = $ua->request($req, $pixivID.".zip");
  83. }
  84.  
  85. my $ae = Archive::Extract->new("archive" => $pixivID.".zip");
  86. my $ok = $ae->extract("to" => $pixivID);
  87. unless ($ok) {
  88.     print "Failed to extract zip";
  89.     exit();
  90. }
  91. chdir($pixivID);
  92.  
  93. my $image = Image::Magick->new;
  94. $image->Read("000000.".$ext);
  95. my $width = $image->Get("width");
  96. if (($width % 2)==1) {
  97.     $width++;
  98. }
  99. my $height = $image->Get("height");
  100. if (($height % 2)==1) {
  101.     $height++;
  102. }
  103.  
  104. print "What would you like to convert to? Use comma for multiple formats. [mkv|gif|webm|png]: ";
  105. my $codec = <stdin>;
  106. chomp($codec);
  107. @codecs = split(",", $codec);
  108. foreach (@codecs) {
  109.     $_ =~ s/^\s+|\s+$//g;#Incase of space
  110.     $codec = $_;
  111.     unless ($codec eq "mkv" || $codec eq "gif" || $codec eq "webm" || $codec eq "png") {
  112.         print "Invalid Codec: ".$codec."\n";
  113.         continue;
  114.     }
  115.    
  116.     if ($codec eq "mkv" || $codec eq "webm") {
  117.         if (!$constant) {
  118.             my $time = 0;
  119.             open(tc, ">tmp.tc") or die "$!";
  120.             print tc "# timecode format v2\n";
  121.             foreach (@{$pixivData->{'frames'}}) {
  122.                 my $frame = $_;
  123.                 print tc $time."\n";
  124.                 $time += $frame->{'delay'};
  125.             }
  126.             close(tc);
  127.         }
  128.         my $vcodec = "libx264 -crf 22";
  129.         my $outExt = "mkv";
  130.         if ($codec eq "webm") {
  131.             $vcodec = "libvpx -crf 18 -b:v 1M";
  132.             $outExt = "webm";
  133.         }
  134.         system("ffmpeg -f image2 -i %06d.".$ext." -s ".$width."x".$height." -r ".$fps." -vcodec ".$vcodec." ".$pixivID.".".$outExt);
  135.         if (!$constant) {
  136.             system("../mkvmerge --output ".$pixivID."tc.".$outExt." --timecodes 0:tmp.tc ".$pixivID.".".$outExt);
  137.             unlink("tmp.tc");
  138.             unlink($pixivID.".".$outExt);
  139.             rename($pixivID."tc.".$outExt, $pixivID.".".$outExt);
  140.         }
  141.     } elsif ($codec eq "png") {
  142.         unless ($ext eq "png") {
  143.             @FILES = glob("*.".$ext);
  144.             foreach $file (@FILES) {
  145.                 $name = $file;
  146.                 $name =~ s/\..*//;
  147.                 system("convert ".$file." ".$name.".png");
  148.             }
  149.         }
  150.         system("../apngasm ".$pixivID.".png *.png 1 $fps");
  151.     } else {
  152.         if (!$constant) {
  153.             my $image = Image::Magick->new();
  154.             foreach (@{$pixivData->{'frames'}}) {
  155.                 my $frame = $_;
  156.                 $image->Read("filename" => $frame->{'file'}, "delay" => $frame->{'delay'}/10);
  157.             }
  158.             $image->Write("filename" => $pixivID.".gif");
  159.         } else {
  160.             system("convert -delay 1x".$fps." *.".$ext." -coalesce -layers OptimizeTransparency ".$pixivID.".gif");
  161.         }
  162.     }
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement