diff --git a/server/app/api/playlist.py b/server/app/api/playlist.py index 51ab11c..3dd9cd1 100644 --- a/server/app/api/playlist.py +++ b/server/app/api/playlist.py @@ -50,7 +50,7 @@ def create_playlist(): @playlist_bp.route("/playlist//add", methods=["POST"]) -def add_track_to_playlist(playlist_id): +def add_track_to_playlist(playlist_id: str): data = request.get_json() trackid = data["track"] @@ -61,3 +61,16 @@ def add_track_to_playlist(playlist_id): return {"error": str(e)}, 409 return {"msg": "I think It's done"}, 200 + + +@playlist_bp.route("/playlist/") +def get_single_p_info(playlist_id: str): + for p in api.PLAYLISTS: + if p.playlistid == playlist_id: + return {"data": p} + + +# @playlist_bp.route("/playlist//info") +# def get_playlist_track(playlist_id: str): +# tracks = playlistlib.get_playlist_tracks(playlist_id) +# return {"data": tracks} diff --git a/server/app/lib/albumslib.py b/server/app/lib/albumslib.py index 19bf2d2..cd01e54 100644 --- a/server/app/lib/albumslib.py +++ b/server/app/lib/albumslib.py @@ -49,11 +49,13 @@ def get_album_image(album: list) -> str: def get_album_tracks(album: str, artist: str) -> List: - return [ - track - for track in api.PRE_TRACKS - if track["album"] == album and track["albumartist"] == artist - ] + tracks = [] + + for track in api.PRE_TRACKS: + if track["album"] == album and track["albumartist"] == artist: + tracks.append(track) + + return tracks def create_album(track) -> models.Album: @@ -70,6 +72,7 @@ def create_album(track) -> models.Album: album["count"] = len(album_tracks) album["duration"] = get_album_duration(album_tracks) album["date"] = album_tracks[0]["date"] + album["artistimage"] = urllib.parse.quote_plus( album_tracks[0]["albumartist"] + ".webp" ) diff --git a/server/app/lib/playlistlib.py b/server/app/lib/playlistlib.py index d8acec9..c5b5d26 100644 --- a/server/app/lib/playlistlib.py +++ b/server/app/lib/playlistlib.py @@ -25,6 +25,13 @@ def add_track(playlistid: str, trackid: str): raise TrackExistsInPlaylist("Track already in playlist.") +def get_playlist_tracks(pid: str): + for p in api.PLAYLISTS: + if p.playlistid == pid: + return p.tracks + + + def create_all_playlists(): """ Gets all playlists from the database. diff --git a/src/components/LeftSidebar/Navigation.vue b/src/components/LeftSidebar/Navigation.vue index c6efd6a..d73e90d 100644 --- a/src/components/LeftSidebar/Navigation.vue +++ b/src/components/LeftSidebar/Navigation.vue @@ -31,7 +31,7 @@ const menus = [ }, { name: "playlists", - route_name: "PlaylistView", + route_name: "Playlists", }, { name: "folders", diff --git a/src/components/PlaylistView/Header.vue b/src/components/PlaylistView/Header.vue index 91119c3..b4fdc34 100644 --- a/src/components/PlaylistView/Header.vue +++ b/src/components/PlaylistView/Header.vue @@ -2,8 +2,10 @@
-
Makaveli Radio
-
45 Tracks • 3 Hours 4 Minutes
+
{{ props.info.name }}
+
+ {{ props.info.count }} Tracks • {{ props.info.duration }} +
- Last updated yesterday |  + Last updated {{props.info.lastUpdated}} |  Edit
+ + diff --git a/src/composables/playlists.ts b/src/composables/playlists.ts index 7b1852d..74f4c83 100644 --- a/src/composables/playlists.ts +++ b/src/composables/playlists.ts @@ -74,4 +74,40 @@ async function addTrackToPlaylist(playlist: Playlist, track: Track) { }); } -export { createNewPlaylist, getAllPlaylists, addTrackToPlaylist }; +async function getPTracks(playlistid: string) { + const uri = state.settings.uri + "/playlist/" + playlistid; + + let tracks: Track[] = []; + + await axios + .get(uri) + .then((res) => { + tracks = res.data.data; + }) + .catch((err) => { + new Notification("Something funny happened!", NotifType.Error); + throw new Error(err); + }); + + return tracks; +} + +async function getPlaylist(pid: string) { + const uri = state.settings.uri + "/playlist/" + pid; + + let playlist: Playlist; + + await axios + .get(uri) + .then((res) => { + playlist = res.data.data; + }) + .catch((err) => { + new Notification("Something funny happened!", NotifType.Error); + throw new Error(err); + }); + + return playlist; +} + +export { createNewPlaylist, getAllPlaylists, addTrackToPlaylist, getPTracks, getPlaylist }; diff --git a/src/interfaces.ts b/src/interfaces.ts index 14332f6..d2c71cf 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -52,6 +52,7 @@ interface Playlist { name: string; description?: string; image?: string; + tracks?: Track[]; } interface Notif { diff --git a/src/main.js b/src/main.js index d8c6b0d..b9bc871 100644 --- a/src/main.js +++ b/src/main.js @@ -8,6 +8,6 @@ import { createPinia } from 'pinia' import "../src/assets/css/global.scss"; const app = createApp(App); -app.use(router); app.use(createPinia()) +app.use(router); app.mount('#app'); \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 0700906..e9016bb 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -2,6 +2,7 @@ import { createRouter, createWebHistory } from "vue-router"; import Home from "../views/Home.vue"; import FolderView from "../views/FolderView.vue"; import PlaylistView from "../views/PlaylistView.vue"; +import Playlists from "../views/Playlists.vue"; import AlbumsExplorer from "../views/AlbumsExplorer.vue"; import AlbumView from "../views/AlbumView.vue"; @@ -9,6 +10,9 @@ import AlbumView from "../views/AlbumView.vue"; import ArtistsExplorer from "../views/ArtistsExplorer.vue"; import SettingsView from "../views/SettingsView.vue"; +import usePStore from "../stores/playlists"; +import usePTrackStore from "../stores/p.ptracks"; + const routes = [ { path: "/", @@ -25,9 +29,20 @@ const routes = [ redirect: "/folder/home", }, { - path: "/playlist", + path: "/playlists", + name: "Playlists", + component: Playlists, + beforeEnter: async () => { + await usePStore().fetchAll(); + }, + }, + { + path: "/playlist/:pid", name: "PlaylistView", component: PlaylistView, + beforeEnter: async (to) => { + await usePTrackStore().fetchAll(to.params.pid); + }, }, { path: "/albums", @@ -53,7 +68,7 @@ const routes = [ path: "/:pathMatch(.*)", // alias: "*", component: () => import("../views/NotFound.vue"), - } + }, ]; const router = createRouter({ diff --git a/src/stores/p.ptracks.ts b/src/stores/p.ptracks.ts new file mode 100644 index 0000000..ebc7243 --- /dev/null +++ b/src/stores/p.ptracks.ts @@ -0,0 +1,15 @@ +import { defineStore } from "pinia"; +import { getPlaylist, getPTracks } from "../composables/playlists"; +import { Track, Playlist } from "../interfaces"; + +export default defineStore("playlist-tracks", { + state: () => ({ + playlist: {}, + }), + actions: { + async fetchAll(playlistid: string) { + const playlist = await getPlaylist(playlistid); + this.playlist = playlist; + }, + }, +}); diff --git a/src/stores/playlists.ts b/src/stores/playlists.ts index bcae885..68c8909 100644 --- a/src/stores/playlists.ts +++ b/src/stores/playlists.ts @@ -7,8 +7,10 @@ export default defineStore("playlists", { playlists: [], }), actions: { - fetchAll() { - + async fetchAll() { + const playlists = await getAllPlaylists(); + + this.playlists = playlists; }, }, }); diff --git a/src/views/PlaylistView.vue b/src/views/PlaylistView.vue index 9789ed4..d8cf098 100644 --- a/src/views/PlaylistView.vue +++ b/src/views/PlaylistView.vue @@ -1,40 +1,29 @@ - diff --git a/src/views/Playlists.vue b/src/views/Playlists.vue new file mode 100644 index 0000000..eb46a64 --- /dev/null +++ b/src/views/Playlists.vue @@ -0,0 +1,32 @@ + + + + +