Alle öffentlichen Versionen mit Änderungsprotokoll und Download-Links.
Aus „Staffeln nachladen" wird „Staffeln verwalten": einzelne Staffeln lassen sich jetzt auch wieder entfernen – wie in der Shelf.
Bestehende Serien können jetzt Staffeln nachladen – mit Auswahl, welche man wirklich besitzt. Dazu zählen die Statistiken exakt wie in der Shelf.
Der TMDb-Import arbeitet jetzt exakt wie in der Shelf – Serien bekommen einen eigenen Staffel-Dialog, Filme vollständige Metadaten, und das Datenschema ist mit Shelf und Android-App vereinheitlicht.
MovieShelf spricht jetzt Deutsch und Englisch – und begrüßt neue Nutzer mit einem überarbeiteten Onboarding.
language wird additiv angelegt, Standard ist Deutsch.Sync-Korrektheit-Release nach der zweiten Runde des Projekt-Scans: lokale Änderungen können nicht mehr still verloren gehen, und Listen-Entfernungen erreichen jetzt den Server.
list_item_tombstones angelegt (additiv, kein Eingriff in bestehende Daten).Sicherheits- und Wartungsrelease nach einem vollständigen Projekt-Scan (Bugs & Sicherheitslücken).
media:upload und media:exists erzwingen jetzt – wie media:download – eine numerische ID; manipulierte IPC-Argumente können damit nicht mehr aus dem Covers-Ordner ausbrechen (#36).movie-resource:// gegen kodierte Traversal gehärtet. Prozent-kodierte Pfad-Separatoren (%2F, %5C) werden jetzt vor der Prüfung aufgelöst; erlaubt sind nur noch einfache Dateinamen (#38).shelf_token und tmdb_api_key werden nicht mehr in .ms-Backups exportiert; beim Wiederherstellen werden nur noch bekannte Settings-Keys übernommen (#37).co.uk) und lässt dort keine fremden Domains mehr durch (#36).npm audit meldet 0 Schwachstellen (vorher 10, davon 2 kritisch in der Dev-Toolchain) (#41).userData/logs/main.log geschrieben.win.verifyUpdateCodeSignature: false) – passend für die selbstgehostete Installation, Downloads bleiben auf den Master-Server beschränkt.Hinweis: Die Einstellung steckt im Build. Die Aktualisierung auf 0.13.1 muss daher einmalig manuell installiert werden (Setup von der Release-Seite); ab 0.13.1 funktionieren Auto-Updates wieder.
external_movies) statt Sammlungsfilme mit in_collection=0. Listen referenzieren Sammlungs- und externe Filme gemischt (polymorpher list_items-Pivot). Folgen:
collection_no (in der Detailansicht als „Nr." sichtbar).medien.<domain>), blockiert weiter Fremdhosts.in_collection=0-Filme nach external_movies und list_movies → list_items (destruktiv – vorher movieshelf.db sichern).disableDifferentialDownload = true): Passte die .blockmap nicht exakt zur veröffentlichten .exe (Folge einer früheren doppelten Build-Pipeline), ergab das Blockmap-Patching am Ende eine abweichende SHA512 → Prüfsummen-Fehler genau bei 100 %. Es wird jetzt die vollständige Datei geladen.update:error-Event wurde nie im Renderer abonniert, und die Meldung stand nur im Download-Block (verschwand also sofort wieder). Es gibt jetzt update.onError/update.onReady in der Bridge und einen dauerhaft sichtbaren Fehlerhinweis.quitAndInstall(false, true) wird per setImmediate aufgerufen (IPC-Antwort wird zuerst geflusht), der NSIS-Setup-Dialog erscheint zuverlässig und die App startet nach dem Update neu.userData/updater.log geschrieben — in der Produktion diagnostizierbar statt nur auf der unsichtbaren Konsole.0.12.0 gesetzt; package-lock.json synchronisiert.MovieShelf.Setup.0.11.0.exe) aus dem v0.11.0-Release entfernt.build.yml entfernt (lief parallel zu release.yml auf v* und erzeugte den zweiten, inkonsistenten Installer → Blockmap-Mismatch).release.yml veröffentlicht jetzt latest.yml (Update-Manifest): bisher kam es nur aus dem entfernten build.yml; ohne dieses Manifest kann electron-updater Updates gar nicht erst erkennen.remote_id werden beim spaeteren Shelf-Sync mit der passenden Remote-Folge zusammengefuehrt, statt einen UNIQUE-Konflikt auf (season_id, episode_number) auszuloesen.remote_id erhaelt.updated_at werden nicht mehr als aktualisiert gezaehlt, sondern als uebersprungen.remote_id.0.10.0 gesetzt.package-lock.json Root-Version wieder mit package.json synchronisiert.remote_id) und zusätzlich als Orphan (ohne remote_id, aber gleiche tmdb_id) vorlag. Der Orphan-Merge-Code versuchte dann, dem Orphan die bereits vergebene remote_id zuzuweisen → UNIQUE-Fehler. Fix: Orphan-Merge wird übersprungen wenn schon eine Zeile mit der eingehenden remote_id existiert — die bestehende INSERT ... ON CONFLICT-Logik übernimmt dann das Updateinstall() wurde ausschließlich über ein IPC-Event (update:ready) ausgelöst, das unter bestimmten Timing-Bedingungen nicht ankam. Da download() intern bereits auf die vollständige Fertigstellung wartet (downloadUpdate() resolved erst nach abgeschlossenem Download), wird install() jetzt direkt danach aufgerufen — zuverlässig und ohne Event-AbhängigkeitupsertSeason gab beim lokalen Import (ohne remote_id) immer undefined zurück statt der neuen Zeilen-ID. Dadurch schlug die seasonId != null-Prüfung in importSeasons immer fehl und keine Folge wurde gespeichert. Fix: lastInsertRowid wird jetzt zurückgegeben wenn remote_id nicht gesetzt istextractVersionSection hat die Versionsnummer für den Regex-Vergleich falsch escaped — zwei aufeinanderfolgende .replace('.') haben den ersten Punkt doppelt escaped. Fix: .replace(/\./g, '\\.') tauscht alle Punkte in einem Durchlauf ausautoUpdater.quitAndInstall() löste intern app.quit() aus, das vom mainWindow.on('close')-Handler abgefangen wurde (dieser ruft e.preventDefault() auf, sofern isQuitting nicht gesetzt ist). isQuitting wird jetzt vor dem quitAndInstall()-Aufruf auf true gesetzt, sodass der Close-Handler die App-Beendigung durchlässtisOnline hatte Priorität über searchMode — der Server-Endpoint /tmdb/search unterstützt nur Filme. TV-Suche geht jetzt immer direkt gegen TMDb, unabhängig vom Online-ModusautoUpdater.quitAndInstall() wurde aufgerufen ohne dass downloadUpdate() vorher ausgeführt wurde (autoDownload = false). Neuer IPC-Handler update:download ruft checkForUpdates() + downloadUpdate() in Sequenz auf; installUpdate() startet jetzt den Download, und ein onReady-Listener löst danach automatisch quitAndInstall() aus/search/person mit Profilbild-Vorschau und automatischem Download beim HinzufügenuseTmdbSearch.ts: searchMode-State ('movie' | 'tv'), normalisierter TV-Result-Shape, TV-Detail-Fetch mit /tv/{id}?append_to_response=credits,videos,content_ratings, Season/Episode-Import-Schleife in confirmImport()TmdbImportModal.vue: neues Staffelauswahl-Panel (nur wenn collection_type === 'Serie'), selectedSeasons als v-model-PropTmdbSearchView.vue: Film/Serie Toggle-Buttons, Suchfeld-Placeholder passt sich dem Modus anelectron/handlers/actors.ts)| Funktion | IPC-Kanal |
|---|---|
searchActors(db, query) |
db:actors:search |
unlinkActor(db, filmId, actorId) |
db:actors:unlink |
upsertActor dedupliziert jetzt nach tmdb_id wenn keine remote_id vorhanden ist (verhindert Duplikate beim manuellen TMDb-Import)@tanstack/vue-virtual – performant auch bei 500+ Filmen im Speicheris_watched um. Gesehene Filme erhalten ein grünes BadgeBulkActionBar ermöglicht Sammel-Löschen und Tag-Vergabe für alle markierten Filme/onboarding) beim ersten Start ohne TMDb-Key und leerer Sammlung. Kann übersprungen werden und erscheint nicht erneut/ fokussiert die Suche, Escape hebt den Fokus auf, r navigiert zur Filmübersicht. Automatisch deaktiviert wenn ein Eingabefeld fokussiert istName, Year, Rating, Tags, Watched Date), konvertiert die 0.5–5-Sterne-Skala auf 1–10, überspringt Duplikate per Titel + Jahrelectron-updater ersetzt den bisherigen manuellen Download-Mechanismus. autoUpdater.checkForUpdates() / quitAndInstall() – CI publiziert mit --publish alwaysplaywright.config.ts + Shared App-Fixture + 4 Spec-Dateien (smoke, movies, random-picker, import)listMovies() akzeptiert nun sortBy, sortDir und genres[] als Parameter; SQL-Injection-Schutz via AllowlistMovieCard.vue unterstützt bulkMode- und selected-Props; Hover-Overlay zeigt zusätzlichen Watched-Toggle-Buttonmovies-Store erweitert um sortBy, sortDir, selectedGenres, bulkMode, selectedIds sowie die Actions toggleMovieWatched, bulkDeleteSelected, bulkTagSelected, toggleSelectelectron/main.ts: Alter manueller Update-Download (~110 Zeilen) durch 10 Zeilen electron-updater-Wiring ersetztrelease.yml: Build-Jobs verwenden --publish always damit latest.yml in den GitHub-Release kommtpackage.json: publish-Konfiguration für GitHub-Releases ergänzt, Version auf 0.8.0 gesetztelectron/handlers/movies.ts)| Funktion | IPC-Kanal |
|---|---|
randomMovie(db, filters?) |
db:movies:random |
toggleWatched(db, id) |
db:movies:toggle-watched |
bulkDelete(db, ids[]) |
db:movies:bulk-delete |
bulkUpdateTag(db, ids[], tag) |
db:movies:bulk-tag |
importMovies(db, rows[]) |
db:movies:import |
92 → 111 Unit Tests (+19). Abdeckung der neuen Backend-Funktionen: Sortierung, Genres-Filter, Random Picker, Toggle Watched, Bulk Delete/Tag, Import inkl. Duplikat- und Leer-Titel-Behandlung.
main.ts verschoben, wo Vite die Assets korrekt verarbeitet@theme-Block, @reference in Scoped-Styles)vite-plugin-electron)baseUrl entfernt, paths mit relativen Pfaden)@electron/rebuild 3 → 4vitest 2 → 4, vue-tsc 2 → 3, @vitejs/plugin-vue 5 → 6movie-resource://-Pfade wurden in Schritt 1 von resolveMediaUrl fälschlicherweise mit der Shelf-URL zusammengesetzt – lokale Bilder wurden nie geladenmovie-resource://) – kein TMDb-Traffic mehr beim Öffnen der Appcover_path / backdrop_path werden anschließend auf den lokalen Pfad umgeschrieben – die App lädt Bilder danach nicht mehr vom Server7.456) werden jetzt auf eine Stelle gerundet angezeigt, sowohl in der Detailansicht als auch im Bearbeitungsformularcollection_type = Serie; Wechsel zwischen Filme und Serien stellt Scroll-Position und geladene Seiten wieder her.ms-Datei exportieren und wiederherstellen (Einstellungen → Backup); Format ist kompatibel mit dem SaaS-Backupdata-Wrapper); Online-Fallback lädt Staffeln direkt von der API wenn lokal keine vorhanden sind und speichert sie für Offline-NutzungNeu feat: implement backup and restore functionality with UI integration
spawn gestartet statt shell.openPath – der NSIS-Setup-Dialog erscheint zuverlässigpkexec dpkg -i öffnet nativen GUI-Passwort-Dialog; Fallback auf xdg-open (GDebi), danach Anleitung-Dialog mit Terminal-Befehlready-to-show)Release v0.3.3a-linux
ready-to-show)icon.png (1024×1024) umgestellt; category: AudioVideo für korrekte Launcher-Integration ergänztbuild-linux.sh erstellt jetzt ausschließlich das .deb-Paketicon.png)Diverse Bugfixe
Verbesserungen:
Bugfixes
Einstellungen: Neues zweigeteiltes Layout mit Kategorie-Navigation (Erscheinungsbild / Verbindung / TMDb / Updates / Entwickler) Titelleiste: Filmstreifen-Icon durch logo_small.png ersetzt TMDb-Suche: bereits importierte Filme werden nach jeder Suche direkt gegen die lokale DB geprüft und mit Haken markiert — kein Mehrfach-Import mehr möglich Sync: lokale TMDb-Importe werden beim Pull-Sync mit dem passenden Shelf-Eintrag zusammengeführt statt dupliziert Update-System: Download der neuen .exe direkt in der App mit Fortschrittsbalken, SHA256-Prüfung und automatischem Start des Installers Sidebar: grüner Pulse-Dot auf dem Einstellungen-Icon wenn ein Update verfügbar ist
Security-Fixes — SQL Injection, XSS, Path Traversal, URL-Validierung, Settings-Allowlist Feature: TMDb Standalone-Modus — API Key in Einstellungen, Direktsuche + lokaler Import mit Trailer/Credits, Duplikat-Erkennung per DB-Abgleich, Merge beim Shelf-Sync Typdefinitionen — electron.d.ts komplett auf den aktuellen Stand gebracht
MovieShelf Desktop – v0.1.0
Erstveröffentlichung · 13. April 2026
🎬 Kernfunktionen Vollständige Filmverwaltung mit Titel, Beschreibung, Genre, Erscheinungsjahr und Bewertung Lokale SQLite-Datenbank – deine Sammlung gehört dir, auch offline TMDb-Integration: Filme per Suche automatisch mit Metadaten, Cover und Backdrop befüllen Schauspieler-Verwaltung mit Detailansicht und Filmografieübersicht
🖥️ Benutzeroberfläche Cinematic Dark Theme mit dynamischen Hintergrundübergängen Light Mode Unterstützung mit system-synchronisierter Theme-Erkennung Responsives Layout mit animierter Sidebar-Navigation Sticky Titelleiste mit nativen Fenstersteuerungen (Min / Max / Close)
☁️ Cloud-Synchronisation Verbindung mit deiner persönlichen MovieShelf Cloud (movieshelf.info) Bidirektionale Synchronisation von Filmen, Covern und Metadaten Zentrales Login-System über die SaaS-Plattform
🔄 Auto-Update System Automatischer Versionscheck beim Start der Anwendung Benachrichtigung bei verfügbaren Updates direkt in der Einstellungsseite Manueller Update-Check jederzeit aufrufbar
🛠️ Technisches Gebaut mit Electron + Vue 3 + Vite Native Windows-Unterstützung (x64) als Installer (.exe) und portable Version Sicherer IPC-Bridge zwischen Electron-Main und Vue-Renderer