fix: show download button on player
This commit is contained in:
parent
60c4a1f68d
commit
d7cb5885f7
|
@ -1,3 +1,4 @@
|
||||||
|
import 'package:fipy/providers/download.dart';
|
||||||
import 'package:fipy/providers/home.dart';
|
import 'package:fipy/providers/home.dart';
|
||||||
import 'package:fipy/providers/player.dart';
|
import 'package:fipy/providers/player.dart';
|
||||||
import 'package:fipy/screens/home.dart';
|
import 'package:fipy/screens/home.dart';
|
||||||
|
@ -18,6 +19,7 @@ class FipyApp extends StatelessWidget {
|
||||||
providers: [
|
providers: [
|
||||||
ChangeNotifierProvider(create: (_) => PlayerProvider()),
|
ChangeNotifierProvider(create: (_) => PlayerProvider()),
|
||||||
ChangeNotifierProvider(create: (_) => HomeProvider()),
|
ChangeNotifierProvider(create: (_) => HomeProvider()),
|
||||||
|
ChangeNotifierProvider(create: (_) => DownloadProvider()),
|
||||||
],
|
],
|
||||||
child: MaterialApp(
|
child: MaterialApp(
|
||||||
title: 'Fipy',
|
title: 'Fipy',
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,7 @@
|
||||||
// ignore_for_file: avoid_print, use_build_context_synchronously
|
|
||||||
|
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:fipy/globals.dart';
|
import 'package:fipy/globals.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:universal_io/io.dart';
|
|
||||||
import 'package:fipy/models/track.dart';
|
import 'package:fipy/models/track.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
|
||||||
import 'package:youtube_explode_dart/youtube_explode_dart.dart';
|
import 'package:youtube_explode_dart/youtube_explode_dart.dart';
|
||||||
import 'package:fipy/providers/player.dart';
|
import 'package:fipy/providers/player.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
@ -42,7 +37,7 @@ class HomeProvider with ChangeNotifier {
|
||||||
if (body['next'] != null) {
|
if (body['next'] != null) {
|
||||||
cursor = body['next'];
|
cursor = body['next'];
|
||||||
} else {
|
} else {
|
||||||
print('Page N°$pageNbr');
|
log.d('Page N°$pageNbr');
|
||||||
stop = true;
|
stop = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,10 +95,10 @@ class HomeProvider with ChangeNotifier {
|
||||||
try {
|
try {
|
||||||
final source = UrlSource(
|
final source = UrlSource(
|
||||||
"https://${invidiousUrl[3]}/latest_version?id=${track.id}&itag=140&local=true&listen=1");
|
"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);
|
await player.play(source);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print('Play error: $e');
|
log.d('Play error: $e');
|
||||||
}
|
}
|
||||||
Future.delayed(const Duration(milliseconds: 50));
|
Future.delayed(const Duration(milliseconds: 50));
|
||||||
|
|
||||||
|
@ -129,52 +124,6 @@ class HomeProvider with ChangeNotifier {
|
||||||
yt.close();
|
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<DropdownMenuItem<String>> get radioList {
|
List<DropdownMenuItem<String>> get radioList {
|
||||||
List<DropdownMenuItem<String>> menuItems = [
|
List<DropdownMenuItem<String>> menuItems = [
|
||||||
const DropdownMenuItem(value: "fip", child: Text("FIP")),
|
const DropdownMenuItem(value: "fip", child: Text("FIP")),
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import 'package:fipy/globals.dart';
|
|
||||||
import 'package:fipy/models/track.dart';
|
import 'package:fipy/models/track.dart';
|
||||||
|
import 'package:fipy/providers/download.dart';
|
||||||
import 'package:fipy/providers/home.dart';
|
import 'package:fipy/providers/home.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
@ -12,47 +12,50 @@ class DownloadTrack extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final hp = Provider.of<HomeProvider>(context, listen: false);
|
final hp = Provider.of<HomeProvider>(context, listen: true);
|
||||||
int isDownloading = -1;
|
final dl = Provider.of<DownloadProvider>(context, listen: false);
|
||||||
|
int isDownloading = -2;
|
||||||
final yt = YoutubeExplode();
|
final yt = YoutubeExplode();
|
||||||
|
|
||||||
final track = this.track ??
|
final track = this.track ??
|
||||||
hp.currentTrack ??
|
hp.currentTrack ??
|
||||||
Track(number: -1, title: 'title', artiste: 'artiste');
|
Track(number: -3, title: 'title', artiste: 'artiste');
|
||||||
|
|
||||||
return Visibility(
|
return InkWell(
|
||||||
visible: track.number != -1,
|
onTap: track.number == -3
|
||||||
child: InkWell(onTap: () async {
|
? null
|
||||||
isDownloading = track.number;
|
: () async {
|
||||||
hp.reload();
|
isDownloading = track.number;
|
||||||
if (track.id == null) {
|
dl.reload();
|
||||||
final secondMatch = track.artiste == '' ? track.album : track.artiste;
|
if (track.id == null) {
|
||||||
final resultUrl =
|
final secondMatch =
|
||||||
await yt.search.search('${track.title} ${secondMatch!}');
|
track.artiste == '' ? track.album : track.artiste;
|
||||||
track.id = resultUrl.first.id.value;
|
final resultUrl =
|
||||||
}
|
await yt.search.search('${track.title} ${secondMatch!}');
|
||||||
if (track.id != null) {
|
track.id = resultUrl.first.id.value;
|
||||||
// ignore: use_build_context_synchronously
|
}
|
||||||
hp.downloadMusic(context, track);
|
if (track.id != null) {
|
||||||
}
|
// ignore: use_build_context_synchronously
|
||||||
isDownloading = -1;
|
await dl.downloadMusic(context, track);
|
||||||
yt.close();
|
}
|
||||||
// hp.reload();
|
isDownloading = -2;
|
||||||
}, child: Consumer<HomeProvider>(builder: (context, _, __) {
|
yt.close();
|
||||||
return Row(children: [
|
dl.reload();
|
||||||
const SizedBox(width: 37),
|
},
|
||||||
isDownloading == track.number
|
child: Consumer<DownloadProvider>(builder: (context, _, __) {
|
||||||
? SizedBox(
|
return Row(children: [
|
||||||
height: 20,
|
const SizedBox(width: 37),
|
||||||
width: 20,
|
isDownloading == track.number
|
||||||
child: CircularProgressIndicator(
|
? SizedBox(
|
||||||
strokeWidth: 2,
|
height: 20,
|
||||||
color: Colors.grey[500],
|
width: 20,
|
||||||
),
|
child: CircularProgressIndicator(
|
||||||
)
|
strokeWidth: 2,
|
||||||
: Icon(Icons.download, color: Colors.grey[500]),
|
color: Colors.grey[500],
|
||||||
]);
|
),
|
||||||
})),
|
)
|
||||||
);
|
: Icon(Icons.download, color: Colors.grey[500]),
|
||||||
|
]);
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,4 +58,4 @@ class PlayerTitle extends StatelessWidget {
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,4 +33,4 @@ class PlayerVolume extends StatelessWidget {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue