feat: jackettio scraper

This commit is contained in:
g0ldyy
2025-08-30 01:20:25 +02:00
parent 7b9975d437
commit 31b010dbe9
5 changed files with 75 additions and 0 deletions
+5
View File
@@ -119,6 +119,11 @@ AIOSTREAMS_URL=https://aio.example.com # Full manifest URL without /manifest.jso
# Multi-instance example:
# AIOSTREAMS_URL='["https://aio1.example.com", "https://aio2.example.com"]'
SCRAPE_JACKETTIO=True # Works only with Telkaoss's fork
JACKETTIO_URL=https://jackettio.example.com # Full manifest URL without /manifest.json at the end
# Multi-instance example:
# JACKETTIO_URL='["https://jackettio1.example.com", "https://jackettio2.example.com"]'
# ============================== #
# Debrid Stream Proxy Settings #
# ============================== #
+6
View File
@@ -236,6 +236,12 @@ def start_log():
f"AIOStreams Scraper: {bool(settings.SCRAPE_AIOSTREAMS)}{aiostreams_url}",
)
jackettio_url = f" - {settings.JACKETTIO_URL}" if settings.SCRAPE_JACKETTIO else ""
logger.log(
"COMET",
f"Jackettio Scraper: {bool(settings.SCRAPE_JACKETTIO)}{jackettio_url}",
)
logger.log(
"COMET",
f"Debrid Stream Proxy: {bool(settings.PROXY_DEBRID_STREAM)} - Password: {settings.PROXY_DEBRID_STREAM_PASSWORD} - Max Connections: {settings.PROXY_DEBRID_STREAM_MAX_CONNECTIONS} - Default Debrid Service: {settings.PROXY_DEBRID_STREAM_DEBRID_DEFAULT_SERVICE} - Default Debrid API Key: {settings.PROXY_DEBRID_STREAM_DEBRID_DEFAULT_APIKEY}",
+48
View File
@@ -0,0 +1,48 @@
import re
from comet.utils.general import (
size_to_bytes,
log_scraper_error,
fetch_with_proxy_fallback,
)
data_pattern = re.compile(
r"💾 ([\d.]+ [KMGT]B)\s+👥 (\d+)\s+⚙️ (\w+)",
)
async def get_jackettio(manager, url: str):
torrents = []
try:
results = await fetch_with_proxy_fallback(
f"{url}/stream/{manager.media_type}/{manager.media_id}.json"
)
for torrent in results["streams"]:
title_full = torrent["title"]
title = title_full.split("\n")[0]
match = data_pattern.search(title_full)
size = size_to_bytes(match.group(1))
seeders = int(match.group(2))
tracker = match.group(3)
torrents.append(
{
"title": title,
"infoHash": torrent["infoHash"],
"fileIndex": None,
"seeders": seeders,
"size": size,
"tracker": f"Jackettio|{tracker}",
"sources": None,
}
)
except Exception as e:
log_scraper_error("Jackettio", url, manager.media_id, e)
await manager.filter_manager(torrents)
+14
View File
@@ -27,6 +27,7 @@ from .prowlarr import get_prowlarr
from .comet import get_comet
from .stremthru import get_stremthru
from .aiostreams import get_aiostreams
from .jackettio import get_jackettio
class TorrentManager:
@@ -82,6 +83,8 @@ class TorrentManager:
tasks.extend(get_all_stremthru_tasks(self, session))
if settings.SCRAPE_AIOSTREAMS:
tasks.extend(get_all_aiostreams_tasks(self))
if settings.SCRAPE_JACKETTIO:
tasks.extend(get_all_jackettio_tasks(self))
if settings.INDEXER_MANAGER_API_KEY:
queries = [self.title]
@@ -437,3 +440,14 @@ def get_all_aiostreams_tasks(manager):
for url in urls:
tasks.append(get_aiostreams(manager, url))
return tasks
def get_all_jackettio_tasks(manager):
urls = settings.JACKETTIO_URL
if isinstance(urls, str):
urls = [urls]
tasks = []
for url in urls:
tasks.append(get_jackettio(manager, url))
return tasks
+2
View File
@@ -68,6 +68,8 @@ class AppSettings(BaseSettings):
MEDIAFUSION_LIVE_SEARCH: Optional[bool] = True
SCRAPE_AIOSTREAMS: Optional[bool] = False
AIOSTREAMS_URL: Optional[Union[str, List[str]]] = None
SCRAPE_JACKETTIO: Optional[bool] = False
JACKETTIO_URL: Optional[Union[str, List[str]]] = None
CUSTOM_HEADER_HTML: Optional[str] = None
PROXY_DEBRID_STREAM: Optional[bool] = False
PROXY_DEBRID_STREAM_PASSWORD: Optional[str] = "".join(