mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
fix: hour not showing for tracks longer than 60 minutes (#648)
This commit is contained in:
parent
d12ea48b97
commit
de335f4834
@ -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()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -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 &&
|
||||||
|
@ -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,
|
||||||
),
|
),
|
||||||
|
@ -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,
|
||||||
|
@ -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),
|
||||||
|
Loading…
Reference in New Issue
Block a user