torrent_api 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -4,4 +4,5 @@
4
4
  v0.0.9 Migrated from tpb to torrent_api (now includes torrent_reactor and demonoid as searches)
5
5
  v0.1.0 Fixed Demonoid. Stable performance on :all and :demonoid.
6
6
  v0.1.1 Fixed Demonoid torrent links to be absolute, not relative.
7
- v0.1.2 Fixed PirateBay filesizes to be in bytes.
7
+ v0.1.2 Fixed PirateBay filesizes to be in bytes.
8
+ v0.2.0 Added some PirateBay analysis methods for comments and their video/audio ratings. Specs begin.
data/Manifest CHANGED
@@ -7,9 +7,11 @@ lib/demonoid/result.rb
7
7
  lib/demonoid/result_set.rb
8
8
  lib/pirate_bay/base.rb
9
9
  lib/pirate_bay/categories.rb
10
+ lib/pirate_bay/details.rb
10
11
  lib/pirate_bay/result.rb
11
12
  lib/pirate_bay/result_set.rb
12
13
  lib/torrent_api.rb
13
14
  lib/torrent_reactor/base.rb
14
15
  lib/torrent_reactor/result.rb
15
16
  lib/torrent_reactor/result_set.rb
17
+ torrent_api.gemspec
data/Rakefile CHANGED
@@ -1,10 +1,10 @@
1
1
  require 'echoe'
2
- Echoe.new('torrent_api', '0.1.2') do |p|
2
+ Echoe.new('torrent_api', '0.2.0') do |p|
3
3
  p.description = "An API to query popular torrent websites"
4
4
  p.url = "http://www.github.com/hjhart/torrent_api"
5
5
  p.author = "James Hart"
6
6
  p.email = "hjhart@gmail.com"
7
- p.ignore_pattern = ["tmp/**/*", "scripts/*"]
7
+ p.ignore_pattern = ["tmp/**/*", "scripts/*", "spec/**/*", "Gemfile*"]
8
8
  p.development_dependencies = ['nokogiri', 'hpricot']
9
9
  end
10
10
 
@@ -39,6 +39,29 @@ module PirateBay
39
39
  def cached_filename
40
40
  File.join("tmp", "searches", "#{search_string}_#{category_id}_#{page}.html")
41
41
  end
42
+
43
+ def get_quality
44
+ execute
45
+ results = @results.map do |result|
46
+ url = "http://www.thepiratebay.org/torrent/#{result.id}/"
47
+ html = open(url).read
48
+ p = PirateBay::Details.new html, :init
49
+ puts "Fetching results"
50
+ result = {
51
+ :seeds => result.seeds,
52
+ :size => result.size,
53
+ :name => result.name,
54
+ :video => p.video_quality_average,
55
+ :audio => p.audio_quality_average,
56
+ :url => url
57
+ }
58
+ puts "Results: #{result}"
59
+ result
60
+ end
61
+
62
+ results.reject { |a| a[:video].nan? }.sort_by { |a| a[:video] }
63
+ end
64
+
42
65
 
43
66
  def fetch_search_results
44
67
  url = "http://thepiratebay.org/search/#{search_string}/#{page}/7/#{category_id}" # highest seeded first
