LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1255|回复: 4

[分享]下载优酷视频的perl脚本

[复制链接]
发表于 2011-8-27 13:28:52 | 显示全部楼层 |阅读模式
喜欢在优酷上下视频到mp4上看,自己写了个下载的脚本。
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Digest::MD5 qw/md5_hex/;
  5. qx/
  6.         if [[ ! -d \/tmp\/youku ]]; then
  7.                 mkdir \/tmp\/youku;
  8.         else
  9.                 rm \/tmp\/youku\/*;
  10.         fi
  11. /;
  12. foreach (@ARGV) {
  13.         /id_(.+)\.html/;
  14.         my $time = time();
  15.         my $auth = md5_hex((time().' XOA== MWZlNWE4Y2Q4OWQ0NjEyMWJjZTJmMWNiYTVhNzQwZGM='));
  16.         my $url = "http://api.youku.com/api_rest?method=video.getvideofile&pid=XOA==&ctime=$time&auth=$auth&videoid=$1";
  17.         qx/wget -O \/tmp\/youku\/api_rest -U Xeslaro '$url'/;
  18.         open(my $in, "<", "/tmp/youku/api_rest");
  19.         my @file = <$in>, my $name, my $cnt=0, my $ans=0, my $piece, my $min;
  20.         foreach (@file) {
  21.                 if (/CDATA\[(.+)\]\]/) {
  22.                         $name = $1;
  23.                 }
  24.                 elsif (/^<seg id="(\d+)"/) {
  25.                         $piece = $1;
  26.                 }
  27.                 elsif (/^<\/stream>/) {
  28.                         if (!$cnt) {
  29.                                 $min = $piece;
  30.                         }
  31.                         elsif ($piece <= $min) {
  32.                                 $min = $piece, $ans = $cnt;
  33.                         }
  34.                         $cnt++;
  35.                 }
  36.         }
  37.         $cnt = 0;
  38.         foreach (@file) {
  39.                 if (/^<\/stream>/) {
  40.                         $cnt++;
  41.                 }
  42.                 elsif ($cnt==$ans && /url="(.+)"/) {
  43.                         qx/wget -P \/tmp\/youku -U Xeslaro '$1'/;
  44.                 }
  45.         }
  46.         @file = qx/ls -l \/tmp\/youku\/*.*/;
  47.         chomp($file[0]);
  48.         $file[0] =~ /\.(.+)$/;
  49.         if (@file > 1) {
  50.                 qx/mencoder \/tmp\/youku\/*.* -oac mp3lame -ovc copy -of lavf -lavfopts format=$1 -o '$name'.$1/;
  51.         }
  52.         else {
  53.                 qx/mv \/tmp\/youku\/*.* '$name'.$1/;
  54.         }
  55.         qx/rm \/tmp\/youku\/*/;
  56. }
复制代码
发表于 2011-8-28 07:37:10 | 显示全部楼层
感谢分享。
字数补丁。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-28 14:14:46 | 显示全部楼层
这段代码有问题……删掉了。
回复 支持 反对

使用道具 举报

发表于 2011-8-28 21:20:04 | 显示全部楼层
可以看到下载视频的过程,但是
ls: 无法访问/tmp/youku1314537690/*.*: 没有那个文件或目录
Use of uninitialized value $file[0] in scalar chomp at d2.pl line 58, <$in> line 15.
Use of uninitialized value $file[0] in pattern match (m//) at d2.pl line 59, <$in> line 15.
mv: 无法获取"/tmp/youku1314537690/*.*" 的文件状态(stat): 没有那个文件或目录ls: 无法访问/tmp/youku1314537690/*.*: 没有那个文件或目录
Use of uninitialized value $file[0] in scalar chomp at d2.pl line 58, <$in> line 15.
Use of uninitialized value $file[0] in pattern match (m//) at d2.pl line 59, <$in> line 15.
mv: 无法获取"/tmp/youku1314537690/*.*" 的文件状态(stat): 没有那个文件或目录
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-29 22:39:59 | 显示全部楼层
ls不好意思,三楼的代码有些问题。一楼的应该能正常用。我改进了下,你看现在这个能用不?
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Digest::MD5 qw/md5_hex/;
  4. sub download {
  5.         my ($id, $ans, $file, $dir) = @_, my $cnt = 0;
  6.         for (my $i = 0; defined ($_ = $file->[$i]); $i++) {
  7.                 if (/^<\/stream>/) {
  8.                         $cnt++;
  9.                 }
  10.                 elsif ($cnt == $ans && /url="(.+)"/) {
  11.                         next if fork();
  12.                         while (1) {
  13.                                 qx/wget -P $dir -U Xeslaro -t 3 '$1'/;
  14.                                 exit unless $?;
  15.                                 @$file = api_rest($id);
  16.                                 $file->[$i] =~ /url="(.+)"/;
  17.                         }
  18.                 }
  19.         }
  20.         while (wait() != -1) {
  21.         }
  22. }
  23. sub api_rest {
  24.         $_ = shift;
  25.         /id_(.+)\.html/;
  26.         while (1) {
  27.                 my $time = time();
  28.                 my $auth = md5_hex((time().' XOA== MWZlNWE4Y2Q4OWQ0NjEyMWJjZTJmMWNiYTVhNzQwZGM='));
  29.                 my $url = "http://api.youku.com/api_rest?method=video.getvideofile&pid=XOA==&ctime=$time&auth=$auth&videoid=$1";
  30.                 my @file = qx/wget -U Xeslaro -O - -t 1 '$url'/;
  31.                 return @file if (!$? && grep(/<\/stream>/, @file) >= 1);
  32.         }
  33. }
  34. foreach (@ARGV) {
  35.         my $dir = "/tmp/youku".time();
  36.         qx{
  37.                 if [[ ! -d $dir ]]; then
  38.                         mkdir $dir
  39.                 else
  40.                         rm -r $dir
  41.                 fi
  42.         };
  43.         my @file = api_rest($_), my $name, my $cnt=0, my $ans=0, my $min;
  44.         my %rank = (
  45.                 hd2 => 0,
  46.                 mp4 => 1,
  47.                 flv => 2,
  48.                 flvhd => 3,
  49.                 '3gphd' => 4,
  50.                 '3gp' => 5,
  51.         );
  52.         foreach (@file) {
  53.                 if (/CDATA\[(.+)\]\]/) {
  54.                         $name = $1;
  55.                 }
  56.                 elsif (/type="(.+)">/) {
  57.                         if (!$cnt) {
  58.                                 $min = $rank{$1};
  59.                         }
  60.                         elsif ($rank{$1} < $min) {
  61.                                 $ans = $cnt;
  62.                         }
  63.                         $cnt++;
  64.                 }
  65.         }
  66.         if (fork()) {
  67.                 print "downloading $name begins...\n";
  68.                 next;
  69.         }
  70.         download($_, $ans, \@file, $dir);
  71.         @file = qx/ls -l $dir\/*.*/;
  72.         $file[0] =~ /\.(.+)$/;
  73.         if (@file > 1) {
  74.                 qx/mencoder $dir\/*.* -oac mp3lame -ovc copy -of lavf -lavfopts format=$1 -o '$name'.$1/;
  75.         }
  76.         else {
  77.                 qx/mv $dir\/*.* '$name'.$1/;
  78.         }
  79.         qx/rm -r $dir/;
  80.         print "$name downloaded...\n";
  81.         exit;
  82. } continue {
  83.         sleep 1;
  84. }
  85. while (wait() != -1) {
  86. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表