From 5d89f5f1b6ad5e714011748520522217da0ee38d Mon Sep 17 00:00:00 2001 From: enki Date: Wed, 27 Aug 2025 21:51:04 -0700 Subject: [PATCH] more fucking fixes --- Screenshot_20250827_214521.png | Bin 0 -> 34185 bytes internal/web/static/upload.js | 165 ++++++++++++++++++++++++--------- 2 files changed, 121 insertions(+), 44 deletions(-) create mode 100644 Screenshot_20250827_214521.png diff --git a/Screenshot_20250827_214521.png b/Screenshot_20250827_214521.png new file mode 100644 index 0000000000000000000000000000000000000000..41f631ae61c3aaab3609cb9b34759516e526069a GIT binary patch literal 34185 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�WCz4d4|Eh4Fdk1m*)$dlfx@k`6s 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 F-vD*~;SB%) literal 0 HcmV?d00001 diff --git a/internal/web/static/upload.js b/internal/web/static/upload.js index a89edb3..4382eb8 100644 --- a/internal/web/static/upload.js +++ b/internal/web/static/upload.js @@ -597,64 +597,108 @@ class GatewayUI { window.open(url, '_blank'); } - shareFile(hash, name) { - const baseUrl = window.location.origin; - const shareText = `${name}\n\nDownload: ${baseUrl}/api/download/${hash}\nStream: ${baseUrl}/api/stream/${hash}/playlist.m3u8\nTorrent: ${baseUrl}/api/torrent/${hash}`; - - if (navigator.clipboard && navigator.clipboard.writeText) { - navigator.clipboard.writeText(shareText).then(() => { - this.showToast('Share links copied to clipboard!', 'success'); - }); - } else { - // Fallback for older browsers - const textarea = document.createElement('textarea'); - textarea.value = shareText; - document.body.appendChild(textarea); - textarea.select(); - document.execCommand('copy'); - document.body.removeChild(textarea); - this.showToast('Share links copied to clipboard!', 'success'); + async shareFile(hash, name) { + try { + // Get file metadata to check for streaming info + const response = await fetch(`/api/metadata/${hash}`); + let fileData = null; + + if (response.ok) { + fileData = await response.json(); + } + + const baseUrl = window.location.origin; + const links = { + direct: `${baseUrl}/api/download/${hash}`, + torrent: `${baseUrl}/api/torrent/${hash}`, + magnet: `magnet:?xt=urn:btih:${hash}&dn=${encodeURIComponent(name)}` + }; + + // Add streaming links if available + if (fileData && fileData.streaming_info) { + links.stream = `${baseUrl}/api/stream/${hash}`; + links.hls = `${baseUrl}/api/stream/${hash}/playlist.m3u8`; + } + + this.showShareModal(name, links); + } catch (error) { + console.error('Failed to get file metadata:', error); + // Fallback to basic links + const baseUrl = window.location.origin; + const links = { + direct: `${baseUrl}/api/download/${hash}`, + torrent: `${baseUrl}/api/torrent/${hash}`, + magnet: `magnet:?xt=urn:btih:${hash}&dn=${encodeURIComponent(name)}` + }; + this.showShareModal(name, links); } } + showShareModal(fileName, links) { + const modal = document.getElementById('share-modal'); + const fileNameEl = document.getElementById('share-file-name'); + const linksContainer = document.getElementById('share-links'); + + if (!modal || !fileNameEl || !linksContainer) { + console.error('Share modal elements not found'); + return; + } + + fileNameEl.textContent = fileName; + + const linkTypes = [ + { key: 'direct', label: 'Direct Download', icon: '⬇️' }, + { key: 'torrent', label: 'Torrent File', icon: '🧲' }, + { key: 'magnet', label: 'Magnet Link', icon: '🧲' }, + { key: 'stream', label: 'Stream Video', icon: '▶️' }, + { key: 'hls', label: 'HLS Playlist', icon: '📺' } + ]; + + linksContainer.innerHTML = linkTypes + .filter(type => links[type.key]) + .map(type => ` + + `).join(''); + + modal.style.display = 'block'; + } + async deleteFile(hash, name) { - if (!confirm(`Are you sure you want to delete "${name}"?\n\nThis action cannot be undone.`)) { + if (!window.nostrAuth || !window.nostrAuth.isAuthenticated()) { + alert('You must be logged in to delete files'); return; } - + + if (!confirm(`Are you sure you want to delete "${name}"?`)) { + return; + } + try { - const headers = { - 'Accept': 'application/json' - }; - if (window.nostrAuth && window.nostrAuth.sessionToken) { - headers['Authorization'] = `Bearer ${window.nostrAuth.sessionToken}`; - } - - const response = await fetch(`/api/delete/${hash}`, { - method: 'DELETE', - headers: headers - }); - - if (response.ok) { - const result = await response.json(); - this.showToast(`File "${name}" deleted successfully!`, 'success'); - - // Remove from local storage if it exists + const result = await window.nostrAuth.deleteFile(hash); + if (result.success) { + // Remove from recent uploads this.recentUploads = this.recentUploads.filter(upload => upload.hash !== hash); - localStorage.setItem('recentUploads', JSON.stringify(this.recentUploads)); + this.saveRecentUploads(); - // Refresh the file list - this.loadServerFiles(); - } else { - const error = await response.json(); - this.showToast(`Failed to delete file: ${error.error?.message || 'Unknown error'}`, 'error'); + // Refresh file list + await this.loadServerFiles(); + + alert(`File "${name}" deleted successfully`); } } catch (error) { - console.error('Delete error:', error); - this.showToast(`Error deleting file: ${error.message}`, 'error'); + console.error('Delete failed:', error); + alert(`Failed to delete file: ${error.message}`); } } + + showToast(message, type = 'info') { const toast = document.createElement('div'); toast.className = `toast ${type}`; @@ -709,6 +753,39 @@ class GatewayUI { } } +// Global functions for share modal +async function copyToClipboard(text) { + try { + await navigator.clipboard.writeText(text); + // Show a temporary success message + const copyBtn = event.target; + const originalText = copyBtn.textContent; + copyBtn.textContent = 'Copied!'; + copyBtn.style.backgroundColor = '#4CAF50'; + setTimeout(() => { + copyBtn.textContent = originalText; + copyBtn.style.backgroundColor = ''; + }, 2000); + } catch (error) { + console.error('Failed to copy to clipboard:', error); + // Fallback for older browsers + const textarea = document.createElement('textarea'); + textarea.value = text; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + document.body.removeChild(textarea); + alert('Copied to clipboard!'); + } +} + +function closeShareModal() { + const modal = document.getElementById('share-modal'); + if (modal) { + modal.style.display = 'none'; + } +} + // Global functions for navigation and theme function showServices() { hideAllSections();