You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Wallify/index.js

207 lines
6.1 KiB

const { app, BrowserWindow, ipcMain, dialog } = require('electron');
const path = require('path');
const fs = require('fs');
const exec = require('child_process').exec;
const spawn = require('child_process').spawn;
const version = require('./package.json').version;
//TODO: Search for update
const axios = require('axios');
async function getLatestRelease() {
try {
const https = require('https');
return new Promise((resolve, reject) => {
https.get('https://codefirst.iut.uca.fr/git/api/v1/repos/mathis.chirat/Wallify/releases?pre-release=true&limit=1&access_token=043f410b985c5dc4b58f49c80661a4b90afe638b', (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
try {
resolve(JSON.parse(data));
} catch (error) {
reject(error);
}
});
}).on('error', (error) => {
reject(error);
});
});
} catch (error) {
if (error.response && error.response.status === 502) {
console.error('Error fetching JSON data: AxiosError: Request failed with status code 502');
} else {
console.error('Error fetching JSON data:', error);
}
return null;
}
}
getLatestRelease().then(latestRelease => {
if(latestRelease && latestRelease[0].tag_name != version) {
console.log('New version available:', latestRelease[0].tag_name);
console.log('Cuurent version:', version);
dialog.showMessageBox({
type: 'info',
title: 'New version available',
message: 'A new version of Wallify is available. Do you want to download it now?',
buttons: ['Yes', 'No'],
defaultId: 0,
cancelId: 1
}).then(result => {
if (result.response === 0) { // If 'Yes' is clicked
const newAppImagePath = '/home/UCA/machirat1/public/Wallify/Wallify.AppImage';
exec(`cp ${newAppImagePath} ${path.join(__dirname, 'Wallify.AppImage')}`, (error, stdout, stderr) => {
if (error) {
console.error('Error copying the new version:', error);
} else {
console.log('New version copied successfully.');
}
});
}
});
}
}).catch(error => {
console.error('Error fetching JSON data:', error);
});
//Setup Wallify config folder
if(!fs.existsSync(app.getPath('userData'))) {
console.log('Creating user data directory...');
fs.mkdirSync(app.getPath('userData'), { recursive: true }, (err) => {
if (err) {
console.error('Error creating user data directory:', err);
process.exit(1);
}
});
}
// Set wallpaper directory
const wallpaperDir = path.join(app.getPath('userData'), 'wallpapers');
// Create wallpaper directory if it doesn't exist
if (!fs.existsSync(wallpaperDir)) {
console.log('Creating wallpaper directory...');
fs.mkdirSync(wallpaperDir);
}
// Create start.sh file
const startFile = path.join(app.getPath('userData'), 'start.sh');
if (!fs.existsSync(startFile)) {
console.log('Creating start.sh file...');
const user = require('os').userInfo().username;
fs.writeFileSync(startFile, `#!/bin/sh\n\nsleep 2\nWALLPAPER_FILE=\"$(cat /home/UCA/${user}/.config/Wallify/wallpaper.conf`+" | sed 's/WALLPAPER_FILE=//g')\"\n/home/UCA/machirat1/public/WallPaper/wallify -ni -fs -s -sp -st -b -nf -- mpv -wid WID --loop --no-audio ${WALLPAPER_FILE} &", { mode: 0o755 });
exec(`chmod +x ${startFile}`, (error, stdout, stderr) => {
if (error) {
console.error(`Error applying execute permission to start.sh: ${error}`);
}
});
}
// Create autostartup file
const autostartupFile = path.join(app.getPath('home'), '.config', 'autostart', 'wallify.desktop');
const autostartupDir = path.dirname(autostartupFile);
if (!fs.existsSync(autostartupDir)) {
console.log('Creating autostartup directory...');
fs.mkdirSync(autostartupDir, { recursive: true });
}
if (!fs.existsSync(autostartupFile)) {
console.log('Creating autostartup file...');
const user = require('os').userInfo().username;
fs.writeFileSync(autostartupFile, `[Desktop Entry]
Type=Application
Version=1.0
Name=Wallify
Comment=Wallify
Exec=/home/UCA/${user}/.config/Wallify/start.sh
`, { mode: 0o755 });
}
// Create wallpaper.conf file
const configFile = path.join(app.getPath('userData'), 'wallpaper.conf');
if(!fs.existsSync(configFile)) {
console.log('Creating wallpaper.conf file...');
fs.writeFileSync(configFile, '');
}
// Create main window
let mainWindow;
function createWindow() {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
},
icon: __dirname + '/Wallify.png'
});
mainWindow.setAutoHideMenuBar(true);
mainWindow.setMenuBarVisibility(false);
//mainWindow.setMenu(null);
mainWindow.loadURL(`file://${__dirname}/index.html`);
// Handle wallpaper apply command
ipcMain.on('apply-wallpaper', (event, wallpaperPath) => {
applyWallpaper(wallpaperPath);
});
// Handle show dialog command
ipcMain.on('show-dialog', (event) => {
dialog.showOpenDialog({
title: 'Select a wallpaper file',
filters: [
{ name: 'Wallpaper files', extensions: ['gif', 'mp4'] }
],
properties: ['openFile']
}).then((result) => {
if (result.filePaths.length > 0) {
event.sender.send('dialog-response', result.filePaths[0]);
} else {
event.sender.send('dialog-response', null);
}
});
});
}
// Apply wallpaper using command
function applyWallpaper(wallpaperPath) {
const command = `gsettings set org.gnome.desktop.background picture-uri 'file://${wallpaperPath}'`;
exec(command, (error, stdout, stderr) => {
if (error) {
console.error(`Error applying wallpaper: ${error}`);
} else {
console.log(`Wallpaper applied successfully`);
}
});
}
// Create window on app ready
app.on('ready', createWindow);
// Quit app on window close
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
// Open window on app activate (MacOS)
app.on('activate', () => {
if (mainWindow === null) {
createWindow();
}
});