Merge pull request #570 from ciderapp/develop

[Backport] Develop -> E18
This commit is contained in:
Maikiwi 2022-03-14 19:00:47 -07:00 committed by GitHub
commit ed5149399e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 604 additions and 539 deletions

View file

@ -23,9 +23,6 @@ jobs:
key: yarn-packages-{{ checksum "cider-yarn.lock" }} key: yarn-packages-{{ checksum "cider-yarn.lock" }}
paths: paths:
- ~/.cache/yarn - ~/.cache/yarn
- run:
name: Install Playwright
command: yarn playwright install --with-deps
- run: - run:
name: Install system build dependencies name: Install system build dependencies
command: | command: |

View file

@ -11,5 +11,10 @@
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialisation", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialisation",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialise audio and make audio more 3-dimensional (note: This is not Dolby Atmos)", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialise audio and make audio more 3-dimensional (note: This is not Dolby Atmos)",
"spatial.notTurnedOn": "Audio Spatialisation is disabled. To use, please enable it first.", "spatial.notTurnedOn": "Audio Spatialisation is disabled. To use, please enable it first.",
"action.tray.minimize": "Minimise to Tray" "action.tray.minimize": "Minimise to Tray",
"term.tracks": "songs",
"term.track": {
"one" : "song",
"other" : "songs"
}
} }

View file

@ -92,13 +92,25 @@
"term.time.released": "Released", "term.time.released": "Released",
"term.time.updated": "Updated", "term.time.updated": "Updated",
"term.time.days": "days", "term.time.days": "days",
"term.time.day": "day", "term.time.day": {
"one": "day",
"other": "days"
},
"term.time.hours": "hours", "term.time.hours": "hours",
"term.time.hour": "hour", "term.time.hour": {
"one": "hour",
"other": "hours"
},
"term.time.minutes": "minutes", "term.time.minutes": "minutes",
"term.time.minute": "minute", "term.time.minute": {
"one": "minute",
"other": "minutes"
},
"term.time.seconds": "seconds", "term.time.seconds": "seconds",
"term.time.second": "second", "term.time.second": {
"one": "second",
"other": "seconds"
},
"term.fullscreenView": "Fullscreen View", "term.fullscreenView": "Fullscreen View",
"term.defaultView": "Default View", "term.defaultView": "Default View",
"term.audioSettings": "Audio Settings", "term.audioSettings": "Audio Settings",

View file

@ -92,13 +92,25 @@
"term.time.released": "Released", "term.time.released": "Released",
"term.time.updated": "Updated", "term.time.updated": "Updated",
"term.time.days": "days", "term.time.days": "days",
"term.time.day": "day", "term.time.day": {
"one": "day",
"other": "days"
},
"term.time.hours": "hours", "term.time.hours": "hours",
"term.time.hour": "hour", "term.time.hour": {
"one": "hour",
"other": "hours"
},
"term.time.minutes": "minutes", "term.time.minutes": "minutes",
"term.time.minute": "minute", "term.time.minute": {
"one": "minute",
"other": "minutes"
},
"term.time.seconds": "seconds", "term.time.seconds": "seconds",
"term.time.second": "second", "term.time.second": {
"one": "second",
"other": "seconds"
},
"term.fullscreenView": "Fullscreen View", "term.fullscreenView": "Fullscreen View",
"term.defaultView": "Default View", "term.defaultView": "Default View",
"term.audioSettings": "Audio Settings", "term.audioSettings": "Audio Settings",

View file

