29 lines
931 B
Dart
29 lines
931 B
Dart
|
|
import '../../core/contracts/library.dart';
|
||
|
|
|
||
|
|
|
||
|
|
const int kTicksPerSecond = 10000000;
|
||
|
|
const int kTicksPerMinute = 600000000;
|
||
|
|
|
||
|
|
int ticksFromDuration(Duration duration) => duration.inMicroseconds * 10;
|
||
|
|
|
||
|
|
Duration durationFromTicks(int ticks) => Duration(microseconds: ticks ~/ 10);
|
||
|
|
|
||
|
|
|
||
|
|
double playbackProgress(EmbyRawItem item) {
|
||
|
|
final position = item.UserData?.PlaybackPositionTicks;
|
||
|
|
final total = item.RunTimeTicks;
|
||
|
|
if (position == null || total == null || total <= 0) return 0;
|
||
|
|
final value = position / total;
|
||
|
|
if (value.isNaN || value.isInfinite) return 0;
|
||
|
|
return value.clamp(0.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
String? formatRemainingLabel(EmbyRawItem item) {
|
||
|
|
final position = item.UserData?.PlaybackPositionTicks;
|
||
|
|
final total = item.RunTimeTicks;
|
||
|
|
if (position == null || total == null || total <= 0) return null;
|
||
|
|
final minutes = ((total - position) / kTicksPerMinute).ceil();
|
||
|
|
return minutes > 0 ? '剩余 $minutes 分钟' : null;
|
||
|
|
}
|