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 './Downloads.css'; export const Downloads = () => { const { setPageTitle } = usePageTitle(); const { queueCount, storageStats, clearQueue, refreshStorageStats } = 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 Queue */}

Download Queue

{queueCount > 0 ? (

{queueCount} tracks in download queue

) : (

No tracks in download queue

)}
{/* 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!
); };