Files
sm-emby-share/lib/features/discover/trakt_continue_watching_item.dart
T
2026-07-14 11:11:36 +08:00

103 lines
2.3 KiB
Dart

import '../../core/contracts/trakt/trakt_playback_entry.dart';
class TraktContinueWatchingItem {
final int tmdbId;
final String mediaType;
final String title;
final String? subtitle;
final double progress;
final String? backdropUrl;
const TraktContinueWatchingItem({
required this.tmdbId,
required this.mediaType,
required this.title,
required this.subtitle,
required this.progress,
required this.backdropUrl,
});
static TraktContinueWatchingItem? fromEntry(
TraktPlaybackEntry e, {
String? backdropUrl,
}) {
final progress = (e.progress / 100.0).clamp(0.0, 1.0).toDouble();
if (e.type == 'movie') {
final tmdb = e.movieIds?.tmdb;
if (tmdb == null || tmdb <= 0) return null;
return TraktContinueWatchingItem(
tmdbId: tmdb,
mediaType: 'movie',
title: e.movieTitle ?? '',
subtitle: e.movieYear?.toString(),
progress: progress,
backdropUrl: backdropUrl,
);
}
final tmdb = e.showIds?.tmdb;
if (tmdb == null || tmdb <= 0) return null;
return TraktContinueWatchingItem(
tmdbId: tmdb,
mediaType: 'tv',
title: e.showTitle ?? '',
subtitle: _episodeSubtitle(
e.episodeSeason,
e.episodeNumber,
e.episodeTitle,
),
progress: progress,
backdropUrl: backdropUrl,
);
}
TraktContinueWatchingItem withBackdrop(String? url) {
return TraktContinueWatchingItem(
tmdbId: tmdbId,
mediaType: mediaType,
title: title,
subtitle: subtitle,
progress: progress,
backdropUrl: url,
);
}
TraktContinueWatchingItem withTitle(String title) {
return TraktContinueWatchingItem(
tmdbId: tmdbId,
mediaType: mediaType,
title: title,
subtitle: subtitle,
progress: progress,
backdropUrl: backdropUrl,
);
}
static String? _episodeSubtitle(int? season, int? number, String? title) {
final String base;
if (season != null && season > 0 && number != null) {
base = '$season季$number集';
} else if (number != null) {
base = '$number集';
} else {
base = '';
}
final t = title?.trim();
if (t != null && t.isNotEmpty) {
return base.isEmpty ? t : '$base · $t';
}
return base.isEmpty ? null : base;
}
}