Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions chatiframe1.html
Original file line number Diff line number Diff line change
Expand Up @@ -1030,9 +1030,20 @@ <h3>Nostr keys</h3>
this.cleanupRelays();

// Set up a periodic cleanup to ensure no extension relays are added
setInterval(() => {
this.cleanupRelays();
}, 2000); // Check every 2 seconds (more aggressive)
if (this._relayCleanupInterval) {
clearInterval(this._relayCleanupInterval);
}
this._relayCleanupInterval = setInterval(() => {
if (!document.hidden) {
this.cleanupRelays();
}
}, 30000); // Check every 30 seconds

document.addEventListener('visibilitychange', () => {
if (!document.hidden) {
this.cleanupRelays();
}
});

// Set up relay status tracking (only for the 2 configured relays)
if (this.ndk.pool) {
Expand Down
92 changes: 73 additions & 19 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2327,23 +2327,31 @@ <h2 style="width: 100%; margin: clamp(10px, 2vh, 15px) 0 clamp(6px, 1.2vh, 10px)
console.log('Loaded channels:', Object.keys(channels).length);

// Set up audio event listeners
const setupAudioListeners = () => {
const setupAudioListeners = (attempt = 0) => {
const audio = document.getElementById('player');
if (!audio) {
setTimeout(setupAudioListeners, 50);
if (this.srcUrl && attempt < 20) {
if (this._audioSetupTimeout) {
clearTimeout(this._audioSetupTimeout);
}
this._audioSetupTimeout = setTimeout(() => {
setupAudioListeners(attempt + 1);
}, 100);
}
return;
}

// Remove old listeners if they exist
if (this._timeUpdateListener) {
audio.removeEventListener('timeupdate', this._timeUpdateListener);
}
if (this._playListener) {
audio.removeEventListener('play', this._playListener);
if (this._audioSetupTimeout) {
clearTimeout(this._audioSetupTimeout);
this._audioSetupTimeout = null;
}
if (this._pauseListener) {
audio.removeEventListener('pause', this._pauseListener);

// Remove old listeners if they exist
if (this._audioElement && this._audioElement !== audio) {
this.teardownAudioListeners(this._audioElement);
}
this._audioElement = audio;
this.teardownAudioListeners(audio);

// Update time display
this._timeUpdateListener = () => {
Expand All @@ -2352,19 +2360,21 @@ <h2 style="width: 100%; margin: clamp(10px, 2vh, 15px) 0 clamp(6px, 1.2vh, 10px)
audio.addEventListener('timeupdate', this._timeUpdateListener);

// Update duration when metadata loads
audio.addEventListener('loadedmetadata', () => {
this._loadedMetadataListener = () => {
this.duration = audio.duration;
});
};
audio.addEventListener('loadedmetadata', this._loadedMetadataListener);

// Update duration when duration changes
audio.addEventListener('durationchange', () => {
this._durationChangeListener = () => {
this.duration = audio.duration;
});
};
audio.addEventListener('durationchange', this._durationChangeListener);

// Try to listen for ICY metadata updates (non-standard, browser-dependent)
// Some browsers may fire metadataupdate events for Icecast streams
if ('onmetadataupdate' in audio || 'addEventListener' in audio) {
const metadataHandler = (e) => {
this._metadataHandler = (e) => {
// Try to extract metadata from event or audio element
if (e && e.metadata) {
const metadata = e.metadata;
Expand All @@ -2387,8 +2397,8 @@ <h2 style="width: 100%; margin: clamp(10px, 2vh, 15px) 0 clamp(6px, 1.2vh, 10px)
}
};
// Try both standard and non-standard event names
audio.addEventListener('metadataupdate', metadataHandler);
audio.addEventListener('icy-metadata', metadataHandler);
audio.addEventListener('metadataupdate', this._metadataHandler);
audio.addEventListener('icy-metadata', this._metadataHandler);
}

// Update playing state
Expand Down Expand Up @@ -2421,8 +2431,20 @@ <h2 style="width: 100%; margin: clamp(10px, 2vh, 15px) 0 clamp(6px, 1.2vh, 10px)
setupAudioListeners();

// Re-setup listeners when srcUrl changes (audio element might be recreated)
this.$watch('srcUrl', () => {
setTimeout(setupAudioListeners, 100);
this.$watch('srcUrl', (value) => {
if (!value) {
this.teardownAudioListeners();
this._audioElement = null;
if (this._audioSetupTimeout) {
clearTimeout(this._audioSetupTimeout);
this._audioSetupTimeout = null;
}
return;
}

this.$nextTick(() => {
setupAudioListeners();
});
});

// Wait for router to be initialized by app.js
Expand Down Expand Up @@ -2484,6 +2506,38 @@ <h2 style="width: 100%; margin: clamp(10px, 2vh, 15px) 0 clamp(6px, 1.2vh, 10px)
}
});
},

teardownAudioListeners(audioElement) {
const audio = audioElement || this._audioElement;
if (!audio) return;

if (this._timeUpdateListener) {
audio.removeEventListener('timeupdate', this._timeUpdateListener);
}
if (this._playListener) {
audio.removeEventListener('play', this._playListener);
}
if (this._pauseListener) {
audio.removeEventListener('pause', this._pauseListener);
}
if (this._loadedMetadataListener) {
audio.removeEventListener('loadedmetadata', this._loadedMetadataListener);
}
if (this._durationChangeListener) {
audio.removeEventListener('durationchange', this._durationChangeListener);
}
if (this._metadataHandler) {
audio.removeEventListener('metadataupdate', this._metadataHandler);
audio.removeEventListener('icy-metadata', this._metadataHandler);
}

this._timeUpdateListener = null;
this._playListener = null;
this._pauseListener = null;
this._loadedMetadataListener = null;
this._durationChangeListener = null;
this._metadataHandler = null;
},

toggleChat() {
this.isChatVisible = !this.isChatVisible;
Expand Down