tInitial python implementation. - gopherbay - A Gopher interface to The Pirate Bay HTML git clone https://git.parazyd.org/gopherbay DIR Log DIR Files DIR Refs DIR README --- DIR commit 49ba9f17023c6269b2080eabfc206f12832cf491 HTML Author: parazyd <parazyd@dyne.org> Date: Wed, 11 Nov 2020 19:48:02 +0100 Initial python implementation. Diffstat: A browse.dcgi | 2 ++ A index.gph | 50 +++++++++++++++++++++++++++++++ A q.dcgi | 146 +++++++++++++++++++++++++++++++ A top.dcgi | 2 ++ 4 files changed, 200 insertions(+), 0 deletions(-) --- DIR diff --git a/browse.dcgi b/browse.dcgi t@@ -0,0 +1 @@ +q.dcgi +\ No newline at end of file DIR diff --git a/index.gph b/index.gph t@@ -0,0 +1,50 @@ + + .. + .( )`-._ + .' || `._ + .' || `. + .' || `._ + .' _||_ `-. + .' |====| `.. + .' \__/ ( ) + ( ) || _ || + /|\ || .-` \ || + .' | ' || _.-' | || + / |\ \ || .' `.__.' || _.-.. + .' /| `. _.-' _.-' _.-.`-'`._`.` + \ .' | | .-.` `./ _.-`. `._.-' + |. | `. _.-' `. .' .' `._.`---` + .' | | : `._..-'.' `._..' || + / | \ `-._.' || || + | .'|`. | ||_.--.-._ || + ' / | \ \ __.--'\ `. : || + \ .' | \| ..-' \ `._-._.' || +`.._ |/ | `. \ \ `._.- || + `-.._ / | \ `-.'_.--' || + `-.._.' | | | | _ _ _ _'_ _ _ _ _ + `-.._ | \ | | |_|_|_'|_|_|_|_|_|_| + [`--^-..._.' | | /....../| __ __ | + \`---.._|`--.._ | | /....../ | |__| |__| | + \__ _ `-.._| `-._|_|_ _ _/_ _ _ / | |__| |__| | + \ _o_ _`-._|_|_|_|_|_|_|_|_/ '-----------/ + \_`.|.' _ - .--.--.--.--.--.`--------------' + .```-._ ``-.._ \__ _ _ '--'--'--'--'--' - _ - _ __/ + .`-.```-._ ``-..__``.- `. _ - _ _ _ - _- _ __/(.``-._ + _.-` ``--.. .. _.-` ``--.. .. .._ _. __ __ _ __ ..--.._ / .( _..`` +`.-._ `._ `- `-._ .`-.```-._ ``-..__``.- -._--.__---._--..-._`...``` + _.-` ``--.. .. `.-._ `._ `- `-._ .-_. ._.- -._ --.._`` _.-`LGB`-. + + == ================ == + === The Gopher Bay === + == ================ == + +----------------- +[7| Pirate Search|/q.dcgi?|server|port] +----------------- + +[1|Browse torrents|/browse.dcgi|server|port] +[1|Recent torrents|/q.dcgi?top100:recent|server|port] +[1|Top 100|/top.dcgi|server|port] + +[h|Donate BTC: 1KcjUphVbs43JovcVJMfDzYaNJcUPVyAmR|URL:bitcoin:1KcjUphVbs43JovcVJMfDzYaNJcUPVyAmR|server|port] + DIR diff --git a/q.dcgi b/q.dcgi t@@ -0,0 +1,146 @@ +#!/usr/bin/env python3 +# Beerware License, parazyd <parazyd@dyne.org> + +from collections import OrderedDict +from json import loads +from sys import argv +from urllib.parse import quote +from os.path import basename +from requests import get + +server = "https://apibay.org" + +def print_size(size): + if size >= 2**50: return "%.2f PiB" % (size/(2**50)) + if size >= 2**40: return "%.2f TiB" % (size/(2**40)) + if size >= 2**30: return "%.2f GiB" % (size/(2**30)) + if size >= 2**20: return "%.2f MiB" % (size/(2**20)) + if size >= 2**10: return "%.2f KiB" % (size/(2**10)) + return "%s B" + +def print_category(cat): + return categories.get(cat, "n/a") + +def print_all_categories(top100=False): + print("=====================") + print("= Browse Top100 =" if top100 else "= Browse Categories =") + print("=====================") + print() + + if top100: + print("[1|** Total Top100 **|/q.dcgi?top100:all|server|port]") + + for i in categories: + if i % 100 == 0: + print() + print("[1|%s|/q.dcgi?%s:%d|server|port]" % (categories[i], + "top100" if top100 else "category", i)) + +def print_magnet(ihash, name): + return "magnet:?xt=urn:btih:%s&dn%s%s" % (ihash, quote(name), print_trackers()) + +def print_trackers(): + trs = "&tr=".join(( + quote("udp://tracker.coppersurfer.tk:6969/announce"), + quote("udp://9.rarbg.me:2850/announce"), + quote("udp://9.rarbg.to:2920/announce"), + quote("udp://tracker.opentrackr.org:1337"), + quote("udp://tracker.leechers-paradise.org:6969/announce"))) + return "&tr=%s" % trs + +def httpget(url): + r = get(url) + return r.text + +def main(_argv): + query = quote(_argv[1] if _argv[1] else _argv[2]) + + if query[0:10] == "top100:all": + data = httpget(server + "/precompiled/data_top100_all.json") + elif query[0:14] == "top100:recent_": + data = httpget(server + "/precompiled/data_top100_recent_" + query[14:] + ".json") + elif query[0:13] == "top100:recent": + data = httpget(server + "/precompiled/data_top100_recent.json") + elif query[0:7] == "top100:": + data = httpget(server + "/precompiled/data_top100_" + query[7:] + ".json") + else: + data = httpget(server + "/q.php?q=" + query) + + jsondata = loads(data) + + for i in jsondata: + magnet = print_magnet(i["info_hash"], quote(i["name"])) + + print("Name: %s" % (i["name"])) + print("Seeders: %s | Leechers: %s | Files: %d | Size: %s" % + (i["seeders"], i["leechers"], int(i["num_files"]), + print_size(int(i["size"])))) + print("[1|Category: %s|/q.dcgi?category:%d|server|port]" % + (print_category(int(i["category"])), int(i["category"]))) + print("[1|Uploader: %s (%s)|/q.dcgi?user:%s|server|port]" % + (i["username"], i["status"], i["username"])) + print("[h|Magnet Link: %s|URL:%s|server|port]" % (i["info_hash"], magnet)) + print() + +categories = OrderedDict({ + 100: "** Audio **", + 101: "Audio > Music", + 102: "Audio > Audio Books", + 103: "Audio > Sound Clips", + 104: "Audio > FLAC", + 199: "Audio > Other", + 200: "** Video **", + 201: "Video > Movies", + 202: "Video > Movies DVDR", + 203: "Video > Music Videos", + 204: "Video > Movie Clips", + 205: "Video > TV-Shows", + 206: "Video > Handheld", + 207: "Video > HD Movies", + 208: "Video > HD TV-Shows", + 209: "Video > 3D", + 299: "Video > Other", + 300: "** Applications **", + 301: "Applications > Windows", + 302: "Applications > Mac/Apple", + 303: "Applications > UNIX", + 304: "Applications > Handheld", + 305: "Applications > IOS(iPad/iPhone)", + 306: "Applications > Android", + 399: "Applications > Other OS", + 400: "** Games **", + 401: "Games > PC", + 402: "Games > Mac/Apple", + 403: "Games > PSx", + 404: "Games > XBOX360", + 405: "Games > Wii", + 406: "Games > Handheld", + 407: "Games > IOS(iPad/iPhone)", + 408: "Games > Android", + 499: "Games > Other OS", + 500: "** Porn **", + 501: "Porn > Movies", + 502: "Porn > Movies DVDR", + 503: "Porn > Pictures", + 504: "Porn > Games", + 505: "Porn > HD-Movies", + 506: "Porn > Movie Clips", + 599: "Porn > Other", + 600: "** Other **", + 601: "Other > E-books", + 602: "Other > Comics", + 603: "Other > Pictures", + 604: "Other > Covers", + 605: "Other > Physibles", + 699: "Other > Other", +}) + +if __name__ == "__main__": + if basename(argv[0]) == "q.dcgi": + main(argv) + elif basename(argv[0]) == "top.dcgi": + print_all_categories(top100=True) + elif basename(argv[0]) == "browse.dcgi": + print_all_categories() + else: + print("Internal error.") DIR diff --git a/top.dcgi b/top.dcgi t@@ -0,0 +1 @@ +q.dcgi +\ No newline at end of file