recently added rework #1

- recently added is now lazy loaded
- uses official AM recently-added route
- stores in vuex
todo: add clearing method that gets triggered after some time
This commit is contained in:
booploops 2022-06-01 21:47:37 -07:00
parent 215b326b13
commit 5cfbab0c43
5 changed files with 94 additions and 61 deletions

View file

@ -56,6 +56,7 @@ export class BrowserWindow {
"pages/library-songs", "pages/library-songs",
"pages/library-albums", "pages/library-albums",
"pages/library-artists", "pages/library-artists",
"pages/library-recentlyadded",
"pages/browse", "pages/browse",
"pages/groupings", "pages/groupings",
"pages/settings", "pages/settings",
@ -118,6 +119,11 @@ export class BrowserWindow {
"components/inline-collection-list", "components/inline-collection-list",
], ],
appRoutes: [ appRoutes: [
{
page: "library-recentlyadded",
component: `<cider-recentlyadded></cider-recentlyadded>`,
condition: "page == 'library-recentlyadded'"
},
{ {
page: "plugin-renderer", page: "plugin-renderer",
component: `<plugin-renderer></plugin-renderer>`, component: `<plugin-renderer></plugin-renderer>`,

View file

@ -288,7 +288,7 @@ webGPU().then()
let screenWidth = screen.width; let screenWidth = screen.width;
let screenHeight = screen.height; let screenHeight = screen.height;
window.onerror = function (error) { // window.onerror = function (error) {
console.log(error) // console.log(error)
bootbox.alert("Error occurred: " + error) // bootbox.alert("Error occurred: " + error)
}; // };

View file

@ -6,6 +6,14 @@ const store = new Vuex.Store({
// recentlyAdded: ipcRenderer.sendSync("get-library-recentlyAdded"), // recentlyAdded: ipcRenderer.sendSync("get-library-recentlyAdded"),
// playlists: ipcRenderer.sendSync("get-library-playlists") // playlists: ipcRenderer.sendSync("get-library-playlists")
}, },
pageState: {
recentlyAdded: {
loaded: false,
nextUrl: null,
items: [],
size: "normal"
}
},
artwork: { artwork: {
playerLCD: "" playerLCD: ""
} }

View file

@ -24,11 +24,6 @@
</template> </template>
</transition> </transition>
<% } %> <% } %>
<!-- Library - Recently Added -->
<transition :name="chrome.desiredPageTransition" v-on:enter="getLibraryAlbumsFull(null, 0); searchLibraryAlbums(0);">
<%- include('../pages/library-recentlyadded') %>');
</transition>
<!-- Library - Made For You --> <!-- Library - Made For You -->
<transition :name="chrome.desiredPageTransition" v-on:enter="getMadeForYou()"> <transition :name="chrome.desiredPageTransition" v-on:enter="getMadeForYou()">
<template v-if="page == 'library-madeforyou'"> <template v-if="page == 'library-madeforyou'">

View file

@ -1,58 +1,82 @@
<template v-if="page == 'library-recentlyadded'"> <script type="text/x-template" id="cider-recentlyadded">
<div class="content-inner"> <div class="content-inner">
<div class="row"> <b-row no-gutters>
<div class="col" style="padding:0;"> <b-col>
<h1 class="header-text">{{$root.getLz('term.recentlyAdded')}}</h1> <h1 class="header-text">{{$root.getLz('term.recentlyAdded')}}</h1>
</b-col>
<!-- <b-col sm="auto">-->
<!-- <select class="md-select" v-model="$store.state.pageState['recentlyAdded'].size" @change="$root.searchLibrarySongs()">-->
<!-- <optgroup :label="$root.getLz('term.size')">-->
<!-- <option value="normal">{{$root.getLz('term.size.normal')}}</option>-->
<!-- <option value="compact">{{$root.getLz('term.size.compact')}}</option>-->
<!-- </optgroup>-->
<!-- </select>-->
<!-- </b-col>-->
</b-row>
<div class="well itemContainer" v-if="itemSize == 'normal'">
<mediaitem-square v-for="item in items" :item="item"></mediaitem-square>
</div> </div>
<div class="col-auto"> <div class="well itemContainer" v-else="itemSize == 'compact'">
<button v-if="library.albums.downloadState == 2" @click="getLibraryAlbumsFull(true, 0)" <mediaitem-list-item :show-meta-data="true" :show-library-status="false" v-for="item in items" :item="item"></mediaitem-list-item>
class="reload-btn" :aria-label="app.getLz('menubar.options.reload')"><%- include('../svg/redo.svg') %></button>
</div> </div>
<div class="well itemContainer" v-show="loading">
<div class="spinner"></div>
</div> </div>
<div class="row"> <button v-if="nextUrl && !loading" style="opacity:0;height: 32px;" v-observe-visibility="{callback: visibilityChanged}">{{$root.getLz('term.showMore')}}
<div class="col" style="padding:0;"> </button>
<div class="search-input-container" style="width:100%;margin: 16px 0;">
<div class="search-input--icon"></div>
<input type="search"
style="width:100%;"
spellcheck="false"
:placeholder="$root.getLz('term.search') + '...'"
@input="searchLibraryAlbums"
v-model="library.albums.search" class="search-input">
</div> </div>
</div> </script>
<div class="col-auto flex-center">
<div class="row"> <script>
<div class="col"> Vue.component("cider-recentlyadded", {
<select class="md-select" v-model="library.albums.sortOrder[0]" template: "#cider-recentlyadded",
@change="searchLibraryAlbums(0)"> computed: {
<optgroup :label="$root.getLz('term.sortOrder')"> items() {
<option value="asc">{{$root.getLz('term.sortOrder.ascending')}}</option> return this.$store.state.pageState['recentlyAdded'].items;
<option value="desc">{{$root.getLz('term.sortOrder.descending')}}</option> },
</optgroup> nextUrl() {
</select> return this.$store.state.pageState['recentlyAdded'].nextUrl;
</div> },
<div class="col"> itemSize() {
<select class="md-select" v-model="library.albums.viewAs"> return this.$store.state.pageState['recentlyAdded'].size
<optgroup :label="$root.getLz('term.viewAs')"> }
<option value="covers">{{$root.getLz('term.viewAs.coverArt')}}</option> },
<option value="list">{{$root.getLz('term.viewAs.list')}}</option> data: function () {
</optgroup> return {
</select> loading: false,
</div> firstRoute: `/v1/me/library/recently-added?l=${app.mklang}&platform=web&include[library-albums]=artists&include[library-artists]=catalog&fields[artists]=url&fields%5Balbums%5D=artistName%2CartistUrl%2Cartwork%2CcontentRating%2CeditorialArtwork%2Cname%2CplayParams%2CreleaseDate%2Curl&includeOnly=catalog%2Cartists&limit=25`
</div> }
</div> },
</div> async mounted() {
<div class="well"> if(this.$store.state.pageState['recentlyAdded'].items.length !== 0) return
<div class="albums-square-container">
<mediaitem-square v-if="library.albums.viewAs == 'covers'" :item="item" const firstResult = await app.mk.api.v3.music(this.firstRoute)
v-for="item in library.albums.displayListing"> this.$store.state.pageState["recentlyAdded"].items = firstResult.data.data
</mediaitem-square> this.$store.state.pageState["recentlyAdded"].nextUrl = firstResult.data.next
</div> },
<mediaitem-list-item v-if="library.albums.viewAs == 'list'" :show-duration="false" :show-meta-data="true" beforeDestroy() {
:show-library-status="false" :item="item" // this.$store.state.pageState["recently-added"].scrollPosY = $("#app-content").scrollTop()
v-for="item in library.albums.displayListing"> },
</mediaitem-list-item> methods: {
</div> visibilityChanged: function(isVisible, entry) {
</div> if (isVisible && !this.loading) {
</template> this.getNextData();
}
},
async getNextData() {
if (this.$store.state.pageState["recentlyAdded"].nextUrl) {
this.loading = true;
const nextResult = await app.mk.api.v3.music(this.$store.state.pageState["recentlyAdded"].nextUrl)
this.$store.state.pageState["recentlyAdded"].items = this.$store.state.pageState["recentlyAdded"].items.concat(nextResult.data.data)
if (nextResult.data.next) {
this.$store.state.pageState["recentlyAdded"].nextUrl = nextResult.data.next
} else {
this.$store.state.pageState["recentlyAdded"].nextUrl = null
}
this.loading = false;
}
return
}
}
});
</script>