the_pirate_bay 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +24 -2
- data/lib/the_pirate_bay.rb +1 -0
- data/lib/the_pirate_bay/client.rb +1 -0
- data/lib/the_pirate_bay/connection.rb +3 -0
- data/lib/the_pirate_bay/errors.rb +18 -0
- data/lib/the_pirate_bay/model.rb +7 -3
- data/lib/the_pirate_bay/response.rb +26 -0
- data/lib/the_pirate_bay/response/htmlize.rb +19 -0
- data/lib/the_pirate_bay/torrent.rb +9 -2
- data/lib/the_pirate_bay/torrent/collection.rb +64 -0
- data/lib/the_pirate_bay/version.rb +1 -1
- data/spec/the_pirate_bay/torrent_spec.rb +14 -4
- metadata +12 -8
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# ThePirateBay
|
1
|
+
# ThePirateBay [![Build Status](https://secure.travis-ci.org/jassa/the_pirate_bay.png?branch=master)](https://travis-ci.org/jassa/the_pirate_bay) [![Dependency Status](https://gemnasium.com/jassa/the_pirate_bay.png)](https://gemnasium.com/jassa/the_pirate_bay) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/jassa/the_pirate_bay)
|
2
2
|
|
3
3
|
Ruby Client for ThePirateBay.se
|
4
4
|
|
@@ -16,7 +16,29 @@ And then execute:
|
|
16
16
|
|
17
17
|
## Usage
|
18
18
|
|
19
|
-
|
19
|
+
```ruby
|
20
|
+
require "the_pirate_bay"
|
21
|
+
|
22
|
+
api = ThePirateBay.new
|
23
|
+
|
24
|
+
# You can search for a torrent by keyword
|
25
|
+
api.series.search("Fringe")
|
26
|
+
=> [#<ThePirateBay::Torrent::Collection id: "7810640", name: "Fringe S05E06 Season 5 Episode 6 HDTV x264 [GlowGaz...", seeders: "408", leechers: "116", magnet_uri: "magnet:?xt=urn:btih:0f4e3c1a4618b6d9658427e7778c602...", size: "303.89 MB", type: "Video > TV shows", uploaded_at: "Today 04:11, Size 303.89 MiB", comments_count: "2", uploader: "GlowGaze">]
|
27
|
+
|
28
|
+
# Once you have a torrent id, you can use it to find more information
|
29
|
+
torrent = api.torrents.find("7810640")
|
30
|
+
```
|
31
|
+
|
32
|
+
## Work in Progress
|
33
|
+
|
34
|
+
* Find torrents by id
|
35
|
+
* Handle users
|
36
|
+
* Sort results by relevance, seeders, leechers, size, date, user and type
|
37
|
+
* Get results from other pages
|
38
|
+
|
39
|
+
## Motivation
|
40
|
+
|
41
|
+
ThePirateBay.se is a very powerful engine, and it requires a powerful and specialized gem that can handle all it has to offer, seamlessly.
|
20
42
|
|
21
43
|
## Contributing
|
22
44
|
|
data/lib/the_pirate_bay.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require "faraday"
|
2
|
+
require "the_pirate_bay/response"
|
3
|
+
require "the_pirate_bay/response/htmlize"
|
2
4
|
|
3
5
|
module ThePirateBay
|
4
6
|
module Connection
|
@@ -10,6 +12,7 @@ module ThePirateBay
|
|
10
12
|
@connection ||= Faraday.new(:url => ThePirateBay::ENDPOINT) do |faraday|
|
11
13
|
faraday.response :logger if ENV['DEBUG'] # log requests to STDOUT
|
12
14
|
faraday.adapter :net_http # make requests with NetHTTP
|
15
|
+
faraday.use ThePirateBay::Response::Htmlize
|
13
16
|
end
|
14
17
|
end
|
15
18
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module ThePirateBay
|
2
|
+
|
3
|
+
# Generic ThePirateBay exception class.
|
4
|
+
class ThePirateBayError < StandardError
|
5
|
+
end
|
6
|
+
|
7
|
+
# Raised when a connection to the api can't be established.
|
8
|
+
class ConnectionNotEstablished < StandardError
|
9
|
+
end
|
10
|
+
|
11
|
+
# Raised when the record was not found given an id or set of ids.
|
12
|
+
class RecordNotFound < StandardError
|
13
|
+
end
|
14
|
+
|
15
|
+
# Raised when unknown attributes are supplied via mass assignment.
|
16
|
+
class UnknownAttributeError < NoMethodError
|
17
|
+
end
|
18
|
+
end
|
data/lib/the_pirate_bay/model.rb
CHANGED
@@ -11,7 +11,7 @@ module ThePirateBay
|
|
11
11
|
def attributes=(params=nil)
|
12
12
|
params.each do |attr, value|
|
13
13
|
begin
|
14
|
-
self.public_send("#{
|
14
|
+
self.public_send("#{attr}=", value)
|
15
15
|
rescue NoMethodError
|
16
16
|
raise UnknownAttributeError, "unknown attribute: #{attr}"
|
17
17
|
end
|
@@ -20,7 +20,7 @@ module ThePirateBay
|
|
20
20
|
|
21
21
|
def attributes
|
22
22
|
attrs = {}
|
23
|
-
|
23
|
+
class_attributes.each do |name|
|
24
24
|
attrs[name] = send(name)
|
25
25
|
end
|
26
26
|
attrs
|
@@ -28,7 +28,7 @@ module ThePirateBay
|
|
28
28
|
|
29
29
|
def inspect
|
30
30
|
inspection = unless id.nil?
|
31
|
-
|
31
|
+
class_attributes.collect { |name|
|
32
32
|
"#{name}: #{attribute_for_inspect(name)}"
|
33
33
|
}.compact.join(", ")
|
34
34
|
else
|
@@ -49,5 +49,9 @@ module ThePirateBay
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
def class_attributes
|
53
|
+
klass::ATTRS
|
54
|
+
end
|
55
|
+
|
52
56
|
end # Model
|
53
57
|
end # ThePirateBay
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module ThePirateBay
|
4
|
+
# Contains methods and attributes that act on the response returned from the
|
5
|
+
# request
|
6
|
+
class Response < Faraday::Response::Middleware
|
7
|
+
CONTENT_TYPE = 'Content-Type'.freeze
|
8
|
+
|
9
|
+
class << self
|
10
|
+
attr_accessor :parser
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.define_parser(&block)
|
14
|
+
@parser = block
|
15
|
+
end
|
16
|
+
|
17
|
+
def response_type(env)
|
18
|
+
env[:response_headers][CONTENT_TYPE].to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
def parse_response?(env)
|
22
|
+
env[:body].respond_to? :to_str
|
23
|
+
end
|
24
|
+
|
25
|
+
end # Response
|
26
|
+
end # ThePirateBay
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ThePirateBay
|
2
|
+
class Response::Htmlize < Response
|
3
|
+
dependency 'nokogiri'
|
4
|
+
|
5
|
+
define_parser do |body|
|
6
|
+
::Nokogiri::HTML body
|
7
|
+
end
|
8
|
+
|
9
|
+
def parse(body)
|
10
|
+
case body
|
11
|
+
when String
|
12
|
+
self.class.parser.call body
|
13
|
+
else
|
14
|
+
body
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end # Response::Htmlize
|
19
|
+
end # ThePirateBay
|
@@ -9,7 +9,14 @@ module ThePirateBay
|
|
9
9
|
|
10
10
|
class << self
|
11
11
|
def search(query)
|
12
|
-
|
12
|
+
# Returns search html
|
13
|
+
doc = request("search/#{query}/0/99/0")
|
14
|
+
|
15
|
+
# Get torrents table rows
|
16
|
+
# and return as ruby objects
|
17
|
+
doc.xpath("//table[@id='searchResult']/tr").collect do |torrent|
|
18
|
+
Torrent::Collection.new(torrent)
|
19
|
+
end
|
13
20
|
end
|
14
21
|
|
15
22
|
def find(id)
|
@@ -17,6 +24,6 @@ module ThePirateBay
|
|
17
24
|
end
|
18
25
|
alias :get :find
|
19
26
|
end
|
20
|
-
|
27
|
+
|
21
28
|
end # Torrent
|
22
29
|
end # ThePirateBay
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module ThePirateBay
|
2
|
+
class Torrent::Collection
|
3
|
+
include Model
|
4
|
+
|
5
|
+
ATTRS = [:id, :name, :seeders, :leechers, :magnet_uri,
|
6
|
+
:size, :type, :uploaded_at, :comments_count, :uploader].freeze
|
7
|
+
|
8
|
+
attr_accessor *ATTRS, :torrent
|
9
|
+
|
10
|
+
def initialize(torrent)
|
11
|
+
@torrent = torrent
|
12
|
+
class_attributes.collect do |attr|
|
13
|
+
self.public_send("#{attr}=", send(attr))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def class_attributes
|
18
|
+
ATTRS
|
19
|
+
end
|
20
|
+
|
21
|
+
def id
|
22
|
+
torrent.css('td[2] div.detName').inner_html.match(/\/torrent\/(\d+)\//)[1]
|
23
|
+
end
|
24
|
+
|
25
|
+
def name
|
26
|
+
torrent.css('td[2] div.detName a').text
|
27
|
+
end
|
28
|
+
|
29
|
+
def type
|
30
|
+
torrent.css('td[1] a').map(&:text).join(" > ")
|
31
|
+
end
|
32
|
+
|
33
|
+
def size
|
34
|
+
torrent.css('td[2] font.detDesc').text.match(/Size (.*),/)[1].gsub('i', '')
|
35
|
+
end
|
36
|
+
|
37
|
+
def seeders
|
38
|
+
torrent.css('td[3]').text
|
39
|
+
end
|
40
|
+
|
41
|
+
def leechers
|
42
|
+
torrent.css('td[4]').text
|
43
|
+
end
|
44
|
+
|
45
|
+
def uploader
|
46
|
+
torrent.css('td[2] font.detDesc a').text
|
47
|
+
end
|
48
|
+
|
49
|
+
def magnet_uri
|
50
|
+
torrent.css('td[2] div.detName + a').attribute("href").value
|
51
|
+
end
|
52
|
+
|
53
|
+
def comments_count
|
54
|
+
unless (comments = torrent.css('td[2] img[@src*="comment.gif"]')).empty?
|
55
|
+
comments.attribute("alt").value.match(/\d+/)[0]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def uploaded_at
|
60
|
+
torrent.css('td[2] font.detDesc').text.match(/Uploaded (.*),/)[1]
|
61
|
+
end
|
62
|
+
|
63
|
+
end # Torrent::Collection
|
64
|
+
end # ThePirateBay
|
@@ -3,14 +3,24 @@ require "spec_helper"
|
|
3
3
|
describe ThePirateBay::Torrent do
|
4
4
|
let(:api) { ThePirateBay.new }
|
5
5
|
|
6
|
-
context ".search" do
|
7
|
-
|
8
|
-
|
6
|
+
context ".search", focus: true do
|
7
|
+
let(:torrents) { api.torrents.search("Fringe") }
|
8
|
+
|
9
|
+
it "returns torrents results" do
|
10
|
+
torrents.class.should == Array
|
11
|
+
end
|
12
|
+
|
13
|
+
it "instantiates torrents collection objects" do
|
14
|
+
torrents.first.class.should == ThePirateBay::Torrent::Collection
|
15
|
+
end
|
16
|
+
|
17
|
+
it "assigns torrents attributes" do
|
18
|
+
torrents.first.id.should == "7811310"
|
9
19
|
end
|
10
20
|
end
|
11
21
|
|
12
22
|
context ".find" do
|
13
|
-
it "returns a particular torrent
|
23
|
+
it "returns a particular torrent" do
|
14
24
|
api.torrents.find("7723168").should include("Fringe S05E03 HDTV")
|
15
25
|
end
|
16
26
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: the_pirate_bay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
16
|
-
requirement: &
|
16
|
+
requirement: &70181583441780 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.8.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70181583441780
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &70181583469940 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.5.5
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70181583469940
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &70181583469480 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: 2.11.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70181583469480
|
47
47
|
description: Ruby Client for ThePirateBay.se
|
48
48
|
email:
|
49
49
|
- javier@tractical.com
|
@@ -62,8 +62,12 @@ files:
|
|
62
62
|
- lib/the_pirate_bay/api.rb
|
63
63
|
- lib/the_pirate_bay/client.rb
|
64
64
|
- lib/the_pirate_bay/connection.rb
|
65
|
+
- lib/the_pirate_bay/errors.rb
|
65
66
|
- lib/the_pirate_bay/model.rb
|
67
|
+
- lib/the_pirate_bay/response.rb
|
68
|
+
- lib/the_pirate_bay/response/htmlize.rb
|
66
69
|
- lib/the_pirate_bay/torrent.rb
|
70
|
+
- lib/the_pirate_bay/torrent/collection.rb
|
67
71
|
- lib/the_pirate_bay/version.rb
|
68
72
|
- spec/spec_helper.rb
|
69
73
|
- spec/the_pirate_bay/torrent_spec.rb
|