Further tweaks
This commit is contained in:
@@ -1,14 +1,10 @@
|
||||
<div align="center">
|
||||
|
||||
<img src="https://github.com/ponzischeme89/Sublogue/blob/master/docs/sublogue_v2.png" height="256" width="456">
|
||||
|
||||
<h4>Your subtitles deserve metadata. Sublogue adds it.</h4>
|
||||
|
||||
</div>
|
||||
|
||||
Sublogue is a lightweight open-source tool for enriching SRT files. Pull metadata from OMDb, TMDB, or TVMaze and automatically append plot summaries, runtimes, directors, and cast details to the start or end (yes, *end*) of your subtitles.
|
||||
Sublogue is a lightweight private tool for enriching SRT files. Pull metadata from OMDb, TMDb, or TVMaze and automatically append plot summaries, runtimes, directors, and cast details to the start or end of your subtitles.
|
||||
|
||||
Additionally, Sublogue can clean junk out of your subtitles — automatically or on demand. Yes, even those “Downloaded from OpenSubtitles” lines that haunt every movie night..
|
||||
Additionally, Sublogue can clean junk out of your subtitles automatically or on demand.
|
||||
|
||||
Why? Because if the cast list and IMDb/RT rating show up in the first minute, my wife asks fewer questions and we actually get to watch the movie.
|
||||
|
||||
@@ -22,31 +18,27 @@ Why? Because if the cast list and IMDb/RT rating show up in the first minute, my
|
||||
- Clean, fast web UI for scanning and batch processing built with Svelte (frontend) + Python/Flask (server)
|
||||
- Three themes included: OLED, Ocean, and Dracula White
|
||||
|
||||
## Screenshots
|
||||
<div align="center">
|
||||
|
||||
<img src="https://github.com/ponzischeme89/Sublogue/blob/master/docs/screenshots/screenshot_scan.png" height="256" width="456">
|
||||
<img src="https://github.com/ponzischeme89/Sublogue/blob/master/docs/screenshots/screenshot_settings.png" height="256" width="456">
|
||||
|
||||
</div>
|
||||
|
||||
## Getting started
|
||||
To get started installing Sublogue, choose on your ☠️ below!
|
||||
All top-level documentation and runtime logs are kept in the repository root:
|
||||
|
||||
Personally, I recommend **Komodo**. It's great.
|
||||
- `AGENT.md` for setup and operating notes
|
||||
- `docker-compose.yml` for a direct local deployment
|
||||
- `docker-compose.proxy.yml` for deployments behind Nginx Proxy Manager
|
||||
- `sublogue.log` for runtime logging after the server starts
|
||||
|
||||
**Quick Start with Docker:**
|
||||
**Quick start with Docker:**
|
||||
|
||||
```sh
|
||||
docker build -t sublogue:local .
|
||||
docker run -d \
|
||||
--name sublogue \
|
||||
-p 5050:5000 \
|
||||
-v /path/to/config:/config \
|
||||
-v /path/to/media:/media \
|
||||
ghcr.io/ponzischeme89/sublogue:latest
|
||||
sublogue:local
|
||||
```
|
||||
|
||||
**Installation Methods (Expand sections to see details)**
|
||||
**Installation methods**
|
||||
|
||||
<details>
|
||||
<summary>⚓ Docker Compose</summary>
|
||||
@@ -56,7 +48,9 @@ Create `data/` and `media/` folders next to the compose file, then run:
|
||||
version: "3.9"
|
||||
services:
|
||||
sublogue:
|
||||
image: ghcr.io/ponzischeme89/sublogue:latest
|
||||
build:
|
||||
context: .
|
||||
image: sublogue:local
|
||||
container_name: sublogue
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
@@ -71,21 +65,11 @@ services:
|
||||
Start the stack:
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Open `http://localhost:5000`.
|
||||
</details>
|
||||
<details>
|
||||
<summary>🧡 Unraid</summary>
|
||||
|
||||
Use the included template at `unraid-sublogue.xml`.
|
||||
|
||||
- `/mnt/user/appdata/sublogue` -> `/config`
|
||||
- `/mnt/user/appdata/sublogue/media` -> `/media`
|
||||
|
||||
Start the container and open `http://<UNRAID-IP>:5000`.
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>🦎 Komodo</summary>
|
||||
@@ -96,7 +80,9 @@ Create a new stack and paste a Komodo template like this:
|
||||
version: "3.9"
|
||||
services:
|
||||
sublogue:
|
||||
image: ghcr.io/ponzischeme89/sublogue:latest
|
||||
build:
|
||||
context: .
|
||||
image: sublogue:local
|
||||
container_name: sublogue
|
||||
|
||||
ports:
|
||||
@@ -147,7 +133,7 @@ Sublogue never shifts existing subtitle timing. It only inserts metadata blocks
|
||||
- Localisation: Only TMDb supports proper language/region data. OMDb/TVMaze are mostly English-only.
|
||||
- Long plots: Big summaries go in as-is. Your TV may split them across multiple screens.
|
||||
- Formats: Only .srt is supported. No WebVTT, ASS/SSA, or embedded subs yet.
|
||||
- Duplicate inserts: Reprocessing the same file will stack multiple plot blocks.
|
||||
- Duplicate inserts: Reprocessing the same file may stack multiple plot blocks.
|
||||
- Offline use: Requires internet for metadata lookups — no offline mode.
|
||||
- File access: Read-only or locked files cannot be processed.
|
||||
|
||||
|
||||
@@ -3,8 +3,10 @@ version: "3.9"
|
||||
# Sublogue behind Nginx Proxy Manager (NPM)
|
||||
services:
|
||||
sublogue:
|
||||
# Production image for Sublogue
|
||||
image: ponzischeme89/sublogue:latest
|
||||
# Build the private image from this repository root
|
||||
build:
|
||||
context: .
|
||||
image: sublogue:local
|
||||
# Explicit container name for easy discovery
|
||||
container_name: sublogue
|
||||
# Always restart unless manually stopped
|
||||
|
||||
+4
-2
@@ -3,8 +3,10 @@ version: "3.9"
|
||||
# Sublogue main app stack
|
||||
services:
|
||||
sublogue:
|
||||
# Production image for Sublogue
|
||||
image: ponzischeme89/sublogue:latest
|
||||
# Build the private image from this repository root
|
||||
build:
|
||||
context: .
|
||||
image: sublogue:local
|
||||
# Explicit container name for easy discovery
|
||||
container_name: sublogue
|
||||
# Always restart unless manually stopped
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
<script>
|
||||
import { Button } from "../lib/components/ui/button";
|
||||
import { Separator } from "../lib/components/ui/separator";
|
||||
import { Badge } from "../lib/components/ui/badge";
|
||||
import {
|
||||
ChevronLeft,
|
||||
ChevronRight,
|
||||
Github,
|
||||
Scan,
|
||||
Settings,
|
||||
History,
|
||||
@@ -116,7 +113,7 @@
|
||||
>
|
||||
{#if !collapsed}
|
||||
<span class="text-[11px] text-text-tertiary"
|
||||
>© 2026 ponzischeme89</span
|
||||
>Private deployment</span
|
||||
>
|
||||
<div class="flex items-center gap-2">
|
||||
<Badge
|
||||
@@ -126,15 +123,11 @@
|
||||
>
|
||||
</div>
|
||||
{:else}
|
||||
<a
|
||||
href="https://github.com/ponzischeme89/Sublogue"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-text-tertiary hover:text-text-primary transition-colors"
|
||||
aria-label="GitHub"
|
||||
<Badge
|
||||
variant="outline"
|
||||
class="text-[10px] text-text-tertiary border-border py-0"
|
||||
>v1.1.4</Badge
|
||||
>
|
||||
<Github class="h-3.5 w-3.5" />
|
||||
</a>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -58,27 +58,12 @@
|
||||
<div
|
||||
class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4"
|
||||
>
|
||||
<!-- Left -->
|
||||
<div class="flex items-center gap-3 text-[11px]">
|
||||
<span class="hidden sm:inline opacity-30">•</span>
|
||||
<span class="text-text-secondary"> Open source (AGPL-3.0) </span>
|
||||
<span class="text-text-secondary"> Private deployment </span>
|
||||
<span class="hidden sm:inline opacity-30">•</span>
|
||||
<span class="text-text-tertiary"> Made in NZ 🇳🇿 </span>
|
||||
</div>
|
||||
|
||||
<!-- Right -->
|
||||
<div class="flex items-center gap-6">
|
||||
<span class="flex items-center gap-2">
|
||||
<a
|
||||
href="https://github.com/ponzischeme89/Sublogue"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-text-secondary hover:text-text-primary transition-colors underline-offset-4 hover:underline"
|
||||
>
|
||||
Github
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -3,10 +3,8 @@
|
||||
import { Button } from "../lib/components/ui/button";
|
||||
import { Separator } from "../lib/components/ui/separator";
|
||||
import {
|
||||
Github,
|
||||
History,
|
||||
Menu,
|
||||
MessageCircle,
|
||||
Scan,
|
||||
Settings,
|
||||
X
|
||||
@@ -72,28 +70,6 @@
|
||||
|
||||
<Separator orientation="vertical" className="mx-2 h-4" />
|
||||
|
||||
<a
|
||||
href="https://discord.gg/your-invite"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="p-1.5 text-text-secondary hover:text-text-primary transition-colors"
|
||||
aria-label="Discord"
|
||||
>
|
||||
<MessageCircle class="w-4 h-4" />
|
||||
</a>
|
||||
|
||||
<a
|
||||
href="https://github.com/yourusername/sublogue"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="p-1.5 text-text-secondary hover:text-text-primary transition-colors"
|
||||
aria-label="GitHub"
|
||||
>
|
||||
<Github class="w-4 h-4" />
|
||||
</a>
|
||||
|
||||
<Separator orientation="vertical" className="mx-2 h-4" />
|
||||
|
||||
<span class="text-[11px] text-text-tertiary px-2">v1.0.1</span>
|
||||
</nav>
|
||||
|
||||
|
||||
@@ -34,27 +34,6 @@
|
||||
|
||||
<div class="flex items-center gap-2">
|
||||
<ThemeSelector />
|
||||
<Separator orientation="vertical" className="mx-2 hidden h-4 sm:block" />
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="hidden text-muted-foreground sm:inline-flex"
|
||||
href="https://github.com/yourusername/sublogue"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
GitHub
|
||||
</Button>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="hidden text-muted-foreground sm:inline-flex"
|
||||
href="https://discord.gg/your-invite"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Discord
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
+25
-3
@@ -1,13 +1,35 @@
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
|
||||
DEFAULT_LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
|
||||
DEFAULT_LOG_PATH = Path(__file__).resolve().parent.parent / "sublogue.log"
|
||||
|
||||
|
||||
def configure_logging(level: int = logging.INFO, fmt: str = DEFAULT_LOG_FORMAT) -> None:
|
||||
"""Configure application logging."""
|
||||
logging.basicConfig(level=level, format=fmt)
|
||||
def configure_logging(
|
||||
level: int = logging.INFO,
|
||||
fmt: str = DEFAULT_LOG_FORMAT,
|
||||
log_path: Path = DEFAULT_LOG_PATH,
|
||||
) -> None:
|
||||
"""Configure console and root-level file logging for the application."""
|
||||
root_logger = logging.getLogger()
|
||||
|
||||
if getattr(root_logger, "_sublogue_logging_configured", False):
|
||||
return
|
||||
|
||||
formatter = logging.Formatter(fmt)
|
||||
handlers = [
|
||||
logging.StreamHandler(),
|
||||
logging.FileHandler(log_path, encoding="utf-8"),
|
||||
]
|
||||
|
||||
for handler in handlers:
|
||||
handler.setFormatter(formatter)
|
||||
root_logger.addHandler(handler)
|
||||
|
||||
root_logger.setLevel(level)
|
||||
root_logger._sublogue_logging_configured = True
|
||||
|
||||
|
||||
def get_logger(name: Optional[str] = None) -> logging.Logger:
|
||||
|
||||
Reference in New Issue
Block a user