Incomplete Player PLaylist support

This commit is contained in:
Kingkor Roy Tirtho 2022-01-08 11:02:20 +06:00
parent 62fc89dd52
commit d17a7e8b61

View File

@ -1,8 +1,10 @@
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:hotkey_manager/hotkey_manager.dart'; import 'package:hotkey_manager/hotkey_manager.dart';
import 'package:spotify/spotify.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/models/GlobalKeyActions.dart'; import 'package:spotube/models/GlobalKeyActions.dart';
@ -36,7 +38,9 @@ class _PlayerState extends State<Player> {
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) async { WidgetsBinding.instance?.addPostFrameCallback((timeStamp) async {
try { try {
MPVPlayer player = context.read<PlayerDI>().player; MPVPlayer player = context.read<PlayerDI>().player;
if (!player.isRunning()) {
await player.start(); await player.start();
}
double volume = await player.getProperty<double>("volume"); double volume = await player.getProperty<double>("volume");
setState(() { setState(() {
_volume = volume / 100; _volume = volume / 100;
@ -55,27 +59,52 @@ class _PlayerState extends State<Player> {
player.on(MPVEvents.status, null, (ev, _) async { player.on(MPVEvents.status, null, (ev, _) async {
Map data = ev.eventData as Map; Map data = ev.eventData as Map;
print(
"\n======================\nEVENT $data\n=======================\n");
Playback playback = context.read<Playback>(); Playback playback = context.read<Playback>();
// that means a new playlist have been added
if (data["property"] == "playlist-count" && data["value"] > 0) {
var playlist = await player.getProperty("playlist");
}
if (data["property"] == "media-title" && data["value"] != null) { if (data["property"] == "media-title" && data["value"] != null) {
var containsYtdl = (data["value"] as String).contains("ytsearch:"); // var containsYtdl = (data["value"] as String).contains("ytsearch:");
if (containsYtdl) { // if (containsYtdl) {
var props = (data["value"] as String).split("-"); // var props = (data["value"] as String).split("-");
var mediaTitle = props.last.trim(); // var mediaTitle = props.last.trim();
var mediaArtists = props.first.split("ytsearch:").last.trim(); // var mediaArtists = props.first.split("ytsearch:").last.trim();
// setState(() {
// _isPlaying = true;
// });
// var matchedTracks = playback.currentPlaylist?.tracks.where(
// (track) {
// return track.name?.replaceAll("-", " ") == mediaTitle &&
// artistsToString(track.artists ?? []) == mediaArtists;
// },
// ) ??
// [];
// if (matchedTracks.isNotEmpty) {
// playback.setCurrentTrack = matchedTracks.first;
// }
// }
int playlistCurrentPos;
if (_shuffled) {
await player.unshuffle();
playlistCurrentPos = await player.getPlaylistPosition();
await player.shuffle();
} else {
playlistCurrentPos = await player.getPlaylistPosition();
}
print("${data["value"]} $playlistCurrentPos");
Track? track =
playback.currentPlaylist?.tracks.elementAt(playlistCurrentPos);
if (track != null) {
setState(() { setState(() {
_isPlaying = true; _isPlaying = true;
}); });
playback.setCurrentTrack = track;
var matchedTracks = playback.currentPlaylist?.tracks.where(
(track) {
return track.name?.replaceAll("-", " ") == mediaTitle &&
artistsToString(track.artists ?? []) == mediaArtists;
},
) ??
[];
if (matchedTracks.isNotEmpty) {
playback.setCurrentTrack = matchedTracks.first;
}
} }
} }
if (data["property"] == "duration" && data["value"] != null) { if (data["property"] == "duration" && data["value"] != null) {
@ -143,15 +172,20 @@ class _PlayerState extends State<Player> {
} }
String playlistToStr(CurrentPlaylist playlist) { String playlistToStr(CurrentPlaylist playlist) {
return playlist.tracks.map((track) { var tracks = playlist.tracks.map((track) {
return "ytdl://ytsearch:${artistsToString(track.artists ?? [])} - ${track.name?.replaceAll("-", " ")}"; var artists = artistsToString(track.artists ?? []);
}).join("\n"); var title = track.name?.replaceAll("-", " ");
return "ytdl://ytsearch:$artists - $title";
}).toList();
return tracks.join("\n");
} }
Future playPlaylist(MPVPlayer player, CurrentPlaylist playlist) async { Future playPlaylist(MPVPlayer player, CurrentPlaylist playlist) async {
try { try {
if (player.isRunning() && playlist.id != _currentPlaylistId) { if (player.isRunning() && playlist.id != _currentPlaylistId) {
var playlistPath = "/tmp/playlist-${playlist.id}.txt"; var playlistPath = "/tmp/playlist-${playlist.id}.json";
File file = File(playlistPath); File file = File(playlistPath);
var newPlaylist = playlistToStr(playlist); var newPlaylist = playlistToStr(playlist);