diff --git a/src/pages/Library.tsx b/src/pages/Library.tsx
index dc55c13..e51d824 100644
--- a/src/pages/Library.tsx
+++ b/src/pages/Library.tsx
@@ -33,6 +33,31 @@ type TrackSortField = 'title' | 'artist' | 'album' | 'server' | 'fileId'
type EntrySortField = 'name' | 'count'
type SortField = TrackSortField | EntrySortField
+const STREAMABLE_FILE_EXTENSIONS = new Set([
+ 'm3u8',
+ 'mp3',
+ 'm4a',
+ 'aac',
+ 'flac',
+ 'wav',
+ 'ogg',
+ 'oga',
+ 'opus',
+ 'mp4',
+ 'm4v',
+ 'webm',
+ 'mkv',
+ 'mov',
+ 'avi',
+ 'wmv',
+ 'ogv',
+ 'mpeg',
+ 'mpg',
+ 'ts',
+ 'm2ts',
+ 'flv',
+])
+
type SortOption = {
id: SortField
label: string
@@ -542,6 +567,12 @@ export default function Library({ mediaSection, onPlayNow, onDownloadTrack, isTr
return match ? match[1].toLowerCase() : undefined
}
+ function canStreamTrack(track: Track, details?: HydrusFileDetails | null) {
+ const extension = getTrackExtension(track, details)
+ if (!extension) return false
+ return STREAMABLE_FILE_EXTENSIONS.has(extension)
+ }
+
function getTrackCacheKey(serverId?: string, fileId?: number) {
return serverId && fileId != null ? `${serverId}:${fileId}` : ''
}
@@ -1439,9 +1470,11 @@ export default function Library({ mediaSection, onPlayNow, onDownloadTrack, isTr
-
+ {detailsTrack?.url && canStreamTrack(detailsTrack, detailsData) && (
+
+ )}
} disabled={!detailsTrack?.url || detailsLoading || detailsTrackDownloading}>
{detailsTrackDownloading ? 'Downloading...' : 'Download'}