103 lines
2.3 KiB
Dart
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;
|
|
}
|
|
}
|