feat(player): 切集刷新互动计数统计

This commit is contained in:
Zhou Weidong committed 2026-10-26 21:40:39 +08:00
1 parent 37353dac15
commit 188811fde6
11 files changed
+694 -20

No files matched your search

@@ -1,5 +1,6 @@
// Author: fruit.com.cn
import '../models/episode_stats.dart';
import '../models/play_ticket.dart';
import '../remote/playback_api.dart';
@@ -10,6 +11,9 @@ import '../remote/playback_api.dart';
abstract interface class PlaybackRepository {
Future<PlayTicket> ticketFor(String episodeId, {bool forceRefresh = false});
/// 读取互动计数快照;与 [ticketFor] 分离,避免为了刷新计数重新签发地址。
Future<EpisodeStats> episodeStats(String episodeId);
/// 当前缓存的票据是否还在有效期内(用于"回前台发现过期就重新取")。
bool isFresh(String episodeId);
}
@@ -42,6 +46,10 @@ class HttpPlaybackRepository implements PlaybackRepository {
return ticket;
}
@override
Future<EpisodeStats> episodeStats(String episodeId) =>
_api.episodeStats(episodeId);
@override
bool isFresh(String episodeId) {
final cached = _cache[episodeId];
@@ -65,11 +73,22 @@ class _CachedTicket {
/// 测试与离线场景用:按集返回固定票据,并记录被请求过几次。
class FakePlaybackRepository implements PlaybackRepository {
FakePlaybackRepository({this.ticket, this.error, this.fresh = true});
FakePlaybackRepository({
this.ticket,
this.error,
this.fresh = true,
this.stats,
this.statsError,
Map<String, EpisodeStats>? statsByEpisode,
}) : statsByEpisode = statsByEpisode ?? {};
PlayTicket? ticket;
Object? error;
EpisodeStats? stats;
Object? statsError;
final Map<String, EpisodeStats> statsByEpisode;
final List<String> requests = [];
final List<String> statsRequests = [];
final List<bool> forced = [];
/// 模拟"票据是否还有效":置 false 可验证回前台会重新取。
@@ -95,4 +114,13 @@ class FakePlaybackRepository implements PlaybackRepository {
qualities: const ['AUTO', '720P', '1080P'],
);
}
@override
Future<EpisodeStats> episodeStats(String episodeId) async {
statsRequests.add(episodeId);
if (statsError != null) throw statsError!;
final value = statsByEpisode[episodeId] ?? stats;
if (value != null) return value;
throw StateError('episode stats not configured for $episodeId');
}
}