150 lines
7.1 KiB
Text
150 lines
7.1 KiB
Text
<script type="text/x-template" id="cider-library-songs">
|
|
<div class="content-inner library-page">
|
|
<div class="library-header">
|
|
<div class="row">
|
|
<div class="col" style="padding:0;">
|
|
<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="app.getLz('term.search') + '...'"
|
|
@input="$root.searchLibrarySongs"
|
|
v-model="library.songs.search" class="search-input">
|
|
</div>
|
|
</div>
|
|
<div class="col-auto cider-flex-center">
|
|
<div class="row">
|
|
<button class="col md-btn md-btn-primary md-btn-icon"
|
|
style="min-width: 100px;margin-right: 3px;"
|
|
@click="app.mk.shuffleMode = 0; play()"><img class="md-ico-play">
|
|
{{app.getLz('term.play')}}
|
|
</button>
|
|
<button class="col md-btn md-btn-primary md-btn-icon"
|
|
style="min-width: 100px;margin-right: 3px;"
|
|
@click="app.mk.shuffleMode = 1;play()"><img class="md-ico-shuffle">
|
|
{{app.getLz('term.shuffle')}}
|
|
</button>
|
|
<div class="col">
|
|
<select class="md-select" v-model="prefs.sort" @change="$root.searchLibrarySongs()">
|
|
<optgroup :label="app.getLz('term.sortBy')">
|
|
<option v-for="(sort, index) in library.songs.sortingOptions" :value="index">{{ sort
|
|
}}
|
|
</option>
|
|
</optgroup>
|
|
</select>
|
|
</div>
|
|
<div class="col">
|
|
<select class="md-select" v-model="prefs.sortOrder" @change="$root.searchLibrarySongs()">
|
|
<optgroup :label="app.getLz('term.sortOrder')">
|
|
<option value="asc">{{app.getLz('term.sortOrder.ascending')}}</option>
|
|
<option value="desc">{{app.getLz('term.sortOrder.descending')}}</option>
|
|
</optgroup>
|
|
</select>
|
|
</div>
|
|
<div class="col">
|
|
<select class="md-select" v-model="prefs.size" @change="$root.searchLibrarySongs()">
|
|
<optgroup :label="app.getLz('term.size')">
|
|
<option value="normal">{{app.getLz('term.size.normal')}}</option>
|
|
<option value="compact">{{app.getLz('term.size.compact')}}</option>
|
|
</optgroup>
|
|
</select>
|
|
</div>
|
|
<div class="col">
|
|
<select class="md-select" v-model="prefs.scroll">
|
|
<optgroup :label="app.getLz('term.scroll')">
|
|
<option value="infinite">{{app.getLz('term.scroll.infinite')}}</option>
|
|
<option value="paged">{{app.getLz('term.scroll.paged').replace("${songsPerPage}",
|
|
pageSize)}}
|
|
</option>
|
|
</optgroup>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-auto cider-flex-center">
|
|
<button v-if="library.songs.downloadState == 2" @click="$root.getLibrarySongsFull(true)"
|
|
class="reload-btn"
|
|
:aria-label="app.getLz('menubar.options.reload')"><%- include('../svg/redo.svg') %></button>
|
|
<button v-else class="reload-btn" style="opacity: 0.8;pointer-events: none"
|
|
:aria-label="app.getLz('menubar.options.reload')">
|
|
<div class="spinner"></div>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<pagination
|
|
:length="library.songs.displayListing.length"
|
|
:pageSize="pageSize"
|
|
:scroll="prefs.scroll"
|
|
scrollSelector="#app-content"
|
|
@onRangeChange="onRangeChange"
|
|
/>
|
|
</div>
|
|
|
|
<div v-if="library.songs.downloadState == 3">Library contains no songs.</div>
|
|
<div class="well" :key="1" v-if="prefs.size == 'compact'">
|
|
<mediaitem-list-item class-list="compact" :item="item" :parent="'librarysongs'" :index="index"
|
|
:show-meta-data="true" :show-library-status="false" v-bind:key="item.id"
|
|
v-for="(item, index) in currentSlice"></mediaitem-list-item>
|
|
</div>
|
|
<div class="well" :key="2" v-else>
|
|
<mediaitem-list-item :item="item" :parent="'librarysongs'" :index="index" :show-meta-data="true"
|
|
:show-library-status="false" v-bind:key="item.id"
|
|
v-for="(item, index) in currentSlice"></mediaitem-list-item>
|
|
</div>
|
|
</div>
|
|
</script>
|
|
|
|
<script>
|
|
Vue.component('cider-library-songs', {
|
|
template: '#cider-library-songs',
|
|
data: function() {
|
|
const pageSize = this.$root.cfg.libraryPrefs.pageSize;
|
|
return {
|
|
// currentPage is oneIndexed
|
|
library: this.$root.library,
|
|
mediaItemSize: "compact",
|
|
prefs: this.$root.cfg.libraryPrefs.songs,
|
|
app: this.$root,
|
|
pageSize: pageSize,
|
|
start: 0,
|
|
end: pageSize
|
|
}
|
|
},
|
|
mounted() {
|
|
this.$root.getLibrarySongsFull()
|
|
},
|
|
computed: {
|
|
currentSlice: function() {
|
|
return this.library.songs.displayListing.slice(this.start, this.end);
|
|
}
|
|
},
|
|
methods: {
|
|
onRangeChange: function(newRange) {
|
|
this.start = newRange[0];
|
|
this.end = newRange[1];
|
|
},
|
|
play: function() {
|
|
function shuffleArray(array) {
|
|
for (var i = array.length - 1; i > 0; i--) {
|
|
var j = Math.floor(Math.random() * (i + 1));
|
|
var temp = array[i];
|
|
array[i] = array[j];
|
|
array[j] = temp;
|
|
}
|
|
}
|
|
|
|
let query = this.app.library.songs.displayListing.map(item => new MusicKit.MediaItem(item));
|
|
if (!app.mk.queue.isEmpty)
|
|
app.mk.queue.splice(0, app.mk.queue._itemIDs.length);
|
|
app.mk.stop().then(() => {
|
|
if (app.mk.shuffleMode == 1) {
|
|
shuffleArray(query)
|
|
}
|
|
app.mk.queue.append(query)
|
|
app.mk.changeToMediaAtIndex(0)
|
|
});
|
|
}
|
|
}
|
|
});
|
|
</script>
|