Fladder/lib/providers/session_info_provider.dart
PartyDonut 7b3e733b76
[Setup] Added build.yaml and check.yaml (#1)
Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
2024-09-21 11:59:28 +02:00

64 lines
1.6 KiB
Dart

import 'dart:async';
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
import 'package:fladder/providers/api_provider.dart';
import 'package:fladder/providers/user_provider.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'session_info_provider.freezed.dart';
part 'session_info_provider.g.dart';
@Riverpod()
class SessionInfo extends _$SessionInfo {
late final api = ref.read(jellyApiProvider);
Timer? _timer;
@override
SessionInfoModel build() {
ref.onDispose(() => _timer?.cancel());
_startTimer();
return SessionInfoModel();
}
void _startTimer() {
_fetchData();
_timer = Timer.periodic(const Duration(seconds: 2), (timer) async {
await _fetchData();
});
}
Future<void> _fetchData() async {
final deviceId = ref.read(userProvider)?.credentials.deviceId;
if (deviceId == null) {
state = SessionInfoModel();
return;
}
final response = await api.sessionsInfo(deviceId);
final session = response.body?.firstOrNull;
if (session == null) {
state = SessionInfoModel();
return;
}
state = SessionInfoModel(
playbackModel: session.playState?.playMethod?.name,
transCodeInfo: session.transcodingInfo,
);
}
}
@freezed
class SessionInfoModel with _$SessionInfoModel {
const SessionInfoModel._();
factory SessionInfoModel({
String? playbackModel,
TranscodingInfo? transCodeInfo,
}) = _SessionInfoModel;
factory SessionInfoModel.fromJson(Map<String, dynamic> json) => _$SessionInfoModelFromJson(json);
}