Files
plezy/lib/models/livetv_subscription.dart
T

120 lines
3.4 KiB
Dart

/// Represents a DVR recording subscription (recording rule)
class LiveTvSubscription {
final String key;
final String? ratingKey;
final String? guid;
final String title;
final String? summary;
final String? type;
final String? thumb;
final String? art;
final int? targetLibrarySectionID;
final int? targetSectionID;
final int? createdAt;
final List<SubscriptionSetting> settings;
// Multi-server support
final String? serverId;
LiveTvSubscription({
required this.key,
this.ratingKey,
this.guid,
required this.title,
this.summary,
this.type,
this.thumb,
this.art,
this.targetLibrarySectionID,
this.targetSectionID,
this.createdAt,
this.settings = const [],
this.serverId,
});
factory LiveTvSubscription.fromJson(Map<String, dynamic> json) {
final settingsList = <SubscriptionSetting>[];
if (json['Setting'] != null) {
for (final item in json['Setting'] as List) {
try {
settingsList.add(SubscriptionSetting.fromJson(item as Map<String, dynamic>));
} catch (_) {}
}
}
return LiveTvSubscription(
key: json['key'] as String? ?? '',
ratingKey: json['ratingKey'] as String?,
guid: json['guid'] as String?,
title: json['title'] as String? ?? 'Unknown',
summary: json['summary'] as String?,
type: json['type'] as String?,
thumb: json['thumb'] as String?,
art: json['art'] as String?,
targetLibrarySectionID: (json['targetLibrarySectionID'] as num?)?.toInt(),
targetSectionID: (json['targetSectionID'] as num?)?.toInt(),
createdAt: (json['createdAt'] as num?)?.toInt(),
settings: settingsList,
);
}
/// Creation time as DateTime
DateTime? get createdAtTime => createdAt != null ? DateTime.fromMillisecondsSinceEpoch(createdAt! * 1000) : null;
}
/// Represents a setting within a DVR subscription
class SubscriptionSetting {
final String id;
final String? label;
final String? summary;
final String type; // e.g., "bool", "enum", "int"
final String? value;
final String? defaultValue;
final bool? hidden;
final bool? advanced;
final List<SubscriptionSettingOption>? enumValues;
SubscriptionSetting({
required this.id,
this.label,
this.summary,
required this.type,
this.value,
this.defaultValue,
this.hidden,
this.advanced,
this.enumValues,
});
factory SubscriptionSetting.fromJson(Map<String, dynamic> json) {
List<SubscriptionSettingOption>? options;
if (json['enumValues'] != null) {
final parts = (json['enumValues'] as String).split('|');
options = parts.map((part) {
final kv = part.split(':');
return SubscriptionSettingOption(value: kv.first, label: kv.length > 1 ? kv[1] : kv.first);
}).toList();
}
return SubscriptionSetting(
id: json['id'] as String? ?? '',
label: json['label'] as String?,
summary: json['summary'] as String?,
type: json['type'] as String? ?? 'text',
value: json['value']?.toString(),
defaultValue: json['default']?.toString(),
hidden: json['hidden'] == true || json['hidden'] == 1,
advanced: json['advanced'] == true || json['advanced'] == 1,
enumValues: options,
);
}
}
/// Represents an option in an enum-type subscription setting
class SubscriptionSettingOption {
final String value;
final String label;
SubscriptionSettingOption({required this.value, required this.label});
}