-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.dart
More file actions
117 lines (99 loc) · 4.77 KB
/
Copy pathmain.dart
File metadata and controls
117 lines (99 loc) · 4.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import 'dart:async';
import 'package:audio_service/audio_service.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:liberated_beats/data/beat_repository.dart';
import 'package:liberated_beats/data/liked_store.dart';
import 'package:liberated_beats/data/offline_media_store.dart';
import 'package:liberated_beats/data/play_stats_store.dart';
import 'package:liberated_beats/data/server_registry.dart';
import 'package:liberated_beats/providers/background_audio_provider.dart';
import 'package:liberated_beats/providers/liked_provider.dart';
import 'package:liberated_beats/providers/play_stats_provider.dart';
import 'package:liberated_beats/providers/theme_provider.dart';
import 'package:liberated_beats/services/audio_playback_service.dart';
import 'package:liberated_beats/services/beat_download_service.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'app.dart';
import 'data/beatmix_repository.dart';
import 'providers/catalog_provider.dart';
Future<void> main() async {
if (kDebugMode) {
CachedNetworkImage.logLevel = CacheManagerLogLevel.debug;
} else {
// Log to file?
CachedNetworkImage.logLevel = CacheManagerLogLevel.warning;
}
WidgetsFlutterBinding.ensureInitialized();
// fonts are bundled in assets/google_fonts, no runtime download
GoogleFonts.config.allowRuntimeFetching = false;
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
// dark unless the user chose otherwise; also styles the system chrome
final themeController = ThemeController();
await themeController.load(await SharedPreferences.getInstance());
final serverRegistry = ServerRegistry();
final audioPlaybackService = AudioPlaybackService();
// first run seed comes from --dart-define=LIBREBEATS_SEED_URLS / _KEYS,
// after that servers are managed in settings
await serverRegistry.load(seed: _seedServersFromEnvironment());
// dont await, LibreProvider waits for this before fetching
serverRegistry.connectAll();
// awaited so the platform side is bound before the app starts playing
await setupAudioService(audioPlaybackService);
final beatMixRepository = BeatMixRepository(serverRegistry);
final beatRepository = BeatRepository(serverRegistry);
final likedProvider = LikedProvider(
LikedStore(), OfflineMediaStore(), BackgroundMediaDownloader());
// loads the liked list, cleans the offline dir and retries unfinished
// downloads, no need to hold up startup for it
unawaited(likedProvider.init());
// downloaded liked beats play from disk wherever they get tapped, the
// liked screen, home history, search. Resolved per play, so un-liking
// just makes the beat stream again.
audioPlaybackService.localSourceResolver =
(beat) => likedProvider.localAudioFor(beat.key);
// play counts for the home screen's On repeat / Heavy rotation, counted
// by the service (30s or half the track) and persisted on device
final playStatsProvider = PlayStatsProvider(PlayStatsStore());
unawaited(playStatsProvider.init());
audioPlaybackService.setPlayCountedCallback(playStatsProvider.recordPlay);
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider<ThemeController>.value(value: themeController),
ChangeNotifierProvider<ServerRegistry>.value(value: serverRegistry),
Provider<BeatMixRepository>.value(value: beatMixRepository),
Provider<BeatRepository>.value(value: beatRepository),
Provider<AudioPlaybackService>.value(value: audioPlaybackService),
ChangeNotifierProvider(
create: (_) => BackgroundAudioProvider(audioPlaybackService)),
ChangeNotifierProvider(
create: (_) => LibreProvider(
serverRegistry, beatMixRepository, beatRepository)),
ChangeNotifierProvider<LikedProvider>.value(value: likedProvider),
ChangeNotifierProvider<PlayStatsProvider>.value(
value: playStatsProvider),
],
child: const LiberatedBeatsApp(),
),
);
}
List<(String, String)> _seedServersFromEnvironment() {
const urls = String.fromEnvironment('LIBREBEATS_SEED_URLS');
const keys = String.fromEnvironment('LIBREBEATS_SEED_KEYS');
return ServerRegistry.parseSeedList(urls, keys);
}
Future<void> setupAudioService(BaseAudioHandler audioPlayback) async {
await AudioService.init(
builder: () => audioPlayback,
config: const AudioServiceConfig(
androidNotificationChannelId: 'com.librebeats.audio',
androidNotificationChannelName: 'LibreBeats playback',
androidNotificationOngoing: true,
preloadArtwork: true,
));
}