diff --git a/Extensions/Browser b/Extensions/Browser index d39d3c7..f288273 160000 --- a/Extensions/Browser +++ b/Extensions/Browser @@ -1 +1 @@ -Subproject commit d39d3c79cfedf6e67d9e4540ba8416cf052e63e8 +Subproject commit f288273338b3a351cf8b6503ab7b98fc58cd980d diff --git a/src/components/AddDownloadsModal.tsx b/src/components/AddDownloadsModal.tsx index 02e6163..8c3deac 100644 --- a/src/components/AddDownloadsModal.tsx +++ b/src/components/AddDownloadsModal.tsx @@ -48,6 +48,8 @@ import { reconcileDownloadRows, refreshFailedMetadataRows, isMagnetUrl, + isAddDownloadMetadataLoading, + isAddDownloadMetadataError, isMetadataRefreshableRow, selectExactMediaSelection, updateRowIfCurrent, @@ -2273,17 +2275,19 @@ export const AddDownloadsModal = () => { ) : null} -
{item.size || t($ => $.addDownloads.unknown)}
-
- {item.status === 'loading' ? ( +
{item.size || t($ => $.addDownloads.unknown)}
+
+ {isAddDownloadMetadataLoading(item) ? (
{item.isPlaylist ? t($ => $.addDownloads.fetchingPlaylist) : t($ => $.addDownloads.fetching)}
) : ( item.status === 'fallback' ? t($ => $.addDownloads.fallback) - : item.status === 'metadata-error' - ? item.metadataBlockedReason === 'unsafe-url' ? t($ => $.addDownloads.unsafeUrl) : item.isPlaylist ? t($ => $.addDownloads.playlistFailed) : item.isMedia ? t($ => $.addDownloads.metadataFailed) : t($ => $.addDownloads.fallback) + : isAddDownloadMetadataError(item) + ? item.status === 'metadata-error' + ? item.metadataBlockedReason === 'unsafe-url' ? t($ => $.addDownloads.unsafeUrl) : item.isPlaylist ? t($ => $.addDownloads.playlistFailed) : item.isMedia ? t($ => $.addDownloads.metadataFailed) : t($ => $.addDownloads.fallback) + : t($ => $.addDownloads.metadataFailed) : item.status === 'invalid' ? t($ => $.addDownloads.invalid) : t($ => $.addDownloads.ready) @@ -2351,6 +2355,15 @@ export const AddDownloadsModal = () => { ); })}
+ ) : isAddDownloadMetadataLoading(parsedItems[selectedItemIndex]) ? ( +
+ + {t($ => $.addDownloads.fetching)} +
+ ) : isAddDownloadMetadataError(parsedItems[selectedItemIndex]) ? ( +
+ {t($ => $.addDownloads.metadataFailed)} +
) : (

{t($ => $.addDownloads.torrentMetadataPending)} diff --git a/src/utils/addDownloadMetadata.test.ts b/src/utils/addDownloadMetadata.test.ts index 79a2cd9..7ec1a14 100644 --- a/src/utils/addDownloadMetadata.test.ts +++ b/src/utils/addDownloadMetadata.test.ts @@ -13,6 +13,8 @@ import { metadataSummaryMessage, isYouTubePlaylistUrl, isMagnetUrl, + isAddDownloadMetadataLoading, + isAddDownloadMetadataError, isMetadataRefreshableRow, isRemoteTorrentUrl, playlistFilePrefix, @@ -545,6 +547,7 @@ describe('add download metadata workflow', () => { expect(admitted.status).toBe('ready'); expect(canSubmitMetadataRows([admitted])).toBe(true); expect(isMetadataRefreshableRow(admitted)).toBe(false); + expect(isMetadataRefreshableRow({ ...admitted, torrentMetadataStatus: 'ready' })).toBe(true); const failed = { ...admitted, torrentMetadataStatus: 'error' as const }; const refreshed = refreshFailedMetadataRows([failed])[0]; @@ -558,6 +561,34 @@ describe('add download metadata workflow', () => { expect(isMetadataRefreshableRow(row())).toBe(false); }); + it('exposes optional magnet metadata as loading while keeping transfer readiness', () => { + const magnet = row({ + sourceUrl: 'magnet:?xt=urn:btih:0123456789abcdef0123456789abcdef01234567', + isTorrent: true, + torrentMetadataStatus: 'loading' + }); + + expect(magnet.status).toBe('ready'); + expect(isAddDownloadMetadataLoading(magnet)).toBe(true); + expect(isAddDownloadMetadataLoading({ + ...magnet, + torrentMetadataStatus: 'ready' + })).toBe(false); + expect(isAddDownloadMetadataLoading({ + ...magnet, + status: 'loading', + torrentMetadataStatus: undefined + })).toBe(true); + expect(isAddDownloadMetadataError({ + ...magnet, + torrentMetadataStatus: 'error' + })).toBe(true); + expect(isAddDownloadMetadataError({ + ...magnet, + torrentMetadataStatus: 'ready' + })).toBe(false); + }); + it('refreshes only selected metadata rows when requested by the preview action', () => { const selected = row({ id: 'selected-magnet', diff --git a/src/utils/addDownloadMetadata.ts b/src/utils/addDownloadMetadata.ts index 2952543..eb833fe 100644 --- a/src/utils/addDownloadMetadata.ts +++ b/src/utils/addDownloadMetadata.ts @@ -120,6 +120,16 @@ export const isMagnetTorrentRow = ( row: Pick ): boolean => row.isTorrent === true && isMagnetUrl(row.sourceUrl); +export const isAddDownloadMetadataLoading = ( + row: Pick +): boolean => row.status === 'loading' + || (isMagnetTorrentRow(row) && row.torrentMetadataStatus === 'loading'); + +export const isAddDownloadMetadataError = ( + row: Pick +): boolean => row.status === 'metadata-error' + || (isMagnetTorrentRow(row) && row.torrentMetadataStatus === 'error'); + export const isMetadataRefreshableRow = (row: AddDownloadDraftRow): boolean => row.status !== 'loading' && (row.status === 'metadata-error'