Add support for downloading media

Fixes #85
This commit is contained in:
Henry Hiles 2026-10-16 17:05:26 -04:00
commit 0ad85f24d5
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
15 changed files with 285 additions and 24 deletions

View file

@ -5,6 +5,7 @@ import "package:flutter_hooks/flutter_hooks.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:media_kit/media_kit.dart";
import "package:nexus/controllers/client.dart";
import "package:nexus/helpers/extensions/save_attachment.dart";
import "package:nexus/models/info/audio.dart";
import "package:nexus/widgets/players/player_controls.dart";
@ -12,6 +13,7 @@ class const AudioPlayer(
final Uri uri,
final AudioInfo? info, {
final bool encrypted = false,
final String? filename,
super.key,
}) extends HookConsumerWidget {
@override
@ -38,8 +40,24 @@ class const AudioPlayer(
child: Card(
color: Theme.of(context).colorScheme.surfaceContainer,
child: Padding(
padding: .only(left: 8, right: 16),
child: PlayerControls(player, loading: !loaded.value),
padding: .symmetric(horizontal: 8),
child: PlayerControls(
player,
loading: !loaded.value,
actions: .new([
SizedBox(width: 4),
IconButton(
onPressed: () => context.saveAttachment(
ref,
uri,
encrypted: encrypted,
filename: filename,
),
tooltip: "Download",
icon: Icon(Icons.download),
),
]),
),
),
),
);

View file

@ -3,6 +3,7 @@ import "dart:async";
import "package:material_ui/material_ui.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/client.dart";
import "package:nexus/helpers/extensions/save_attachment.dart";
import "package:nexus/models/info/video.dart";
import "package:flutter_hooks/flutter_hooks.dart";
import "package:media_kit/media_kit.dart";
@ -13,6 +14,7 @@ class const VideoPlayer(
final Uri uri,
final VideoInfo? info, {
final bool encrypted = false,
final String? filename,
super.key,
}) extends HookConsumerWidget {
@override
@ -61,6 +63,24 @@ class const VideoPlayer(
onTap: loaded.value ? player.playOrPause : null,
),
),
Positioned(
top: 4,
right: 4,
child: IconButton(
onPressed: () => context.saveAttachment(
ref,
uri,
encrypted: encrypted,
filename: filename,
),
color: Colors.white,
style: IconButton.styleFrom(
backgroundColor: Colors.black38,
),
tooltip: "Download",
icon: Icon(Icons.download),
),
),
Positioned(
left: 0,
right: 0,