Merge branch 'ciderapp:main' into feature/party-fullscreen

This commit is contained in:
Amaru8 2022-07-16 14:53:04 +02:00 committed by GitHub
commit d7ed9dda38
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 1326 additions and 1267 deletions

View file

@ -374,7 +374,8 @@ export class BrowserWindow {
* @yields {object} Electron browser window * @yields {object} Electron browser window
*/ */
async createWindow(): Promise<Electron.BrowserWindow> { async createWindow(): Promise<Electron.BrowserWindow> {
this.clientPort = await getPort({ port: 9000 }); const envPort = process.env?.CIDER_PORT || '9000'
this.clientPort = await getPort({ port: parseInt(envPort, 10) || 9000 });
BrowserWindow.verifyFiles(); BrowserWindow.verifyFiles();
this.StartWatcher(utils.getPath('themes')); this.StartWatcher(utils.getPath('themes'));

View file

@ -76,10 +76,6 @@ ipcMain.on("nowPlayingItemDidChange", (_event, attributes) => {
CiderPlug.callPlugins("onNowPlayingItemDidChange", attributes); CiderPlug.callPlugins("onNowPlayingItemDidChange", attributes);
}); });
ipcMain.on("updatePlaybackProgress", (_event, attributes) => {
CiderPlug.callPlugins("updatePlaybackProgress", attributes);
})
app.on("before-quit", () => { app.on("before-quit", () => {
CiderPlug.callPlugins("onBeforeQuit"); CiderPlug.callPlugins("onBeforeQuit");
console.warn(`${app.getName()} exited.`); console.warn(`${app.getName()} exited.`);

View file

@ -10,8 +10,6 @@ export default class mpris {
* MPRIS Service * MPRIS Service
*/ */
private static player: Player.Player; private static player: Player.Player;
private static globalAttributes: any = {}
/** /**
* Base Plugin Details (Eventually implemented into a GUI in settings) * Base Plugin Details (Eventually implemented into a GUI in settings)
*/ */
@ -72,10 +70,14 @@ export default class mpris {
player.on('play', () => mpris.utils.playback.play()) player.on('play', () => mpris.utils.playback.play())
player.on('pause', () => mpris.utils.playback.pause()) player.on('pause', () => mpris.utils.playback.pause())
player.on('quit', () => mpris.utils.getApp().exit()) player.on('quit', () => mpris.utils.getApp().exit())
player.on('position', (args: { position: any; }) => mpris.utils.playback.seek(args.position)) player.on('position', (args: { position: any; }) => mpris.utils.playback.seek(args.position / 1000 / 1000))
player.on('loopStatus', (status: string) => renderer.executeJavaScript(`app.mk.repeatMode = ${loopType[status.toLowerCase()]}`)) player.on('loopStatus', (status: string) => renderer.executeJavaScript(`app.mk.repeatMode = ${loopType[status.toLowerCase()]}`))
player.on('shuffle', () => renderer.executeJavaScript('app.mk.shuffleMode = (app.mk.shuffleMode === 0) ? 1 : 0')) player.on('shuffle', () => renderer.executeJavaScript('app.mk.shuffleMode = (app.mk.shuffleMode === 0) ? 1 : 0'))
mpris.utils.getIPCMain().on('mpris:playbackTimeDidChange', (event: any, time: number) => {
player.getPosition = () => time;
})
mpris.utils.getIPCMain().on('repeatModeDidChange', (_e: any, mode: number) => { mpris.utils.getIPCMain().on('repeatModeDidChange', (_e: any, mode: number) => {
switch (mode) { switch (mode) {
case 0: case 0:
@ -160,7 +162,6 @@ export default class mpris {
*/ */
@mpris.linuxOnly @mpris.linuxOnly
onPlaybackStateDidChange(attributes: any): void { onPlaybackStateDidChange(attributes: any): void {
mpris.globalAttributes = attributes
mpris.player.playbackStatus = attributes?.status ? Player.PLAYBACK_STATUS_PLAYING : Player.PLAYBACK_STATUS_PAUSED mpris.player.playbackStatus = attributes?.status ? Player.PLAYBACK_STATUS_PLAYING : Player.PLAYBACK_STATUS_PAUSED
} }
@ -170,14 +171,7 @@ export default class mpris {
*/ */
@mpris.linuxOnly @mpris.linuxOnly
onNowPlayingItemDidChange(attributes: object): void { onNowPlayingItemDidChange(attributes: object): void {
mpris.globalAttributes = attributes
mpris.updateMetaData(attributes); mpris.updateMetaData(attributes);
} }
@mpris.linuxOnly
updatePlaybackProgress(attributes: any): void {
mpris.globalAttributes = attributes
mpris.player.getPosition = () => attributes.currentPlaybackTime * 1000 * 1000;
}
} }

View file

@ -17,10 +17,13 @@ const MusicKitInterop = {
/** wsapi */ /** wsapi */
MusicKit.getInstance().addEventListener(MusicKit.Events.playbackProgressDidChange, () => { MusicKit.getInstance().addEventListener(MusicKit.Events.playbackProgressDidChange, () => {
ipcRenderer.send('wsapi-updatePlaybackState', MusicKitInterop.getAttributes()); ipcRenderer.send('wsapi-updatePlaybackState', MusicKitInterop.getAttributes());
ipcRenderer.send('updatePlaybackProgress', MusicKitInterop.getAttributes());
}); });
/** wsapi */ /** wsapi */
MusicKit.getInstance().addEventListener(MusicKit.Events.playbackTimeDidChange, () => {
ipcRenderer.send('mpris:playbackTimeDidChange', (MusicKit.getInstance()?.currentPlaybackTime * 1000 * 1000 ) ?? 0);
})
MusicKit.getInstance().addEventListener(MusicKit.Events.nowPlayingItemDidChange, async () => { MusicKit.getInstance().addEventListener(MusicKit.Events.nowPlayingItemDidChange, async () => {
console.debug('[cider:preload] nowPlayingItemDidChange') console.debug('[cider:preload] nowPlayingItemDidChange')
const attributes = MusicKitInterop.getAttributes() const attributes = MusicKitInterop.getAttributes()

View file

@ -0,0 +1,7 @@
<svg fill="#fff" viewBox="0 0 20 20" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<path d="M10 12.5c-5.92 0-9 3.5-9 5.5v1h18v-1c0-2-3.08-5.5-9-5.5z"/>
<circle cx="10" cy="6" r="5"/>
<g style="fill:#fff">
<path d="M47.788 25.736a19.5 19.5 0 0 1 0 21.4m7.1-28.5a30 30 0 0 1 0 35.6m6.5-42.1a38.8 38.8 0 0 1 0 48.6m105.752-35a19.5 19.5 0 0 0 0 21.4m-7.1-28.5a30 30 0 0 0 0 35.6m-6.5-42.1a38.8 38.8 0 0 0 0 48.6" style="fill:none;stroke:#fff;stroke-width:5;stroke-linecap:round" transform="translate(-7.276 -.048) scale(.16067)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 562 B

View file

@ -35,6 +35,11 @@
margin : 0px; margin : 0px;
height : 100%; height : 100%;
position : relative; position : relative;
white-space: nowrap;
._svg-icon {
flex: 0 0 auto;
}
&:before { &:before {
--dist : 1px; --dist : 1px;

View file

@ -1226,7 +1226,7 @@ const app = new Vue({
} else if (this.cfg.visual.directives[directive]) { } else if (this.cfg.visual.directives[directive]) {
return this.cfg.visual.directives[directive] return this.cfg.visual.directives[directive]
} else { } else {
return "" return false
} }
}, },
unauthorize() { unauthorize() {
@ -3196,45 +3196,40 @@ const app = new Vue({
function getMXMTrans(lang, vanity_id) { function getMXMTrans(lang, vanity_id) {
try { try {
if (lang != "disabled" && vanity_id != '') { // Mode 2 -> Trans if (lang != "disabled" && vanity_id != '') { // Mode 2 -> Trans
fetch('https://www.musixmatch.com/lyrics/' + vanity_id +'/translation/' + lang, { let url = "https://api.cider.sh/v1/lyrics?vanityID=" + vanity_id +'&source=mxm&lang=' + lang;
method: 'GET', let req = new XMLHttpRequest();
headers: { req.overrideMimeType("application/json");
'Host': 'musixmatch.com', req.onload = function () {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36", if (req.status == 200) { // If it's not 200, 237890127389012 things could go wrong and I don't really care what those things are.
'authority': "www.musixmatch.com" let jsonResponse = JSON.parse(this.responseText);
},
})
.then(async (res) => {
if (res.status != 200) {return}
let html = document.createElement('html'); html.innerHTML = await res.text()
let lyric_isolated = html.querySelector("#site > div > div > div > main > div > div > div.mxm-track-lyrics-container > div.container > div > div > div > div.col-sm-12.col-md-10.col-ml-9.col-lg-9 > div.mxm-lyrics.translated > div.row > div.col-xs-12.col-sm-12.col-md-12.col-ml-12.col-lg-12")
let raw_lines = lyric_isolated.getElementsByClassName("col-xs-6 col-sm-6 col-md-6 col-ml-6 col-lg-6")
let applied = 0; let applied = 0;
for (let i = 1; applied < app.lyrics.length; i+=2) { // Start on odd elements because even ones are original. for (let i = 0; applied < app.lyrics.length; i++) {
if (raw_lines[i].childNodes[0].childNodes[0].textContent.trim() == "") {i+=2;} if (app.lyrics[applied].line.trim() === "") {applied+=1;}
if (app.lyrics[applied].line.trim() == "") {applied+=1;} if (app.lyrics[applied].line.trim() === jsonResponse[i]) {
if (app.lyrics[applied].line.trim() === raw_lines[i].childNodes[0].childNodes[0].textContent.trim().replace('', "'")) {
// Do Nothing // Do Nothing
applied +=1; applied +=1;
} }
else { else {
if (app.lyrics[applied].line === "lrcInstrumental") { if (app.lyrics[applied].line === "lrcInstrumental") {
if (app.lyrics[applied+1].line.trim() === raw_lines[i].childNodes[0].childNodes[0].textContent.trim()) { if (app.lyrics[applied+1].line.trim() === jsonResponse[i]) {
// Do Nothing // Do Nothing
applied +=2; applied +=2;
} }
else { else {
app.lyrics[applied+1].translation = raw_lines[i].childNodes[0].childNodes[0].textContent.trim(); app.lyrics[applied+1].translation = jsonResponse[i];
applied +=2; applied +=2;
} }
} }
else { else {
app.lyrics[applied].translation = raw_lines[i].childNodes[0].childNodes[0].textContent.trim(); app.lyrics[applied].translation = jsonResponse[i];
applied +=1; applied +=1;
} }
} }
} }
}) }
}
req.open('POST', url, true);
req.send();
} }
} catch (e) {console.debug("Error while parsing MXM Trans: " + e)} } catch (e) {console.debug("Error while parsing MXM Trans: " + e)}

View file

@ -208,6 +208,7 @@ body.notransparency::before {
0% { 0% {
transform: rotateZ(0deg); transform: rotateZ(0deg);
} }
100% { 100% {
transform: rotateZ(360deg); transform: rotateZ(360deg);
} }
@ -217,7 +218,8 @@ body.notransparency::before {
display: none !important; display: none !important;
} }
input[type="text"], input[type="number"] { input[type="text"],
input[type="number"] {
background : #1c1c1c; background : #1c1c1c;
border-radius: 3px; border-radius: 3px;
border : 1px solid rgb(200 200 200 / 25%); border : 1px solid rgb(200 200 200 / 25%);
@ -248,6 +250,7 @@ a.dropdown-item {
background-color: var(--selected); background-color: var(--selected);
color : var(--textColor); color : var(--textColor);
} }
&:active { &:active {
background-color: var(--selected-click); background-color: var(--selected-click);
} }
@ -270,6 +273,7 @@ a.dropdown-item {
0% { 0% {
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
transform: rotate(360deg); transform: rotate(360deg);
} }
@ -443,6 +447,8 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
filter: brightness(80%) blur(180px) saturate(180%) contrast(1); filter: brightness(80%) blur(180px) saturate(180%) contrast(1);
} }
} }
transition: .3s var(--appleEase);
} }
.search-input-container { .search-input-container {
@ -522,6 +528,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
.app-playback-controls { .app-playback-controls {
margin: 0 auto; margin: 0 auto;
.control-buttons { .control-buttons {
display : flex; display : flex;
justify-content: center; justify-content: center;
@ -537,6 +544,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
display: flex; display: flex;
padding: 6px; padding: 6px;
border : 0; border : 0;
>button { >button {
appearance : none; appearance : none;
width : 100%; width : 100%;
@ -544,12 +552,15 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
padding-left: 40px; padding-left: 40px;
text-align : left; text-align : left;
font-family : inherit; font-family : inherit;
&:hover { &:hover {
background-color: var(--selected); background-color: var(--selected);
} }
&:active { &:active {
background-color: var(--selected-click); background-color: var(--selected-click);
} }
&:after { &:after {
content : ''; content : '';
display : flex; display : flex;
@ -683,10 +694,12 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
box-shadow : var(--ciderShadow-Generic); box-shadow : var(--ciderShadow-Generic);
backdrop-filter: var(--glassFilter); backdrop-filter: var(--glassFilter);
animation : cmenuBodyIn .5s var(--appleEase); animation : cmenuBodyIn .5s var(--appleEase);
@keyframes cmenuBodyIn { @keyframes cmenuBodyIn {
0% { 0% {
background: rgb(30 30 30); background: rgb(30 30 30);
} }
100% { 100% {
background: rgb(30 30 30 / 45%); background: rgb(30 30 30 / 45%);
} }
@ -1008,6 +1021,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
} }
.app-chrome .app-chrome--center { .app-chrome .app-chrome--center {
//width: 40%; //width: 40%;
.app-title-text { .app-title-text {
font-size: 0.8em; font-size: 0.8em;
@ -1060,11 +1074,13 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
border-radius : 6px; border-radius : 6px;
} }
.volume-button:active, .volume-button--small:active { .volume-button:active,
.volume-button--small:active {
transform: scale(0.9); transform: scale(0.9);
} }
.volume-button.active, .volume-button--small.active { .volume-button.active,
.volume-button--small.active {
background-image: url("./assets/feather/volume.svg"); background-image: url("./assets/feather/volume.svg");
} }
@ -1155,7 +1171,8 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
transform: scale(1.1); transform: scale(1.1);
} }
&:active, &.active { &:active,
&.active {
border-radius: 100%; border-radius: 100%;
transform : scale(1.1); transform : scale(1.1);
outline : 2px solid var(--keyColor); outline : 2px solid var(--keyColor);
@ -1175,9 +1192,11 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
>div { >div {
height: 100%; height: 100%;
width : 32px; width : 32px;
&:hover { &:hover {
background: rgb(200 200 200 / 10%); background: rgb(200 200 200 / 10%);
} }
&.close { &.close {
width : 100%; width : 100%;
height : 100%; height : 100%;
@ -1190,6 +1209,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
background-color: rgb(196, 43, 28) background-color: rgb(196, 43, 28)
} }
} }
&.minmax { &.minmax {
background-image : var(--gfx-maxBtn); background-image : var(--gfx-maxBtn);
background-position: center; background-position: center;
@ -1198,9 +1218,11 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
width : 100%; width : 100%;
height : 100%; height : 100%;
} }
&.minmax.restore { &.minmax.restore {
background-image: var(--gfx-restoreBtn); background-image: var(--gfx-restoreBtn);
} }
&.minimize { &.minimize {
background-image : var(--gfx-minBtn); background-image : var(--gfx-minBtn);
background-position: center; background-position: center;
@ -1256,6 +1278,7 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl
align-items : center; align-items : center;
width : 100%; width : 100%;
} }
.song-name { .song-name {
font-weight: 600; font-weight: 600;
text-align : center; text-align : center;
@ -1325,6 +1348,7 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl
z-index : 1; z-index : 1;
} }
} }
// Add Music Video Icons to Songs that are Music Videos // Add Music Video Icons to Songs that are Music Videos
div[data-type="library-music-videos"] .info-rect .title::before, div[data-type="library-music-videos"] .info-rect .title::before,
div[data-type="musicVideo"] .info-rect .title::before { div[data-type="musicVideo"] .info-rect .title::before {
@ -1460,6 +1484,7 @@ div[data-type="musicVideo"] .info-rect .title::before {
flex : 0 0 auto; flex : 0 0 auto;
margin : 6px; margin : 6px;
image-rendering : -webkit-optimize-contrast; image-rendering : -webkit-optimize-contrast;
.mediaitem-artwork { .mediaitem-artwork {
border-radius: var(--mediaItemRadiusSmall); border-radius: var(--mediaItemRadiusSmall);
} }
@ -1586,7 +1611,8 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
/* Window is smaller <= 1023px width */ /* Window is smaller <= 1023px width */
@media only screen and (max-width: 1120px) { @media only screen and (max-width: 1120px) {
.display--small { .display--small {
display: inherit !important;; display: inherit !important;
;
.slider { .slider {
width : 100%; width : 100%;
@ -1742,6 +1768,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
.lyric-body:hover>.lyric-line:not(.active) { .lyric-body:hover>.lyric-line:not(.active) {
filter: none !important; filter: none !important;
} }
.lyric-body>.lyric-line:not(.active) { .lyric-body>.lyric-line:not(.active) {
// transition: filter var(--appleEase) 0.5s ease; // transition: filter var(--appleEase) 0.5s ease;
} }
@ -1786,7 +1813,8 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
transition : opacity 0.1s var(--appleEase); transition : opacity 0.1s var(--appleEase);
} }
.lyric-body:hover + .lyric-footer, .lyric-footer:hover { .lyric-body:hover+.lyric-footer,
.lyric-footer:hover {
display: flex; display: flex;
} }
@ -1937,18 +1965,23 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
margin : 0px 16px 0px 0px; margin : 0px 16px 0px 0px;
pointer-events: none; pointer-events: none;
} }
&.githubBtn { &.githubBtn {
background-color: #211F1F; background-color: #211F1F;
} }
&.kofiBtn { &.kofiBtn {
background-color: #FBAA19; background-color: #FBAA19;
} }
&.opencollectiveBtn { &.opencollectiveBtn {
background-color: #7fadf2; background-color: #7fadf2;
} }
&.discordBtn { &.discordBtn {
background-color: #5865F2; background-color: #5865F2;
} }
&.twitterBtn { &.twitterBtn {
background-color: #1D9BF0; background-color: #1D9BF0;
} }
@ -2037,9 +2070,11 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
display : flex; display : flex;
flex-flow : wrap; flex-flow : wrap;
justify-content: center; justify-content: center;
.cd-mediaitem-square-container { .cd-mediaitem-square-container {
align-items: center; align-items: center;
} }
.cd-mediaitem-square { .cd-mediaitem-square {
width : 220px; width : 220px;
height : 260px; height : 260px;
@ -2062,6 +2097,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
@media screen and (min-width: 1500px) { @media screen and (min-width: 1500px) {
grid-template-columns: repeat(5, minmax(200px, 1fr)); grid-template-columns: repeat(5, minmax(200px, 1fr));
} }
// less than 1100px // less than 1100px
@media screen and (max-width: 1150px) { @media screen and (max-width: 1150px) {
grid-template-columns: repeat(3, minmax(200px, 1fr)); grid-template-columns: repeat(3, minmax(200px, 1fr));
@ -2106,11 +2142,13 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
opacity : 1; opacity : 1;
// animation: micaEnter 1s ease-in-out forwards; // animation: micaEnter 1s ease-in-out forwards;
filter : brightness(1) saturate(320%); filter : brightness(1) saturate(320%);
@keyframes micaEnter { @keyframes micaEnter {
0% { 0% {
opacity : 0; opacity : 0;
transform: translateY(10px); transform: translateY(10px);
} }
100% { 100% {
opacity : 1; opacity : 1;
transform: translateY(0px); transform: translateY(0px);
@ -2138,9 +2176,11 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
z-index : 14 !important; z-index : 14 !important;
backdrop-filter: var(--glassFilter); backdrop-filter: var(--glassFilter);
} }
.app-navigation { .app-navigation {
height: 100%; height: 100%;
} }
.app-drawer { .app-drawer {
width : 100%; width : 100%;
right : 0px; right : 0px;
@ -2201,6 +2241,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
opacity : 0; opacity : 0;
transform: scale(0.98) transform: scale(0.98)
} }
100% { 100% {
opacity : 1; opacity : 1;
transform: scale(1); transform: scale(1);
@ -2333,9 +2374,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
transform: translateX(400px); transform: translateX(400px);
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {}
}
:root { :root {
--gfx-closeBtn : url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6MzYtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjM2LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6MzYtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PmN2D9EAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEtJREFUGJWNkMENwDAIA1FGY/8hkn8HOAqPfBsFKvz1yZYtbqwAlUIB6saUAH2NJ4MvL4PLgK/x13LAGTSqEaVa1a0x7XvcmI3D1wbntaRbB2haYwAAAABJRU5ErkJggg=='); --gfx-closeBtn : url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6MzYtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjM2LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6MzYtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PmN2D9EAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEtJREFUGJWNkMENwDAIA1FGY/8hkn8HOAqPfBsFKvz1yZYtbqwAlUIB6saUAH2NJ4MvL4PLgK/x13LAGTSqEaVa1a0x7XvcmI3D1wbntaRbB2haYwAAAABJRU5ErkJggg==');
@ -2388,22 +2427,26 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
transition: 0.2s ease-in-out filter; transition: 0.2s ease-in-out filter;
} }
} }
.playback-info { .playback-info {
position : absolute; position : absolute;
width : 100%; width : 100%;
bottom : 0; bottom : 0;
padding : 20px 40px; padding : 20px 40px;
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.5) 50%); background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.5) 50%);
.song-artist { .song-artist {
font-size : 1.7rem; font-size : 1.7rem;
font-weight: bold; font-weight: bold;
} }
.song-name { .song-name {
font-size : 1.2rem; font-size : 1.2rem;
font-weight: bold; font-weight: bold;
color : rgb(255, 255, 255, 0.8); color : rgb(255, 255, 255, 0.8);
} }
} }
input[type="range"] { input[type="range"] {
align-self : center; align-self : center;
height : 4px; height : 4px;
@ -2413,6 +2456,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
.song-progress input[type="range"] { .song-progress input[type="range"] {
appearance: initial; appearance: initial;
&::-webkit-slider-thumb { &::-webkit-slider-thumb {
box-shadow : 0px 0px 0px #000000; box-shadow : 0px 0px 0px #000000;
border : 1px solid #39404D; border : 1px solid #39404D;
@ -2438,25 +2482,30 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
top : 0; top : 0;
bottom: unset; bottom: unset;
} }
.inactive { .inactive {
opacity: 0; opacity: 0;
} }
#apple-music-video-player-controls { #apple-music-video-player-controls {
position: absolute; position: absolute;
z-index : 100001; z-index : 100001;
float : left; float : left;
width : 100%; width : 100%;
height : 100%; height : 100%;
.playback-info { .playback-info {
.song-progress { .song-progress {
display: flex; display: flex;
} }
.app-chrome-item.display--large { .app-chrome-item.display--large {
position : relative; position : relative;
display : flex; display : flex;
flex-direction: row; flex-direction: row;
flex-wrap : nowrap; flex-wrap : nowrap;
align-items : center; align-items : center;
.playback-button { .playback-button {
position : absolute; position : absolute;
top : 50%; top : 50%;
@ -2465,6 +2514,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
padding : 3px; padding : 3px;
} }
} }
.song-artist-album { .song-artist-album {
font-weight : 400; font-weight : 400;
font-size : 12px; font-size : 12px;
@ -2610,6 +2660,7 @@ body.no-gpu {
.bg-artwork-container { .bg-artwork-container {
display : none; display : none;
animation: none !important; animation: none !important;
.bg-artwork { .bg-artwork {
animation: none !important; animation: none !important;
} }
@ -2653,6 +2704,7 @@ body.no-gpu {
backdrop-filter: unset; backdrop-filter: unset;
mix-blend-mode : unset; mix-blend-mode : unset;
background : #1c1c1c; background : #1c1c1c;
transition: unset;
} }
.wpfade-enter-active, .wpfade-enter-active,
@ -2693,6 +2745,7 @@ body.no-gpu {
.moreinfo-modal { .moreinfo-modal {
.modal-window { .modal-window {
height: max-content !important; height: max-content !important;
.modal-content { .modal-content {
height : max-content !important; height : max-content !important;
padding-block: 25px; padding-block: 25px;

View file

@ -43,6 +43,7 @@
<div class="vdiv display--large" v-if="getThemeDirective('windowLayout') != 'twopanel'"></div> <div class="vdiv display--large" v-if="getThemeDirective('windowLayout') != 'twopanel'"></div>
</template> </template>
<template v-if="getThemeDirective('windowLayout') != 'twopanel'"> <template v-if="getThemeDirective('windowLayout') != 'twopanel'">
<div class="app-chrome-item playback-control-buttons">
<div class="app-chrome-item display--large"> <div class="app-chrome-item display--large">
<button class="playback-button--small shuffle" v-if="mk.shuffleMode == 0" :class="isDisabled() && 'disabled'" <button class="playback-button--small shuffle" v-if="mk.shuffleMode == 0" :class="isDisabled() && 'disabled'"
@click="mk.shuffleMode = 1" :title="$root.getLz('term.enableShuffle')" v-b-tooltip.hover></button> @click="mk.shuffleMode = 1" :title="$root.getLz('term.enableShuffle')" v-b-tooltip.hover></button>
@ -76,6 +77,7 @@
:class="isDisabled() && 'disabled'" v-else-if="mk.repeatMode == 2" :title="$root.getLz('term.disableRepeat')" :class="isDisabled() && 'disabled'" v-else-if="mk.repeatMode == 2" :title="$root.getLz('term.disableRepeat')"
v-b-tooltip.hover></button> v-b-tooltip.hover></button>
</div> </div>
</div>
</template> </template>
</div> </div>
<div class="app-chrome--center"> <div class="app-chrome--center">

View file

@ -38,7 +38,7 @@
</template> </template>
<div class="app-sidebar-content" scrollaxis="y"> <div class="app-sidebar-content" scrollaxis="y">
<!-- AM Navigation --> <!-- AM Navigation -->
<template v-if="$root.getThemeDirective('windowLayout') != 'twopanel'"> <div v-show="$root.getThemeDirective('windowLayout') != 'twopanel'" class="sidebarCatalogSection">
<div <div
class="app-sidebar-header-text" class="app-sidebar-header-text"
@click="$root.cfg.general.sidebarCollapsed.cider = !$root.cfg.general.sidebarCollapsed.cider" @click="$root.cfg.general.sidebarCollapsed.cider = !$root.cfg.general.sidebarCollapsed.cider"
@ -84,7 +84,7 @@
page="radio" page="radio"
></sidebar-library-item> ></sidebar-library-item>
</template> </template>
</template> </div>
<div <div
class="app-sidebar-header-text" class="app-sidebar-header-text"

View file

@ -116,7 +116,7 @@
<% } %> <% } %>
<script async <script async
src="<%- (env.useV3 ? "https://js-cdn.music.apple.com/musickit/v3/amp/musickit.js" : "https://js-cdn.music.apple.com/musickit/v2/amp/musickit.js") %>" src="<%- (env.useV3 ? "https://js-cdn.music.apple.com/musickit/v3/amp/musickit.js" : "https://api.cider.sh/musickit.js") %>"
data-web-components> data-web-components>
</script> </script>
<script src="index.js?v=1"></script> <script src="index.js?v=1"></script>

View file

@ -1,5 +1,5 @@
<script type="text/x-template" id="cider-playlist"> <script type="text/x-template" id="cider-playlist">
<div class="content-inner playlist-page" :class="classes" v-if="data != [] && data.attributes != null" <div class="content-inner playlist-page" :class="classes" :is-album="isAlbum()" v-if="data != [] && data.attributes != null"
:style="{'--bgColor': (data.attributes.artwork != null && data.attributes.artwork['bgColor'] != null) ? ('#' + data.attributes.artwork.bgColor) : ''}"> :style="{'--bgColor': (data.attributes.artwork != null && data.attributes.artwork['bgColor'] != null) ? ('#' + data.attributes.artwork.bgColor) : ''}">
<template v-if="app.playlists.loadingState == 0"> <template v-if="app.playlists.loadingState == 0">
@ -347,6 +347,9 @@
} }
}, },
methods: { methods: {
isAlbum() {
return (this.data.attributes?.playParams?.kind ?? this.data.type ?? '').includes('album')
},
minClass(val) { minClass(val) {
if(app.appMode == 'fullscreen') { if(app.appMode == 'fullscreen') {
return return