From cc5b6a8c95d88b5769cce0e2b27d2aa586bfcc07 Mon Sep 17 00:00:00 2001 From: g0ldyy <153996346+g0ldyy@users.noreply.github.com> Date: Mon, 1 Dec 2025 08:51:47 +0100 Subject: [PATCH 1/4] fix: Strip 'imdb_id:' prefix from media ID in stream endpoint --- comet/api/endpoints/stream.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/comet/api/endpoints/stream.py b/comet/api/endpoints/stream.py index 5193164..5cbf664 100644 --- a/comet/api/endpoints/stream.py +++ b/comet/api/endpoints/stream.py @@ -109,6 +109,9 @@ async def stream( if "tmdb:" in media_id: return {"streams": []} + if "imdb_id:" in media_id: + media_id = media_id.split(":")[1] + config = config_check(b64config) if not config: return { From 607b5b38a39b412d73f0e021048735de8dbf4d3f Mon Sep 17 00:00:00 2001 From: g0ldyy <153996346+g0ldyy@users.noreply.github.com> Date: Mon, 1 Dec 2025 09:15:58 +0100 Subject: [PATCH 2/4] feat: fix imdb_id: in media_id --- comet/api/endpoints/stream.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/comet/api/endpoints/stream.py b/comet/api/endpoints/stream.py index 5cbf664..04b5b78 100644 --- a/comet/api/endpoints/stream.py +++ b/comet/api/endpoints/stream.py @@ -109,8 +109,7 @@ async def stream( if "tmdb:" in media_id: return {"streams": []} - if "imdb_id:" in media_id: - media_id = media_id.split(":")[1] + media_id = media_id.replace("imdb_id:", "") config = config_check(b64config) if not config: From 6e2e420d7379824d9b76ca603703f914349cf20b Mon Sep 17 00:00:00 2001 From: g0ldyy <153996346+g0ldyy@users.noreply.github.com> Date: Mon, 1 Dec 2025 09:21:32 +0100 Subject: [PATCH 3/4] feat: add live torrent cache TTL and update related settings --- .env-sample | 3 ++- comet/api/endpoints/stream.py | 2 +- comet/core/database.py | 15 ++++++++------- comet/core/logger.py | 2 +- comet/core/models.py | 1 + comet/services/orchestration.py | 4 ++-- comet/services/torrent_manager.py | 4 ++-- 7 files changed, 17 insertions(+), 14 deletions(-) diff --git a/.env-sample b/.env-sample index 533908e..5aff92d 100644 --- a/.env-sample +++ b/.env-sample @@ -40,7 +40,8 @@ DATABASE_BATCH_SIZE=20000 # The batch size for the database import and export op # Cache Settings (Seconds) # # ============================== # METADATA_CACHE_TTL=2592000 # 30 days -TORRENT_CACHE_TTL=1296000 # 15 days +TORRENT_CACHE_TTL=1296000 # 15 days - How long before torrents in DB start to be removed. -1 to disable. +LIVE_TORRENT_CACHE_TTL=1296000 # 15 days - How long before Live is re-queried for a search. DEBRID_CACHE_TTL=86400 # 1 day METRICS_CACHE_TTL=60 # 1 minute SCRAPE_LOCK_TTL=300 # 5 minutes - Duration for distributed scraping locks diff --git a/comet/api/endpoints/stream.py b/comet/api/endpoints/stream.py index 04b5b78..d91e9ef 100644 --- a/comet/api/endpoints/stream.py +++ b/comet/api/endpoints/stream.py @@ -147,7 +147,7 @@ async def stream( "media_id": id, "season": season, "episode": episode, - "cache_ttl": settings.TORRENT_CACHE_TTL, + "cache_ttl": settings.LIVE_TORRENT_CACHE_TTL, "current_time": time.time(), }, ) diff --git a/comet/core/database.py b/comet/core/database.py index 84475cf..d8585b3 100644 --- a/comet/core/database.py +++ b/comet/core/database.py @@ -610,13 +610,14 @@ async def setup_database(): {"cache_ttl": settings.METADATA_CACHE_TTL, "current_time": time.time()}, ) - await database.execute( - """ - DELETE FROM torrents - WHERE timestamp + :cache_ttl < :current_time; - """, - {"cache_ttl": settings.TORRENT_CACHE_TTL, "current_time": time.time()}, - ) + if settings.TORRENT_CACHE_TTL >= 0: + await database.execute( + """ + DELETE FROM torrents + WHERE timestamp + :cache_ttl < :current_time; + """, + {"cache_ttl": settings.TORRENT_CACHE_TTL, "current_time": time.time()}, + ) await database.execute( """ diff --git a/comet/core/logger.py b/comet/core/logger.py index 5b0a35e..58e7b5f 100644 --- a/comet/core/logger.py +++ b/comet/core/logger.py @@ -180,7 +180,7 @@ def log_startup_info(settings): ) logger.log( "COMET", - f"Database ({settings.DATABASE_TYPE}): {settings.DATABASE_PATH if settings.DATABASE_TYPE == 'sqlite' else settings.DATABASE_URL} - TTL: metadata={settings.METADATA_CACHE_TTL}s, torrents={settings.TORRENT_CACHE_TTL}s, debrid={settings.DEBRID_CACHE_TTL}s, metrics={settings.METRICS_CACHE_TTL}s", + f"Database ({settings.DATABASE_TYPE}): {settings.DATABASE_PATH if settings.DATABASE_TYPE == 'sqlite' else settings.DATABASE_URL} - TTL: metadata={settings.METADATA_CACHE_TTL}s, torrents={settings.TORRENT_CACHE_TTL}s, live_torrents={settings.LIVE_TORRENT_CACHE_TTL}s, debrid={settings.DEBRID_CACHE_TTL}s, metrics={settings.METRICS_CACHE_TTL}s", ) logger.log("COMET", f"Bypass Proxy: {settings.BYPASS_PROXY_URL}") diff --git a/comet/core/models.py b/comet/core/models.py index dae52f8..9036b4b 100644 --- a/comet/core/models.py +++ b/comet/core/models.py @@ -34,6 +34,7 @@ class AppSettings(BaseSettings): DATABASE_BATCH_SIZE: Optional[int] = 20000 METADATA_CACHE_TTL: Optional[int] = 2592000 # 30 days TORRENT_CACHE_TTL: Optional[int] = 1296000 # 15 days + LIVE_TORRENT_CACHE_TTL: Optional[int] = 1296000 # 15 days DEBRID_CACHE_TTL: Optional[int] = 86400 # 1 day METRICS_CACHE_TTL: Optional[int] = 60 # 1 minute SCRAPE_LOCK_TTL: Optional[int] = 300 # 5 minutes diff --git a/comet/services/orchestration.py b/comet/services/orchestration.py index 00317af..ba57094 100644 --- a/comet/services/orchestration.py +++ b/comet/services/orchestration.py @@ -110,7 +110,7 @@ class TorrentManager: "media_id": self.media_only_id, "season": self.season, "episode": self.episode, - "cache_ttl": settings.TORRENT_CACHE_TTL, + "cache_ttl": settings.LIVE_TORRENT_CACHE_TTL, "current_time": time.time(), }, ) @@ -156,7 +156,7 @@ class TorrentManager: ] query = f""" - INSERT {"OR IGNORE " if settings.DATABASE_TYPE == "sqlite" else ""} + INSERT {"OR REPLACE " if settings.DATABASE_TYPE == "sqlite" else ""} INTO torrents VALUES (:media_id, :info_hash, :file_index, :season, :episode, :title, :seeders, :size, :tracker, :sources, :parsed, :timestamp) {" ON CONFLICT DO NOTHING" if settings.DATABASE_TYPE == "postgresql" else ""} diff --git a/comet/services/torrent_manager.py b/comet/services/torrent_manager.py index 3365bb2..341a3e5 100644 --- a/comet/services/torrent_manager.py +++ b/comet/services/torrent_manager.py @@ -148,7 +148,7 @@ async def add_torrent( await database.execute( f""" - INSERT {"OR IGNORE " if settings.DATABASE_TYPE == "sqlite" else ""} + INSERT {"OR REPLACE " if settings.DATABASE_TYPE == "sqlite" else ""} INTO torrents VALUES (:media_id, :info_hash, :file_index, :season, :episode, :title, :seeders, :size, :tracker, :sources, :parsed, :timestamp) {" ON CONFLICT DO NOTHING" if settings.DATABASE_TYPE == "postgresql" else ""} @@ -402,7 +402,7 @@ class TorrentUpdateQueue: sub_batch = self.batches["inserts"][i : i + sub_batch_size] async with database.transaction(): insert_query = f""" - INSERT {"OR IGNORE " if settings.DATABASE_TYPE == "sqlite" else ""} + INSERT {"OR REPLACE " if settings.DATABASE_TYPE == "sqlite" else ""} INTO torrents VALUES ( :media_id, From 5df412125bbd668661473a5512f1f9c0b22d6b93 Mon Sep 17 00:00:00 2001 From: g0ldyy <153996346+g0ldyy@users.noreply.github.com> Date: Mon, 1 Dec 2025 09:54:33 +0100 Subject: [PATCH 4/4] feat: enhance admin dashboard with dynamic tracker limit selection and optimize database metrics query --- comet/api/endpoints/admin.py | 11 +++------- comet/core/database.py | 2 ++ comet/templates/admin_dashboard.html | 32 +++++++++++++++++++++++++--- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/comet/api/endpoints/admin.py b/comet/api/endpoints/admin.py index 7df0206..95301af 100644 --- a/comet/api/endpoints/admin.py +++ b/comet/api/endpoints/admin.py @@ -223,25 +223,20 @@ async def admin_api_metrics(admin_session: str = Cookie(None)): # Torrents by tracker top_trackers = await database.fetch_all(""" - SELECT tracker, COUNT(*) as count + SELECT tracker, COUNT(*) as count, AVG(seeders) as avg_seeders, AVG(size) as avg_size FROM torrents GROUP BY tracker ORDER BY count DESC - LIMIT 5 """) tracker_stats = [] for row in top_trackers: - stats = await database.fetch_one( - "SELECT AVG(seeders) as avg_seeders, AVG(size) as avg_size FROM torrents WHERE tracker = :tracker", - {"tracker": row["tracker"]}, - ) tracker_stats.append( { "tracker": row["tracker"], "count": row["count"], - "avg_seeders": stats["avg_seeders"], - "avg_size": stats["avg_size"], + "avg_seeders": row["avg_seeders"], + "avg_size": row["avg_size"], } ) diff --git a/comet/core/database.py b/comet/core/database.py index d8585b3..a2eefad 100644 --- a/comet/core/database.py +++ b/comet/core/database.py @@ -631,6 +631,8 @@ async def setup_database(): await database.execute("DELETE FROM active_connections") + await database.execute("DELETE FROM metrics_cache") + except Exception as e: logger.error(f"Error setting up the database: {e}") logger.exception(traceback.format_exc()) diff --git a/comet/templates/admin_dashboard.html b/comet/templates/admin_dashboard.html index fcbbf12..0720e53 100644 --- a/comet/templates/admin_dashboard.html +++ b/comet/templates/admin_dashboard.html @@ -956,7 +956,16 @@
No tracker data available