From ec900a1703b0fcdc0ae211a85fab0ec3db404ec5 Mon Sep 17 00:00:00 2001 From: Chris McCord Date: Wed, 10 Nov 2021 14:49:38 -0500 Subject: [PATCH] Add next/prev --- lib/live_beats/media_library.ex | 31 ++++++++++++++++++ lib/live_beats_web/live/player_live.ex | 44 ++++++++++++++------------ 2 files changed, 55 insertions(+), 20 deletions(-) diff --git a/lib/live_beats/media_library.ex b/lib/live_beats/media_library.ex index 01980a7..6d1f543 100644 --- a/lib/live_beats/media_library.ex +++ b/lib/live_beats/media_library.ex @@ -92,6 +92,20 @@ defmodule LiveBeats.MediaLibrary do end end + def play_prev_song(user_id) do + song = get_current_active_song(user_id) || get_first_song(user_id) + if prev_song = get_prev_song(song) do + play_song(prev_song) + end + end + + def play_next_song(user_id) do + song = get_current_active_song(user_id) || get_first_song(user_id) + if next_song = get_next_song(song) do + play_song(next_song) + end + end + defp topic(user_id), do: "room:#{user_id}" def store_mp3(%Song{} = song, tmp_path) do @@ -187,6 +201,14 @@ defmodule LiveBeats.MediaLibrary do ) end + def get_last_song(user_id) do + Repo.one( + from s in Song, + where: s.user_id == ^user_id, + order_by: [desc: s.inserted_at, desc: s.id], + limit: 1 + ) + end def get_next_song(%Song{} = song) do Repo.one( from s in Song, @@ -196,6 +218,15 @@ defmodule LiveBeats.MediaLibrary do ) || get_first_song(song.user_id) end + def get_prev_song(%Song{} = song) do + Repo.one( + from s in Song, + where: s.user_id == ^song.user_id and s.id < ^song.id, + order_by: [desc: s.inserted_at, desc: s.id], + limit: 1 + ) || get_last_song(song.user_id) + end + def create_song(attrs \\ %{}) do %Song{} |> Song.changeset(attrs) diff --git a/lib/live_beats_web/live/player_live.ex b/lib/live_beats_web/live/player_live.ex index c0bfe96..5bf92cd 100644 --- a/lib/live_beats_web/live/player_live.ex +++ b/lib/live_beats_web/live/player_live.ex @@ -35,24 +35,21 @@ defmodule LiveBeatsWeb.PlayerLive do -
+
- - + + - - - +
<.modal @@ -135,6 +125,20 @@ defmodule LiveBeatsWeb.PlayerLive do end end + def handle_event("next-song", _, socket) do + if socket.assigns.song do + MediaLibrary.play_next_song(socket.assigns.song.user_id) + end + {:noreply, socket} + end + + def handle_event("prev-song", _, socket) do + if socket.assigns.song do + MediaLibrary.play_prev_song(socket.assigns.song.user_id) + end + {:noreply, socket} + end + def handle_event("next-song-auto", _, socket) do if socket.assigns.song do MediaLibrary.play_next_song_auto(socket.assigns.song.user_id)