Load tag (and language) directories via Helix with client-side tag matching so scroll can continue past the GQL integrity wall. Re-sort lists locally after each fetch and store streamViewerSort in Settings. Co-authored-by: Cursor <cursoragent@cursor.com>
67 lines
1.7 KiB
Dart
67 lines
1.7 KiB
Dart
import 'package:json_annotation/json_annotation.dart';
|
|
|
|
part 'stream.g.dart';
|
|
|
|
// Object for live Twitch streams.
|
|
@JsonSerializable(createToJson: false, fieldRename: FieldRename.snake)
|
|
class StreamTwitch {
|
|
final String userId;
|
|
final String userLogin;
|
|
final String userName;
|
|
final String gameId;
|
|
final String gameName;
|
|
final String title;
|
|
final int viewerCount;
|
|
final String startedAt;
|
|
final String thumbnailUrl;
|
|
|
|
/// ISO 639-1 broadcast language from Helix (`de`, `en`, …). Empty when unknown.
|
|
@JsonKey(defaultValue: '')
|
|
final String language;
|
|
|
|
/// Freeform tags from Helix (e.g. `Deutsch`, `English`).
|
|
@JsonKey(defaultValue: <String>[])
|
|
final List<String> tags;
|
|
|
|
const StreamTwitch(
|
|
this.userId,
|
|
this.userLogin,
|
|
this.userName,
|
|
this.gameId,
|
|
this.gameName,
|
|
this.title,
|
|
this.viewerCount,
|
|
this.startedAt,
|
|
this.thumbnailUrl, [
|
|
this.language = '',
|
|
this.tags = const [],
|
|
]);
|
|
|
|
factory StreamTwitch.fromJson(Map<String, dynamic> json) =>
|
|
_$StreamTwitchFromJson(json);
|
|
}
|
|
|
|
@JsonSerializable(createToJson: false, fieldRename: FieldRename.snake)
|
|
class StreamsTwitch {
|
|
final List<StreamTwitch> data;
|
|
final Map<String, String> pagination;
|
|
|
|
const StreamsTwitch(this.data, this.pagination);
|
|
|
|
factory StreamsTwitch.fromJson(Map<String, dynamic> json) {
|
|
final rawPagination = json['pagination'];
|
|
final pagination = <String, String>{};
|
|
if (rawPagination is Map) {
|
|
final cursor = rawPagination['cursor'];
|
|
if (cursor is String && cursor.isNotEmpty) {
|
|
pagination['cursor'] = cursor;
|
|
}
|
|
}
|
|
return StreamsTwitch(
|
|
(json['data'] as List<dynamic>)
|
|
.map((e) => StreamTwitch.fromJson(e as Map<String, dynamic>))
|
|
.toList(),
|
|
pagination,
|
|
);
|
|
}
|
|
}
|