Skip to content

Commit 74253f1

Browse files
committed
feature: audio support
1 parent 4cae764 commit 74253f1

6 files changed

Lines changed: 104 additions & 8 deletions

File tree

lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:nhk_easy/widget/news_list.dart';
88
main() async {
99
WidgetsFlutterBinding.ensureInitialized();
1010

11-
await GlobalConfiguration().loadFromAsset("config");
11+
await GlobalConfiguration().loadFromAsset('config');
1212

1313
runZoned<Future<void>>(() async {
1414
runApp(MyApp());

lib/model/news.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ class News {
1313

1414
int publishedAtEpoch;
1515

16+
String m3u8Url;
17+
1618
News();
1719

1820
factory News.fromJson(Map<String, dynamic> json) {
@@ -25,6 +27,7 @@ class News {
2527
news.publishedAtUtc = json['publishedAtUtc'];
2628
news.publishedAtEpoch =
2729
DateTime.parse(news.publishedAtUtc).millisecondsSinceEpoch;
30+
news.m3u8Url = json['m3u8Url'];
2831

2932
return news;
3033
}
@@ -37,7 +40,8 @@ class News {
3740
'body': body,
3841
'imageUrl': imageUrl,
3942
'publishedAtUtc': publishedAtUtc,
40-
'publishedAtEpoch': publishedAtEpoch
43+
'publishedAtEpoch': publishedAtEpoch,
44+
'm3u8Url': m3u8Url
4145
};
4246
}
4347
}

lib/repository/base_repository.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class BaseRepository {
1212
onUpgrade: (db, oldVersion, newVersion) {
1313
_executeScript(db);
1414
},
15-
version: 3,
15+
version: 4,
1616
);
1717

1818
return database;
@@ -35,7 +35,7 @@ class BaseRepository {
3535
batch.execute(
3636
'CREATE TABLE IF NOT EXISTS config(id INTEGER PRIMARY KEY, newsFetchedStartUtc TEXT, newsFetchedEndUtc TEXT)');
3737
batch.execute(
38-
'CREATE TABLE IF NOT EXISTS news(newsId TEXT PRIMARY KEY, title TEXT, titleWithRuby TEXT, body TEXT, imageUrl TEXT, publishedAtUtc TEXT, publishedAtEpoch INTEGER)');
38+
'CREATE TABLE IF NOT EXISTS news(newsId TEXT PRIMARY KEY, title TEXT, titleWithRuby TEXT, body TEXT, imageUrl TEXT, publishedAtUtc TEXT, publishedAtEpoch INTEGER, m3u8Url TEXT)');
3939

4040
batch.commit();
4141
}

lib/widget/news_detail.dart

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,40 @@
11
import 'dart:convert';
22

33
import 'package:flutter/material.dart';
4+
import 'package:just_audio/just_audio.dart';
5+
import 'package:nhk_easy/error_reporter.dart';
46
import 'package:nhk_easy/model/news.dart';
57
import 'package:webview_flutter/webview_flutter.dart';
68

79
class NewsDetail extends StatelessWidget {
810
final News news;
11+
AudioPlayer _audioPlayer;
912

10-
NewsDetail({Key key, @required this.news}) : super(key: key);
13+
NewsDetail({Key key, @required this.news}) : super(key: key) {
14+
_audioPlayer = AudioPlayer();
15+
16+
if (_hasAudio()) {
17+
_audioPlayer.setUrl(news.m3u8Url).catchError((error, stackTrace) {
18+
ErrorReporter.reportError(error, stackTrace);
19+
});
20+
}
21+
}
1122

1223
@override
1324
Widget build(BuildContext context) {
14-
return Scaffold(
25+
return WillPopScope(
26+
onWillPop: () async {
27+
if (_hasAudio()) {
28+
try {
29+
await _audioPlayer.dispose();
30+
} catch (error, stackTrace) {
31+
ErrorReporter.reportError(error, stackTrace);
32+
}
33+
}
34+
35+
return true;
36+
},
37+
child: Scaffold(
1538
appBar: AppBar(
1639
title: Text('NHK NEWS EASY'),
1740
),
@@ -21,7 +44,29 @@ class NewsDetail extends StatelessWidget {
2144
initialUrl: Uri.dataFromString(_buildHtml(news),
2245
mimeType: 'text/html', encoding: utf8)
2346
.toString()),
24-
));
47+
),
48+
floatingActionButton: _hasAudio()
49+
? FloatingActionButton(
50+
onPressed: () async {
51+
if (_audioPlayer.playbackState ==
52+
AudioPlaybackState.stopped ||
53+
_audioPlayer.playbackState == AudioPlaybackState.paused) {
54+
_audioPlayer.play().catchError((error, stackTrace) {
55+
ErrorReporter.reportError(error, stackTrace);
56+
});
57+
} else if (_audioPlayer.playbackState ==
58+
AudioPlaybackState.playing) {
59+
_audioPlayer.pause().catchError((error, stackTrace) {
60+
ErrorReporter.reportError(error, stackTrace);
61+
});
62+
}
63+
},
64+
child: _audioPlayer.playbackState == AudioPlaybackState.playing
65+
? Icon(Icons.pause)
66+
: Icon(Icons.play_arrow))
67+
: Container(),
68+
),
69+
);
2570
}
2671

2772
_buildHtml(News news) {
@@ -52,4 +97,8 @@ class NewsDetail extends StatelessWidget {
5297
</html>
5398
""";
5499
}
100+
101+
bool _hasAudio() {
102+
return news.m3u8Url != null && news.m3u8Url != '';
103+
}
55104
}

pubspec.lock

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,13 @@ packages:
114114
url: "https://pub.flutter-io.cn"
115115
source: hosted
116116
version: "2.1.12"
117+
just_audio:
118+
dependency: "direct main"
119+
description:
120+
name: just_audio
121+
url: "https://pub.flutter-io.cn"
122+
source: hosted
123+
version: "0.1.10"
117124
matcher:
118125
dependency: transitive
119126
description:
@@ -135,6 +142,27 @@ packages:
135142
url: "https://pub.flutter-io.cn"
136143
source: hosted
137144
version: "1.6.4"
145+
path_provider:
146+
dependency: transitive
147+
description:
148+
name: path_provider
149+
url: "https://pub.flutter-io.cn"
150+
source: hosted
151+
version: "1.6.9"
152+
path_provider_macos:
153+
dependency: transitive
154+
description:
155+
name: path_provider_macos
156+
url: "https://pub.flutter-io.cn"
157+
source: hosted
158+
version: "0.0.4+3"
159+
path_provider_platform_interface:
160+
dependency: transitive
161+
description:
162+
name: path_provider_platform_interface
163+
url: "https://pub.flutter-io.cn"
164+
source: hosted
165+
version: "1.0.2"
138166
pedantic:
139167
dependency: transitive
140168
description:
@@ -149,6 +177,13 @@ packages:
149177
url: "https://pub.flutter-io.cn"
150178
source: hosted
151179
version: "2.4.0"
180+
platform:
181+
dependency: transitive
182+
description:
183+
name: platform
184+
url: "https://pub.flutter-io.cn"
185+
source: hosted
186+
version: "2.2.1"
152187
platform_detect:
153188
dependency: transitive
154189
description:
@@ -184,6 +219,13 @@ packages:
184219
url: "https://pub.flutter-io.cn"
185220
source: hosted
186221
version: "2.1.3"
222+
rxdart:
223+
dependency: transitive
224+
description:
225+
name: rxdart
226+
url: "https://pub.flutter-io.cn"
227+
source: hosted
228+
version: "0.24.1"
187229
sentry:
188230
dependency: "direct main"
189231
description:

pubspec.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ description: A new Flutter application.
1111
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
1212
# Read more about iOS versioning at
1313
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
14-
version: 1.1.2+5
14+
version: 1.2.0+6
1515

1616
environment:
1717
sdk: ">=2.2.0 <3.0.0"
@@ -33,6 +33,7 @@ dependencies:
3333
global_configuration: ^1.5.0
3434
settings_ui: ^0.3.0
3535
url_launcher: ^5.4.10
36+
just_audio: ^0.1.10
3637

3738
dev_dependencies:
3839
flutter_test:

0 commit comments

Comments
 (0)