From ffbd5040429845993b31211f1ec44f86f77aa480 Mon Sep 17 00:00:00 2001 From: Micah Morrison Date: Fri, 23 Jan 2026 20:21:08 -0500 Subject: [PATCH] Add episode release date to episode listing within season --- lib/main.dart | 4 ++++ lib/models/plex_metadata.dart | 4 ++++ lib/models/plex_metadata.g.dart | 2 ++ lib/screens/season_detail_screen.dart | 16 ++++++++++++++++ lib/utils/formatters.dart | 17 +++++++++++++++++ 5 files changed, 43 insertions(+) diff --git a/lib/main.dart b/lib/main.dart index 168af9cb..7e31b98d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -39,6 +39,7 @@ import 'utils/orientation_helper.dart'; import 'utils/language_codes.dart'; import 'i18n/strings.g.dart'; import 'focus/input_mode_tracker.dart'; +import 'package:intl/date_symbol_data_local.dart'; // Workaround for Flutter bug #177992: iPadOS 26.1+ misinterprets fake touch events // at (0,0) as barrier taps, causing modals to dismiss immediately. @@ -68,6 +69,9 @@ void main() async { // Initialize localization with saved locale LocaleSettings.setLocale(savedLocale); + // Needed for formatting dates in different locales + await initializeDateFormatting(savedLocale.languageCode, null); + // Configure image cache for large libraries PaintingBinding.instance.imageCache.maximumSizeBytes = 200 << 20; // 200MB diff --git a/lib/models/plex_metadata.dart b/lib/models/plex_metadata.dart index fc90a793..492e1b16 100644 --- a/lib/models/plex_metadata.dart +++ b/lib/models/plex_metadata.dart @@ -47,6 +47,7 @@ class PlexMetadata with MultiServerFields { final double? rating; final double? audienceRating; final int? year; + final String? originallyAvailableAt; // Full release date (YYYY-MM-DD) final String? thumb; final String? art; final int? duration; @@ -120,6 +121,7 @@ class PlexMetadata with MultiServerFields { this.rating, this.audienceRating, this.year, + this.originallyAvailableAt, this.thumb, this.art, this.duration, @@ -165,6 +167,7 @@ class PlexMetadata with MultiServerFields { double? rating, double? audienceRating, int? year, + String? originallyAvailableAt, String? thumb, String? art, int? duration, @@ -208,6 +211,7 @@ class PlexMetadata with MultiServerFields { rating: rating ?? this.rating, audienceRating: audienceRating ?? this.audienceRating, year: year ?? this.year, + originallyAvailableAt: originallyAvailableAt ?? this.originallyAvailableAt, thumb: thumb ?? this.thumb, art: art ?? this.art, duration: duration ?? this.duration, diff --git a/lib/models/plex_metadata.g.dart b/lib/models/plex_metadata.g.dart index 7485e05c..19372516 100644 --- a/lib/models/plex_metadata.g.dart +++ b/lib/models/plex_metadata.g.dart @@ -18,6 +18,7 @@ PlexMetadata _$PlexMetadataFromJson(Map json) => PlexMetadata( rating: (json['rating'] as num?)?.toDouble(), audienceRating: (json['audienceRating'] as num?)?.toDouble(), year: (json['year'] as num?)?.toInt(), + originallyAvailableAt: json['originallyAvailableAt'] as String?, thumb: json['thumb'] as String?, art: json['art'] as String?, duration: (json['duration'] as num?)?.toInt(), @@ -60,6 +61,7 @@ Map _$PlexMetadataToJson(PlexMetadata instance) => parts) { return parts.join(' · '); } + +/// Takes a date string in the format "YYYY-MM-DD" and returns a localized full date string +/// If there is any error, `dateString` is returned as is +String formatFullDate(String dateString) { + try { + // Parse the date + final date = DateTime.parse(dateString); + + // Create a DateFormat with the full date pattern for the current locale + final formatter = DateFormat.yMMMMd(LocaleSettings.currentLocale.languageCode); + + return formatter.format(date); + } catch (e) { + return dateString; + } +}