From 31b010dbe9cc0ee74b3378ecb9eed705c2ce40ce Mon Sep 17 00:00:00 2001 From: g0ldyy <153996346+g0ldyy@users.noreply.github.com> Date: Sat, 30 Aug 2025 01:20:25 +0200 Subject: [PATCH] feat: jackettio scraper --- .env-sample | 5 ++++ comet/main.py | 6 +++++ comet/scrapers/jackettio.py | 48 +++++++++++++++++++++++++++++++++++++ comet/scrapers/manager.py | 14 +++++++++++ comet/utils/models.py | 2 ++ 5 files changed, 75 insertions(+) create mode 100644 comet/scrapers/jackettio.py diff --git a/.env-sample b/.env-sample index 2c9efe1..88623cd 100644 --- a/.env-sample +++ b/.env-sample @@ -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 # # ============================== # diff --git a/comet/main.py b/comet/main.py index 58c77ce..2e494bc 100644 --- a/comet/main.py +++ b/comet/main.py @@ -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}", diff --git a/comet/scrapers/jackettio.py b/comet/scrapers/jackettio.py new file mode 100644 index 0000000..73f22bf --- /dev/null +++ b/comet/scrapers/jackettio.py @@ -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) diff --git a/comet/scrapers/manager.py b/comet/scrapers/manager.py index cd8d772..da83975 100644 --- a/comet/scrapers/manager.py +++ b/comet/scrapers/manager.py @@ -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 diff --git a/comet/utils/models.py b/comet/utils/models.py index b48affb..2051527 100644 --- a/comet/utils/models.py +++ b/comet/utils/models.py @@ -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(