@@ -0,0 +1,98 @@
1
+ require 'rubygems'
2
+ require 'nokogiri'
3
+ module PirateBay
4
+ class Details
5
+ def to_s
6
+ "#<PirateBay::Details: @id=#{@id}>"
7
+ end
8
+
9
+ def initialize(html, type = :full)
10
+ @details_page_html = html
11
+ id_matches = html.match Regexp.new '<input type="hidden" name="id" value="(.*)"/>' rescue nil
12
+ @id = id_matches[1].to_i unless id_matches.nil?
13
+ @comment_pages_html = []
14
+ @scores = []
15
+ @type = type
16
+ end
17
+
18
+ def fetch_comments(params)
19
+ index = params[:page] - 1
20
+ if @comment_pages_html[index].nil?
21
+ uri = URI.parse('http://thepiratebay.org/ajax_details_comments.php')
22
+ res = Net::HTTP.post_form(uri, params)
23
+ response = res.body
24
+ @comment_pages_html[index] = response
25
+ end
26
+ @comment_pages_html[index]
27
+ end
28
+
29
+ def fetch_all_comments
30
+ comment_xhr_params.each do |params|
31
+ puts " fetching comments for #{params[:page]} of #{params[:pages]}"
32
+ fetch_comments params
33
+ end
34
+ end
35
+
36
+ def scores
37
+ if @type == :full
38
+ fetch_all_comments if @comment_pages_html.empty?
39
+ full_html = @comment_pages_html.inject("") { |html, memo| memo += html }
40
+ document = Nokogiri::HTML(full_html)
41
+ else
42
+ document = Nokogiri::HTML(@details_page_html)
43
+ end
44
+
45
+ scores = document.css('div.comment').map { |comment|
46
+ PirateBay::Details.search_for_ratings(comment.inner_html)
47
+ }
48
+ @scores = scores.reject { |r| r.empty? }
49
+ end
50
+
51
+ def comment_xhr_params
52
+ document = Nokogiri::HTML(@details_page_html)
53
+ comment_link = document.css('div.browse-coms a').first
54
+ if comment_link.nil?
55
+ [{ page: 1, pages: 1, crc: "9b235c98e242f2617ae61dc416ec0de7", id: @id }]
56
+ else
57
+ params = PirateBay::Details.extract_xhr_params comment_link.attr('onclick')
58
+ results = Array.new(params[:pages]) { |i| i+1 }
59
+ results.map do |i|
60
+ { page: i, pages: params[:pages], crc: params[:crc], id: params[:id] }
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+ def self.extract_xhr_params(string)
67
+ page, pages, crc, id = /comPage\((\d+),(\d+),'(.+)', '(.+)'\);/.match(string).captures
68
+ page = page.to_i
69
+ pages = pages.to_i
70
+ { page: page, pages: pages, crc: crc, id: id }
71
+ end
72
+
73
+
74
+ def self.search_for_ratings string
75
+ video_score_matches = string.match(/(v|video) ?[:\=-]? ?([0-9]\.[0-9]|[0-9]{1,2})/i)
76
+ audio_score_matches = string.match(/(a|audio) ?[:\=-]? ?([0-9]\.[0-9]|[0-9]{1,2})/i)
77
+ ratings = {}
78
+ ratings[:v] = video_score_matches[2].to_f unless video_score_matches.nil?
79
+ ratings[:a] = audio_score_matches[2].to_f unless audio_score_matches.nil?
80
+ ratings.delete(:v) if ratings[:v] && ratings[:v] > 10
81
+ ratings.delete(:a) if ratings[:a] && ratings[:a] > 10
82
+ # puts "Incoming string of #{string} detected ratings of #{ratings}"
83
+ ratings
84
+ end
85
+
86
+ def video_quality_average
87
+ video_scores = scores.map { |score| score[:v] }.compact
88
+ sum_of_video_scores = video_scores.inject(0) { |score, memo| memo += score }
89
+ sum_of_video_scores / video_scores.size.to_f
90
+ end
91
+
92
+ def audio_quality_average
93
+ audio_scores = scores.map { |score| score[:a] }.compact
94
+ sum_of_audio_scores = audio_scores.inject(0) { |score, memo| memo += score }
95
+ sum_of_audio_scores / audio_scores.size.to_f
96
+ end
97
+ end
98
+ end
@@ -1,6 +1,6 @@
1
1
  module PirateBay
2
2
  class Result
3
- attr_accessor :name, :seeds, :leeches, :category, :link, :magnet_link, :status, :size
3
+ attr_accessor :id, :name, :seeds, :leeches, :category, :link, :magnet_link, :status, :size
4
4
 
5
5
  def initialize(row = nil)
6
6
  if row.css("td")[1].css("img[alt='Trusted']").size > 0
@@ -18,7 +18,7 @@ module PirateBay
18
18
  magnet_link = nil
