Skip to content

Commit

Permalink
Merge pull request #269 from Araxeus/fix-XHR-duplicate-callback
Browse files Browse the repository at this point in the history
fix song-info callback duplication
  • Loading branch information
th-ch authored May 28, 2021
2 parents d8f3246 + 8124623 commit 3515bf3
Show file tree
Hide file tree
Showing 10 changed files with 55 additions and 66 deletions.
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;

0 comments on commit 3515bf3

Please sign in to comment.