@@ -7,9 +7,6 @@ import 'package:dart_vlc_ffi/src/mediaSource/mediaSource.dart';
7
7
import 'package:dart_vlc_ffi/src/enums/mediaSourceType.dart' ;
8
8
import 'package:dart_vlc_ffi/src/enums/mediaType.dart' ;
9
9
10
- /// Internally used class to avoid direct creation of the object of a [Media] class.
11
- class _Media extends Media {}
12
-
13
10
/// A media object to open inside a [Player] .
14
11
///
15
12
/// Pass `true` to [parse] for retrieving the metadata of the [Media] .
@@ -29,20 +26,22 @@ class _Media extends Media {}
29
26
/// ```
30
27
///
31
28
///
32
- class Media extends MediaSource {
33
- MediaSourceType mediaSourceType = MediaSourceType .media;
34
- Map <String , String > metas = {};
35
- late MediaType mediaType;
36
- late String resource;
29
+ class Media implements MediaSource {
30
+ MediaSourceType get mediaSourceType => MediaSourceType .media;
31
+ final MediaType mediaType;
32
+ final String resource;
33
+ final Map <String , String > metas;
34
+
35
+ const Media ._(
36
+ {required this .mediaType, required this .resource, this .metas = const {}});
37
37
38
38
/// Makes [Media] object from a [File] .
39
39
static Media file (File file,
40
40
{bool parse: false ,
41
41
Map <String , dynamic >? extras,
42
42
Duration timeout: const Duration (seconds: 10 )}) {
43
- Media media = new _Media ();
44
- media.mediaType = MediaType .file;
45
- media.resource = file.path;
43
+ final media = Media ._(mediaType: MediaType .file, resource: file.path);
44
+
46
45
if (parse) {
47
46
media.parse (timeout);
48
47
}
@@ -54,12 +53,10 @@ class Media extends MediaSource {
54
53
{bool parse: false ,
55
54
Map <String , dynamic >? extras,
56
55
Duration timeout: const Duration (seconds: 10 )}) {
57
- Media media = new _Media ();
58
- media.mediaType = MediaType .network;
59
- if (url is Uri )
60
- media.resource = url.toString ();
61
- else
62
- media.resource = url;
56
+ final resource = (url is Uri ) ? url.toString () : url;
57
+ final Media media =
58
+ Media ._(mediaType: MediaType .network, resource: resource);
59
+
63
60
if (parse) {
64
61
media.parse (timeout);
65
62
}
@@ -68,12 +65,20 @@ class Media extends MediaSource {
68
65
69
66
/// Makes [Media] object from direct show.
70
67
static Media directShow (
71
- {String vdev = '' , String adev = '' , required int liveCaching}) {
72
- Media media = new _Media ();
73
- media.mediaType = MediaType .directShow;
74
- media.resource =
75
- 'dshow:// :dshow-vdev=$vdev :dshow-adev=$adev :live-caching=$liveCaching ' ;
76
- return media;
68
+ {String ? rawUrl,
69
+ Map <String , dynamic >? args,
70
+ String ? vdev,
71
+ String ? adev,
72
+ int ? liveCaching}) {
73
+ final resourceUrl = rawUrl ??
74
+ _buildDirectShowUrl (args ??
75
+ {
76
+ 'dshow-vdev' : vdev,
77
+ 'dshow-adev' : adev,
78
+ 'live-caching' : liveCaching
79
+ });
80
+
81
+ return Media ._(mediaType: MediaType .directShow, resource: resourceUrl);
77
82
}
78
83
79
84
/// Makes [Media] object from assets.
@@ -84,26 +89,15 @@ class Media extends MediaSource {
84
89
/// Might result in an exception on Dart CLI.
85
90
///
86
91
static Media asset (String asset) {
87
- Media media = new _Media ();
88
- media.mediaType = MediaType .asset;
89
- late String directory;
90
- if (Platform .isWindows) {
91
- directory = Platform .resolvedExecutable
92
- .split ('\\ ' )
93
- .sublist (0 , Platform .resolvedExecutable.split ('\\ ' ).length - 1 )
94
- .join ('\\ ' );
95
- media.resource =
96
- path.join ('file:///' + directory, 'data' , 'flutter_assets' , asset);
97
- }
98
- if (Platform .isLinux) {
99
- directory = Platform .resolvedExecutable
100
- .split ('/' )
101
- .sublist (0 , Platform .resolvedExecutable.split ('/' ).length - 1 )
102
- .join ('/' );
103
- media.resource =
104
- path.join ('file://' + directory, 'data' , 'flutter_assets' , asset);
92
+ if (Platform .isWindows || Platform .isLinux) {
93
+ final assetPath = path.join (path.dirname (Platform .resolvedExecutable),
94
+ 'data' , 'flutter_assets' , asset);
95
+ final url = Uri .file (assetPath, windows: Platform .isWindows);
96
+ return Media ._(mediaType: MediaType .asset, resource: url.toString ());
105
97
}
106
- return media;
98
+
99
+ // TODO: Add macOS asset path support.
100
+ throw UnimplementedError ('The platform is not supported' );
107
101
}
108
102
109
103
/// Parses the [Media] to retrieve [Media.metas] .
@@ -139,4 +133,24 @@ class Media extends MediaSource {
139
133
this .metas['trackTotal' ] = metas.elementAt (22 ).value.toDartString ();
140
134
this .metas['url' ] = metas.elementAt (23 ).value.toDartString ();
141
135
}
136
+
137
+ static String _buildDirectShowUrl (Map <String , dynamic > args) {
138
+ return args.entries.fold (
139
+ 'dshow://' ,
140
+ (prev, pair) =>
141
+ prev +
142
+ (pair.value != null
143
+ ? ' :${pair .key .toLowerCase ()}=${pair .value }'
144
+ : '' ));
145
+ }
146
+
147
+ int get hashCode => mediaType.hashCode ^ resource.hashCode;
148
+
149
+ bool operator == (Object other) =>
150
+ other is Media &&
151
+ other.mediaType == mediaType &&
152
+ other.resource == resource;
153
+
154
+ @override
155
+ String toString () => '[$mediaType ]$resource ' ;
142
156
}
0 commit comments