This commit is contained in:
Goldy
2024-06-29 15:30:22 +02:00
parent f1450ad49a
commit 30e95f3ec0
13 changed files with 35 additions and 254 deletions
-9
View File
@@ -1,9 +0,0 @@
.github/
*.env*
.gitignore
Dockerfile
LICENSE
*.md
docker-compose*.*
.vscode/
config.json
+1 -1
View File
@@ -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
-56
View File
@@ -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
View File
@@ -1,6 +1,5 @@
# Project Based
*.db
config.json
# Byte-compiled / optimized / DLL files
__pycache__/
-4
View File
@@ -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
View File
@@ -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
View File
@@ -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()
+8 -11
View File
@@ -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
View File
@@ -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}")
+1 -1
View File
@@ -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
-17
View File
@@ -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
-14
View File
@@ -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
-106
View File
@@ -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