@ -218,6 +218,14 @@
"settings.option.audio.seamlessTransition": "無間斷播放", "settings.option.audio.seamlessTransition": "無間斷播放",
"settings.option.audio.enableAdvancedFunctionality": "進階音訊功能", "settings.option.audio.enableAdvancedFunctionality": "進階音訊功能",
"settings.option.audio.enableAdvancedFunctionality.description": "啟用 AudioContext 將開啟類似音訊平衡和等化器的進階設定。但這並不一定適合每部電腦,可能會發生音樂卡頓。", "settings.option.audio.enableAdvancedFunctionality.description": "啟用 AudioContext 將開啟類似音訊平衡和等化器的進階設定。但這並不一定適合每部電腦,可能會發生音樂卡頓。",
"settings.option.audio.audioLab": "Cider 音訊實驗室",
"settings.option.audio.audioLab.description": "包含由 Cider 開發團隊進行的各種音訊改善功能。",
"settings.warn.audioLab.withoutAF": "使用 Cider 音訊實驗室需要開啟進階音訊功能才能使用。" ,
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "模擬溫暖",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "以 Korg Nutube 6P1 為設計的模擬溫暖",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "改變模擬溫暖模組處理的強度。",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "溫和",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "溫暖",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數位增強音訊處理™️", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數位增強音訊處理™️",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "將欺騙您的大腦讓您感受到近似保真壓縮的音質。| 由 Maikiwi 設計", "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "將欺騙您的大腦讓您感受到近似保真壓縮的音質。| 由 Maikiwi 設計",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "數位增強音訊處理設定", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "數位增強音訊處理設定",
@ -251,13 +259,19 @@
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
"settings.header.visual.theme": "主題", "settings.header.visual.theme": "主題",
"settings.option.visual.theme.github.download": "從 GitHub 網址安裝", "settings.option.visual.theme.github.download": "從 GitHub 網址安裝",
"settings.option.visual.theme.github.explore": "瀏覽 GitHub 上的主題", "settings.option.visual.theme.github.explore": "探索 GitHub 上的主題",
"settings.option.visual.plugin.github.explore": "探索 GitHub 插件",
"settings.header.visual.plugin.github.page": "來自 GitHub 的插件",
"settings.prompt.visual.theme.github.URL": "輸入你要安裝的主題網址", "settings.prompt.visual.theme.github.URL": "輸入你要安裝的主題網址",
"settings.notyf.visual.theme.install.success": "主題成功安裝", "settings.notyf.visual.theme.install.success": "主題成功安裝",
"settings.notyf.visual.theme.install.error": "主題安裝失敗", "settings.notyf.visual.theme.install.error": "主題安裝失敗",
"settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.default": "預設",
"settings.option.visual.theme.dark": "暗黑模式", "settings.option.visual.theme.dark": "午夜黑",
"settings.option.visual.showPersonalInfo": "顯示個人檔案", "settings.option.visual.showPersonalInfo": "顯示個人檔案",
"settings.header.window": "視窗",
"settings.header.window.description": "調整 Cider 的視窗設定",
"settings.option.window.openOnStartup": "開機時,啟動 Cider ",
"settings.option.window.openOnStartup.hidden": "啟動時,自動隱藏至系統列",
"settings.header.lyrics": "歌詞", "settings.header.lyrics": "歌詞",
"settings.header.lyrics.description": "調整 Cider 的歌詞設定", "settings.header.lyrics.description": "調整 Cider 的歌詞設定",
"settings.option.lyrics.enableMusixmatch": "啟用 Musixmatch 歌詞", "settings.option.lyrics.enableMusixmatch": "啟用 Musixmatch 歌詞",
@ -285,7 +299,11 @@
"settings.option.experimental.closeButtonBehaviour": "關閉按鈕操作", "settings.option.experimental.closeButtonBehaviour": "關閉按鈕操作",
"settings.option.window.close_button_hide": "關閉按鈕將 Cider 隱藏至系統列", "settings.option.window.close_button_hide": "關閉按鈕將 Cider 隱藏至系統列",
"settings.option.experimental.inline_playlists": "將播放列表做為行内元素顯示", "settings.option.experimental.inline_playlists": "將播放列表做為行内元素顯示",
"spatial.notTurnedOn": "空間音訊目前是關閉狀態,請先啟用再使用。", "settings.option.advanced.playlistTrackMapping": "播放列表追蹤映射",
"settings.option.advanced.playlistTrackMapping.description": "開啟對播放列表的深度掃描,以確定歌曲在哪些播放列表中。但播放列表快取時間會顯著增加。",
"settings.option.visual.transparent": "透明視窗框架",
"settings.option.visual.transparent.description": "透明視窗框架(需要主題支援,且須重新啟動)。",
"spatial.notTurnedOn": "空間音訊目前是關閉狀態,請先開啟再使用。",
"spatial.spatialProperties": "空間音訊屬性設定", "spatial.spatialProperties": "空間音訊屬性設定",
"spatial.width": "寬度", "spatial.width": "寬度",
"spatial.height": "高度", "spatial.height": "高度",

