feat: display movie edition titles across all views

This commit is contained in:
edde746
2026-03-09 16:16:37 +01:00
parent a6852d716f
commit 82b0de9223
7 changed files with 23 additions and 5 deletions
+4
View File
@@ -99,6 +99,7 @@ class PlexMetadata with MultiServerFields {
final String? audienceRatingImage; // Audience rating source URI
final String? tagline;
final String? originalTitle;
final String? editionTitle; // Edition name for movies (e.g., "Director's Cut", "Extended")
final String? subtype; // Clip subtype: "trailer", "behindTheScenes", "deleted", etc.
final int? extraType; // Numeric extra type identifier
final String? primaryExtraKey; // Points to main trailer (e.g., "/library/metadata/52601")
@@ -186,6 +187,7 @@ class PlexMetadata with MultiServerFields {
this.audienceRatingImage,
this.tagline,
this.originalTitle,
this.editionTitle,
this.subtype,
this.extraType,
this.primaryExtraKey,
@@ -244,6 +246,7 @@ class PlexMetadata with MultiServerFields {
String? audienceRatingImage,
String? tagline,
String? originalTitle,
String? editionTitle,
String? subtype,
int? extraType,
String? primaryExtraKey,
@@ -300,6 +303,7 @@ class PlexMetadata with MultiServerFields {
audienceRatingImage: audienceRatingImage ?? this.audienceRatingImage,
tagline: tagline ?? this.tagline,
originalTitle: originalTitle ?? this.originalTitle,
editionTitle: editionTitle ?? this.editionTitle,
subtype: subtype ?? this.subtype,
extraType: extraType ?? this.extraType,
primaryExtraKey: primaryExtraKey ?? this.primaryExtraKey,
+2
View File
@@ -54,6 +54,7 @@ PlexMetadata _$PlexMetadataFromJson(Map<String, dynamic> json) => PlexMetadata(
audienceRatingImage: json['audienceRatingImage'] as String?,
tagline: json['tagline'] as String?,
originalTitle: json['originalTitle'] as String?,
editionTitle: json['editionTitle'] as String?,
subtype: json['subtype'] as String?,
extraType: (json['extraType'] as num?)?.toInt(),
primaryExtraKey: json['primaryExtraKey'] as String?,
@@ -109,6 +110,7 @@ Map<String, dynamic> _$PlexMetadataToJson(PlexMetadata instance) => <String, dyn
'audienceRatingImage': instance.audienceRatingImage,
'tagline': instance.tagline,
'originalTitle': instance.originalTitle,
'editionTitle': instance.editionTitle,
'subtype': instance.subtype,
'extraType': instance.extraType,
'primaryExtraKey': instance.primaryExtraKey,
+1
View File
@@ -2041,6 +2041,7 @@ class _MediaDetailScreenState extends State<MediaDetailScreen>
runSpacing: 8,
children: [
if (metadata.year != null) _buildMetadataChip('${metadata.year}'),
if (metadata.editionTitle != null) _buildMetadataChip(metadata.editionTitle!),
if (metadata.contentRating != null)
_buildMetadataChip(formatContentRating(metadata.contentRating!)),
if (metadata.duration != null)
+6 -2
View File
@@ -248,8 +248,12 @@ class _PlaylistItemCardState extends State<PlaylistItemCard> {
}
return widget.item.displaySubtitle ?? t.discover.tvShow;
} else if (itemType == 'movie') {
// For movies, show year
return widget.item.year?.toString() ?? t.discover.movie;
// For movies, show year and edition
final year = widget.item.year?.toString();
if (year != null && widget.item.editionTitle != null) {
return '$year · ${widget.item.editionTitle}';
}
return year ?? t.discover.movie;
}
// Default to type
+8 -1
View File
@@ -455,6 +455,11 @@ class _MediaCardList extends StatelessWidget {
parts.add('${metadata.year}');
}
// Add edition title
if (metadata.editionTitle != null) {
parts.add(metadata.editionTitle!);
}
// Add duration
if (metadata.duration != null) {
parts.add(formatDurationTextual(metadata.duration!));
@@ -749,7 +754,9 @@ class _MediaCardHelpers {
);
} else if (metadata.year != null) {
return Text(
'${metadata.year}',
metadata.editionTitle != null ? '${metadata.year} · ${metadata.editionTitle}' : '${metadata.year}',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: Theme.of(
context,
).textTheme.bodySmall?.copyWith(color: tokens(context).textMuted, fontSize: 11, height: 1.1),
@@ -137,7 +137,7 @@ class QueueSheet extends StatelessWidget {
return item.grandparentTitle!;
}
if (item.year != null) {
return '${item.year}';
return item.editionTitle != null ? '${item.year} · ${item.editionTitle}' : '${item.year}';
}
return item.type;
}
@@ -510,7 +510,7 @@ class ContentStripState extends State<ContentStrip> {
return '${item.grandparentTitle} \u00b7 S${item.parentIndex}E${item.index}';
}
if (item.grandparentTitle != null) return item.grandparentTitle!;
if (item.year != null) return '${item.year}';
if (item.year != null) return item.editionTitle != null ? '${item.year} · ${item.editionTitle}' : '${item.year}';
return item.type;
}