From 00e032a0ec1380cfee96080b8d3a2293d890fa8c Mon Sep 17 00:00:00 2001 From: booploops <49113086+booploops@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:44:53 -0800 Subject: [PATCH] added add to playlist for list item songs --- src/renderer/index.js | 57 +++++++++++++++---- src/renderer/style.less | 43 ++++++++++++++ .../views/components/add-to-playlist.ejs | 36 ++++++++++++ .../views/components/mediaitem-list-item.ejs | 48 +++++++++++++--- src/renderer/views/main.ejs | 6 ++ src/renderer/views/pages/cider-playlist.ejs | 2 +- 6 files changed, 173 insertions(+), 19 deletions(-) create mode 100644 src/renderer/views/components/add-to-playlist.ejs diff --git a/src/renderer/index.js b/src/renderer/index.js index 1ebc458d..93716a3f 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -239,23 +239,60 @@ const app = new Vue({ hangtimer: null, selectedMediaItems: [], routes: ["browse", "listen_now", "radio"], - musicBaseUrl: "https://api.music.apple.com/" + musicBaseUrl: "https://api.music.apple.com/", + modals: { + addToPlaylist: false + }, }, watch: { page: () => { document.getElementById("app-content").scrollTo(0, 0); - app.selectedMediaItems = []; + app.resetState() }, showingPlaylist: () => { document.getElementById("app-content").scrollTo(0, 0); - app.selectedMediaItems = []; + app.resetState() }, artistPage: () => { document.getElementById("app-content").scrollTo(0, 0); - app.selectedMediaItems = []; + app.resetState() }, }, methods: { + resetState() { + app.selectedMediaItems = []; + for (let key in app.modals) { + app.modals[key] = false; + } + }, + promptAddToPlaylist() { + app.modals.addToPlaylist = true; + }, + addSelectedToPlaylist(playlist_id) { + let self = this + let pl_items = [] + for (let i = 0; i < self.selectedMediaItems.length; i++) { + if(self.selectedMediaItems[i].kind == "song") { + self.selectedMediaItems[i].kind = "songs" + }else if(self.selectedMediaItems[i].kind == "album") { + self.selectedMediaItems[i].kind = "albums" + } else if(self.selectedMediaItems[i].kind == "library-song") { + self.selectedMediaItems[i].kind = "library-songs" + } else if(self.selectedMediaItems[i].kind == "library-album") { + self.selectedMediaItems[i].kind = "library-albums" + } + pl_items.push({ + id: self.selectedMediaItems[i].id, + type: self.selectedMediaItems[i].kind + }) + } + this.modals.addToPlaylist = false + this.mk.api.library.appendTracksToPlaylist(playlist_id, pl_items).then(()=>{ + if(this.page == 'playlist_' + this.showingPlaylist.id) { + this.getPlaylistFromID(this.showingPlaylist.id) + } + }) + }, async init() { let self = this clearTimeout(this.hangtimer) @@ -326,7 +363,7 @@ const app = new Vue({ let type = (self.mk.nowPlayingItem != null) ? self.mk.nowPlayingItem["type"] ?? '' : ''; - if (type.includes("musicVideo") || type.includes("uploadedVideo") || type.includes("music-movie")) { + if (type.includes("musicVideo") || type.includes("uploadedVideo") || type.includes("music-movie")) { document.getElementById("apple-music-video-container").style.display = "block"; // app.chrome.topChromeVisible = false } else { @@ -366,7 +403,6 @@ const app = new Vue({ this.appRoute(window.location.hash) } - setTimeout(() =>{ this.getBrowsePage(); this.$forceUpdate()}, 500) @@ -401,13 +437,14 @@ const app = new Vue({ return false } }, - select_selectMediaItem(id, kind, index, guid) { + select_selectMediaItem(id, kind, index, guid, library) { if (!this.select_hasMediaItem(guid)) { this.selectedMediaItems.push({ id: id, kind: kind, index: index, - guid: guid + guid: guid, + isLibrary: library }) } }, @@ -466,10 +503,11 @@ const app = new Vue({ let playlistId = response.id this.playlists.loadingState = 0 this.showingPlaylist = response - if(!response.relationships.tracks.next) { + if (!response.relationships.tracks.next) { this.playlists.loadingState = 1 return } + function getPlaylistTracks(next) { app.apiCall(app.musicBaseUrl + next, res => { if (self.showingPlaylist.id != playlistId) { @@ -669,7 +707,6 @@ const app = new Vue({ window.location.hash = `${kind}/${id}` document.querySelector("#app-content").scrollTop = 0 } else if (!kind.toString().includes("radioStation") && !kind.toString().includes("song") && !kind.toString().includes("musicVideo") && !kind.toString().includes("uploadedVideo") && !kind.toString().includes("music-movie")) { - if (kind.toString().includes("music-movie")){kind = "musicMovie"} app.page = (kind) + "_" + (id); app.getTypeFromID((kind), (id), (isLibrary), {extend: "editorialVideo"}); window.location.hash = `${kind}/${id}` diff --git a/src/renderer/style.less b/src/renderer/style.less index f3b2fba3..9f3605a4 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -1520,6 +1520,49 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { /* Cider */ +.modal-fullscreen { + display:flex; + justify-content: center; + align-items: center; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + z-index: 9999; + .modal-window { + background: #333; + border-radius: var(--mediaItemRadius); + box-shadow: var(--mediaItemShadow-Shadow); + display:flex; + flex-flow: column; + .modal-header { + width:100%; + padding: 6px; + } + .modal-content { + width:100%; + height:100%; + overflow: hidden; + overflow-y: scroll; + } + .modal-footer { + + } + } +} + +.addtoplaylist-panel { + .modal-header { + padding: 16px; + } + .modal-window { + max-height: 500px; + max-width: 300px; + } +} + #navigation-bar { width: 100%; background: rgba(0, 0, 0, 0.25); diff --git a/src/renderer/views/components/add-to-playlist.ejs b/src/renderer/views/components/add-to-playlist.ejs new file mode 100644 index 00000000..08ee7b31 --- /dev/null +++ b/src/renderer/views/components/add-to-playlist.ejs @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/src/renderer/views/components/mediaitem-list-item.ejs b/src/renderer/views/components/mediaitem-list-item.ejs index 7b832b4f..23b93c97 100644 --- a/src/renderer/views/components/mediaitem-list-item.ejs +++ b/src/renderer/views/components/mediaitem-list-item.ejs @@ -4,9 +4,10 @@ @contextmenu="contextMenu" @click="select" :data-id="item.attributes.playParams.id ?? item.id" - :data-type="item.type ?? item.attributes.playParams.kind" + :data-type="getDataType()" :data-index="index" :data-guid="guid" + :data-islibrary="this.item.attributes.playParams.isLibrary ?? false" class="cd-mediaitem-list-item" :class="{'mediaitem-selected': app.select_hasMediaItem(guid)}">