Commit Graph
55 Commits
Author SHA1 Message Date
nessi 022c628b23 feat: add iconify icons to navigation tabs with color-coded indicators for each section
Replace text-only navigation buttons with iconify SVG icons: dashboard (view-dashboard-outline, blue), Radarr (movie-open-outline, orange), Sonarr (television-classic, cyan), missing (alert-outline, red), downloads (download-box-outline, yellow), and datastore (harddisk, blue). Add .nav-tab-icon styling with 15px dimensions, 6px right margin, and -3px vertical alignment.
2026-08-16 12:24:12 +02:00
nessi f7638dd5d5 feat: add sysfs serial fallback for RAID disks and responsive disk grid layout with improved styling
Add _device_serial() to read disk serials from /sys/class/block/{name}/device/serial and /sys/block/{name}/device/serial when lsblk cannot expose them in Docker containers. Update raid_status() to use sysfs fallback before defaulting to "—" for missing serials. Add .raid-disks 2-column grid with 6px gap, .raid-disk 7px/9px padding, .raid-disk small 1px top margin, and .raid-smart 85% opacity. Add mobile
2026-08-16 12:11:47 +02:00
nessi 0c922d4f5d feat: add human-readable RAID recovery formatting with German time units and improved member detection from mdstat
Add format_transfer_rate() to convert mdstat rates (e.g., 133628K/sec) into readable values like "130.5 MB/s" using 1024-based units. Add format_remaining_time() to convert mdstat durations (e.g., 450.1min) into compact German format like "7 Std. 30 Min." with day/hour/minute components. Update raid_status() to parse member devices directly from array_line in /proc/mdstat to avoid cross
2026-08-16 12:10:17 +02:00
nessi 5ddf506f20 feat: add datastore view with storage categories, RAID status monitoring, and live recovery tracking
Add scan_datastore_storage() to walk DATASTORE_PATH and categorize media by directory structure (movies/series/anime/kdrama/downloads/other) with size/file counts. Add raid_status() to parse /proc/mdstat and mdadm --detail for RAID level, active/failed devices, and recovery progress. Add /api/datastore endpoint with 15-minute cache for storage scans and live RAID updates. Install mdadm/util-linux/
2026-08-16 11:55:45 +02:00
nessi 6f0c222e93 feat: add section headings for movies and series in missing view with language-aware labels and styled indicators
Add addMissingSections() function to inject "Filme ohne Deutsch"/"Movies without German" heading before #missingMovies table and "Serien ohne Deutsch"/"Series without German" before first .missing-series element. Style .missing-section-heading with 9px border-radius, uppercase 12px/800 text, 10px/13px padding, and glowing dot indicator. Apply blue gradient/border for .movies section
2026-08-15 13:39:06 +02:00
nessi 6b010c8ade feat: split downloads view into active and queued sections with separate tables and dynamic row distribution
Replace single downloads table with two-section layout: "Aktive Downloads" for downloading items and "Weitere Queue-Einträge" for queued/paused items. Inject dual-table HTML structure with section headers showing item counts. Update renderDownloads() to distribute rows by status into activeDownloadsBody/otherDownloadsBody with fallback empty states. Add .download-table grid layout, .download-section styling
2026-08-15 13:36:42 +02:00
nessi c8d2b9f454 feat: add dynamic favicon injection script and update dashboard eyebrow from "MEDIA CONTROL CENTER" to "MEDIA MAX"
Add DOMContentLoaded script to dynamically inject shortcut icon link element with media-mark.svg if not already present. Update dashboard hero eyebrow text from "MEDIA CONTROL CENTER" to "MEDIA MAX" for consistent branding.
2026-08-15 13:11:31 +02:00
nessi 42ed29ac51 refactor: rebrand application from "Radarr Language Dashboard" to "Media Max" across all files
Update project name from "Radarr Language Dashboard v2" to "Media Max" in README.md, docker-compose.yml service/container names, app.py logger name and service definition, manifest.json name/short_name/description, and templates/index.html title and header elements. Update docker exec command example in README to use new container name.
2026-08-15 13:06:54 +02:00
nessi ceb4dfe120 feat: add missing table styling with bordered layout, header background, and consistent padding for improved visual structure
Add .missing-table wrapper with 10px padding and style nested table with 100% width, 8px bottom margin, border, 10px border-radius, and overflow:hidden. Set thead th with 38px height, 12px horizontal padding, #2d3540 background, and right borders (except last-child). Set .missing-series summary min-height to 42px with flex center alignment. Add duplicate style block at end
2026-08-15 13:01:44 +02:00
nessi 3874415dc3 feat: add dynamic dashboard missing counter sync with season zero toggle and visibility filtering
Add syncDashboardMissingCounter() function to update #dashboardMissing with count of visible missing items (movies + non-hidden episodes excluding season-zero-hidden). Call on page load and after #showSeasonZero change with setTimeout(0) to reflect filtered totals in dashboard widget.
2026-08-15 12:55:52 +02:00
nessi 844227ba67 feat: add dynamic missing media heading translation with language toggle support and disable table row animations
Add updateMissingHeading() function to toggle #missingMovies heading between 'Media'/'Medien' based on document.documentElement.lang. Call on page load and after #languageToggle click with setTimeout(0) to ensure DOM updates. Add .missing-table styles with table-layout:fixed and transform:none/animation:none on tbody tr to disable row animations and hover effects.
2026-08-15 12:55:07 +02:00
nessi d0c29b7a38 feat: add season zero visibility toggle in settings with dynamic filtering for Sonarr and missing episodes views
Add showSeasonZero checkbox in settings panel with toggle styling (42x23px switch, green when active). Implement applySeasonZeroPreference() to filter S00E episodes via .season-zero-hidden class and hide empty series with .season-zero-empty. Update missing count in nav badge and stats to exclude hidden season zero episodes. Add dynamic hint text toggle between "eingeblendet"/"ausgeblendet". Remove season zero exclusion from is_german_review_candidate() in app.py to
2026-08-15 12:53:19 +02:00
nessi 77a36cae55 feat: add transparent toolbar styling for radarr view with reduced padding and enhanced input backgrounds
Add .view#radarr.active with 12px row-gap and style .toolbar with 0/10px padding, transparent background/border, and no shadow. Style toolbar inputs/selects with rgba(42,46,54,.82) background, #454d59 border, and #303640 focus state for improved visual integration.
2026-08-15 12:50:51 +02:00
nessi 4762952e11 feat: add category-specific styling for Sonarr series groups and missing episodes table with enhanced visual hierarchy
Add .view#sonarr with 4px bottom padding and transparent #seriesList background. Style .series-category containers with 18px bottom margin, 13px border-radius, gradient backgrounds, and 10px/28px shadow. Add category headings with 13px/16px padding, bottom border, gradient background, and 3px left accent border. Style nested .series with 8px/10px margins, 9px border-radius, reduced shadows, and hover state
2026-08-15 12:49:39 +02:00
nessi 8312294a1d feat: add fixed 34px height to toolbar and stats with vertical alignment in radarr grid layout, restore auto height on mobile
Set explicit 34px height on .view#radarr>.toolbar (margin-bottom:0) and .view#radarr>.stats (align-self:stretch, align-items:stretch) with .stat children using flexbox center alignment for consistent desktop row height. Restore auto height and initial alignment in mobile breakpoint to preserve responsive wrapping behavior.
2026-08-15 12:46:24 +02:00
nessi c090431f01 feat: add view visibility toggle system with .active class for tab content display
Replace static #radarr grid with .view#radarr that displays:none by default and shows grid layout when .active class is applied. Update mobile breakpoint to use .view#radarr.active selector for responsive block layout, enabling dynamic tab switching without page reloads.
2026-08-15 12:44:45 +02:00
nessi 5b0289a383 feat: rename #movies grid container to #radarr for consistent service-specific naming
Rename CSS selector from #movies to #radarr in both desktop grid layout and mobile responsive breakpoint to align with service-specific naming convention used throughout the application.
2026-08-15 12:43:07 +02:00
nessi f449e2d2f0 feat: add two-column grid layout for movies tab with toolbar and stats side-by-side on desktop
Add #movies grid container with toolbar in column 1, stats in column 2 (nowrap, aligned center), and table spanning both columns. Collapse to single-column block layout on mobile (<760px) to maintain responsive behavior.
2026-08-15 12:41:44 +02:00
nessi 0905f4fa75 feat: reduce toolbar padding and input height with adjusted border radius and shadow for more compact layout
Decrease toolbar vertical padding from 10px to 1px, reduce border-radius from 10px to 8px, adjust box-shadow from 0 10px 28px to 0 8px 20px, and decrease gap from 9px to 8px. Set explicit input/select height to 30px with 5px/9px padding for consistent compact sizing.
2026-08-15 12:40:25 +02:00
nessi cdfa29d25f feat: replace Simple Icons CDN with Iconify API for SABnzbd, Seerr, Prowlarr, Easynews, Bazarr, and Lingarr service icons
Replace Simple Icons URLs with Iconify API endpoints for SABnzbd (mdi:download-box), Seerr (mdi:movie-search), Prowlarr (mdi:radar), Easynews (mdi:cloud-download), Bazarr (mdi:subtitles), and Lingarr (mdi:forum) while preserving original brand colors via color query parameters. Keep Simple Icons for Radarr, Sonarr, Jellyfin, qBittorrent, and LibreTranslate.
2026-08-15 12:39:53 +02:00
nessi e49216dca5 feat: add category-based grouping for Sonarr series with anime and K-drama tag detection
Add tag fetching from Sonarr API and category_for() function to classify series based on normalized tags (anime, kdrama, standard). Parse tag labels/names into normalized strings removing non-alphanumeric characters for matching. Add category and category_label fields to series groups.