19
19
  end
20
20
 
21
-
21
+ self.id = row.inner_html.match(/torrent\/([\d]+)\//)[1]
22
22
  self.name = row.css(".detName").first.content
23
23
  self.seeds = row.css("td")[2].content.to_i
24
24
  self.leeches = row.css("td")[3].content.to_i
data/lib/torrent_api.rb CHANGED
@@ -10,7 +10,7 @@ require 'uri'
10
10
  %w(result base result_set).each do |filename|
11
11
  require File.join(File.dirname(__FILE__), 'torrent_reactor', filename)
12
12
  end
13
- %w(result base categories result_set).each do |filename|
13
+ %w(result base categories details result_set).each do |filename|
14
14
  require File.join(File.dirname(__FILE__), 'pirate_bay', filename)
15
15
  end
16
16
  %w(result base result_set).each do |filename|
data/torrent_api.gemspec CHANGED
@@ -1,25 +1,24 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |s|
4
- s.name = %q{torrent_api}
5
- s.version = "0.1.2"
4
+ s.name = "torrent_api"
5
+ s.version = "0.2.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["James Hart"]
9
- s.date = %q{2011-06-26}
10
- s.description = %q{An API to query popular torrent websites}
11
- s.email = %q{hjhart@gmail.com}
12
- s.extra_rdoc_files = ["CHANGELOG", "README.markdown", "lib/demonoid/base.rb", "lib/demonoid/result.rb", "lib/demonoid/result_set.rb", "lib/pirate_bay/base.rb", "lib/pirate_bay/categories.rb", "lib/pirate_bay/result.rb", "lib/pirate_bay/result_set.rb", "lib/torrent_api.rb", "lib/torrent_reactor/base.rb", "lib/torrent_reactor/result.rb", "lib/torrent_reactor/result_set.rb"]
13
- s.files = ["CHANGELOG", "Manifest", "README.markdown", "Rakefile", "lib/demonoid/base.rb", "lib/demonoid/result.rb", "lib/demonoid/result_set.rb", "lib/pirate_bay/base.rb", "lib/pirate_bay/categories.rb", "lib/pirate_bay/result.rb", "lib/pirate_bay/result_set.rb", "lib/torrent_api.rb", "lib/torrent_reactor/base.rb", "lib/torrent_reactor/result.rb", "lib/torrent_reactor/result_set.rb", "torrent_api.gemspec"]
14
- s.homepage = %q{http://www.github.com/hjhart/torrent_api}
9
+ s.date = "2011-11-12"
10
+ s.description = "An API to query popular torrent websites"
11
+ s.email = "hjhart@gmail.com"
12
+ s.extra_rdoc_files = ["CHANGELOG", "README.markdown", "lib/demonoid/base.rb", "lib/demonoid/result.rb", "lib/demonoid/result_set.rb", "lib/pirate_bay/base.rb", "lib/pirate_bay/categories.rb", "lib/pirate_bay/details.rb", "lib/pirate_bay/result.rb", "lib/pirate_bay/result_set.rb", "lib/torrent_api.rb", "lib/torrent_reactor/base.rb", "lib/torrent_reactor/result.rb", "lib/torrent_reactor/result_set.rb"]
13
+ s.files = ["CHANGELOG", "Manifest", "README.markdown", "Rakefile", "lib/demonoid/base.rb", "lib/demonoid/result.rb", "lib/demonoid/result_set.rb", "lib/pirate_bay/base.rb", "lib/pirate_bay/categories.rb", "lib/pirate_bay/details.rb", "lib/pirate_bay/result.rb", "lib/pirate_bay/result_set.rb", "lib/torrent_api.rb", "lib/torrent_reactor/base.rb", "lib/torrent_reactor/result.rb", "lib/torrent_reactor/result_set.rb", "torrent_api.gemspec"]
14
+ s.homepage = "http://www.github.com/hjhart/torrent_api"
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Torrent_api", "--main", "README.markdown"]
16
16
  s.require_paths = ["lib"]
17
- s.rubyforge_project = %q{torrent_api}
18
- s.rubygems_version = %q{1.3.7}
19
- s.summary = %q{An API to query popular torrent websites}
17
+ s.rubyforge_project = "torrent_api"
18
+ s.rubygems_version = "1.8.10"
19
+ s.summary = "An API to query popular torrent websites"
20
20
 
21
21
  if s.respond_to? :specification_version then
22
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
22
  s.specification_version = 3
24
23
 
25
24
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
metadata CHANGED
@@ -1,55 +1,43 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: torrent_api
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 2
9
- version: 0.1.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - James Hart
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-06-26 00:00:00 -07:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2011-11-12 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: nokogiri
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2153796560 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
31
22
  type: :development
32
- version_requirements: *id001
33
- - !ruby/object:Gem::Dependency
34
- name: hpricot
35
23
  prerelease: false
36
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *2153796560
25
+ - !ruby/object:Gem::Dependency
26
+ name: hpricot
27
+ requirement: &2153795880 !ruby/object:Gem::Requirement
37
28
  none: false
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 0
43
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
44
33
  type: :development
45
- version_requirements: *id002
34
+ prerelease: false
35
+ version_requirements: *2153795880
46
36
  description: An API to query popular torrent websites
47
37
  email: hjhart@gmail.com
48
38
  executables: []
49
-
50
39
  extensions: []
51
-
52
- extra_rdoc_files:
40
+ extra_rdoc_files:
53
41
  - CHANGELOG
54
42
  - README.markdown
55
43
  - lib/demonoid/base.rb
@@ -57,13 +45,14 @@ extra_rdoc_files:
57
45
  - lib/demonoid/result_set.rb
58
46
  - lib/pirate_bay/base.rb
59
47
  - lib/pirate_bay/categories.rb
48
+ - lib/pirate_bay/details.rb
60
49
  - lib/pirate_bay/result.rb
61
50
  - lib/pirate_bay/result_set.rb
62
51
  - lib/torrent_api.rb
63
52
  - lib/torrent_reactor/base.rb
64
53
  - lib/torrent_reactor/result.rb
65
54
  - lib/torrent_reactor/result_set.rb
66
- files:
55
+ files:
67
56
  - CHANGELOG
68
57
  - Manifest
69
58
  - README.markdown
@@ -73,6 +62,7 @@ files:
73
62
  - lib/demonoid/result_set.rb
74
63
  - lib/pirate_bay/base.rb
75
64
  - lib/pirate_bay/categories.rb
65
+ - lib/pirate_bay/details.rb
76
66
  - lib/pirate_bay/result.rb
77
67
  - lib/pirate_bay/result_set.rb
78
68
  - lib/torrent_api.rb
@@ -80,43 +70,34 @@ files:
80
70
  - lib/torrent_reactor/result.rb
81
71
  - lib/torrent_reactor/result_set.rb
82
72
  - torrent_api.gemspec
83
- has_rdoc: true
84
73
  homepage: http://www.github.com/hjhart/torrent_api
85
74
  licenses: []
86
-
87
75
  post_install_message:
88
- rdoc_options:
76
+ rdoc_options:
89
77
  - --line-numbers
90
78
  - --inline-source
91
79
  - --title
92
80
  - Torrent_api
93
81
  - --main
94
82
  - README.markdown
95
- require_paths:
83
+ require_paths:
96
84
  - lib
97
- required_ruby_version: !ruby/object:Gem::Requirement
85
+ required_ruby_version: !ruby/object:Gem::Requirement
98
86
  none: false
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- segments:
103
- - 0
104
- version: "0"
105
- required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
92
  none: false
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- segments:
111
- - 1
112
- - 2
113
- version: "1.2"
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '1.2'
114
97
  requirements: []
115
-
116
98
  rubyforge_project: torrent_api
117
- rubygems_version: 1.3.7
99
+ rubygems_version: 1.8.10
118
100
  signing_key:
119
101
  specification_version: 3
120
102
  summary: An API to query popular torrent websites
121
103
  test_files: []
122
-