mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
chore: remove old logger
This commit is contained in:
parent
15211123aa
commit
86ee64c606
@ -6,7 +6,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:spotube/collections/routes.dart';
|
import 'package:spotube/collections/routes.dart';
|
||||||
import 'package:spotube/modules/player/player_controls.dart';
|
import 'package:spotube/modules/player/player_controls.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
import 'package:spotube/pages/home/home.dart';
|
import 'package:spotube/pages/home/home.dart';
|
||||||
import 'package:spotube/pages/library/library.dart';
|
import 'package:spotube/pages/library/library.dart';
|
||||||
import 'package:spotube/pages/lyrics/lyrics.dart';
|
import 'package:spotube/pages/lyrics/lyrics.dart';
|
||||||
@ -21,8 +20,6 @@ class PlayPauseIntent extends Intent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class PlayPauseAction extends Action<PlayPauseIntent> {
|
class PlayPauseAction extends Action<PlayPauseIntent> {
|
||||||
final logger = getLogger(PlayPauseAction);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
invoke(intent) async {
|
invoke(intent) async {
|
||||||
if (PlayerControls.focusNode.canRequestFocus) {
|
if (PlayerControls.focusNode.canRequestFocus) {
|
||||||
|
@ -1,99 +0,0 @@
|
|||||||
import 'package:collection/collection.dart';
|
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
|
|
||||||
final logger = getLogger("List");
|
|
||||||
|
|
||||||
extension MultiSortListMap on List<Map> {
|
|
||||||
/// [preference] - List of properties in which you want to sort the list
|
|
||||||
/// i.e.
|
|
||||||
/// ```
|
|
||||||
/// List<String> preference = ['property1','property2'];
|
|
||||||
/// ```
|
|
||||||
/// This will first sort the list by property1 then by property2
|
|
||||||
///
|
|
||||||
/// [criteria] - List of booleans that specifies the criteria of sort
|
|
||||||
/// i.e., For ascending order `true` and for descending order `false`.
|
|
||||||
/// ```
|
|
||||||
/// List<bool> criteria = [true. false];
|
|
||||||
/// ```
|
|
||||||
List<Map> sortByProperties(List<bool> criteria, List<String> preference) {
|
|
||||||
if (preference.isEmpty || criteria.isEmpty || isEmpty) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
if (preference.length != criteria.length) {
|
|
||||||
logger.d('Criteria length is not equal to preference');
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
int compare(int i, Map a, Map b) {
|
|
||||||
if (a[preference[i]] == b[preference[i]]) {
|
|
||||||
return 0;
|
|
||||||
} else if (a[preference[i]] > b[preference[i]]) {
|
|
||||||
return criteria[i] ? 1 : -1;
|
|
||||||
} else {
|
|
||||||
return criteria[i] ? -1 : 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int sortAll(Map a, Map b) {
|
|
||||||
int i = 0;
|
|
||||||
int result = 0;
|
|
||||||
while (i < preference.length) {
|
|
||||||
result = compare(i, a, b);
|
|
||||||
if (result != 0) break;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sorted((a, b) => sortAll(a, b));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension MultiSortListTupleMap<V> on List<(Map, V)> {
|
|
||||||
/// [preference] - List of properties in which you want to sort the list
|
|
||||||
/// i.e.
|
|
||||||
/// ```
|
|
||||||
/// List<String> preference = ['property1','property2'];
|
|
||||||
/// ```
|
|
||||||
/// This will first sort the list by property1 then by property2
|
|
||||||
///
|
|
||||||
/// [criteria] - List of booleans that specifies the criteria of sort
|
|
||||||
/// i.e., For ascending order `true` and for descending order `false`.
|
|
||||||
/// ```
|
|
||||||
/// List<bool> criteria = [true. false];
|
|
||||||
/// ```
|
|
||||||
List<(Map, V)> sortByProperties(
|
|
||||||
List<bool> criteria, List<String> preference) {
|
|
||||||
if (preference.isEmpty || criteria.isEmpty || isEmpty) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
if (preference.length != criteria.length) {
|
|
||||||
logger.d('Criteria length is not equal to preference');
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
int compare(int i, (Map, V) a, (Map, V) b) {
|
|
||||||
if (a.$1[preference[i]] == b.$1[preference[i]]) {
|
|
||||||
return 0;
|
|
||||||
} else if (a.$1[preference[i]] > b.$1[preference[i]]) {
|
|
||||||
return criteria[i] ? 1 : -1;
|
|
||||||
} else {
|
|
||||||
return criteria[i] ? -1 : 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int sortAll((Map, V) a, (Map, V) b) {
|
|
||||||
int i = 0;
|
|
||||||
int result = 0;
|
|
||||||
while (i < preference.length) {
|
|
||||||
result = compare(i, a, b);
|
|
||||||
if (result != 0) break;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sorted((a, b) => sortAll(a, b));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,74 +0,0 @@
|
|||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:logger/logger.dart';
|
|
||||||
import 'package:path_provider/path_provider.dart';
|
|
||||||
import 'package:path/path.dart' as path;
|
|
||||||
import 'package:spotube/utils/platform.dart';
|
|
||||||
|
|
||||||
final _loggerFactory = SpotubeLogger();
|
|
||||||
final logEnv = {
|
|
||||||
if (!kIsWeb) ...Platform.environment,
|
|
||||||
};
|
|
||||||
|
|
||||||
SpotubeLogger getLogger<T>(T owner) {
|
|
||||||
_loggerFactory.owner = owner is String ? owner : owner.toString();
|
|
||||||
return _loggerFactory;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<File> getLogsPath() async {
|
|
||||||
String dir = (await getApplicationDocumentsDirectory()).path;
|
|
||||||
if (kIsAndroid) {
|
|
||||||
dir = (await getExternalStorageDirectory())?.path ?? "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kIsMacOS) {
|
|
||||||
dir = path.join((await getLibraryDirectory()).path, "Logs");
|
|
||||||
}
|
|
||||||
final file = File(path.join(dir, ".spotube_logs"));
|
|
||||||
if (!await file.exists()) {
|
|
||||||
await file.create(recursive: true);
|
|
||||||
}
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
class SpotubeLogger extends Logger {
|
|
||||||
String? owner;
|
|
||||||
SpotubeLogger([this.owner]) : super(filter: _SpotubeLogFilter());
|
|
||||||
|
|
||||||
@override
|
|
||||||
void log(Level level, dynamic message,
|
|
||||||
{Object? error, StackTrace? stackTrace, DateTime? time}) async {
|
|
||||||
if (!kIsWeb) {
|
|
||||||
if (level == Level.error) {
|
|
||||||
String dir = (await getApplicationDocumentsDirectory()).path;
|
|
||||||
|
|
||||||
if (kIsAndroid) {
|
|
||||||
dir = (await getExternalStorageDirectory())?.path ?? "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kIsMacOS) {
|
|
||||||
dir = path.join((await getLibraryDirectory()).path, "Logs");
|
|
||||||
}
|
|
||||||
|
|
||||||
await File(path.join(dir, ".spotube_logs")).writeAsString(
|
|
||||||
"[${DateTime.now()}]\n$message\n$stackTrace",
|
|
||||||
mode: FileMode.writeOnlyAppend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
super.log(level, "[$owner] $message", error: error, stackTrace: stackTrace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _SpotubeLogFilter extends DevelopmentFilter {
|
|
||||||
@override
|
|
||||||
bool shouldLog(LogEvent event) {
|
|
||||||
if ((logEnv["DEBUG"] == "true" && event.level == Level.debug) ||
|
|
||||||
(logEnv["VERBOSE"] == "true" && event.level == Level.trace) ||
|
|
||||||
(logEnv["ERROR"] == "true" && event.level == Level.error)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return super.shouldLog(event);
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,18 +3,16 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/components/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart';
|
import 'package:spotube/components/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
import 'package:spotube/provider/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
|
|
||||||
class ArtistAlbumList extends HookConsumerWidget {
|
class ArtistAlbumList extends HookConsumerWidget {
|
||||||
final String artistId;
|
final String artistId;
|
||||||
ArtistAlbumList(
|
|
||||||
|
const ArtistAlbumList(
|
||||||
this.artistId, {
|
this.artistId, {
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
|
||||||
final logger = getLogger(ArtistAlbumList);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, ref) {
|
Widget build(BuildContext context, ref) {
|
||||||
final albumsQuery = ref.watch(artistAlbumsProvider(artistId));
|
final albumsQuery = ref.watch(artistAlbumsProvider(artistId));
|
||||||
|
@ -11,7 +11,6 @@ import 'package:spotube/extensions/artist_simple.dart';
|
|||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/extensions/duration.dart';
|
import 'package:spotube/extensions/duration.dart';
|
||||||
import 'package:spotube/models/local_track.dart';
|
import 'package:spotube/models/local_track.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
import 'package:spotube/provider/download_manager_provider.dart';
|
import 'package:spotube/provider/download_manager_provider.dart';
|
||||||
import 'package:spotube/provider/authentication/authentication.dart';
|
import 'package:spotube/provider/authentication/authentication.dart';
|
||||||
import 'package:spotube/provider/audio_player/audio_player.dart';
|
import 'package:spotube/provider/audio_player/audio_player.dart';
|
||||||
@ -22,14 +21,14 @@ class PlayerActions extends HookConsumerWidget {
|
|||||||
final bool floatingQueue;
|
final bool floatingQueue;
|
||||||
final bool showQueue;
|
final bool showQueue;
|
||||||
final List<Widget>? extraActions;
|
final List<Widget>? extraActions;
|
||||||
PlayerActions({
|
|
||||||
|
const PlayerActions({
|
||||||
this.mainAxisAlignment = MainAxisAlignment.center,
|
this.mainAxisAlignment = MainAxisAlignment.center,
|
||||||
this.floatingQueue = true,
|
this.floatingQueue = true,
|
||||||
this.showQueue = true,
|
this.showQueue = true,
|
||||||
this.extraActions,
|
this.extraActions,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
final logger = getLogger(PlayerActions);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, ref) {
|
Widget build(BuildContext context, ref) {
|
||||||
|
@ -10,7 +10,6 @@ import 'package:spotube/collections/intents.dart';
|
|||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/extensions/duration.dart';
|
import 'package:spotube/extensions/duration.dart';
|
||||||
import 'package:spotube/modules/player/use_progress.dart';
|
import 'package:spotube/modules/player/use_progress.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
import 'package:spotube/provider/audio_player/audio_player.dart';
|
import 'package:spotube/provider/audio_player/audio_player.dart';
|
||||||
import 'package:spotube/provider/audio_player/querying_track_info.dart';
|
import 'package:spotube/provider/audio_player/querying_track_info.dart';
|
||||||
import 'package:spotube/services/audio_player/audio_player.dart';
|
import 'package:spotube/services/audio_player/audio_player.dart';
|
||||||
@ -19,14 +18,12 @@ class PlayerControls extends HookConsumerWidget {
|
|||||||
final PaletteGenerator? palette;
|
final PaletteGenerator? palette;
|
||||||
final bool compact;
|
final bool compact;
|
||||||
|
|
||||||
PlayerControls({
|
const PlayerControls({
|
||||||
this.palette,
|
this.palette,
|
||||||
this.compact = false,
|
this.compact = false,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
|
||||||
final logger = getLogger(PlayerControls);
|
|
||||||
|
|
||||||
static FocusNode focusNode = FocusNode();
|
static FocusNode focusNode = FocusNode();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -16,7 +16,6 @@ import 'package:spotube/extensions/constrains.dart';
|
|||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/extensions/image.dart';
|
import 'package:spotube/extensions/image.dart';
|
||||||
import 'package:spotube/hooks/utils/use_brightness_value.dart';
|
import 'package:spotube/hooks/utils/use_brightness_value.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:spotube/provider/authentication/authentication.dart';
|
import 'package:spotube/provider/authentication/authentication.dart';
|
||||||
import 'package:spotube/provider/audio_player/audio_player.dart';
|
import 'package:spotube/provider/audio_player/audio_player.dart';
|
||||||
@ -27,9 +26,8 @@ import 'package:spotube/utils/platform.dart';
|
|||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
class BottomPlayer extends HookConsumerWidget {
|
class BottomPlayer extends HookConsumerWidget {
|
||||||
BottomPlayer({super.key});
|
const BottomPlayer({super.key});
|
||||||
|
|
||||||
final logger = getLogger(BottomPlayer);
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, ref) {
|
Widget build(BuildContext context, ref) {
|
||||||
final auth = ref.watch(authenticationProvider);
|
final auth = ref.watch(authenticationProvider);
|
||||||
|
@ -7,7 +7,7 @@ import 'package:skeletonizer/skeletonizer.dart';
|
|||||||
import 'package:spotube/components/titlebar/titlebar.dart';
|
import 'package:spotube/components/titlebar/titlebar.dart';
|
||||||
import 'package:spotube/modules/artist/artist_album_list.dart';
|
import 'package:spotube/modules/artist/artist_album_list.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
import 'package:spotube/pages/artist/section/footer.dart';
|
import 'package:spotube/pages/artist/section/footer.dart';
|
||||||
import 'package:spotube/pages/artist/section/header.dart';
|
import 'package:spotube/pages/artist/section/header.dart';
|
||||||
import 'package:spotube/pages/artist/section/related_artists.dart';
|
import 'package:spotube/pages/artist/section/related_artists.dart';
|
||||||
@ -18,8 +18,7 @@ class ArtistPage extends HookConsumerWidget {
|
|||||||
static const name = "artist";
|
static const name = "artist";
|
||||||
|
|
||||||
final String artistId;
|
final String artistId;
|
||||||
final logger = getLogger(ArtistPage);
|
const ArtistPage(this.artistId, {super.key});
|
||||||
ArtistPage(this.artistId, {super.key});
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, ref) {
|
Widget build(BuildContext context, ref) {
|
||||||
|
@ -8,7 +8,7 @@ import 'package:spotube/modules/settings/section_card_with_heading.dart';
|
|||||||
import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart';
|
import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart';
|
||||||
import 'package:spotube/components/titlebar/titlebar.dart';
|
import 'package:spotube/components/titlebar/titlebar.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
import 'package:spotube/services/logger/logger.dart';
|
||||||
|
|
||||||
class LogsPage extends HookWidget {
|
class LogsPage extends HookWidget {
|
||||||
static const name = "logs";
|
static const name = "logs";
|
||||||
@ -61,7 +61,7 @@ class LogsPage extends HookWidget {
|
|||||||
|
|
||||||
useEffect(() {
|
useEffect(() {
|
||||||
final timer = Timer.periodic(const Duration(seconds: 5), (t) async {
|
final timer = Timer.periodic(const Duration(seconds: 5), (t) async {
|
||||||
path.value ??= await getLogsPath();
|
path.value ??= await AppLogger.getLogsPath();
|
||||||
final raw = await path.value!.readAsString();
|
final raw = await path.value!.readAsString();
|
||||||
final hasChanged = rawLogs.value != raw;
|
final hasChanged = rawLogs.value != raw;
|
||||||
rawLogs.value = raw;
|
rawLogs.value = raw;
|
||||||
|
@ -7,7 +7,7 @@ import 'package:spotube/services/logger/logger.dart';
|
|||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:spotify/spotify.dart' hide Playlist;
|
import 'package:spotify/spotify.dart' hide Playlist;
|
||||||
import 'package:spotube/models/connect/connect.dart';
|
import 'package:spotube/models/connect/connect.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
import 'package:spotube/provider/connect/clients.dart';
|
import 'package:spotube/provider/connect/clients.dart';
|
||||||
import 'package:web_socket_channel/web_socket_channel.dart';
|
import 'package:web_socket_channel/web_socket_channel.dart';
|
||||||
import 'package:web_socket_channel/status.dart' as status;
|
import 'package:web_socket_channel/status.dart' as status;
|
||||||
@ -46,8 +46,6 @@ final volumeProvider = StateProvider<double>(
|
|||||||
(ref) => 1.0,
|
(ref) => 1.0,
|
||||||
);
|
);
|
||||||
|
|
||||||
final logger = getLogger('ConnectNotifier');
|
|
||||||
|
|
||||||
class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
|
class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
|
||||||
@override
|
@override
|
||||||
build() async {
|
build() async {
|
||||||
@ -58,7 +56,7 @@ class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
|
|||||||
|
|
||||||
final service = connectClients.asData!.value.resolvedService!;
|
final service = connectClients.asData!.value.resolvedService!;
|
||||||
|
|
||||||
logger.t(
|
AppLogger.log.t(
|
||||||
'♾️ Connecting to ${service.name}: ws://${service.host}:${service.port}/ws',
|
'♾️ Connecting to ${service.name}: ws://${service.host}:${service.port}/ws',
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -68,7 +66,7 @@ class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
|
|||||||
|
|
||||||
await channel.ready;
|
await channel.ready;
|
||||||
|
|
||||||
logger.t(
|
AppLogger.log.t(
|
||||||
'✅ Connected to ${service.name}: ws://${service.host}:${service.port}/ws',
|
'✅ Connected to ${service.name}: ws://${service.host}:${service.port}/ws',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ import 'package:shelf/shelf.dart';
|
|||||||
import 'package:shelf_web_socket/shelf_web_socket.dart';
|
import 'package:shelf_web_socket/shelf_web_socket.dart';
|
||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/models/connect/connect.dart';
|
import 'package:spotube/models/connect/connect.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
import 'package:spotube/provider/history/history.dart';
|
import 'package:spotube/provider/history/history.dart';
|
||||||
import 'package:spotube/provider/audio_player/audio_player.dart';
|
import 'package:spotube/provider/audio_player/audio_player.dart';
|
||||||
import 'package:spotube/provider/volume_provider.dart';
|
import 'package:spotube/provider/volume_provider.dart';
|
||||||
@ -25,11 +25,9 @@ class ServerConnectRoutes {
|
|||||||
final Ref ref;
|
final Ref ref;
|
||||||
final StreamController<String> _connectClientStreamController;
|
final StreamController<String> _connectClientStreamController;
|
||||||
final List<StreamSubscription> subscriptions;
|
final List<StreamSubscription> subscriptions;
|
||||||
final SpotubeLogger logger;
|
|
||||||
ServerConnectRoutes(this.ref)
|
ServerConnectRoutes(this.ref)
|
||||||
: _connectClientStreamController = StreamController<String>.broadcast(),
|
: _connectClientStreamController = StreamController<String>.broadcast(),
|
||||||
subscriptions = [],
|
subscriptions = [] {
|
||||||
logger = getLogger('ConnectServer') {
|
|
||||||
ref.onDispose(() {
|
ref.onDispose(() {
|
||||||
_connectClientStreamController.close();
|
_connectClientStreamController.close();
|
||||||
for (final subscription in subscriptions) {
|
for (final subscription in subscriptions) {
|
||||||
@ -193,7 +191,7 @@ class ServerConnectRoutes {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onDone: () {
|
onDone: () {
|
||||||
logger.i('Connection closed');
|
AppLogger.log.i('Connection closed');
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
]);
|
]);
|
||||||
|
@ -5,7 +5,6 @@ import 'dart:io';
|
|||||||
import 'package:args/args.dart';
|
import 'package:args/args.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:package_info_plus/package_info_plus.dart';
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
|
|
||||||
Future<ArgResults> startCLI(List<String> args) async {
|
Future<ArgResults> startCLI(List<String> args) async {
|
||||||
final parser = ArgParser();
|
final parser = ArgParser();
|
||||||
@ -15,13 +14,6 @@ Future<ArgResults> startCLI(List<String> args) async {
|
|||||||
abbr: 'v',
|
abbr: 'v',
|
||||||
help: 'Verbose mode',
|
help: 'Verbose mode',
|
||||||
defaultsTo: !kReleaseMode,
|
defaultsTo: !kReleaseMode,
|
||||||
callback: (verbose) {
|
|
||||||
if (verbose) {
|
|
||||||
logEnv['VERBOSE'] = 'true';
|
|
||||||
logEnv['DEBUG'] = 'true';
|
|
||||||
logEnv['ERROR'] = 'true';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
parser.addFlag(
|
parser.addFlag(
|
||||||
"version",
|
"version",
|
||||||
|
@ -2,9 +2,6 @@ import 'dart:async';
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
|
|
||||||
final logger = getLogger("ChunkedDownload");
|
|
||||||
|
|
||||||
/// Downloading by spiting as file in chunks
|
/// Downloading by spiting as file in chunks
|
||||||
extension ChunkDownload on Dio {
|
extension ChunkDownload on Dio {
|
||||||
@ -69,11 +66,7 @@ extension ChunkDownload on Dio {
|
|||||||
}
|
}
|
||||||
await raf.close();
|
await raf.close();
|
||||||
|
|
||||||
logger.d("Downloaded file path: ${headFile.path}");
|
|
||||||
|
|
||||||
headFile = await headFile.rename(savePath);
|
headFile = await headFile.rename(savePath);
|
||||||
|
|
||||||
logger.d("Renamed file path: ${headFile.path}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final firstResponse = await downloadChunk(
|
final firstResponse = await downloadChunk(
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:spotube/services/logger/logger.dart';
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
|
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:path/path.dart' as path;
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
import 'package:spotube/services/download_manager/chunked_download.dart';
|
import 'package:spotube/services/download_manager/chunked_download.dart';
|
||||||
import 'package:spotube/services/download_manager/download_request.dart';
|
import 'package:spotube/services/download_manager/download_request.dart';
|
||||||
import 'package:spotube/services/download_manager/download_status.dart';
|
import 'package:spotube/services/download_manager/download_status.dart';
|
||||||
import 'package:spotube/services/download_manager/download_task.dart';
|
import 'package:spotube/services/download_manager/download_task.dart';
|
||||||
|
import 'package:spotube/services/logger/logger.dart';
|
||||||
import 'package:spotube/utils/primitive_utils.dart';
|
import 'package:spotube/utils/primitive_utils.dart';
|
||||||
|
|
||||||
export './download_request.dart';
|
export './download_request.dart';
|
||||||
@ -25,7 +25,6 @@ typedef DownloadStatusEvent = ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
class DownloadManager {
|
class DownloadManager {
|
||||||
final logger = getLogger("DownloadManager");
|
|
||||||
final Map<String, DownloadTask> _cache = <String, DownloadTask>{};
|
final Map<String, DownloadTask> _cache = <String, DownloadTask>{};
|
||||||
final Queue<DownloadRequest> _queue = Queue();
|
final Queue<DownloadRequest> _queue = Queue();
|
||||||
var dio = Dio();
|
var dio = Dio();
|
||||||
@ -77,7 +76,6 @@ class DownloadManager {
|
|||||||
}
|
}
|
||||||
setStatus(task, DownloadStatus.downloading);
|
setStatus(task, DownloadStatus.downloading);
|
||||||
|
|
||||||
logger.d("[DownloadManager] $url");
|
|
||||||
final file = File(savePath.toString());
|
final file = File(savePath.toString());
|
||||||
|
|
||||||
await Directory(path.dirname(savePath)).create(recursive: true);
|
await Directory(path.dirname(savePath)).create(recursive: true);
|
||||||
@ -99,11 +97,8 @@ class DownloadManager {
|
|||||||
final partialFileExist = await partialFile.exists();
|
final partialFileExist = await partialFile.exists();
|
||||||
|
|
||||||
if (fileExist) {
|
if (fileExist) {
|
||||||
logger.d("[DownloadManager] File Exists");
|
|
||||||
setStatus(task, DownloadStatus.completed);
|
setStatus(task, DownloadStatus.completed);
|
||||||
} else if (partialFileExist) {
|
} else if (partialFileExist) {
|
||||||
logger.d("[DownloadManager] Partial File Exists");
|
|
||||||
|
|
||||||
final partialFileLength = await partialFile.length();
|
final partialFileLength = await partialFile.length();
|
||||||
|
|
||||||
final response = await dio.download(
|
final response = await dio.download(
|
||||||
@ -225,7 +220,6 @@ class DownloadManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> pauseDownload(String url) async {
|
Future<void> pauseDownload(String url) async {
|
||||||
logger.d("[DownloadManager] Pause Download");
|
|
||||||
var task = getDownload(url)!;
|
var task = getDownload(url)!;
|
||||||
setStatus(task, DownloadStatus.paused);
|
setStatus(task, DownloadStatus.paused);
|
||||||
task.request.cancelToken.cancel();
|
task.request.cancelToken.cancel();
|
||||||
@ -234,7 +228,6 @@ class DownloadManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> cancelDownload(String url) async {
|
Future<void> cancelDownload(String url) async {
|
||||||
logger.d("[DownloadManager] Cancel Download");
|
|
||||||
var task = getDownload(url)!;
|
var task = getDownload(url)!;
|
||||||
setStatus(task, DownloadStatus.canceled);
|
setStatus(task, DownloadStatus.canceled);
|
||||||
_queue.remove(task.request);
|
_queue.remove(task.request);
|
||||||
@ -242,7 +235,6 @@ class DownloadManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> resumeDownload(String url) async {
|
Future<void> resumeDownload(String url) async {
|
||||||
logger.d("[DownloadManager] Resume Download");
|
|
||||||
var task = getDownload(url)!;
|
var task = getDownload(url)!;
|
||||||
setStatus(task, DownloadStatus.downloading);
|
setStatus(task, DownloadStatus.downloading);
|
||||||
task.request.cancelToken = CancelToken();
|
task.request.cancelToken = CancelToken();
|
||||||
@ -405,7 +397,6 @@ class DownloadManager {
|
|||||||
|
|
||||||
while (_queue.isNotEmpty && runningTasks < maxConcurrentTasks) {
|
while (_queue.isNotEmpty && runningTasks < maxConcurrentTasks) {
|
||||||
runningTasks++;
|
runningTasks++;
|
||||||
logger.d('Concurrent workers: $runningTasks');
|
|
||||||
var currentRequest = _queue.removeFirst();
|
var currentRequest = _queue.removeFirst();
|
||||||
|
|
||||||
await download(
|
await download(
|
||||||
|
@ -4,7 +4,7 @@ import 'package:html/dom.dart' hide Text;
|
|||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/modules/library/user_local_tracks.dart';
|
import 'package:spotube/modules/library/user_local_tracks.dart';
|
||||||
import 'package:spotube/modules/root/update_dialog.dart';
|
import 'package:spotube/modules/root/update_dialog.dart';
|
||||||
import 'package:spotube/models/logger.dart';
|
|
||||||
import 'package:spotube/models/lyrics.dart';
|
import 'package:spotube/models/lyrics.dart';
|
||||||
import 'package:spotube/provider/database/database.dart';
|
import 'package:spotube/provider/database/database.dart';
|
||||||
import 'package:spotube/services/dio/dio.dart';
|
import 'package:spotube/services/dio/dio.dart';
|
||||||
@ -24,8 +24,6 @@ import 'package:spotube/collections/env.dart';
|
|||||||
import 'package:version/version.dart';
|
import 'package:version/version.dart';
|
||||||
|
|
||||||
abstract class ServiceUtils {
|
abstract class ServiceUtils {
|
||||||
static final logger = getLogger("ServiceUtils");
|
|
||||||
|
|
||||||
static final _englishMatcherRegex = RegExp(
|
static final _englishMatcherRegex = RegExp(
|
||||||
"^[a-zA-Z0-9\\s!\"#\$%&\\'()*+,-.\\/:;<=>?@\\[\\]^_`{|}~]*\$",
|
"^[a-zA-Z0-9\\s!\"#\$%&\\'()*+,-.\\/:;<=>?@\\[\\]^_`{|}~]*\$",
|
||||||
);
|
);
|
||||||
@ -194,8 +192,6 @@ abstract class ServiceUtils {
|
|||||||
artists: artistNames,
|
artists: artistNames,
|
||||||
);
|
);
|
||||||
|
|
||||||
logger.v("[Searching Subtitle] $query");
|
|
||||||
|
|
||||||
final searchUri = Uri.parse("$baseUri/subtitles4songs.aspx").replace(
|
final searchUri = Uri.parse("$baseUri/subtitles4songs.aspx").replace(
|
||||||
queryParameters: {"q": query},
|
queryParameters: {"q": query},
|
||||||
);
|
);
|
||||||
@ -227,7 +223,6 @@ abstract class ServiceUtils {
|
|||||||
|
|
||||||
// not result was found at all
|
// not result was found at all
|
||||||
if (rateSortedResults.first["points"] == 0) {
|
if (rateSortedResults.first["points"] == 0) {
|
||||||
logger.e("[Subtitle not found] ${track.name}");
|
|
||||||
return Future.error("Subtitle lookup failed", StackTrace.current);
|
return Future.error("Subtitle lookup failed", StackTrace.current);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,8 +230,6 @@ abstract class ServiceUtils {
|
|||||||
final subtitleUri =
|
final subtitleUri =
|
||||||
Uri.parse("$baseUri/${topResult.attributes["href"]}&type=lrc");
|
Uri.parse("$baseUri/${topResult.attributes["href"]}&type=lrc");
|
||||||
|
|
||||||
logger.v("[Selected subtitle] ${topResult.text} | $subtitleUri");
|
|
||||||
|
|
||||||
final lrcDocument = parser.parse((await globalDio.getUri(
|
final lrcDocument = parser.parse((await globalDio.getUri(
|
||||||
subtitleUri,
|
subtitleUri,
|
||||||
options: Options(responseType: ResponseType.plain),
|
options: Options(responseType: ResponseType.plain),
|
||||||
|
Loading…
Reference in New Issue
Block a user