mirror of
https://github.com/g0ldyy/comet.git
synced 2026-01-12 01:16:12 +01:00
.
This commit is contained in:
@@ -1,9 +0,0 @@
|
||||
.github/
|
||||
*.env*
|
||||
.gitignore
|
||||
Dockerfile
|
||||
LICENSE
|
||||
*.md
|
||||
docker-compose*.*
|
||||
.vscode/
|
||||
config.json
|
||||
+1
-1
@@ -7,7 +7,7 @@ DEBRID_PROXY_URL=http://127.0.0.1:1080
|
||||
INDEXER_MANAGER_TYPE=jackett # or prowlarr
|
||||
INDEXER_MANAGER_URL=http://127.0.0.1:9117
|
||||
INDEXER_MANAGER_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
INDEXER_MANAGER_INDEXERS=EXAMPLE1_CHANGETHIS,EXAMPLE2_CHANGETHIS
|
||||
INDEXER_MANAGER_TIMEOUT=30
|
||||
INDEXER_MANAGER_INDEXERS=EXAMPLE1_CHANGETHIS,EXAMPLE2_CHANGETHIS
|
||||
GET_TORRENT_TIMEOUT=5
|
||||
CUSTOM_HEADER_HTML=None # only set it if you know what it is
|
||||
@@ -1,56 +0,0 @@
|
||||
name: Docker Build and Push
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
# release:
|
||||
# types: [created]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
security-events: write
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.1.2
|
||||
|
||||
- name: Docker Setup QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
id: qemu
|
||||
with:
|
||||
platforms: amd64,arm64
|
||||
|
||||
- name: Log into ghcr.io registry
|
||||
uses: docker/login-action@v3.1.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3.2.0
|
||||
|
||||
- name: Log in to Docker Hub
|
||||
uses: docker/login-action@v3.1.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v5.3.0
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
tags: |
|
||||
ghcr.io/g0ldyy/comet:latest
|
||||
docker.io/g0ldyy/comet:latest
|
||||
@@ -1,6 +1,5 @@
|
||||
# Project Based
|
||||
*.db
|
||||
config.json
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
|
||||
@@ -11,10 +11,6 @@ ENV PYTHONUNBUFFERED=1 \
|
||||
PYTHONDONTWRITEBYTECODE=1 \
|
||||
POETRY_NO_INTERACTION=1 \
|
||||
POETRY_HOME="/usr/local" \
|
||||
FASTAPI_HOST=0.0.0.0 \
|
||||
FASTAPI_PORT=8000 \
|
||||
FASTAPI_WORKERS=1 \
|
||||
DATABASE_PATH=comet.db \
|
||||
FORCE_COLOR=1 \
|
||||
TERM=xterm-256color
|
||||
|
||||
|
||||
+13
-1
@@ -1,3 +1,5 @@
|
||||
import RTN
|
||||
|
||||
from fastapi import APIRouter, Request
|
||||
from fastapi.responses import RedirectResponse
|
||||
from fastapi.templating import Jinja2Templates
|
||||
@@ -18,10 +20,20 @@ async def health():
|
||||
return {"status": "ok"}
|
||||
|
||||
|
||||
indexers = settings.INDEXER_MANAGER_INDEXERS
|
||||
|
||||
webConfig = {
|
||||
"indexers": indexers,
|
||||
"languages": [indexer.replace(" ", "_") for indexer in RTN.patterns.language_code_mapping.keys()],
|
||||
"resolutions": ["480p", "720p", "1080p", "1440p", "2160p", "2880p", "4320p"]
|
||||
}
|
||||
|
||||
print(f"aaaa : {webConfig}")
|
||||
|
||||
@main.get("/configure")
|
||||
@main.get("/{b64config}/configure")
|
||||
async def configure(request: Request):
|
||||
return templates.TemplateResponse("index.html", {"request": request, "CUSTOM_HEADER_HTML": settings.CUSTOM_HEADER_HTML})
|
||||
return templates.TemplateResponse("index.html", {"request": request, "CUSTOM_HEADER_HTML": settings.CUSTOM_HEADER_HTML, "webConfig": webConfig})
|
||||
|
||||
|
||||
@main.get("/manifest.json")
|
||||
|
||||
+9
-11
@@ -15,7 +15,7 @@ from starlette.requests import Request
|
||||
|
||||
from comet.api.core import main
|
||||
from comet.api.stream import streams
|
||||
from comet.utils.db import setup_database, teardown_database, write_config
|
||||
from comet.utils.db import setup_database, teardown_database
|
||||
from comet.utils.logger import logger
|
||||
from comet.utils.models import settings
|
||||
|
||||
@@ -39,7 +39,6 @@ class LoguruMiddleware(BaseHTTPMiddleware):
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
write_config()
|
||||
await setup_database()
|
||||
yield
|
||||
await teardown_database()
|
||||
@@ -94,7 +93,7 @@ class Server(uvicorn.Server):
|
||||
def signal_handler(sig, frame):
|
||||
# This will handle kubernetes/docker shutdowns better
|
||||
# Toss anything that needs to be gracefully shutdown here
|
||||
logger.log('COMET', 'Exiting Gracefully.')
|
||||
logger.log("COMET", "Exiting Gracefully.")
|
||||
sys.exit(0)
|
||||
|
||||
signal.signal(signal.SIGINT, signal_handler)
|
||||
@@ -110,15 +109,14 @@ config = uvicorn.Config(
|
||||
server = Server(config=config)
|
||||
|
||||
def start_log():
|
||||
logger.log('COMET', f'Server started on {settings.FASTAPI_HOST}:{settings.FASTAPI_PORT}')
|
||||
logger.log('COMET', f'Database: {settings.DATABASE_PATH}')
|
||||
logger.log('COMET', f'Workers: {settings.FASTAPI_WORKERS}')
|
||||
logger.log('COMET', f'Get Torrent Timeout: {settings.GET_TORRENT_TIMEOUT}')
|
||||
logger.log('COMET', f"Debrid Proxy: {settings.DEBRID_PROXY_URL}")
|
||||
logger.log('COMET', f'Indexers: {settings.INDEXER_MANAGER_INDEXERS}')
|
||||
logger.log("COMET", f"Server started on http://{settings.FASTAPI_HOST}:{settings.FASTAPI_PORT} - {settings.FASTAPI_WORKERS} workers")
|
||||
logger.log("COMET", f"Database: {settings.DATABASE_PATH} - TTL: {settings.CACHE_TTL}s")
|
||||
logger.log("COMET", f"Debrid Proxy: {settings.DEBRID_PROXY_URL}")
|
||||
logger.log("COMET", f"Indexer Manager: {settings.INDEXER_MANAGER_TYPE}|{settings.INDEXER_MANAGER_URL} - Timeout: {settings.INDEXER_MANAGER_TIMEOUT}s")
|
||||
logger.log("COMET", f"Indexers: {settings.INDEXER_MANAGER_INDEXERS}")
|
||||
logger.log("COMET", f"Get Torrent Timeout: {settings.GET_TORRENT_TIMEOUT}s")
|
||||
logger.log("COMET", f"Custom Header HTML Enabled: {bool(settings.CUSTOM_HEADER_HTML)}")
|
||||
|
||||
if settings.CUSTOM_HEADER_HTML:
|
||||
logger.log('COMET', f'Custom Header HTML Enabled: {bool(settings.CUSTOM_HEADER_HTML)}')
|
||||
|
||||
with server.run_in_thread():
|
||||
start_log()
|
||||
|
||||
@@ -481,7 +481,7 @@
|
||||
</div>
|
||||
|
||||
<div class="form-item">
|
||||
<sl-input id="maxResults" type="number" min=0 value=10 label="Max Results" placeholder="Enter max results"></sl-input>
|
||||
<sl-input id="maxResults" type="number" min=0 value=0 label="Max Results" placeholder="Enter max results"></sl-input>
|
||||
</div>
|
||||
|
||||
<div class="form-item">
|
||||
@@ -507,16 +507,13 @@
|
||||
let defaultResolutions = [];
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
fetch("/static/config.json")
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
populateSelect("indexers", data.indexers);
|
||||
populateSelect("languages", data.languages);
|
||||
populateSelect("resolutions", data.resolutions);
|
||||
|
||||
defaultLanguages = data.languages;
|
||||
defaultResolutions = data.resolutions;
|
||||
});
|
||||
const webConfig = {{webConfig|tojson}};
|
||||
populateSelect("indexers", webConfig.indexers);
|
||||
populateSelect("languages", webConfig.languages);
|
||||
populateSelect("resolutions", webConfig.resolutions);
|
||||
|
||||
defaultLanguages = webConfig.languages;
|
||||
defaultResolutions = webConfig.resolutions;
|
||||
});
|
||||
|
||||
function populateSelect(selectId, options) {
|
||||
|
||||
+3
-22
@@ -1,7 +1,5 @@
|
||||
import json
|
||||
import os
|
||||
|
||||
from comet.utils.general import lang_code_map
|
||||
from comet.utils.logger import logger
|
||||
from comet.utils.models import database, settings
|
||||
|
||||
@@ -14,34 +12,17 @@ async def setup_database():
|
||||
|
||||
# Ensure the database file exists
|
||||
if not os.path.exists(settings.DATABASE_PATH):
|
||||
open(settings.DATABASE_PATH, 'a').close()
|
||||
open(settings.DATABASE_PATH, "a").close()
|
||||
|
||||
await database.connect()
|
||||
await database.execute("CREATE TABLE IF NOT EXISTS cache (cacheKey BLOB PRIMARY KEY, timestamp INTEGER, results TEXT)")
|
||||
except Exception as e:
|
||||
logger.error(f"Error setting up the database: {e}")
|
||||
|
||||
|
||||
async def teardown_database():
|
||||
"""Teardown the database by disconnecting."""
|
||||
try:
|
||||
await database.disconnect()
|
||||
except Exception as e:
|
||||
logger.error(f"Error tearing down the database: {e}")
|
||||
|
||||
def write_config():
|
||||
"""Write the config file."""
|
||||
indexers = settings.INDEXER_MANAGER_INDEXERS
|
||||
if indexers:
|
||||
if isinstance(indexers, str):
|
||||
indexers = indexers.split(",")
|
||||
elif not isinstance(indexers, list):
|
||||
logger.error(f"Invalid indexers: {indexers}")
|
||||
|
||||
config_data = {
|
||||
"indexers": indexers,
|
||||
"languages": lang_code_map,
|
||||
"resolutions": ["480p", "720p", "1080p", "1440p", "2160p", "2880p", "4320p"]
|
||||
}
|
||||
|
||||
with open("comet/templates/config.json", "w", encoding="utf-8") as config_file:
|
||||
json.dump(config_data, config_file, indent=4)
|
||||
logger.error(f"Error tearing down the database: {e}")
|
||||
@@ -21,8 +21,8 @@ class AppSettings(BaseSettings):
|
||||
INDEXER_MANAGER_TYPE: str = "jackett"
|
||||
INDEXER_MANAGER_URL: str = "http://127.0.0.1:9117"
|
||||
INDEXER_MANAGER_API_KEY: str = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
||||
INDEXER_MANAGER_INDEXERS: List[str] = ["EXAMPLE1_CHANGETHIS", "EXAMPLE2_CHANGETHIS"]
|
||||
INDEXER_MANAGER_TIMEOUT: int = 30
|
||||
INDEXER_MANAGER_INDEXERS: List[str] = ["EXAMPLE1_CHANGETHIS", "EXAMPLE2_CHANGETHIS"]
|
||||
GET_TORRENT_TIMEOUT: int = 5
|
||||
CUSTOM_HEADER_HTML: Optional[str] = None
|
||||
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
services:
|
||||
comet:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
image: comet:dev
|
||||
container_name: comet
|
||||
environment:
|
||||
- FASTAPI_HOST=0.0.0.0
|
||||
- FASTAPI_PORT=8000
|
||||
- FASTAPI_WORKERS=1
|
||||
- DATABASE_PATH=/app/data/comet.db
|
||||
tty: true
|
||||
ports:
|
||||
- "8000:8000"
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
@@ -1,14 +0,0 @@
|
||||
services:
|
||||
comet:
|
||||
image: g0ldyy/comet:latest
|
||||
container_name: comet
|
||||
tty: true
|
||||
ports:
|
||||
- "8000:8000"
|
||||
environment:
|
||||
- FASTAPI_HOST=0.0.0.0
|
||||
- FASTAPI_PORT=8000
|
||||
- FASTAPI_WORKERS=1
|
||||
- DATABASE_PATH=/app/data/comet.db
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
@@ -1,106 +0,0 @@
|
||||
.PHONY: help install run start start-dev stop restart logs logs-dev shell build push push-dev clean check lint sort test coverage pr-ready
|
||||
|
||||
# Detect operating system
|
||||
ifeq ($(OS),Windows_NT)
|
||||
# For Windows
|
||||
DATA_PATH := $(shell echo %cd%)\data
|
||||
else
|
||||
# For Linux
|
||||
DATA_PATH := $(PWD)/data
|
||||
endif
|
||||
|
||||
help:
|
||||
@echo "Comet Local Development Environment"
|
||||
@echo "-------------------------------------------------------------------------"
|
||||
@echo "install : Install the required packages"
|
||||
@echo "run : Run Comet"
|
||||
@echo "start : Build and run the Comet container (requires Docker)"
|
||||
@echo "start-dev : Build and run the Comet container in development mode (requires Docker)"
|
||||
@echo "stop : Stop and remove the Comet container (requires Docker)"
|
||||
@echo "logs : Show the logs of the Comet container (requires Docker)"
|
||||
@echo "logs-dev : Show the logs of the Comet container in development mode (requires Docker)"
|
||||
@echo "clean : Remove all the temporary files"
|
||||
@echo "format : Format the code using isort"
|
||||
@echo "lint : Lint the code using ruff and isort"
|
||||
@echo "test : Run the tests using pytest"
|
||||
@echo "coverage : Run the tests and generate coverage report"
|
||||
@echo "pr-ready : Run the linter and tests"
|
||||
@echo "-------------------------------------------------------------------------"
|
||||
# Docker related commands
|
||||
|
||||
start: stop
|
||||
@docker compose -f docker-compose.yml up --build -d --force-recreate --remove-orphans
|
||||
@docker compose -f docker-compose.yml logs -f
|
||||
|
||||
start-dev: stop
|
||||
@docker compose -f docker-compose-dev.yml up --build -d --force-recreate --remove-orphans
|
||||
@docker compose -f docker-compose-dev.yml logs -f
|
||||
|
||||
stop:
|
||||
@docker compose -f docker-compose.yml down
|
||||
@docker compose -f docker-compose-dev.yml down
|
||||
|
||||
restart:
|
||||
@docker restart comet
|
||||
@docker logs -f comet
|
||||
|
||||
logs:
|
||||
@docker logs -f comet
|
||||
|
||||
logs-dev:
|
||||
@docker compose -f docker-compose-dev.yml logs -f
|
||||
|
||||
shell:
|
||||
@docker exec -it comet fish
|
||||
|
||||
build:
|
||||
@docker build -t comet .
|
||||
|
||||
push: build
|
||||
@docker tag comet:latest g0ldyy/comet:latest
|
||||
@docker push g0ldyy/comet:latest
|
||||
|
||||
push-dev: build
|
||||
@docker tag comet:latest g0ldyy/comet:dev
|
||||
@docker push g0ldyy/comet:dev
|
||||
|
||||
tidy:
|
||||
@docker rmi $(docker images | awk '$1 == "<none>" || $1 == "comet" {print $3}') -f
|
||||
|
||||
|
||||
# Poetry related commands
|
||||
clean:
|
||||
@find . -type f -name '*.pyc' -exec rm -f {} +
|
||||
@find . -type d -name '__pycache__' -exec rm -rf {} +
|
||||
@find . -type d -name '.pytest_cache' -exec rm -rf {} +
|
||||
@find . -type d -name '.ruff_cache' -exec rm -rf {} +
|
||||
|
||||
install:
|
||||
@poetry install --without dev --no-root
|
||||
|
||||
install-dev:
|
||||
@poetry install --with dev --no-root
|
||||
|
||||
# Run the application
|
||||
run:
|
||||
@poetry run python comet/main.py
|
||||
|
||||
# Code quality commands
|
||||
check:
|
||||
@poetry run pyright
|
||||
|
||||
lint:
|
||||
@poetry run ruff check comet
|
||||
@poetry run isort --check-only comet
|
||||
|
||||
sort:
|
||||
@poetry run isort comet
|
||||
|
||||
test:
|
||||
@poetry run pytest comet
|
||||
|
||||
coverage: clean
|
||||
@poetry run pytest comet --cov=comet --cov-report=xml --cov-report=term
|
||||
|
||||
# Run the linter and tests
|
||||
pr-ready: clean lint test
|
||||
Reference in New Issue
Block a user