Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix song-info callback duplication #269

Merged
merged 5 commits into from
May 28, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const { setApplicationMenu } = require("./menu");
const { fileExists, injectCSS } = require("./plugins/utils");
const { isTesting } = require("./utils/testing");
const { setUpTray } = require("./tray");
const { setupSongInfo } = require("./providers/song-info");

// Catch errors and log them
unhandled({
Expand Down Expand Up @@ -157,6 +158,7 @@ function createMainWindow() {
}

app.once("browser-window-created", (event, win) => {
setupSongInfo(win);
loadPlugins(win);

win.webContents.on("did-fail-load", (
Expand Down
4 changes: 1 addition & 3 deletions plugins/discord/back.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const Discord = require("discord-rpc");

const getSongInfo = require("../../providers/song-info");
const registerCallback = require("../../providers/song-info");

const rpc = new Discord.Client({
transport: "ipc",
Expand All @@ -12,8 +12,6 @@ const clientId = "790655993809338398";
let clearActivity;

module.exports = (win, {activityTimoutEnabled, activityTimoutTime}) => {
const registerCallback = getSongInfo(win);

// If the page is ready, register the callback
win.once("ready-to-show", () => {
rpc.once("ready", () => {
Expand Down
3 changes: 1 addition & 2 deletions plugins/downloader/back.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const { join } = require("path");
const ID3Writer = require("browser-id3-writer");
const { dialog, ipcMain } = require("electron");

const getSongInfo = require("../../providers/song-info");
const registerCallback = require("../../providers/song-info");
const { injectCSS, listenAction } = require("../utils");
const { cropMaxWidth } = require("./utils");
const { ACTIONS, CHANNEL } = require("./actions.js");
Expand All @@ -25,7 +25,6 @@ let nowPlayingMetadata = {};

function handle(win) {
injectCSS(win.webContents, join(__dirname, "style.css"));
const registerCallback = getSongInfo(win);
registerCallback((info) => {
nowPlayingMetadata = info;
});
Expand Down
5 changes: 2 additions & 3 deletions plugins/downloader/menu.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ const { existsSync, mkdirSync } = require("fs");
const { join } = require("path");
const { URL } = require("url");

const { dialog, ipcMain } = require("electron");
const { dialog } = require("electron");
const is = require("electron-is");
const ytpl = require("ytpl");
const chokidar = require('chokidar');

const { setOptions } = require("../../config/plugins");
const getSongInfo = require("../../providers/song-info");
const registerCallback = require("../../providers/song-info");
const { sendError } = require("./back");
const { defaultMenuDownloadLabel, getFolder } = require("./utils");

Expand All @@ -18,7 +18,6 @@ let callbackIsRegistered = false;

module.exports = (win, options) => {
if (!callbackIsRegistered) {
const registerCallback = getSongInfo(win);
registerCallback((info) => {
metadataURL = info.url;
});
Expand Down
6 changes: 2 additions & 4 deletions plugins/last-fm/back.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const fetch = require('node-fetch');
const md5 = require('md5');
const { shell } = require('electron');
const { setOptions } = require('../../config/plugins');
const getSongInfo = require('../../providers/song-info');
const registerCallback = require('../../providers/song-info');
const defaultConfig = require('../../config/defaults');

const createFormData = params => {
Expand Down Expand Up @@ -128,9 +128,7 @@ const setNowPlaying = (songInfo, config) => {
// this will store the timeout that will trigger addScrobble
let scrobbleTimer = undefined;

const lastfm = async (win, config) => {
const registerCallback = getSongInfo(win);

const lastfm = async (_win, config) => {
if (!config.api_root) {
// settings are not present, creating them with the default values
config = defaultConfig.plugins['last-fm'];
Expand Down
54 changes: 20 additions & 34 deletions plugins/notifications/back.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
const { Notification } = require("electron");
const is = require("electron-is");
const getSongInfo = require("../../providers/song-info");
const registerCallback = require("../../providers/song-info");
const { notificationImage } = require("./utils");

const { setupInteractive, notifyInteractive } = require("./interactive")
const setupInteractive = require("./interactive")

const notify = (info, options) => {

Expand All @@ -23,38 +23,24 @@ const notify = (info, options) => {
return currentNotification;
};

module.exports = (win, options) => {
const isInteractive = is.windows() && options.interactive;
//setup interactive notifications for windows
if (isInteractive) {
setupInteractive(win, options.unpauseNotification);
}
const registerCallback = getSongInfo(win);
const setup = (options) => {
let oldNotification;
let oldURL = "";
win.once("ready-to-show", () => {
// Register the callback for new song information
registerCallback(songInfo => {
// on pause - reset url? and skip notification
if (songInfo.isPaused) {
//reset oldURL if unpause notification option is on
if (options.unpauseNotification) {
oldURL = "";
}
return;
}
// If url isn't the same as last one - send notification
if (songInfo.url !== oldURL) {
oldURL = songInfo.url;
if (isInteractive) {
notifyInteractive(songInfo);
} else {
// Close the old notification
oldNotification?.close();
// This fixes a weird bug that would cause the notification to be updated instead of showing
setTimeout(() => { oldNotification = notify(songInfo, options) }, 10);
}
}
});
let currentUrl;

registerCallback(songInfo => {
if (!songInfo.isPaused && (songInfo.url !== currentUrl || options.unpauseNotification)) {
// Close the old notification
oldNotification?.close();
currentUrl = songInfo.url;
// This fixes a weird bug that would cause the notification to be updated instead of showing
setTimeout(() => { oldNotification = notify(songInfo, options) }, 10);
}
});
}

module.exports = (win, options) => {
// Register the callback for new song information
is.windows() && options.interactive ?
setupInteractive(win, options.unpauseNotification) :
setup(options);
};
22 changes: 16 additions & 6 deletions plugins/notifications/interactive.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,27 @@
const { notificationImage, icons } = require("./utils");
const getSongControls = require('../../providers/song-controls');
const registerCallback = require("../../providers/song-info");
const notifier = require("node-notifier");

//store song controls reference on launch
let controls;
let notificationOnPause;
let notificationOnUnpause;

//Save controls and onPause option
module.exports.setupInteractive = (win, unpauseNotification) => {
module.exports = (win, unpauseNotification) => {
//Save controls and onPause option
const { playPause, next, previous } = getSongControls(win);
controls = { playPause, next, previous };
notificationOnUnpause = unpauseNotification;

notificationOnPause = unpauseNotification;
let currentUrl;

// Register songInfoCallback
registerCallback(songInfo => {
if (!songInfo.isPaused && (songInfo.url !== currentUrl || notificationOnUnpause)) {
currentUrl = songInfo.url;
sendToaster(songInfo);
}
});

win.webContents.once("closed", () => {
deleteNotification()
Expand All @@ -33,7 +43,7 @@ function deleteNotification() {
}

//New notification
module.exports.notifyInteractive = function sendToaster(songInfo) {
function sendToaster(songInfo) {
deleteNotification();
//download image and get path
let imgSrc = notificationImage(songInfo, true);
Expand Down Expand Up @@ -71,7 +81,7 @@ module.exports.notifyInteractive = function sendToaster(songInfo) {
// dont delete notification on play/pause
toDelete = undefined;
//manually send notification if not sending automatically
if (!notificationOnPause) {
if (!notificationOnUnpause) {
songInfo.isPaused = false;
sendToaster(songInfo);
}
Expand Down
3 changes: 1 addition & 2 deletions plugins/taskbar-mediacontrol/back.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
const getSongControls = require('../../providers/song-controls');
const getSongInfo = require('../../providers/song-info');
const registerCallback = require('../../providers/song-info');
const path = require('path');

let controls;
let currentSongInfo;

module.exports = win => {
const registerCallback = getSongInfo(win);
const { playPause, next, previous } = getSongControls(win);
controls = { playPause, next, previous };

Expand Down
3 changes: 1 addition & 2 deletions plugins/touchbar/back.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const {
TouchBarScrubber,
} = TouchBar;

const getSongInfo = require("../../providers/song-info");
const registerCallback = require("../../providers/song-info");
const getSongControls = require("../../providers/song-controls");

// Songtitle label
Expand Down Expand Up @@ -59,7 +59,6 @@ const touchBar = new TouchBar({
});

module.exports = (win) => {
const registerCallback = getSongInfo(win);
const { playPause, next, previous, like, dislike } = getSongControls(win);

// If the page is ready, register the callback
Expand Down
19 changes: 9 additions & 10 deletions providers/song-info.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,15 @@ const handleData = async (responseText, win) => {
win.webContents.send("update-song-info", JSON.stringify(songInfo));
};

const registerProvider = (win) => {
// This variable will be filled with the callbacks once they register
const callbacks = [];
// This variable will be filled with the callbacks once they register
const callbacks = [];

// This function will allow plugins to register callback that will be triggered when data changes
const registerCallback = (callback) => {
callbacks.push(callback);
};
// This function will allow plugins to register callback that will be triggered when data changes
const registerCallback = (callback) => {
callbacks.push(callback);
};

const registerProvider = (win) => {
win.on("page-title-updated", async () => {
// Get and set the new data
songInfo.isPaused = await getPausedStatus(win);
Expand All @@ -93,8 +93,6 @@ const registerProvider = (win) => {
c(songInfo);
});
});

return registerCallback;
};

const suffixesToRemove = [' - Topic', 'VEVO'];
Expand All @@ -110,7 +108,8 @@ function cleanupArtistName(artist) {
return artist;
}

module.exports = registerProvider;
module.exports = registerCallback;
module.exports.setupSongInfo = registerProvider;
module.exports.getImage = getImage;
module.exports.cleanupArtistName = cleanupArtistName;