Files
plezy/lib/utils/live_tv_matching.dart
T
edde746 9429a76acc refactor: share search field, auth dialog, and list-download plumbing
The search screens, the out-of-band auth dialogs, the live TV guide and the
list-download paths each carried their own copy of the same shell. Extracts
SearchInputField and PendingAuthDialog and routes the duplicated download
and guide helpers through one implementation.
2026-07-26 06:09:49 +02:00

44 lines
1.7 KiB
Dart

import '../models/livetv_channel.dart';
import '../models/livetv_program.dart';
bool liveTvProgramMatchesChannel(LiveTvProgram program, LiveTvChannel channel) {
final programChannel = liveTvNonEmpty(program.channelIdentifier);
if (programChannel == null) return false;
if (programChannel != channel.key && programChannel != channel.identifier) return false;
if (!_nullableIdsMatch(program.serverId, channel.serverId)) return false;
if (!_nullableIdsMatch(program.liveDvrKey, channel.liveDvrKey)) return false;
final programProvider = liveTvNonEmpty(program.providerIdentifier);
final channelProvider = liveTvProviderIdentifierForChannel(channel);
if (programProvider != null && channelProvider != null && programProvider != channelProvider) return false;
return true;
}
String? liveTvProviderIdentifierForChannel(LiveTvChannel channel) {
final source = liveTvNonEmpty(channel.favoriteSource);
if (source != null) {
final uri = Uri.tryParse(source);
if (uri != null && uri.pathSegments.isNotEmpty) return liveTvNonEmpty(uri.pathSegments.last);
final slashIndex = source.lastIndexOf('/');
if (slashIndex >= 0 && slashIndex < source.length - 1) {
return liveTvNonEmpty(source.substring(slashIndex + 1));
}
}
return liveTvNonEmpty(channel.lineup);
}
bool _nullableIdsMatch(String? a, String? b) {
final left = liveTvNonEmpty(a);
final right = liveTvNonEmpty(b);
return left == null || right == null || left == right;
}
/// Trimmed [value], or null when it is null, empty, or whitespace-only.
String? liveTvNonEmpty(String? value) {
final trimmed = value?.trim();
return trimmed == null || trimmed.isEmpty ? null : trimmed;
}