From 62d19c26a16cd7d3b2ae7650b3be237fb2b6212e Mon Sep 17 00:00:00 2001 From: nessi Date: Sun, 16 Aug 2026 13:05:48 +0200 Subject: [PATCH] feat: enhance PWA manifest with multi-size icons, window controls overlay, and German locale settings Add id "/" and lang "de" fields to manifest.json. Add display_override with window-controls-overlay/standalone options and prefer_related_applications:false. Replace single media-mark.svg icon with 192x192 and 512x512 sized variants (media-mark-192.svg, media-mark-512.svg) containing gradient background, yellow strokes, and green circle with glow filter. Update service worker cache to v3 with scope "/" parameter --- static/manifest.json | 7 ++++++- static/media-mark-192.svg | 1 + static/media-mark-512.svg | 1 + static/sw.js | 2 +- templates/index.html | 3 ++- 5 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 static/media-mark-192.svg create mode 100644 static/media-mark-512.svg diff --git a/static/manifest.json b/static/manifest.json index 0b00889..536ff79 100644 --- a/static/manifest.json +++ b/static/manifest.json @@ -1,14 +1,19 @@ { "name": "Media Max", "short_name": "Media Max", + "id": "/", + "lang": "de", "description": "Media Max: Radarr, Sonarr und SABnzbd im Überblick", "start_url": "/", "scope": "/", "display": "standalone", + "display_override": ["window-controls-overlay", "standalone"], + "prefer_related_applications": false, "background_color": "#151619", "theme_color": "#1f252d", "orientation": "any", "icons": [ - {"src": "/static/media-mark.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any maskable"} + {"src": "/static/media-mark-192.svg", "sizes": "192x192", "type": "image/svg+xml", "purpose": "any maskable"}, + {"src": "/static/media-mark-512.svg", "sizes": "512x512", "type": "image/svg+xml", "purpose": "any maskable"} ] } diff --git a/static/media-mark-192.svg b/static/media-mark-192.svg new file mode 100644 index 0000000..1a6011a --- /dev/null +++ b/static/media-mark-192.svg @@ -0,0 +1 @@ + diff --git a/static/media-mark-512.svg b/static/media-mark-512.svg new file mode 100644 index 0000000..1a6011a --- /dev/null +++ b/static/media-mark-512.svg @@ -0,0 +1 @@ + diff --git a/static/sw.js b/static/sw.js index c2352da..6beaa79 100644 --- a/static/sw.js +++ b/static/sw.js @@ -1,4 +1,4 @@ -const CACHE_NAME = 'media-max-shell-v2'; +const CACHE_NAME = 'media-max-shell-v3'; const SHELL = ['/static/media-mark.svg', '/static/manifest.json']; self.addEventListener('install', event => { diff --git a/templates/index.html b/templates/index.html index 385b163..1f19d6a 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,4 +1,5 @@ + @@ -61,7 +62,7 @@ let autoScanTimer=null;function configureAutoScan(){if(autoScanTimer)clearInterv const seasonZeroLabel=document.createElement('label');seasonZeroLabel.className='setting-toggle';seasonZeroLabel.htmlFor='showSeasonZero';seasonZeroLabel.innerHTML='Staffel 0 anzeigen';const seasonZeroHelp=document.createElement('span');seasonZeroHelp.className='setting-help';seasonZeroHelp.textContent='Gilt für Sonarr und die Liste Ohne Deutsch.';if(settingsActions){settingsActions.before(seasonZeroLabel,seasonZeroHelp)} function applySeasonZeroPreference(){const show=localStorage.getItem('show-season-zero')==='true';const rows=[...document.querySelectorAll('#sonarr tbody tr:not(.season-divider),#missing .missing-series tbody tr:not(.season-divider)')];rows.forEach(row=>{const title=row.querySelector('.title')?.textContent.trim()||'';row.classList.toggle('season-zero-hidden',!show&&/^S00E/i.test(title))});document.querySelectorAll('#sonarr details.series,#missing details.missing-series').forEach(detail=>{const episodeRows=[...detail.querySelectorAll('tbody tr:not(.season-divider)')];detail.classList.toggle('season-zero-empty',episodeRows.length>0&&episodeRows.every(row=>row.classList.contains('season-zero-hidden')))});const missingCount=document.querySelector('#missingCount'),missingNavCount=document.querySelector('#missingNavCount');if(missingCount||missingNavCount){const movies=document.querySelectorAll('#missingMovies tbody tr:not(.hidden)').length,episodes=document.querySelectorAll('#missing .missing-series tbody tr:not(.season-divider):not(.season-zero-hidden)').length,total=movies+episodes;if(missingCount)missingCount.textContent=`${total} Einträge ohne Deutsch`;if(missingNavCount)missingNavCount.textContent=total}const hint=document.querySelector('#seasonZeroHint');if(hint)hint.textContent=show?'Vorhanden oder wird gerade geladen · Staffel 0 eingeblendet':'Vorhanden oder wird gerade geladen · Staffel 0 ausgeblendet'}const seasonZeroToggle=document.querySelector('#showSeasonZero');if(seasonZeroToggle){seasonZeroToggle.checked=localStorage.getItem('show-season-zero')==='true';seasonZeroToggle.addEventListener('change',()=>{localStorage.setItem('show-season-zero',seasonZeroToggle.checked?'true':'false');applySeasonZeroPreference()})}applySeasonZeroPreference(); function syncDashboardMissingCounter(){const visibleMissing=document.querySelectorAll('#missingMovies tbody tr:not(.hidden),#missing .missing-series tbody tr:not(.season-zero-hidden):not(.season-divider)').length;const dashboardMissing=document.querySelector('#dashboardMissing');if(dashboardMissing)dashboardMissing.textContent=visibleMissing}syncDashboardMissingCounter();document.querySelector('#showSeasonZero')?.addEventListener('change',()=>setTimeout(syncDashboardMissingCounter,0)); -if('serviceWorker' in navigator)window.addEventListener('load',()=>navigator.serviceWorker.register('/static/sw.js?v=2').catch(()=>{})); +if('serviceWorker' in navigator)window.addEventListener('load',()=>navigator.serviceWorker.register('/static/sw.js?v=3',{scope:'/'}).catch(()=>{})); function updateMissingHeading(){const heading=document.querySelector('#missingMovies thead th:first-child');if(heading)heading.textContent=document.documentElement.lang==='en'?'Media':'Medien'}updateMissingHeading();document.querySelector('#languageToggle')?.addEventListener('click',()=>setTimeout(updateMissingHeading,0)); function addMissingSections(){const view=document.querySelector('#missing'),movieTable=document.querySelector('#missingMovies'),seriesItems=[...document.querySelectorAll('#missing .missing-series')];if(!view)return;const makeHeading=(type,de,en)=>{const heading=document.createElement('div');heading.className=`missing-section-heading ${type}`;heading.dataset.de=de;heading.dataset.en=en;heading.textContent=document.documentElement.lang==='en'?en:de;return heading};if(movieTable&&movieTable.querySelector('tbody tr'))movieTable.before(makeHeading('movies','Filme ohne Deutsch','Movies without German'));if(seriesItems.length)seriesItems[0].before(makeHeading('series','Serien ohne Deutsch','Series without German'))}addMissingSections();