655efed730701574145e57263c6c870bc32f2156
[webservice-strike.git] / lib / WebService / Strike / Torrent.pm
1 package WebService::Strike::Torrent;
2
3 use 5.014000;
4 use strict;
5 use warnings;
6 use parent qw/Class::Accessor::Fast/;
7
8 our $VERSION = '0.003';
9
10 use Date::Parse qw/str2time/;
11 use JSON::MaybeXS qw/decode_json/;
12 use MIME::Base64;
13 use WebService::Strike;
14
15 __PACKAGE__->mk_ro_accessors(qw/torrent_hash torrent_title torrent_category sub_category seeds leeches file_count size upload_date uploader_username file_info file_names file_lengths magnet_uri imdb_id/);
16
17 BEGIN {
18 *hash = *torrent_hash;
19 *title = *torrent_title;
20 *category = *torrent_category;
21 *count = *file_count;
22 *date = *upload_date;
23 *uploader = *uploader_username;
24 *names = *file_names;
25 *lengths = *file_lengths;
26 *magnet = *magnet_uri;
27 };
28
29 sub new{
30 my ($self, @args) = @_;
31 $self = $self->SUPER::new(@args);
32 $self->{torrent_hash} = uc $self->hash;
33 $self->{upload_date} = str2time $self->date, 'UTC';
34 if ($self->file_info) {
35 $self->{file_names} = $self->file_info->{file_names};
36 $self->{file_lengths} = $self->file_info->{file_lengths};
37 }
38 $self
39 }
40
41 sub torrent{
42 my ($self, $file) = @_;
43 my $url = $WebService::Strike::BASE_URL . '/torrents/download/?hash=' . $self->hash;
44 my $ht = WebService::Strike::_ht(); ## no critic (ProtectPrivate)
45 my $response = $ht->get($url);
46 return unless $response->{success};
47 $response = decode_json $response->{content};
48 $url = $response->{message};
49
50 if (defined $file) {
51 $response = $ht->mirror($url, $file);
52 return $response->{success}
53 } else {
54 $response = $ht->get($url);
55 return $response->{success} && $response->{content}
56 }
57 }
58
59 sub description{
60 my ($self) = @_;
61 return $self->{description} if $self->{description};
62 my $url = $WebService::Strike::BASE_URL . '/torrents/descriptions/?hash=' . $self->hash;
63 my $ht = WebService::Strike::_ht(); ## no critic (ProtectPrivate)
64 my $response = $ht->get($url);
65 return unless $response->{success};
66 $self->{description} = decode_base64 $response->{content}
67 }
68
69 sub imdb {
70 my ($self) = @_;
71 return unless $self->imdb_id;
72 $self->{imdb} //= WebService::Strike::strike_imdb ($self->imdb_id)
73 }
74
75 1;
76 __END__
77
78 =encoding utf-8
79
80 =head1 NAME
81
82 WebService::Strike::Torrent - Class representing information about a torrent
83
84 =head1 SYNOPSIS
85
86 use WebService::Strike;
87 my $t = strike 'B425907E5755031BDA4A8D1B6DCCACA97DA14C04';
88 say $t->hash; # B425907E5755031BDA4A8D1B6DCCACA97DA14C04
89 say $t->title; # Arch Linux 2015.01.01 (x86/x64)
90 say $t->category; # Applications
91 say $t->sub_category; # '' (empty string)
92 say $t->seeds;
93 say $t->leeches;
94 say $t->count; # 1
95 say $t->size; # 615514112
96 say $t->date; # 1420502400
97 say $t->uploader; # The_Doctor-
98 say @{$t->names}; # archlinux-2015.01.01-dual.iso
99 say @{$t->lengths}; # 615514112
100 say $t->magnet; # magnet:?xt=urn:btih:B425907E5755031BDA4A8D1B6DCCACA97DA14C04&dn=Arch%20Linux%202015.01.01%20%28x86%2Fx64%29
101 my $tor = $t->torrent; # $torrent contains the torrent file contents
102 $t->torrent('x.torrent'); # Download torrent file to x.torrent
103 say $t->description; # <HTML fragment describing Arch Linux>
104
105 $t = strike 'ED70C185E3E3246F30B2FDB08D504EABED5EEA3F';
106 say $t->title; # The Walking Dead S04E15 HDTV x264-2HD
107 say $t->imdb_id; # tt1520211
108 my $i = $t->imdb;
109 say $i->{title}, ' (', $i->{year}, ')'; # The Walking Dead (2010)
110 say $i->{genre}; # Drama, Horror, Thriller
111
112 =head1 DESCRIPTION
113
114 WebService::Strike::Torrent is a class that represents information
115 about a torrent.
116
117 Methods:
118
119 =over
120
121 =item B<hash>, B<torrent_hash>
122
123 The info_hash of the torrent.
124
125 =item B<title>, B<torrent_title>
126
127 The title of the torrent.
128
129 =item B<category>, B<torrent_category>
130
131 The category of the torrent.
132
133 =item B<sub_category>
134
135 The subcategory of the torrent.
136
137 =item B<seeds>
138
139 The number of seeders.
140
141 =item B<leeches>
142
143 The number of leechers.
144
145 =item B<count>, B<file_count>
146
147 The number of files contained in the torrent.
148
149 =item B<size>
150
151 The total size of the files in the torrent in bytes.
152
153 =item B<date>, B<upload_date>
154
155 Unix timestamp when the torrent was uploaded, with precision of one day.
156
157 =item B<uploader>, B<uploader_username>
158
159 Username of the user who uploaded the torrent.
160
161 =item B<file_names>
162
163 Arrayref of paths of files in the torrent.
164
165 =item B<file_lengths>
166
167 Arrayref of lengths of files in the torrent, in bytes.
168
169 =item B<magnet>, B<magnet_uri>
170
171 Magnet link for the torrent.
172
173 =item B<torrent>([I<$filename>])
174
175 Downloads the torrent from Strike. With no arguments, returns the
176 contents of the torrent file. With an argument, stores the torrent in
177 I<$filename>.
178
179 Both forms return a true value for success and false for failure.
180
181 =item B<description>
182
183 The description of the torrent. This method sends an extra request to
184 Strike. Successful responses are cached.
185
186 =item B<imdb_id>
187
188 The IMDB ID of the torrent, or undef if the torrent has no associated
189 IMDB ID.
190
191 =item B<imdb>
192
193 Calls B<strike_imdb> from L<WebService::Strike> on B<imdb_id>. Caches
194 the response. Returns undef if the torrent has no associated IMDB ID.
195
196 =back
197
198 =head1 SEE ALSO
199
200 L<WebService::Strike>, L<https://getstrike.net/api/>
201
202 =head1 AUTHOR
203
204 Marius Gavrilescu, E<lt>marius@ieval.roE<gt>
205
206 =head1 COPYRIGHT AND LICENSE
207
208 Copyright (C) 2015 by Marius Gavrilescu
209
210 This library is free software; you can redistribute it and/or modify
211 it under the same terms as Perl itself, either Perl version 5.20.2 or,
212 at your option, any later version of Perl 5 you may have available.
213
214
215 =cut
This page took 0.029397 seconds and 3 git commands to generate.