This commit is contained in:
TylerCG 2025-05-12 09:54:50 -04:00
parent f02582b835
commit 052d11d15b
2 changed files with 59 additions and 12 deletions

View File

@ -2,10 +2,10 @@
FROM python:3.11-slim FROM python:3.11-slim
# Install ffmpeg and other dependencies # Install ffmpeg and other dependencies
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y ffmpeg \
ffmpeg \
&& rm -rf /var/lib/apt/lists/* \ && rm -rf /var/lib/apt/lists/* \
&& pip install yt_dlp && pip install yt_dlp
# && install -y cron
# Set environment variables # Set environment variables
ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONDONTWRITEBYTECODE=1
@ -14,7 +14,7 @@ ENV PYTHONUNBUFFERED=1
# Set work directory # Set work directory
WORKDIR /app WORKDIR /app
RUN mkdir /app/data /app/tv /app/youtube /app/asmr /app/nsfw /app/temp RUN mkdir /app/data /app/tv /app/youtube /app/asmr /app/nsfw /app/temp /app/data/logs
# Install dependencies # Install dependencies
COPY requirements.txt . COPY requirements.txt .
@ -23,8 +23,13 @@ RUN pip install --no-cache-dir -r requirements.txt
# Copy project files # Copy project files
COPY /app . COPY /app .
# Make sure your script is executable
# RUN chmod +x /app/my_script.sh
# RUN chmod +x /start.sh
# Expose port # Expose port
EXPOSE 8000 EXPOSE 8000
# Run the app with Uvicorn # Run the app with Uvicorn
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
# CMD ["/start.sh"]

View File

@ -1,24 +1,66 @@
from fastapi import FastAPI, Request, Form from fastapi import FastAPI, Request, Form, BackgroundTasks
from fastapi.responses import HTMLResponse, JSONResponse from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from fastapi import BackgroundTasks
from functools import partial from functools import partial
import json, download, asyncio import json, download, asyncio
from typing import Optional from typing import Optional
import logging, os
from logging.handlers import TimedRotatingFileHandler
# Ensure log directory exists
os.makedirs("/data/logs", exist_ok=True)
# Setup timed rotating logger
log_path = "/data/logs/syllabus.log"
logger = logging.getLogger("syllabus_logger")
logger.setLevel(logging.DEBUG)
# Remove any default handlers
logger.handlers = []
# Set up TimedRotatingFileHandler
handler = TimedRotatingFileHandler(
filename=log_path,
when="midnight", # Rotate at midnight
interval=1, # Every 1 day
backupCount=30, # Keep last 7 logs
encoding="utf-8",
utc=False # Use UTC for time reference
)
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
# App setup
app = FastAPI() app = FastAPI()
app.mount("/data", StaticFiles(directory="/data"), name="data") app.mount("/data", StaticFiles(directory="/data"), name="data")
templates = Jinja2Templates(directory="templates") templates = Jinja2Templates(directory="templates")
loop = asyncio.get_running_loop() loop = asyncio.get_event_loop()
# JSON cache # Optional cache
cached_data = None cached_data = None
# Middleware
@app.middleware("http")
async def log_requests(request: Request, call_next):
try:
response = await call_next(request)
except Exception as e:
logger.exception(f"EXCEPTION: {request.method} {request.url} - {str(e)}")
return JSONResponse(
status_code=500,
content={"detail": "Internal Server Error"},
)
logger.info(
f"request_client={request.client.host}:{request.client.port}, "
f"request_method={request.method}, request_url={request.url}, "
f"status_code={response.status_code}"
)
return response
# api # api
@app.post("/ebook/download", description="Download an ebook via a url.") @app.post("/ebook/download", description="Download an ebook via a url.")
async def ebookDownload( async def ebookDownload(
@ -89,7 +131,7 @@ async def ydl(background_tasks: BackgroundTasks, url: str = Form(...), location:
except Exception as e: except Exception as e:
return JSONResponse(status_code=500, content={"status": "error", "message": str(e)}) return JSONResponse(status_code=500, content={"status": "error", "message": str(e)})
#web ui
@app.get("/", include_in_schema=False, response_class=HTMLResponse) @app.get("/", include_in_schema=False, response_class=HTMLResponse)
async def index(request: Request): async def index(request: Request):
global cached_data global cached_data