diff --git a/lib/main.dart b/lib/main.dart index 3442c6f..94ec0e1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:fipy/providers/download.dart'; import 'package:fipy/providers/home.dart'; import 'package:fipy/providers/player.dart'; import 'package:fipy/screens/home.dart'; @@ -18,6 +19,7 @@ class FipyApp extends StatelessWidget { providers: [ ChangeNotifierProvider(create: (_) => PlayerProvider()), ChangeNotifierProvider(create: (_) => HomeProvider()), + ChangeNotifierProvider(create: (_) => DownloadProvider()), ], child: MaterialApp( title: 'Fipy', diff --git a/lib/providers/download.dart b/lib/providers/download.dart new file mode 100644 index 0000000..1cbf577 --- /dev/null +++ b/lib/providers/download.dart @@ -0,0 +1,61 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:io'; + +import 'package:fipy/globals.dart'; +import 'package:fipy/models/track.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:youtube_explode_dart/youtube_explode_dart.dart'; + +class DownloadProvider with ChangeNotifier { + Future downloadMusic(BuildContext context, Track track) async { + var yt = YoutubeExplode(); + var manifest = await yt.videos.streamsClient.getManifest(track.id); + var streamManifest = StreamManifest(manifest.streams); + var streamInfo = streamManifest.audioOnly.withHighestBitrate(); + var stream = yt.videos.streamsClient.get(streamInfo); + final fileName = '${track.title} - ${track.artiste}' + .replaceAll('\\', '') + .replaceAll('/', '') + .replaceAll(':', '') + .replaceAll('*', '') + .replaceAll('?', '') + .replaceAll('"', '') + .replaceAll('<', '') + .replaceAll('>', '') + .replaceAll('|', ''); + + if (!kIsWeb) { + final filePath = Platform.isAndroid + ? Directory('/storage/emulated/0/Download') + : await getDownloadsDirectory(); + + var file = File('${filePath!.path}/$fileName.webm'); + var fileStream = file.openWrite(); + + await stream.pipe(fileStream); + + await fileStream.flush(); + await fileStream.close(); + yt.close(); + // convertToMp3(file.path); + + track.file = file; + + ScaffoldMessenger.of(playerContext).showSnackBar( + SnackBar( + content: + SizedBox(height: 90, child: Text('Son téléchargé: ${file.path}')), + ), + ); + + log.d(file.path); + } + } + + void reload() { + notifyListeners(); + } +} diff --git a/lib/providers/home.dart b/lib/providers/home.dart index 4beede1..d7a8712 100644 --- a/lib/providers/home.dart +++ b/lib/providers/home.dart @@ -1,12 +1,7 @@ -// ignore_for_file: avoid_print, use_build_context_synchronously - import 'dart:convert'; import 'package:fipy/globals.dart'; -import 'package:flutter/foundation.dart'; -import 'package:universal_io/io.dart'; import 'package:fipy/models/track.dart'; import 'package:flutter/material.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:youtube_explode_dart/youtube_explode_dart.dart'; import 'package:fipy/providers/player.dart'; import 'package:provider/provider.dart'; @@ -42,7 +37,7 @@ class HomeProvider with ChangeNotifier { if (body['next'] != null) { cursor = body['next']; } else { - print('Page N°$pageNbr'); + log.d('Page N°$pageNbr'); stop = true; } @@ -100,10 +95,10 @@ class HomeProvider with ChangeNotifier { try { final source = UrlSource( "https://${invidiousUrl[3]}/latest_version?id=${track.id}&itag=140&local=true&listen=1"); - print(source.url); + log.d(source.url); await player.play(source); } catch (e) { - print('Play error: $e'); + log.d('Play error: $e'); } Future.delayed(const Duration(milliseconds: 50)); @@ -129,52 +124,6 @@ class HomeProvider with ChangeNotifier { yt.close(); } - Future downloadMusic(BuildContext context, Track track) async { - var yt = YoutubeExplode(); - var manifest = await yt.videos.streamsClient.getManifest(track.id); - var streamManifest = StreamManifest(manifest.streams); - var streamInfo = streamManifest.audioOnly.withHighestBitrate(); - var stream = yt.videos.streamsClient.get(streamInfo); - final fileName = '${track.title} - ${track.artiste}' - .replaceAll('\\', '') - .replaceAll('/', '') - .replaceAll(':', '') - .replaceAll('*', '') - .replaceAll('?', '') - .replaceAll('"', '') - .replaceAll('<', '') - .replaceAll('>', '') - .replaceAll('|', ''); - - if (!kIsWeb) { - final filePath = Platform.isAndroid - ? Directory('/storage/emulated/0/Download') - : await getDownloadsDirectory(); - - var file = File('${filePath!.path}/$fileName.webm'); - var fileStream = file.openWrite(); - - await stream.pipe(fileStream); - - await fileStream.flush(); - await fileStream.close(); - yt.close(); - // convertToMp3(file.path); - - track.file = file; - - notifyListeners(); - ScaffoldMessenger.of(playerContext).showSnackBar( - SnackBar( - content: - SizedBox(height: 90, child: Text('Son téléchargé: ${file.path}')), - ), - ); - - print(file.path); - } - } - List> get radioList { List> menuItems = [ const DropdownMenuItem(value: "fip", child: Text("FIP")), diff --git a/lib/widgets/download_track.dart b/lib/widgets/download_track.dart index 76b17f9..981d865 100644 --- a/lib/widgets/download_track.dart +++ b/lib/widgets/download_track.dart @@ -1,5 +1,5 @@ -import 'package:fipy/globals.dart'; import 'package:fipy/models/track.dart'; +import 'package:fipy/providers/download.dart'; import 'package:fipy/providers/home.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -12,47 +12,50 @@ class DownloadTrack extends StatelessWidget { @override Widget build(BuildContext context) { - final hp = Provider.of(context, listen: false); - int isDownloading = -1; + final hp = Provider.of(context, listen: true); + final dl = Provider.of(context, listen: false); + int isDownloading = -2; final yt = YoutubeExplode(); final track = this.track ?? hp.currentTrack ?? - Track(number: -1, title: 'title', artiste: 'artiste'); + Track(number: -3, title: 'title', artiste: 'artiste'); - return Visibility( - visible: track.number != -1, - child: InkWell(onTap: () async { - isDownloading = track.number; - hp.reload(); - if (track.id == null) { - final secondMatch = track.artiste == '' ? track.album : track.artiste; - final resultUrl = - await yt.search.search('${track.title} ${secondMatch!}'); - track.id = resultUrl.first.id.value; - } - if (track.id != null) { - // ignore: use_build_context_synchronously - hp.downloadMusic(context, track); - } - isDownloading = -1; - yt.close(); - // hp.reload(); - }, child: Consumer(builder: (context, _, __) { - return Row(children: [ - const SizedBox(width: 37), - isDownloading == track.number - ? SizedBox( - height: 20, - width: 20, - child: CircularProgressIndicator( - strokeWidth: 2, - color: Colors.grey[500], - ), - ) - : Icon(Icons.download, color: Colors.grey[500]), - ]); - })), - ); + return InkWell( + onTap: track.number == -3 + ? null + : () async { + isDownloading = track.number; + dl.reload(); + if (track.id == null) { + final secondMatch = + track.artiste == '' ? track.album : track.artiste; + final resultUrl = + await yt.search.search('${track.title} ${secondMatch!}'); + track.id = resultUrl.first.id.value; + } + if (track.id != null) { + // ignore: use_build_context_synchronously + await dl.downloadMusic(context, track); + } + isDownloading = -2; + yt.close(); + dl.reload(); + }, + child: Consumer(builder: (context, _, __) { + return Row(children: [ + const SizedBox(width: 37), + isDownloading == track.number + ? SizedBox( + height: 20, + width: 20, + child: CircularProgressIndicator( + strokeWidth: 2, + color: Colors.grey[500], + ), + ) + : Icon(Icons.download, color: Colors.grey[500]), + ]); + })); } } diff --git a/lib/widgets/player/player_title.dart b/lib/widgets/player/player_title.dart index 84dbb94..610a58d 100644 --- a/lib/widgets/player/player_title.dart +++ b/lib/widgets/player/player_title.dart @@ -58,4 +58,4 @@ class PlayerTitle extends StatelessWidget { ]), ); } -} \ No newline at end of file +} diff --git a/lib/widgets/player/player_volume.dart b/lib/widgets/player/player_volume.dart index a4e8395..44a12b5 100644 --- a/lib/widgets/player/player_volume.dart +++ b/lib/widgets/player/player_volume.dart @@ -33,4 +33,4 @@ class PlayerVolume extends StatelessWidget { ), ); } -} \ No newline at end of file +}