feat(player): 切集刷新互动计数统计
This commit is contained in:
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');
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user