lib/client.rb in hail_hydra-0.2.3 vs lib/client.rb in hail_hydra-1.0.0
- old
+ new
@@ -1,77 +1,74 @@
require "httparty"
-require "nokogiri"
+require "json"
+require "addressable/uri"
+require "cgi"
require_relative "torrent.rb"
module HailHydra
# The TPB class provides the main client to connect to and scrape the
- # results. This may be broken into a 'client' and 'parser' in the future.
+ # results.
class TPB
# remember the domain name and get the cookie to use from the TPB server
- def initialize(domain_name)
- @domain = domain_name
- @headers = get_query_headers
+ def initialize domain="https://apibay.org"
+ @domain = domain
end
# search torrents
- def search(query, pages=1, orderby=99)
- get = make_search_request(query, pages, orderby)
+ def search query
+ get = make_search_request query
raise "Invalid response: #{get.response.code}" unless get.response.code == "200"
- return parse_search_results(get.response.body)
+ return parse_search_results JSON.parse(get.response.body)
end
private
- def parse_search_results(html_text)
- nodes = Nokogiri::HTML(html_text)
- cells = []
- table = nodes.search('table')
-
- table.search('tr').each do |tr|
- cells.push(tr.search('th, td'))
- end
-
+ def parse_search_results json_results
torrents = []
- descriptions = nodes.css('font.detDesc')
- 1.upto cells.length-1 do |i|
- torrent = HailHydra::Torrent.new()
-
- torrent.name = cells[i][1].children[1].children[1].children[0].content
- torrent.url = @domain + cells[i][1].children[1].children[1].attributes["href"].value
- torrent.magnet_link = cells[i][1].children[3].attributes["href"].value
- torrent.seeders = cells[i][2].children[0].content
- torrent.leechers = cells[i][3].children[0].content
-
- # extracting the uploaded by, at and size is a bit trickier
- info_line = descriptions[i-1].text.gsub("\u00A0", "---").split(",").map(&:strip)
-
- torrent.uploaded_at = info_line[0].split(" ")[1].gsub("---", " ")
- torrent.size = info_line[1].split(" ")[1].gsub("---", " ")
- torrent.uploaded_by = info_line[2].split(" ")[2]
-
+ json_results.each do |result|
+ torrent = HailHydra::Torrent.new
+ torrent.name = result["name"]
+ torrent.seeders = result["seeders"]
+ torrent.leechers = result["leechers"]
+ torrent.uploaded_by = result["username"]
+ torrent.uploaded_at = Time.at(result["added"].to_i).to_s
+ torrent.size = make_size(result["size"].to_i)
+ torrent.magnet_link = make_magnet_link(result["info_hash"], result["name"])
torrents.push torrent
end
return torrents
end
- def make_search_request(query, pages, orderby)
- query = {
- "q" => query,
- "page" => 0.to_s,
- "orderby" => orderby.to_s
- }
+ private
- # not sure why HTTParty doesn't do this already
- encoded_uri = URI.encode(@domain+"/search/" + query["q"] + "/0/" + query["orderby"] + "/0")
- HTTParty.get(encoded_uri, headers: @headers)
+ def make_magnet_link info_hash, name
+ # used CGI.escape because URI.encode now throws a warning and Addressable doesn't seem to
+ # support not-URL strings
+ return "magnet:?xt=urn:btih:#{info_hash}&dn=#{CGI.escape(name)}#{trackers}"
end
- def get_query_headers()
- cookie = HTTParty.get(@domain).response['set-cookie']
- return {
- 'User-Agent' => 'Mozilla/5.0 (Windows 10; WOW64; rv:10.0) Gecko/20100101 Firefox/10.0',
- 'Referer' => @domain,
- 'Cookie' => cookie
- }
+ def trackers
+ tr = '&tr=' + Addressable::URI.encode('udp://tracker.coppersurfer.tk:6969/announce')
+ tr += '&tr=' + Addressable::URI.encode('udp://9.rarbg.to:2920/announce')
+ tr += '&tr=' + Addressable::URI.encode('udp://tracker.opentrackr.org:1337')
+ tr += '&tr=' + Addressable::URI.encode('udp://tracker.internetwarriors.net:1337/announce')
+ tr += '&tr=' + Addressable::URI.encode('udp://tracker.leechers-paradise.org:6969/announce')
+ tr += '&tr=' + Addressable::URI.encode('udp://tracker.coppersurfer.tk:6969/announce')
+ tr += '&tr=' + Addressable::URI.encode('udp://tracker.pirateparty.gr:6969/announce')
+ tr += '&tr=' + Addressable::URI.encode('udp://tracker.cyberia.is:6969/announce')
+ return tr
+ end
+
+ def make_size size
+ return ((size / 1125899906842624).round(3)).to_s + "PiB" if size >= 1125899906842624
+ return ((size / 1099511627776).round(3)).to_s + "TiB" if size >= 1099511627776
+ return ((size / 1073741824).round(3)).to_s + "GiB" if size >= 1073741824
+ return ((size / 1048576).round(3)).to_s + "MiB" if size >= 1048576
+ return ((size / 1024).round(3)).to_s + "KiB" if size >= 1024
+ end
+
+ def make_search_request query
+ encoded_uri = Addressable::URI.encode(@domain + "/q.php?q=" + query)
+ HTTParty.get encoded_uri
end
end
end