View file

@ -894,11 +894,7 @@ export class BrowserWindow {
}) })
app.on('before-quit', () => { app.on('before-quit', () => {
BrowserWindow.win.webContents.executeJavaScript(`
window.localStorage.setItem("currentTrack", JSON.stringify(app.mk.nowPlayingItem));
window.localStorage.setItem("currentTime", JSON.stringify(app.mk.currentPlaybackTime));
window.localStorage.setItem("currentQueue", JSON.stringify(app.mk.queue.items));
ipcRenderer.send('stopGCast','');`)
}) })
@ -1135,6 +1131,11 @@ export class BrowserWindow {
event.preventDefault(); event.preventDefault();
BrowserWindow.win.hide(); BrowserWindow.win.hide();
} else { } else {
BrowserWindow.win.webContents.executeJavaScript(`
window.localStorage.setItem("currentTrack", JSON.stringify(app.mk.nowPlayingItem));
window.localStorage.setItem("currentTime", JSON.stringify(app.mk.currentPlaybackTime));
window.localStorage.setItem("currentQueue", JSON.stringify(app.mk.queue.items));
ipcRenderer.send('stopGCast','');`)
BrowserWindow.win.destroy(); BrowserWindow.win.destroy();
} }
}) })

View file

@ -164,7 +164,7 @@ export default class DiscordRichPresence {
this._activity = { this._activity = {
details: attributes.name, details: attributes.name,
state: `${attributes.artistName ? `by ${attributes.artistName}` : ''}`, state: `${attributes.artistName ? `by ${attributes.artistName}` : ''}`,
startTimestamp: attributes.startTime, startTimestamp: Date.now() - (attributes?.durationInMillis - attributes?.remainingTime),
endTimestamp: attributes.endTime, endTimestamp: attributes.endTime,
largeImageKey: attributes?.artwork?.url?.replace('{w}', '1024').replace('{h}', '1024'), largeImageKey: attributes?.artwork?.url?.replace('{w}', '1024').replace('{h}', '1024'),
largeImageText: attributes.albumName, largeImageText: attributes.albumName,

View file

@ -72,21 +72,21 @@ const CiderAudio = {
CiderAudio.audioNodes.spatialNode.normalize = true; CiderAudio.audioNodes.spatialNode.normalize = true;
switch (app.cfg.audio.maikiwiAudio.spatialType) { switch (app.cfg.audio.maikiwiAudio.spatialType) {
case 0: case 0:
fetch('./audio/impulses/CiderSpatial_Conv.wav').then(async (impulseData) => { fetch('./audio/impulses/CiderSpatial_v69_Standard.wav').then(async (impulseData) => {
let bufferedImpulse = await impulseData.arrayBuffer(); let bufferedImpulse = await impulseData.arrayBuffer();
CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
}); });
break; break;
case 1: case 1:
fetch('./audio/impulses/CiderSpatial_Conv_v2.wav').then(async (impulseData) => { fetch('./audio/impulses/CiderSpatial_v69_Audiophile.wav').then(async (impulseData) => {
let bufferedImpulse = await impulseData.arrayBuffer(); let bufferedImpulse = await impulseData.arrayBuffer();
CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
}); });
break; break;
default: default:
fetch('./audio/impulses/CiderSpatial_Conv.wav').then(async (impulseData) => { fetch('./audio/impulses/CiderSpatial_v69_Standard.wav').then(async (impulseData) => {
let bufferedImpulse = await impulseData.arrayBuffer(); let bufferedImpulse = await impulseData.arrayBuffer();
CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);

View file

@ -16,6 +16,7 @@
justify-content: center; justify-content: center;
align-items : center; align-items : center;
} }
// End Helpers // End Helpers
// GitHub Themes // GitHub Themes
@ -58,6 +59,7 @@
>.list-group { >.list-group {
margin: 0px; margin: 0px;
} }
.list-group-item { .list-group-item {
padding: 12px 6px; padding: 12px 6px;
@ -524,10 +526,12 @@
padding : 1em; padding : 1em;
backdrop-filter: unset; backdrop-filter: unset;
background : black; background : black;
h3 { h3 {
display: none; display: none;
} }
} }
.playlist-inner { .playlist-inner {
background : black; background : black;
width : 80%; width : 80%;
@ -551,6 +555,7 @@
0% { 0% {
opacity: 0; opacity: 0;
} }
100% { 100% {
opacity: 0.7; opacity: 0.7;
} }
@ -773,6 +778,22 @@
.artist-body { .artist-body {
padding: 0px var(--contentInnerPadding) 0px var(--contentInnerPadding); padding: 0px var(--contentInnerPadding) 0px var(--contentInnerPadding);
margin : -140px 20px; margin : -140px 20px;
.arow {
display : flex;
overflow: hidden;
padding : 16px 32px;
>.latestRelease {
width: 250px;
}
>.topSongs {
width: calc(100% - 250px);
}
&.arowb>.topSongs {
width: 100%;
}
}
} }
&.animated>.artist-body { &.animated>.artist-body {
@ -832,6 +853,7 @@
text-transform: uppercase; text-transform: uppercase;
font-weight : bold; font-weight : bold;
} }
.md-btn-replay--hero { .md-btn-replay--hero {
font-size : 1em; font-size : 1em;
padding : 16px; padding : 16px;
@ -914,10 +936,12 @@
transition : transform .2s var(--appleEase); transition : transform .2s var(--appleEase);
transition-delay: .1s; transition-delay: .1s;
align-self : center; align-self : center;
&:hover { &:hover {
transform : translateY(-6px); transform : translateY(-6px);
transition-delay: 0s; transition-delay: 0s;
} }
.artwork-container { .artwork-container {
height: 200px; height: 200px;
width : 200px; width : 200px;
@ -928,6 +952,7 @@
.cd-mediaitem-square { .cd-mediaitem-square {
height: 230px; height: 230px;
width : 230px; width : 230px;
.info-rect { .info-rect {
display: none; display: none;
} }
@ -948,6 +973,7 @@
object-fit: cover; object-fit: cover;
} }
} }
.top-genres-container { .top-genres-container {
.genre-name { .genre-name {
@ -955,6 +981,7 @@
margin : 6px 0px; margin : 6px 0px;
font-weight: 500; font-weight: 500;
} }
.genre-count { .genre-count {
width : 100%; width : 100%;
height : 32px; height : 32px;
@ -980,8 +1007,10 @@
.mediaitem-artwork { .mediaitem-artwork {
animation: replayFadeIn .5s var(--appleEase); animation: replayFadeIn .5s var(--appleEase);
} }
transition : transform .2s var(--appleEase); transition : transform .2s var(--appleEase);
transition-delay: .1s; transition-delay: .1s;
&:hover { &:hover {
transform : scale(1.1); transform : scale(1.1);
transition-delay: 0s; transition-delay: 0s;
@ -1015,6 +1044,7 @@
text-shadow: var(--replayTextShadow); text-shadow: var(--replayTextShadow);
} }
} }
.replay-card { .replay-card {
background: transparent; background: transparent;
border : 0px; border : 0px;

View file

@ -297,6 +297,10 @@ const app = new Vue({
} }
this.lz = ipcRenderer.sendSync("get-i18n", lang) this.lz = ipcRenderer.sendSync("get-i18n", lang)
this.mklang = await this.MKJSLang() this.mklang = await this.MKJSLang()
try{
this.listennow.timestamp = 0;
this.browsepage.timestamp = 0;
}catch(e){}
}, },
/** /**
* Grabs translation for localization. * Grabs translation for localization.
@ -1400,21 +1404,37 @@ const app = new Vue({
} }
}, },
/** /**
* Converts seconds to dd:hh:mm:ss * Converts seconds to dd:hh:mm:ss / Days:Hours:Minutes:Seconds
* @param {number} time (in seconds) * @param {number} seconds
* @param {string} format (short, long) * @param {string} format (short, long)
* @returns {string} * @returns {string}
* @author Core#1034 * @author Core#1034
* @memberOf app * @memberOf app
*/ */
convertTime(time = 0, format = 'short') { convertTime(seconds, format = "short") {
if (isNaN(time)) { if (isNaN(seconds)) {
time = 0 seconds = 0
} }
if (typeof time !== "number") { seconds = parseInt(seconds);
time = parseInt(time)
const datetime = new Date(seconds * 1000)
if (format === "long") {
const d = Math.floor(seconds / (3600*24));
const h = Math.floor(seconds % (3600*24) / 3600);
const m = Math.floor(seconds % 3600 / 60);
const s = Math.floor(seconds % 60);
const dDisplay = d > 0 ? `${d} ${app.getLz("term.time.day", {"count": d})}, ` : "";
const hDisplay = h > 0 ? `${h} ${app.getLz("term.time.hour", {"count": h})}, ` : "";
const mDisplay = m > 0 ? `${m} ${app.getLz("term.time.minute", {"count": m})}, ` : "";
const sDisplay = s > 0 ? `${s} ${app.getLz("term.time.second", {"count": s})}` : "";
return dDisplay + hDisplay + mDisplay + sDisplay;
} }
else {
let returnTime = datetime.toISOString().substring(11, 19);
const timeGates = { const timeGates = {
600: 15, // 10 Minutes 600: 15, // 10 Minutes
@ -1422,50 +1442,20 @@ const app = new Vue({
36000: 12, // 10 Hours 36000: 12, // 10 Hours
} }
const datetime = new Date(time * 1000)
let returnTime = datetime.toISOString().substring(11, 19);
for (let key in timeGates) { for (let key in timeGates) {
if (time < key) { if (seconds < key) {
returnTime = datetime.toISOString().substring(timeGates[key], 19) returnTime = datetime.toISOString().substring(timeGates[key], 19)
break break
} }
} }
// Add the days on the front // Add the days on the front
let day; if (seconds >= 86400) {
if (time >= 86400) { returnTime = parseInt(datetime.toISOString().substring(8, 10)) - 1 + ":" + returnTime
day = datetime.toISOString().substring(8, 10)
day = parseInt(day) - 1
returnTime = day + ":" + returnTime
}
if (format === 'long') {
const longFormat = []
// Seconds
if (datetime.getSeconds() !== 0) {
longFormat.push(`${datetime.getSeconds()} ${app.getLz('term.time.seconds')}`)
}
// Minutes
if (time >= 60) {
longFormat.push(`${datetime.getMinutes()} ${app.getLz(`term.time.${datetime.getMinutes() === 1 ? 'minute' : 'minutes'}`)}`)
}
// Hours
if (time >= 3600) {
longFormat.push(`${datetime.getHours()} ${app.getLz(`term.time.${datetime.getHours() === 1 ? 'hour' : 'hours'}`)}`)
}
// Days
if (time >= 86400) {
longFormat.push(`${day} ${app.getLz(`term.time.${day === 1 ? 'day' : 'days'}`)}`)
}
returnTime = longFormat.reverse().join(', ')
} }
return returnTime return returnTime
}
}, },
hashCode(str) { hashCode(str) {
let hash = 0, let hash = 0,
@ -1862,10 +1852,10 @@ const app = new Vue({
} }
// remove any non-alphanumeric characters and spaces from search term and item name // remove any non-alphanumeric characters and spaces from search term and item name
searchTerm = searchTerm.replace(/[^a-z0-9 ]/gi, "") searchTerm = searchTerm.replace(/[^\p{L}\p{N} ]/gu, "")
itemName = itemName.replace(/[^a-z0-9 ]/gi, "") itemName = itemName.replace(/[^\p{L}\p{N} ]/gu, "")
artistName = artistName.replace(/[^a-z0-9 ]/gi, "") artistName = artistName.replace(/[^\p{L}\p{N} ]/gu, "")
albumName = albumName.replace(/[^a-z0-9 ]/gi, "") albumName = albumName.replace(/[^\p{L}\p{N} ]/gu, "")
if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) { if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) {
return item return item
@ -1931,10 +1921,10 @@ const app = new Vue({
} }
// remove any non-alphanumeric characters and spaces from search term and item name // remove any non-alphanumeric characters and spaces from search term and item name
searchTerm = searchTerm.replace(/[^a-z0-9 ]/gi, "") searchTerm = searchTerm.replace(/[^\p{L}\p{N} ]/gu, "")
itemName = itemName.replace(/[^a-z0-9 ]/gi, "") itemName = itemName.replace(/[^\p{L}\p{N} ]/gu, "")
artistName = artistName.replace(/[^a-z0-9 ]/gi, "") artistName = artistName.replace(/[^\p{L}\p{N} ]/gu, "")
albumName = albumName.replace(/[^a-z0-9 ]/gi, "") albumName = albumName.replace(/[^\p{L}\p{N} ]/gu, "")
if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) { if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) {
return item return item
@ -1996,8 +1986,8 @@ const app = new Vue({
// } // }
// remove any non-alphanumeric characters and spaces from search term and item name // remove any non-alphanumeric characters and spaces from search term and item name
searchTerm = searchTerm.replace(/[^a-z0-9 ]/gi, "") searchTerm = searchTerm.replace(/[^\p{L}\p{N} ]/gu, "")
itemName = itemName.replace(/[^a-z0-9 ]/gi, "") itemName = itemName.replace(/[^\p{L}\p{N} ]/gu, "")
if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) { if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) {

View file

@ -56,8 +56,8 @@
</div> </div>
</div> </div>
<div class="artist-body"> <div class="artist-body">
<div class="row well"> <div class="arow well" :class="{arowb: data.views['latest-release'].data.length == 0}">
<div class="col-sm-3" v-if="data.views['latest-release'].data.length != 0"> <div class="latestRelease" v-if="data.views['latest-release'].data.length != 0">
<h3>{{app.getLz('term.latestReleases')}}</h3> <h3>{{app.getLz('term.latestReleases')}}</h3>
<div style="width: auto;margin: 0 auto;"> <div style="width: auto;margin: 0 auto;">
<mediaitem-square kind="card" v-for="song in data.views['latest-release'].data" <mediaitem-square kind="card" v-for="song in data.views['latest-release'].data"
@ -65,7 +65,7 @@
</mediaitem-square> </mediaitem-square>
</div> </div>
</div> </div>
<div class="col-sm-12" v-if="data.views['top-songs']"> <div class="topSongs" v-if="data.views['top-songs']">
<div class="row"> <div class="row">
<div class="col" style="padding:0;"> <div class="col" style="padding:0;">
<h3>{{app.getLz('term.topSongs')}}</h3> <h3>{{app.getLz('term.topSongs')}}</h3>