Line data Source code
1 : import 'package:flutter_chrome_cast/lib.dart';
2 :
3 : /// Extensions for [GoogleCastMediaMetadata] to provide additional functionality.
4 : extension GoogleCastMediaMetadataExtensions on GoogleCastMediaMetadata {
5 : /// Extracts the title from the metadata based on the metadata type.
6 0 : String? get extractedTitle {
7 0 : final type = metadataType;
8 : String? title;
9 : final metadata = this;
10 :
11 : switch (type) {
12 0 : case GoogleCastMediaMetadataType.tvShowMediaMetadata:
13 : metadata as GoogleCastTvShowMediaMetadata;
14 0 : title = metadata.seriesTitle;
15 : break;
16 0 : case GoogleCastMediaMetadataType.genericMediaMetadata:
17 : metadata as GoogleCastGenericMediaMetadata;
18 0 : title = metadata.title;
19 : break;
20 0 : case GoogleCastMediaMetadataType.movieMediaMetadata:
21 : metadata as GoogleCastMovieMediaMetadata;
22 0 : title = metadata.title;
23 : break;
24 0 : case GoogleCastMediaMetadataType.musicTrackMediaMetadata:
25 : metadata as GoogleCastMusicMediaMetadata;
26 0 : title = metadata.title;
27 : break;
28 0 : case GoogleCastMediaMetadataType.photoMediaMetadata:
29 : metadata as GoogleCastPhotoMediaMetadata;
30 0 : title = metadata.title;
31 : break;
32 : default:
33 : }
34 : return title;
35 : }
36 :
37 : /// Extracts the subtitle from the metadata based on the metadata type.
38 0 : String? get extractedSubtitle {
39 0 : final type = metadataType;
40 : String? subtitle;
41 : final metadata = this;
42 :
43 : switch (type) {
44 0 : case GoogleCastMediaMetadataType.tvShowMediaMetadata:
45 : metadata as GoogleCastTvShowMediaMetadata;
46 : // For TV shows, create subtitle from season and episode info
47 0 : if (metadata.season != null && metadata.episode != null) {
48 0 : subtitle = 'S${metadata.season}E${metadata.episode}';
49 0 : } else if (metadata.season != null) {
50 0 : subtitle = 'Season ${metadata.season}';
51 0 : } else if (metadata.episode != null) {
52 0 : subtitle = 'Episode ${metadata.episode}';
53 : }
54 : break;
55 0 : case GoogleCastMediaMetadataType.genericMediaMetadata:
56 : metadata as GoogleCastGenericMediaMetadata;
57 0 : subtitle = metadata.subtitle;
58 : break;
59 0 : case GoogleCastMediaMetadataType.movieMediaMetadata:
60 : metadata as GoogleCastMovieMediaMetadata;
61 0 : subtitle = metadata.subtitle;
62 : break;
63 0 : case GoogleCastMediaMetadataType.musicTrackMediaMetadata:
64 : metadata as GoogleCastMusicMediaMetadata;
65 : // For music, use album name or artist as subtitle
66 0 : subtitle = metadata.albumName ?? metadata.artist;
67 : break;
68 0 : case GoogleCastMediaMetadataType.photoMediaMetadata:
69 : metadata as GoogleCastPhotoMediaMetadata;
70 0 : subtitle = metadata.artist;
71 : break;
72 : default:
73 : }
74 : //replace line breaks with spaces
75 : if (subtitle != null) {
76 0 : subtitle = subtitle.replaceAll('\n', ' ').replaceAll('\r', ' ');
77 : }
78 : return subtitle;
79 : }
80 : }
81 :
82 : /// Extensions for [Duration] to provide formatting functionality.
83 : extension DurationExtension on Duration {
84 : /// Formats the duration as a readable string.
85 0 : String get formatted {
86 0 : int seconds = inSeconds;
87 0 : final days = seconds ~/ Duration.secondsPerDay;
88 0 : seconds -= days * Duration.secondsPerDay;
89 0 : final hours = seconds ~/ Duration.secondsPerHour;
90 0 : seconds -= hours * Duration.secondsPerHour;
91 0 : final minutes = seconds ~/ Duration.secondsPerMinute;
92 0 : seconds -= minutes * Duration.secondsPerMinute;
93 :
94 0 : final List<String> tokens = [];
95 0 : if (days != 0) {
96 0 : tokens.add('${days}d');
97 : }
98 0 : if (tokens.isNotEmpty || hours != 0) {
99 0 : tokens.add('$hours');
100 : }
101 :
102 0 : tokens.add('$minutes'.padLeft(2, '0'));
103 :
104 0 : tokens.add('$seconds'.padLeft(2, '0'));
105 :
106 0 : return tokens.join(':');
107 : }
108 : }
|