import { useDownloadContext } from '../context/DownloadContext/DownloadContext'; import { usePageTitle } from '../context/PageTitleContext/PageTitleContext'; import { useEffect, useState } from 'react'; import { formatFileSize } from '../utils/formatFileSize'; import { useAudioStorageContext } from '../context/AudioStorageContext/AudioStorageContext'; import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models'; import { MediaItem } from '../api/jellyfin'; // import { UnifiedDownloadIndicator } from '../components/UnifiedDownloadIndicator'; import './Downloads.css'; export const Downloads = () => { const { setPageTitle } = usePageTitle(); const { queueCount, storageStats, clearQueue, refreshStorageStats, getActiveDownloads, getCompletedDownloads, getFailedDownloads, totalDownloads, activeCount, completedCount, failedCount } = useDownloadContext(); const audioStorage = useAudioStorageContext(); const [downloadedTracks, setDownloadedTracks] = useState([]); const [isLoadingTracks, setIsLoadingTracks] = useState(true); // Load downloaded tracks directly from audioStorage useEffect(() => { const loadDownloadedTracks = async () => { try { setIsLoadingTracks(true); if (audioStorage && audioStorage.getPageFromIndexedDb) { console.log('Loading downloaded tracks directly...'); // Try different approaches to get tracks console.log('Method 1: BaseItemKind.Audio'); const audioTracks = await audioStorage.getPageFromIndexedDb(0, BaseItemKind.Audio, 200); console.log('Direct audioStorage check:', audioTracks.length, 'tracks found'); console.log('Sample tracks:', audioTracks.slice(0, 3)); if (audioTracks.length > 0) { console.log('Full first track data:', audioTracks[0]); } // Try getting ALL tracks regardless of type console.log('Method 2: Trying to get all tracks...'); try { // Let's try with different BaseItemKind values const allTypes = [BaseItemKind.MusicAlbum, BaseItemKind.Playlist]; for (const type of allTypes) { const tracks = await audioStorage.getPageFromIndexedDb(0, type, 50); console.log(`${type} tracks:`, tracks.length); } } catch (e) { console.log('Error trying different types:', e); } setDownloadedTracks(audioTracks); } else { console.log('audioStorage not available or missing getPageFromIndexedDb method'); console.log('audioStorage object:', audioStorage); } } catch (error) { console.error('Error loading downloaded tracks:', error); } finally { setIsLoadingTracks(false); } }; loadDownloadedTracks(); }, [audioStorage]); useEffect(() => { setPageTitle('Downloads'); refreshStorageStats(); }, [setPageTitle, refreshStorageStats]); return (

Download Manager

Manage your offline music downloads

{/* Storage Usage */}

Storage Usage

Downloaded Tracks {isLoadingTracks ? 'Loading...' : downloadedTracks.length}
Storage Used {formatFileSize(storageStats?.usage || 0)}
IndexedDB Storage {formatFileSize(storageStats?.indexedDB || 0)}
{/* Download Statistics */}

Download Statistics

Total Downloads {totalDownloads}
Active Downloads {activeCount}
Completed {completedCount}
Failed {failedCount}
{/* Active Downloads */} {activeCount > 0 && (

Active Downloads ({activeCount})

{getActiveDownloads().map((download) => (
{download.trackName || 'Unknown Track'}
{download.artistName || 'Unknown Artist'}
{download.albumName || 'Unknown Album'}
{Math.round(download.progress)}%
{download.status}
))}
)} {/* Download Queue */}

Download Queue

{queueCount > 0 ? (

{queueCount} tracks in download queue

) : (

No tracks in download queue

)}
{/* Completed Downloads */} {completedCount > 0 && (

Recently Completed ({completedCount})

{getCompletedDownloads().slice(0, 50).map((download) => (
{download.trackName || 'Unknown Track'}
{download.artistName || 'Unknown Artist'}
{download.albumName || 'Unknown Album'}
{new Date(download.timestamp).toLocaleString()}
✅ Downloaded
))}
)} {/* Failed Downloads */} {failedCount > 0 && (

Failed Downloads ({failedCount})

{getFailedDownloads().slice(0, 20).map((download) => (
{download.trackName || 'Unknown Track'}
{download.artistName || 'Unknown Artist'}
{download.albumName || 'Unknown Album'}
{download.error || 'Download failed'}
❌ Failed
))}
)} {/* Downloaded Tracks (Real from IndexedDB) */}

Downloaded Tracks ({downloadedTracks.length})

{isLoadingTracks ? (

Loading downloaded tracks...

) : downloadedTracks.length > 0 ? (
{downloadedTracks.slice(0, 100).map((track, index) => (
{track.Name { e.currentTarget.src = '/default-thumbnail.png'; }} />
{track.Name || 'Unknown Title'}
{ Array.isArray(track.Artists) ? track.Artists.join(', ') : track.Artists || 'Unknown Artist' }
✅
))} {downloadedTracks.length > 100 && (

Showing first 100 of {downloadedTracks.length} downloaded tracks

)}
) : (

No tracks downloaded yet. Download tracks from other pages and they'll appear here with green checkmarks.

Debug Info:

  • audioStorage available: {audioStorage ? 'Yes' : 'No'}
  • downloadedTracks.length: {downloadedTracks.length}
  • isLoadingTracks: {isLoadingTracks ? 'Yes' : 'No'}
)}
{/* How to Download Music */}

How to Download Music

  1. Browse to any track, album, or playlist
  2. Look for the download icon (⬇️) next to items
  3. Click to add items to your download queue
  4. Downloads will process automatically in the background
  5. Downloaded music is available offline!
); };