mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-12 19:01:47 +00:00
Merge branch 'master' of github.com:th-ch/youtube-music into refactor-providers
# By TC (9) and semvis123 (2) # Via GitHub (4) and semvis123 (1) * 'master' of github.com:th-ch/youtube-music: renamed DiscordRPC to Discord Downloader plugin: log audio bitrate Disable context isolation (to load ffmpeg wasm) Use contextBridge in preload script + update navigation plugin Fix downloader plugin with context isolation Bump version Add portable target to windows builds Added Discord rich presence and added extra properties to songinfo provider Bump version Allow custom audio extensions in downloader Defensive: handle null/undefined ffmpeg args
This commit is contained in:
41
plugins/discord-rpc/back.js
Normal file
41
plugins/discord-rpc/back.js
Normal file
@ -0,0 +1,41 @@
|
||||
const Discord = require('discord-rpc');
|
||||
const rpc = new Discord.Client({
|
||||
transport: 'ipc'
|
||||
});
|
||||
|
||||
const clientId = '790655993809338398';
|
||||
|
||||
module.exports = win => {
|
||||
// If the page is ready, register the callback
|
||||
win.on('ready-to-show', () => {
|
||||
// Startup the rpc client
|
||||
rpc.login({
|
||||
clientId
|
||||
}).catch(console.error);
|
||||
|
||||
// Register the callback
|
||||
global.songInfo.onNewData(songInfo => {
|
||||
// Song information changed, so lets update the rich presence
|
||||
|
||||
const activityInfo = {
|
||||
details: songInfo.title,
|
||||
state: songInfo.artist,
|
||||
largeImageKey: 'logo',
|
||||
largeImageText: songInfo.views + ' - ' + songInfo.likes
|
||||
};
|
||||
|
||||
if (songInfo.isPaused) {
|
||||
// Add an idle icon to show that the song is paused
|
||||
activityInfo.smallImageKey = 'idle';
|
||||
activityInfo.smallImageText = 'idle/paused';
|
||||
} else {
|
||||
// Add the start and end time of the song
|
||||
const songStartTime = Date.now() - (songInfo.elapsedSeconds * 1000);
|
||||
activityInfo.startTimestamp = songStartTime;
|
||||
activityInfo.endTimestamp = songStartTime + (songInfo.songDuration * 1000);
|
||||
}
|
||||
|
||||
rpc.setActivity(activityInfo);
|
||||
});
|
||||
});
|
||||
};
|
||||
@ -1,3 +1,5 @@
|
||||
const { contextBridge } = require("electron");
|
||||
|
||||
const { ElementFromFile, templatePath, triggerAction } = require("../utils");
|
||||
const { ACTIONS, CHANNEL } = require("./actions.js");
|
||||
const { downloadVideoToMP3 } = require("./youtube-dl");
|
||||
@ -28,6 +30,9 @@ const reinit = () => {
|
||||
}
|
||||
};
|
||||
|
||||
// TODO: re-enable once contextIsolation is set to true
|
||||
// contextBridge.exposeInMainWorld("downloader", {
|
||||
// download: () => {
|
||||
global.download = () => {
|
||||
const videoUrl = window.location.href;
|
||||
|
||||
@ -48,6 +53,7 @@ global.download = () => {
|
||||
pluginOptions
|
||||
);
|
||||
};
|
||||
// });
|
||||
|
||||
function observeMenu(options) {
|
||||
pluginOptions = { ...pluginOptions, ...options };
|
||||
|
||||
@ -54,7 +54,12 @@ const downloadVideoToMP3 = (
|
||||
.on("info", (info, format) => {
|
||||
videoName = info.videoDetails.title.replace("|", "").toString("ascii");
|
||||
if (is.dev()) {
|
||||
console.log("Downloading video - name:", videoName);
|
||||
console.log(
|
||||
"Downloading video - name:",
|
||||
videoName,
|
||||
"- quality:",
|
||||
format.audioBitrate + "kbits/s"
|
||||
);
|
||||
}
|
||||
})
|
||||
.on("error", sendError)
|
||||
@ -73,6 +78,7 @@ const toMP3 = async (
|
||||
options
|
||||
) => {
|
||||
const safeVideoName = randomBytes(32).toString("hex");
|
||||
const extension = options.extension || "mp3";
|
||||
|
||||
try {
|
||||
if (!ffmpeg.isLoaded()) {
|
||||
@ -87,15 +93,17 @@ const toMP3 = async (
|
||||
await ffmpeg.run(
|
||||
"-i",
|
||||
safeVideoName,
|
||||
...options.ffmpegArgs,
|
||||
safeVideoName + ".mp3"
|
||||
...(options.ffmpegArgs || []),
|
||||
safeVideoName + "." + extension
|
||||
);
|
||||
|
||||
const folder = options.downloadFolder || downloadsFolder();
|
||||
const filename = filenamify(videoName + ".mp3", { replacement: "_" });
|
||||
const filename = filenamify(videoName + "." + extension, {
|
||||
replacement: "_",
|
||||
});
|
||||
writeFileSync(
|
||||
join(folder, filename),
|
||||
ffmpeg.FS("readFile", safeVideoName + ".mp3")
|
||||
ffmpeg.FS("readFile", safeVideoName + "." + extension)
|
||||
);
|
||||
|
||||
reinit();
|
||||
|
||||
@ -1,24 +1,24 @@
|
||||
const { triggerAction } = require('../utils');
|
||||
const { triggerAction } = require("../utils");
|
||||
|
||||
const CHANNEL = "navigation";
|
||||
const ACTIONS = {
|
||||
NEXT: "next",
|
||||
BACK: 'back',
|
||||
}
|
||||
NEXT: "next",
|
||||
BACK: "back",
|
||||
};
|
||||
|
||||
function goToNextPage() {
|
||||
triggerAction(CHANNEL, ACTIONS.NEXT);
|
||||
triggerAction(CHANNEL, ACTIONS.NEXT);
|
||||
}
|
||||
|
||||
function goToPreviousPage() {
|
||||
triggerAction(CHANNEL, ACTIONS.BACK);
|
||||
triggerAction(CHANNEL, ACTIONS.BACK);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
CHANNEL: CHANNEL,
|
||||
ACTIONS: ACTIONS,
|
||||
global: {
|
||||
goToNextPage: goToNextPage,
|
||||
goToPreviousPage: goToPreviousPage,
|
||||
}
|
||||
CHANNEL: CHANNEL,
|
||||
ACTIONS: ACTIONS,
|
||||
actions: {
|
||||
goToNextPage: goToNextPage,
|
||||
goToPreviousPage: goToPreviousPage,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1,23 +1,23 @@
|
||||
const path = require("path");
|
||||
|
||||
const { injectCSS, listenAction } = require("../utils");
|
||||
const { ACTIONS, CHANNEL } = require("./actions.js");
|
||||
const { ACTIONS, CHANNEL } = require("./actions.js");
|
||||
|
||||
function handle(win) {
|
||||
injectCSS(win.webContents, path.join(__dirname, "style.css"));
|
||||
listenAction(CHANNEL, (event, action) => {
|
||||
switch (action) {
|
||||
case ACTIONS.NEXT:
|
||||
case ACTIONS.NEXT:
|
||||
if (win.webContents.canGoForward()) {
|
||||
win.webContents.goForward();
|
||||
}
|
||||
break;
|
||||
case ACTIONS.BACK:
|
||||
case ACTIONS.BACK:
|
||||
if (win.webContents.canGoBack()) {
|
||||
win.webContents.goBack();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
default:
|
||||
console.log("Unknown action: " + action);
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user