CHONKY BOY
This commit is contained in:
parent
31ed921a1a
commit
c15f55d0ee
213 changed files with 64188 additions and 55736 deletions
|
@ -1,48 +1,46 @@
|
|||
import { app } from "./vueapp.js"
|
||||
import {CiderCache} from './cidercache.js'
|
||||
import {CiderFrontAPI} from './ciderfrontapi.js'
|
||||
import {simulateGamepad} from './gamepad.js'
|
||||
import {CiderAudio} from '../audio/cideraudio.js'
|
||||
import {Events} from './events.js'
|
||||
import { wsapi } from "./wsapi_interop.js"
|
||||
import { MusicKitTools } from "./musickittools.js"
|
||||
import { spawnMica } from "./mica.js"
|
||||
import { svgIcon } from './components/svg-icon.js'
|
||||
import { sidebarLibraryItem } from './components/sidebar-library-item.js'
|
||||
|
||||
import { app } from "./vueapp.js";
|
||||
import { CiderCache } from "./cidercache.js";
|
||||
import { CiderFrontAPI } from "./ciderfrontapi.js";
|
||||
import { simulateGamepad } from "./gamepad.js";
|
||||
import { CiderAudio } from "../audio/cideraudio.js";
|
||||
import { Events } from "./events.js";
|
||||
import { wsapi } from "./wsapi_interop.js";
|
||||
import { MusicKitTools } from "./musickittools.js";
|
||||
import { spawnMica } from "./mica.js";
|
||||
import { svgIcon } from "./components/svg-icon.js";
|
||||
import { sidebarLibraryItem } from "./components/sidebar-library-item.js";
|
||||
|
||||
// Define window objects
|
||||
window.app = app
|
||||
window.MusicKitTools = MusicKitTools
|
||||
window.CiderAudio = CiderAudio
|
||||
window.CiderCache = CiderCache
|
||||
window.CiderFrontAPI = CiderFrontAPI
|
||||
window.wsapi = wsapi
|
||||
window.app = app;
|
||||
window.MusicKitTools = MusicKitTools;
|
||||
window.CiderAudio = CiderAudio;
|
||||
window.CiderCache = CiderCache;
|
||||
window.CiderFrontAPI = CiderFrontAPI;
|
||||
window.wsapi = wsapi;
|
||||
|
||||
if (app.cfg.advanced.disableLogging === true) {
|
||||
window.console = {
|
||||
log: function() {},
|
||||
error: function() {},
|
||||
warn: function() {},
|
||||
assert: function() {},
|
||||
debug: function() {}
|
||||
}
|
||||
window.console = {
|
||||
log: function () {},
|
||||
error: function () {},
|
||||
warn: function () {},
|
||||
assert: function () {},
|
||||
debug: function () {},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// Mount Vue to #app
|
||||
app.$mount("#app")
|
||||
app.$mount("#app");
|
||||
|
||||
// Init CiderAudio and force audiocontext
|
||||
if (app.cfg.advanced.AudioContext != true) {
|
||||
app.cfg.advanced.AudioContext = true;
|
||||
window.location.reload();
|
||||
app.cfg.advanced.AudioContext = true;
|
||||
window.location.reload();
|
||||
}
|
||||
|
||||
CiderAudio.init()
|
||||
CiderAudio.init();
|
||||
|
||||
// Import gamepad support
|
||||
app.simulateGamepad = simulateGamepad
|
||||
app.spawnMica = spawnMica
|
||||
app.simulateGamepad = simulateGamepad;
|
||||
app.spawnMica = spawnMica;
|
||||
|
||||
Events.InitEvents()
|
||||
Events.InitEvents();
|
||||
|
|
|
@ -1,24 +1,24 @@
|
|||
const CiderCache = {
|
||||
async getCache(file) {
|
||||
let cache = await ipcRenderer.sendSync("get-cache", file)
|
||||
if (isJson(cache)) {
|
||||
cache = JSON.parse(cache)
|
||||
if (Object.keys(cache).length === 0) {
|
||||
cache = false
|
||||
}
|
||||
} else {
|
||||
cache = false
|
||||
}
|
||||
return cache
|
||||
},
|
||||
async putCache(file, data) {
|
||||
console.log(`Caching ${file}`)
|
||||
ipcRenderer.invoke("put-cache", {
|
||||
file: file,
|
||||
data: JSON.stringify(data)
|
||||
})
|
||||
return true
|
||||
async getCache(file) {
|
||||
let cache = await ipcRenderer.sendSync("get-cache", file);
|
||||
if (isJson(cache)) {
|
||||
cache = JSON.parse(cache);
|
||||
if (Object.keys(cache).length === 0) {
|
||||
cache = false;
|
||||
}
|
||||
} else {
|
||||
cache = false;
|
||||
}
|
||||
}
|
||||
return cache;
|
||||
},
|
||||
async putCache(file, data) {
|
||||
console.log(`Caching ${file}`);
|
||||
ipcRenderer.invoke("put-cache", {
|
||||
file: file,
|
||||
data: JSON.stringify(data),
|
||||
});
|
||||
return true;
|
||||
},
|
||||
};
|
||||
|
||||
export {CiderCache}
|
||||
export { CiderCache };
|
||||
|
|
|
@ -1,32 +1,31 @@
|
|||
const CiderFrontAPI = {
|
||||
Objects: {
|
||||
MenuEntry: function () {
|
||||
this.id = ""
|
||||
this.name = ""
|
||||
this.onClick = () => {
|
||||
}
|
||||
}
|
||||
Objects: {
|
||||
MenuEntry: function () {
|
||||
this.id = "";
|
||||
this.name = "";
|
||||
this.onClick = () => {};
|
||||
},
|
||||
AddMenuEntry(entry) {
|
||||
app.pluginMenuEntries.push(entry)
|
||||
app.pluginInstalled = true
|
||||
},
|
||||
AddMenuEntry(entry) {
|
||||
app.pluginMenuEntries.push(entry);
|
||||
app.pluginInstalled = true;
|
||||
},
|
||||
StyleSheets: {
|
||||
Add(href) {
|
||||
console.log("Adding stylesheet: " + href);
|
||||
let id = uuidv4();
|
||||
let link = document.createElement("link");
|
||||
link.rel = "stylesheet/less";
|
||||
link.type = "text/css";
|
||||
link.href = href;
|
||||
link.setAttribute("css-id", id);
|
||||
// insert the link before document.querySelector("#userTheme") in head
|
||||
document.querySelector("head").insertBefore(link, document.querySelector("#userTheme"));
|
||||
less.registerStylesheetsImmediately();
|
||||
less.refresh(true, true, true);
|
||||
return link;
|
||||
},
|
||||
StyleSheets: {
|
||||
Add(href) {
|
||||
console.log("Adding stylesheet: " + href)
|
||||
let id = uuidv4()
|
||||
let link = document.createElement("link")
|
||||
link.rel = "stylesheet/less"
|
||||
link.type = "text/css"
|
||||
link.href = href
|
||||
link.setAttribute("css-id", id)
|
||||
// insert the link before document.querySelector("#userTheme") in head
|
||||
document.querySelector("head").insertBefore(link, document.querySelector("#userTheme"))
|
||||
less.registerStylesheetsImmediately()
|
||||
less.refresh(true, true, true)
|
||||
return link
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export {CiderFrontAPI}
|
||||
export { CiderFrontAPI };
|
||||
|
|
|
@ -1,46 +1,45 @@
|
|||
import {html} from "../html.js"
|
||||
import { html } from "../html.js";
|
||||
|
||||
export const sidebarLibraryItem = Vue.component("sidebar-library-item", {
|
||||
template: html`
|
||||
<button class="app-sidebar-item"
|
||||
:class="$root.getSidebarItemClass(page)" @click="$root.setWindowHash(page)">
|
||||
<svg-icon :url="svgIconData" :name="'sidebar-' + svgIconName" v-if="svgIconData != ''"/>
|
||||
<span class="sidebar-item-text">{{ name }}</span>
|
||||
</button>
|
||||
`,
|
||||
props: {
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
page: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
svgIcon: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: "",
|
||||
},
|
||||
svgIconName: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
cdClick: {
|
||||
type: Function,
|
||||
required: false,
|
||||
},
|
||||
template: html`
|
||||
<button class="app-sidebar-item" :class="$root.getSidebarItemClass(page)" @click="$root.setWindowHash(page)">
|
||||
<svg-icon :url="svgIconData" :name="'sidebar-' + svgIconName" v-if="svgIconData != ''" />
|
||||
<span class="sidebar-item-text">{{ name }}</span>
|
||||
</button>
|
||||
`,
|
||||
props: {
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
data: function () {
|
||||
return {
|
||||
app: app,
|
||||
svgIconData: "",
|
||||
};
|
||||
page: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
async mounted() {
|
||||
if (this.svgIcon) {
|
||||
this.svgIconData = this.svgIcon;
|
||||
}
|
||||
svgIcon: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: "",
|
||||
},
|
||||
methods: {},
|
||||
})
|
||||
svgIconName: {
|
||||
type: String,
|
||||
required: false,
|
||||
},
|
||||
cdClick: {
|
||||
type: Function,
|
||||
required: false,
|
||||
},
|
||||
},
|
||||
data: function () {
|
||||
return {
|
||||
app: app,
|
||||
svgIconData: "",
|
||||
};
|
||||
},
|
||||
async mounted() {
|
||||
if (this.svgIcon) {
|
||||
this.svgIconData = this.svgIcon;
|
||||
}
|
||||
},
|
||||
methods: {},
|
||||
});
|
||||
|
|
|
@ -1,22 +1,20 @@
|
|||
import {html} from "../html.js"
|
||||
import { html } from "../html.js";
|
||||
|
||||
export const svgIcon = Vue.component("svg-icon", {
|
||||
template: html`
|
||||
<div class="_svg-icon" :class="classes" :svg-name="name" :style="{'--icon': 'url(' + url + ')'}"></div>
|
||||
`,
|
||||
props: {
|
||||
name: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
classes: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
url: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "./assets/repeat.svg"
|
||||
}
|
||||
}
|
||||
})
|
||||
template: html` <div class="_svg-icon" :class="classes" :svg-name="name" :style="{'--icon': 'url(' + url + ')'}"></div> `,
|
||||
props: {
|
||||
name: {
|
||||
type: String,
|
||||
required: false,
|
||||
},
|
||||
classes: {
|
||||
type: String,
|
||||
required: false,
|
||||
},
|
||||
url: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "./assets/repeat.svg",
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
|
@ -1,98 +1,94 @@
|
|||
const Events = {
|
||||
InitEvents() {
|
||||
const app = window.app
|
||||
InitEvents() {
|
||||
const app = window.app;
|
||||
|
||||
// add event listener for when window.location.hash changes
|
||||
window.addEventListener("hashchange", function () {
|
||||
app.page = "blank"
|
||||
setTimeout(()=>{
|
||||
app.appRoute(window.location.hash)
|
||||
}, 100)
|
||||
// add event listener for when window.location.hash changes
|
||||
window.addEventListener("hashchange", function () {
|
||||
app.page = "blank";
|
||||
setTimeout(() => {
|
||||
app.appRoute(window.location.hash);
|
||||
}, 100);
|
||||
});
|
||||
|
||||
window.addEventListener("mouseup", (e) => {
|
||||
if (e.button === 3) {
|
||||
e.preventDefault();
|
||||
app.navigateBack();
|
||||
} else if (e.button === 4) {
|
||||
e.preventDefault();
|
||||
app.navigateForward();
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener("keydown", async function (event) {
|
||||
// CTRL + R
|
||||
if (event.keyCode === 82 && event.ctrlKey) {
|
||||
event.preventDefault();
|
||||
app.confirm(app.getLz("term.reload"), (res) => {
|
||||
if (res) {
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener("mouseup", (e) => {
|
||||
if (e.button === 3) {
|
||||
e.preventDefault()
|
||||
app.navigateBack()
|
||||
} else if (e.button === 4) {
|
||||
e.preventDefault()
|
||||
app.navigateForward()
|
||||
}
|
||||
}
|
||||
// CTRL + SHIFT + R
|
||||
if (event.keyCode === 82 && event.ctrlKey && event.shiftKey) {
|
||||
event.preventDefault();
|
||||
window.location.reload();
|
||||
}
|
||||
// CTRL + E
|
||||
if (event.keyCode === 69 && event.ctrlKey) {
|
||||
app.invokeDrawer("queue");
|
||||
}
|
||||
// CTRL+H
|
||||
if (event.keyCode === 72 && event.ctrlKey) {
|
||||
app.appRoute("home");
|
||||
}
|
||||
// CTRL+SHIFT+H
|
||||
if (event.ctrlKey && event.shiftKey && event.keyCode == 72) {
|
||||
let hist = await app.mk.api.v3.music(`/v1/me/recent/played/tracks`, {
|
||||
l: app.mklang,
|
||||
});
|
||||
app.showCollection(hist.data, app.getLz("term.history"));
|
||||
}
|
||||
if (event.ctrlKey && event.keyCode == 121) {
|
||||
try {
|
||||
app.mk._services.mediaItemPlayback._currentPlayer.stop();
|
||||
} catch (e) {}
|
||||
try {
|
||||
app.mk._services.mediaItemPlayback._currentPlayer.destroy();
|
||||
} catch (e) {}
|
||||
}
|
||||
if (event.ctrlKey && event.keyCode == 122) {
|
||||
try {
|
||||
ipcRenderer.send("detachDT", "");
|
||||
} catch (e) {}
|
||||
}
|
||||
// Prevent Scrolling on spacebar
|
||||
if (event.keyCode === 32 && event.target === document.body) {
|
||||
event.preventDefault();
|
||||
app.SpacePause();
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', async function (event) {
|
||||
// CTRL + R
|
||||
if (event.keyCode === 82 && event.ctrlKey) {
|
||||
event.preventDefault()
|
||||
app.confirm(app.getLz('term.reload'), (res)=>{
|
||||
if (res) {
|
||||
window.location.reload()
|
||||
}
|
||||
})
|
||||
}
|
||||
// CTRL + SHIFT + R
|
||||
if (event.keyCode === 82 && event.ctrlKey && event.shiftKey) {
|
||||
event.preventDefault()
|
||||
window.location.reload()
|
||||
}
|
||||
// CTRL + E
|
||||
if (event.keyCode === 69 && event.ctrlKey) {
|
||||
app.invokeDrawer('queue')
|
||||
}
|
||||
// CTRL+H
|
||||
if (event.keyCode === 72 && event.ctrlKey) {
|
||||
app.appRoute("home")
|
||||
}
|
||||
// CTRL+SHIFT+H
|
||||
if (event.ctrlKey && event.shiftKey && event.keyCode == 72) {
|
||||
let hist = await app.mk.api.v3.music(`/v1/me/recent/played/tracks`, {
|
||||
l: app.mklang
|
||||
})
|
||||
app.showCollection(hist.data, app.getLz('term.history'))
|
||||
}
|
||||
if (event.ctrlKey && event.keyCode == 121) {
|
||||
try {
|
||||
app.mk._services.mediaItemPlayback._currentPlayer.stop()
|
||||
} catch (e) {
|
||||
}
|
||||
try {
|
||||
app.mk._services.mediaItemPlayback._currentPlayer.destroy()
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
if (event.ctrlKey && event.keyCode == 122) {
|
||||
try {
|
||||
ipcRenderer.send('detachDT', '')
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
// Prevent Scrolling on spacebar
|
||||
if (event.keyCode === 32 && event.target === document.body) {
|
||||
event.preventDefault()
|
||||
app.SpacePause()
|
||||
// Hang Timer
|
||||
app.hangtimer = setTimeout(() => {
|
||||
if (confirm("Cider is not responding. Reload the app?")) {
|
||||
window.location.reload();
|
||||
}
|
||||
}, 10000);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
// Hang Timer
|
||||
app.hangtimer = setTimeout(() => {
|
||||
if (confirm("Cider is not responding. Reload the app?")) {
|
||||
window.location.reload()
|
||||
}
|
||||
}, 10000)
|
||||
|
||||
// Refresh Focus
|
||||
function refreshFocus() {
|
||||
if (document.hasFocus() == false) {
|
||||
app.windowFocus(false)
|
||||
} else {
|
||||
app.windowFocus(true)
|
||||
}
|
||||
setTimeout(refreshFocus, 200);
|
||||
}
|
||||
|
||||
refreshFocus();
|
||||
// Refresh Focus
|
||||
function refreshFocus() {
|
||||
if (document.hasFocus() == false) {
|
||||
app.windowFocus(false);
|
||||
} else {
|
||||
app.windowFocus(true);
|
||||
}
|
||||
setTimeout(refreshFocus, 200);
|
||||
}
|
||||
}
|
||||
|
||||
export {Events}
|
||||
refreshFocus();
|
||||
},
|
||||
};
|
||||
|
||||
export { Events };
|
||||
|
|
|
@ -1,327 +1,313 @@
|
|||
function simulateGamepad () {
|
||||
const app = window.app
|
||||
app.chrome.showCursor = true
|
||||
let cursorPos = [0, 0];
|
||||
let intTabIndex = 0
|
||||
const cursorSpeedPvt = 8
|
||||
const cursorSize = 16
|
||||
let scrollSpeed = 8
|
||||
let buttonPressDelay = 500
|
||||
let stickDeadZone = 0.2
|
||||
let scrollGroup = null
|
||||
let scrollGroupY = null
|
||||
let elementFocusEnabled = true
|
||||
let start;
|
||||
function simulateGamepad() {
|
||||
const app = window.app;
|
||||
app.chrome.showCursor = true;
|
||||
let cursorPos = [0, 0];
|
||||
let intTabIndex = 0;
|
||||
const cursorSpeedPvt = 8;
|
||||
const cursorSize = 16;
|
||||
let scrollSpeed = 8;
|
||||
let buttonPressDelay = 500;
|
||||
let stickDeadZone = 0.2;
|
||||
let scrollGroup = null;
|
||||
let scrollGroupY = null;
|
||||
let elementFocusEnabled = true;
|
||||
let start;
|
||||
|
||||
let cursorSpeed = cursorSpeedPvt
|
||||
let cursorSpeed = cursorSpeedPvt;
|
||||
|
||||
let lastButtonPress = {
|
||||
let lastButtonPress = {};
|
||||
|
||||
var sounds = {
|
||||
Confirm: new Audio("./sounds/confirm.ogg"),
|
||||
Menu: new Audio("./sounds/btn1.ogg"),
|
||||
Hover: new Audio("./sounds/hover.ogg"),
|
||||
};
|
||||
|
||||
let element = document.elementFromPoint(0, 0);
|
||||
let elementType = 0;
|
||||
|
||||
function appLoop() {
|
||||
var gamepads = navigator.getGamepads ? navigator.getGamepads() : navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : [];
|
||||
if (!gamepads) {
|
||||
return;
|
||||
}
|
||||
|
||||
var sounds = {
|
||||
Confirm: new Audio("./sounds/confirm.ogg"),
|
||||
Menu: new Audio("./sounds/btn1.ogg"),
|
||||
Hover: new Audio("./sounds/hover.ogg")
|
||||
var gp = gamepads[0];
|
||||
|
||||
// LEFT STICK
|
||||
if (gp.axes[0] > stickDeadZone) {
|
||||
cursorPos[0] += gp.axes[0] * cursorSpeed;
|
||||
} else if (gp.axes[0] < -stickDeadZone) {
|
||||
cursorPos[0] += gp.axes[0] * cursorSpeed;
|
||||
}
|
||||
|
||||
let element = document.elementFromPoint(0, 0)
|
||||
let elementType = 0
|
||||
|
||||
function appLoop() {
|
||||
var gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);
|
||||
if (!gamepads) {
|
||||
return;
|
||||
}
|
||||
|
||||
var gp = gamepads[0];
|
||||
|
||||
// LEFT STICK
|
||||
if (gp.axes[0] > stickDeadZone) {
|
||||
cursorPos[0] += (gp.axes[0] * cursorSpeed)
|
||||
} else if (gp.axes[0] < -stickDeadZone) {
|
||||
cursorPos[0] += (gp.axes[0] * cursorSpeed)
|
||||
}
|
||||
|
||||
if (gp.axes[1] > stickDeadZone) {
|
||||
cursorPos[1] += (gp.axes[1] * cursorSpeed)
|
||||
} else if (gp.axes[1] < -stickDeadZone) {
|
||||
cursorPos[1] += (gp.axes[1] * cursorSpeed)
|
||||
}
|
||||
|
||||
if (cursorPos[0] < cursorSize) {
|
||||
cursorPos[0] = cursorSize
|
||||
}
|
||||
if (cursorPos[1] < cursorSize) {
|
||||
cursorPos[1] = cursorSize
|
||||
}
|
||||
if (cursorPos[0] > window.innerWidth - cursorSize) {
|
||||
cursorPos[0] = window.innerWidth - cursorSize
|
||||
}
|
||||
if (cursorPos[1] > window.innerHeight - cursorSize) {
|
||||
cursorPos[1] = window.innerHeight - cursorSize
|
||||
}
|
||||
|
||||
|
||||
// RIGHT STICK.
|
||||
if (scrollGroupY) {
|
||||
if (gp.axes[3] > stickDeadZone) {
|
||||
$(scrollGroupY).scrollTop($(scrollGroupY).scrollTop() + (gp.axes[3] * scrollSpeed))
|
||||
elementFocusEnabled = false
|
||||
} else if (gp.axes[3] < -stickDeadZone) {
|
||||
$(scrollGroupY).scrollTop($(scrollGroupY).scrollTop() + (gp.axes[3] * scrollSpeed))
|
||||
elementFocusEnabled = false
|
||||
} else {
|
||||
elementFocusEnabled = true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (scrollGroup) {
|
||||
if (gp.axes[2] > stickDeadZone) {
|
||||
$(scrollGroup).scrollLeft($(scrollGroup).scrollLeft() + (gp.axes[2] * scrollSpeed))
|
||||
elementFocusEnabled = false
|
||||
} else if (gp.axes[2] < -stickDeadZone) {
|
||||
$(scrollGroup).scrollLeft($(scrollGroup).scrollLeft() + (gp.axes[2] * scrollSpeed))
|
||||
elementFocusEnabled = false
|
||||
} else {
|
||||
elementFocusEnabled = true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$(".cursor").css({
|
||||
top: cursorPos[1] + "px",
|
||||
left: cursorPos[0] + "px",
|
||||
display: "block"
|
||||
})
|
||||
|
||||
// A BUTTON
|
||||
if (gp.buttons[0].pressed) {
|
||||
if (!lastButtonPress["A"]) {
|
||||
lastButtonPress["A"] = 0
|
||||
}
|
||||
if (Date.now() - lastButtonPress["A"] > buttonPressDelay) {
|
||||
lastButtonPress["A"] = Date.now()
|
||||
sounds.Confirm.play()
|
||||
if (elementType == 0) {
|
||||
document.activeElement.dispatchEvent(new Event("click"))
|
||||
document.activeElement.dispatchEvent(new Event("controller-click"))
|
||||
} else {
|
||||
element.dispatchEvent(new Event("click"))
|
||||
element.dispatchEvent(new Event("controller-click"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// B BUTTON
|
||||
if (gp.buttons[1].pressed) {
|
||||
|
||||
if (!lastButtonPress["B"]) {
|
||||
lastButtonPress["B"] = 0
|
||||
}
|
||||
if (Date.now() - lastButtonPress["B"] > buttonPressDelay) {
|
||||
lastButtonPress["B"] = Date.now()
|
||||
if (elementType == 0) {
|
||||
document.activeElement.dispatchEvent(new Event("contextmenu"))
|
||||
setTimeout(() => {
|
||||
if ($(".menu-option").length > 0) {
|
||||
let bounds = $(".menu-option")[0].getBoundingClientRect()
|
||||
cursorPos[0] = bounds.left + (bounds.width / 2)
|
||||
cursorPos[1] = bounds.top + (bounds.height / 2)
|
||||
}
|
||||
}, 100)
|
||||
} else {
|
||||
element.dispatchEvent(new Event("contextmenu"))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// right bumper
|
||||
if (gp.buttons[5].pressed) {
|
||||
if (!lastButtonPress["RB"]) {
|
||||
lastButtonPress["RB"] = 0
|
||||
}
|
||||
if (Date.now() - lastButtonPress["RB"] > buttonPressDelay) {
|
||||
lastButtonPress["RB"] = Date.now()
|
||||
app.navigateForward()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// left bumper
|
||||
if (gp.buttons[4].pressed) {
|
||||
if (!lastButtonPress["LB"]) {
|
||||
lastButtonPress["LB"] = 0
|
||||
}
|
||||
if (Date.now() - lastButtonPress["LB"] > buttonPressDelay) {
|
||||
lastButtonPress["LB"] = Date.now()
|
||||
app.navigateBack()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// cursor hover
|
||||
if (elementFocusEnabled) {
|
||||
element = document.elementFromPoint(cursorPos[0], cursorPos[1])
|
||||
}
|
||||
|
||||
if (element) {
|
||||
|
||||
let closest = element.closest("[tabindex], input, button, a")
|
||||
|
||||
// VERT SCROLL
|
||||
let scrollGroupCloY = element.closest(`[scrollaxis="y"]`)
|
||||
if (scrollGroupCloY) {
|
||||
scrollGroupY = scrollGroupCloY
|
||||
}
|
||||
|
||||
|
||||
// HOZ SCROLL
|
||||
let scrollGroupClo = element.closest(".v-hl-container")
|
||||
|
||||
if (scrollGroupClo) {
|
||||
if (scrollGroupClo.classList.contains("v-hl-container")) {
|
||||
scrollGroup = scrollGroupClo
|
||||
scrollGroup.style["scroll-snap-type"] = "unset"
|
||||
} else {
|
||||
scrollGroup.style["scroll-snap-type"] = ""
|
||||
scrollGroup = null
|
||||
}
|
||||
}
|
||||
|
||||
if (closest) {
|
||||
elementType = 0
|
||||
closest.focus()
|
||||
} else {
|
||||
if (closest) {
|
||||
closest.blur()
|
||||
}
|
||||
elementType = 1
|
||||
element.focus()
|
||||
}
|
||||
cursorSpeed = cursorSpeedPvt
|
||||
if (!element.classList.contains("app-chrome")
|
||||
&& !element.classList.contains("app-content")) {
|
||||
cursorSpeed = cursorSpeedPvt
|
||||
}
|
||||
// console.log($._data($(element), "events"))
|
||||
} else {
|
||||
cursorSpeed = 12
|
||||
}
|
||||
// console.log(gp.axes[0], gp.axes[1])
|
||||
start = requestAnimationFrame(appLoop);
|
||||
if (gp.axes[1] > stickDeadZone) {
|
||||
cursorPos[1] += gp.axes[1] * cursorSpeed;
|
||||
} else if (gp.axes[1] < -stickDeadZone) {
|
||||
cursorPos[1] += gp.axes[1] * cursorSpeed;
|
||||
}
|
||||
|
||||
// controller pairing
|
||||
notyf.error("Press the button on your controller to pair it to Cider.")
|
||||
window.addEventListener("gamepadconnected", function (e) {
|
||||
console.log("Gamepad connected at index %d: %s. %d buttons, %d axes.",
|
||||
e.gamepad.index, e.gamepad.id,
|
||||
e.gamepad.buttons.length, e.gamepad.axes.length);
|
||||
notyf.success("Pairing successful!")
|
||||
appLoop()
|
||||
}, { once: true });
|
||||
if (cursorPos[0] < cursorSize) {
|
||||
cursorPos[0] = cursorSize;
|
||||
}
|
||||
if (cursorPos[1] < cursorSize) {
|
||||
cursorPos[1] = cursorSize;
|
||||
}
|
||||
if (cursorPos[0] > window.innerWidth - cursorSize) {
|
||||
cursorPos[0] = window.innerWidth - cursorSize;
|
||||
}
|
||||
if (cursorPos[1] > window.innerHeight - cursorSize) {
|
||||
cursorPos[1] = window.innerHeight - cursorSize;
|
||||
}
|
||||
|
||||
document.addEventListener("keydown", (e) => {
|
||||
sounds.Confirm.currentTime = 0
|
||||
sounds.Menu.currentTime = 0
|
||||
sounds.Hover.currentTime = 0
|
||||
let tabbable = $("[tabindex]")
|
||||
console.log(e.key)
|
||||
switch (e.key) {
|
||||
default:
|
||||
break;
|
||||
case "ArrowLeft":
|
||||
e.preventDefault()
|
||||
// RIGHT STICK.
|
||||
if (scrollGroupY) {
|
||||
if (gp.axes[3] > stickDeadZone) {
|
||||
$(scrollGroupY).scrollTop($(scrollGroupY).scrollTop() + gp.axes[3] * scrollSpeed);
|
||||
elementFocusEnabled = false;
|
||||
} else if (gp.axes[3] < -stickDeadZone) {
|
||||
$(scrollGroupY).scrollTop($(scrollGroupY).scrollTop() + gp.axes[3] * scrollSpeed);
|
||||
elementFocusEnabled = false;
|
||||
} else {
|
||||
elementFocusEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
cursorPos[0] -= cursorSpeed
|
||||
break;
|
||||
case "ArrowRight":
|
||||
e.preventDefault()
|
||||
if (scrollGroup) {
|
||||
if (gp.axes[2] > stickDeadZone) {
|
||||
$(scrollGroup).scrollLeft($(scrollGroup).scrollLeft() + gp.axes[2] * scrollSpeed);
|
||||
elementFocusEnabled = false;
|
||||
} else if (gp.axes[2] < -stickDeadZone) {
|
||||
$(scrollGroup).scrollLeft($(scrollGroup).scrollLeft() + gp.axes[2] * scrollSpeed);
|
||||
elementFocusEnabled = false;
|
||||
} else {
|
||||
elementFocusEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
cursorPos[0] += cursorSpeed
|
||||
break;
|
||||
case "ArrowUp":
|
||||
e.preventDefault()
|
||||
|
||||
cursorPos[1] -= cursorSpeed
|
||||
// sounds.Hover.play()
|
||||
// if (intTabIndex <= 0) {
|
||||
// intTabIndex = 0
|
||||
// } else {
|
||||
// intTabIndex--
|
||||
// }
|
||||
// $(tabbable[intTabIndex]).focus()
|
||||
// $("#app-content").scrollTop($(document.activeElement).offset().top)
|
||||
break;
|
||||
case "ArrowDown":
|
||||
e.preventDefault()
|
||||
|
||||
cursorPos[1] += cursorSpeed
|
||||
// if (intTabIndex < tabbable.length) {
|
||||
// intTabIndex++
|
||||
// } else {
|
||||
// intTabIndex = tabbable.length
|
||||
// }
|
||||
// $(tabbable[intTabIndex]).focus()
|
||||
// $("#app-content").scrollTop($(document.activeElement).offset().top)
|
||||
break;
|
||||
case "c":
|
||||
app.resetState()
|
||||
break;
|
||||
case "x":
|
||||
// set cursorPos to the top right of the screen
|
||||
// sounds.Menu.play()
|
||||
if (elementType == 0) {
|
||||
document.activeElement.dispatchEvent(new Event("contextmenu"))
|
||||
} else {
|
||||
element.dispatchEvent(new Event("contextmenu"))
|
||||
}
|
||||
|
||||
e.preventDefault()
|
||||
break;
|
||||
case "z":
|
||||
sounds.Confirm.play()
|
||||
if (elementType == 0) {
|
||||
document.activeElement.dispatchEvent(new Event("click"))
|
||||
document.activeElement.dispatchEvent(new Event("controller-click"))
|
||||
} else {
|
||||
element.dispatchEvent(new Event("click"))
|
||||
element.dispatchEvent(new Event("controller-click"))
|
||||
}
|
||||
|
||||
e.preventDefault()
|
||||
break;
|
||||
}
|
||||
|
||||
$(".cursor").css({
|
||||
top: cursorPos[1] + "px",
|
||||
left: cursorPos[0] + "px"
|
||||
})
|
||||
function lerp(a, b, n) {
|
||||
return (1 - n) * a + n * b
|
||||
}
|
||||
|
||||
|
||||
element = document.elementFromPoint(cursorPos[0], cursorPos[1])
|
||||
|
||||
if (element) {
|
||||
let closest = element.closest("[tabindex], input, button, a")
|
||||
if (closest) {
|
||||
elementType = 0
|
||||
closest.focus()
|
||||
} else {
|
||||
elementType = 1
|
||||
element.focus()
|
||||
}
|
||||
}
|
||||
console.log(element)
|
||||
$(".cursor").css({
|
||||
top: cursorPos[1] + "px",
|
||||
left: cursorPos[0] + "px",
|
||||
display: "block",
|
||||
});
|
||||
|
||||
// A BUTTON
|
||||
if (gp.buttons[0].pressed) {
|
||||
if (!lastButtonPress["A"]) {
|
||||
lastButtonPress["A"] = 0;
|
||||
}
|
||||
if (Date.now() - lastButtonPress["A"] > buttonPressDelay) {
|
||||
lastButtonPress["A"] = Date.now();
|
||||
sounds.Confirm.play();
|
||||
if (elementType == 0) {
|
||||
document.activeElement.dispatchEvent(new Event("click"));
|
||||
document.activeElement.dispatchEvent(new Event("controller-click"));
|
||||
} else {
|
||||
element.dispatchEvent(new Event("click"));
|
||||
element.dispatchEvent(new Event("controller-click"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// B BUTTON
|
||||
if (gp.buttons[1].pressed) {
|
||||
if (!lastButtonPress["B"]) {
|
||||
lastButtonPress["B"] = 0;
|
||||
}
|
||||
if (Date.now() - lastButtonPress["B"] > buttonPressDelay) {
|
||||
lastButtonPress["B"] = Date.now();
|
||||
if (elementType == 0) {
|
||||
document.activeElement.dispatchEvent(new Event("contextmenu"));
|
||||
setTimeout(() => {
|
||||
if ($(".menu-option").length > 0) {
|
||||
let bounds = $(".menu-option")[0].getBoundingClientRect();
|
||||
cursorPos[0] = bounds.left + bounds.width / 2;
|
||||
cursorPos[1] = bounds.top + bounds.height / 2;
|
||||
}
|
||||
}, 100);
|
||||
} else {
|
||||
element.dispatchEvent(new Event("contextmenu"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// right bumper
|
||||
if (gp.buttons[5].pressed) {
|
||||
if (!lastButtonPress["RB"]) {
|
||||
lastButtonPress["RB"] = 0;
|
||||
}
|
||||
if (Date.now() - lastButtonPress["RB"] > buttonPressDelay) {
|
||||
lastButtonPress["RB"] = Date.now();
|
||||
app.navigateForward();
|
||||
}
|
||||
}
|
||||
|
||||
// left bumper
|
||||
if (gp.buttons[4].pressed) {
|
||||
if (!lastButtonPress["LB"]) {
|
||||
lastButtonPress["LB"] = 0;
|
||||
}
|
||||
if (Date.now() - lastButtonPress["LB"] > buttonPressDelay) {
|
||||
lastButtonPress["LB"] = Date.now();
|
||||
app.navigateBack();
|
||||
}
|
||||
}
|
||||
|
||||
// cursor hover
|
||||
if (elementFocusEnabled) {
|
||||
element = document.elementFromPoint(cursorPos[0], cursorPos[1]);
|
||||
}
|
||||
|
||||
if (element) {
|
||||
let closest = element.closest("[tabindex], input, button, a");
|
||||
|
||||
// VERT SCROLL
|
||||
let scrollGroupCloY = element.closest(`[scrollaxis="y"]`);
|
||||
if (scrollGroupCloY) {
|
||||
scrollGroupY = scrollGroupCloY;
|
||||
}
|
||||
|
||||
// HOZ SCROLL
|
||||
let scrollGroupClo = element.closest(".v-hl-container");
|
||||
|
||||
if (scrollGroupClo) {
|
||||
if (scrollGroupClo.classList.contains("v-hl-container")) {
|
||||
scrollGroup = scrollGroupClo;
|
||||
scrollGroup.style["scroll-snap-type"] = "unset";
|
||||
} else {
|
||||
scrollGroup.style["scroll-snap-type"] = "";
|
||||
scrollGroup = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (closest) {
|
||||
elementType = 0;
|
||||
closest.focus();
|
||||
} else {
|
||||
if (closest) {
|
||||
closest.blur();
|
||||
}
|
||||
elementType = 1;
|
||||
element.focus();
|
||||
}
|
||||
cursorSpeed = cursorSpeedPvt;
|
||||
if (!element.classList.contains("app-chrome") && !element.classList.contains("app-content")) {
|
||||
cursorSpeed = cursorSpeedPvt;
|
||||
}
|
||||
// console.log($._data($(element), "events"))
|
||||
} else {
|
||||
cursorSpeed = 12;
|
||||
}
|
||||
// console.log(gp.axes[0], gp.axes[1])
|
||||
start = requestAnimationFrame(appLoop);
|
||||
}
|
||||
|
||||
// controller pairing
|
||||
notyf.error("Press the button on your controller to pair it to Cider.");
|
||||
window.addEventListener(
|
||||
"gamepadconnected",
|
||||
function (e) {
|
||||
console.log("Gamepad connected at index %d: %s. %d buttons, %d axes.", e.gamepad.index, e.gamepad.id, e.gamepad.buttons.length, e.gamepad.axes.length);
|
||||
notyf.success("Pairing successful!");
|
||||
appLoop();
|
||||
},
|
||||
{ once: true }
|
||||
);
|
||||
|
||||
document.addEventListener("keydown", (e) => {
|
||||
sounds.Confirm.currentTime = 0;
|
||||
sounds.Menu.currentTime = 0;
|
||||
sounds.Hover.currentTime = 0;
|
||||
let tabbable = $("[tabindex]");
|
||||
console.log(e.key);
|
||||
switch (e.key) {
|
||||
default:
|
||||
break;
|
||||
case "ArrowLeft":
|
||||
e.preventDefault();
|
||||
|
||||
cursorPos[0] -= cursorSpeed;
|
||||
break;
|
||||
case "ArrowRight":
|
||||
e.preventDefault();
|
||||
|
||||
cursorPos[0] += cursorSpeed;
|
||||
break;
|
||||
case "ArrowUp":
|
||||
e.preventDefault();
|
||||
|
||||
cursorPos[1] -= cursorSpeed;
|
||||
// sounds.Hover.play()
|
||||
// if (intTabIndex <= 0) {
|
||||
// intTabIndex = 0
|
||||
// } else {
|
||||
// intTabIndex--
|
||||
// }
|
||||
// $(tabbable[intTabIndex]).focus()
|
||||
// $("#app-content").scrollTop($(document.activeElement).offset().top)
|
||||
break;
|
||||
case "ArrowDown":
|
||||
e.preventDefault();
|
||||
|
||||
cursorPos[1] += cursorSpeed;
|
||||
// if (intTabIndex < tabbable.length) {
|
||||
// intTabIndex++
|
||||
// } else {
|
||||
// intTabIndex = tabbable.length
|
||||
// }
|
||||
// $(tabbable[intTabIndex]).focus()
|
||||
// $("#app-content").scrollTop($(document.activeElement).offset().top)
|
||||
break;
|
||||
case "c":
|
||||
app.resetState();
|
||||
break;
|
||||
case "x":
|
||||
// set cursorPos to the top right of the screen
|
||||
// sounds.Menu.play()
|
||||
if (elementType == 0) {
|
||||
document.activeElement.dispatchEvent(new Event("contextmenu"));
|
||||
} else {
|
||||
element.dispatchEvent(new Event("contextmenu"));
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
break;
|
||||
case "z":
|
||||
sounds.Confirm.play();
|
||||
if (elementType == 0) {
|
||||
document.activeElement.dispatchEvent(new Event("click"));
|
||||
document.activeElement.dispatchEvent(new Event("controller-click"));
|
||||
} else {
|
||||
element.dispatchEvent(new Event("click"));
|
||||
element.dispatchEvent(new Event("controller-click"));
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
break;
|
||||
}
|
||||
|
||||
$(".cursor").css({
|
||||
top: cursorPos[1] + "px",
|
||||
left: cursorPos[0] + "px",
|
||||
});
|
||||
function lerp(a, b, n) {
|
||||
return (1 - n) * a + n * b;
|
||||
}
|
||||
|
||||
element = document.elementFromPoint(cursorPos[0], cursorPos[1]);
|
||||
|
||||
if (element) {
|
||||
let closest = element.closest("[tabindex], input, button, a");
|
||||
if (closest) {
|
||||
elementType = 0;
|
||||
closest.focus();
|
||||
} else {
|
||||
elementType = 1;
|
||||
element.focus();
|
||||
}
|
||||
}
|
||||
console.log(element);
|
||||
});
|
||||
}
|
||||
|
||||
export {simulateGamepad}
|
||||
export { simulateGamepad };
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
export function html (str) {
|
||||
return str[0]
|
||||
}
|
||||
export function html(str) {
|
||||
return str[0];
|
||||
}
|
||||
|
|
|
@ -31,9 +31,9 @@ async function spawnMica() {
|
|||
}
|
||||
if (micaCache.path == imgSrc.path) {
|
||||
imgSrc = micaCache;
|
||||
}else{
|
||||
} else {
|
||||
imgSrc = await ipcRenderer.sendSync("get-wallpaper", {
|
||||
blurAmount: 256
|
||||
blurAmount: 256,
|
||||
});
|
||||
CiderCache.putCache("mica-cache", imgSrc);
|
||||
}
|
||||
|
@ -51,10 +51,7 @@ async function spawnMica() {
|
|||
cb();
|
||||
}
|
||||
// window size change
|
||||
if (
|
||||
lastScreenWidth !== window.innerWidth ||
|
||||
lastScreenHeight !== window.innerHeight
|
||||
) {
|
||||
if (lastScreenWidth !== window.innerWidth || lastScreenHeight !== window.innerHeight) {
|
||||
lastScreenWidth = window.innerWidth;
|
||||
lastScreenHeight = window.innerHeight;
|
||||
cb();
|
||||
|
|
|
@ -1,56 +1,44 @@
|
|||
const MusicKitTools = {
|
||||
async v3Backend({
|
||||
route = "", getBody = {}, options = {}
|
||||
}) {
|
||||
return await (await ipcRenderer.invoke("mkv3", {
|
||||
token: MusicKit.getInstance().developerToken,
|
||||
route: route,
|
||||
mediaToken: MusicKit.getInstance().musicUserToken,
|
||||
GETBody: getBody
|
||||
}))
|
||||
},
|
||||
async v3Continuous({
|
||||
href,
|
||||
options = {},
|
||||
reqOptions = {},
|
||||
onProgress = () => {
|
||||
},
|
||||
onError = () => {
|
||||
},
|
||||
onSuccess = () => {
|
||||
}
|
||||
} = {}) {
|
||||
let returnData = []
|
||||
async v3Backend({ route = "", getBody = {}, options = {} }) {
|
||||
return await await ipcRenderer.invoke("mkv3", {
|
||||
token: MusicKit.getInstance().developerToken,
|
||||
route: route,
|
||||
mediaToken: MusicKit.getInstance().musicUserToken,
|
||||
GETBody: getBody,
|
||||
});
|
||||
},
|
||||
async v3Continuous({ href, options = {}, reqOptions = {}, onProgress = () => {}, onError = () => {}, onSuccess = () => {} } = {}) {
|
||||
let returnData = [];
|
||||
|
||||
async function sendReq(href, options) {
|
||||
const response = await app.mk.api.v3.music(href, options).catch(error => onError)
|
||||
async function sendReq(href, options) {
|
||||
const response = await app.mk.api.v3.music(href, options).catch((error) => onError);
|
||||
|
||||
returnData = returnData.concat(response.data.data)
|
||||
if (response.data.next) {
|
||||
onProgress({
|
||||
response: response,
|
||||
total: returnData.length
|
||||
})
|
||||
try {
|
||||
await sendReq(response.data.next, options)
|
||||
} catch (e) {
|
||||
await sendReq(response.data.next, options)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await sendReq(href, options)
|
||||
onSuccess(returnData)
|
||||
return returnData
|
||||
},
|
||||
getHeader() {
|
||||
return new Headers({
|
||||
Authorization: 'Bearer ' + MusicKit.getInstance().developerToken,
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
'Music-User-Token': '' + MusicKit.getInstance().musicUserToken
|
||||
returnData = returnData.concat(response.data.data);
|
||||
if (response.data.next) {
|
||||
onProgress({
|
||||
response: response,
|
||||
total: returnData.length,
|
||||
});
|
||||
try {
|
||||
await sendReq(response.data.next, options);
|
||||
} catch (e) {
|
||||
await sendReq(response.data.next, options);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export {MusicKitTools}
|
||||
await sendReq(href, options);
|
||||
onSuccess(returnData);
|
||||
return returnData;
|
||||
},
|
||||
getHeader() {
|
||||
return new Headers({
|
||||
Authorization: "Bearer " + MusicKit.getInstance().developerToken,
|
||||
Accept: "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"Music-User-Token": "" + MusicKit.getInstance().musicUserToken,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export { MusicKitTools };
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,38 +1,38 @@
|
|||
const store = new Vuex.Store({
|
||||
state: {
|
||||
windowRelativeScale: 1,
|
||||
library: {
|
||||
// songs: ipcRenderer.sendSync("get-library-songs"),
|
||||
// albums: ipcRenderer.sendSync("get-library-albums"),
|
||||
// recentlyAdded: ipcRenderer.sendSync("get-library-recentlyAdded"),
|
||||
// playlists: ipcRenderer.sendSync("get-library-playlists")
|
||||
},
|
||||
pageState: {
|
||||
recentlyAdded: {
|
||||
loaded: false,
|
||||
nextUrl: null,
|
||||
items: [],
|
||||
size: "normal"
|
||||
},
|
||||
settings: {
|
||||
currentTabIndex: 0,
|
||||
fullscreen: false
|
||||
}
|
||||
},
|
||||
artwork: {
|
||||
playerLCD: ""
|
||||
}
|
||||
state: {
|
||||
windowRelativeScale: 1,
|
||||
library: {
|
||||
// songs: ipcRenderer.sendSync("get-library-songs"),
|
||||
// albums: ipcRenderer.sendSync("get-library-albums"),
|
||||
// recentlyAdded: ipcRenderer.sendSync("get-library-recentlyAdded"),
|
||||
// playlists: ipcRenderer.sendSync("get-library-playlists")
|
||||
},
|
||||
mutations: {
|
||||
resetRecentlyAdded(state) {
|
||||
state.pageState.recentlyAdded.loaded = false;
|
||||
state.pageState.recentlyAdded.nextUrl = null;
|
||||
state.pageState.recentlyAdded.items = [];
|
||||
},
|
||||
setLCDArtwork(state, artwork) {
|
||||
state.artwork.playerLCD = artwork
|
||||
}
|
||||
}
|
||||
})
|
||||
pageState: {
|
||||
recentlyAdded: {
|
||||
loaded: false,
|
||||
nextUrl: null,
|
||||
items: [],
|
||||
size: "normal",
|
||||
},
|
||||
settings: {
|
||||
currentTabIndex: 0,
|
||||
fullscreen: false,
|
||||
},
|
||||
},
|
||||
artwork: {
|
||||
playerLCD: "",
|
||||
},
|
||||
},
|
||||
mutations: {
|
||||
resetRecentlyAdded(state) {
|
||||
state.pageState.recentlyAdded.loaded = false;
|
||||
state.pageState.recentlyAdded.nextUrl = null;
|
||||
state.pageState.recentlyAdded.items = [];
|
||||
},
|
||||
setLCDArtwork(state, artwork) {
|
||||
state.artwork.playerLCD = artwork;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export {store}
|
||||
export { store };
|
||||
|
|
|
@ -1,194 +1,230 @@
|
|||
const wsapi = {
|
||||
cache: {playParams: {id: 0}, status: null, remainingTime: 0},
|
||||
playbackCache: {status: null, time: Date.now()},
|
||||
async v3(encoded = "") {
|
||||
let decoded = atob(encoded);
|
||||
let json = JSON.parse(decoded);
|
||||
console.log(json)
|
||||
let response = await (await MusicKit.getInstance().api.v3.music(json.route, json.body, json.options))
|
||||
let ret = response.data
|
||||
return JSON.stringify(ret)
|
||||
},
|
||||
search(term, limit) {
|
||||
MusicKit.getInstance().api.search(term, {limit: limit, types: 'songs,artists,albums,playlists'}).then((results)=>{
|
||||
ipcRenderer.send('wsapi-returnSearch', JSON.stringify(results))
|
||||
})
|
||||
},
|
||||
searchLibrary(term, limit) {
|
||||
MusicKit.getInstance().api.library.search(term, {limit: limit, types: 'library-songs,library-artists,library-albums,library-playlists'}).then((results)=>{
|
||||
ipcRenderer.send('wsapi-returnSearchLibrary', JSON.stringify(results))
|
||||
})
|
||||
},
|
||||
getAttributes: function () {
|
||||
const mk = MusicKit.getInstance();
|
||||
const nowPlayingItem = mk.nowPlayingItem;
|
||||
const isPlayingExport = mk.isPlaying;
|
||||
const remainingTimeExport = mk.currentPlaybackTimeRemaining;
|
||||
const attributes = (nowPlayingItem != null ? nowPlayingItem.attributes : {});
|
||||
cache: { playParams: { id: 0 }, status: null, remainingTime: 0 },
|
||||
playbackCache: { status: null, time: Date.now() },
|
||||
async v3(encoded = "") {
|
||||
let decoded = atob(encoded);
|
||||
let json = JSON.parse(decoded);
|
||||
console.log(json);
|
||||
let response = await await MusicKit.getInstance().api.v3.music(json.route, json.body, json.options);
|
||||
let ret = response.data;
|
||||
return JSON.stringify(ret);
|
||||
},
|
||||
search(term, limit) {
|
||||
MusicKit.getInstance()
|
||||
.api.search(term, {
|
||||
limit: limit,
|
||||
types: "songs,artists,albums,playlists",
|
||||
})
|
||||
.then((results) => {
|
||||
ipcRenderer.send("wsapi-returnSearch", JSON.stringify(results));
|
||||
});
|
||||
},
|
||||
searchLibrary(term, limit) {
|
||||
MusicKit.getInstance()
|
||||
.api.library.search(term, {
|
||||
limit: limit,
|
||||
types: "library-songs,library-artists,library-albums,library-playlists",
|
||||
})
|
||||
.then((results) => {
|
||||
ipcRenderer.send("wsapi-returnSearchLibrary", JSON.stringify(results));
|
||||
});
|
||||
},
|
||||
getAttributes: function () {
|
||||
const mk = MusicKit.getInstance();
|
||||
const nowPlayingItem = mk.nowPlayingItem;
|
||||
const isPlayingExport = mk.isPlaying;
|
||||
const remainingTimeExport = mk.currentPlaybackTimeRemaining;
|
||||
const attributes = nowPlayingItem != null ? nowPlayingItem.attributes : {};
|
||||
|
||||
attributes.status = isPlayingExport ? isPlayingExport : false;
|
||||
attributes.name = attributes.name ? attributes.name : 'No Title Found';
|
||||
attributes.artwork = attributes.artwork ? attributes.artwork : {url: ''};
|
||||
attributes.artwork.url = attributes.artwork.url ? attributes.artwork.url : '';
|
||||
attributes.playParams = attributes.playParams ? attributes.playParams : {id: 'no-id-found'};
|
||||
attributes.playParams.id = attributes.playParams.id ? attributes.playParams.id : 'no-id-found';
|
||||
attributes.albumName = attributes.albumName ? attributes.albumName : '';
|
||||
attributes.artistName = attributes.artistName ? attributes.artistName : '';
|
||||
attributes.genreNames = attributes.genreNames ? attributes.genreNames : [];
|
||||
attributes.remainingTime = remainingTimeExport ? (remainingTimeExport * 1000) : 0;
|
||||
attributes.durationInMillis = attributes.durationInMillis ? attributes.durationInMillis : 0;
|
||||
attributes.startTime = Date.now();
|
||||
attributes.endTime = attributes.endTime ? attributes.endTime : Date.now();
|
||||
attributes.volume = mk.volume;
|
||||
attributes.shuffleMode = mk.shuffleMode;
|
||||
attributes.repeatMode = mk.repeatMode;
|
||||
attributes.autoplayEnabled = mk.autoplayEnabled;
|
||||
return attributes
|
||||
},
|
||||
moveQueueItem(oldPosition, newPosition) {
|
||||
MusicKit.getInstance().queue._queueItems.splice(newPosition,0,MusicKit.getInstance().queue._queueItems.splice(oldPosition,1)[0])
|
||||
MusicKit.getInstance().queue._reindex()
|
||||
},
|
||||
setAutoplay(value) {
|
||||
MusicKit.getInstance().autoplayEnabled = value
|
||||
},
|
||||
returnDynamic(data, type) {
|
||||
ipcRenderer.send('wsapi-returnDynamic', JSON.stringify(data), type)
|
||||
},
|
||||
musickitApi(method, id, params, library = false) {
|
||||
if (library) {
|
||||
MusicKit.getInstance().api.library[method](id, params).then((results)=>{
|
||||
ipcRenderer.send('wsapi-returnMusicKitApi', JSON.stringify(results), method)
|
||||
})
|
||||
} else {
|
||||
MusicKit.getInstance().api[method](id, params).then((results)=>{
|
||||
ipcRenderer.send('wsapi-returnMusicKitApi', JSON.stringify(results), method)
|
||||
})
|
||||
}
|
||||
},
|
||||
getPlaybackState () {
|
||||
ipcRenderer.send('wsapi-updatePlaybackState', MusicKitInterop.getAttributes());
|
||||
},
|
||||
getLyrics() {
|
||||
ipcRenderer.send('wsapi-returnLyrics',JSON.stringify(app.lyrics));
|
||||
},
|
||||
getQueue() {
|
||||
ipcRenderer.send('wsapi-returnQueue', JSON.stringify(MusicKit.getInstance().queue))
|
||||
},
|
||||
playNext(type, id) {
|
||||
var request = {}
|
||||
request[type] = id
|
||||
MusicKit.getInstance().playNext(request)
|
||||
},
|
||||
playLater(type, id) {
|
||||
var request = {}
|
||||
request[type] = id
|
||||
MusicKit.getInstance().playLater(request)
|
||||
},
|
||||
love() {
|
||||
|
||||
},
|
||||
playTrackById(id, kind = "song") {
|
||||
MusicKit.getInstance().setQueue({ [kind]: id , parameters : {l : app.mklang}}).then(function (queue) {
|
||||
MusicKit.getInstance().play()
|
||||
})
|
||||
},
|
||||
quickPlay(term) {
|
||||
// Quick play by song name
|
||||
MusicKit.getInstance().api.search(term, { limit: 2, types: 'songs' }).then(function (data) {
|
||||
MusicKit.getInstance().setQueue({ song: data["songs"][0]["id"],parameters : {l : app.mklang} }).then(function (queue) {
|
||||
MusicKit.getInstance().play()
|
||||
})
|
||||
})
|
||||
},
|
||||
toggleShuffle() {
|
||||
MusicKit.getInstance().shuffleMode = MusicKit.getInstance().shuffleMode === 0 ? 1 : 0
|
||||
},
|
||||
togglePlayPause() {
|
||||
app.mk.isPlaying ? app.mk.pause() : app.mk.play()
|
||||
},
|
||||
toggleRepeat() {
|
||||
if (MusicKit.getInstance().repeatMode == 0) {
|
||||
MusicKit.getInstance().repeatMode = 1
|
||||
} else if (MusicKit.getInstance().repeatMode == 1){
|
||||
MusicKit.getInstance().repeatMode = 2
|
||||
} else {
|
||||
MusicKit.getInstance().repeatMode = 0
|
||||
}
|
||||
},
|
||||
getmaxVolume() {
|
||||
ipcRenderer.send('wsapi-returnvolumeMax',JSON.stringify(app.cfg.audio.maxVolume));
|
||||
},
|
||||
getLibraryStatus(kind, id) {
|
||||
if (kind === undefined || id === "no-id-found") return;
|
||||
|
||||
let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
|
||||
app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/?ids[${truekind}]=${id}`, {
|
||||
relate: "library",
|
||||
fields: "inLibrary"
|
||||
}).then(data => {
|
||||
const res = data.data.data[0];
|
||||
const inLibrary = res && res.attributes && res.attributes.inLibrary;
|
||||
|
||||
app.getRating({ type: truekind, id: id }).then(rating => {
|
||||
ipcRenderer.send('wsapi-libraryStatus', inLibrary, rating);
|
||||
})
|
||||
})
|
||||
},
|
||||
rate(kind, id, rating) {
|
||||
if (kind === undefined || id === "no-id-found") return;
|
||||
|
||||
let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
|
||||
|
||||
if (rating === 0) {
|
||||
app.mk.api.v3.music(`/v1/me/ratings/${truekind}/${id}`, {}, {
|
||||
fetchOptions: {
|
||||
method: "DELETE",
|
||||
}
|
||||
}).then(function () {
|
||||
ipcRenderer.send('wsapi-rate', kind, id, rating);
|
||||
})
|
||||
} else {
|
||||
app.mk.api.v3.music(`/v1/me/ratings/${truekind}/${id}`, {}, {
|
||||
fetchOptions: {
|
||||
method: "PUT",
|
||||
body: JSON.stringify({
|
||||
"type": "rating",
|
||||
"attributes": {
|
||||
"value": rating
|
||||
}
|
||||
})
|
||||
}
|
||||
}).then(function () {
|
||||
ipcRenderer.send('wsapi-rate', kind, id, rating);
|
||||
})
|
||||
}
|
||||
},
|
||||
changeLibrary(kind, id, shouldAdd) {
|
||||
if (shouldAdd) {
|
||||
app.addToLibrary(id);
|
||||
ipcRenderer.send('wsapi-change-library', kind, id, shouldAdd);
|
||||
} else {
|
||||
let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
|
||||
|
||||
app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/?ids[${truekind}]=${id}`, {
|
||||
relate: "library",
|
||||
fields: "inLibrary"
|
||||
})
|
||||
.then(res => {
|
||||
res = res.data.data[0]
|
||||
if (res && res.relationships && res.relationships.library && res.relationships.library.data) {
|
||||
const item = res.relationships.library.data[0];
|
||||
|
||||
if (item) {
|
||||
app.removeFromLibrary(kind, item.id)
|
||||
}
|
||||
|
||||
ipcRenderer.send('wsapi-change-library', kind, id, shouldAdd);
|
||||
}
|
||||
});
|
||||
}
|
||||
attributes.status = isPlayingExport ? isPlayingExport : false;
|
||||
attributes.name = attributes.name ? attributes.name : "No Title Found";
|
||||
attributes.artwork = attributes.artwork ? attributes.artwork : { url: "" };
|
||||
attributes.artwork.url = attributes.artwork.url ? attributes.artwork.url : "";
|
||||
attributes.playParams = attributes.playParams ? attributes.playParams : { id: "no-id-found" };
|
||||
attributes.playParams.id = attributes.playParams.id ? attributes.playParams.id : "no-id-found";
|
||||
attributes.albumName = attributes.albumName ? attributes.albumName : "";
|
||||
attributes.artistName = attributes.artistName ? attributes.artistName : "";
|
||||
attributes.genreNames = attributes.genreNames ? attributes.genreNames : [];
|
||||
attributes.remainingTime = remainingTimeExport ? remainingTimeExport * 1000 : 0;
|
||||
attributes.durationInMillis = attributes.durationInMillis ? attributes.durationInMillis : 0;
|
||||
attributes.startTime = Date.now();
|
||||
attributes.endTime = attributes.endTime ? attributes.endTime : Date.now();
|
||||
attributes.volume = mk.volume;
|
||||
attributes.shuffleMode = mk.shuffleMode;
|
||||
attributes.repeatMode = mk.repeatMode;
|
||||
attributes.autoplayEnabled = mk.autoplayEnabled;
|
||||
return attributes;
|
||||
},
|
||||
moveQueueItem(oldPosition, newPosition) {
|
||||
MusicKit.getInstance().queue._queueItems.splice(newPosition, 0, MusicKit.getInstance().queue._queueItems.splice(oldPosition, 1)[0]);
|
||||
MusicKit.getInstance().queue._reindex();
|
||||
},
|
||||
setAutoplay(value) {
|
||||
MusicKit.getInstance().autoplayEnabled = value;
|
||||
},
|
||||
returnDynamic(data, type) {
|
||||
ipcRenderer.send("wsapi-returnDynamic", JSON.stringify(data), type);
|
||||
},
|
||||
musickitApi(method, id, params, library = false) {
|
||||
if (library) {
|
||||
MusicKit.getInstance()
|
||||
.api.library[method](id, params)
|
||||
.then((results) => {
|
||||
ipcRenderer.send("wsapi-returnMusicKitApi", JSON.stringify(results), method);
|
||||
});
|
||||
} else {
|
||||
MusicKit.getInstance()
|
||||
.api[method](id, params)
|
||||
.then((results) => {
|
||||
ipcRenderer.send("wsapi-returnMusicKitApi", JSON.stringify(results), method);
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
getPlaybackState() {
|
||||
ipcRenderer.send("wsapi-updatePlaybackState", MusicKitInterop.getAttributes());
|
||||
},
|
||||
getLyrics() {
|
||||
ipcRenderer.send("wsapi-returnLyrics", JSON.stringify(app.lyrics));
|
||||
},
|
||||
getQueue() {
|
||||
ipcRenderer.send("wsapi-returnQueue", JSON.stringify(MusicKit.getInstance().queue));
|
||||
},
|
||||
playNext(type, id) {
|
||||
var request = {};
|
||||
request[type] = id;
|
||||
MusicKit.getInstance().playNext(request);
|
||||
},
|
||||
playLater(type, id) {
|
||||
var request = {};
|
||||
request[type] = id;
|
||||
MusicKit.getInstance().playLater(request);
|
||||
},
|
||||
love() {},
|
||||
playTrackById(id, kind = "song") {
|
||||
MusicKit.getInstance()
|
||||
.setQueue({ [kind]: id, parameters: { l: app.mklang } })
|
||||
.then(function (queue) {
|
||||
MusicKit.getInstance().play();
|
||||
});
|
||||
},
|
||||
quickPlay(term) {
|
||||
// Quick play by song name
|
||||
MusicKit.getInstance()
|
||||
.api.search(term, { limit: 2, types: "songs" })
|
||||
.then(function (data) {
|
||||
MusicKit.getInstance()
|
||||
.setQueue({
|
||||
song: data["songs"][0]["id"],
|
||||
parameters: { l: app.mklang },
|
||||
})
|
||||
.then(function (queue) {
|
||||
MusicKit.getInstance().play();
|
||||
});
|
||||
});
|
||||
},
|
||||
toggleShuffle() {
|
||||
MusicKit.getInstance().shuffleMode = MusicKit.getInstance().shuffleMode === 0 ? 1 : 0;
|
||||
},
|
||||
togglePlayPause() {
|
||||
app.mk.isPlaying ? app.mk.pause() : app.mk.play();
|
||||
},
|
||||
toggleRepeat() {
|
||||
if (MusicKit.getInstance().repeatMode == 0) {
|
||||
MusicKit.getInstance().repeatMode = 1;
|
||||
} else if (MusicKit.getInstance().repeatMode == 1) {
|
||||
MusicKit.getInstance().repeatMode = 2;
|
||||
} else {
|
||||
MusicKit.getInstance().repeatMode = 0;
|
||||
}
|
||||
},
|
||||
getmaxVolume() {
|
||||
ipcRenderer.send("wsapi-returnvolumeMax", JSON.stringify(app.cfg.audio.maxVolume));
|
||||
},
|
||||
getLibraryStatus(kind, id) {
|
||||
if (kind === undefined || id === "no-id-found") return;
|
||||
|
||||
export {wsapi}
|
||||
let truekind = !kind.endsWith("s") ? kind + "s" : kind;
|
||||
app.mk.api.v3
|
||||
.music(`/v1/catalog/${app.mk.storefrontId}/?ids[${truekind}]=${id}`, {
|
||||
relate: "library",
|
||||
fields: "inLibrary",
|
||||
})
|
||||
.then((data) => {
|
||||
const res = data.data.data[0];
|
||||
const inLibrary = res && res.attributes && res.attributes.inLibrary;
|
||||
|
||||
app.getRating({ type: truekind, id: id }).then((rating) => {
|
||||
ipcRenderer.send("wsapi-libraryStatus", inLibrary, rating);
|
||||
});
|
||||
});
|
||||
},
|
||||
rate(kind, id, rating) {
|
||||
if (kind === undefined || id === "no-id-found") return;
|
||||
|
||||
let truekind = !kind.endsWith("s") ? kind + "s" : kind;
|
||||
|
||||
if (rating === 0) {
|
||||
app.mk.api.v3
|
||||
.music(
|
||||
`/v1/me/ratings/${truekind}/${id}`,
|
||||
{},
|
||||
{
|
||||
fetchOptions: {
|
||||
method: "DELETE",
|
||||
},
|
||||
}
|
||||
)
|
||||
.then(function () {
|
||||
ipcRenderer.send("wsapi-rate", kind, id, rating);
|
||||
});
|
||||
} else {
|
||||
app.mk.api.v3
|
||||
.music(
|
||||
`/v1/me/ratings/${truekind}/${id}`,
|
||||
{},
|
||||
{
|
||||
fetchOptions: {
|
||||
method: "PUT",
|
||||
body: JSON.stringify({
|
||||
type: "rating",
|
||||
attributes: {
|
||||
value: rating,
|
||||
},
|
||||
}),
|
||||
},
|
||||
}
|
||||
)
|
||||
.then(function () {
|
||||
ipcRenderer.send("wsapi-rate", kind, id, rating);
|
||||
});
|
||||
}
|
||||
},
|
||||
changeLibrary(kind, id, shouldAdd) {
|
||||
if (shouldAdd) {
|
||||
app.addToLibrary(id);
|
||||
ipcRenderer.send("wsapi-change-library", kind, id, shouldAdd);
|
||||
} else {
|
||||
let truekind = !kind.endsWith("s") ? kind + "s" : kind;
|
||||
|
||||
app.mk.api.v3
|
||||
.music(`/v1/catalog/${app.mk.storefrontId}/?ids[${truekind}]=${id}`, {
|
||||
relate: "library",
|
||||
fields: "inLibrary",
|
||||
})
|
||||
.then((res) => {
|
||||
res = res.data.data[0];
|
||||
if (res && res.relationships && res.relationships.library && res.relationships.library.data) {
|
||||
const item = res.relationships.library.data[0];
|
||||
|
||||
if (item) {
|
||||
app.removeFromLibrary(kind, item.id);
|
||||
}
|
||||
|
||||
ipcRenderer.send("wsapi-change-library", kind, id, shouldAdd);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export { wsapi };
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue