From df8cde6f54d436c602a872902ac44485a0ec7e88 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Thu, 7 Jul 2022 07:51:38 +0700 Subject: [PATCH 01/18] revert mxm back to local --- src/renderer/main/vueapp.js | 89 ++++++++++++++++--- .../views/components/settings-window.ejs | 20 +++-- src/renderer/views/pages/settings.ejs | 20 +++-- 3 files changed, 97 insertions(+), 32 deletions(-) diff --git a/src/renderer/main/vueapp.js b/src/renderer/main/vueapp.js index 0879c25e..7dfd7953 100644 --- a/src/renderer/main/vueapp.js +++ b/src/renderer/main/vueapp.js @@ -3065,13 +3065,67 @@ const app = new Vue({ return Math.random().toString(36).replace(/[^a-z]+/g, '').slice(2, 10); } + /* get token */ + function getToken(mode, track, artist, songid, lang, time, id) { + if (attempt > 2) { + app.loadNeteaseLyrics(); + // app.loadAMLyrics(); + } else { + attempt = attempt + 1; + let url = "https://apic-desktop.musixmatch.com/ws/1.1/token.get?app_id=web-desktop-app-v1.0&t=" + revisedRandId(); + let req = new XMLHttpRequest(); + req.overrideMimeType("application/json"); + req.open('GET', url, true); + req.setRequestHeader("authority", "apic-desktop.musixmatch.com"); + req.onload = function () { + try { + let jsonResponse = JSON.parse(this.responseText); + let status2 = jsonResponse["message"]["header"]["status_code"]; + if (status2 == 200) { + let token = jsonResponse["message"]["body"]["user_token"] ?? ''; + if (token != "" && token != "UpgradeOnlyUpgradeOnlyUpgradeOnlyUpgradeOnly") { + console.debug('200 token', mode); + // token good + app.mxmtoken = token; - function getMXMSubs(track, artist, lang, time, id) { - let richsyncQuery = app.cfg.lyrics.mxm_karaoke - let itunesid = (id && id != "") ? id : ''; // Mode 1 -> Subs - let url = "https://api.cider.sh/v1/lyrics?" + "mode=1" + "&richsyncQuery=" + richsyncQuery + "&track=" + track + "&artist=" + artist + "&songID=" + itunesid + "&source=mxm" + "&lang=" + lang + "&time=" + time; + if (mode == 1) { + getMXMSubs(track, artist, app.mxmtoken, lang, time, id); + } else { + getMXMTrans(songid, lang, app.mxmtoken); + } + } else { + console.debug('fake 200 token'); + getToken(mode, track, artist, songid, lang, time) + } + } else { + // console.log('token 4xx'); + getToken(mode, track, artist, songid, lang, time) + } + } catch (e) { + console.log('error'); + app.loadQQLyrics(); + //app.loadAMLyrics(); + } + }; + req.onerror = function () { + console.log('error'); + app.loadQQLyrics(); + // app.loadAMLyrics(); + }; + req.send(); + } + } + + function getMXMSubs(track, artist, token, lang, time, id) { + let usertoken = encodeURIComponent(token); + let richsyncQuery = (app.cfg.lyrics.mxm_karaoke) ? "&optional_calls=track.richsync" : "" + let timecustom = (!time || (time && time < 0)) ? '' : `&f_subtitle_length=${time}&q_duration=${time}&f_subtitle_length_max_deviation=40`; + let itunesid = (id && id != "") ? `&track_itunes_id=${id}` : ''; + let url = "https://apic-desktop.musixmatch.com/ws/1.1/macro.subtitles.get?format=json&namespace=lyrics_richsynched" + richsyncQuery + "&subtitle_format=lrc&q_artist=" + artist + "&q_track=" + track + itunesid + "&usertoken=" + usertoken + timecustom + "&app_id=web-desktop-app-v1.0&t=" + revisedRandId(); let req = new XMLHttpRequest(); req.overrideMimeType("application/json"); + req.open('GET', url, true); + req.setRequestHeader("authority", "apic-desktop.musixmatch.com"); req.onload = function () { try { let jsonResponse = JSON.parse(this.responseText); @@ -3098,7 +3152,7 @@ const app = new Vue({ // app.loadAMLyrics() } else { if (richsync == [] || richsync.length == 0) { - console.log("musixmatch worki"); + console.log("ok"); // process lrcfile to json here app.lyricsMediaItem = lrcfile let u = app.lyricsMediaItem.split(/[\r\n]/); @@ -3141,7 +3195,7 @@ const app = new Vue({ } if (lrcfile != null && lrcfile != '') { // load translation - getMXMTrans(id, lang); + getMXMTrans(id, lang, token); } else { // app.loadAMLyrics() app.loadQQLyrics(); @@ -3152,7 +3206,9 @@ const app = new Vue({ app.loadQQLyrics(); // app.loadAMLyrics() } - } + } else { //4xx rejected + getToken(1, track, artist, '', lang, time); + } } catch (e) { console.error(e); app.loadQQLyrics(); @@ -3164,22 +3220,23 @@ const app = new Vue({ console.log('error'); // app.loadAMLyrics(); }; - req.open('POST', url, true); req.send(); } - function getMXMTrans(id, lang) { - if (lang != "disabled" && id != '') { // Mode 2 -> Trans - let url2 = "https://api.cider.sh/v1/lyrics?" + "mode=2" + "&richsyncQuery=" + richsyncQuery + "&track=" + track + "&artist=" + artist + "&songID=" + itunesid + "&source=mxm" + "&lang=" + lang + "&time=" + time; + function getMXMTrans(id, lang, token) { + if (lang != "disabled" && id != '') { + let usertoken = encodeURIComponent(token); + let url2 = "https://apic-desktop.musixmatch.com/ws/1.1/crowd.track.translations.get?translation_fields_set=minimal&selected_language=" + lang + "&track_id=" + id + "&comment_format=text&part=user&format=json&usertoken=" + usertoken + "&app_id=web-desktop-app-v1.0&t=" + revisedRandId(); let req2 = new XMLHttpRequest(); req2.overrideMimeType("application/json"); - req2.open('POST', url2, true); + req2.open('GET', url2, true); + req2.setRequestHeader("authority", "apic-desktop.musixmatch.com"); req2.onload = function () { try { let jsonResponse2 = JSON.parse(this.responseText); console.log(jsonResponse2); let status2 = jsonResponse2["message"]["header"]["status_code"]; - if (status2 === 200) { + if (status2 == 200) { try { let preTrans = [] let u = app.lyrics; @@ -3211,7 +3268,11 @@ const app = new Vue({ } if (track != "" & track != "No Title Found") { - getMXMSubs(track, artist, lang, time, id) + if (app.mxmtoken != null && app.mxmtoken != '') { + getMXMSubs(track, artist, app.mxmtoken, lang, time, id) + } else { + getToken(1, track, artist, '', lang, time); + } } }, loadNeteaseLyrics() { diff --git a/src/renderer/views/components/settings-window.ejs b/src/renderer/views/components/settings-window.ejs index 9b8a0f1e..8f051f1b 100644 --- a/src/renderer/views/components/settings-window.ejs +++ b/src/renderer/views/components/settings-window.ejs @@ -709,15 +709,17 @@ {{$root.getLz('settings.header.lyrics')}}
-
-
- {{$root.getLz('settings.option.lyrics.enableMusixmatch')}} -
-
- - +
+
+
+ {{$root.getLz('settings.option.lyrics.enableMusixmatch')}} +
+
+ + +
diff --git a/src/renderer/views/pages/settings.ejs b/src/renderer/views/pages/settings.ejs index 0db48612..0b9fcbe8 100644 --- a/src/renderer/views/pages/settings.ejs +++ b/src/renderer/views/pages/settings.ejs @@ -614,15 +614,17 @@ {{$root.getLz('settings.header.lyrics')}}
-
-
- {{$root.getLz('settings.option.lyrics.enableMusixmatch')}} -
-
- - +
+
+
+ {{$root.getLz('settings.option.lyrics.enableMusixmatch')}} +
+
+ + +
From 2361cfaebe8cd39473fdd9ace9d2d9fdeecf5600 Mon Sep 17 00:00:00 2001 From: booploops <49113086+booploops@users.noreply.github.com> Date: Thu, 7 Jul 2022 02:03:56 -0700 Subject: [PATCH 02/18] new mediaitem scaling method --- src/renderer/less/elements.less | 127 +++++++++--------- src/renderer/main/vueapp.js | 14 ++ src/renderer/style.less | 1 + .../views/pages/library-recentlyadded.ejs | 6 +- 4 files changed, 84 insertions(+), 64 deletions(-) diff --git a/src/renderer/less/elements.less b/src/renderer/less/elements.less index 1b8026f7..403e38e0 100644 --- a/src/renderer/less/elements.less +++ b/src/renderer/less/elements.less @@ -984,11 +984,11 @@ /* mediaitem-square */ .cd-mediaitem-square { - --transitionDuration: .25s; + --transitionDuration: .5s; --scaleRate: 1.25; --scaleRateArtwork: 1; - width: 200px; - height: 200px; + width: calc(160px * var(--windowRelativeScale)); + height: calc(200px * var(--windowRelativeScale)); display: inline-flex; flex: 0 0 auto; flex-direction: column; @@ -996,14 +996,13 @@ justify-content: center; align-items: center; border-radius: 6px; - transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; .artwork-container { position: relative; .artwork { - height: 150px; - width: 150px; + height: calc(140px * var(--windowRelativeScale)); + width: calc(140px * var(--windowRelativeScale)); background: blue; border-radius: var(--mediaItemRadius); background: var(--artwork); @@ -1011,7 +1010,6 @@ flex: 0 0 auto; margin: 6px; cursor: pointer; - transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; .mediaitem-artwork { box-shadow: unset; @@ -1085,31 +1083,31 @@ } } - &:not(.mediaitem-card):not(.mediaitem-brick):not(.mediaitem-video):not(.noscale) { - @media (min-width: 1460px) { - --scaleRate: 1.1; - --scaleRateArtwork: 0.9; - width: calc(200px * var(--scaleRate)); - height: calc(200px * var(--scaleRate)); + // &:not(.mediaitem-card):not(.mediaitem-brick):not(.mediaitem-video):not(.noscale) { + // @media (min-width: 1460px) { + // --scaleRate: 1.1; + // --scaleRateArtwork: 0.9; + // width: calc(200px * var(--scaleRate)); + // height: calc(200px * var(--scaleRate)); - .artwork-container > .artwork { - width: calc(190px * var(--scaleRateArtwork)); - height: calc(190px * var(--scaleRateArtwork)); - } - } + // .artwork-container > .artwork { + // width: calc(190px * var(--scaleRateArtwork)); + // height: calc(190px * var(--scaleRateArtwork)); + // } + // } - @media (min-width: 1550px) { - --scaleRate: 1.25; - --scaleRateArtwork: 1; - width: calc(200px * var(--scaleRate)); - height: calc(200px * var(--scaleRate)); + // @media (min-width: 1550px) { + // --scaleRate: 1.25; + // --scaleRateArtwork: 1; + // width: calc(200px * var(--scaleRate)); + // height: calc(200px * var(--scaleRate)); - .artwork-container > .artwork { - width: calc(190px * var(--scaleRateArtwork)); - height: calc(190px * var(--scaleRateArtwork)); - } - } - } + // .artwork-container > .artwork { + // width: calc(190px * var(--scaleRateArtwork)); + // height: calc(190px * var(--scaleRateArtwork)); + // } + // } + // } .info-rect { @@ -1161,10 +1159,12 @@ &.mediaitem-video { height: 200px; width: 240px; + transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; .artwork { height: 120px; width: 212px; + transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; } &:not(.noscale) { @@ -1195,48 +1195,52 @@ } &.mediaitem-brick { - height: 200px; - width: 240px; + height: calc(200px, var(--windowRelativeScale)); + width: calc(240px, var(--windowRelativeScale)); + transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; .artwork { - height: 123px; - width: 220px; + height: calc(123px, var(--windowRelativeScale)); + width: calc(220px, var(--windowRelativeScale)); + transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; } - &:not(.noscale) { - @media (min-width: 1460px) { - --scaleRate: 1.1; - --scaleRateArtwork: 1.1; - width: calc(240px * var(--scaleRate)); - height: calc(200px * var(--scaleRate)); + // &:not(.noscale) { + // @media (min-width: 1460px) { + // --scaleRate: 1.1; + // --scaleRateArtwork: 1.1; + // width: calc(240px * var(--scaleRate)); + // height: calc(200px * var(--scaleRate)); - .artwork-container > .artwork { - width: calc(220px * var(--scaleRateArtwork)); - height: calc(123px * var(--scaleRateArtwork)); - } - } + // .artwork-container > .artwork { + // width: calc(220px * var(--scaleRateArtwork)); + // height: calc(123px * var(--scaleRateArtwork)); + // } + // } - @media (min-width: 1550px) { - --scaleRate: 1.25; - --scaleRateArtwork: 1.25; - width: calc(240px * var(--scaleRate)); - height: calc(200px * var(--scaleRate)); + // @media (min-width: 1550px) { + // --scaleRate: 1.25; + // --scaleRateArtwork: 1.25; + // width: calc(240px * var(--scaleRate)); + // height: calc(200px * var(--scaleRate)); - .artwork-container > .artwork { - width: calc(220px * var(--scaleRateArtwork)); - height: calc(123px * var(--scaleRateArtwork)); - } - } - } + // .artwork-container > .artwork { + // width: calc(220px * var(--scaleRateArtwork)); + // height: calc(123px * var(--scaleRateArtwork)); + // } + // } + // } } &.mediaitem-small { - width: 140px; - height: 180px; + width: calc(140px, var(--windowRelativeScale)); + height: calc(180px, var(--windowRelativeScale)); + transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; .artwork { - height: 128px; - width: 128px; + height: calc(128px, var(--windowRelativeScale)); + width: calc(128px, var(--windowRelativeScale)); + transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; } } @@ -1249,6 +1253,7 @@ position: relative; border-radius: calc(var(--mediaItemRadius) * 2); box-shadow: var(--mediaItemShadow-ShadowSubtle); + transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear; .artwork { width: 230px; @@ -1341,7 +1346,7 @@ } &:not(.noscale) { - @media (min-width: 1460px) { + @media (min-width: 1200px) { width: calc(230px * 1.1); height: calc(298px * 1.1); .artwork-container > .artwork { @@ -1350,7 +1355,7 @@ } } - @media (min-width: 1550px) { + @media (min-width: 1400px) { width: calc(230px * 1.25); height: calc(298px * 1.25); .artwork-container > .artwork { diff --git a/src/renderer/main/vueapp.js b/src/renderer/main/vueapp.js index a975a90d..1edc9418 100644 --- a/src/renderer/main/vueapp.js +++ b/src/renderer/main/vueapp.js @@ -706,6 +706,9 @@ const app = new Vue({ } catch (err) { } + // Used to get a scale factor for the window for CSS scaling + window.addEventListener("resize", e => this.setWindowScaleFactor()) + this.setWindowScaleFactor() this.mk._bag.features['seamless-audio-transitions'] = this.cfg.audio.seamless_audio this.mk._bag.features["broadcast-radio"] = true this.mk._services.apiManager.store.storekit._restrictedEnabled = false @@ -1092,6 +1095,17 @@ const app = new Vue({ ipcRenderer.invoke("scanLibrary") }, + setWindowScaleFactor() { + let scale = window.devicePixelRatio * window.innerWidth / 1280 * window.innerHeight / 720 + + if(scale <= 1) { + scale = 1 + }else if(scale >= 1.4) { + scale = 1.4 + } + document.documentElement.style + .setProperty('--windowRelativeScale', scale); + }, showFoo(querySelector, time) { clearTimeout(this.idleTimer); if (this.idleState == true) { diff --git a/src/renderer/style.less b/src/renderer/style.less index a4592068..60619f5b 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -14,6 +14,7 @@ @import url("less/pages.less"); :root { + --windowRelativeScale: 1; --appleEase: cubic-bezier(0.42, 0, 0.58, 1); --borderColor: rgb(200 200 200 / 16%); --mediaItemShadow: inset 0px 0px 0px 1px rgb(200 200 200 / 16%); diff --git a/src/renderer/views/pages/library-recentlyadded.ejs b/src/renderer/views/pages/library-recentlyadded.ejs index 9f5b2151..b65150c9 100644 --- a/src/renderer/views/pages/library-recentlyadded.ejs +++ b/src/renderer/views/pages/library-recentlyadded.ejs @@ -1,13 +1,13 @@ \ No newline at end of file