test login return from create_user
[cloudstore.git] / torrent / rtorrent_fast_resume.pl
1 #!/usr/bin/perl
2
3 # Perl script to add rTorrent fast resume data to torrent files.
4 #
5 # Usage:
6 # rtorrent_fast_resume.pl [base-directory] < plain.torrent > with_fast_resume.torrent
7
8 use warnings;
9 use strict;
10
11 use Convert::Bencode qw(bencode bdecode);
12
13 $/=undef;
14 my $t = bdecode(scalar <STDIN>);
15
16 my $d = $ARGV[0];
17 die "$d is not a directory\n" if $d and not -d $d;
18 $d ||= ".";
19 $d .= "/" unless $d =~ m#/$#;
20
21 die "No info key.\n" unless ref $t eq "HASH" and exists $t->{info};
22 my $psize = $t->{info}{"piece length"} or die "No piece length key.\n";
23
24 my @files;
25 my $tsize = 0;
26 if (exists $t->{info}{files}) {
27         print STDERR "Multi file torrent: $t->{info}{name}\n";
28         for (@{$t->{info}{files}}) {
29                 push @files, join "/", $t->{info}{name},@{$_->{path}};
30                 $tsize += $_->{length};
31         }
32 } else {
33         print STDERR "Single file torrent: $t->{info}{name}\n";
34         @files = ($t->{info}{name});
35         $tsize = $t->{info}{length};
36 }
37 my $chunks = int(($tsize + $psize - 1) / $psize);
38 print STDERR "Total size: $tsize bytes; $chunks chunks; ", scalar @files, " files.\n";
39
40 die "Inconsistent piece information!\n" if $chunks*20 != length $t->{info}{pieces};
41
42 $t->{libtorrent_resume}{bitfield} = $chunks;
43 for (0..$#files) {
44         die "$d$files[$_] not found.\n" unless -e "$d$files[$_]";
45         my $mtime = (stat "$d$files[$_]")[9];
46         $t->{libtorrent_resume}{files}[$_] = { priority => 2, mtime => $mtime };
47 };
48
49 print bencode $t;
50