Update index route to build series_categories list grouping series by category key (anime/Anime, kdrama/K-Dramen, standard/Standard) and pass
2026-08-15 12:37:58 +02:00
nessi 2b8b0cd5e9 feat: move navigation tabs from main content to header with responsive mobile layout and icon-only display on small screens
Add header-nav class to mainNav and move it before headerActions in header. Add dynamic stylesheet hiding .head-title/.head-sub, styling .header-nav with flex layout, 4px gap, 22px left margin, transparent background, and 8px/11px button padding. Add responsive breakpoints at 850px (scrollable nav with hidden scrollbar, max-width calc(100vw - 250px)) and 560px (icon-only buttons
2026-08-15 12:35:13 +02:00
nessi e508035474 feat: replace custom SVG service icons with official brand icons from Simple Icons CDN
Add officialServiceIcons dictionary mapping service keys to Simple Icons CDN URLs for Radarr, Sonarr, SABnzbd, Jellyfin, Seerr, Prowlarr, Easynews, qBittorrent, Bazarr, Lingarr, and LibreTranslate. Override serviceIconSvg entries with img tags loading brand icons. Add inline styles to SVG fallback icons (19px, stroke styling) and img elements (20px, object-fit contain). Add 500ms interval to reapply icon styles after DOM
2026-08-15 12:34:01 +02:00
nessi d69f82d995 feat: add service status monitoring to dashboard with parallel health checks for 14 services
Add SERVICE_DEFINITIONS list with Radarr, Sonarr, SABnzbd, Jellyfin, Seerr, Prowlarr, Easynews as Indexer, qBittorrent, Bazarr, Lingarr, LibreTranslate, Sonarr-Prowlarr Proxy, Radarr-Prowlarr Proxy, and Dashboard. Add check_service() to perform HTTP/API health checks with configurable timeout. Add refresh_services() to run checks in parallel using service_check_executor ThreadPoolExecutor with 16 workers.
2026-08-15 12:28:14 +02:00
nessi ba906d4748 feat: add yellow glow styling to download navigation badge for improved visibility
Add download-nav-count specific styles with yellow background (#f4c430), darker text (#17191d), lighter border (#ffd95a), and glowing box-shadow for visual prominence matching dashboard disk icon color scheme.
2026-08-14 13:39:18 +02:00
nessi 10bf5c32d3 feat: add active download count badge to downloads navigation tab with auto-hide when zero
Add download-nav-count span to downloads nav button with hidden class and downloadNavCount id. Update renderDownloads() to extract active_count from data, update badge text content, and toggle hidden class based on count. Add fetchDownloads() call on page load to populate initial badge state.
2026-08-14 13:33:10 +02:00
nessi 61d65d5988 feat: add external subtitle file detection with language parsing and cache invalidation on subtitle changes
Add EXTERNAL_SUBTITLE_EXTENSIONS set with common subtitle formats (.srt, .ass, .ssa, .vtt, .sub, .idx, .sup). Add external_subtitle_files() to glob subtitle files matching media stem and external_subtitle_languages() to parse language codes from filenames (de/deu/ger/german/deutsch, en/eng/english, fr/fra/fre/french/französisch, es/spa/spanish/spanisch, it/ita/italian/italienisch).

Update run_ffprobe() to merge external subtitle
2026-08-14 13:25:37 +02:00
nessi b5365170fb feat: add parallel file scanning with dedicated executor and support for scanning all sources simultaneously
Add scan_executor ThreadPoolExecutor with 4 workers for parallel file scanning. Import as_completed from concurrent.futures to process scan results. Replace sequential scan_one() loop with parallel futures submission and result collection using as_completed().

Update /api/rescan endpoint to accept "all" source parameter for scanning both Radarr and Sonarr simultaneously. Fix cache deletion
2026-08-14 13:22:15 +02:00
nessi 644c54a6f6 feat: refactor disk name layout to use CSS Grid with icon spanning both rows and add disk path support
Change disk-name from flex to grid layout with 2-column template (20px icon + flexible content). Update ::before icon to span both rows using grid-row:1/span 2 with zero margin. Add grid-template-rows auto/auto with conditional single row when disk-path is missing. Style disk-path in column 2 row 2 with nowrap and hide when empty. Set min-width:92px and line-height:1.1 for consistent sizing.
2026-08-14 11:10:01 +02:00
nessi bcefa02c32 feat: add dashboard insights section with media statistics and status cards showing file counts, missing items, and monitoring status
Add dashboard_stats dictionary to index() route calculating movie/episode totals, available files, missing items, and downloading counts. Pass stats to template for dashboard insights display.

Add dashboard-insights CSS grid with 4 insight cards showing media availability (movies/episodes), monitoring status, and live updates. Each card has color-coded icon with
2026-08-14 11:08:31 +02:00
nessi f63ba5381b feat: add PWA support with service worker, manifest, and auto-scan configuration for offline capability and mobile installation
Add manifest.json with app metadata, theme colors, and icon configuration for installable PWA. Add service worker (sw.js) with shell caching strategy for offline support - caches static assets on install, cleans old caches on activate, and implements network-first fetch with cache fallback for non-API requests.

Update index.html with PWA meta tags (theme-color, mobile
2026-08-13 22:03:53 +02:00
nessi 0d48c9eef2 fix: remove redundant display:flex from dashboard-view and add explicit display:none rule for inactive dashboard view
Remove duplicate display:flex declaration from .dashboard-view base class (already inherited from .view.active). Add .view.dashboard-view:not(.active) display:none rule to ensure dashboard view is properly hidden when inactive, preventing layout issues with flex-direction:column on non-active views.
2026-08-13 21:59:41 +02:00
nessi cce2f9fbb0 feat: add decorative icons to dashboard metrics with color-coded backgrounds for CPU, RAM, and disk usage indicators
Add ::before pseudo-elements with inline-grid centering to meter and disk-name elements. Style CPU meter with blue circular icon (◔), RAM meter with purple stacked icon (▤), and disk labels with yellow bar icon (▰). Each icon has matching semi-transparent background and colored text. Update dashboard view display to flex and align icon containers.
2026-08-13 16:43:30 +02:00
nessi 7daee41f65 feat: rename "Daten" disk mount to "Medien" and consolidate Filme/Serien mount paths with explanatory comment
Add German comment explaining that Filme and Serien share the same host storage (/nesflix) and are made visible in the container via media mounts. Update mount_paths list to replace "Daten" label with "Medien" and combine Filme/Serien paths under single "Medien" label. Add dashboard-view CSS class with flex layout, min-height constraints, and increased disk-list gap for improved vertical
2026-08-13 16:42:20 +02:00
nessi 5912b7078c feat: add system metrics dashboard with live CPU, RAM, and disk usage monitoring plus service status overview
Add system_metrics() function to read CPU usage from /proc/stat with delta calculation, memory stats from /proc/meminfo, and disk usage for System/Daten/Filme/Serien mounts with device deduplication. Add /api/system endpoint returning metrics JSON with error handling.

Add dashboard view as default tab with hero section, 4-card overview grid showing movie/series/missing/download counts, system
2026-08-13 16:38:19 +02:00
nessi 3d4fb52fa3 feat: filter "Without German" tab to show only existing or downloading media and exclude season 0 episodes
Add is_german_review_candidate() helper function to filter media that exists locally or is currently being downloaded, excluding season 0 (specials) episodes. Apply filter to missing_german_movies and missing_german_series lists to show only actionable items. Update tab description text from "Kein deutsches Audio und keine deutschen Untertitel" to "Vorhanden oder wird gerade geladen · Staffel
2026-08-13 16:32:21 +02:00
nessi 94ab044a0a feat: refactor CSS to use CSS custom properties and minify inline styles for improved maintainability and performance
Replace hardcoded color values with CSS custom properties (--bg, --panel, --line, --text, --muted, --yellow, --blue) defined in :root. Add color-scheme:dark for better dark mode support. Minify all CSS into single line to reduce file size. Maintain existing layout, spacing, and visual design while improving code organization and enabling easier theme customization.
2026-08-13 16:29:42 +02:00
nessi 05e32fb5af feat: add enhanced SABnzbd download dashboard with remaining data calculation and visual redesign
Add parse_size_bytes() and format_bytes() helper functions to convert and format file sizes. Calculate total remaining bytes from queue and include active_count, history_count, remaining_bytes, and formatted remaining in downloads API response. Update error responses to include new fields.

Add media-mark.svg favicon with gradient background, golden lines, and green checkmark. Replace text logo with inline
2026-08-13 16:28:10 +02:00
nessi 7b788f7dc8 feat: add "Without German" tab to filter media missing German audio or subtitles
Add new navigation tab showing count of movies and episodes without German tracks. Implement has_german_track() helper to check for German audio or subtitles. Filter movies and series to create missing_german_movies and missing_german_series lists passed to template. Add dedicated view section with tables for movies and series lacking German content, including empty state message. Update navigation translation logic
2026-08-13 16:25:57 +02:00
nessi 1558b081dd feat: add visual highlighting for preferred audio language badges with blue glow effect
Add audio-preferred CSS class with blue background, border, and shadow to visually distinguish items matching user's preferred audio language. Implement highlightPreferences() function to scan audio badges in movies and series tables and apply styling when content matches stored preference. Call highlightPreferences() on page load and after saving preferences.
2026-08-13 11:53:04 +02:00
nessi 2f395e245a feat: add bilingual UI with language toggle and user preferences modal for audio/subtitle filters
Add German/English language switching with DE/EN toggle button in header. Add settings modal with gear icon button for configuring preferred audio and subtitle languages. Store language and filter preferences in localStorage and auto-apply on page load. Add data-de/data-en attributes to translatable elements and translate table headers, filter placeholders, and navigation labels. Include modal backdrop with
2026-08-13 11:51:01 +02:00
nessi 81f8d9ced4 feat: consolidate header z-index declarations and ensure sticky positioning hierarchy
Remove duplicate header z-index:100 declaration and consolidate all z-index and positioning overrides into single style block. Maintain sticky positioning hierarchy with header at z-index:100, series summaries at z-index:30 (top:64px), and season dividers at z-index:29 (top:110px).
2026-08-13 11:49:09 +02:00
nessi e290c17f36 feat: fix gradient background scrolling by making it fixed and ensuring full page height
Set background-attachment:fixed on body gradient to prevent it from scrolling with content. Add min-height:100vh to body and min-height:100% to html to ensure gradient covers full viewport. Add min-height:calc(100vh - 64px) to main to maintain full-height layout accounting for header.
2026-08-13 11:47:57 +02:00
nessi d202499cdd feat: adjust sticky positioning for series summaries and season dividers to account for header height
Update series summary sticky top position from 0 to 64px and add z-index:30 to prevent overlap with fixed header. Update season divider sticky top position to 110px with z-index:29 to stack below series summaries but above content.
2026-08-13 11:47:25 +02:00
nessi a276911ca7 feat: add refined visual design with gradient backgrounds, improved borders, and enhanced hover effects
Add radial gradient background with accent colors, refined header with backdrop blur and shadow, improved navigation with active state indicator line, enhanced toolbar with focus states and transitions, refined table styling with gradient headers and hover animations, and add rescan button hover lift effect. Include responsive breakpoints for mobile layout adjustments.
2026-08-13 11:46:02 +02:00
nessi 7458b921be feat: add expand animation and chevron indicator for collapsible series
Add smooth expand animation with cubic-bezier easing when opening series details. Add rotating chevron indicator (⌄) to series summary that changes color and rotates 180° when expanded. Animation includes fade-in, translateY, and scaleY transform from top center origin.
2026-08-13 11:44:46 +02:00
nessi 8327ed567d feat: fix series sticky headers by setting overflow visible on parent containers
Set overflow:visible on #seriesList and .series elements to prevent sticky positioning from being clipped. This ensures series summaries remain visible at the top when scrolling through long episode lists.
2026-08-13 11:43:15 +02:00
nessi 3fcc2bf0ea feat: add smooth animations and sticky headers for series navigation
Add CSS animations for row entries, download pulse effects, and progress bar shimmer. Implement sticky positioning for series summaries and season dividers with backdrop blur effects. Add hover transitions for navigation buttons and badges. Include intersection observer to highlight currently scrolled series with visual indicator. Add prefers-reduced-motion media query for accessibility.
2026-08-13 11:41:33 +02:00
nessi 6da8204855 feat: add season dividers to series episode lists
Add visual separators between seasons in series episode tables. Extract season number from episode data and insert divider rows with "Staffel N" labels when season changes. Style dividers with dark background and subtle borders to improve readability of long episode lists.
2026-08-13 11:37:25 +02:00
nessi d252024dbc feat: improve download matching with fuzzy token-based algorithm and add downloading state styling
Replace exact title matching with token-based fuzzy matching that requires 75% of significant tokens (3+ chars) to match. Add "downloading" class to state column and apply purple badge styling to quality column for downloading items. Update download refresh to trigger markDownloading() and initialize download markers on page load.
2026-08-13 11:35:55 +02:00