import '../../core/contracts/library.dart'; import '../../core/contracts/tmdb.dart'; import '../mappers/tmdb_image_url.dart'; int? seasonNumberFrom(EmbyRawSeason season) { final indexNumber = season.IndexNumber; if (indexNumber != null) return indexNumber; final name = season.Name.trim().toLowerCase(); if (name == 'specials' || name == '特别篇' || name == 'sp') return 0; final match = RegExp(r'\d+').firstMatch(season.Name); if (match == null) return null; return int.tryParse(match.group(0)!); } Map tmdbStillUrlsByEpisode( TmdbSeasonDetail? season, String? imageBaseUrl, ) { if (season == null || imageBaseUrl == null || imageBaseUrl.isEmpty) { return const {}; } final urls = {}; for (final episode in season.episodes) { final url = TmdbImageUrl.still( imageBaseUrl, episode.stillPath, size: 'w500', ); if (url != null && url.isNotEmpty) { urls[episode.episodeNumber] = url; } } return urls; }