mirror of
https://github.com/Mastermindzh/tidal-hifi.git
synced 2025-08-03 11:31:20 +02:00
chore: more typescript
This commit is contained in:
@@ -1,103 +0,0 @@
|
||||
const discordrpc = require("discord-rpc");
|
||||
const { app, ipcMain } = require("electron");
|
||||
const globalEvents = require("../constants/globalEvents");
|
||||
const clientId = "833617820704440341";
|
||||
const mediaInfoModule = require("./mediaInfo");
|
||||
const discordModule = {
|
||||
rpc: {},
|
||||
unRPC: function () {
|
||||
return;
|
||||
},
|
||||
initRPC: function () {
|
||||
return;
|
||||
},
|
||||
};
|
||||
|
||||
function timeToSeconds(timeArray) {
|
||||
let minutes = timeArray[0] * 1;
|
||||
let seconds = minutes * 60 + timeArray[1] * 1;
|
||||
return seconds;
|
||||
}
|
||||
|
||||
let rpc;
|
||||
const observer = (event, arg) => {
|
||||
if (mediaInfoModule.mediaInfo.status == "paused" && rpc) {
|
||||
rpc.setActivity(idleStatus);
|
||||
} else if (rpc) {
|
||||
const currentSeconds = timeToSeconds(mediaInfoModule.mediaInfo.current.split(":"));
|
||||
const durationSeconds = timeToSeconds(mediaInfoModule.mediaInfo.duration.split(":"));
|
||||
const date = new Date();
|
||||
const now = (date.getTime() / 1000) | 0;
|
||||
const remaining = date.setSeconds(date.getSeconds() + (durationSeconds - currentSeconds));
|
||||
if (mediaInfoModule.mediaInfo.url) {
|
||||
rpc.setActivity({
|
||||
...idleStatus,
|
||||
...{
|
||||
details: `Listening to ${mediaInfoModule.mediaInfo.title}`,
|
||||
state: mediaInfoModule.mediaInfo.artists
|
||||
? mediaInfoModule.mediaInfo.artists
|
||||
: "unknown artist(s)",
|
||||
startTimestamp: parseInt(now),
|
||||
endTimestamp: parseInt(remaining),
|
||||
largeImageKey: mediaInfoModule.mediaInfo.image,
|
||||
largeImageText: mediaInfoModule.mediaInfo.album
|
||||
? mediaInfoModule.mediaInfo.album
|
||||
: `${idleStatus.largeImageText}`,
|
||||
buttons: [{ label: "Play on Tidal", url: mediaInfoModule.mediaInfo.url }],
|
||||
},
|
||||
});
|
||||
} else {
|
||||
rpc.setActivity({
|
||||
...idleStatus,
|
||||
...{
|
||||
details: `Watching ${mediaInfoModule.mediaInfo.title}`,
|
||||
state: mediaInfoModule.mediaInfo.artists,
|
||||
startTimestamp: parseInt(now),
|
||||
endTimestamp: parseInt(remaining),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const idleStatus = {
|
||||
details: `Browsing Tidal`,
|
||||
largeImageKey: "tidal-hifi-icon",
|
||||
largeImageText: `Tidal HiFi ${app.getVersion()}`,
|
||||
instance: false,
|
||||
};
|
||||
|
||||
/**
|
||||
* Set up the discord rpc and listen on globalEvents.updateInfo
|
||||
*/
|
||||
discordModule.initRPC = function () {
|
||||
rpc = new discordrpc.Client({ transport: "ipc" });
|
||||
rpc.login({ clientId }).then(
|
||||
() => {
|
||||
discordModule.rpc = rpc;
|
||||
|
||||
rpc.on("ready", () => {
|
||||
rpc.setActivity(idleStatus);
|
||||
});
|
||||
ipcMain.on(globalEvents.updateInfo, observer);
|
||||
},
|
||||
() => {
|
||||
console.error("Can't connect to Discord, is it running?");
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove any RPC connection with discord and remove the event listener on globalEvents.updateInfo
|
||||
*/
|
||||
discordModule.unRPC = function () {
|
||||
if (rpc) {
|
||||
rpc.clearActivity();
|
||||
rpc.destroy();
|
||||
rpc = false;
|
||||
discordModule.rpc = undefined;
|
||||
ipcMain.removeListener(globalEvents.updateInfo, observer);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = discordModule;
|
88
src/scripts/discord.ts
Normal file
88
src/scripts/discord.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
import { Client } from "discord-rpc";
|
||||
import { app, ipcMain } from "electron";
|
||||
import globalEvents from "../constants/globalEvents";
|
||||
import { MediaStatus } from "../models/mediaStatus";
|
||||
import { mediaInfo } from "./mediaInfo";
|
||||
|
||||
const clientId = "833617820704440341";
|
||||
|
||||
function timeToSeconds(timeArray: string[]) {
|
||||
const minutes = parseInt(timeArray[0]) * 1;
|
||||
const seconds = minutes * 60 + parseInt(timeArray[1]) * 1;
|
||||
return seconds;
|
||||
}
|
||||
|
||||
export let rpc: Client;
|
||||
|
||||
const observer = () => {
|
||||
if (mediaInfo.status == MediaStatus.paused && rpc) {
|
||||
rpc.setActivity(idleStatus);
|
||||
} else if (rpc) {
|
||||
const currentSeconds = timeToSeconds(mediaInfo.current.split(":"));
|
||||
const durationSeconds = timeToSeconds(mediaInfo.duration.split(":"));
|
||||
const date = new Date();
|
||||
const now = (date.getTime() / 1000) | 0;
|
||||
const remaining = date.setSeconds(date.getSeconds() + (durationSeconds - currentSeconds));
|
||||
if (mediaInfo.url) {
|
||||
rpc.setActivity({
|
||||
...idleStatus,
|
||||
...{
|
||||
details: `Listening to ${mediaInfo.title}`,
|
||||
state: mediaInfo.artists ? mediaInfo.artists : "unknown artist(s)",
|
||||
startTimestamp: now,
|
||||
endTimestamp: remaining,
|
||||
largeImageKey: mediaInfo.image,
|
||||
largeImageText: mediaInfo.album ? mediaInfo.album : `${idleStatus.largeImageText}`,
|
||||
buttons: [{ label: "Play on Tidal", url: mediaInfo.url }],
|
||||
},
|
||||
});
|
||||
} else {
|
||||
rpc.setActivity({
|
||||
...idleStatus,
|
||||
...{
|
||||
details: `Watching ${mediaInfo.title}`,
|
||||
state: mediaInfo.artists,
|
||||
startTimestamp: now,
|
||||
endTimestamp: remaining,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const idleStatus = {
|
||||
details: `Browsing Tidal`,
|
||||
largeImageKey: "tidal-hifi-icon",
|
||||
largeImageText: `Tidal HiFi ${app.getVersion()}`,
|
||||
instance: false,
|
||||
};
|
||||
|
||||
/**
|
||||
* Set up the discord rpc and listen on globalEvents.updateInfo
|
||||
*/
|
||||
export const initRPC = () => {
|
||||
rpc = new Client({ transport: "ipc" });
|
||||
rpc.login({ clientId }).then(
|
||||
() => {
|
||||
rpc.on("ready", () => {
|
||||
rpc.setActivity(idleStatus);
|
||||
});
|
||||
ipcMain.on(globalEvents.updateInfo, observer);
|
||||
},
|
||||
() => {
|
||||
console.error("Can't connect to Discord, is it running?");
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove any RPC connection with discord and remove the event listener on globalEvents.updateInfo
|
||||
*/
|
||||
export const unRPC = () => {
|
||||
if (rpc) {
|
||||
rpc.clearActivity();
|
||||
rpc.destroy();
|
||||
rpc = null;
|
||||
ipcMain.removeListener(globalEvents.updateInfo, observer);
|
||||
}
|
||||
};
|
@@ -1,10 +1,11 @@
|
||||
import { BrowserWindow } from "electron";
|
||||
import { BrowserWindow, dialog } from "electron";
|
||||
import express, { Response } from "express";
|
||||
import fs from "fs";
|
||||
const { mediaInfo } = require("./mediaInfo");
|
||||
const { store, settings } = require("./settings");
|
||||
const globalEvents = require("./../constants/globalEvents");
|
||||
const statuses = require("./../constants/statuses");
|
||||
import globalEvents from "./../constants/globalEvents";
|
||||
import statuses from "./../constants/statuses";
|
||||
import { mediaInfo } from "./mediaInfo";
|
||||
import { settingsStore } from "./settings";
|
||||
import { settings } from "../constants/settings";
|
||||
|
||||
/**
|
||||
* Function to enable tidal-hifi's express api
|
||||
@@ -37,7 +38,7 @@ export const startExpress = (mainWindow: BrowserWindow) => {
|
||||
});
|
||||
});
|
||||
|
||||
if (store.get(settings.playBackControl)) {
|
||||
if (settingsStore.get(settings.playBackControl)) {
|
||||
expressApp.get("/play", (req, res) => handleGlobalEvent(res, globalEvents.play));
|
||||
expressApp.get("/pause", (req, res) => handleGlobalEvent(res, globalEvents.pause));
|
||||
expressApp.get("/next", (req, res) => handleGlobalEvent(res, globalEvents.next));
|
||||
@@ -51,15 +52,15 @@ export const startExpress = (mainWindow: BrowserWindow) => {
|
||||
});
|
||||
}
|
||||
|
||||
let port = store.get(settings.apiSettings.port);
|
||||
const port = settingsStore.get<string, number>(settings.apiSettings.port);
|
||||
|
||||
const expressInstance = expressApp.listen(port, "127.0.0.1", () => {});
|
||||
const expressInstance = expressApp.listen(port, "127.0.0.1");
|
||||
expressInstance.on("error", function (e: { code: string }) {
|
||||
let message = e.code;
|
||||
if (e.code === "EADDRINUSE") {
|
||||
message = `Port ${port} in use.`;
|
||||
}
|
||||
const { dialog } = require("electron");
|
||||
|
||||
dialog.showErrorBox("Api failed to start.", message);
|
||||
});
|
||||
};
|
||||
|
@@ -1,38 +0,0 @@
|
||||
const statuses = require("./../constants/statuses");
|
||||
|
||||
const mediaInfo = {
|
||||
title: "",
|
||||
artists: "",
|
||||
album: "",
|
||||
icon: "",
|
||||
status: statuses.paused,
|
||||
url: "",
|
||||
current: "",
|
||||
duration: "",
|
||||
image: "tidal-hifi-icon",
|
||||
};
|
||||
const mediaInfoModule = {
|
||||
mediaInfo,
|
||||
update: function (arg) {
|
||||
mediaInfo.title = propOrDefault(arg.title);
|
||||
mediaInfo.artists = propOrDefault(arg.artists);
|
||||
mediaInfo.album = propOrDefault(arg.album);
|
||||
mediaInfo.icon = propOrDefault(arg.icon);
|
||||
mediaInfo.url = propOrDefault(arg.url);
|
||||
mediaInfo.status = propOrDefault(arg.status);
|
||||
mediaInfo.current = propOrDefault(arg.current);
|
||||
mediaInfo.duration = propOrDefault(arg.duration);
|
||||
mediaInfo.image = propOrDefault(arg.image);
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the property or a default value
|
||||
* @param {*} prop property to check
|
||||
* @param {*} defaultValue defaults to ""
|
||||
*/
|
||||
function propOrDefault(prop, defaultValue = "") {
|
||||
return prop ? prop : defaultValue;
|
||||
}
|
||||
|
||||
module.exports = mediaInfoModule;
|
35
src/scripts/mediaInfo.ts
Normal file
35
src/scripts/mediaInfo.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { MediaInfo } from "../models/mediaInfo";
|
||||
import statuses from "./../constants/statuses";
|
||||
|
||||
export const mediaInfo = {
|
||||
title: "",
|
||||
artists: "",
|
||||
album: "",
|
||||
icon: "",
|
||||
status: statuses.paused,
|
||||
url: "",
|
||||
current: "",
|
||||
duration: "",
|
||||
image: "tidal-hifi-icon",
|
||||
};
|
||||
|
||||
export const updateMediaInfo = (arg: MediaInfo) => {
|
||||
mediaInfo.title = propOrDefault(arg.title);
|
||||
mediaInfo.artists = propOrDefault(arg.artists);
|
||||
mediaInfo.album = propOrDefault(arg.album);
|
||||
mediaInfo.icon = propOrDefault(arg.icon);
|
||||
mediaInfo.url = propOrDefault(arg.url);
|
||||
mediaInfo.status = propOrDefault(arg.status);
|
||||
mediaInfo.current = propOrDefault(arg.current);
|
||||
mediaInfo.duration = propOrDefault(arg.duration);
|
||||
mediaInfo.image = propOrDefault(arg.image);
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the property or a default value
|
||||
* @param {*} prop property to check
|
||||
* @param {*} defaultValue defaults to ""
|
||||
*/
|
||||
function propOrDefault(prop: string, defaultValue = "") {
|
||||
return prop ? prop : defaultValue;
|
||||
}
|
@@ -1,12 +1,12 @@
|
||||
const Store = require("electron-store");
|
||||
import Store from "electron-store";
|
||||
|
||||
const settings = require("../constants/settings");
|
||||
const path = require("path");
|
||||
const { BrowserWindow } = require("electron");
|
||||
import { settings } from "../constants/settings";
|
||||
import path from "path";
|
||||
import { BrowserWindow } from "electron";
|
||||
|
||||
let settingsWindow;
|
||||
let settingsWindow: BrowserWindow;
|
||||
|
||||
const store = new Store({
|
||||
export const settingsStore = new Store({
|
||||
defaults: {
|
||||
adBlock: false,
|
||||
api: true,
|
||||
@@ -46,12 +46,11 @@ const store = new Store({
|
||||
});
|
||||
|
||||
const settingsModule = {
|
||||
store,
|
||||
settings,
|
||||
// settings,
|
||||
settingsWindow,
|
||||
};
|
||||
|
||||
settingsModule.createSettingsWindow = function () {
|
||||
export const createSettingsWindow = function () {
|
||||
settingsWindow = new BrowserWindow({
|
||||
width: 700,
|
||||
height: 600,
|
||||
@@ -67,7 +66,7 @@ settingsModule.createSettingsWindow = function () {
|
||||
},
|
||||
});
|
||||
|
||||
settingsWindow.on("close", (event) => {
|
||||
settingsWindow.on("close", (event: any) => {
|
||||
if (settingsWindow != null) {
|
||||
event.preventDefault();
|
||||
settingsWindow.hide();
|
||||
@@ -79,19 +78,17 @@ settingsModule.createSettingsWindow = function () {
|
||||
settingsModule.settingsWindow = settingsWindow;
|
||||
};
|
||||
|
||||
settingsModule.showSettingsWindow = function (tab = "general") {
|
||||
export const showSettingsWindow = function (tab = "general") {
|
||||
settingsWindow.webContents.send("goToTab", tab);
|
||||
|
||||
// refresh data just before showing the window
|
||||
settingsWindow.webContents.send("refreshData");
|
||||
settingsWindow.show();
|
||||
};
|
||||
settingsModule.hideSettingsWindow = function () {
|
||||
export const hideSettingsWindow = function () {
|
||||
settingsWindow.hide();
|
||||
};
|
||||
|
||||
settingsModule.closeSettingsWindow = function () {
|
||||
export const closeSettingsWindow = function () {
|
||||
settingsWindow = null;
|
||||
};
|
||||
|
||||
module.exports = settingsModule;
|
Reference in New Issue
Block a user