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