Changeset 8681239 in Klonkt
- Timestamp:
- 05/07/2026 10:38:43 PM (4 months ago)
- Branches:
- main
- Children:
- 76e9cfd
- Parents:
- 00550c0
- Files:
-
- 4 edited
-
.beads/issues.jsonl (modified) (1 diff)
-
src/assets/css/audio.css (modified) (1 diff)
-
src/assets/js/audio-player.js (modified) (4 diffs)
-
src/views/shell.ejs (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
.beads/issues.jsonl
r00550c0 r8681239 1 {"_type":"issue","id":"prutfolio-src-3fl","title":"Audio: continuous playback breekt na 3-4 tracks (browser-policy / state corruption)","description":"Na fix v1 (next() unconditional play) werkt 1-\u003e2 en 2-\u003e3, maar stopt bij 3-\u003e4. Verdacht: iOS Safari autoplay-policy revoke OF audio element state-corruption na meerdere src changes. Fix: pause()+load()+play() pattern in loadTrack, error-event auto-skip naar volgende, NotAllowedError visuele hint (pulse op play-btn).","status":"open","priority":1,"issue_type":"bug","owner":"robin@roboburr.com","created_at":"2026-05-07T22:38:42Z","created_by":"Robin","updated_at":"2026-05-07T22:38:42Z","dependency_count":0,"dependent_count":0,"comment_count":0} 1 2 {"_type":"issue","id":"prutfolio-src-0tg","title":"Audio: continuous playback fix — next() altijd play() ipv conditional","description":"Bug: next() checkte 'if (isPlaying) play()' maar isPlaying was al false door de pause-event die de browser firet vóór ended. Resultaat: track stopt na 1 keer. Fix: drop de conditional, roep altijd play() aan. Zelfde voor prev(). Bestand: src/assets/js/audio-player.js regels 221-230.","status":"closed","priority":1,"issue_type":"bug","assignee":"Robin","owner":"robin@roboburr.com","created_at":"2026-05-06T22:18:40Z","created_by":"Robin","updated_at":"2026-05-06T22:28:20Z","started_at":"2026-05-06T22:26:37Z","closed_at":"2026-05-06T22:28:20Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0} 2 3 {"_type":"issue","id":"prutfolio-src-e44","title":"Asset cache-busting via commit-hash ipv handmatig bumpen","description":"Nu staan ?v=N hardcoded in shell.ejs. Beter: middleware zet res.locals.assetVersion = git-commit-sha (build-time of runtime) zodat elke deploy auto-cache-bust krijgt. Behandel alle static script/css tags in shell.ejs (htmx.min.js, audio-player.js, install-app.js).","status":"open","priority":3,"issue_type":"task","owner":"robin@roboburr.com","created_at":"2026-05-07T20:03:17Z","created_by":"Robin","updated_at":"2026-05-07T20:03:17Z","dependency_count":0,"dependent_count":0,"comment_count":0} -
src/assets/css/audio.css
r00550c0 r8681239 111 111 opacity: 0; 112 112 pointer-events: none; 113 } 114 115 /* Browser-autoplay-policy heeft de auto-advance gestopt — typisch 116 na 3-4 tracks op iOS Safari. Visuele hint dat user op play moet 117 tappen om door te gaan (PCMS v10.1, audio-player.js). */ 118 .audio-player.audio-needs-tap .audio-btn-play { 119 animation: audio-pulse-tap 1.2s ease-in-out infinite; 120 background: rgba(255, 165, 0, 0.18); 121 border-color: orange; 122 color: orange; 123 } 124 @keyframes audio-pulse-tap { 125 0%, 100% { box-shadow: 0 0 0 0 rgba(255, 165, 0, 0.5); } 126 50% { box-shadow: 0 0 0 8px rgba(255, 165, 0, 0); } 113 127 } 114 128 .audio-player-inner { -
src/assets/js/audio-player.js
r00550c0 r8681239 189 189 } 190 190 console.log('[pcms-audio] loading', t.title, t.url); 191 // Schone overgang: pause + reset voorkomt state-corruption van het 192 // audio-element na meerdere src-changes (bug die continuous playback 193 // brak na 3-4 tracks). audio.load() forceert reset van internal state. 194 try { audio.pause(); } catch (e) {} 191 195 audio.src = t.url; 196 try { audio.load(); } catch (e) {} 192 197 titleEl.textContent = t.title || 'Untitled'; 193 198 artistEl.textContent = t.artist || ''; … … 214 219 const p = audio.play(); 215 220 if (p && typeof p.catch === 'function') { 216 p.catch((err) => console.warn('[pcms-audio] play() rejected', err)); 221 p.catch((err) => { 222 console.warn('[pcms-audio] play() rejected:', err.name, err.message); 223 // Browser-autoplay-policy heeft 't gestopt (typisch na 3-4 224 // automatische plays op iOS Safari, of als tab tijdelijk inactive 225 // was). Visuele hint dat user op play moet tappen. 226 if (err && err.name === 'NotAllowedError') { 227 root.classList.add('audio-needs-tap'); 228 isPlaying = false; 229 root.classList.remove('is-playing'); 230 } 231 }); 217 232 } 218 233 } … … 268 283 // 5. Audio element events → UI sync 269 284 // ============================================================ 270 audio.addEventListener('play', () => { isPlaying = true; root.classList.add('is-playing'); }); 285 // Error-counter voorkomt infinite-loop als ALLE tracks broken zijn. 286 let consecutiveErrors = 0; 287 288 audio.addEventListener('play', () => { 289 isPlaying = true; 290 consecutiveErrors = 0; // reset bij succesvolle play 291 root.classList.add('is-playing'); 292 root.classList.remove('audio-needs-tap'); // verstop tap-hint 293 }); 271 294 audio.addEventListener('pause', () => { isPlaying = false; root.classList.remove('is-playing'); }); 272 295 audio.addEventListener('ended', next); … … 274 297 const code = audio.error ? audio.error.code : '?'; 275 298 console.error('[pcms-audio] playback error', code, audio.src, e); 299 consecutiveErrors++; 300 // Bij netwerk/decode-fout: skip naar volgende track ipv stilstaan. 301 // Max 3 fouten op rij voordat we opgeven (anders infinite loop). 302 if (consecutiveErrors < 3 && queue.length > 1) { 303 console.warn('[pcms-audio] auto-skip naar volgende na error', consecutiveErrors); 304 setTimeout(next, 400); 305 } 276 306 }); 277 audio.addEventListener('stalled', () => console.warn('[pcms-audio] stalled '));307 audio.addEventListener('stalled', () => console.warn('[pcms-audio] stalled at', audio.currentTime)); 278 308 audio.addEventListener('volumechange', () => { root.classList.toggle('is-muted', audio.muted || audio.volume === 0); }); 279 309 audio.addEventListener('timeupdate', () => { -
src/views/shell.ejs
r00550c0 r8681239 277 277 ?v=N — cache-buster: bump bij elke audio-player.js wijziging zodat 278 278 Cloudflare (max-age=1y) niet de oude versie blijft serveren. --> 279 <script src="/assets/js/audio-player.js?v= 2"></script>279 <script src="/assets/js/audio-player.js?v=3"></script> 280 280 <% if (site && site.enable_audio_player && audioTracks && audioTracks.length > 0) { %> 281 281 <script>window.PCMS_SITE_TRACKS = <%- JSON.stringify(audioTracks) %>;</script>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)