mirror of
https://github.com/Mastermindzh/tidal-hifi.git
synced 2024-11-22 05:23:09 +01:00
The 'Big Bang'
This commit is contained in:
commit
cbf15965e4
53
.editorconfig
Normal file
53
.editorconfig
Normal file
@ -0,0 +1,53 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[**.js]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[**.json]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[**.css]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[**.scss]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[**.html]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[**.jsx]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[src/**.{h,cc}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[configure]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
indent_size = 8
|
||||
|
||||
[{deps,tools}/**]
|
||||
indent_style = ignore
|
||||
indent_size = ignore
|
||||
end_of_line = ignore
|
||||
trim_trailing_whitespace = ignore
|
||||
charset = ignore
|
||||
|
||||
[{test/fixtures,deps,tools/eslint,tools/gyp,tools/icu,tools/msvs}/**]
|
||||
insert_final_newline = false
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
node_modules
|
23
README.md
Normal file
23
README.md
Normal file
@ -0,0 +1,23 @@
|
||||
# tidal-hifi-electron
|
||||
|
||||
The web version of [listen.tidal.com](listen.tidal.com) running in electron with hifi support thanks to widevine.
|
||||
|
||||
<!-- toc -->
|
||||
|
||||
- [Why](#why)
|
||||
- [Requirements](#requirements)
|
||||
- [Integrations](#integrations)
|
||||
|
||||
<!-- tocstop -->
|
||||
|
||||
## Why
|
||||
|
||||
When I started this project there weren't any Linux apps that offered Tidal's "hifi" options nor any scripts to control it.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Internet connection
|
||||
|
||||
## Integrations
|
||||
|
||||
- [i3 blocks config]() - My dotfiles where I use this app to fetch currently playing music
|
61
main.js
Normal file
61
main.js
Normal file
@ -0,0 +1,61 @@
|
||||
const { app, globalShortcut, BrowserWindow, process } = require("electron");
|
||||
const path = require("path");
|
||||
const tidalUrl = "https://listen.tidal.com";
|
||||
let mainWindow;
|
||||
|
||||
/**
|
||||
* Enable live reload in development builds
|
||||
*/
|
||||
require("electron-reload")(__dirname, {
|
||||
electron: require(`${__dirname}/node_modules/electron`),
|
||||
});
|
||||
|
||||
function createWindow(options = {}) {
|
||||
// Create the browser window.
|
||||
mainWindow = new BrowserWindow({
|
||||
x: options.x,
|
||||
y: options.y,
|
||||
width: 1024,
|
||||
height: 800,
|
||||
backgroundColor: options.backgroundColor,
|
||||
webPreferences: {
|
||||
affinity: "window",
|
||||
preload: path.join(__dirname, "preload.js"),
|
||||
plugins: true,
|
||||
},
|
||||
});
|
||||
|
||||
// load the Tidal website
|
||||
mainWindow.loadURL(tidalUrl);
|
||||
|
||||
// run stuff after first load
|
||||
mainWindow.webContents.once("did-finish-load", () => {});
|
||||
|
||||
// Emitted when the window is closed.
|
||||
mainWindow.on("closed", function() {
|
||||
mainWindow = null;
|
||||
});
|
||||
}
|
||||
|
||||
function addGlobalShortcuts() {
|
||||
globalShortcut.register("Control+A", () => {
|
||||
mainWindow.webContents.send("getPlayInfo");
|
||||
});
|
||||
}
|
||||
|
||||
// This method will be called when Electron has finished
|
||||
// initialization and is ready to create browser windows.
|
||||
// Some APIs can only be used after this event occurs.
|
||||
app.on("ready", () => {
|
||||
// window with white backround
|
||||
createWindow();
|
||||
addGlobalShortcuts();
|
||||
});
|
||||
|
||||
app.on("activate", function() {
|
||||
// On OS X it's common to re-create a window in the app when the
|
||||
// dock icon is clicked and there are no other windows open.
|
||||
if (mainWindow === null) {
|
||||
createWindow();
|
||||
}
|
||||
});
|
1221
package-lock.json
generated
Normal file
1221
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
27
package.json
Normal file
27
package.json
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "tidal-hifi-electron",
|
||||
"version": "0.1.0",
|
||||
"description": "Tidal on Electron with widevine(hifi) support",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
"start": "electron ."
|
||||
},
|
||||
"keywords": [
|
||||
"electron",
|
||||
"hifi",
|
||||
"widevine",
|
||||
"linux"
|
||||
],
|
||||
"author": "Rick van Lieshout <info@rickvanlieshout.com> (http://rickvanlieshout.com)",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"electron": "https://github.com/castlabs/electron-releases#v6.0.9-wvvmp",
|
||||
"hotkeys-js": "^3.7.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@mastermindzh/prettier-config": "^1.0.0",
|
||||
"electron-reload": "^1.5.0",
|
||||
"prettier": "^1.18.2"
|
||||
},
|
||||
"prettier": "@mastermindzh/prettier-config"
|
||||
}
|
68
preload.js
Normal file
68
preload.js
Normal file
@ -0,0 +1,68 @@
|
||||
const hotkeys = require("hotkeys-js");
|
||||
|
||||
function getNode(string) {
|
||||
return window.document.querySelectorAll(string)[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Play or pause the current song
|
||||
*/
|
||||
function playPause() {
|
||||
let controls = getNode('*[class^="playbackControls"]');
|
||||
|
||||
let play = controls.querySelectorAll('*[data-test^="play"]')[0];
|
||||
let pause = controls.querySelectorAll('*[data-test^="pause"]')[0];
|
||||
|
||||
if (play) {
|
||||
play.click();
|
||||
} else {
|
||||
pause.click();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Click a button
|
||||
* @param {*} dataTestValue
|
||||
*/
|
||||
function clickButton(dataTestValue) {
|
||||
getNode(`*[data-test^="${dataTestValue}"]`).click();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the title of the current song
|
||||
*/
|
||||
function getTitle() {
|
||||
return getNode('*[data-test^="footer-track-title"]').textContent;
|
||||
}
|
||||
|
||||
function getArtists() {
|
||||
return getNode('*[class^="mediaArtists"]').textContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add hotkeys
|
||||
*/
|
||||
function addHotKeys() {
|
||||
hotkeys("f4", function(event, handler) {
|
||||
// Prevent the default refresh event under WINDOWS system
|
||||
event.preventDefault();
|
||||
playPause();
|
||||
// clickButton("next");
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Add ipc event listeners
|
||||
*/
|
||||
function addIPCEventListeners() {
|
||||
window.addEventListener("DOMContentLoaded", () => {
|
||||
const { ipcRenderer } = require("electron");
|
||||
|
||||
ipcRenderer.on("getPlayInfo", (event, col) => {
|
||||
window.document.querySelectorAll('*[data-test^="next"]')[0].click();
|
||||
alert(`${getTitle()} - ${getArtists()}`);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
addHotKeys();
|
||||
addIPCEventListeners();
|
Loading…
Reference in New Issue
Block a user