class PirateBay::Search

Attributes

base_url[RW]
caching[RW]
category_id[RW]
page[RW]
results[RW]
search_string[RW]

Public Class Methods

new(search_string, category=0, url='https://thepiratebay.se') click to toggle source
# File lib/piratebay_api/pirate_bay.rb, line 6
def initialize(search_string, category=0, url='https://thepiratebay.se')
  @search_string = URI.encode(search_string)
  @category_id = PirateBay::Categories::IDS[category.upcase.strip.gsub(/S$/, '').to_sym] unless category == 0
  @page = -1
  @base_url = url

  @results = PirateBay::ResultSet.new(self)
end

Public Instance Methods

cached_filename() click to toggle source
# File lib/piratebay_api/pirate_bay.rb, line 48
def cached_filename
  File.join('tmp', 'searches', "#{sanitize_filename(search_string)}_#{category_id}_#{page}.html")
end
execute() click to toggle source
# File lib/piratebay_api/pirate_bay.rb, line 29
def execute
  return nil if search_string.nil?
  self.page += 1
  doc = ''

  if @results.size < @results.total_results
    doc = Nokogiri::HTML(get_search_results)
  end

  next_page(doc)

end
fetch_search_results() click to toggle source
# File lib/piratebay_api/pirate_bay.rb, line 78
def fetch_search_results
  url = "#{@base_url}/search/#{search_string}/#{page}/7/#{category_id}" # highest seeded first
  open(url, { 'User-Agent' => 'libcurl-agent/1.0' }).read
end
get_quality() click to toggle source
# File lib/piratebay_api/pirate_bay.rb, line 52
def get_quality
  execute
  results = @results.map do |result|
    url = "#{@base_url}/torrent/#{result.id}/"
    html = open(url).read
    p = PirateBay::Details.new html, :init, @base_url
    puts 'Fetching results'
    result = {
        :seeds => result.seeds,
        :size => result.size,
        :name => result.name,
        :video => p.video_quality_average,
        :audio => p.audio_quality_average,
        :url => url,
        :video_votes => p.video_scores.size,
        :audio_votes => p.audio_scores.size,
        :video_votes_sum => p.video_quality_score_sum,
        :audio_votes_sum => p.audio_quality_score_sum
    }
    puts "Results: #{result}"
    result
  end

  results.reject { |a| a[:video].nan? }.sort_by { |a| a[:video] }
end
get_search_results() click to toggle source
# File lib/piratebay_api/pirate_bay.rb, line 15
def get_search_results
  if caching && File.exist?(cached_filename)
    content = File.read(cached_filename)
  else
    content = fetch_search_results

    FileUtils.mkdir_p('tmp/searches')
    File.open(cached_filename, 'w') do |f|
      f.write(content)
    end
  end
  content
end
sanitize_filename(filename) click to toggle source
# File lib/piratebay_api/pirate_bay.rb, line 42
def sanitize_filename(filename)
  filename = filename.gsub(/[^0-9A-Za-z.\-]/, 'x')
  filename = filename.gsub(/^.*(\\|\/)/, '')
  filename.strip
end

Private Instance Methods

next_page(doc) click to toggle source
# File lib/piratebay_api/pirate_bay.rb, line 85
def next_page(doc)
  if @results.total_results.nil?
    matching_results = doc.css('h2').first.content.match(/Displaying hits from (.*) to (.*) \(approx (.*) found\)/i)

    if matching_results.nil?
      @results.total_results = 0
    else
      @results.total_results = matching_results[3].to_i
    end
  end

  doc.css('#searchResult tr').each_with_index do |row, index|
    next if (index == 0)
    next if (row.css('td').size <= 1)
    result = PirateBay::Result.new(row, @base_url)
    @results << result
  end
  @results
end