Skip to content

Commit c099d88

Browse files
authored
Merge branch 'main' into torrentgalaxy_scraper_support
2 parents 6b2888a + 98c217c commit c099d88

File tree

5 files changed

+123
-44
lines changed

5 files changed

+123
-44
lines changed

content/classes.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -632,8 +632,6 @@ def deviation(self, year=""):
632632
def isanime(self):
633633
if 'anime' in self.genre():
634634
if self.type == "show":
635-
if hasattr(self, "anime_count"):
636-
return True
637635
self.anime_count = 0
638636
if hasattr(self, 'Seasons'):
639637
for season in self.Seasons:

scraper/services/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
from scraper.services import mediafusion
1313
from scraper.services import comet
1414
from scraper.services import eztv
15-
from scraper.services import torrentgalaxy
15+
from scraper.services import thepiratebay
1616

1717
#define subclass method
1818
def __subclasses__():
19-
return [rarbg,x1337,jackett,prowlarr,orionoid,nyaa,torrentio,zilean,torbox,mediafusion,comet,eztv,torrentgalaxy]
19+
return [rarbg,x1337,jackett,prowlarr,orionoid,nyaa,torrentio,zilean,torbox,mediafusion,comet,eztv,thepiratebay,torrentgalaxy]
2020

2121
active = ['torrentio']
2222
overwrite = []

scraper/services/thepiratebay.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import urllib.request
2+
import urllib.parse
3+
from ui.ui_print import *
4+
import releases
5+
import re
6+
7+
name = "thepiratebay"
8+
base_url = "https://apibay.org"
9+
session = urllib.request.build_opener()
10+
11+
12+
def setup(cls, new=False):
13+
from scraper.services import setup
14+
setup(cls, new)
15+
16+
17+
def scrape(query, altquery):
18+
from scraper.services import active
19+
20+
scraped_releases = []
21+
if 'thepiratebay' in active:
22+
q = query.replace('.?', '').replace("'", "").replace("’", "").replace('.', ' ').strip(".").strip(" ")
23+
ui_print("[thepiratebay] using extended query: " + q, ui_settings.debug)
24+
headers = {
25+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}
26+
url = base_url + '/q.php?q=' + urllib.parse.quote(q, safe=':/')
27+
try:
28+
ui_print("[thepiratebay] Sending GET request to API URL: " + url, ui_settings.debug)
29+
request = urllib.request.Request(url, headers=headers)
30+
response = session.open(request)
31+
status_code = response.getcode()
32+
33+
if status_code == 200:
34+
content = response.read().decode('utf-8')
35+
response_json = json.loads(content)
36+
torrents = response_json if isinstance(response_json, list) else []
37+
38+
# Check for 0 results
39+
if torrents and (torrents[0].get('name') == "No results returned" or 'total_found' in torrents[0]):
40+
ui_print("[thepiratebay] No torrents found", ui_settings.debug)
41+
else:
42+
ui_print(f"[thepiratebay] Found {len(torrents)} torrent(s)", ui_settings.debug)
43+
44+
for torrent in torrents:
45+
title = torrent.get('name')
46+
title = re.sub(r'[^\w\s\.\-]', '', title)
47+
download = 'magnet:?xt=urn:btih:' + torrent.get('info_hash')
48+
size_bytes = int(torrent.get('size', 0))
49+
size = size_bytes / (1024 * 1024 * 1024)
50+
seeders = int(torrent.get('seeders', 0))
51+
52+
if regex.match(r'(' + altquery.replace('.', '\.').replace("\.*", ".*") + ')', title, regex.I):
53+
scraped_releases += [releases.release('[thepiratebay]', 'torrent', title, [], size, [download], seeders=seeders)]
54+
ui_print(f"[thepiratebay] Scraped release: title={title}, size={size:.2f} GB, seeders={seeders}", ui_settings.debug)
55+
else:
56+
ui_print("[thepiratebay] Failed to retrieve data from API. Status code: " + str(status_code), ui_settings.debug)
57+
58+
except Exception as e:
59+
ui_print('[thepiratebay] error: exception: ' + str(e), ui_settings.debug)
60+
return scraped_releases

scraper/services/x1337.py

Lines changed: 60 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,78 @@
1-
#import modules
2-
from base import *
1+
import urllib.request
2+
import urllib.parse
33
from ui.ui_print import *
44
import releases
5+
import re
56

67
name = "1337x"
7-
session = requests.Session()
8+
base_url = "https://1337x.to"
9+
session = urllib.request.build_opener()
10+
811

912
def setup(cls, new=False):
1013
from scraper.services import setup
11-
setup(cls,new)
14+
setup(cls, new)
15+
1216

