implement notification server and client
This commit is contained in:
parent
8a163139df
commit
042d715bd8
5 changed files with 92 additions and 6 deletions
11
.env.example
11
.env.example
|
@ -17,4 +17,13 @@ NEXTCLOUD_INSTANCE= # next.abtmtr.link
|
|||
NEXTCLOUD_USERNAME= # meowcatheorange
|
||||
NEXTCLOUD_PASSWORD= # ccccc-ccccc-ccccc-ccccc-ccccc
|
||||
|
||||
NEXTCLOUD_FOLDER= # /Music/LastFMDownloader/
|
||||
NEXTCLOUD_FOLDER= # /Music/LastFMDownloader/
|
||||
|
||||
# Notifications
|
||||
|
||||
NOTIFICATION_SERVER_PORT= # 80
|
||||
NOTIFICATION_SERVER_PASSWORD= # password123
|
||||
|
||||
NOTIFICATION_CLIENT_INSTANCE= # secret.abtmtr.link
|
||||
NOTIFICATION_CLIENT_PORT= # 80
|
||||
NOTIFICATION_CLIENT_PROTOCOL= # https
|
42
index.js
42
index.js
|
@ -1,10 +1,12 @@
|
|||
require('dotenv').config();
|
||||
const { Readable } = require("stream");
|
||||
const { finished } = require("stream/promises");
|
||||
const { GetListByKeyword } = require("youtube-search-api");
|
||||
const skewered = require("skewered");
|
||||
const { createClient } = require("fix-esm").require("webdav");
|
||||
const path = require("path");
|
||||
const { readFileSync, writeFileSync } = require("fs");
|
||||
const io = require('socket.io-client');
|
||||
|
||||
function pathGenerator({ url, name, channelName }) {
|
||||
return path.join(process.env.NEXTCLOUD_FOLDER, `${url}-${skewered(`${name} - ${channelName}`)}.mp3`)
|
||||
|
@ -118,16 +120,22 @@ async function uploadToNextcloud({ fileStream, url, name, channelName }, nextclo
|
|||
});
|
||||
|
||||
const fileName = pathGenerator({ url, name, channelName });
|
||||
fileStream.pipe(nextcloudClient.createWriteStream(fileName));
|
||||
await finished(fileStream.pipe(nextcloudClient.createWriteStream(fileName)));
|
||||
|
||||
return fileName;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const socket = io.connect(`http://localhost:${process.env.NOTIFICATION_SERVER_PORT}`, {reconnect: true});
|
||||
|
||||
socket.on('connect', function (s) {
|
||||
console.log('Successfully connected to notification server');
|
||||
});
|
||||
|
||||
const video = await getVideo();
|
||||
console.log(video);
|
||||
|
||||
if (video == null) return null;
|
||||
if (video == null) return dismantle(socket);
|
||||
|
||||
const nextcloudClient = createClient(
|
||||
`https://${process.env.NEXTCLOUD_INSTANCE}/remote.php/dav/files/${process.env.NEXTCLOUD_USERNAME}/`,
|
||||
|
@ -137,13 +145,37 @@ async function main() {
|
|||
}
|
||||
);
|
||||
|
||||
if (await checkNextcloud(video, nextcloudClient)) return null;
|
||||
if (await checkNextcloud(video, nextcloudClient)) return dismantle(socket);
|
||||
|
||||
socket.emit('nodeMessage', {
|
||||
message: `New song found - ${video.name} from ${video.channelName}`,
|
||||
password: process.env.NOTIFICATION_SERVER_PASSWORD
|
||||
})
|
||||
|
||||
const cobalt = await downloadFromCobalt(video);
|
||||
console.log(cobalt);
|
||||
|
||||
socket.emit('nodeMessage', {
|
||||
message: `Nextcloud upload running - ${cobalt.name} from ${cobalt.channelName}`,
|
||||
password: process.env.NOTIFICATION_SERVER_PASSWORD
|
||||
});
|
||||
|
||||
const nextcloud = await uploadToNextcloud(cobalt, nextcloudClient);
|
||||
console.log(nextcloud);
|
||||
return nextcloud;
|
||||
|
||||
socket.emit('nodeMessage', {
|
||||
message: `Nextcloud upload finished - ${cobalt.name} from ${cobalt.channelName}`,
|
||||
password: process.env.NOTIFICATION_SERVER_PASSWORD
|
||||
})
|
||||
|
||||
|
||||
|
||||
return dismantle(socket);
|
||||
}
|
||||
|
||||
main();
|
||||
main();
|
||||
|
||||
function dismantle(socket) {
|
||||
socket.disconnect();
|
||||
return null;
|
||||
}
|
21
notification-client.js
Normal file
21
notification-client.js
Normal file
|
@ -0,0 +1,21 @@
|
|||
require('dotenv').config();
|
||||
const io = require('socket.io-client');
|
||||
const notifier = require('node-notifier');
|
||||
|
||||
console.log(`${process.env.NOTIFICATION_CLIENT_PROTOCOL}://${process.env.NOTIFICATION_CLIENT_INSTANCE}:${process.env.NOTIFICATION_CLIENT_PORT}`);
|
||||
|
||||
const socket = io.connect(`${process.env.NOTIFICATION_CLIENT_PROTOCOL}://${process.env.NOTIFICATION_CLIENT_INSTANCE}:${process.env.NOTIFICATION_CLIENT_PORT}`, {reconnect: true});
|
||||
|
||||
socket.on('connect', function (s) {
|
||||
notifier.notify({
|
||||
title: 'LastFMDownloader',
|
||||
message: 'Connected to notification server'
|
||||
});
|
||||
|
||||
socket.on('message', (msg) => {
|
||||
notifier.notify({
|
||||
title: 'LastFMDownloader',
|
||||
message: msg
|
||||
});
|
||||
})
|
||||
});
|
20
notification-server.js
Normal file
20
notification-server.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
require('dotenv').config();
|
||||
const express = require('express');
|
||||
const { createServer } = require('node:http');
|
||||
const { Server } = require('socket.io');
|
||||
|
||||
const app = express();
|
||||
const server = createServer(app);
|
||||
const io = new Server(server);
|
||||
|
||||
io.on('connection', (socket) => {
|
||||
console.log('A client connected!');
|
||||
socket.on('nodeMessage', (msg) => {
|
||||
if (msg.password === process.env.NOTIFICATION_SERVER_PASSWORD)
|
||||
io.emit('message', msg.message);
|
||||
})
|
||||
});
|
||||
|
||||
server.listen(process.env.NOTIFICATION_SERVER_PORT, () => {
|
||||
console.log(`server running on port ${process.env.NOTIFICATION_SERVER_PORT}`);
|
||||
});
|
|
@ -11,8 +11,12 @@
|
|||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"dotenv": "^16.4.4",
|
||||
"express": "^4.18.2",
|
||||
"fix-esm": "^1.0.1",
|
||||
"node-notifier": "^10.0.1",
|
||||
"skewered": "^1.0.0",
|
||||
"socket.io": "^4.7.4",
|
||||
"socket.io-client": "^4.7.4",
|
||||
"webdav": "^5.3.2",
|
||||
"youtube-search-api": "^1.2.1"
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue