Repository navigation
FEAT GUI: Share image, audio, and video previews with datasets #2749
Description
Is your feature request related to a problem? Please describe.
The dataset detail view must display images and play audio/video, but the GUI already implements much of this in chat. Duplicating media rendering or treating stored file paths as browser URLs would produce inconsistent behavior.
Work item 5 of 17 in #2744. Technical prerequisite: item 4's detail view and the seed detail API. Keep not ready yet until promoted.
Describe the solution you'd like
Extract shared preview components and narrowly reusable media-URL mapping so chat and dataset details use the same behavior.
- Render supported images and use native audio/video playback controls. Load media lazily/on demand; never autoplay. Stop playback when leaving or dismissing a preview.
- Expose client-fetchable seed asset URLs through the existing media-serving/signing mechanisms. Keep stable source references separate from expiring display URLs.
- Preserve linked text/media in one example. Show useful loading, missing-file, expired/inaccessible-link, and unsupported-format states, with retry/download where supported.
- Keep existing allowed storage roots, inline-media allowlists, authentication, and content-security rules. Do not enable arbitrary local files or active HTML/SVG rendering to make a preview work.
- Keep chat behavior intact while extracting its helpers. Do not refactor unrelated message rendering.
Acceptance criteria:
- Image, audio, and video fixtures work in dataset details and still work in chat.
- Local stored assets and signed blob URLs use the existing backend paths correctly.
- Media is not eagerly downloaded for every dataset/table row and never starts playing automatically.
- Broken assets and unsupported codecs fail visibly without breaking the table.
- Tests cover shared preview behavior and media URL mapping without real cloud credentials.
Describe alternatives you've considered, if relevant
Do not introduce a new media store, video transcoding service, separate chat/dataset players, or broader filesystem access. Unsupported formats can remain downloadable rather than requiring new codecs.
Additional context
Start with frontend\src\components\Chat\MessageList.tsx (ImageWithSpinner and MediaWithFallback), frontend\src\utils\media.ts, pyrit\backend\routes\media.py, and the URL resolution/signing helpers in pyrit\backend\mappers\attack_mappers.py. The media route already recognizes seed-prompt-entries. Follow the frontend, Python, and relevant test instructions.
Activity