added player status and worked on getting the integrations working with i3: 9714b2fa1d

This commit is contained in:
Rick van Lieshout 2019-10-30 23:42:08 +01:00
parent d7dab07845
commit bb49c112db
6 changed files with 57 additions and 1 deletions

View File

@ -40,7 +40,7 @@ When I started this project there weren't any Linux apps that offered Tidal's "h
## Integrations ## Integrations
- [i3 blocks config]() - My dotfiles where I use this app to fetch currently playing music - [i3 blocks config](https://github.com/Mastermindzh/dotfiles/commit/9714b2fa1d670108ce811d5511fd3b7a43180647) - My dotfiles where I use this app to fetch currently playing music (direct commit)
## Why not extend existing projects? ## Why not extend existing projects?

View File

@ -0,0 +1,4 @@
module.exports = {
playing: "playing",
paused: "paused",
};

View File

@ -83,3 +83,7 @@ app.on("activate", function() {
ipcMain.on("update-info", (event, arg) => { ipcMain.on("update-info", (event, arg) => {
mediaInfoModule.update(arg); mediaInfoModule.update(arg);
}); });
ipcMain.on("update-status", (event, arg) => {
mediaInfoModule.updateStatus(arg);
});

View File

@ -4,6 +4,7 @@ const { settings } = require("./scripts/settings");
const { ipcRenderer } = require("electron"); const { ipcRenderer } = require("electron");
const { app } = require("electron").remote; const { app } = require("electron").remote;
const { downloadFile } = require("./scripts/download"); const { downloadFile } = require("./scripts/download");
const statuses = require("./constants/statuses");
const hotkeys = require("./scripts/hotkeys"); const hotkeys = require("./scripts/hotkeys");
const globalEvents = require("./constants/globalEvents"); const globalEvents = require("./constants/globalEvents");
const notifier = require("node-notifier"); const notifier = require("node-notifier");
@ -210,6 +211,19 @@ function addIPCEventListeners() {
}); });
} }
/**
* Update the current status of tidal (e.g playing or paused)
*/
function updateStatus() {
const play = elements.get("play");
let status = statuses.paused;
// if play button is NOT visible tidal is playing
if (!play) {
status = statuses.playing;
}
ipcRenderer.send("update-status", status);
}
/** /**
* Watch for song changes and update title + notify * Watch for song changes and update title + notify
*/ */
@ -218,6 +232,8 @@ setInterval(function() {
const artists = elements.getText("artists"); const artists = elements.getText("artists");
const songDashArtistTitle = `${title} - ${artists}`; const songDashArtistTitle = `${title} - ${artists}`;
updateStatus();
if (getTitle() !== songDashArtistTitle) { if (getTitle() !== songDashArtistTitle) {
setTitle(songDashArtistTitle); setTitle(songDashArtistTitle);

View File

@ -2,10 +2,20 @@ const express = require("express");
const { mediaInfo } = require("./mediaInfo"); const { mediaInfo } = require("./mediaInfo");
const settingsModule = require("./settings"); const settingsModule = require("./settings");
const globalEvents = require("./../constants/globalEvents"); const globalEvents = require("./../constants/globalEvents");
const statuses = require("./../constants/statuses");
const expressModule = {}; const expressModule = {};
var fs = require("fs"); var fs = require("fs");
/**
* Function to enable tidal-hifi's express api
*/
expressModule.run = function(mainWindow) { expressModule.run = function(mainWindow) {
/**
* Shorthand to handle a fire and forget global event
* @param {*} res
* @param {*} action
*/
function handleGlobalEvent(res, action) { function handleGlobalEvent(res, action) {
mainWindow.webContents.send("globalEvent", action); mainWindow.webContents.send("globalEvent", action);
res.sendStatus(200); res.sendStatus(200);
@ -18,6 +28,13 @@ expressModule.run = function(mainWindow) {
expressApp.get("/pause", (req, res) => handleGlobalEvent(res, globalEvents.pause)); expressApp.get("/pause", (req, res) => handleGlobalEvent(res, globalEvents.pause));
expressApp.get("/next", (req, res) => handleGlobalEvent(res, globalEvents.next)); expressApp.get("/next", (req, res) => handleGlobalEvent(res, globalEvents.next));
expressApp.get("/previous", (req, res) => handleGlobalEvent(res, globalEvents.previous)); expressApp.get("/previous", (req, res) => handleGlobalEvent(res, globalEvents.previous));
expressApp.get("/playpause", (req, res) => {
if (mediaInfo.status == statuses.playing) {
handleGlobalEvent(res, globalEvents.pause);
} else {
handleGlobalEvent(res, globalEvents.play);
}
});
expressApp.get("/image", (req, res) => { expressApp.get("/image", (req, res) => {
var stream = fs.createReadStream(mediaInfo.icon); var stream = fs.createReadStream(mediaInfo.icon);
stream.on("open", function() { stream.on("open", function() {

View File

@ -1,18 +1,33 @@
const statuses = require("./../constants/statuses");
const mediaInfo = { const mediaInfo = {
title: "", title: "",
artist: "", artist: "",
icon: "", icon: "",
status: statuses.paused,
}; };
const mediaInfoModule = { const mediaInfoModule = {
mediaInfo, mediaInfo,
}; };
/**
* Update artist and song info in the mediaInfo constant
*/
mediaInfoModule.update = function(arg) { mediaInfoModule.update = function(arg) {
mediaInfo.title = propOrDefault(arg.title); mediaInfo.title = propOrDefault(arg.title);
mediaInfo.artist = propOrDefault(arg.message); mediaInfo.artist = propOrDefault(arg.message);
mediaInfo.icon = propOrDefault(arg.icon); mediaInfo.icon = propOrDefault(arg.icon);
}; };
/**
* Update tidal's status in the mediaInfo constant
*/
mediaInfoModule.updateStatus = function(status) {
if (Object.values(statuses).includes(status)) {
mediaInfo.status = status;
}
};
/** /**
* Return the property or a default value * Return the property or a default value
* @param {*} prop property to check * @param {*} prop property to check