initial support for download tracks

audio Quality increased
This commit is contained in:
Kingkor Roy Tirtho 2022-01-20 20:02:58 +06:00
parent 00acdf598d
commit bdfbe0f4be
5 changed files with 73 additions and 3 deletions

View File

@ -0,0 +1,63 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:spotify/spotify.dart';
import 'package:spotube/helpers/artist-to-string.dart';
import 'package:youtube_explode_dart/youtube_explode_dart.dart';
import 'package:path_provider/path_provider.dart' as path_provider;
import 'package:path/path.dart' as path;
class DownloadTrackButton extends StatefulWidget {
final Track? track;
const DownloadTrackButton({Key? key, this.track}) : super(key: key);
@override
_DownloadTrackButtonState createState() => _DownloadTrackButtonState();
}
class _DownloadTrackButtonState extends State<DownloadTrackButton> {
late YoutubeExplode yt;
@override
void initState() {
yt = YoutubeExplode();
super.initState();
}
@override
void dispose() {
yt.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
return IconButton(
icon: const Icon(Icons.download_rounded),
onPressed: widget.track != null
? () async {
if (widget.track == null) return;
StreamManifest manifest = await yt.videos.streamsClient
.getManifest(widget.track?.href!.split("watch?v=").last);
var audioStream = yt.videos.streamsClient
.get(manifest.audioOnly.withHighestBitrate());
String downloadFolder = path.join(
(await path_provider.getDownloadsDirectory())!.path,
"Spotube");
String fileName =
"${widget.track?.name} - ${artistsToString(widget.track?.artists ?? [])}.mp3";
File outputFile = File(path.join(downloadFolder, fileName));
if (!outputFile.existsSync()) {
outputFile.createSync(recursive: true);
IOSink outputFileStream = outputFile.openWrite();
await audioStream.pipe(outputFileStream);
await outputFileStream.flush();
await outputFileStream.close();
}
}
: null,
);
}
}

View File

@ -5,6 +5,7 @@ import 'package:cached_network_image/cached_network_image.dart';
import 'package:hotkey_manager/hotkey_manager.dart'; import 'package:hotkey_manager/hotkey_manager.dart';
import 'package:just_audio/just_audio.dart'; import 'package:just_audio/just_audio.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/DownloadTrackButton.dart';
import 'package:spotube/components/PlayerControls.dart'; import 'package:spotube/components/PlayerControls.dart';
import 'package:spotube/helpers/artist-to-string.dart'; import 'package:spotube/helpers/artist-to-string.dart';
import 'package:spotube/helpers/search-youtube.dart'; import 'package:spotube/helpers/search-youtube.dart';
@ -354,6 +355,9 @@ class _PlayerState extends State<Player> with WidgetsBindingObserver {
}, },
), ),
), ),
DownloadTrackButton(
track: playback.currentTrack,
),
// add to saved tracks // add to saved tracks
Expanded( Expanded(
flex: 1, flex: 1,

View File

@ -19,6 +19,7 @@ Future<Track> toYoutubeTrack(Track track) async {
var trackManifest = await youtube.videos.streams.getManifest(ytVideo.id); var trackManifest = await youtube.videos.streams.getManifest(ytVideo.id);
track.uri = trackManifest.audioOnly.first.url.toString(); track.uri = trackManifest.audioOnly.withHighestBitrate().url.toString();
track.href = ytVideo.url;
return track; return track;
} }

View File

@ -367,14 +367,14 @@ packages:
source: hosted source: hosted
version: "2.0.2" version: "2.0.2"
path: path:
dependency: transitive dependency: "direct main"
description: description:
name: path name: path
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.0"
path_provider: path_provider:
dependency: transitive dependency: "direct main"
description: description:
name: path_provider name: path_provider
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"

View File

@ -47,6 +47,8 @@ dependencies:
hotkey_manager: ^0.1.6 hotkey_manager: ^0.1.6
just_audio: ^0.9.18 just_audio: ^0.9.18
just_audio_libwinmedia: ^0.0.4 just_audio_libwinmedia: ^0.0.4
path: ^1.8.0
path_provider: ^2.0.8
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: