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