From ea45c4f42ae89b8991e470e84a5290b3be3b0f36 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sat, 17 Jun 2023 09:32:37 +0600 Subject: [PATCH] fix: re-enable download manager --- android/app/build.gradle | 13 +- android/build.gradle | 2 +- lib/components/library/user_downloads.dart | 10 +- lib/provider/download_manager_provider.dart | 181 ++++++++++---------- pubspec.lock | 8 + pubspec.yaml | 1 + 6 files changed, 116 insertions(+), 99 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 094a1a136..d05a90a1b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -79,6 +79,17 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + constraints { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version") { + because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib") + } + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version") { + because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib") + } + } + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' + + // other deps so just ignore implementation 'com.android.support:multidex:2.0.1' } diff --git a/android/build.gradle b/android/build.gradle index caa672099..0801de624 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.7.21' + ext.kotlin_version = '1.8.22' repositories { google() mavenCentral() diff --git a/lib/components/library/user_downloads.dart b/lib/components/library/user_downloads.dart index 544320867..1a0303776 100644 --- a/lib/components/library/user_downloads.dart +++ b/lib/components/library/user_downloads.dart @@ -1,4 +1,5 @@ import 'package:auto_size_text/auto_size_text.dart'; +import 'package:background_downloader/background_downloader.dart'; // import 'package:background_downloader/background_downloader.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -65,14 +66,11 @@ class UserDownloads extends HookConsumerWidget { .where((element) => element.taskId == track.id), ); final taskItSelf = useFuture( - Future.value(null), - // FileDownloader().database.recordForId(track.id!), + FileDownloader().database.recordForId(track.id!), ); - final hasFailed = failedTaskStream - .hasData /* || - taskItSelf.data?.status == TaskStatus.failed */ - ; + final hasFailed = failedTaskStream.hasData || + taskItSelf.data?.status == TaskStatus.failed; return ListTile( title: Text(track.name ?? ''), diff --git a/lib/provider/download_manager_provider.dart b/lib/provider/download_manager_provider.dart index 2ad95ba32..4ad2ed948 100644 --- a/lib/provider/download_manager_provider.dart +++ b/lib/provider/download_manager_provider.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:io'; -// import 'package:background_downloader/background_downloader.dart'; +import 'package:background_downloader/background_downloader.dart'; import 'package:collection/collection.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:http/http.dart'; @@ -19,8 +19,8 @@ import 'package:spotube/utils/type_conversion_utils.dart'; class DownloadManagerProvider extends StateNotifier> { final Ref ref; - final StreamController /* */ activeDownloadProgress; - final StreamController /* */ failedDownloads; + final StreamController activeDownloadProgress; + final StreamController failedDownloads; Track? _activeItem; FutureOr Function(Track)? onFileExists; @@ -29,78 +29,78 @@ class DownloadManagerProvider extends StateNotifier> { : activeDownloadProgress = StreamController.broadcast(), failedDownloads = StreamController.broadcast(), super([]) { - // FileDownloader().registerCallbacks( - // group: FileDownloader.defaultGroup, - // taskNotificationTapCallback: (task, notificationType) { - // router.go("/library"); - // }, - // taskStatusCallback: (update) async { - // if (update.status == TaskStatus.running) { - // _activeItem = - // state.firstWhereOrNull((track) => track.id == update.task.taskId); - // state = state.toList(); - // } - - // if (update.status == TaskStatus.failed || - // update.status == TaskStatus.notFound) { - // failedDownloads.add(update.task); - // } - - // if (update.status == TaskStatus.complete) { - // final track = - // state.firstWhere((element) => element.id == update.task.taskId); - - // // resetting the replace downloaded file state on queue completion - // if (state.last == track) { - // ref.read(replaceDownloadedFileState.notifier).state = null; - // } - - // state = state - // .where((element) => element.id != update.task.taskId) - // .toList(); - - // final imageUri = TypeConversionUtils.image_X_UrlString( - // track.album?.images ?? [], - // placeholder: ImagePlaceholder.online, - // ); - // final response = await get(Uri.parse(imageUri)); - - // final tempFile = File(await update.task.filePath()); - - // final file = tempFile.copySync(_getPathForTrack(track)); - - // await tempFile.delete(); - - // await MetadataGod.writeMetadata( - // file: file.path, - // metadata: Metadata( - // title: track.name, - // artist: track.artists?.map((a) => a.name).join(", "), - // album: track.album?.name, - // albumArtist: track.artists?.map((a) => a.name).join(", "), - // year: track.album?.releaseDate != null - // ? int.tryParse(track.album!.releaseDate!) - // : null, - // trackNumber: track.trackNumber, - // discNumber: track.discNumber, - // durationMs: track.durationMs?.toDouble(), - // fileSize: file.lengthSync(), - // trackTotal: track.album?.tracks?.length, - // picture: response.headers['content-type'] != null - // ? Picture( - // data: response.bodyBytes, - // mimeType: response.headers['content-type']!, - // ) - // : null, - // ), - // ); - // } - // }, - // taskProgressCallback: (update) { - // activeDownloadProgress.add(update); - // }, - // ); - // FileDownloader().trackTasks(markDownloadedComplete: true); + FileDownloader().registerCallbacks( + group: FileDownloader.defaultGroup, + taskNotificationTapCallback: (task, notificationType) { + router.go("/library"); + }, + taskStatusCallback: (update) async { + if (update.status == TaskStatus.running) { + _activeItem = + state.firstWhereOrNull((track) => track.id == update.task.taskId); + state = state.toList(); + } + + if (update.status == TaskStatus.failed || + update.status == TaskStatus.notFound) { + failedDownloads.add(update.task); + } + + if (update.status == TaskStatus.complete) { + final track = + state.firstWhere((element) => element.id == update.task.taskId); + + // resetting the replace downloaded file state on queue completion + if (state.last == track) { + ref.read(replaceDownloadedFileState.notifier).state = null; + } + + state = state + .where((element) => element.id != update.task.taskId) + .toList(); + + final imageUri = TypeConversionUtils.image_X_UrlString( + track.album?.images ?? [], + placeholder: ImagePlaceholder.online, + ); + final response = await get(Uri.parse(imageUri)); + + final tempFile = File(await update.task.filePath()); + + final file = tempFile.copySync(_getPathForTrack(track)); + + await tempFile.delete(); + + await MetadataGod.writeMetadata( + file: file.path, + metadata: Metadata( + title: track.name, + artist: track.artists?.map((a) => a.name).join(", "), + album: track.album?.name, + albumArtist: track.artists?.map((a) => a.name).join(", "), + year: track.album?.releaseDate != null + ? int.tryParse(track.album!.releaseDate!) + : null, + trackNumber: track.trackNumber, + discNumber: track.discNumber, + durationMs: track.durationMs?.toDouble(), + fileSize: file.lengthSync(), + trackTotal: track.album?.tracks?.length, + picture: response.headers['content-type'] != null + ? Picture( + data: response.bodyBytes, + mimeType: response.headers['content-type']!, + ) + : null, + ), + ); + } + }, + taskProgressCallback: (update) { + activeDownloadProgress.add(update); + }, + ); + FileDownloader().trackTasks(markDownloadedComplete: true); } UserPreferences get preferences => ref.read(userPreferencesProvider); @@ -115,9 +115,9 @@ class DownloadManagerProvider extends StateNotifier> { "${track.name} - ${track.artists?.map((a) => a.name).join(", ")}.m4a", ); - Future /* */ _ensureSpotubeTrack(Track track) async { + Future _ensureSpotubeTrack(Track track) async { if (state.any((element) => element.id == track.id)) { - final task = null /* await FileDownloader().taskForId(track.id!) */; + final task = await FileDownloader().taskForId(track.id!); if (task != null) { return task; } @@ -133,17 +133,16 @@ class DownloadManagerProvider extends StateNotifier> { pipedClient, ); state = [...state, spotubeTrack]; - // final task = DownloadTask( - // url: spotubeTrack.ytUri, - // baseDirectory: BaseDirectory.applicationSupport, - // taskId: spotubeTrack.id!, - // updates: Updates.statusAndProgress, - // ); - // return task; - return null; + final task = DownloadTask( + url: spotubeTrack.ytUri, + baseDirectory: BaseDirectory.applicationSupport, + taskId: spotubeTrack.id!, + updates: Updates.statusAndProgress, + ); + return task; } - Future /* */ enqueue(Track track) async { + Future enqueue(Track track) async { final replaceFileGlobal = ref.read(replaceDownloadedFileState); final file = File(_getPathForTrack(track)); if (file.existsSync() && @@ -156,11 +155,11 @@ class DownloadManagerProvider extends StateNotifier> { final task = await _ensureSpotubeTrack(track); - // await FileDownloader().enqueue(task); + await FileDownloader().enqueue(task); return task; } - Future */ > enqueueAll(List tracks) async { + Future> enqueueAll(List tracks) async { final tasks = await Future.wait(tracks.mapIndexed((i, e) { if (i != 0) { /// One second delay between each download to avoid @@ -174,16 +173,16 @@ class DownloadManagerProvider extends StateNotifier> { ref.read(replaceDownloadedFileState.notifier).state = null; } - return tasks. /* whereType(). */ toList(); + return tasks.whereType().toList(); } Future cancel(Track track) async { - // await FileDownloader().cancelTaskWithId(track.id!); + await FileDownloader().cancelTaskWithId(track.id!); state = state.where((element) => element.id != track.id).toList(); } Future cancelAll() async { - // (await FileDownloader().reset()); + (await FileDownloader().reset()); state = []; } } diff --git a/pubspec.lock b/pubspec.lock index a913095db..6cbba78f3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -153,6 +153,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + background_downloader: + dependency: "direct main" + description: + name: background_downloader + sha256: "5e38a1d5d88a5cfea35c44cb376b89427688070518471ee52f6b04d07d85668e" + url: "https://pub.dev" + source: hosted + version: "7.4.0" badges: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 07db73fde..66fb8eac4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -103,6 +103,7 @@ dependencies: media_kit_native_event_loop: ^1.0.4 dbus: ^0.7.8 motion_toast: ^2.6.8 + background_downloader: ^7.4.0 dev_dependencies: build_runner: ^2.3.2