chore: migrate repository to Codeberg, bump version to 4.2.0, update update logic

This commit is contained in:
xRangerDE
2026-03-01 20:23:21 +01:00
parent d1fcbfaadb
commit 2631924ef5
42 changed files with 70 additions and 7124 deletions
-30
View File
@@ -1,30 +0,0 @@
# Twitch VOD Manager Docs
Documentation site for users and contributors, built with Astro + MDX.
## Local development
```bash
npm install
npm run dev
```
## Production build
```bash
npm run build
npm run preview
```
## Writing docs
- Add pages in `src/pages/` (`.astro` or `.mdx`)
- Shared layout lives in `src/layouts/BaseLayout.astro`
- Global styles live in `src/styles/global.css`
- Keep command examples copy-paste ready
## Scope
- User setup and troubleshooting
- Feature documentation
- Developer architecture and release workflow
-7
View File
@@ -1,7 +0,0 @@
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
export default defineConfig({
integrations: [mdx()],
site: 'https://github.com/Sucukdeluxe/Twitch-VOD-Manager'
});
-6199
View File
File diff suppressed because it is too large Load Diff
-15
View File
@@ -1,15 +0,0 @@
{
"name": "twitch-vod-manager-docs",
"private": true,
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview"
},
"dependencies": {
"@astrojs/mdx": "^4.3.0",
"astro": "^5.5.0"
}
}
-62
View File
@@ -1,62 +0,0 @@
---
import '../styles/global.css';
interface Props {
title: string;
description?: string;
}
const { title, description = 'Twitch VOD Manager documentation' } = Astro.props;
const nav = [
{ href: '/', label: 'Overview' },
{ href: '/getting-started', label: 'Getting Started' },
{ href: '/features', label: 'Features' },
{ href: '/configuration', label: 'Configuration' },
{ href: '/troubleshooting', label: 'Troubleshooting' },
{ href: '/development', label: 'Development' },
{ href: '/release-process', label: 'Release Process' }
];
const pathname = Astro.url.pathname.endsWith('/') ? Astro.url.pathname : `${Astro.url.pathname}/`;
const isActive = (href: string): boolean => {
if (href === '/') {
return pathname === '/';
}
const normalizedHref = href.endsWith('/') ? href : `${href}/`;
return pathname.startsWith(normalizedHref);
};
---
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content={description} />
<title>{title}</title>
</head>
<body>
<div class="layout">
<aside class="sidebar">
<h1 class="brand">Twitch VOD Manager</h1>
<p class="tagline">Product and developer documentation</p>
<nav>
<ul class="nav-list">
{nav.map((item) => (
<li>
<a href={item.href} class={isActive(item.href) ? 'active' : undefined}>{item.label}</a>
</li>
))}
</ul>
</nav>
</aside>
<main class="content">
<article class="doc">
<slot />
</article>
</main>
</div>
</body>
</html>
-41
View File
@@ -1,41 +0,0 @@
---
layout: ../layouts/BaseLayout.astro
title: Configuration
description: File locations and configuration keys used by the app.
---
# Configuration
## File Locations
The app stores runtime data in:
`C:\ProgramData\Twitch_VOD_Manager`
| File | Purpose |
| --- | --- |
| `config.json` | User settings and Twitch credentials |
| `download_queue.json` | Persistent download queue state |
Default download path:
`%USERPROFILE%\Desktop\Twitch_VODs`
## Main Config Keys
| Key | Description |
| --- | --- |
| `client_id` | Twitch application client id |
| `client_secret` | Twitch application client secret |
| `download_path` | Base output folder |
| `streamers` | Sidebar streamer list |
| `theme` | UI theme (`twitch`, `discord`, `youtube`, `apple`) |
| `download_mode` | Full VOD or parts mode |
| `part_minutes` | Split length in minutes for parts mode |
## Notes
- Credentials are optional. If empty, the app uses public mode for streamer/VOD discovery.
- Credentials are currently stored in plain text config file.
- The app trims credential fields before saving to reduce whitespace issues.
- Legacy keys can exist in config from older versions; unknown keys are ignored.
-72
View File
@@ -1,72 +0,0 @@
---
layout: ../layouts/BaseLayout.astro
title: Development
description: Local development setup and architecture for contributors.
---
# Development
## Local Setup
```bash
cd "typescript-version"
npm install
npm run build
npm start
```
## Architecture
| Layer | File(s) | Responsibility |
| --- | --- | --- |
| Main process | `src/main.ts` | IPC handlers, Twitch API, downloads, ffmpeg/streamlink execution, updater |
| Preload bridge | `src/preload.ts` | Safe API surface exposed to renderer |
| Renderer shell | `src/index.html` + `src/styles.css` | UI markup and styling |
| Renderer modules | `src/renderer*.ts` | UI logic by feature (streamers, queue, settings, updates, shared state) |
## Renderer Module Split
- `renderer-shared.ts`: common state + DOM helper functions
- `renderer-streamers.ts`: streamer list + VOD loading
- `renderer-queue.ts`: queue rendering + start/stop behavior
- `renderer-settings.ts`: credentials, folder, and theme handling
- `renderer-updates.ts`: update banner and download/install flow
- `renderer.ts`: app init + clip/cutter/merge orchestration
## Useful Commands
```bash
# Build TypeScript only
npm run build
# Run app in dev mode
npm start
# Quick UI smoke test
npm run test:e2e
# Template guide + live preview checks
npm run test:e2e:guide
# Full end-to-end validation pass
npm run test:e2e:full
# Release validation suite (build + smoke + guide + full)
npm run test:e2e:release
# Extra stress pass (runs release suite 3x)
npm run test:e2e:stress
# Build Windows installer
npm run dist:win
```
## Docs Workspace
```bash
cd "docs"
npm install
npm run dev
```
Docs site is Astro + MDX and can be updated independently from app runtime code.
-44
View File
@@ -1,44 +0,0 @@
---
layout: ../layouts/BaseLayout.astro
title: Features
description: Complete feature overview for Twitch VOD Manager.
---
# Features
## Twitch VOD Browser
- Add streamers to a persistent sidebar list.
- Fetches user + archive VODs through Twitch Helix API when credentials are configured.
- Falls back to public Twitch GraphQL mode when no credentials are set.
- Automatic reconnect/re-auth if the app is temporarily disconnected.
## Download Queue
- Add full VODs to queue with one click.
- Queue supports start/stop and removal of completed entries.
- Download process persists in local queue file.
## Clip Creation from VODs
- Open **Clip** dialog from any VOD card.
- Set start/end time and optional part number.
- Queue clip jobs with metadata for naming strategy.
## Video Cutter (Local Files)
- Select any local video and inspect duration/fps/resolution.
- Extract preview frames via `ffprobe`/`ffmpeg`.
- Export cut segment as new MP4 file.
## Video Merge (Local Files)
- Choose multiple local video files.
- Reorder via up/down controls.
- Merge into one output file.
## In-App Auto-Update
- Uses GitHub release artifacts through `electron-updater`.
- Detects new versions, downloads update, then installs on restart.
- Requires release assets: installer, blockmap, and `latest.yml`.
-52
View File
@@ -1,52 +0,0 @@
---
layout: ../layouts/BaseLayout.astro
title: Getting Started
description: Install and configure Twitch VOD Manager quickly.
---
# Getting Started
## Requirements
- Windows 10/11 (installer and paths are currently Windows-first)
The app can auto-install missing runtime tools (`streamlink`, `ffmpeg`, `ffprobe`) into:
`C:\ProgramData\Twitch_VOD_Manager\tools`
Manual installation is still supported.
Optional but recommended:
- Twitch API app with `Client ID` and `Client Secret` (for authenticated Helix mode)
## Install
1. Download the latest setup from GitHub Releases.
2. Run `Twitch-VOD-Manager-Setup-<version>.exe`.
3. Launch the app.
## First-Time Setup
1. Open **Einstellungen**.
2. Choose your download path.
3. Optional: enter `Client ID` and `Client Secret` for authenticated mode.
4. Click **Speichern & Verbinden**.
5. Add a streamer in the header input and press `+`.
If everything is correct, VOD cards appear.
- With credentials: status is `Verbunden`.
- Without credentials: status shows `Ohne Login (Public Modus)` and VOD downloads still work.
## Verify Tools
In PowerShell or CMD:
```bash
streamlink --version
ffmpeg -version
ffprobe -version
```
If one command fails, install the missing tool and restart the app.
-51
View File
@@ -1,51 +0,0 @@
---
import BaseLayout from '../layouts/BaseLayout.astro';
---
<BaseLayout title="Twitch VOD Manager Docs" description="Official documentation for Twitch VOD Manager users and contributors.">
<h1>Twitch VOD Manager Documentation</h1>
<p>
This documentation covers end-user setup, Twitch API configuration, troubleshooting,
and developer workflows for the TypeScript/Electron app.
</p>
<div class="chips">
<span class="chip">Electron</span>
<span class="chip">TypeScript</span>
<span class="chip">Streamlink</span>
<span class="chip">FFmpeg</span>
<span class="chip">Auto-Update</span>
</div>
<div class="card-grid">
<a class="card" href="/getting-started">
<h3>Getting Started</h3>
<p>Install the app, set Twitch API credentials, and run your first VOD download.</p>
</a>
<a class="card" href="/features">
<h3>Features</h3>
<p>Learn VOD browsing, queue processing, clip creation, cutter, merge, and updates.</p>
</a>
<a class="card" href="/configuration">
<h3>Configuration</h3>
<p>Understand config paths, available settings, and how local files are stored.</p>
</a>
<a class="card" href="/troubleshooting">
<h3>Troubleshooting</h3>
<p>Fix common issues like "Keine VODs", missing tools, and update problems.</p>
</a>
<a class="card" href="/development">
<h3>Development</h3>
<p>Set up local development, architecture overview, and code structure details.</p>
</a>
<a class="card" href="/release-process">
<h3>Release Process</h3>
<p>Ship new installer builds and GitHub releases compatible with auto-updater.</p>
</a>
</div>
</BaseLayout>
-64
View File
@@ -1,64 +0,0 @@
---
layout: ../layouts/BaseLayout.astro
title: Release Process
description: Standardized release checklist for auto-update compatible builds.
---
# Release Process
This project uses GitHub Releases + `electron-updater`.
## 1) Bump Version
Update app version consistently:
- `typescript-version/package.json`
- `typescript-version/package-lock.json`
- `typescript-version/src/main.ts` (`APP_VERSION`)
- Optional visible fallback text in `src/index.html`
## 2) Build Installer Artifacts
```bash
cd "typescript-version"
npm run dist:win
```
`dist:win` already runs the full release validation gate (`test:e2e:release`) before packaging.
For extra confidence before major releases, run:
```bash
npm run test:e2e:stress
```
Expected outputs in `typescript-version/release/`:
- `latest.yml`
- `Twitch-VOD-Manager-Setup-<version>.exe`
- `Twitch-VOD-Manager-Setup-<version>.exe.blockmap`
## 3) Commit + Push
Commit code/version changes and push to `master`.
## 4) Create GitHub Release
Tag format: `v<version>` (example: `v3.7.6`).
Attach exactly the 3 update artifacts from step 2.
## 5) Verify Update Path
- Open app on older version.
- Trigger update check.
- Confirm banner appears and update can be downloaded/installed.
## Quick Checklist
- [ ] Version bumped everywhere
- [ ] `npm run build` passes
- [ ] `npm run dist:win` passes
- [ ] Release tag created
- [ ] `latest.yml` + `.exe` + `.blockmap` uploaded
- [ ] Manual update flow verified
-17
View File
@@ -1,17 +0,0 @@
---
layout: ../layouts/BaseLayout.astro
title: Migration Roadmap
---
# Migration Roadmap
## UI Stack
- Renderer wird schrittweise von HTML-Monolith zu TypeScript-Modulen migriert.
- Styles sind bereits in eine eigene CSS-Datei ausgelagert.
## Nächste Schritte
1. Renderer in weitere Feature-Module aufteilen (Cutter/Merge/Clips).
2. Komponenten-Ansatz einführen (Astro UI docs, später optional Rust-backend tooling).
3. API- und Release-Prozess in MDX dokumentieren.
-64
View File
@@ -1,64 +0,0 @@
---
layout: ../layouts/BaseLayout.astro
title: Troubleshooting
description: Fix common Twitch VOD Manager issues quickly.
---
# Troubleshooting
## "Keine VODs" after adding streamer
1. Ensure the streamer exists and has archive VODs.
2. Press **Aktualisieren**.
3. If you use credentials, re-save `Client ID` + `Client Secret` in **Einstellungen**.
4. Check bottom status bar:
- `Verbunden` in authenticated mode
- `Ohne Login (Public Modus)` in credential-free mode
The app retries auth automatically on expired tokens and can continue in public mode without credentials.
## "Streamer nicht gefunden"
- Use login name only (no URL, no `@`).
- Names are normalized to lowercase.
- Verify streamer spelling directly on Twitch.
## Clip/Cutter/Merge duration shows 0 or preview fails
Usually caused by broken `ffprobe` detection.
Check:
```bash
ffprobe -version
```
If missing, install FFmpeg package that includes `ffprobe` and restart app.
## "Streamlink not found"
Install streamlink and verify:
```bash
streamlink --version
```
Then restart the app.
## Auto-update does not trigger
Release must include all of:
- `latest.yml`
- `Twitch-VOD-Manager-Setup-<version>.exe`
- `Twitch-VOD-Manager-Setup-<version>.exe.blockmap`
Tag version must match app version (example: `v3.7.6`).
## Debug log for failed downloads
From `v3.7.8`, detailed downloader logs are written to:
`C:\ProgramData\Twitch_VOD_Manager\debug.log`
If a download instantly switches from `Stoppen` back to `Start`, check the latest lines in that file for streamlink exit reasons.
-205
View File
@@ -1,205 +0,0 @@
:root {
color-scheme: dark;
font-family: 'Segoe UI', Tahoma, sans-serif;
--bg-1: #0f1217;
--bg-2: #161c26;
--bg-3: #1d2734;
--text: #eef3fb;
--muted: #aab8cf;
--line: #2b3546;
--link: #7db6ff;
--link-hover: #a8cdff;
--chip: #22344b;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100vh;
background: radial-gradient(circle at top, #1a2432 0%, var(--bg-1) 55%);
color: var(--text);
}
.layout {
max-width: 1280px;
margin: 0 auto;
padding: 28px;
display: grid;
grid-template-columns: 290px minmax(0, 1fr);
gap: 24px;
}
.sidebar {
position: sticky;
top: 18px;
align-self: start;
background: linear-gradient(180deg, var(--bg-2), #131922);
border: 1px solid var(--line);
border-radius: 14px;
padding: 18px;
}
.brand {
margin: 0;
font-size: 1.2rem;
}
.tagline {
margin-top: 8px;
color: var(--muted);
font-size: 0.9rem;
}
.nav-list {
list-style: none;
margin: 20px 0 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 8px;
}
.nav-list a {
display: block;
padding: 8px 10px;
border-radius: 8px;
text-decoration: none;
color: var(--muted);
border: 1px solid transparent;
}
.nav-list a:hover {
color: var(--text);
border-color: var(--line);
background: rgba(125, 182, 255, 0.08);
}
.nav-list a.active {
color: var(--text);
background: rgba(125, 182, 255, 0.16);
border-color: rgba(125, 182, 255, 0.35);
}
.content {
min-width: 0;
}
.doc {
background: linear-gradient(180deg, var(--bg-2), #121822);
border: 1px solid var(--line);
border-radius: 14px;
padding: 26px;
}
h1,
h2,
h3 {
line-height: 1.3;
}
h1 {
margin-top: 0;
font-size: 2rem;
}
h2,
h3 {
margin-top: 1.7rem;
}
p,
li {
color: var(--muted);
line-height: 1.65;
}
a {
color: var(--link);
}
a:hover {
color: var(--link-hover);
}
pre {
overflow-x: auto;
background: #0c1118;
border: 1px solid var(--line);
border-radius: 10px;
padding: 14px;
}
code {
font-family: Consolas, 'Courier New', monospace;
font-size: 0.92em;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
}
th,
td {
border: 1px solid var(--line);
text-align: left;
padding: 10px;
}
th {
background: #111a25;
}
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 12px;
margin-top: 20px;
}
.card {
border: 1px solid var(--line);
border-radius: 12px;
background: linear-gradient(180deg, #172233, #111824);
padding: 14px;
}
.card h3 {
margin-top: 0;
margin-bottom: 8px;
font-size: 1rem;
}
.card p {
margin: 0;
}
.chips {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.chip {
border: 1px solid rgba(125, 182, 255, 0.35);
background: var(--chip);
color: #dbe9ff;
border-radius: 999px;
padding: 4px 10px;
font-size: 0.84rem;
}
@media (max-width: 980px) {
.layout {
grid-template-columns: 1fr;
padding: 16px;
}
.sidebar {
position: static;
}
}
-3
View File
@@ -1,3 +0,0 @@
{
"extends": "astro/tsconfigs/strict"
}