1317
def scrape(query, altquery):
1418
from scraper.services import active
19+
20+
mediatype = 'TV' if re.search(r'(\bseries\b|\bS\d+\b)', altquery) else 'Movies'
1521
scraped_releases = []
1622
if '1337x' in active:
23+
q = query.replace('.?', '').replace("'", "").replace("’", "").replace('.', ' ').strip(".").strip(" ")
24+
ui_print("[1337x] using extended query: " + q, ui_settings.debug)
1725
headers = {
1826
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}
19-
url = 'http://1337x.to/search/' + str(query) + '/1/'
27+
url = base_url + '/sort-category-search/' + urllib.parse.quote(q, safe=':/') + '/' + mediatype + '/seeders/desc/1/'
2028
response = None
2129
try:
22-
response = session.get(url, headers=headers)
23-
soup = BeautifulSoup(response.content, 'html.parser')
24-
torrentList = soup.select('a[href*="/torrent/"]')
25-
sizeList = soup.select('td.coll-4')
26-
seederList = soup.select('td.coll-2')
27-
if torrentList:
28-
for count, torrent in enumerate(torrentList):
29-
title = torrent.getText().strip()
30-
title = title.replace(" ", '.')
31-
title = regex.sub(r'\.+', ".", title)
32-
if regex.match(r'(' + altquery.replace('.', '\.').replace("\.*", ".*") + ')', title,
33-
regex.I):
34-
link = torrent['href']
35-
response = session.get('http://1337x.to' + link, headers=headers)
36-
soup = BeautifulSoup(response.content, 'html.parser')
37-
download = soup.select('a[href^="magnet"]')[0]['href']
38-
size = sizeList[count].contents[0]
39-
seeders = seederList[count].contents[0]
40-
if regex.search(r'([0-9]*?\.[0-9])(?= MB)', size, regex.I):
41-
size = regex.search(r'([0-9]*?\.[0-9])(?= MB)', size, regex.I).group()
42-
size = float(float(size) / 1000)
43-
elif regex.search(r'([0-9]*?\.[0-9])(?= GB)', size, regex.I):
44-
size = regex.search(r'([0-9]*?\.[0-9])(?= GB)', size, regex.I).group()
45-
size = float(size)
46-
else:
47-
size = float(size)
48-
scraped_releases += [
49-
releases.release('[1337x]', 'torrent', title, [], size, [download], seeders=int(seeders))]
30+
ui_print("[1337x] Sending GET request to URL: " + url, ui_settings.debug)
31+
request = urllib.request.Request(url, headers=headers)
32+
response = session.open(request)
33+
status_code = response.getcode()
34+
35+
if status_code == 200:
36+
content = response.read().decode('utf-8', errors='ignore')
37+
soup = BeautifulSoup(content, 'html.parser')
38+
torrentList = soup.select('a[href*="/torrent/"]')
39+
sizeList = soup.select('td.coll-4')
40+
seederList = soup.select('td.coll-2')
41+
if torrentList:
42+
ui_print(f"[1337x] Found {len(torrentList)} torrent(s)", ui_settings.debug)
43+
for count, torrent in enumerate(torrentList):
44+
title = torrent.getText().strip()
45+
title = re.sub(r'[^\w\s\.\-]', '', title)
46+
title = title.replace(" ", '.')
47+
title = re.sub(r'\.+', ".", title)
48+
if re.match(r'(' + altquery.replace('.', '\.').replace("\.*", ".*") + ')', title, re.I):
49+
link = torrent['href']
50+
request = urllib.request.Request(base_url + link, headers=headers)
51+
response = session.open(request)
52+
content = response.read().decode('utf-8')
53+
soup = BeautifulSoup(content, 'html.parser')
54+
download = soup.select('a[href^="magnet"]')[0]['href']
55+
size = sizeList[count].contents[0]
56+
seeders = seederList[count].contents[0]
57+
if re.search(r'([0-9]*?\.[0-9])(?= MB)', size, re.I):
58+
size = re.search(r'([0-9]*?\.[0-9])(?= MB)', size, re.I).group()
59+
size = float(float(size) / 1000)
60+
elif re.search(r'([0-9]*?\.[0-9])(?= GB)', size, re.I):
61+
size = re.search(r'([0-9]*?\.[0-9])(?= GB)', size, re.I).group()
62+
size = float(size)
63+
else:
64+
size = float(size)
65+
66+
scraped_releases += [releases.release('[1337x]', 'torrent', title, [], size, [download], seeders=int(seeders))]
67+
ui_print(f"[1337x] Scraped release: title={title}, size={size} GB, seeders={seeders}", ui_settings.debug)
68+
else:
69+
ui_print("[1337x] No torrents found", ui_settings.debug)
70+
else:
71+
ui_print("[1337x] Failed to retrieve the page. Status code: " + str(status_code), ui_settings.debug)
5072
except Exception as e:
51-
if hasattr(response,"status_code") and not str(response.status_code).startswith("2"):
52-
ui_print('1337x error '+str(response.status_code)+': 1337x is temporarily not reachable')
73+
if hasattr(response, "status_code") and not str(response.status_code).startswith("2"):
74+
ui_print('[1337x] error ' + str(response.status_code) + ': 1337x is temporarily not reachable')
5375
else:
54-
ui_print('1337x error: unknown error')
55-
response = None
56-
ui_print('1337x error: exception: ' + str(e),ui_settings.debug)
57-
return scraped_releases
76+
ui_print('[1337x] error: unknown error')
77+
ui_print('[1337x] error: exception: ' + str(e), ui_settings.debug)
78+
return scraped_releases

ui/ui_settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version = ['2.97', "Settings compatible update", []]
1+
version = ['2.98', "Settings compatible update", []]
22
run_directly = "true"
33
debug = "false"
44
log = "false"

0 commit comments

Comments
 (0)