From d17a7e8b6109d4dd770712962a054adbe4eb2320 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sat, 8 Jan 2022 11:02:20 +0600 Subject: [PATCH] Incomplete Player PLaylist support --- lib/components/Player.dart | 76 +++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/lib/components/Player.dart b/lib/components/Player.dart index 325065bc..374ee556 100644 --- a/lib/components/Player.dart +++ b/lib/components/Player.dart @@ -1,8 +1,10 @@ +import 'dart:convert'; import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/foundation.dart'; import 'package:hotkey_manager/hotkey_manager.dart'; +import 'package:spotify/spotify.dart'; import 'package:spotube/components/PlayerControls.dart'; import 'package:spotube/helpers/artist-to-string.dart'; import 'package:spotube/models/GlobalKeyActions.dart'; @@ -36,7 +38,9 @@ class _PlayerState extends State { WidgetsBinding.instance?.addPostFrameCallback((timeStamp) async { try { MPVPlayer player = context.read().player; - await player.start(); + if (!player.isRunning()) { + await player.start(); + } double volume = await player.getProperty("volume"); setState(() { _volume = volume / 100; @@ -55,27 +59,52 @@ class _PlayerState extends State { player.on(MPVEvents.status, null, (ev, _) async { Map data = ev.eventData as Map; + print( + "\n======================\nEVENT $data\n=======================\n"); Playback playback = context.read(); + + // 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) { - var containsYtdl = (data["value"] as String).contains("ytsearch:"); - if (containsYtdl) { - var props = (data["value"] as String).split("-"); - var mediaTitle = props.last.trim(); - var mediaArtists = props.first.split("ytsearch:").last.trim(); + // var containsYtdl = (data["value"] as String).contains("ytsearch:"); + // if (containsYtdl) { + // var props = (data["value"] as String).split("-"); + // var mediaTitle = props.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(() { _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; - } + playback.setCurrentTrack = track; } } if (data["property"] == "duration" && data["value"] != null) { @@ -143,15 +172,20 @@ class _PlayerState extends State { } String playlistToStr(CurrentPlaylist playlist) { - return playlist.tracks.map((track) { - return "ytdl://ytsearch:${artistsToString(track.artists ?? [])} - ${track.name?.replaceAll("-", " ")}"; - }).join("\n"); + var tracks = playlist.tracks.map((track) { + var artists = artistsToString(track.artists ?? []); + var title = track.name?.replaceAll("-", " "); + + return "ytdl://ytsearch:$artists - $title"; + }).toList(); + + return tracks.join("\n"); } Future playPlaylist(MPVPlayer player, CurrentPlaylist playlist) async { try { if (player.isRunning() && playlist.id != _currentPlaylistId) { - var playlistPath = "/tmp/playlist-${playlist.id}.txt"; + var playlistPath = "/tmp/playlist-${playlist.id}.json"; File file = File(playlistPath); var newPlaylist = playlistToStr(playlist);