fix: hour not showing for tracks longer than 60 minutes (#648)

This commit is contained in:
Kingkor Roy Tirtho 2023-09-11 12:12:05 +06:00
parent d12ea48b97
commit de335f4834
5 changed files with 20 additions and 34 deletions

View File

@ -7,12 +7,12 @@ import 'package:palette_generator/palette_generator.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/collections/intents.dart'; import 'package:spotube/collections/intents.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/extensions/duration.dart';
import 'package:spotube/hooks/use_progress.dart'; import 'package:spotube/hooks/use_progress.dart';
import 'package:spotube/models/logger.dart'; import 'package:spotube/models/logger.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart';
import 'package:spotube/services/audio_player/loop_mode.dart'; import 'package:spotube/services/audio_player/loop_mode.dart';
import 'package:spotube/utils/primitive_utils.dart';
class PlayerControls extends HookConsumerWidget { class PlayerControls extends HookConsumerWidget {
final PaletteGenerator? palette; final PaletteGenerator? palette;
@ -113,19 +113,6 @@ class PlayerControls extends HookConsumerWidget {
:progressStatic :progressStatic
) = useProgress(ref); ) = useProgress(ref);
final totalMinutes = PrimitiveUtils.zeroPadNumStr(
duration.inMinutes.remainder(60),
);
final totalSeconds = PrimitiveUtils.zeroPadNumStr(
duration.inSeconds.remainder(60),
);
final currentMinutes = PrimitiveUtils.zeroPadNumStr(
position.inMinutes.remainder(60),
);
final currentSeconds = PrimitiveUtils.zeroPadNumStr(
position.inSeconds.remainder(60),
);
final progress = useState<num>( final progress = useState<num>(
useMemoized(() => progressStatic, []), useMemoized(() => progressStatic, []),
); );
@ -173,8 +160,8 @@ class PlayerControls extends HookConsumerWidget {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text("$currentMinutes:$currentSeconds"), Text(position.toHumanReadableString()),
Text("$totalMinutes:$totalSeconds"), Text(duration.toHumanReadableString()),
], ],
), ),
), ),

View File

@ -9,6 +9,7 @@ import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/image/universal_image.dart'; import 'package:spotube/components/shared/image/universal_image.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/extensions/duration.dart';
import 'package:spotube/hooks/use_debounce.dart'; import 'package:spotube/hooks/use_debounce.dart';
import 'package:spotube/models/matched_track.dart'; import 'package:spotube/models/matched_track.dart';
import 'package:spotube/models/spotube_track.dart'; import 'package:spotube/models/spotube_track.dart';
@ -99,9 +100,7 @@ class SiblingTracksSheet extends HookConsumerWidget {
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
), ),
trailing: Text( trailing: Text(video.duration.toHumanReadableString()),
PrimitiveUtils.toReadableDuration(video.duration),
),
subtitle: Text(video.channelName), subtitle: Text(video.channelName),
enabled: playlist.isFetching != true, enabled: playlist.isFetching != true,
selected: playlist.isFetching != true && selected: playlist.isFetching != true &&

View File

@ -242,7 +242,7 @@ class TrackTile extends HookConsumerWidget {
const SizedBox(width: 8), const SizedBox(width: 8),
Text( Text(
Duration(milliseconds: track.durationMs ?? 0) Duration(milliseconds: track.durationMs ?? 0)
.toHumanReadableString(), .toHumanReadableString(padZero: false),
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),

View File

@ -1,10 +1,21 @@
import 'package:duration/locale.dart'; import 'package:duration/locale.dart';
import 'package:spotube/utils/primitive_utils.dart';
import 'package:duration/duration.dart'; import 'package:duration/duration.dart';
extension DurationToHumanReadableString on Duration { extension DurationToHumanReadableString on Duration {
String toHumanReadableString() => String toHumanReadableString({padZero = true}) {
"${inMinutes.remainder(60)}:${PrimitiveUtils.zeroPadNumStr(inSeconds.remainder(60))}"; final mm = inMinutes
.remainder(60)
.toString()
.padLeft(2, !padZero && inHours == 0 ? '' : "0");
final ss = inSeconds.remainder(60).toString().padLeft(2, "0");
if (inHours > 0) {
final hh = inHours.toString().padLeft(2, !padZero ? '' : "0");
return "$hh:$mm:$ss";
}
return "$mm:$ss";
}
String format({ String format({
DurationTersity tersity = DurationTersity.second, DurationTersity tersity = DurationTersity.second,

View File

@ -31,17 +31,6 @@ abstract class PrimitiveUtils {
} }
} }
static String zeroPadNumStr(int input) {
return input < 10 ? "0$input" : input.toString();
}
static String toReadableDuration(Duration duration) {
final hours = duration.inHours;
final minutes = duration.inMinutes % 60;
final seconds = duration.inSeconds % 60;
return "${hours > 0 ? "${zeroPadNumStr(hours)}:" : ""}${zeroPadNumStr(minutes)}:${zeroPadNumStr(seconds)}";
}
static Future<T> raceMultiple<T>( static Future<T> raceMultiple<T>(
Future<T> Function() inner, { Future<T> Function() inner, {
Duration timeout = const Duration(milliseconds: 2500), Duration timeout = const Duration(milliseconds: 2500),